Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion apis/operator/v1beta1/conditions.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,15 @@ import (
const (
// OpenStackOperatorReadyCondition Status=True condition which indicates if operators have been deployed
OpenStackOperatorReadyCondition condition.Type = "OpenStackOperatorReadyCondition"

// OpenStackOperatorDeploymentsReadyCondition Status=True condition which indicates if operator deployments are ready
OpenStackOperatorDeploymentsReadyCondition condition.Type = "OpenStackOperatorDeploymentsReadyCondition"
)

// Common Messages used by Openstack operator
const (
//
// OpenStackOperator condition messages
// OpenStackOperatorReady condition messages
//

// OpenStackOperatorErrorMessage
Expand All @@ -42,4 +45,20 @@ const (

// OpenStackOperatorReadyMessage
OpenStackOperatorReadyMessage = "OpenStackOperator completed"

//
// OpenStackOperatorDeploymentsReady condition messages
//

// OpenStackOperatorDeploymentsErrorMessage
OpenStackOperatorDeploymentsErrorMessage = "OpenStackOperatorDeployments error occured %s"

// OpenStackOperatorDeploymentsReadyInitMessage
OpenStackOperatorDeploymentsReadyInitMessage = "OpenStackOperatorDeployments not started"

// OpenStackOperatorDeploymentsReadyRunningMessage
OpenStackOperatorDeploymentsReadyRunningMessage = "OpenStackOperatorDeployments still in progress: %s"

// OpenStackOperatorDeploymentsReadyMessage
OpenStackOperatorDeploymentsReadyMessage = "OpenStackOperatorDeployments completed"
)
27 changes: 22 additions & 5 deletions controllers/operator/openstack_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ func (r *OpenStackReconciler) Reconcile(ctx context.Context, req ctrl.Request) (

cl := condition.CreateList(
condition.UnknownCondition(operatorv1beta1.OpenStackOperatorReadyCondition, condition.InitReason, string(operatorv1beta1.OpenStackOperatorReadyInitMessage)),
condition.UnknownCondition(operatorv1beta1.OpenStackOperatorDeploymentsReadyCondition, condition.InitReason, string(operatorv1beta1.OpenStackOperatorDeploymentsReadyInitMessage)),
)
instance.Status.Conditions.Init(&cl)
instance.Status.ObservedGeneration = instance.Generation
Expand Down Expand Up @@ -258,7 +259,7 @@ func (r *OpenStackReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
}

// Check if all deployments are running
deploymentsRunning, err := r.countDeployments(ctx, instance)
deploymentsRunning, deploymentsPending, err := r.countDeployments(ctx, instance)
instance.Status.DeployedOperatorCount = &deploymentsRunning
if err != nil {
instance.Status.Conditions.Set(condition.FalseCondition(
Expand All @@ -270,10 +271,20 @@ func (r *OpenStackReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
return ctrl.Result{}, err
}
if deploymentsRunning < OperatorCount {
Log.Info("Waiting for all deployments to be running", "current", deploymentsRunning, "expected", OperatorCount)
Log.Info("Waiting for all deployments to be running", "current", deploymentsRunning, "expected", OperatorCount, "pending", deploymentsPending)
instance.Status.Conditions.Set(condition.FalseCondition(
operatorv1beta1.OpenStackOperatorDeploymentsReadyCondition,
condition.RequestedReason,
condition.SeverityInfo,
operatorv1beta1.OpenStackOperatorDeploymentsReadyRunningMessage,
deploymentsPending))
return ctrl.Result{}, nil
}

instance.Status.Conditions.MarkTrue(
operatorv1beta1.OpenStackOperatorDeploymentsReadyCondition,
operatorv1beta1.OpenStackOperatorDeploymentsReadyMessage)

// Check if Services are running and have an endpoint
ctrlResult, err := r.checkServiceEndpoints(ctx, instance)
if err != nil {
Expand Down Expand Up @@ -339,22 +350,28 @@ func (r *OpenStackReconciler) reconcileDelete(ctx context.Context, instance *ope
}

// countDeployments -
func (r *OpenStackReconciler) countDeployments(ctx context.Context, instance *operatorv1beta1.OpenStack) (int, error) {
func (r *OpenStackReconciler) countDeployments(ctx context.Context, instance *operatorv1beta1.OpenStack) (int, []string, error) {
deployments := &appsv1.DeploymentList{}
pending := []string{}
err := r.Client.List(ctx, deployments, &client.ListOptions{Namespace: instance.Namespace})
if err != nil {
return 0, err
return 0, pending, err
}

count := 0
for _, deployment := range deployments.Items {
if metav1.IsControlledBy(&deployment, instance) {
if deployment.Status.ReadyReplicas > 0 {
count++
} else {
name := strings.Replace(deployment.Name, "-operator-controller-manager", "", 1)
name = strings.Replace(name, "-cluster-operator-manager", "", 1)
pending = append(pending, name)
}
}
}
return count, nil
sort.Strings(pending)
return count, pending, nil
}

// containerImageMatch - returns true if the deployedContainerImage matches the operatorImage
Expand Down