func()

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
}