diff --git a/cmd/renew_certificate.go b/cmd/renew_certificate.go index 5c5e281916..14dcec4955 100644 --- a/cmd/renew_certificate.go +++ b/cmd/renew_certificate.go @@ -132,9 +132,8 @@ dapr mtls renew-cert -k --valid-until --restart "Certificate rotation is successful! Your new certicate is valid through "+expiry.Format(time.RFC1123)) if restartDaprServices { - restartControlPlaneService() - if err != nil { - print.FailureStatusEvent(os.Stdout, err.Error()) + if err := restartControlPlaneService(); err != nil { + print.FailureStatusEvent(os.Stderr, "%s", err.Error()) os.Exit(1) } } @@ -170,15 +169,28 @@ func logErrorAndExit(err error) { } func restartControlPlaneService() error { + namespace, err := kubernetes.GetDaprNamespace() + if err != nil { + return fmt.Errorf("failed to fetch Dapr namespace: %w", err) + } + controlPlaneServices := []string{ "deploy/dapr-sentry", "deploy/dapr-sidecar-injector", "deploy/dapr-operator", "statefulsets/dapr-placement-server", } - namespace, err := kubernetes.GetDaprNamespace() + // The scheduler control plane service only exists for runtime 1.14 onwards, + // so restart it only when it is present in the cluster. --ignore-not-found + // makes absence the only non-error outcome with empty output: any other + // probe failure (RBAC, transient API error) must fail the restart loudly + // rather than silently skipping the scheduler. + out, err := utils.RunCmdAndWait("kubectl", "get", "statefulsets/dapr-scheduler-server", "-n", namespace, "--ignore-not-found", "-o", "name") if err != nil { - print.FailureStatusEvent(os.Stdout, "Failed to fetch Dapr namespace") + return fmt.Errorf("failed to check for dapr-scheduler-server statefulset: %w", err) + } + if strings.TrimSpace(out) != "" { + controlPlaneServices = append(controlPlaneServices, "statefulsets/dapr-scheduler-server") } errs := make([]error, len(controlPlaneServices)) @@ -190,12 +202,12 @@ func restartControlPlaneService() error { print.InfoStatusEvent(os.Stdout, fmt.Sprintf("Restarting %s..", name)) _, err := utils.RunCmdAndWait("kubectl", "rollout", "restart", "-n", namespace, name) if err != nil { - errs[i] = fmt.Errorf("error in restarting deployment %s. Error is %w", name, err) + errs[i] = fmt.Errorf("error in restarting %s. Error is %w", name, err) return } _, err = utils.RunCmdAndWait("kubectl", "rollout", "status", "-n", namespace, name) if err != nil { - errs[i] = fmt.Errorf("error in checking status for deployment %s. Error is %w", name, err) + errs[i] = fmt.Errorf("error in checking rollout status for %s. Error is %w", name, err) return } }(i, name)