Skip to content

Commit

Permalink
CR-15186 (#170)
Browse files Browse the repository at this point in the history
* [ application_event_reporter.go ]: adding commit details to app.metadata.labels if application reported as child resource

* golint fixes
  • Loading branch information
oleksandr-codefresh authored Nov 3, 2022
1 parent d7908cc commit f7be019
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 12 deletions.
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.3.4-cap-CR-15028-sync-result-resources-errors
2.3.4-cap-CR-15186-child-app-commit-message
57 changes: 49 additions & 8 deletions server/application/application_event_reporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,13 @@ func (s *applicationEventReporter) processResource(
actualState = &application.ApplicationResourceResponse{Manifest: ""}
}

ev, err := getResourceEventPayload(parentApplication, &rs, es, actualState, desiredState, appTree, manifestGenErr, ts, originalApplication, revisionMetadata)
var originalAppRevisionMetadata *appv1.RevisionMetadata = nil

if originalApplication != nil {
originalAppRevisionMetadata, _ = s.getApplicationRevisionDetails(ctx, originalApplication, getOperationRevision(originalApplication))
}

ev, err := getResourceEventPayload(parentApplication, &rs, es, actualState, desiredState, appTree, manifestGenErr, ts, originalApplication, revisionMetadata, originalAppRevisionMetadata)
if err != nil {
logCtx.WithError(err).Error("failed to get event payload")
return
Expand Down Expand Up @@ -380,8 +386,9 @@ func getResourceEventPayload(
apptree *appv1.ApplicationTree,
manifestGenErr bool,
ts string,
originalApplication *appv1.Application,
originalApplication *appv1.Application, // passed when rs is application
revisionMetadata *appv1.RevisionMetadata,
originalAppRevisionMetadata *appv1.RevisionMetadata, // passed when rs is application
) (*events.Event, error) {
var (
err error
Expand All @@ -391,6 +398,18 @@ func getResourceEventPayload(
)

object := []byte(actualState.Manifest)

if originalAppRevisionMetadata != nil && len(object) != 0 {
actualObject, err := appv1.UnmarshalToUnstructured(actualState.Manifest)

if err == nil {
actualObject = addCommitDetailsToLabels(actualObject, originalAppRevisionMetadata)
object, err = actualObject.MarshalJSON()
if err != nil {
return nil, fmt.Errorf("failed to marshal unstructured object: %w", err)
}
}
}
if len(object) == 0 {
if len(desiredState.CompiledManifest) == 0 {
// no actual or desired state, don't send event
Expand All @@ -404,19 +423,25 @@ func getResourceEventPayload(
u.SetKind(rs.Kind)
u.SetName(rs.Name)
u.SetNamespace(rs.Namespace)
// TODO maybe we need to check if resource is an application, and then set commit details in label as for parent apps ??
if originalAppRevisionMetadata != nil {
u = addCommitDetailsToLabels(u, originalAppRevisionMetadata)
}

object, err = u.MarshalJSON()
if err != nil {
return nil, fmt.Errorf("failed to marshal unstructured object: %w", err)
}
} else {
// no actual state, use desired state as event object
manifestWithNamespace, err := addDestNamespaceToManifest([]byte(desiredState.CompiledManifest), rs)
unstructuredWithNamespace, err := addDestNamespaceToManifest([]byte(desiredState.CompiledManifest), rs)
if err != nil {
return nil, fmt.Errorf("failed to add destination namespace to manifest: %w", err)
}
if originalAppRevisionMetadata != nil {
unstructuredWithNamespace = addCommitDetailsToLabels(unstructuredWithNamespace, originalAppRevisionMetadata)
}

object = manifestWithNamespace
object, _ = unstructuredWithNamespace.MarshalJSON()
}
} else if rs.RequiresPruning && !manifestGenErr {
// resource should be deleted
Expand Down Expand Up @@ -625,18 +650,34 @@ func getResourceDesiredState(rs *appv1.ResourceStatus, ds *apiclient.ManifestRes
return &apiclient.Manifest{}
}

func addDestNamespaceToManifest(resourceManifest []byte, rs *appv1.ResourceStatus) ([]byte, error) {
func addDestNamespaceToManifest(resourceManifest []byte, rs *appv1.ResourceStatus) (*unstructured.Unstructured, error) {
u, err := appv1.UnmarshalToUnstructured(string(resourceManifest))
if err != nil {
return nil, fmt.Errorf("failed to unmarshal manifest: %w", err)
}

if u.GetNamespace() == rs.Namespace {
return resourceManifest, nil
return u, nil
}

// need to change namespace
u.SetNamespace(rs.Namespace)

return u.MarshalJSON()
return u, nil
}

func addCommitDetailsToLabels(u *unstructured.Unstructured, revisionMetadata *appv1.RevisionMetadata) *unstructured.Unstructured {
if revisionMetadata == nil || u == nil {
return u
}

if field, _, _ := unstructured.NestedFieldCopy(u.Object, "metadata", "labels"); field == nil {
_ = unstructured.SetNestedField(u.Object, map[string]string{}, "metadata", "labels")
}

_ = unstructured.SetNestedField(u.Object, revisionMetadata.Date.Format("2006-01-02T15:04:05.000Z"), "metadata", "labels", "app.meta.commit-date")
_ = unstructured.SetNestedField(u.Object, revisionMetadata.Author, "metadata", "labels", "app.meta.commit-author")
_ = unstructured.SetNestedField(u.Object, revisionMetadata.Message, "metadata", "labels", "app.meta.commit-message")

return u
}
6 changes: 3 additions & 3 deletions server/application/application_event_reporter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func TestGetResourceEventPayload(t *testing.T) {
Message: "some message",
}

event, err := getResourceEventPayload(&app, &rs, &es, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata)
event, err := getResourceEventPayload(&app, &rs, &es, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata, nil)
assert.NoError(t, err)

var eventPayload events.EventPayload
Expand Down Expand Up @@ -89,7 +89,7 @@ func TestGetResourceEventPayload(t *testing.T) {
Message: "some message",
}

event, err := getResourceEventPayload(&app, &rs, &es, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata)
event, err := getResourceEventPayload(&app, &rs, &es, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata, nil)
assert.NoError(t, err)

var eventPayload events.EventPayload
Expand Down Expand Up @@ -365,7 +365,7 @@ func TestGetResourceEventPayloadWithoutRevision(t *testing.T) {
}
appTree := v1alpha1.ApplicationTree{}

_, err := getResourceEventPayload(&app, &rs, &es, &actualState, &desiredState, &appTree, true, "", nil, nil)
_, err := getResourceEventPayload(&app, &rs, &es, &actualState, &desiredState, &appTree, true, "", nil, nil, nil)
assert.NoError(t, err)

}

0 comments on commit f7be019

Please sign in to comment.