in internal/handler/operation.go [163:218]
func (o *OperationHandler) reconcilingApplications(ctx context.Context) error {
logger := o.logger.WithValues("operation", "reconcilingApplications")
currentAppDeployments, err := o.listCurrentAppDeployments(ctx)
if err != nil {
return fmt.Errorf("failed to list current appDeployments: %w", err)
}
logger.V(1).Info(fmt.Sprintf("current app deployments count %d", len(currentAppDeployments)))
for _, app := range currentAppDeployments {
logger.V(1).Info("current app deployment", "appName", app.Name, "opId", app.Spec.OpId, "provision", app.Spec.Provision, "teardown", app.Spec.Teardown, "dependencies", app.Spec.Dependencies)
}
expectedAppDeployments := o.expectedAppDeployments()
logger.V(1).Info(fmt.Sprintf("expected app deployments count %d", len(expectedAppDeployments)))
for _, app := range expectedAppDeployments {
logger.V(1).Info("expected app deployment", "appName", app.Name, "opId", app.Spec.OpId, "provision", app.Spec.Provision, "teardown", app.Spec.Teardown, "dependencies", app.Spec.Dependencies)
}
added, removed, updated := o.oputils.DiffAppDeployments(expectedAppDeployments, currentAppDeployments, o.oputils.CompareProvisionJobs)
for _, app := range added {
logger.V(1).Info(fmt.Sprintf("app to be added %s", app.Name), "opId", app.Spec.OpId, "provision", app.Spec.Provision, "teardown", app.Spec.Teardown, "dependencies", app.Spec.Dependencies)
if err := ctrl.SetControllerReference(o.operation, &app, o.client.Scheme()); err != nil {
return fmt.Errorf("failed to set controller reference: %w", err)
}
if err := o.client.Create(ctx, &app); err != nil {
return fmt.Errorf("failed to create app deployment: %w", err)
}
}
for _, app := range removed {
logger.V(1).Info(fmt.Sprintf("app to be removed %s", app.Name), "opId", app.Spec.OpId, "provision", app.Spec.Provision, "teardown", app.Spec.Teardown, "dependencies", app.Spec.Dependencies)
if err := o.client.Delete(ctx, &app, client.PropagationPolicy(metav1.DeletePropagationBackground)); client.IgnoreNotFound(err) != nil {
return fmt.Errorf("failed to delete app deployment: %w", err)
}
}
for _, app := range updated {
logger.V(1).Info(fmt.Sprintf("app to be updated %s", app.Name), "appName", app.Name, "opId", app.Spec.OpId, "provision", app.Spec.Provision, "teardown", app.Spec.Teardown, "dependencies", app.Spec.Dependencies)
if err := o.client.Update(ctx, &app); err != nil {
return fmt.Errorf("failed to update app deployment: %w", err)
}
}
// check if all expected app deployments are ready
for _, app := range expectedAppDeployments {
appdeployment := &v1alpha1.AppDeployment{}
if err := o.client.Get(ctx, client.ObjectKey{Namespace: app.Namespace, Name: app.Name}, appdeployment); err != nil {
return fmt.Errorf("failed to get app deployment: %w", err)
}
// check if all dependencies are ready
if appdeployment.Status.Phase != v1alpha1.AppDeploymentPhaseReady {
return fmt.Errorf("app deployment is not ready: name %s, status, %s", app.Name, app.Status.Phase)
}
}
return nil
}