Skip to content

Commit

Permalink
controllers: give more details on oauth server deployment pods in clu…
Browse files Browse the repository at this point in the history
…ster operator status
  • Loading branch information
mfojtik committed Sep 21, 2020
1 parent 76b22ad commit fd393d6
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 11 deletions.
18 changes: 15 additions & 3 deletions pkg/controllers/common/deployment.go
Expand Up @@ -2,13 +2,16 @@ package common

import (
"fmt"
"strings"

appsv1 "k8s.io/api/apps/v1"
corelistersv1 "k8s.io/client-go/listers/core/v1"

operatorv1 "github.com/openshift/api/operator/v1"
deploymentutil "github.com/openshift/library-go/pkg/apps/deployment"
)

func CheckDeploymentReady(deployment *appsv1.Deployment, conditionPrefix string) []operatorv1.OperatorCondition {
func CheckDeploymentReady(deployment *appsv1.Deployment, podLister corelistersv1.PodLister, conditionPrefix string) []operatorv1.OperatorCondition {
if deployment.DeletionTimestamp != nil {
return []operatorv1.OperatorCondition{
{
Expand All @@ -27,12 +30,17 @@ func CheckDeploymentReady(deployment *appsv1.Deployment, conditionPrefix string)
}

if deployment.Status.AvailableReplicas > 0 && deployment.Status.UpdatedReplicas != deployment.Status.Replicas {
podMessages, err := deploymentutil.PodContainersStatus(deployment, podLister)
if err != nil {
podMessages = []string{fmt.Sprintf("error retrieving pod containers details: %v", err)}
}

return []operatorv1.OperatorCondition{
{
Type: conditionPrefix + "Progressing",
Status: operatorv1.ConditionTrue,
Reason: "ReplicasNotReady",
Message: fmt.Sprintf("Waiting for all OAuth server replicas to be ready (%d not ready)", deployment.Status.Replicas-deployment.Status.UpdatedReplicas),
Message: fmt.Sprintf("Waiting for all OAuth server replicas to be ready (%d not ready, %s)", deployment.Status.Replicas-deployment.Status.UpdatedReplicas, strings.Join(podMessages, ",")),
},
{
Type: conditionPrefix + "Available",
Expand All @@ -55,12 +63,16 @@ func CheckDeploymentReady(deployment *appsv1.Deployment, conditionPrefix string)
}

if deployment.Status.UpdatedReplicas != deployment.Status.Replicas || deployment.Status.UnavailableReplicas > 0 {
podMessages, err := deploymentutil.PodContainersStatus(deployment, podLister)
if err != nil {
podMessages = []string{fmt.Sprintf("error retrieving pod containers details: %v", err)}
}
return []operatorv1.OperatorCondition{
{
Type: conditionPrefix + "Progressing",
Status: operatorv1.ConditionTrue,
Reason: "ReplicasNotAvailable",
Message: fmt.Sprintf("Waiting for %d replicas of OAuth server to be available", deployment.Status.UnavailableReplicas),
Message: fmt.Sprintf("Waiting for %d replicas of OAuth server to be available (%s)", deployment.Status.UnavailableReplicas, strings.Join(podMessages, ",")),
},
}
}
Expand Down
5 changes: 4 additions & 1 deletion pkg/controllers/deployment/deployment_controller.go
Expand Up @@ -62,6 +62,7 @@ type deploymentController struct {

configMapLister corev1listers.ConfigMapLister
secretLister corev1listers.SecretLister
podsLister corev1listers.PodLister
routeLister routev1lister.RouteLister
ingressLister configv1listers.IngressLister
proxyLister configv1listers.ProxyLister
Expand All @@ -82,6 +83,7 @@ func NewDeploymentController(kubeInformersForTargetNamespace informers.SharedInf
configMapLister: kubeInformersForTargetNamespace.Core().V1().ConfigMaps().Lister(),
secretLister: kubeInformersForTargetNamespace.Core().V1().Secrets().Lister(),
routeLister: routeInformer.Route().V1().Routes().Lister(),
podsLister: kubeInformersForTargetNamespace.Core().V1().Pods().Lister(),
ingressLister: configInformers.Config().V1().Ingresses().Lister(),
proxyLister: configInformers.Config().V1().Proxies().Lister(),
bootstrapUserDataGetter: bootstrapUserDataGetter,
Expand All @@ -95,6 +97,7 @@ func NewDeploymentController(kubeInformersForTargetNamespace informers.SharedInf
}

return factory.New().WithInformers(
kubeInformersForTargetNamespace.Core().V1().Pods().Informer(),
kubeInformersForTargetNamespace.Core().V1().Secrets().Informer(),
kubeInformersForTargetNamespace.Core().V1().ConfigMaps().Informer(),
kubeInformersForTargetNamespace.Apps().V1().Deployments().Informer(),
Expand Down Expand Up @@ -170,7 +173,7 @@ func (c *deploymentController) sync(ctx context.Context, syncContext factory.Syn
})
} else {
// check the deployment state, only record changed when the deployment is considered ready.
foundConditions = append(foundConditions, common.CheckDeploymentReady(deployment, "OAuthServerDeployment")...)
foundConditions = append(foundConditions, common.CheckDeploymentReady(deployment, c.podsLister, "OAuthServerDeployment")...)
if len(foundConditions) == 0 {
if err := c.updateOperatorDeploymentInfo(ctx, syncContext, operatorConfig, deployment); err != nil {
return err
Expand Down
5 changes: 4 additions & 1 deletion pkg/controllers/targetversion/target_version_controller.go
Expand Up @@ -54,6 +54,7 @@ type targetVersionController struct {
ingressLister configv1lister.IngressLister
routeLister routev1lister.RouteLister
secretLister corev1lister.SecretLister
podLister corev1lister.PodLister
deploymentLister appsv1lister.DeploymentLister

oauthClientClient oauthclient.OAuthClientInterface
Expand All @@ -74,6 +75,7 @@ func NewTargetVersionController(
c := &targetVersionController{
deploymentLister: kubeInformersNamespaced.Apps().V1().Deployments().Lister(),
secretLister: kubeInformersNamespaced.Core().V1().Secrets().Lister(),
podLister: kubeInformersNamespaced.Core().V1().Pods().Lister(),
ingressLister: configInformers.Config().V1().Ingresses().Lister(),
routeLister: routeInformer.Lister(),
oauthClientClient: oauthClient,
Expand All @@ -84,6 +86,7 @@ func NewTargetVersionController(
}

return factory.New().ResyncEvery(30*time.Second).WithInformers(
kubeInformersNamespaced.Core().V1().Pods().Informer(),
kubeInformersNamespaced.Core().V1().Secrets().Informer(),
kubeInformersNamespaced.Apps().V1().Deployments().Informer(),
configInformers.Config().V1().Ingresses().Informer(),
Expand Down Expand Up @@ -111,7 +114,7 @@ func (c *targetVersionController) sync(ctx context.Context, syncContext factory.
}

if deployment != nil {
foundConditions = append(foundConditions, common.CheckDeploymentReady(deployment, "OAuthVersionDeployment")...)
foundConditions = append(foundConditions, common.CheckDeploymentReady(deployment, c.podLister, "OAuthVersionDeployment")...)
} else {
foundConditions = append(foundConditions, operatorv1.OperatorCondition{
Type: "OAuthVersionDeploymentAvailable",
Expand Down
12 changes: 6 additions & 6 deletions pkg/operator/starter.go
Expand Up @@ -9,7 +9,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/klog"
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
Expand Down Expand Up @@ -158,7 +157,11 @@ func RunOperator(ctx context.Context, controllerContext *controllercmd.Controlle
configOverridesController := unsupportedconfigoverridescontroller.NewUnsupportedConfigOverridesController(operatorCtx.operatorClient, controllerContext.EventRecorder)
logLevelController := loglevel.NewClusterOperatorLoggingController(operatorCtx.operatorClient, controllerContext.EventRecorder)

operatorCtx.informersToRunFunc = append(operatorCtx.informersToRunFunc, kubeInformersForNamespaces.Start, authOperatorConfigInformers.Start, operatorCtx.operatorConfigInformer.Start)
operatorCtx.informersToRunFunc = append(operatorCtx.informersToRunFunc,
kubeInformersForNamespaces.Start,
authOperatorConfigInformers.Start,
operatorCtx.operatorConfigInformer.Start,
)
operatorCtx.controllersToRunFunc = append(operatorCtx.controllersToRunFunc, resourceSyncer.Run, configOverridesController.Run, logLevelController.Run)

for _, informerToRunFn := range operatorCtx.informersToRunFunc {
Expand Down Expand Up @@ -187,8 +190,6 @@ func prepareOauthOperator(controllerContext *controllercmd.ControllerContext, op
openshiftAuthenticationInformers := operatorCtx.kubeInformersForNamespaces.InformersFor("openshift-authentication")
kubeSystemNamespaceInformers := operatorCtx.kubeInformersForNamespaces.InformersFor("kube-system")

kubeInformers := informers.NewSharedInformerFactory(operatorCtx.kubeClient, 10*time.Minute)

routeInformersNamespaced := routeinformer.NewSharedInformerFactoryWithOptions(routeClient, resync,
routeinformer.WithNamespace("openshift-authentication"),
routeinformer.WithTweakListOptions(singleNameListOptions("oauth-openshift")),
Expand Down Expand Up @@ -368,7 +369,7 @@ func prepareOauthOperator(controllerContext *controllercmd.ControllerContext, op
workersAvailableController := ingressnodesavailable.NewIngressNodesAvailableController(
operatorCtx.operatorClient,
controllerContext.EventRecorder,
kubeInformers.Core().V1().Nodes(),
operatorCtx.kubeInformersForNamespaces.InformersFor("").Core().V1().Nodes(),
)

authRouteCheckController := endpointaccessible.NewOAuthRouteCheckController(
Expand Down Expand Up @@ -396,7 +397,6 @@ func prepareOauthOperator(controllerContext *controllercmd.ControllerContext, op
operatorCtx.informersToRunFunc = append(operatorCtx.informersToRunFunc,
routeInformersNamespaced.Start,
kubeSystemNamespaceInformers.Start,
kubeInformers.Start,
openshiftAuthenticationInformers.Start,
)

Expand Down

0 comments on commit fd393d6

Please sign in to comment.