Skip to content

Commit

Permalink
feat(plugins) Add helm diff to status (#858)
Browse files Browse the repository at this point in the history
  • Loading branch information
gciezkowski-acc committed Feb 7, 2025
1 parent bc427dc commit fea2154
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 9 deletions.
4 changes: 4 additions & 0 deletions charts/manager/crds/greenhouse.sap_plugins.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,10 @@ spec:
HelmReleaseStatus reflects the status of the latest HelmChart release.
This is only configured if the pluginDefinition is backed by HelmChart.
properties:
diff:
description: Diff contains the difference between the deployed
helm chart and the helm chart in the last reconciliation
type: string
firstDeployed:
description: FirstDeployed is the timestamp of the first deployment
of the release.
Expand Down
8 changes: 8 additions & 0 deletions e2e/plugin/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,14 @@ var _ = Describe("Plugin E2E", Ordered, func() {
g.Expect(err).NotTo(HaveOccurred())
}).Should(Succeed())

By("Check the diff status")
Eventually(func(g Gomega) {
err = adminClient.Get(ctx, client.ObjectKey{Name: testPlugin.Name, Namespace: env.TestNamespace}, testPlugin)
g.Expect(err).NotTo(HaveOccurred())
g.Expect(testPlugin.Status.HelmReleaseStatus).ToNot(BeNil())
g.Expect(len(testPlugin.Status.HelmReleaseStatus.Diff) > 0).To(BeTrue())
}).Should(Succeed())

By("Check replicas in deployment list")
Eventually(func(g Gomega) {
err = remoteClient.List(ctx, deploymentList, client.InNamespace(env.TestNamespace))
Expand Down
2 changes: 2 additions & 0 deletions pkg/apis/greenhouse/v1alpha1/plugin_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ type HelmReleaseStatus struct {
FirstDeployed metav1.Time `json:"firstDeployed,omitempty"`
// LastDeployed is the timestamp of the last deployment of the release.
LastDeployed metav1.Time `json:"lastDeployed,omitempty"`
// Diff contains the difference between the deployed helm chart and the helm chart in the last reconciliation
Diff string `json:"diff,omitempty"`
}

//+kubebuilder:object:root=true
Expand Down
20 changes: 11 additions & 9 deletions pkg/controllers/plugin/helm_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,8 @@ func (r *HelmReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.
return ctrl.Result{}, fmt.Errorf("pluginDefinition not found: %s", helmReconcileFailedCondition.Message)
}

driftDetectedCondition, reconcileFailedCondition := r.reconcileHelmRelease(ctx, restClientGetter, plugin, pluginDefinition, pluginStatus)
driftDetectedCondition, reconcileFailedCondition, diffObjects := r.reconcileHelmRelease(ctx, restClientGetter, plugin, pluginDefinition, &pluginStatus)
pluginStatus.HelmReleaseStatus.Diff = diffObjects.String()
pluginStatus.StatusConditions.SetConditions(driftDetectedCondition, reconcileFailedCondition)
statusReconcileCompleteCondition := r.reconcileStatus(ctx, restClientGetter, plugin, pluginDefinition, &pluginStatus)
pluginStatus.StatusConditions.SetConditions(statusReconcileCompleteCondition)
Expand Down Expand Up @@ -202,8 +203,8 @@ func (r *HelmReconciler) reconcileHelmRelease(
restClientGetter genericclioptions.RESTClientGetter,
plugin *greenhousev1alpha1.Plugin,
pluginDefinition *greenhousev1alpha1.PluginDefinition,
pluginStatus greenhousev1alpha1.PluginStatus,
) (driftDetectedCondition, reconcileFailedCondition greenhousev1alpha1.Condition) {
pluginStatus *greenhousev1alpha1.PluginStatus,
) (driftDetectedCondition, reconcileFailedCondition greenhousev1alpha1.Condition, list helm.DiffObjectList) {

driftDetectedCondition = *pluginStatus.GetConditionByType(greenhousev1alpha1.HelmDriftDetectedCondition)
reconcileFailedCondition = *pluginStatus.GetConditionByType(greenhousev1alpha1.HelmReconcileFailedCondition)
Expand All @@ -212,7 +213,7 @@ func (r *HelmReconciler) reconcileHelmRelease(
if pluginDefinition.Spec.HelmChart == nil {
reconcileFailedCondition.Status = metav1.ConditionFalse
reconcileFailedCondition.Message = "PluginDefinition is not backed by HelmChart"
return driftDetectedCondition, reconcileFailedCondition
return driftDetectedCondition, reconcileFailedCondition, nil
}

// Validate before attempting the installation/upgrade.
Expand All @@ -221,7 +222,7 @@ func (r *HelmReconciler) reconcileHelmRelease(
reconcileFailedCondition.Status = metav1.ConditionTrue
reconcileFailedCondition.Message = "Helm template failed: " + err.Error()
metrics.UpdateMetrics(plugin, metrics.MetricResultError, metrics.MetricReasonTemplateFailed)
return driftDetectedCondition, reconcileFailedCondition
return driftDetectedCondition, reconcileFailedCondition, nil
}

// Check whether the deployed resources match the ones we expect.
Expand All @@ -230,7 +231,7 @@ func (r *HelmReconciler) reconcileHelmRelease(
reconcileFailedCondition.Status = metav1.ConditionTrue
reconcileFailedCondition.Message = "Helm diff failed: " + err.Error()
metrics.UpdateMetrics(plugin, metrics.MetricResultError, metrics.MetricReasonDiffFailed)
return driftDetectedCondition, reconcileFailedCondition
return driftDetectedCondition, reconcileFailedCondition, diffObjects
}

switch {
Expand All @@ -250,18 +251,18 @@ func (r *HelmReconciler) reconcileHelmRelease(
reconcileFailedCondition.Message = "Release for plugin is up-to-date"
// TODO: remove unnecessary log?
log.FromContext(ctx).Info("release for plugin is up-to-date")
return driftDetectedCondition, reconcileFailedCondition
return driftDetectedCondition, reconcileFailedCondition, diffObjects
}

if err := helm.InstallOrUpgradeHelmChartFromPlugin(ctx, r.Client, restClientGetter, pluginDefinition, plugin); err != nil {
reconcileFailedCondition.Status = metav1.ConditionTrue
reconcileFailedCondition.Message = "Helm install/upgrade failed: " + err.Error()
return driftDetectedCondition, reconcileFailedCondition
return driftDetectedCondition, reconcileFailedCondition, diffObjects
}
reconcileFailedCondition.Status = metav1.ConditionFalse
reconcileFailedCondition.Message = "Helm install/upgrade successful"
metrics.UpdateMetrics(plugin, metrics.MetricResultSuccess, metrics.MetricReasonEmpty)
return driftDetectedCondition, reconcileFailedCondition
return driftDetectedCondition, reconcileFailedCondition, diffObjects
}

func (r *HelmReconciler) reconcileStatus(ctx context.Context,
Expand All @@ -280,6 +281,7 @@ func (r *HelmReconciler) reconcileStatus(ctx context.Context,
Status: "unknown",
FirstDeployed: metav1.Time{},
LastDeployed: metav1.Time{},
Diff: pluginStatus.HelmReleaseStatus.Diff,
}
)

Expand Down

0 comments on commit fea2154

Please sign in to comment.