diff --git a/internal/reconcile/install.go b/internal/reconcile/install.go index 0da28f9c7..f14022879 100644 --- a/internal/reconcile/install.go +++ b/internal/reconcile/install.go @@ -29,6 +29,8 @@ import ( v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" ) // Install is an ActionReconciler which attempts to install a Helm release @@ -130,7 +132,13 @@ func (r *Install) failure(req *Request, buffer *action.LogBuffer, err error) { // Record warning event, this message contains more data than the // Condition summary. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(req.Chart.Metadata.Version), corev1.EventTypeWarning, v2.InstallFailedReason, eventMessageWithLog(msg, buffer)) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(req.Chart.Metadata.Version, chartutil.DigestValues(digest.Canonical, req.Values).String()), + corev1.EventTypeWarning, + v2.InstallFailedReason, + eventMessageWithLog(msg, buffer), + ) } // success records the success of a Helm installation action in the status of @@ -150,5 +158,11 @@ func (r *Install) success(req *Request) { } // Record event. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeNormal, v2.InstallSucceededReason, msg) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeNormal, + v2.InstallSucceededReason, + msg, + ) } diff --git a/internal/reconcile/install_test.go b/internal/reconcile/install_test.go index 13b717099..dd7ec3967 100644 --- a/internal/reconcile/install_test.go +++ b/internal/reconcile/install_test.go @@ -26,7 +26,7 @@ import ( "github.com/go-logr/logr" . "github.com/onsi/gomega" "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/chartutil" + helmchartutil "helm.sh/helm/v3/pkg/chartutil" helmrelease "helm.sh/helm/v3/pkg/release" "helm.sh/helm/v3/pkg/releaseutil" helmstorage "helm.sh/helm/v3/pkg/storage" @@ -35,11 +35,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/storage" "github.com/fluxcd/helm-controller/internal/testutil" @@ -56,7 +59,7 @@ func TestInstall_Reconcile(t *testing.T) { // chart to install. chart *chart.Chart // values to use during install. - values chartutil.Values + values helmchartutil.Values // spec modifies the HelmRelease object spec before install. spec func(spec *v2.HelmReleaseSpec) // status to configure on the HelmRelease object before install. @@ -296,7 +299,7 @@ func TestInstall_failure(t *testing.T) { eventRecorder: recorder, } - req := &Request{Object: obj.DeepCopy(), Chart: chrt} + req := &Request{Object: obj.DeepCopy(), Chart: chrt, Values: map[string]interface{}{"foo": "bar"}} r.failure(req, nil, err) expectMsg := fmt.Sprintf(fmtInstallFailure, mockReleaseNamespace, mockReleaseName, chrt.Name(), @@ -313,7 +316,8 @@ func TestInstall_failure(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": chrt.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): chrt.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, req.Values).String(), }, }, }, @@ -381,7 +385,8 @@ func TestInstall_success(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": obj.Status.Current.ChartVersion, + eventMetaGroupKey(eventv1.MetaRevisionKey): obj.Status.Current.ChartVersion, + eventMetaGroupKey(eventv1.MetaTokenKey): obj.Status.Current.ConfigDigest, }, }, }, diff --git a/internal/reconcile/release.go b/internal/reconcile/release.go index 892581136..7206c66c3 100644 --- a/internal/reconcile/release.go +++ b/internal/reconcile/release.go @@ -23,6 +23,7 @@ import ( helmrelease "helm.sh/helm/v3/pkg/release" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" @@ -198,11 +199,22 @@ func eventMessageWithLog(msg string, log *action.LogBuffer) string { // eventMeta returns the event (annotation) metadata based on the given // parameters. -func eventMeta(revision string) map[string]string { - if revision == "" { - return nil - } - return map[string]string{ - "revision": revision, +func eventMeta(revision, token string) map[string]string { + var metadata map[string]string + if revision != "" || token != "" { + metadata = make(map[string]string) + if revision != "" { + metadata[eventMetaGroupKey(eventv1.MetaRevisionKey)] = revision + } + if token != "" { + metadata[eventMetaGroupKey(eventv1.MetaTokenKey)] = token + } } + return metadata +} + +// eventMetaGroupKey returns the event (annotation) metadata key prefixed with +// the group. +func eventMetaGroupKey(key string) string { + return v2.GroupVersion.Group + "/" + key } diff --git a/internal/reconcile/rollback_remediation.go b/internal/reconcile/rollback_remediation.go index 815bf7b05..d73781594 100644 --- a/internal/reconcile/rollback_remediation.go +++ b/internal/reconcile/rollback_remediation.go @@ -30,6 +30,8 @@ import ( v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/storage" ) @@ -142,7 +144,13 @@ func (r *RollbackRemediation) failure(req *Request, buffer *action.LogBuffer, er // Record warning event, this message contains more data than the // Condition summary. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(prev.ChartVersion), corev1.EventTypeWarning, v2.RollbackFailedReason, eventMessageWithLog(msg, buffer)) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(prev.ChartVersion, chartutil.DigestValues(digest.Canonical, req.Values).String()), + corev1.EventTypeWarning, + v2.RollbackFailedReason, + eventMessageWithLog(msg, buffer), + ) } // success records the success of a Helm rollback action in the status of the @@ -156,7 +164,13 @@ func (r *RollbackRemediation) success(req *Request) { conditions.MarkTrue(req.Object, v2.RemediatedCondition, v2.RollbackSucceededReason, msg) // Record event. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(prev.ChartVersion), corev1.EventTypeNormal, v2.RollbackSucceededReason, msg) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(prev.ChartVersion, chartutil.DigestValues(digest.Canonical, req.Values).String()), + corev1.EventTypeNormal, + v2.RollbackSucceededReason, + msg, + ) } // observeRollback returns a storage.ObserveFunc that can be used to observe diff --git a/internal/reconcile/rollback_remediation_test.go b/internal/reconcile/rollback_remediation_test.go index 2e0a87f64..f346e52d5 100644 --- a/internal/reconcile/rollback_remediation_test.go +++ b/internal/reconcile/rollback_remediation_test.go @@ -20,6 +20,7 @@ import ( "context" "errors" "fmt" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" "testing" "time" @@ -38,6 +39,8 @@ import ( v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/storage" "github.com/fluxcd/helm-controller/internal/testutil" @@ -404,7 +407,8 @@ func TestRollbackRemediation_failure(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": prev.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): prev.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, req.Values).String(), }, }, }, @@ -451,7 +455,7 @@ func TestRollbackRemediation_success(t *testing.T) { }, } - req := &Request{Object: obj} + req := &Request{Object: obj, Values: map[string]interface{}{"foo": "bar"}} r.success(req) expectMsg := fmt.Sprintf(fmtRollbackRemediationSuccess, @@ -469,7 +473,8 @@ func TestRollbackRemediation_success(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": prev.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): prev.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, req.Values).String(), }, }, }, diff --git a/internal/reconcile/test.go b/internal/reconcile/test.go index d8c5063cc..b4a4e4cd6 100644 --- a/internal/reconcile/test.go +++ b/internal/reconcile/test.go @@ -143,7 +143,13 @@ func (r *Test) failure(req *Request, buffer *action.LogBuffer, err error) { // Record warning event, this message contains more data than the // Condition summary. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeWarning, v2.TestFailedReason, eventMessageWithLog(msg, buffer)) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeWarning, + v2.TestFailedReason, + eventMessageWithLog(msg, buffer), + ) if req.Object.GetCurrent().HasBeenTested() { // Count the failure of the test for the active remediation strategy if enabled. @@ -173,7 +179,13 @@ func (r *Test) success(req *Request) { conditions.MarkTrue(req.Object, v2.TestSuccessCondition, v2.TestSucceededReason, msg) // Record event. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeNormal, v2.TestSucceededReason, msg) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeNormal, + v2.TestSucceededReason, + msg, + ) } // observeTest returns a storage.ObserveFunc that can be used to observe diff --git a/internal/reconcile/test_test.go b/internal/reconcile/test_test.go index d4da41eb5..d6f3d1a22 100644 --- a/internal/reconcile/test_test.go +++ b/internal/reconcile/test_test.go @@ -33,11 +33,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/testutil" ) @@ -456,7 +459,8 @@ func TestTest_failure(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, cur.Config).String(), }, }, }, @@ -567,7 +571,8 @@ func TestTest_success(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, cur.Config).String(), }, }, }, diff --git a/internal/reconcile/uninstall.go b/internal/reconcile/uninstall.go index b735491a6..7948e4e1f 100644 --- a/internal/reconcile/uninstall.go +++ b/internal/reconcile/uninstall.go @@ -154,7 +154,12 @@ func (r *Uninstall) failure(req *Request, buffer *action.LogBuffer, err error) { // Record warning event, this message contains more data than the // Condition summary. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeWarning, v2.UninstallFailedReason, eventMessageWithLog(msg, buffer)) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeWarning, v2.UninstallFailedReason, + eventMessageWithLog(msg, buffer), + ) } // success records the success of a Helm uninstall action in the status of @@ -170,7 +175,13 @@ func (r *Uninstall) success(req *Request) { // Record warning event, this message contains more data than the // Condition summary. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeNormal, v2.UninstallSucceededReason, msg) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeNormal, + v2.UninstallSucceededReason, + msg, + ) } // observeUninstall returns a storage.ObserveFunc that can be used to observe diff --git a/internal/reconcile/uninstall_remediation.go b/internal/reconcile/uninstall_remediation.go index 77311a429..600712906 100644 --- a/internal/reconcile/uninstall_remediation.go +++ b/internal/reconcile/uninstall_remediation.go @@ -151,7 +151,13 @@ func (r *UninstallRemediation) failure(req *Request, buffer *action.LogBuffer, e // Record warning event, this message contains more data than the // Condition summary. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeWarning, v2.UninstallFailedReason, eventMessageWithLog(msg, buffer)) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeWarning, + v2.UninstallFailedReason, + eventMessageWithLog(msg, buffer), + ) } // success records the success of a Helm uninstall remediation action in the @@ -166,5 +172,11 @@ func (r *UninstallRemediation) success(req *Request) { conditions.MarkTrue(req.Object, v2.RemediatedCondition, v2.UninstallSucceededReason, msg) // Record event. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeNormal, v2.UninstallSucceededReason, msg) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeNormal, + v2.UninstallSucceededReason, + msg, + ) } diff --git a/internal/reconcile/uninstall_remediation_test.go b/internal/reconcile/uninstall_remediation_test.go index ef2f1f8af..f2543899e 100644 --- a/internal/reconcile/uninstall_remediation_test.go +++ b/internal/reconcile/uninstall_remediation_test.go @@ -33,10 +33,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" "github.com/fluxcd/pkg/runtime/conditions" v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/storage" "github.com/fluxcd/helm-controller/internal/testutil" @@ -406,7 +409,8 @@ func TestUninstallRemediation_failure(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, cur.Config).String(), }, }, }, @@ -472,7 +476,8 @@ func TestUninstallRemediation_success(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, cur.Config).String(), }, }, }, diff --git a/internal/reconcile/uninstall_test.go b/internal/reconcile/uninstall_test.go index 920eebbd6..d53b333f4 100644 --- a/internal/reconcile/uninstall_test.go +++ b/internal/reconcile/uninstall_test.go @@ -33,11 +33,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/storage" "github.com/fluxcd/helm-controller/internal/testutil" @@ -415,7 +418,8 @@ func TestUninstall_failure(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, cur.Config).String(), }, }, }, @@ -481,7 +485,8 @@ func TestUninstall_success(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, cur.Config).String(), }, }, }, diff --git a/internal/reconcile/unlock.go b/internal/reconcile/unlock.go index c3c5395f5..adcbc85c3 100644 --- a/internal/reconcile/unlock.go +++ b/internal/reconcile/unlock.go @@ -21,12 +21,13 @@ import ( "errors" "fmt" - "github.com/fluxcd/pkg/runtime/conditions" helmrelease "helm.sh/helm/v3/pkg/release" helmdriver "helm.sh/helm/v3/pkg/storage/driver" corev1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/record" + "github.com/fluxcd/pkg/runtime/conditions" + v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" "github.com/fluxcd/helm-controller/internal/release" @@ -131,7 +132,13 @@ func (r *Unlock) failure(req *Request, status helmrelease.Status, err error) { conditions.MarkFalse(req.Object, v2.ReleasedCondition, "PendingRelease", msg) // Record warning event. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeWarning, "PendingRelease", msg) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeWarning, + "PendingRelease", + msg, + ) } // success records the success of an unlock action in the status of the given @@ -145,7 +152,13 @@ func (r *Unlock) success(req *Request, status helmrelease.Status) { conditions.MarkFalse(req.Object, v2.ReleasedCondition, "PendingRelease", msg) // Record event. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeNormal, "PendingRelease", msg) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeNormal, + "PendingRelease", + msg, + ) } // observeUnlock returns a storage.ObserveFunc that can be used to observe and diff --git a/internal/reconcile/unlock_test.go b/internal/reconcile/unlock_test.go index aede948ab..163d69459 100644 --- a/internal/reconcile/unlock_test.go +++ b/internal/reconcile/unlock_test.go @@ -33,11 +33,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/storage" "github.com/fluxcd/helm-controller/internal/testutil" @@ -399,7 +402,8 @@ func TestUnlock_failure(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, cur.Config).String(), }, }, }, @@ -448,7 +452,8 @@ func TestUnlock_success(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): cur.Chart.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, cur.Config).String(), }, }, }, diff --git a/internal/reconcile/upgrade.go b/internal/reconcile/upgrade.go index f0d596c71..323790db4 100644 --- a/internal/reconcile/upgrade.go +++ b/internal/reconcile/upgrade.go @@ -29,6 +29,8 @@ import ( v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" ) // Upgrade is an ActionReconciler which attempts to upgrade a Helm release @@ -129,7 +131,13 @@ func (r *Upgrade) failure(req *Request, buffer *action.LogBuffer, err error) { // Record warning event, this message contains more data than the // Condition summary. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(req.Chart.Metadata.Version), corev1.EventTypeWarning, v2.UpgradeFailedReason, eventMessageWithLog(msg, buffer)) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(req.Chart.Metadata.Version, chartutil.DigestValues(digest.Canonical, req.Values).String()), + corev1.EventTypeWarning, + v2.UpgradeFailedReason, + eventMessageWithLog(msg, buffer), + ) } // success records the success of a Helm upgrade action in the status of the @@ -150,5 +158,11 @@ func (r *Upgrade) success(req *Request) { } // Record event. - r.eventRecorder.AnnotatedEventf(req.Object, eventMeta(cur.ChartVersion), corev1.EventTypeNormal, v2.UpgradeSucceededReason, msg) + r.eventRecorder.AnnotatedEventf( + req.Object, + eventMeta(cur.ChartVersion, cur.ConfigDigest), + corev1.EventTypeNormal, + v2.UpgradeSucceededReason, + msg, + ) } diff --git a/internal/reconcile/upgrade_test.go b/internal/reconcile/upgrade_test.go index 94b788006..d7407c28d 100644 --- a/internal/reconcile/upgrade_test.go +++ b/internal/reconcile/upgrade_test.go @@ -35,11 +35,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" v2 "github.com/fluxcd/helm-controller/api/v2beta2" "github.com/fluxcd/helm-controller/internal/action" + "github.com/fluxcd/helm-controller/internal/chartutil" + "github.com/fluxcd/helm-controller/internal/digest" "github.com/fluxcd/helm-controller/internal/release" "github.com/fluxcd/helm-controller/internal/storage" "github.com/fluxcd/helm-controller/internal/testutil" @@ -411,7 +414,7 @@ func TestUpgrade_failure(t *testing.T) { eventRecorder: recorder, } - req := &Request{Object: obj.DeepCopy(), Chart: chrt} + req := &Request{Object: obj.DeepCopy(), Chart: chrt, Values: map[string]interface{}{"foo": "bar"}} r.failure(req, nil, err) expectMsg := fmt.Sprintf(fmtUpgradeFailure, mockReleaseNamespace, mockReleaseName, chrt.Name(), @@ -428,7 +431,8 @@ func TestUpgrade_failure(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": chrt.Metadata.Version, + eventMetaGroupKey(eventv1.MetaRevisionKey): chrt.Metadata.Version, + eventMetaGroupKey(eventv1.MetaTokenKey): chartutil.DigestValues(digest.Canonical, req.Values).String(), }, }, }, @@ -496,7 +500,8 @@ func TestUpgrade_success(t *testing.T) { Message: expectMsg, ObjectMeta: metav1.ObjectMeta{ Annotations: map[string]string{ - "revision": obj.Status.Current.ChartVersion, + eventMetaGroupKey(eventv1.MetaRevisionKey): obj.Status.Current.ChartVersion, + eventMetaGroupKey(eventv1.MetaTokenKey): obj.Status.Current.ConfigDigest, }, }, },