Skip to content

Commit 37f5a05

Browse files
event-reporter: report all revisions metadata instead single to support multisourced apps
1 parent 9ecb8eb commit 37f5a05

File tree

5 files changed

+136
-66
lines changed

5 files changed

+136
-66
lines changed

event_reporter/reporter/app_revision.go

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,19 @@ import (
88
log "github.com/sirupsen/logrus"
99
)
1010

11-
func (s *applicationEventReporter) getApplicationRevisionDetails(ctx context.Context, a *appv1.Application, revision string) (*appv1.RevisionMetadata, error) {
12-
project := a.Spec.GetProject()
13-
return s.applicationServiceClient.RevisionMetadata(ctx, &application.RevisionMetadataQuery{
14-
Name: &a.Name,
15-
AppNamespace: &a.Namespace,
16-
Revision: &revision,
17-
Project: &project,
18-
})
11+
// treats multi-sourced apps as single source and gets first revision details
12+
func getApplicationLegacyRevisionDetails(a *appv1.Application, revisionsMetadata *utils.AppSyncRevisionsMetadata) *appv1.RevisionMetadata {
13+
_, sourceIdx := a.Spec.GetNonRefSource()
14+
15+
if sourceIdx == -1 { // single source app
16+
sourceIdx = 0
17+
}
18+
19+
if revisionsMetadata.SyncRevisions == nil || len(revisionsMetadata.SyncRevisions) == 0 {
20+
return nil
21+
}
22+
23+
return revisionsMetadata.SyncRevisions[sourceIdx]
1924
}
2025

2126
func (s *applicationEventReporter) getCommitRevisionsDetails(ctx context.Context, a *appv1.Application, revisions []string) ([]*appv1.RevisionMetadata, error) {
@@ -41,21 +46,27 @@ func (s *applicationEventReporter) getCommitRevisionsDetails(ctx context.Context
4146
func (s *applicationEventReporter) getApplicationRevisionsMetadata(ctx context.Context, logCtx *log.Entry, a *appv1.Application) (*utils.AppSyncRevisionsMetadata, error) {
4247
result := &utils.AppSyncRevisionsMetadata{}
4348

44-
// can be the latest revision of repository
45-
operationSyncRevisionsMetadata, err := s.getCommitRevisionsDetails(ctx, a, utils.GetOperationSyncRevisions(a))
49+
if source, _ := a.Spec.GetNonRefSource(); !source.IsHelm() && (a.Status.Sync.Revision != "" || a.Status.Sync.Revisions != nil || (a.Status.History != nil && len(a.Status.History) > 0)) {
50+
// can be the latest revision of repository
51+
operationSyncRevisionsMetadata, err := s.getCommitRevisionsDetails(ctx, a, utils.GetOperationSyncRevisions(a))
4652

47-
if err != nil {
48-
logCtx.WithError(err).Warnf("failed to get application(%s) revisions metadata, resuming", a.GetName())
49-
}
53+
if err != nil {
54+
logCtx.WithError(err).Warnf("failed to get application(%s) sync revisions metadata, resuming", a.GetName())
55+
}
5056

51-
if operationSyncRevisionsMetadata != nil {
52-
result.SyncRevisions = operationSyncRevisionsMetadata
53-
}
54-
// latest revision of repository where changes to app resource were actually made; empty if no changeRevisionі present
55-
operationChangeRevisionsMetadata, err := s.getCommitRevisionsDetails(ctx, a, utils.GetOperationChangeRevisions(a))
57+
if err == nil && operationSyncRevisionsMetadata != nil {
58+
result.SyncRevisions = operationSyncRevisionsMetadata
59+
}
60+
// latest revision of repository where changes to app resource were actually made; empty if no changeRevisionі present
61+
operationChangeRevisionsMetadata, err := s.getCommitRevisionsDetails(ctx, a, utils.GetOperationChangeRevisions(a))
5662

57-
if err == nil && operationChangeRevisionsMetadata != nil {
58-
result.ChangeRevisions = operationChangeRevisionsMetadata
63+
if err != nil {
64+
logCtx.WithError(err).Warnf("failed to get application(%s) change revisions metadata, resuming", a.GetName())
65+
}
66+
67+
if err == nil && operationChangeRevisionsMetadata != nil {
68+
result.ChangeRevisions = operationChangeRevisionsMetadata
69+
}
5970
}
6071

6172
return result, nil

event_reporter/reporter/application_event_reporter.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,13 @@ func (s *applicationEventReporter) StreamApplicationEvents(
166166

167167
// helm app hasnt revision
168168
// TODO: add check if it helm application
169-
parentOperationRevision := utils.GetOperationRevision(parentApplicationEntity)
170-
parentRevisionMetadata, err := s.getApplicationRevisionDetails(ctx, parentApplicationEntity, parentOperationRevision)
169+
parentAppSyncRevisionsMetadata, err := s.getApplicationRevisionsMetadata(ctx, logCtx, parentApplicationEntity)
171170
if err != nil {
172171
logCtx.WithError(err).Warn("failed to get parent application's revision metadata, resuming")
173172
}
174173

175174
utils.SetHealthStatusIfMissing(rs)
176-
err = s.processResource(ctx, *rs, parentApplicationEntity, logCtx, ts, parentDesiredManifests, appTree, manifestGenErr, a, parentRevisionMetadata, appInstanceLabelKey, trackingMethod, desiredManifests.ApplicationVersions)
175+
err = s.processResource(ctx, *rs, parentApplicationEntity, logCtx, ts, parentDesiredManifests, appTree, manifestGenErr, a, parentAppSyncRevisionsMetadata, appInstanceLabelKey, trackingMethod, desiredManifests.ApplicationVersions)
177176
if err != nil {
178177
s.metricsServer.IncErroredEventsCounter(metrics.MetricChildAppEventType, metrics.MetricEventUnknownErrorType, a.Name)
179178
return err
@@ -203,7 +202,7 @@ func (s *applicationEventReporter) StreamApplicationEvents(
203202
s.metricsServer.ObserveEventProcessingDurationHistogramDuration(a.Name, metrics.MetricParentAppEventType, reconcileDuration)
204203
}
205204

206-
revisionMetadata, _ := s.getApplicationRevisionDetails(ctx, a, utils.GetOperationRevision(a))
205+
revisionsMetadata, _ := s.getApplicationRevisionsMetadata(ctx, logCtx, a)
207206
// for each resource in the application get desired and actual state,
208207
// then stream the event
209208
for _, rs := range a.Status.Resources {
@@ -215,7 +214,7 @@ func (s *applicationEventReporter) StreamApplicationEvents(
215214
s.metricsServer.IncCachedIgnoredEventsCounter(metrics.MetricResourceEventType, a.Name)
216215
continue
217216
}
218-
err := s.processResource(ctx, rs, a, logCtx, ts, desiredManifests, appTree, manifestGenErr, nil, revisionMetadata, appInstanceLabelKey, trackingMethod, nil)
217+
err := s.processResource(ctx, rs, a, logCtx, ts, desiredManifests, appTree, manifestGenErr, nil, revisionsMetadata, appInstanceLabelKey, trackingMethod, nil)
219218
if err != nil {
220219
s.metricsServer.IncErroredEventsCounter(metrics.MetricResourceEventType, metrics.MetricEventUnknownErrorType, a.Name)
221220
return err
@@ -227,21 +226,22 @@ func (s *applicationEventReporter) StreamApplicationEvents(
227226
func (s *applicationEventReporter) getAppForResourceReporting(
228227
rs appv1.ResourceStatus,
229228
ctx context.Context,
229+
logCtx *log.Entry,
230230
a *appv1.Application,
231-
revisionMetadata *appv1.RevisionMetadata,
232-
) (*appv1.Application, *appv1.RevisionMetadata) {
231+
syncRevisionsMetadata *utils.AppSyncRevisionsMetadata,
232+
) (*appv1.Application, *utils.AppSyncRevisionsMetadata) {
233233
if rs.Kind != "Rollout" { // for rollout it's crucial to report always correct operationSyncRevision
234-
return a, revisionMetadata
234+
return a, syncRevisionsMetadata
235235
}
236236

237237
latestAppStatus, err := s.appLister.Applications(a.Namespace).Get(a.Name)
238238
if err != nil {
239-
return a, revisionMetadata
239+
return a, syncRevisionsMetadata
240240
}
241241

242-
revisionMetadataToReport, err := s.getApplicationRevisionDetails(ctx, latestAppStatus, utils.GetOperationRevision(latestAppStatus))
242+
revisionMetadataToReport, err := s.getApplicationRevisionsMetadata(ctx, logCtx, latestAppStatus)
243243
if err != nil {
244-
return a, revisionMetadata
244+
return a, syncRevisionsMetadata
245245
}
246246

247247
return latestAppStatus, revisionMetadataToReport
@@ -257,7 +257,7 @@ func (s *applicationEventReporter) processResource(
257257
appTree *appv1.ApplicationTree,
258258
manifestGenErr bool,
259259
originalApplication *appv1.Application,
260-
revisionMetadata *appv1.RevisionMetadata,
260+
revisionsMetadata *utils.AppSyncRevisionsMetadata,
261261
appInstanceLabelKey string,
262262
trackingMethod appv1.TrackingMethod,
263263
applicationVersions *apiclient.ApplicationVersions,
@@ -283,12 +283,12 @@ func (s *applicationEventReporter) processResource(
283283
return nil
284284
}
285285

286-
parentApplicationToReport, revisionMetadataToReport := s.getAppForResourceReporting(rs, ctx, parentApplication, revisionMetadata)
286+
parentApplicationToReport, revisionMetadataToReport := s.getAppForResourceReporting(rs, ctx, logCtx, parentApplication, revisionsMetadata)
287287

288-
var originalAppRevisionMetadata *appv1.RevisionMetadata = nil
288+
var originalAppRevisionMetadata *utils.AppSyncRevisionsMetadata = nil
289289

290290
if originalApplication != nil {
291-
originalAppRevisionMetadata, _ = s.getApplicationRevisionDetails(ctx, originalApplication, utils.GetOperationRevision(originalApplication))
291+
originalAppRevisionMetadata, _ = s.getApplicationRevisionsMetadata(ctx, logCtx, originalApplication)
292292
}
293293

294294
ev, err := getResourceEventPayload(parentApplicationToReport, &rs, actualState, desiredState, appTree, manifestGenErr, ts, originalApplication, revisionMetadataToReport, originalAppRevisionMetadata, appInstanceLabelKey, trackingMethod, applicationVersions)
@@ -305,7 +305,7 @@ func (s *applicationEventReporter) processResource(
305305
appName = appRes.Name
306306
} else {
307307
utils.LogWithResourceStatus(logCtx, rs).Info("streaming resource event")
308-
appName = rs.Name
308+
appName = parentApplication.Name
309309
}
310310

311311
if err := s.codefreshClient.SendEvent(ctx, appName, ev); err != nil {

event_reporter/reporter/event_payload.go

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ func getResourceEventPayload(
2828
manifestGenErr bool,
2929
ts string,
3030
originalApplication *appv1.Application, // passed when rs is application
31-
revisionMetadata *appv1.RevisionMetadata,
32-
originalAppRevisionMetadata *appv1.RevisionMetadata, // passed when rs is application
31+
revisionsMetadata *utils.AppSyncRevisionsMetadata,
32+
originalAppRevisionsMetadata *utils.AppSyncRevisionsMetadata, // passed when rs is application
3333
appInstanceLabelKey string,
3434
trackingMethod appv1.TrackingMethod,
3535
applicationVersions *apiclient.ApplicationVersions,
@@ -50,11 +50,15 @@ func getResourceEventPayload(
5050

5151
object := []byte(*actualState.Manifest)
5252

53-
if originalAppRevisionMetadata != nil && len(object) != 0 {
53+
if originalAppRevisionsMetadata != nil && len(object) != 0 {
5454
actualObject, err := appv1.UnmarshalToUnstructured(*actualState.Manifest)
5555

5656
if err == nil {
57-
actualObject = utils.AddCommitDetailsToLabels(actualObject, originalAppRevisionMetadata)
57+
actualObject = utils.AddCommitsDetailsToAnnotations(actualObject, originalAppRevisionsMetadata)
58+
if originalApplication != nil {
59+
actualObject = utils.AddCommitDetailsToLabels(actualObject, getApplicationLegacyRevisionDetails(originalApplication, originalAppRevisionsMetadata))
60+
}
61+
5862
object, err = actualObject.MarshalJSON()
5963
if err != nil {
6064
return nil, fmt.Errorf("failed to marshal unstructured object: %w", err)
@@ -74,8 +78,11 @@ func getResourceEventPayload(
7478
u.SetKind(rs.Kind)
7579
u.SetName(rs.Name)
7680
u.SetNamespace(rs.Namespace)
77-
if originalAppRevisionMetadata != nil {
78-
u = utils.AddCommitDetailsToLabels(u, originalAppRevisionMetadata)
81+
if originalAppRevisionsMetadata != nil {
82+
u = utils.AddCommitsDetailsToAnnotations(u, originalAppRevisionsMetadata)
83+
if originalApplication != nil {
84+
u = utils.AddCommitDetailsToLabels(u, getApplicationLegacyRevisionDetails(originalApplication, originalAppRevisionsMetadata))
85+
}
7986
}
8087

8188
object, err = u.MarshalJSON()
@@ -88,8 +95,11 @@ func getResourceEventPayload(
8895
if err != nil {
8996
return nil, fmt.Errorf("failed to add destination namespace to manifest: %w", err)
9097
}
91-
if originalAppRevisionMetadata != nil {
92-
unstructuredWithNamespace = utils.AddCommitDetailsToLabels(unstructuredWithNamespace, originalAppRevisionMetadata)
98+
if originalAppRevisionsMetadata != nil {
99+
unstructuredWithNamespace = utils.AddCommitsDetailsToAnnotations(unstructuredWithNamespace, originalAppRevisionsMetadata)
100+
if originalApplication != nil {
101+
unstructuredWithNamespace = utils.AddCommitDetailsToLabels(unstructuredWithNamespace, getApplicationLegacyRevisionDetails(originalApplication, originalAppRevisionsMetadata))
102+
}
93103
}
94104

95105
object, _ = unstructuredWithNamespace.MarshalJSON()
@@ -166,10 +176,13 @@ func getResourceEventPayload(
166176
TrackingMethod: string(trackingMethod),
167177
}
168178

169-
if revisionMetadata != nil {
170-
source.CommitMessage = revisionMetadata.Message
171-
source.CommitAuthor = revisionMetadata.Author
172-
source.CommitDate = &revisionMetadata.Date
179+
if revisionsMetadata != nil && revisionsMetadata.SyncRevisions != nil {
180+
revisionMetadata := getApplicationLegacyRevisionDetails(parentApplication, revisionsMetadata)
181+
if revisionMetadata != nil {
182+
source.CommitMessage = revisionMetadata.Message
183+
source.CommitAuthor = revisionMetadata.Author
184+
source.CommitDate = &revisionMetadata.Date
185+
}
173186
}
174187

175188
if rs.Health != nil {
@@ -225,27 +238,19 @@ func (s *applicationEventReporter) getApplicationEventPayload(
225238
syncFinished = a.Status.OperationState.FinishedAt
226239
}
227240

228-
applicationSource := a.Spec.GetSource()
229-
if !applicationSource.IsHelm() && (a.Status.Sync.Revision != "" || (a.Status.History != nil && len(a.Status.History) > 0)) {
230-
revisionMetadata, err := s.getApplicationRevisionDetails(ctx, a, utils.GetOperationRevision(a))
241+
revisionsMetadata, err := s.getApplicationRevisionsMetadata(ctx, logCtx, a)
231242

232-
if err != nil {
233-
if !strings.Contains(err.Error(), "not found") {
234-
return nil, fmt.Errorf("failed to get revision metadata: %w", err)
235-
}
236-
237-
logCtx.Warnf("failed to get revision metadata: %s, reporting application deletion event", err.Error())
238-
} else {
239-
if obj.ObjectMeta.Labels == nil {
240-
obj.ObjectMeta.Labels = map[string]string{}
241-
}
242-
243-
obj.ObjectMeta.Labels["app.meta.commit-date"] = revisionMetadata.Date.Format("2006-01-02T15:04:05.000Z")
244-
obj.ObjectMeta.Labels["app.meta.commit-author"] = revisionMetadata.Author
245-
obj.ObjectMeta.Labels["app.meta.commit-message"] = revisionMetadata.Message
243+
if err != nil {
244+
if !strings.Contains(err.Error(), "not found") {
245+
return nil, fmt.Errorf("failed to get revision metadata: %w", err)
246246
}
247+
248+
logCtx.Warnf("failed to get revision metadata: %s, reporting application deletion event", err.Error())
247249
}
248250

251+
utils.AddCommitsDetailsToAppAnnotations(obj, revisionsMetadata)
252+
utils.AddCommitsDetailsToAppLabels(&obj, getApplicationLegacyRevisionDetails(&obj, revisionsMetadata))
253+
249254
object, err := json.Marshal(&obj)
250255
if err != nil {
251256
return nil, fmt.Errorf("failed to marshal application event")

event_reporter/utils/app_revision.go

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ func AddCommitDetailsToLabels(u *unstructured.Unstructured, revisionMetadata *ap
127127
return u
128128
}
129129

130+
var annotationRevisionKey = "app.meta.revisions-metadata"
131+
130132
func AddCommitsDetailsToAnnotations(unstrApp *unstructured.Unstructured, revisionsMetadata *AppSyncRevisionsMetadata) *unstructured.Unstructured {
131133
if revisionsMetadata == nil || unstrApp == nil {
132134
return unstrApp
@@ -142,7 +144,43 @@ func AddCommitsDetailsToAnnotations(unstrApp *unstructured.Unstructured, revisio
142144
return unstrApp
143145
}
144146

145-
_ = unstructured.SetNestedField(unstrApp.Object, jsonRevisionsMetadata, "metadata", "annotations", "app.meta.revisions-metadata")
147+
_ = unstructured.SetNestedField(unstrApp.Object, string(jsonRevisionsMetadata), "metadata", "annotations", annotationRevisionKey)
146148

147149
return unstrApp
148150
}
151+
152+
func AddCommitsDetailsToAppAnnotations(app appv1.Application, revisionsMetadata *AppSyncRevisionsMetadata) appv1.Application {
153+
if revisionsMetadata == nil {
154+
return app
155+
}
156+
157+
if app.ObjectMeta.Annotations == nil {
158+
app.ObjectMeta.Annotations = map[string]string{}
159+
}
160+
161+
jsonRevisionsMetadata, err := json.Marshal(revisionsMetadata)
162+
163+
if err != nil {
164+
return app
165+
}
166+
167+
app.ObjectMeta.Annotations[annotationRevisionKey] = string(jsonRevisionsMetadata)
168+
169+
return app
170+
}
171+
172+
func AddCommitsDetailsToAppLabels(app *appv1.Application, revisionMetadata *appv1.RevisionMetadata) *appv1.Application {
173+
if revisionMetadata == nil {
174+
return app
175+
}
176+
177+
if app.ObjectMeta.Labels == nil {
178+
app.ObjectMeta.Labels = map[string]string{}
179+
}
180+
181+
app.ObjectMeta.Labels["app.meta.commit-date"] = revisionMetadata.Date.Format("2006-01-02T15:04:05.000Z")
182+
app.ObjectMeta.Labels["app.meta.commit-author"] = revisionMetadata.Author
183+
app.ObjectMeta.Labels["app.meta.commit-message"] = revisionMetadata.Message
184+
185+
return app
186+
}

pkg/apis/application/v1alpha1/types_codefresh.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,19 @@ func (a *Application) SetDefaultTypeMeta() {
1616
APIVersion: SchemeGroupVersion.String(),
1717
}
1818
}
19+
20+
func (a *ApplicationSpec) GetNonRefSource() (*ApplicationSource, int) {
21+
if a.HasMultipleSources() {
22+
for idx, source := range a.Sources {
23+
if !source.IsRef() {
24+
return &source, idx
25+
}
26+
}
27+
}
28+
29+
if a.Source != nil { // single source app
30+
return a.Source, -1
31+
}
32+
33+
return nil, -2
34+
}

0 commit comments

Comments
 (0)