From b777b8920a8632989d76c650468eb83805afc403 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 6 Nov 2024 12:09:54 +0200 Subject: [PATCH 01/26] event-reporter: created dedicated func resolveApplicationVersions --- .../reporter/application_event_reporter.go | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index a64cd1c0a1f82..441227f0910e2 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -141,14 +141,7 @@ func (s *applicationEventReporter) StreamApplicationEvents( desiredManifests, manifestGenErr := s.getDesiredManifests(ctx, a, nil, logCtx) - syncRevision := utils.GetOperationStateRevision(a) - var applicationVersions *apiclient.ApplicationVersions - if syncRevision != nil { - syncManifests, _ := s.getDesiredManifests(ctx, a, syncRevision, logCtx) - applicationVersions = syncManifests.GetApplicationVersions() - } else { - applicationVersions = nil - } + applicationVersions := s.resolveApplicationVersions(ctx, a, logCtx) logCtx.Info("getting parent application name") @@ -225,6 +218,19 @@ func (s *applicationEventReporter) StreamApplicationEvents( return nil } +func (s *applicationEventReporter) resolveApplicationVersions(ctx context.Context, a *appv1.Application, logCtx *log.Entry) *apiclient.ApplicationVersions { + syncRevision := utils.GetOperationStateRevision(a) + var applicationVersions *apiclient.ApplicationVersions + if syncRevision != nil { + syncManifests, _ := s.getDesiredManifests(ctx, a, syncRevision, logCtx) + applicationVersions = syncManifests.GetApplicationVersions() + } else { + applicationVersions = nil + } + + return applicationVersions +} + func (s *applicationEventReporter) getAppForResourceReporting( rs appv1.ResourceStatus, ctx context.Context, From 2f4c9b3cba57b03c40c9fa6cd70f5ee55b587843 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 6 Nov 2024 12:14:31 +0200 Subject: [PATCH 02/26] event-reporter: added new types for variables grouping --- event_reporter/reporter/types.go | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 event_reporter/reporter/types.go diff --git a/event_reporter/reporter/types.go b/event_reporter/reporter/types.go new file mode 100644 index 0000000000000..b8d2147e5fb75 --- /dev/null +++ b/event_reporter/reporter/types.go @@ -0,0 +1,34 @@ +package reporter + +import ( + "github.com/argoproj/argo-cd/v2/event_reporter/utils" + "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" + appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v2/reposerver/apiclient" +) + +type ReportedResource struct { + rs *appv1.ResourceStatus + rsAsAppInfo *ReportedResourceAsApp // passed if resource is application + actualState *application.ApplicationResourceResponse + desiredState *apiclient.Manifest + manifestGenErr *bool +} + +type ReportedResourceAsApp struct { + app *appv1.Application + revisionsMetadata *utils.AppSyncRevisionsMetadata + applicationVersions *apiclient.ApplicationVersions +} + +type ReportedEntityParentApp struct { + app *appv1.Application + appTree *appv1.ApplicationTree + validatedDestination *appv1.ApplicationDestination + revisionsMetadata *utils.AppSyncRevisionsMetadata +} + +type ArgoTrackingMetadata struct { + appInstanceLabelKey *string + trackingMethod *appv1.TrackingMethod +} From 69b3eddc97814d579aae9302c095b35d4706b51e Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 6 Nov 2024 12:27:45 +0200 Subject: [PATCH 03/26] event-reporter: removed redundant code comment --- event_reporter/reporter/application_event_reporter.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index 441227f0910e2..91a0545ac3325 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -158,17 +158,15 @@ func (s *applicationEventReporter) StreamApplicationEvents( } rs := utils.GetAppAsResource(a) + utils.SetHealthStatusIfMissing(rs) parentDesiredManifests, manifestGenErr := s.getDesiredManifests(ctx, parentApplicationEntity, nil, logCtx) - // helm app hasnt revision - // TODO: add check if it helm application parentAppSyncRevisionsMetadata, err := s.getApplicationRevisionsMetadata(ctx, logCtx, parentApplicationEntity) if err != nil { logCtx.WithError(err).Warn("failed to get parent application's revision metadata, resuming") } - utils.SetHealthStatusIfMissing(rs) err = s.processResource(ctx, *rs, parentApplicationEntity, logCtx, eventProcessingStartedAt, parentDesiredManifests, appTree, manifestGenErr, a, parentAppSyncRevisionsMetadata, appInstanceLabelKey, trackingMethod, applicationVersions) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricChildAppEventType, metrics.MetricEventUnknownErrorType, a.Name) @@ -176,8 +174,8 @@ func (s *applicationEventReporter) StreamApplicationEvents( } s.metricsServer.ObserveEventProcessingDurationHistogramDuration(a.Name, metrics.MetricChildAppEventType, metricTimer.Duration()) } else { - logCtx.Info("processing as root application") // will get here only for root applications (not managed as a resource by another application) + logCtx.Info("processing as root application") appEvent, err := s.getApplicationEventPayload(ctx, a, appTree, eventProcessingStartedAt, appInstanceLabelKey, trackingMethod, applicationVersions) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricParentAppEventType, metrics.MetricEventGetPayloadErrorType, a.Name) From 899313da70b5280cdc72766a5606b9394ca5100e Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 6 Nov 2024 14:51:14 +0200 Subject: [PATCH 04/26] event-reporter(refactoring): params grouping, added new type ArgoTrackingMetadata to pass data between methods --- event_reporter/controller/controller.go | 5 ++++- .../reporter/application_event_reporter.go | 19 ++++++++----------- .../application_event_reporter_test.go | 4 +--- event_reporter/reporter/event_payload.go | 14 ++++++-------- event_reporter/reporter/event_payload_test.go | 16 +++++++++++++--- event_reporter/reporter/types.go | 4 ++-- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/event_reporter/controller/controller.go b/event_reporter/controller/controller.go index 7ce4f100b4411..85aba07fb7b7f 100644 --- a/event_reporter/controller/controller.go +++ b/event_reporter/controller/controller.go @@ -76,7 +76,10 @@ func (c *eventReporterController) Run(ctx context.Context) { } trackingMethod := argoutil.GetTrackingMethod(c.settingsMgr) - err = c.applicationEventReporter.StreamApplicationEvents(ctx, &a, eventProcessingStartedAt, ignoreResourceCache, appInstanceLabelKey, trackingMethod) + err = c.applicationEventReporter.StreamApplicationEvents(ctx, &a, eventProcessingStartedAt, ignoreResourceCache, &reporter.ArgoTrackingMetadata{ + AppInstanceLabelKey: &appInstanceLabelKey, + TrackingMethod: &trackingMethod, + }) if err != nil { return err } diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index 91a0545ac3325..7af6b8b0f6577 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -48,8 +48,7 @@ type ApplicationEventReporter interface { a *appv1.Application, eventProcessingStartedAt string, ignoreResourceCache bool, - appInstanceLabelKey string, - trackingMethod appv1.TrackingMethod, + argoTrackingMetadata *ArgoTrackingMetadata, ) error ShouldSendApplicationEvent(ae *appv1.ApplicationWatchEvent) (shouldSend bool, syncStatusChanged bool) } @@ -113,8 +112,7 @@ func (s *applicationEventReporter) StreamApplicationEvents( a *appv1.Application, eventProcessingStartedAt string, ignoreResourceCache bool, - appInstanceLabelKey string, - trackingMethod appv1.TrackingMethod, + argoTrackingMetadata *ArgoTrackingMetadata, ) error { metricTimer := metricsUtils.NewMetricTimer() @@ -145,7 +143,7 @@ func (s *applicationEventReporter) StreamApplicationEvents( logCtx.Info("getting parent application name") - parentAppIdentity := utils.GetParentAppIdentity(a, appInstanceLabelKey, trackingMethod) + parentAppIdentity := utils.GetParentAppIdentity(a, *argoTrackingMetadata.AppInstanceLabelKey, *argoTrackingMetadata.TrackingMethod) if utils.IsChildApp(parentAppIdentity) { logCtx.Info("processing as child application") @@ -167,7 +165,7 @@ func (s *applicationEventReporter) StreamApplicationEvents( logCtx.WithError(err).Warn("failed to get parent application's revision metadata, resuming") } - err = s.processResource(ctx, *rs, parentApplicationEntity, logCtx, eventProcessingStartedAt, parentDesiredManifests, appTree, manifestGenErr, a, parentAppSyncRevisionsMetadata, appInstanceLabelKey, trackingMethod, applicationVersions) + err = s.processResource(ctx, *rs, parentApplicationEntity, logCtx, eventProcessingStartedAt, parentDesiredManifests, appTree, manifestGenErr, a, parentAppSyncRevisionsMetadata, applicationVersions, argoTrackingMetadata) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricChildAppEventType, metrics.MetricEventUnknownErrorType, a.Name) return err @@ -176,7 +174,7 @@ func (s *applicationEventReporter) StreamApplicationEvents( } else { // will get here only for root applications (not managed as a resource by another application) logCtx.Info("processing as root application") - appEvent, err := s.getApplicationEventPayload(ctx, a, appTree, eventProcessingStartedAt, appInstanceLabelKey, trackingMethod, applicationVersions) + appEvent, err := s.getApplicationEventPayload(ctx, a, appTree, eventProcessingStartedAt, applicationVersions, argoTrackingMetadata) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricParentAppEventType, metrics.MetricEventGetPayloadErrorType, a.Name) return fmt.Errorf("failed to get application event: %w", err) @@ -207,7 +205,7 @@ func (s *applicationEventReporter) StreamApplicationEvents( s.metricsServer.IncCachedIgnoredEventsCounter(metrics.MetricResourceEventType, a.Name) continue } - err := s.processResource(ctx, rs, a, logCtx, eventProcessingStartedAt, desiredManifests, appTree, manifestGenErr, nil, revisionsMetadata, appInstanceLabelKey, trackingMethod, nil) + err := s.processResource(ctx, rs, a, logCtx, eventProcessingStartedAt, desiredManifests, appTree, manifestGenErr, nil, revisionsMetadata, nil, argoTrackingMetadata) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricResourceEventType, metrics.MetricEventUnknownErrorType, a.Name) return err @@ -264,9 +262,8 @@ func (s *applicationEventReporter) processResource( manifestGenErr bool, originalApplication *appv1.Application, revisionsMetadata *utils.AppSyncRevisionsMetadata, - appInstanceLabelKey string, - trackingMethod appv1.TrackingMethod, applicationVersions *apiclient.ApplicationVersions, + argoTrackingMetadata *ArgoTrackingMetadata, ) error { metricsEventType := metrics.MetricResourceEventType if utils.IsApp(rs) { @@ -297,7 +294,7 @@ func (s *applicationEventReporter) processResource( originalAppRevisionMetadata, _ = s.getApplicationRevisionsMetadata(ctx, logCtx, originalApplication) } - ev, err := getResourceEventPayload(parentApplicationToReport, &rs, actualState, desiredState, appTree, manifestGenErr, appEventProcessingStartedAt, originalApplication, revisionMetadataToReport, originalAppRevisionMetadata, appInstanceLabelKey, trackingMethod, applicationVersions) + ev, err := getResourceEventPayload(parentApplicationToReport, &rs, actualState, desiredState, appTree, manifestGenErr, appEventProcessingStartedAt, originalApplication, revisionMetadataToReport, originalAppRevisionMetadata, applicationVersions, argoTrackingMetadata) if err != nil { s.metricsServer.IncErroredEventsCounter(metricsEventType, metrics.MetricEventGetPayloadErrorType, parentApplication.Name) logCtx.WithError(err).Warn("failed to get event payload, resuming") diff --git a/event_reporter/reporter/application_event_reporter_test.go b/event_reporter/reporter/application_event_reporter_test.go index 621c0ac65adc8..24f57525b9a5d 100644 --- a/event_reporter/reporter/application_event_reporter_test.go +++ b/event_reporter/reporter/application_event_reporter_test.go @@ -38,12 +38,10 @@ import ( "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" "github.com/argoproj/argo-cd/v2/pkg/apiclient/events" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" "github.com/argoproj/argo-cd/v2/pkg/codefresh" - "github.com/argoproj/argo-cd/v2/util/argo" ) const ( @@ -226,7 +224,7 @@ func TestStreamApplicationEvent(t *testing.T) { assert.Equal(t, *app, actualApp) return nil } - _ = eventReporter.StreamApplicationEvents(context.Background(), app, "", false, common.LabelKeyAppInstance, argo.TrackingMethodLabel) + _ = eventReporter.StreamApplicationEvents(context.Background(), app, "", false, getMockedArgoTrackingMetadata()) }) } diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index 9aeda6fdbc517..dff303671d608 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -30,9 +30,8 @@ func getResourceEventPayload( originalApplication *appv1.Application, // passed when rs is application revisionsMetadata *utils.AppSyncRevisionsMetadata, originalAppRevisionsMetadata *utils.AppSyncRevisionsMetadata, // passed when rs is application - appInstanceLabelKey string, - trackingMethod appv1.TrackingMethod, applicationVersions *apiclient.ApplicationVersions, + argoTrackingMetadata *ArgoTrackingMetadata, ) (*events.Event, error) { var ( err error @@ -172,8 +171,8 @@ func getResourceEventPayload( SyncStartedAt: syncStarted, SyncFinishedAt: syncFinished, Cluster: parentApplication.Spec.Destination.Server, - AppInstanceLabelKey: appInstanceLabelKey, - TrackingMethod: string(trackingMethod), + AppInstanceLabelKey: *argoTrackingMetadata.AppInstanceLabelKey, + TrackingMethod: string(*argoTrackingMetadata.TrackingMethod), } if revisionsMetadata != nil && revisionsMetadata.SyncRevisions != nil { @@ -216,9 +215,8 @@ func (s *applicationEventReporter) getApplicationEventPayload( a *appv1.Application, appTree *appv1.ApplicationTree, eventProcessingStartedAt string, - appInstanceLabelKey string, - trackingMethod appv1.TrackingMethod, applicationVersions *apiclient.ApplicationVersions, + argoTrackingMetadata *ArgoTrackingMetadata, ) (*events.Event, error) { var ( syncStarted = metav1.Now() @@ -287,8 +285,8 @@ func (s *applicationEventReporter) getApplicationEventPayload( HealthStatus: &hs, HealthMessage: &a.Status.Health.Message, Cluster: a.Spec.Destination.Server, - AppInstanceLabelKey: appInstanceLabelKey, - TrackingMethod: string(trackingMethod), + AppInstanceLabelKey: *argoTrackingMetadata.AppInstanceLabelKey, + TrackingMethod: string(*argoTrackingMetadata.TrackingMethod), } errors = append(errors, parseApplicationSyncResultErrorsFromConditions(a.Status)...) diff --git a/event_reporter/reporter/event_payload_test.go b/event_reporter/reporter/event_payload_test.go index dc305a099c897..376670c5d2f04 100644 --- a/event_reporter/reporter/event_payload_test.go +++ b/event_reporter/reporter/event_payload_test.go @@ -18,6 +18,16 @@ import ( "github.com/argoproj/argo-cd/v2/util/argo" ) +func getMockedArgoTrackingMetadata() *ArgoTrackingMetadata { + appInstanceLabelKey := common.LabelKeyAppInstance + trackingMethod := argo.TrackingMethodLabel + + return &ArgoTrackingMetadata{ + AppInstanceLabelKey: &appInstanceLabelKey, + TrackingMethod: &trackingMethod, + } +} + func TestGetResourceEventPayload(t *testing.T) { t.Run("Deleting timestamp is empty", func(t *testing.T) { app := v1alpha1.Application{ @@ -48,7 +58,7 @@ func TestGetResourceEventPayload(t *testing.T) { }}, } - event, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata, nil, common.LabelKeyAppInstance, argo.TrackingMethodLabel, &repoApiclient.ApplicationVersions{}) + event, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata, nil, &repoApiclient.ApplicationVersions{}, getMockedArgoTrackingMetadata()) require.NoError(t, err) var eventPayload events.EventPayload @@ -80,7 +90,7 @@ func TestGetResourceEventPayload(t *testing.T) { SyncRevisions: []*utils.RevisionWithMetadata{}, } - event, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata, nil, common.LabelKeyAppInstance, argo.TrackingMethodLabel, &repoApiclient.ApplicationVersions{}) + event, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata, nil, &repoApiclient.ApplicationVersions{}, getMockedArgoTrackingMetadata()) require.NoError(t, err) var eventPayload events.EventPayload @@ -107,6 +117,6 @@ func TestGetResourceEventPayloadWithoutRevision(t *testing.T) { } appTree := v1alpha1.ApplicationTree{} - _, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, nil, nil, common.LabelKeyAppInstance, argo.TrackingMethodLabel, &repoApiclient.ApplicationVersions{}) + _, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, nil, nil, &repoApiclient.ApplicationVersions{}, getMockedArgoTrackingMetadata()) assert.NoError(t, err) } diff --git a/event_reporter/reporter/types.go b/event_reporter/reporter/types.go index b8d2147e5fb75..dec461e53da74 100644 --- a/event_reporter/reporter/types.go +++ b/event_reporter/reporter/types.go @@ -29,6 +29,6 @@ type ReportedEntityParentApp struct { } type ArgoTrackingMetadata struct { - appInstanceLabelKey *string - trackingMethod *appv1.TrackingMethod + AppInstanceLabelKey *string + TrackingMethod *appv1.TrackingMethod } From bcb573d08a9aed0cda816b9cbdf77ab4f56e4f3e Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 6 Nov 2024 15:28:35 +0200 Subject: [PATCH 05/26] event-reporter(refactoring): params grouping, added new type ReportedEntityParentApp to pass data between methods --- .../reporter/application_event_reporter.go | 30 +++++++++----- event_reporter/reporter/event_payload.go | 40 +++++++++---------- event_reporter/reporter/event_payload_test.go | 17 ++++++-- 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index 7af6b8b0f6577..e90a224ba30fc 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -165,7 +165,11 @@ func (s *applicationEventReporter) StreamApplicationEvents( logCtx.WithError(err).Warn("failed to get parent application's revision metadata, resuming") } - err = s.processResource(ctx, *rs, parentApplicationEntity, logCtx, eventProcessingStartedAt, parentDesiredManifests, appTree, manifestGenErr, a, parentAppSyncRevisionsMetadata, applicationVersions, argoTrackingMetadata) + err = s.processResource(ctx, *rs, logCtx, eventProcessingStartedAt, parentDesiredManifests, manifestGenErr, a, applicationVersions, &ReportedEntityParentApp{ + app: parentApplicationEntity, + appTree: appTree, + revisionsMetadata: parentAppSyncRevisionsMetadata, + }, argoTrackingMetadata) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricChildAppEventType, metrics.MetricEventUnknownErrorType, a.Name) return err @@ -205,7 +209,11 @@ func (s *applicationEventReporter) StreamApplicationEvents( s.metricsServer.IncCachedIgnoredEventsCounter(metrics.MetricResourceEventType, a.Name) continue } - err := s.processResource(ctx, rs, a, logCtx, eventProcessingStartedAt, desiredManifests, appTree, manifestGenErr, nil, revisionsMetadata, nil, argoTrackingMetadata) + err := s.processResource(ctx, rs, logCtx, eventProcessingStartedAt, desiredManifests, manifestGenErr, nil, nil, &ReportedEntityParentApp{ + app: a, + appTree: appTree, + revisionsMetadata: revisionsMetadata, + }, argoTrackingMetadata) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricResourceEventType, metrics.MetricEventUnknownErrorType, a.Name) return err @@ -254,15 +262,13 @@ func (s *applicationEventReporter) getAppForResourceReporting( func (s *applicationEventReporter) processResource( ctx context.Context, rs appv1.ResourceStatus, - parentApplication *appv1.Application, logCtx *log.Entry, appEventProcessingStartedAt string, desiredManifests *apiclient.ManifestResponse, - appTree *appv1.ApplicationTree, manifestGenErr bool, originalApplication *appv1.Application, - revisionsMetadata *utils.AppSyncRevisionsMetadata, applicationVersions *apiclient.ApplicationVersions, + reportedEntityParentApp *ReportedEntityParentApp, argoTrackingMetadata *ArgoTrackingMetadata, ) error { metricsEventType := metrics.MetricResourceEventType @@ -278,7 +284,7 @@ func (s *applicationEventReporter) processResource( // get resource desired state desiredState := getResourceDesiredState(&rs, desiredManifests, logCtx) - actualState, err := s.getResourceActualState(ctx, logCtx, metricsEventType, rs, parentApplication, originalApplication) + actualState, err := s.getResourceActualState(ctx, logCtx, metricsEventType, rs, reportedEntityParentApp.app, originalApplication) if err != nil { return err } @@ -286,7 +292,7 @@ func (s *applicationEventReporter) processResource( return nil } - parentApplicationToReport, revisionMetadataToReport := s.getAppForResourceReporting(rs, ctx, logCtx, parentApplication, revisionsMetadata) + parentApplicationToReport, revisionMetadataToReport := s.getAppForResourceReporting(rs, ctx, logCtx, reportedEntityParentApp.app, reportedEntityParentApp.revisionsMetadata) var originalAppRevisionMetadata *utils.AppSyncRevisionsMetadata = nil @@ -294,9 +300,13 @@ func (s *applicationEventReporter) processResource( originalAppRevisionMetadata, _ = s.getApplicationRevisionsMetadata(ctx, logCtx, originalApplication) } - ev, err := getResourceEventPayload(parentApplicationToReport, &rs, actualState, desiredState, appTree, manifestGenErr, appEventProcessingStartedAt, originalApplication, revisionMetadataToReport, originalAppRevisionMetadata, applicationVersions, argoTrackingMetadata) + ev, err := getResourceEventPayload(&rs, actualState, desiredState, manifestGenErr, appEventProcessingStartedAt, originalApplication, originalAppRevisionMetadata, applicationVersions, &ReportedEntityParentApp{ + app: parentApplicationToReport, + appTree: reportedEntityParentApp.appTree, + revisionsMetadata: revisionMetadataToReport, + }, argoTrackingMetadata) if err != nil { - s.metricsServer.IncErroredEventsCounter(metricsEventType, metrics.MetricEventGetPayloadErrorType, parentApplication.Name) + s.metricsServer.IncErroredEventsCounter(metricsEventType, metrics.MetricEventGetPayloadErrorType, reportedEntityParentApp.app.Name) logCtx.WithError(err).Warn("failed to get event payload, resuming") return nil } @@ -308,7 +318,7 @@ func (s *applicationEventReporter) processResource( appName = appRes.Name } else { utils.LogWithResourceStatus(logCtx, rs).Info("streaming resource event") - appName = parentApplication.Name + appName = reportedEntityParentApp.app.Name } if err := s.codefreshClient.SendEvent(ctx, appName, ev); err != nil { diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index dff303671d608..8bd37f212fc01 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -20,17 +20,15 @@ import ( ) func getResourceEventPayload( - parentApplication *appv1.Application, rs *appv1.ResourceStatus, actualState *application.ApplicationResourceResponse, desiredState *apiclient.Manifest, - apptree *appv1.ApplicationTree, manifestGenErr bool, appEventProcessingStartedAt string, originalApplication *appv1.Application, // passed when rs is application - revisionsMetadata *utils.AppSyncRevisionsMetadata, originalAppRevisionsMetadata *utils.AppSyncRevisionsMetadata, // passed when rs is application applicationVersions *apiclient.ApplicationVersions, + reportedEntityParentApp *ReportedEntityParentApp, argoTrackingMetadata *ArgoTrackingMetadata, ) (*events.Event, error) { var ( @@ -110,17 +108,17 @@ func getResourceEventPayload( actualState.Manifest = &manifest } - if (originalApplication != nil && originalApplication.DeletionTimestamp != nil) || parentApplication.ObjectMeta.DeletionTimestamp != nil { + if (originalApplication != nil && originalApplication.DeletionTimestamp != nil) || reportedEntityParentApp.app.ObjectMeta.DeletionTimestamp != nil { // resource should be deleted in case if application in process of deletion desiredState.CompiledManifest = "" manifest := "" actualState.Manifest = &manifest } - if parentApplication.Status.OperationState != nil { - syncStarted = parentApplication.Status.OperationState.StartedAt - syncFinished = parentApplication.Status.OperationState.FinishedAt - errors = append(errors, parseResourceSyncResultErrors(rs, parentApplication.Status.OperationState)...) + if reportedEntityParentApp.app.Status.OperationState != nil { + syncStarted = reportedEntityParentApp.app.Status.OperationState.StartedAt + syncFinished = reportedEntityParentApp.app.Status.OperationState.FinishedAt + errors = append(errors, parseResourceSyncResultErrors(rs, reportedEntityParentApp.app.Status.OperationState)...) } // for primitive resources that are synced right away and don't require progression time (like configmap) @@ -138,7 +136,7 @@ func getResourceEventPayload( } if originalApplication != nil { - errors = append(errors, parseAggregativeHealthErrorsOfApplication(originalApplication, apptree)...) + errors = append(errors, parseAggregativeHealthErrorsOfApplication(originalApplication, reportedEntityParentApp.appTree)...) } if len(desiredState.RawManifest) == 0 && len(desiredState.CompiledManifest) != 0 { @@ -158,25 +156,25 @@ func getResourceEventPayload( DesiredManifest: desiredState.CompiledManifest, ActualManifest: *actualState.Manifest, GitManifest: desiredState.RawManifest, - RepoURL: parentApplication.Status.Sync.ComparedTo.Source.RepoURL, + RepoURL: reportedEntityParentApp.app.Status.Sync.ComparedTo.Source.RepoURL, Path: desiredState.Path, - Revision: utils.GetApplicationLatestRevision(parentApplication), - OperationSyncRevision: utils.GetOperationRevision(parentApplication), - HistoryId: utils.GetLatestAppHistoryId(parentApplication), - AppName: parentApplication.Name, - AppNamespace: parentApplication.Namespace, - AppUID: string(parentApplication.ObjectMeta.UID), - AppLabels: parentApplication.Labels, + Revision: utils.GetApplicationLatestRevision(reportedEntityParentApp.app), + OperationSyncRevision: utils.GetOperationRevision(reportedEntityParentApp.app), + HistoryId: utils.GetLatestAppHistoryId(reportedEntityParentApp.app), + AppName: reportedEntityParentApp.app.Name, + AppNamespace: reportedEntityParentApp.app.Namespace, + AppUID: string(reportedEntityParentApp.app.ObjectMeta.UID), + AppLabels: reportedEntityParentApp.app.Labels, SyncStatus: string(rs.Status), SyncStartedAt: syncStarted, SyncFinishedAt: syncFinished, - Cluster: parentApplication.Spec.Destination.Server, + Cluster: reportedEntityParentApp.app.Spec.Destination.Server, AppInstanceLabelKey: *argoTrackingMetadata.AppInstanceLabelKey, TrackingMethod: string(*argoTrackingMetadata.TrackingMethod), } - if revisionsMetadata != nil && revisionsMetadata.SyncRevisions != nil { - revisionMetadata := getApplicationLegacyRevisionDetails(parentApplication, revisionsMetadata) + if reportedEntityParentApp.revisionsMetadata != nil && reportedEntityParentApp.revisionsMetadata.SyncRevisions != nil { + revisionMetadata := getApplicationLegacyRevisionDetails(reportedEntityParentApp.app, reportedEntityParentApp.revisionsMetadata) if revisionMetadata != nil { source.CommitMessage = revisionMetadata.Message source.CommitAuthor = revisionMetadata.Author @@ -188,7 +186,7 @@ func getResourceEventPayload( source.HealthStatus = (*string)(&rs.Health.Status) source.HealthMessage = &rs.Health.Message if rs.Health.Status != health.HealthStatusHealthy { - errors = append(errors, parseAggregativeHealthErrors(rs, apptree, false)...) + errors = append(errors, parseAggregativeHealthErrors(rs, reportedEntityParentApp.appTree, false)...) } } diff --git a/event_reporter/reporter/event_payload_test.go b/event_reporter/reporter/event_payload_test.go index 376670c5d2f04..210cd16a49f22 100644 --- a/event_reporter/reporter/event_payload_test.go +++ b/event_reporter/reporter/event_payload_test.go @@ -58,7 +58,11 @@ func TestGetResourceEventPayload(t *testing.T) { }}, } - event, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata, nil, &repoApiclient.ApplicationVersions{}, getMockedArgoTrackingMetadata()) + event, err := getResourceEventPayload(&rs, &actualState, &desiredState, true, "", nil, nil, &repoApiclient.ApplicationVersions{}, &ReportedEntityParentApp{ + app: &app, + appTree: &appTree, + revisionsMetadata: &revisionMetadata, + }, getMockedArgoTrackingMetadata()) require.NoError(t, err) var eventPayload events.EventPayload @@ -90,7 +94,11 @@ func TestGetResourceEventPayload(t *testing.T) { SyncRevisions: []*utils.RevisionWithMetadata{}, } - event, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, &revisionMetadata, nil, &repoApiclient.ApplicationVersions{}, getMockedArgoTrackingMetadata()) + event, err := getResourceEventPayload(&rs, &actualState, &desiredState, true, "", nil, nil, &repoApiclient.ApplicationVersions{}, &ReportedEntityParentApp{ + app: &app, + appTree: &appTree, + revisionsMetadata: &revisionMetadata, + }, getMockedArgoTrackingMetadata()) require.NoError(t, err) var eventPayload events.EventPayload @@ -117,6 +125,9 @@ func TestGetResourceEventPayloadWithoutRevision(t *testing.T) { } appTree := v1alpha1.ApplicationTree{} - _, err := getResourceEventPayload(&app, &rs, &actualState, &desiredState, &appTree, true, "", nil, nil, nil, &repoApiclient.ApplicationVersions{}, getMockedArgoTrackingMetadata()) + _, err := getResourceEventPayload(&rs, &actualState, &desiredState, true, "", nil, nil, &repoApiclient.ApplicationVersions{}, &ReportedEntityParentApp{ + app: &app, + appTree: &appTree, + }, getMockedArgoTrackingMetadata()) assert.NoError(t, err) } From cceaa27ba6b4e6cb300d7499a762e23c4b0ce86e Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 6 Nov 2024 17:50:27 +0200 Subject: [PATCH 06/26] event-reporter(refactoring): params grouping, added new type ReportedResource to pass data between methods, created new methods to group logic inside getResourceEventPayload --- .../reporter/application_event_reporter.go | 29 ++- event_reporter/reporter/event_payload.go | 232 ++++++++++-------- event_reporter/reporter/event_payload_test.go | 24 +- event_reporter/reporter/types.go | 2 +- 4 files changed, 177 insertions(+), 110 deletions(-) diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index e90a224ba30fc..4b5c72cde7a07 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -266,8 +266,8 @@ func (s *applicationEventReporter) processResource( appEventProcessingStartedAt string, desiredManifests *apiclient.ManifestResponse, manifestGenErr bool, - originalApplication *appv1.Application, - applicationVersions *apiclient.ApplicationVersions, + originalApplication *appv1.Application, // passed onlu if resource is app + applicationVersions *apiclient.ApplicationVersions, // passed onlu if resource is app reportedEntityParentApp *ReportedEntityParentApp, argoTrackingMetadata *ArgoTrackingMetadata, ) error { @@ -300,11 +300,26 @@ func (s *applicationEventReporter) processResource( originalAppRevisionMetadata, _ = s.getApplicationRevisionsMetadata(ctx, logCtx, originalApplication) } - ev, err := getResourceEventPayload(&rs, actualState, desiredState, manifestGenErr, appEventProcessingStartedAt, originalApplication, originalAppRevisionMetadata, applicationVersions, &ReportedEntityParentApp{ - app: parentApplicationToReport, - appTree: reportedEntityParentApp.appTree, - revisionsMetadata: revisionMetadataToReport, - }, argoTrackingMetadata) + ev, err := getResourceEventPayload( + appEventProcessingStartedAt, + &ReportedResource{ + rs: &rs, + actualState: actualState, + desiredState: desiredState, + manifestGenErr: manifestGenErr, + rsAsAppInfo: &ReportedResourceAsApp{ + app: originalApplication, + revisionsMetadata: originalAppRevisionMetadata, + applicationVersions: applicationVersions, + }, + }, + &ReportedEntityParentApp{ + app: parentApplicationToReport, + appTree: reportedEntityParentApp.appTree, + revisionsMetadata: revisionMetadataToReport, + }, + argoTrackingMetadata, + ) if err != nil { s.metricsServer.IncErroredEventsCounter(metricsEventType, metrics.MetricEventGetPayloadErrorType, reportedEntityParentApp.app.Name) logCtx.WithError(err).Warn("failed to get event payload, resuming") diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index 8bd37f212fc01..c8fdd71df6bca 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -20,14 +20,8 @@ import ( ) func getResourceEventPayload( - rs *appv1.ResourceStatus, - actualState *application.ApplicationResourceResponse, - desiredState *apiclient.Manifest, - manifestGenErr bool, appEventProcessingStartedAt string, - originalApplication *appv1.Application, // passed when rs is application - originalAppRevisionsMetadata *utils.AppSyncRevisionsMetadata, // passed when rs is application - applicationVersions *apiclient.ApplicationVersions, + rr *ReportedResource, reportedEntityParentApp *ReportedEntityParentApp, argoTrackingMetadata *ArgoTrackingMetadata, ) (*events.Event, error) { @@ -35,129 +29,80 @@ func getResourceEventPayload( err error syncStarted = metav1.Now() syncFinished *metav1.Time - errors = []*events.ObjectError{} logCtx *log.Entry ) - if originalApplication != nil { - logCtx = log.WithField("application", originalApplication.Name) + if rr.rsAsAppInfo.app != nil { + logCtx = log.WithField("application", rr.rsAsAppInfo.app.Name) } else { logCtx = log.NewEntry(log.StandardLogger()) } - object := []byte(*actualState.Manifest) + object := []byte(*rr.actualState.Manifest) - if originalAppRevisionsMetadata != nil && len(object) != 0 { - actualObject, err := appv1.UnmarshalToUnstructured(*actualState.Manifest) + if rr.rsAsAppInfo.revisionsMetadata != nil && len(object) != 0 { + actualObject, err := appv1.UnmarshalToUnstructured(*rr.actualState.Manifest) - if err == nil { - actualObject = utils.AddCommitsDetailsToAnnotations(actualObject, originalAppRevisionsMetadata) - if originalApplication != nil { - actualObject = utils.AddCommitDetailsToLabels(actualObject, getApplicationLegacyRevisionDetails(originalApplication, originalAppRevisionsMetadata)) - } + if err != nil { + return nil, fmt.Errorf("failed to unmarshal manifest: %w", err) + } - object, err = actualObject.MarshalJSON() - if err != nil { - return nil, fmt.Errorf("failed to marshal unstructured object: %w", err) - } + object, err = addCommitDetailsToUnstructured(actualObject, rr) + if err != nil { + return nil, err } } if len(object) == 0 { - if len(desiredState.CompiledManifest) == 0 { - // no actual or desired state, don't send event - u := &unstructured.Unstructured{} - apiVersion := rs.Version - if rs.Group != "" { - apiVersion = rs.Group + "/" + rs.Version - } - - u.SetAPIVersion(apiVersion) - u.SetKind(rs.Kind) - u.SetName(rs.Name) - u.SetNamespace(rs.Namespace) - if originalAppRevisionsMetadata != nil { - u = utils.AddCommitsDetailsToAnnotations(u, originalAppRevisionsMetadata) - if originalApplication != nil { - u = utils.AddCommitDetailsToLabels(u, getApplicationLegacyRevisionDetails(originalApplication, originalAppRevisionsMetadata)) - } - } - - object, err = u.MarshalJSON() + if len(rr.desiredState.CompiledManifest) == 0 { + object, err = buildEventObjectAsLiveAndCompiledManifestsEmpty(rr) if err != nil { - return nil, fmt.Errorf("failed to marshal unstructured object: %w", err) + return nil, err } } else { - // no actual state, use desired state as event object - unstructuredWithNamespace, err := utils.AddDestNamespaceToManifest([]byte(desiredState.CompiledManifest), rs) + object, err = useCompiledManifestAsEventObject(rr) if err != nil { - return nil, fmt.Errorf("failed to add destination namespace to manifest: %w", err) + return nil, err } - if originalAppRevisionsMetadata != nil { - unstructuredWithNamespace = utils.AddCommitsDetailsToAnnotations(unstructuredWithNamespace, originalAppRevisionsMetadata) - if originalApplication != nil { - unstructuredWithNamespace = utils.AddCommitDetailsToLabels(unstructuredWithNamespace, getApplicationLegacyRevisionDetails(originalApplication, originalAppRevisionsMetadata)) - } - } - - object, _ = unstructuredWithNamespace.MarshalJSON() } - } else if rs.RequiresPruning && !manifestGenErr { + } else if rr.rs.RequiresPruning && !rr.manifestGenErr { // resource should be deleted - desiredState.CompiledManifest = "" - manifest := "" - actualState.Manifest = &manifest + makeDesiredAndLiveManifestEmpty(rr.actualState, rr.desiredState) } - if (originalApplication != nil && originalApplication.DeletionTimestamp != nil) || reportedEntityParentApp.app.ObjectMeta.DeletionTimestamp != nil { + if (rr.rsAsAppInfo.app != nil && rr.rsAsAppInfo.app.DeletionTimestamp != nil) || reportedEntityParentApp.app.ObjectMeta.DeletionTimestamp != nil { // resource should be deleted in case if application in process of deletion - desiredState.CompiledManifest = "" - manifest := "" - actualState.Manifest = &manifest + makeDesiredAndLiveManifestEmpty(rr.actualState, rr.desiredState) + } + + if len(rr.desiredState.RawManifest) == 0 && len(rr.desiredState.CompiledManifest) != 0 { + // for handling helm defined resources, etc... + y, err := yaml.JSONToYAML([]byte(rr.desiredState.CompiledManifest)) + if err == nil { + rr.desiredState.RawManifest = string(y) + } } if reportedEntityParentApp.app.Status.OperationState != nil { syncStarted = reportedEntityParentApp.app.Status.OperationState.StartedAt syncFinished = reportedEntityParentApp.app.Status.OperationState.FinishedAt - errors = append(errors, parseResourceSyncResultErrors(rs, reportedEntityParentApp.app.Status.OperationState)...) } // for primitive resources that are synced right away and don't require progression time (like configmap) - if rs.Status == appv1.SyncStatusCodeSynced && rs.Health != nil && rs.Health.Status == health.HealthStatusHealthy { + if rr.rs.Status == appv1.SyncStatusCodeSynced && rr.rs.Health != nil && rr.rs.Health.Status == health.HealthStatusHealthy { syncFinished = &syncStarted } - // parent application not include errors in application originally was created with broken state, for example in destination missed namespace - if originalApplication != nil && originalApplication.Status.OperationState != nil { - errors = append(errors, parseApplicationSyncResultErrors(originalApplication.Status.OperationState)...) - } - - if originalApplication != nil && originalApplication.Status.Conditions != nil { - errors = append(errors, parseApplicationSyncResultErrorsFromConditions(originalApplication.Status)...) - } - - if originalApplication != nil { - errors = append(errors, parseAggregativeHealthErrorsOfApplication(originalApplication, reportedEntityParentApp.appTree)...) - } - - if len(desiredState.RawManifest) == 0 && len(desiredState.CompiledManifest) != 0 { - // for handling helm defined resources, etc... - y, err := yaml.JSONToYAML([]byte(desiredState.CompiledManifest)) - if err == nil { - desiredState.RawManifest = string(y) - } - } - - applicationVersionsEvents, err := utils.RepoAppVersionsToEvent(applicationVersions) + applicationVersionsEvents, err := utils.RepoAppVersionsToEvent(rr.rsAsAppInfo.applicationVersions) if err != nil { logCtx.Errorf("failed to convert appVersions: %v", err) } source := events.ObjectSource{ - DesiredManifest: desiredState.CompiledManifest, - ActualManifest: *actualState.Manifest, - GitManifest: desiredState.RawManifest, + DesiredManifest: rr.desiredState.CompiledManifest, + ActualManifest: *rr.actualState.Manifest, + GitManifest: rr.desiredState.RawManifest, RepoURL: reportedEntityParentApp.app.Status.Sync.ComparedTo.Source.RepoURL, - Path: desiredState.Path, + Path: rr.desiredState.Path, Revision: utils.GetApplicationLatestRevision(reportedEntityParentApp.app), OperationSyncRevision: utils.GetOperationRevision(reportedEntityParentApp.app), HistoryId: utils.GetLatestAppHistoryId(reportedEntityParentApp.app), @@ -165,7 +110,7 @@ func getResourceEventPayload( AppNamespace: reportedEntityParentApp.app.Namespace, AppUID: string(reportedEntityParentApp.app.ObjectMeta.UID), AppLabels: reportedEntityParentApp.app.Labels, - SyncStatus: string(rs.Status), + SyncStatus: string(rr.rs.Status), SyncStartedAt: syncStarted, SyncFinishedAt: syncFinished, Cluster: reportedEntityParentApp.app.Spec.Destination.Server, @@ -182,19 +127,16 @@ func getResourceEventPayload( } } - if rs.Health != nil { - source.HealthStatus = (*string)(&rs.Health.Status) - source.HealthMessage = &rs.Health.Message - if rs.Health.Status != health.HealthStatusHealthy { - errors = append(errors, parseAggregativeHealthErrors(rs, reportedEntityParentApp.appTree, false)...) - } + if rr.rs.Health != nil { + source.HealthStatus = (*string)(&rr.rs.Health.Status) + source.HealthMessage = &rr.rs.Health.Message } payload := events.EventPayload{ Timestamp: appEventProcessingStartedAt, Object: object, Source: &source, - Errors: errors, + Errors: getResourceEventPayloadErrors(rr, reportedEntityParentApp), AppVersions: applicationVersionsEvents, } @@ -202,12 +144,104 @@ func getResourceEventPayload( payloadBytes, err := json.Marshal(&payload) if err != nil { - return nil, fmt.Errorf("failed to marshal payload for resource %s/%s: %w", rs.Namespace, rs.Name, err) + return nil, fmt.Errorf("failed to marshal payload for resource %s/%s: %w", rr.rs.Namespace, rr.rs.Name, err) } return &events.Event{Payload: payloadBytes}, nil } +func getResourceEventPayloadErrors( + rr *ReportedResource, + reportedEntityParentApp *ReportedEntityParentApp, +) []*events.ObjectError { + var errors = []*events.ObjectError{} + + if reportedEntityParentApp.app.Status.OperationState != nil { + errors = append(errors, parseResourceSyncResultErrors(rr.rs, reportedEntityParentApp.app.Status.OperationState)...) + } + + // parent application not include errors in application originally was created with broken state, for example in destination missed namespace + if rr.rsAsAppInfo.app != nil && rr.rsAsAppInfo.app.Status.OperationState != nil { + errors = append(errors, parseApplicationSyncResultErrors(rr.rsAsAppInfo.app.Status.OperationState)...) + } + + if rr.rsAsAppInfo.app != nil && rr.rsAsAppInfo.app.Status.Conditions != nil { + errors = append(errors, parseApplicationSyncResultErrorsFromConditions(rr.rsAsAppInfo.app.Status)...) + } + + if rr.rsAsAppInfo.app != nil { + errors = append(errors, parseAggregativeHealthErrorsOfApplication(rr.rsAsAppInfo.app, reportedEntityParentApp.appTree)...) + } + + if rr.rs.Health != nil { + if rr.rs.Health.Status != health.HealthStatusHealthy { + errors = append(errors, parseAggregativeHealthErrors(rr.rs, reportedEntityParentApp.appTree, false)...) + } + } + + return errors +} + +func useCompiledManifestAsEventObject( + rr *ReportedResource, +) ([]byte, error) { + // no actual state, use desired state as event object + unstructuredWithNamespace, err := utils.AddDestNamespaceToManifest([]byte(rr.desiredState.CompiledManifest), rr.rs) + if err != nil { + return nil, fmt.Errorf("failed to add destination namespace to manifest: %w", err) + } + + return addCommitDetailsToUnstructured(unstructuredWithNamespace, rr) +} + +func buildEventObjectAsLiveAndCompiledManifestsEmpty( + rr *ReportedResource, +) ([]byte, error) { + // no actual or desired state, don't send event + u := &unstructured.Unstructured{} + apiVersion := rr.rs.Version + if rr.rs.Group != "" { + apiVersion = rr.rs.Group + "/" + rr.rs.Version + } + + u.SetAPIVersion(apiVersion) + u.SetKind(rr.rs.Kind) + u.SetName(rr.rs.Name) + u.SetNamespace(rr.rs.Namespace) + + return addCommitDetailsToUnstructured(u, rr) +} + +// when empty minifests reported to codefresh they will get deleted +func makeDesiredAndLiveManifestEmpty( + actualState *application.ApplicationResourceResponse, + desiredState *apiclient.Manifest, +) { + // resource should be deleted + desiredState.CompiledManifest = "" + manifest := "" + actualState.Manifest = &manifest +} + +func addCommitDetailsToUnstructured( + u *unstructured.Unstructured, + rr *ReportedResource, +) ([]byte, error) { + if rr.rsAsAppInfo.revisionsMetadata != nil { + u = utils.AddCommitsDetailsToAnnotations(u, rr.rsAsAppInfo.revisionsMetadata) + if rr.rsAsAppInfo.app != nil { + u = utils.AddCommitDetailsToLabels(u, getApplicationLegacyRevisionDetails(rr.rsAsAppInfo.app, rr.rsAsAppInfo.revisionsMetadata)) + } + } + + object, err := u.MarshalJSON() + if err != nil { + return nil, fmt.Errorf("failed to marshal unstructured object: %w", err) + } + + return object, err +} + func (s *applicationEventReporter) getApplicationEventPayload( ctx context.Context, a *appv1.Application, diff --git a/event_reporter/reporter/event_payload_test.go b/event_reporter/reporter/event_payload_test.go index 210cd16a49f22..b0cf4c9afe916 100644 --- a/event_reporter/reporter/event_payload_test.go +++ b/event_reporter/reporter/event_payload_test.go @@ -58,7 +58,13 @@ func TestGetResourceEventPayload(t *testing.T) { }}, } - event, err := getResourceEventPayload(&rs, &actualState, &desiredState, true, "", nil, nil, &repoApiclient.ApplicationVersions{}, &ReportedEntityParentApp{ + event, err := getResourceEventPayload("", &ReportedResource{ + rs: &rs, + actualState: &actualState, + desiredState: &desiredState, + manifestGenErr: true, + rsAsAppInfo: nil, + }, &ReportedEntityParentApp{ app: &app, appTree: &appTree, revisionsMetadata: &revisionMetadata, @@ -94,7 +100,13 @@ func TestGetResourceEventPayload(t *testing.T) { SyncRevisions: []*utils.RevisionWithMetadata{}, } - event, err := getResourceEventPayload(&rs, &actualState, &desiredState, true, "", nil, nil, &repoApiclient.ApplicationVersions{}, &ReportedEntityParentApp{ + event, err := getResourceEventPayload("", &ReportedResource{ + rs: &rs, + actualState: &actualState, + desiredState: &desiredState, + manifestGenErr: true, + rsAsAppInfo: nil, + }, &ReportedEntityParentApp{ app: &app, appTree: &appTree, revisionsMetadata: &revisionMetadata, @@ -125,7 +137,13 @@ func TestGetResourceEventPayloadWithoutRevision(t *testing.T) { } appTree := v1alpha1.ApplicationTree{} - _, err := getResourceEventPayload(&rs, &actualState, &desiredState, true, "", nil, nil, &repoApiclient.ApplicationVersions{}, &ReportedEntityParentApp{ + _, err := getResourceEventPayload("", &ReportedResource{ + rs: &rs, + actualState: &actualState, + desiredState: &desiredState, + manifestGenErr: true, + rsAsAppInfo: nil, + }, &ReportedEntityParentApp{ app: &app, appTree: &appTree, }, getMockedArgoTrackingMetadata()) diff --git a/event_reporter/reporter/types.go b/event_reporter/reporter/types.go index dec461e53da74..ef85526f60b6e 100644 --- a/event_reporter/reporter/types.go +++ b/event_reporter/reporter/types.go @@ -12,7 +12,7 @@ type ReportedResource struct { rsAsAppInfo *ReportedResourceAsApp // passed if resource is application actualState *application.ApplicationResourceResponse desiredState *apiclient.Manifest - manifestGenErr *bool + manifestGenErr bool } type ReportedResourceAsApp struct { From c5c0f08749f569c9c97fdc8bc245546a7420137e Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 7 Nov 2024 11:14:20 +0200 Subject: [PATCH 07/26] event-reporter(refactoring): fixed nil pointer issues after refactoring --- event_reporter/reporter/event_payload.go | 41 +++++++++++++----------- event_reporter/reporter/types.go | 7 ++-- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index c8fdd71df6bca..e8fcf8f5e6f27 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -32,7 +32,7 @@ func getResourceEventPayload( logCtx *log.Entry ) - if rr.rsAsAppInfo.app != nil { + if rr.rsAsAppInfo != nil && rr.rsAsAppInfo.app != nil { logCtx = log.WithField("application", rr.rsAsAppInfo.app.Name) } else { logCtx = log.NewEntry(log.StandardLogger()) @@ -40,7 +40,7 @@ func getResourceEventPayload( object := []byte(*rr.actualState.Manifest) - if rr.rsAsAppInfo.revisionsMetadata != nil && len(object) != 0 { + if rr.rsAsAppInfo != nil && rr.rsAsAppInfo.revisionsMetadata != nil && len(object) != 0 { actualObject, err := appv1.UnmarshalToUnstructured(*rr.actualState.Manifest) if err != nil { @@ -69,7 +69,7 @@ func getResourceEventPayload( makeDesiredAndLiveManifestEmpty(rr.actualState, rr.desiredState) } - if (rr.rsAsAppInfo.app != nil && rr.rsAsAppInfo.app.DeletionTimestamp != nil) || reportedEntityParentApp.app.ObjectMeta.DeletionTimestamp != nil { + if (rr.rsAsAppInfo != nil && rr.rsAsAppInfo.app != nil && rr.rsAsAppInfo.app.DeletionTimestamp != nil) || reportedEntityParentApp.app.ObjectMeta.DeletionTimestamp != nil { // resource should be deleted in case if application in process of deletion makeDesiredAndLiveManifestEmpty(rr.actualState, rr.desiredState) } @@ -92,9 +92,12 @@ func getResourceEventPayload( syncFinished = &syncStarted } - applicationVersionsEvents, err := utils.RepoAppVersionsToEvent(rr.rsAsAppInfo.applicationVersions) - if err != nil { - logCtx.Errorf("failed to convert appVersions: %v", err) + var applicationVersionsEvents *events.ApplicationVersions + if rr.rsAsAppInfo != nil { + applicationVersionsEvents, err = utils.RepoAppVersionsToEvent(rr.rsAsAppInfo.applicationVersions) + if err != nil { + logCtx.Errorf("failed to convert appVersions: %v", err) + } } source := events.ObjectSource{ @@ -140,7 +143,9 @@ func getResourceEventPayload( AppVersions: applicationVersionsEvents, } - logCtx.Infof("AppVersion before encoding: %v", utils.SafeString(payload.AppVersions.AppVersion)) + if payload.AppVersions != nil { + logCtx.Infof("AppVersion before encoding: %v", utils.SafeString(payload.AppVersions.AppVersion)) + } payloadBytes, err := json.Marshal(&payload) if err != nil { @@ -161,22 +166,20 @@ func getResourceEventPayloadErrors( } // parent application not include errors in application originally was created with broken state, for example in destination missed namespace - if rr.rsAsAppInfo.app != nil && rr.rsAsAppInfo.app.Status.OperationState != nil { - errors = append(errors, parseApplicationSyncResultErrors(rr.rsAsAppInfo.app.Status.OperationState)...) - } + if rr.rsAsAppInfo != nil && rr.rsAsAppInfo.app != nil { + if rr.rsAsAppInfo.app.Status.OperationState != nil { + errors = append(errors, parseApplicationSyncResultErrors(rr.rsAsAppInfo.app.Status.OperationState)...) + } - if rr.rsAsAppInfo.app != nil && rr.rsAsAppInfo.app.Status.Conditions != nil { - errors = append(errors, parseApplicationSyncResultErrorsFromConditions(rr.rsAsAppInfo.app.Status)...) - } + if rr.rsAsAppInfo.app.Status.Conditions != nil { + errors = append(errors, parseApplicationSyncResultErrorsFromConditions(rr.rsAsAppInfo.app.Status)...) + } - if rr.rsAsAppInfo.app != nil { errors = append(errors, parseAggregativeHealthErrorsOfApplication(rr.rsAsAppInfo.app, reportedEntityParentApp.appTree)...) } - if rr.rs.Health != nil { - if rr.rs.Health.Status != health.HealthStatusHealthy { - errors = append(errors, parseAggregativeHealthErrors(rr.rs, reportedEntityParentApp.appTree, false)...) - } + if rr.rs.Health != nil && rr.rs.Health.Status != health.HealthStatusHealthy { + errors = append(errors, parseAggregativeHealthErrors(rr.rs, reportedEntityParentApp.appTree, false)...) } return errors @@ -227,7 +230,7 @@ func addCommitDetailsToUnstructured( u *unstructured.Unstructured, rr *ReportedResource, ) ([]byte, error) { - if rr.rsAsAppInfo.revisionsMetadata != nil { + if rr.rsAsAppInfo != nil && rr.rsAsAppInfo.revisionsMetadata != nil { u = utils.AddCommitsDetailsToAnnotations(u, rr.rsAsAppInfo.revisionsMetadata) if rr.rsAsAppInfo.app != nil { u = utils.AddCommitDetailsToLabels(u, getApplicationLegacyRevisionDetails(rr.rsAsAppInfo.app, rr.rsAsAppInfo.revisionsMetadata)) diff --git a/event_reporter/reporter/types.go b/event_reporter/reporter/types.go index ef85526f60b6e..ff7f1948377d2 100644 --- a/event_reporter/reporter/types.go +++ b/event_reporter/reporter/types.go @@ -22,10 +22,9 @@ type ReportedResourceAsApp struct { } type ReportedEntityParentApp struct { - app *appv1.Application - appTree *appv1.ApplicationTree - validatedDestination *appv1.ApplicationDestination - revisionsMetadata *utils.AppSyncRevisionsMetadata + app *appv1.Application + appTree *appv1.ApplicationTree + revisionsMetadata *utils.AppSyncRevisionsMetadata } type ArgoTrackingMetadata struct { From d27ef80d391649bd544560aeb0f3e45960744b61 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 7 Nov 2024 11:29:14 +0200 Subject: [PATCH 08/26] event-reporter(refactoring): fixed lint issue --- event_reporter/reporter/event_payload.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index e8fcf8f5e6f27..051d267302991 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -159,7 +159,7 @@ func getResourceEventPayloadErrors( rr *ReportedResource, reportedEntityParentApp *ReportedEntityParentApp, ) []*events.ObjectError { - var errors = []*events.ObjectError{} + var errors []*events.ObjectError if reportedEntityParentApp.app.Status.OperationState != nil { errors = append(errors, parseResourceSyncResultErrors(rr.rs, reportedEntityParentApp.app.Status.OperationState)...) From c9651456b21528dee9e49b15e1793344c91ed9b7 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 7 Nov 2024 11:53:58 +0200 Subject: [PATCH 09/26] event-reporter(refactoring): fixed lint issue --- event_reporter/reporter/event_payload.go | 1 - 1 file changed, 1 deletion(-) diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index 051d267302991..4016fb8be8080 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -42,7 +42,6 @@ func getResourceEventPayload( if rr.rsAsAppInfo != nil && rr.rsAsAppInfo.revisionsMetadata != nil && len(object) != 0 { actualObject, err := appv1.UnmarshalToUnstructured(*rr.actualState.Manifest) - if err != nil { return nil, fmt.Errorf("failed to unmarshal manifest: %w", err) } From 194ce2e5c990a60e8905c9716133db28f4746ff0 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 24 Oct 2024 14:02:18 +0300 Subject: [PATCH 10/26] event-reporter: added agroDb to ApplicationEventReporter --- event_reporter/controller/controller.go | 5 +++-- event_reporter/reporter/application_event_reporter.go | 6 +++++- event_reporter/server.go | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/event_reporter/controller/controller.go b/event_reporter/controller/controller.go index 85aba07fb7b7f..597f8220c429b 100644 --- a/event_reporter/controller/controller.go +++ b/event_reporter/controller/controller.go @@ -2,6 +2,7 @@ package controller import ( "context" + "github.com/argoproj/argo-cd/v2/util/db" "math" "strings" "time" @@ -43,7 +44,7 @@ type eventReporterController struct { metricsServer *metrics.MetricsServer } -func NewEventReporterController(appInformer cache.SharedIndexInformer, cache *servercache.Cache, settingsMgr *settings.SettingsManager, applicationServiceClient appclient.ApplicationClient, appLister applisters.ApplicationLister, codefreshConfig *codefresh.CodefreshConfig, metricsServer *metrics.MetricsServer, featureManager *reporter.FeatureManager, rateLimiterOpts *reporter.RateLimiterOpts) EventReporterController { +func NewEventReporterController(appInformer cache.SharedIndexInformer, cache *servercache.Cache, settingsMgr *settings.SettingsManager, applicationServiceClient appclient.ApplicationClient, appLister applisters.ApplicationLister, codefreshConfig *codefresh.CodefreshConfig, metricsServer *metrics.MetricsServer, featureManager *reporter.FeatureManager, rateLimiterOpts *reporter.RateLimiterOpts, db db.ArgoDB) EventReporterController { appBroadcaster := reporter.NewBroadcaster(featureManager, metricsServer, rateLimiterOpts) _, err := appInformer.AddEventHandler(appBroadcaster) if err != nil { @@ -51,7 +52,7 @@ func NewEventReporterController(appInformer cache.SharedIndexInformer, cache *se } return &eventReporterController{ appBroadcaster: appBroadcaster, - applicationEventReporter: reporter.NewApplicationEventReporter(cache, applicationServiceClient, appLister, codefreshConfig, metricsServer), + applicationEventReporter: reporter.NewApplicationEventReporter(cache, applicationServiceClient, appLister, codefreshConfig, metricsServer, db), cache: cache, settingsMgr: settingsMgr, applicationServiceClient: applicationServiceClient, diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index 4b5c72cde7a07..73e1481857965 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -9,6 +9,8 @@ import ( "strings" "time" + "github.com/argoproj/argo-cd/v2/util/db" + "github.com/argoproj/argo-cd/v2/event_reporter/utils" "github.com/argoproj/argo-cd/v2/reposerver/apiclient" @@ -40,6 +42,7 @@ type applicationEventReporter struct { appLister applisters.ApplicationLister applicationServiceClient appclient.ApplicationClient metricsServer *metrics.MetricsServer + db db.ArgoDB } type ApplicationEventReporter interface { @@ -53,13 +56,14 @@ type ApplicationEventReporter interface { ShouldSendApplicationEvent(ae *appv1.ApplicationWatchEvent) (shouldSend bool, syncStatusChanged bool) } -func NewApplicationEventReporter(cache *servercache.Cache, applicationServiceClient appclient.ApplicationClient, appLister applisters.ApplicationLister, codefreshConfig *codefresh.CodefreshConfig, metricsServer *metrics.MetricsServer) ApplicationEventReporter { +func NewApplicationEventReporter(cache *servercache.Cache, applicationServiceClient appclient.ApplicationClient, appLister applisters.ApplicationLister, codefreshConfig *codefresh.CodefreshConfig, metricsServer *metrics.MetricsServer, db db.ArgoDB) ApplicationEventReporter { return &applicationEventReporter{ cache: cache, applicationServiceClient: applicationServiceClient, codefreshClient: codefresh.NewCodefreshClient(codefreshConfig), appLister: appLister, metricsServer: metricsServer, + db: db, } } diff --git a/event_reporter/server.go b/event_reporter/server.go index aaad53fde3ddf..6c23dcf099d44 100644 --- a/event_reporter/server.go +++ b/event_reporter/server.go @@ -153,7 +153,7 @@ func (a *EventReporterServer) Init(ctx context.Context) { } func (a *EventReporterServer) RunController(ctx context.Context) { - controller := event_reporter.NewEventReporterController(a.appInformer, a.Cache, a.settingsMgr, a.ApplicationServiceClient, a.appLister, a.CodefreshConfig, a.serviceSet.MetricsServer, a.featureManager, a.RateLimiterOpts) + controller := event_reporter.NewEventReporterController(a.appInformer, a.Cache, a.settingsMgr, a.ApplicationServiceClient, a.appLister, a.CodefreshConfig, a.serviceSet.MetricsServer, a.featureManager, a.RateLimiterOpts, a.db) go controller.Run(ctx) } From 31c0224a322fe9c7dc7183cad7cf02b4370db059 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 24 Oct 2024 19:08:02 +0300 Subject: [PATCH 11/26] event-reporter: ObjectSource message proto extended to report operationSyncRevisions, destServer, destName, appMultiSourced --- pkg/apiclient/events/events.pb.go | 396 +++++++++++++++++++++++------- server/application/events.proto | 8 +- 2 files changed, 310 insertions(+), 94 deletions(-) diff --git a/pkg/apiclient/events/events.pb.go b/pkg/apiclient/events/events.pb.go index d484348341781..fac639fa5b4c9 100644 --- a/pkg/apiclient/events/events.pb.go +++ b/pkg/apiclient/events/events.pb.go @@ -238,32 +238,36 @@ func (m *EventPayload) GetAppVersions() *ApplicationVersions { // * // Holds information about the object source type ObjectSource struct { - DesiredManifest string `protobuf:"bytes,1,opt,name=desiredManifest" json:"desiredManifest"` - ActualManifest string `protobuf:"bytes,2,opt,name=actualManifest" json:"actualManifest"` - GitManifest string `protobuf:"bytes,3,opt,name=gitManifest" json:"gitManifest"` - RepoURL string `protobuf:"bytes,4,opt,name=repoURL" json:"repoURL"` - Path string `protobuf:"bytes,5,opt,name=path" json:"path"` - Revision string `protobuf:"bytes,6,opt,name=revision" json:"revision"` - CommitMessage string `protobuf:"bytes,7,opt,name=commitMessage" json:"commitMessage"` - CommitAuthor string `protobuf:"bytes,8,opt,name=commitAuthor" json:"commitAuthor"` - CommitDate *v1.Time `protobuf:"bytes,9,opt,name=commitDate" json:"commitDate,omitempty"` - AppName string `protobuf:"bytes,10,opt,name=appName" json:"appName"` - AppLabels map[string]string `protobuf:"bytes,11,rep,name=appLabels" json:"appLabels" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - SyncStatus string `protobuf:"bytes,12,opt,name=syncStatus" json:"syncStatus"` - SyncStartedAt v1.Time `protobuf:"bytes,13,opt,name=syncStartedAt" json:"syncStartedAt"` - SyncFinishedAt *v1.Time `protobuf:"bytes,14,opt,name=syncFinishedAt" json:"syncFinishedAt,omitempty"` - HealthStatus *string `protobuf:"bytes,15,opt,name=healthStatus" json:"healthStatus,omitempty"` - HealthMessage *string `protobuf:"bytes,16,opt,name=healthMessage" json:"healthMessage,omitempty"` - Cluster string `protobuf:"bytes,17,opt,name=cluster" json:"cluster"` - HistoryId int64 `protobuf:"varint,18,opt,name=historyId" json:"historyId"` - OperationSyncRevision string `protobuf:"bytes,19,opt,name=operationSyncRevision" json:"operationSyncRevision"` - AppUID string `protobuf:"bytes,20,opt,name=appUID" json:"appUID"` - AppNamespace string `protobuf:"bytes,21,opt,name=appNamespace" json:"appNamespace"` - AppInstanceLabelKey string `protobuf:"bytes,22,opt,name=appInstanceLabelKey" json:"appInstanceLabelKey"` - TrackingMethod string `protobuf:"bytes,23,opt,name=trackingMethod" json:"trackingMethod"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + DesiredManifest string `protobuf:"bytes,1,opt,name=desiredManifest" json:"desiredManifest"` + ActualManifest string `protobuf:"bytes,2,opt,name=actualManifest" json:"actualManifest"` + GitManifest string `protobuf:"bytes,3,opt,name=gitManifest" json:"gitManifest"` + RepoURL string `protobuf:"bytes,4,opt,name=repoURL" json:"repoURL"` + Path string `protobuf:"bytes,5,opt,name=path" json:"path"` + Revision string `protobuf:"bytes,6,opt,name=revision" json:"revision"` + CommitMessage string `protobuf:"bytes,7,opt,name=commitMessage" json:"commitMessage"` + CommitAuthor string `protobuf:"bytes,8,opt,name=commitAuthor" json:"commitAuthor"` + CommitDate *v1.Time `protobuf:"bytes,9,opt,name=commitDate" json:"commitDate,omitempty"` + AppName string `protobuf:"bytes,10,opt,name=appName" json:"appName"` + AppLabels map[string]string `protobuf:"bytes,11,rep,name=appLabels" json:"appLabels" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + SyncStatus string `protobuf:"bytes,12,opt,name=syncStatus" json:"syncStatus"` + SyncStartedAt v1.Time `protobuf:"bytes,13,opt,name=syncStartedAt" json:"syncStartedAt"` + SyncFinishedAt *v1.Time `protobuf:"bytes,14,opt,name=syncFinishedAt" json:"syncFinishedAt,omitempty"` + HealthStatus *string `protobuf:"bytes,15,opt,name=healthStatus" json:"healthStatus,omitempty"` + HealthMessage *string `protobuf:"bytes,16,opt,name=healthMessage" json:"healthMessage,omitempty"` + Cluster string `protobuf:"bytes,17,opt,name=cluster" json:"cluster"` + HistoryId int64 `protobuf:"varint,18,opt,name=historyId" json:"historyId"` + OperationSyncRevision string `protobuf:"bytes,19,opt,name=operationSyncRevision" json:"operationSyncRevision"` + AppUID string `protobuf:"bytes,20,opt,name=appUID" json:"appUID"` + AppNamespace string `protobuf:"bytes,21,opt,name=appNamespace" json:"appNamespace"` + AppInstanceLabelKey string `protobuf:"bytes,22,opt,name=appInstanceLabelKey" json:"appInstanceLabelKey"` + TrackingMethod string `protobuf:"bytes,23,opt,name=trackingMethod" json:"trackingMethod"` + OperationSyncRevisions []string `protobuf:"bytes,24,rep,name=operationSyncRevisions" json:"operationSyncRevisions,omitempty"` + DestServer string `protobuf:"bytes,25,req,name=destServer" json:"destServer"` + DestName *string `protobuf:"bytes,26,opt,name=destName" json:"destName,omitempty"` + AppMultiSourced bool `protobuf:"varint,27,req,name=appMultiSourced" json:"appMultiSourced"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ObjectSource) Reset() { *m = ObjectSource{} } @@ -460,6 +464,34 @@ func (m *ObjectSource) GetTrackingMethod() string { return "" } +func (m *ObjectSource) GetOperationSyncRevisions() []string { + if m != nil { + return m.OperationSyncRevisions + } + return nil +} + +func (m *ObjectSource) GetDestServer() string { + if m != nil { + return m.DestServer + } + return "" +} + +func (m *ObjectSource) GetDestName() string { + if m != nil && m.DestName != nil { + return *m.DestName + } + return "" +} + +func (m *ObjectSource) GetAppMultiSourced() bool { + if m != nil { + return m.AppMultiSourced + } + return false +} + // * // Holds error information; present only when error sent with application but not resource itself type ObjectError struct { @@ -760,72 +792,76 @@ func init() { func init() { proto.RegisterFile("server/application/events.proto", fileDescriptor_3ad9267ec62b112f) } var fileDescriptor_3ad9267ec62b112f = []byte{ - // 1038 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcd, 0x6e, 0x1b, 0x37, - 0x10, 0xee, 0xca, 0xb2, 0x1d, 0x8d, 0x64, 0x27, 0xa5, 0xed, 0x94, 0x30, 0x5c, 0x47, 0x10, 0x8c, - 0x42, 0x08, 0x92, 0x15, 0xec, 0xfe, 0x20, 0x09, 0x8a, 0x02, 0x0e, 0xec, 0xb6, 0x6e, 0xed, 0xb6, - 0x58, 0x37, 0x39, 0xe4, 0x46, 0xef, 0x8e, 0x57, 0x8c, 0x56, 0x24, 0x4b, 0x52, 0x02, 0x74, 0xef, - 0xd3, 0xf4, 0x49, 0x72, 0xec, 0x13, 0x14, 0x85, 0x2f, 0x7d, 0x87, 0x9e, 0x0a, 0x72, 0x57, 0x32, - 0xd7, 0xd5, 0xa1, 0xe9, 0x8d, 0xfc, 0xe6, 0x9b, 0x21, 0xe7, 0x97, 0x84, 0x47, 0x06, 0xf5, 0x14, - 0xf5, 0x80, 0x29, 0x55, 0xf0, 0x94, 0x59, 0x2e, 0xc5, 0x00, 0xa7, 0x28, 0xac, 0x89, 0x95, 0x96, - 0x56, 0x92, 0xf5, 0x1c, 0x05, 0x6a, 0x9e, 0xee, 0x9e, 0xe7, 0xdc, 0x0e, 0x27, 0x57, 0x71, 0x2a, - 0xc7, 0x03, 0xa6, 0x73, 0xa9, 0xb4, 0x7c, 0xeb, 0x17, 0x4f, 0xd3, 0x6c, 0x30, 0x3d, 0x1a, 0xa8, - 0x51, 0x3e, 0x60, 0x8a, 0x9b, 0x9a, 0xa9, 0xe9, 0x21, 0x2b, 0xd4, 0x90, 0x1d, 0x0e, 0xbc, 0x15, - 0x66, 0x31, 0x2b, 0xcd, 0xee, 0x7e, 0x36, 0x7a, 0x66, 0x62, 0x2e, 0x9d, 0xc6, 0x98, 0xa5, 0x43, - 0x2e, 0x50, 0xcf, 0x6e, 0x4d, 0x8c, 0xd1, 0xb2, 0xc1, 0xf4, 0xdf, 0x5a, 0xdb, 0xb9, 0xf4, 0x07, - 0x5b, 0x39, 0x70, 0xab, 0x0a, 0xdd, 0xcb, 0xa5, 0xcc, 0x0b, 0x74, 0xaa, 0x03, 0x26, 0x84, 0xb4, - 0xfe, 0xec, 0xca, 0x81, 0xde, 0x73, 0x68, 0x9f, 0x3a, 0x87, 0x2e, 0xe5, 0x44, 0xa7, 0x48, 0x08, - 0x34, 0x05, 0x1b, 0x23, 0x8d, 0xba, 0x8d, 0x7e, 0x2b, 0xf1, 0x6b, 0xf2, 0x10, 0xd6, 0x52, 0x29, - 0xae, 0x79, 0x4e, 0x1b, 0xdd, 0xa8, 0xdf, 0x49, 0xaa, 0x5d, 0xef, 0x73, 0x58, 0xf5, 0xaa, 0x4b, - 0x95, 0x28, 0xac, 0x2b, 0x36, 0x2b, 0x24, 0xcb, 0x68, 0xa3, 0xdb, 0xe8, 0x77, 0x92, 0xf9, 0xb6, - 0xf7, 0x57, 0x04, 0x1d, 0xaf, 0xf7, 0x53, 0x09, 0x90, 0x1e, 0xb4, 0x2c, 0x1f, 0xa3, 0xb1, 0x6c, - 0xac, 0x4a, 0x1b, 0x2f, 0x9b, 0xef, 0xfe, 0x78, 0xf4, 0x41, 0x72, 0x0b, 0xbb, 0x3b, 0xc8, 0xab, - 0xb7, 0x98, 0xda, 0xca, 0x5a, 0xb5, 0x23, 0x4f, 0x61, 0xcd, 0xf8, 0x9b, 0xd3, 0x95, 0x6e, 0xa3, - 0xdf, 0x3e, 0xda, 0x89, 0xab, 0x84, 0xc4, 0x3f, 0x7a, 0x42, 0xe9, 0x56, 0x52, 0x91, 0xc8, 0x13, - 0x58, 0x43, 0xad, 0xa5, 0x36, 0xb4, 0xd9, 0x5d, 0xe9, 0xb7, 0x8f, 0xb6, 0xef, 0xd0, 0x4f, 0x9d, - 0x30, 0xa9, 0x38, 0xe4, 0x2b, 0x68, 0x33, 0xa5, 0x5e, 0xa3, 0x36, 0x2e, 0x60, 0x74, 0xb5, 0x1b, - 0xf5, 0xdb, 0x47, 0x7b, 0x0b, 0x95, 0xe3, 0xdb, 0x4c, 0xce, 0x39, 0x49, 0xa8, 0xd0, 0xfb, 0xb5, - 0x05, 0x9d, 0xf0, 0x1a, 0x24, 0x86, 0xfb, 0x19, 0x1a, 0xae, 0x31, 0xbb, 0x60, 0x82, 0x5f, 0xa3, - 0xb1, 0x34, 0xea, 0x46, 0x0b, 0x7f, 0xef, 0x0a, 0xc9, 0x13, 0xd8, 0x64, 0xa9, 0x9d, 0xb0, 0x62, - 0x41, 0x6f, 0x04, 0xf4, 0x3b, 0x32, 0xf2, 0x09, 0xb4, 0x73, 0x6e, 0x17, 0xd4, 0x95, 0x80, 0x1a, - 0x0a, 0xc8, 0x3e, 0xac, 0x6b, 0x54, 0xf2, 0x55, 0x72, 0x4e, 0x9b, 0x01, 0x67, 0x0e, 0x12, 0x0a, - 0x4d, 0xc5, 0xec, 0xd0, 0xfb, 0x3b, 0x17, 0x7a, 0x84, 0x74, 0xe1, 0x9e, 0xc6, 0x29, 0x77, 0xde, - 0xd1, 0xb5, 0x40, 0xba, 0x40, 0xc9, 0x63, 0xd8, 0x48, 0xe5, 0x78, 0xcc, 0xed, 0x05, 0x1a, 0xc3, - 0x72, 0xa4, 0xeb, 0x01, 0xad, 0x2e, 0x22, 0x7d, 0xe8, 0x94, 0xc0, 0xf1, 0xc4, 0x0e, 0xa5, 0xa6, - 0xf7, 0x02, 0x6a, 0x4d, 0x42, 0xbe, 0x03, 0x28, 0xf7, 0x27, 0xcc, 0x22, 0x6d, 0xf9, 0x3c, 0x3c, - 0x8e, 0xcb, 0x1e, 0x89, 0xc3, 0x1e, 0x89, 0xd5, 0x28, 0x77, 0x80, 0x89, 0x5d, 0x8f, 0xc4, 0xd3, - 0xc3, 0xf8, 0x67, 0x3e, 0xc6, 0x24, 0xd0, 0x76, 0xde, 0x33, 0xa5, 0x7e, 0x70, 0xf5, 0x0a, 0xa1, - 0xf7, 0x15, 0x48, 0xbe, 0x85, 0x16, 0x53, 0xea, 0x9c, 0x5d, 0x61, 0x61, 0x68, 0xdb, 0x57, 0xc9, - 0xc1, 0xd2, 0xa2, 0x72, 0xf9, 0x2f, 0x69, 0xa7, 0xc2, 0xea, 0xd9, 0xbc, 0x66, 0x17, 0xca, 0xe4, - 0x00, 0xc0, 0xcc, 0x44, 0x7a, 0x69, 0x99, 0x9d, 0x18, 0xda, 0x09, 0x0e, 0x0b, 0x70, 0xf2, 0x1a, - 0x36, 0xaa, 0x9d, 0xb6, 0x98, 0x1d, 0x5b, 0xba, 0xf1, 0xbe, 0xee, 0xcd, 0xa3, 0x5b, 0x33, 0x43, - 0x12, 0xd8, 0x74, 0xc0, 0xd7, 0x5c, 0x70, 0x33, 0xf4, 0x86, 0x37, 0xdf, 0x3b, 0x6e, 0x77, 0x2c, - 0x90, 0x1e, 0x74, 0x86, 0xc8, 0x0a, 0x3b, 0xac, 0x7c, 0xba, 0xef, 0x7c, 0x4a, 0x6a, 0x18, 0x39, - 0x80, 0x8d, 0x72, 0x3f, 0xaf, 0x80, 0x07, 0x9e, 0x54, 0x07, 0x5d, 0x16, 0xd2, 0x62, 0x62, 0x2c, - 0x6a, 0xfa, 0x61, 0x98, 0x85, 0x0a, 0x74, 0x33, 0x61, 0xc8, 0x8d, 0x95, 0x7a, 0x76, 0x96, 0x51, - 0xd2, 0x8d, 0xfa, 0x2b, 0xf3, 0xf8, 0x2e, 0x60, 0xf2, 0x02, 0x76, 0xa4, 0x72, 0x03, 0x90, 0x4b, - 0x71, 0x39, 0x13, 0x69, 0x32, 0x2f, 0xcd, 0xad, 0xc0, 0xe2, 0x72, 0x0a, 0xd9, 0x83, 0x35, 0xa6, - 0xd4, 0xab, 0xb3, 0x13, 0xba, 0x1d, 0x90, 0x2b, 0xcc, 0x55, 0x66, 0x55, 0x0e, 0x46, 0xb1, 0x14, - 0xe9, 0x4e, 0x58, 0x99, 0xa1, 0x84, 0x7c, 0x01, 0x5b, 0x4c, 0xa9, 0x33, 0x61, 0x2c, 0x13, 0x29, - 0xfa, 0xc4, 0x7f, 0x8f, 0x33, 0xfa, 0x30, 0x50, 0x58, 0x46, 0x70, 0x9d, 0x6d, 0x35, 0x4b, 0x47, - 0x5c, 0xe4, 0x17, 0x68, 0x87, 0x32, 0xa3, 0x1f, 0x85, 0x9d, 0x5d, 0x97, 0xed, 0x7e, 0x09, 0x9b, - 0xf5, 0x62, 0x23, 0x0f, 0x60, 0x65, 0x84, 0xb3, 0x72, 0x7a, 0x24, 0x6e, 0x49, 0xb6, 0x61, 0x75, - 0xca, 0x8a, 0x09, 0x96, 0x23, 0x22, 0x29, 0x37, 0x2f, 0x1a, 0xcf, 0xa2, 0xde, 0xdf, 0x11, 0xb4, - 0x83, 0xf1, 0xe6, 0xfa, 0xdb, 0xce, 0x14, 0xd6, 0x46, 0x8f, 0x47, 0xc8, 0x2e, 0xac, 0x16, 0x38, - 0xc5, 0xa2, 0x36, 0x66, 0x4a, 0xc8, 0x65, 0x6c, 0x5c, 0x65, 0x34, 0x9c, 0x2c, 0x73, 0x90, 0x9c, - 0xc3, 0xbd, 0x82, 0x19, 0x7b, 0x89, 0x28, 0xfc, 0x58, 0xf9, 0x3f, 0x25, 0xbc, 0xb0, 0x40, 0xbe, - 0x81, 0xfb, 0xe5, 0xc8, 0x4e, 0xf0, 0x1a, 0x35, 0x8a, 0x14, 0xab, 0xf1, 0xfb, 0xf1, 0xa2, 0x17, - 0xbd, 0x33, 0x97, 0x75, 0x52, 0x72, 0x57, 0xab, 0xf7, 0x5b, 0x04, 0xdb, 0xcb, 0x98, 0xce, 0xd7, - 0x5c, 0xcb, 0x89, 0xaa, 0x85, 0xa1, 0x84, 0x9c, 0xaf, 0xd3, 0x72, 0x88, 0xd7, 0x22, 0x31, 0x07, - 0x5d, 0x04, 0x47, 0x5c, 0x64, 0xfe, 0xcd, 0x59, 0x44, 0xd0, 0x21, 0x4e, 0xe2, 0x9f, 0xc2, 0x66, - 0x28, 0xf1, 0x0f, 0x62, 0x0f, 0x5a, 0x62, 0x51, 0x50, 0xe1, 0x68, 0xbd, 0x85, 0x7b, 0x6f, 0xa0, - 0x73, 0x82, 0x0a, 0x45, 0x86, 0x22, 0xe5, 0x68, 0xdc, 0xc3, 0x5a, 0xc8, 0x74, 0x54, 0xa5, 0xd9, - 0xaf, 0x1d, 0x96, 0xa1, 0x32, 0x55, 0x9a, 0xfd, 0xda, 0xf5, 0xa5, 0xc6, 0x5f, 0x26, 0x5c, 0xe3, - 0xd8, 0xfd, 0x4d, 0xca, 0x04, 0x25, 0x35, 0xac, 0xa7, 0x60, 0x6b, 0xc9, 0x83, 0x45, 0xf6, 0x01, - 0x6e, 0x9f, 0xac, 0xea, 0xa0, 0x00, 0x21, 0xcf, 0xa1, 0x93, 0x05, 0x57, 0xf2, 0xc7, 0x86, 0xcf, - 0x6c, 0x78, 0xdf, 0xa4, 0x46, 0x7d, 0x79, 0xfc, 0xee, 0x66, 0x3f, 0xfa, 0xfd, 0x66, 0x3f, 0xfa, - 0xf3, 0x66, 0x3f, 0x7a, 0xf3, 0xe9, 0x7f, 0xfb, 0x20, 0xa5, 0x05, 0x47, 0x61, 0xab, 0x4f, 0xd6, - 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd4, 0x18, 0x11, 0xf8, 0x80, 0x09, 0x00, 0x00, + // 1098 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x8f, 0x1b, 0x35, + 0x10, 0x67, 0x73, 0xff, 0x27, 0xb9, 0x6b, 0x71, 0xaf, 0xc5, 0x84, 0x72, 0x8d, 0xa2, 0x0a, 0x45, + 0x55, 0xbb, 0x51, 0x0f, 0xa8, 0xda, 0x0a, 0x21, 0x5d, 0xd5, 0x02, 0x85, 0x3b, 0x40, 0x7b, 0xb4, + 0x0f, 0x7d, 0x73, 0x77, 0xa7, 0x1b, 0x37, 0x1b, 0xdb, 0xd8, 0x4e, 0xa4, 0x7c, 0x25, 0x1e, 0xf8, + 0x1c, 0x7d, 0xe4, 0x13, 0x20, 0xd4, 0x17, 0xbe, 0x03, 0x4f, 0xc8, 0xde, 0x3f, 0xe7, 0x0d, 0x41, + 0xa2, 0xbc, 0x79, 0x7e, 0xf3, 0x9b, 0xb1, 0xc7, 0x33, 0x9e, 0x31, 0xdc, 0x30, 0xa8, 0x17, 0xa8, + 0xc7, 0x4c, 0xa9, 0x82, 0xa7, 0xcc, 0x72, 0x29, 0xc6, 0xb8, 0x40, 0x61, 0x4d, 0xac, 0xb4, 0xb4, + 0x92, 0xec, 0xe4, 0x28, 0x50, 0xf3, 0xb4, 0x7f, 0x9a, 0x73, 0x3b, 0x99, 0xbf, 0x8c, 0x53, 0x39, + 0x1b, 0x33, 0x9d, 0x4b, 0xa5, 0xe5, 0x6b, 0xbf, 0xb8, 0x93, 0x66, 0xe3, 0xc5, 0xf1, 0x58, 0x4d, + 0xf3, 0x31, 0x53, 0xdc, 0xb4, 0x5c, 0x2d, 0xee, 0xb2, 0x42, 0x4d, 0xd8, 0xdd, 0xb1, 0xf7, 0xc2, + 0x2c, 0x66, 0xa5, 0xdb, 0xfe, 0x67, 0xd3, 0xfb, 0x26, 0xe6, 0xd2, 0x59, 0xcc, 0x58, 0x3a, 0xe1, + 0x02, 0xf5, 0xf2, 0xc2, 0xc5, 0x0c, 0x2d, 0x1b, 0x2f, 0xfe, 0x69, 0x75, 0x98, 0x4b, 0xbf, 0xb1, + 0x95, 0x63, 0xb7, 0xaa, 0xd0, 0xeb, 0xb9, 0x94, 0x79, 0x81, 0xce, 0x74, 0xcc, 0x84, 0x90, 0xd6, + 0xef, 0x5d, 0x05, 0x30, 0x7c, 0x00, 0xdd, 0x27, 0x2e, 0xa0, 0x73, 0x39, 0xd7, 0x29, 0x12, 0x02, + 0x9b, 0x82, 0xcd, 0x90, 0x46, 0x83, 0xce, 0x68, 0x2f, 0xf1, 0x6b, 0x72, 0x0d, 0xb6, 0x53, 0x29, + 0x5e, 0xf1, 0x9c, 0x76, 0x06, 0xd1, 0xa8, 0x97, 0x54, 0xd2, 0xf0, 0x73, 0xd8, 0xf2, 0xa6, 0x6b, + 0x8d, 0x28, 0xec, 0x28, 0xb6, 0x2c, 0x24, 0xcb, 0x68, 0x67, 0xd0, 0x19, 0xf5, 0x92, 0x5a, 0x1c, + 0xfe, 0x19, 0x41, 0xcf, 0xdb, 0xfd, 0x58, 0x02, 0x64, 0x08, 0x7b, 0x96, 0xcf, 0xd0, 0x58, 0x36, + 0x53, 0xa5, 0x8f, 0x47, 0x9b, 0x6f, 0x7e, 0xbf, 0xf1, 0x5e, 0x72, 0x01, 0xbb, 0x33, 0xc8, 0x97, + 0xaf, 0x31, 0xb5, 0x95, 0xb7, 0x4a, 0x22, 0x77, 0x60, 0xdb, 0xf8, 0x93, 0xd3, 0x8d, 0x41, 0x67, + 0xd4, 0x3d, 0xbe, 0x1a, 0x57, 0x09, 0x89, 0x7f, 0xf0, 0x84, 0x32, 0xac, 0xa4, 0x22, 0x91, 0xdb, + 0xb0, 0x8d, 0x5a, 0x4b, 0x6d, 0xe8, 0xe6, 0x60, 0x63, 0xd4, 0x3d, 0x3e, 0x5c, 0xa1, 0x3f, 0x71, + 0xca, 0xa4, 0xe2, 0x90, 0x2f, 0xa1, 0xcb, 0x94, 0x7a, 0x8e, 0xda, 0xb8, 0x0b, 0xa3, 0x5b, 0x83, + 0x68, 0xd4, 0x3d, 0xbe, 0xde, 0x98, 0x9c, 0x5c, 0x64, 0xb2, 0xe6, 0x24, 0xa1, 0xc1, 0xf0, 0x57, + 0x80, 0x5e, 0x78, 0x0c, 0x12, 0xc3, 0xa5, 0x0c, 0x0d, 0xd7, 0x98, 0x9d, 0x31, 0xc1, 0x5f, 0xa1, + 0xb1, 0x34, 0x1a, 0x44, 0x4d, 0xbc, 0xab, 0x4a, 0x72, 0x1b, 0x0e, 0x58, 0x6a, 0xe7, 0xac, 0x68, + 0xe8, 0x9d, 0x80, 0xbe, 0xa2, 0x23, 0x9f, 0x40, 0x37, 0xe7, 0xb6, 0xa1, 0x6e, 0x04, 0xd4, 0x50, + 0x41, 0x8e, 0x60, 0x47, 0xa3, 0x92, 0xcf, 0x92, 0x53, 0xba, 0x19, 0x70, 0x6a, 0x90, 0x50, 0xd8, + 0x54, 0xcc, 0x4e, 0x7c, 0xbc, 0xb5, 0xd2, 0x23, 0x64, 0x00, 0xbb, 0x1a, 0x17, 0xdc, 0x45, 0x47, + 0xb7, 0x03, 0x6d, 0x83, 0x92, 0x5b, 0xb0, 0x9f, 0xca, 0xd9, 0x8c, 0xdb, 0x33, 0x34, 0x86, 0xe5, + 0x48, 0x77, 0x02, 0x5a, 0x5b, 0x45, 0x46, 0xd0, 0x2b, 0x81, 0x93, 0xb9, 0x9d, 0x48, 0x4d, 0x77, + 0x03, 0x6a, 0x4b, 0x43, 0xbe, 0x05, 0x28, 0xe5, 0xc7, 0xcc, 0x22, 0xdd, 0xf3, 0x79, 0xb8, 0x15, + 0x97, 0x6f, 0x24, 0x0e, 0xdf, 0x48, 0xac, 0xa6, 0xb9, 0x03, 0x4c, 0xec, 0xde, 0x48, 0xbc, 0xb8, + 0x1b, 0xff, 0xc4, 0x67, 0x98, 0x04, 0xd6, 0x2e, 0x7a, 0xa6, 0xd4, 0xf7, 0xae, 0x5e, 0x21, 0x8c, + 0xbe, 0x02, 0xc9, 0x37, 0xb0, 0xc7, 0x94, 0x3a, 0x65, 0x2f, 0xb1, 0x30, 0xb4, 0xeb, 0xab, 0xe4, + 0xe6, 0xda, 0xa2, 0x72, 0xf9, 0x2f, 0x69, 0x4f, 0x84, 0xd5, 0xcb, 0xba, 0x66, 0x1b, 0x63, 0x72, + 0x13, 0xc0, 0x2c, 0x45, 0x7a, 0x6e, 0x99, 0x9d, 0x1b, 0xda, 0x0b, 0x36, 0x0b, 0x70, 0xf2, 0x1c, + 0xf6, 0x2b, 0x49, 0x5b, 0xcc, 0x4e, 0x2c, 0xdd, 0x7f, 0xd7, 0xf0, 0xea, 0xdb, 0x6d, 0xb9, 0x21, + 0x09, 0x1c, 0x38, 0xe0, 0x2b, 0x2e, 0xb8, 0x99, 0x78, 0xc7, 0x07, 0xef, 0x7c, 0x6f, 0x2b, 0x1e, + 0xc8, 0x10, 0x7a, 0x13, 0x64, 0x85, 0x9d, 0x54, 0x31, 0x5d, 0x72, 0x31, 0x25, 0x2d, 0x8c, 0xdc, + 0x84, 0xfd, 0x52, 0xae, 0x2b, 0xe0, 0xb2, 0x27, 0xb5, 0x41, 0x97, 0x85, 0xb4, 0x98, 0x1b, 0x8b, + 0x9a, 0xbe, 0x1f, 0x66, 0xa1, 0x02, 0x5d, 0x4f, 0x98, 0x70, 0x63, 0xa5, 0x5e, 0x3e, 0xcd, 0x28, + 0x19, 0x44, 0xa3, 0x8d, 0xfa, 0x7e, 0x1b, 0x98, 0x3c, 0x84, 0xab, 0x52, 0xb9, 0x06, 0xc8, 0xa5, + 0x38, 0x5f, 0x8a, 0x34, 0xa9, 0x4b, 0xf3, 0x4a, 0xe0, 0x71, 0x3d, 0x85, 0x5c, 0x87, 0x6d, 0xa6, + 0xd4, 0xb3, 0xa7, 0x8f, 0xe9, 0x61, 0x40, 0xae, 0x30, 0x57, 0x99, 0x55, 0x39, 0x18, 0xc5, 0x52, + 0xa4, 0x57, 0xc3, 0xca, 0x0c, 0x35, 0xe4, 0x1e, 0x5c, 0x61, 0x4a, 0x3d, 0x15, 0xc6, 0x32, 0x91, + 0xa2, 0x4f, 0xfc, 0x77, 0xb8, 0xa4, 0xd7, 0x02, 0x83, 0x75, 0x04, 0xf7, 0xb2, 0xad, 0x66, 0xe9, + 0x94, 0x8b, 0xfc, 0x0c, 0xed, 0x44, 0x66, 0xf4, 0x83, 0xf0, 0x65, 0xb7, 0x75, 0xe4, 0x1e, 0x5c, + 0x5b, 0x1b, 0x86, 0xa1, 0x74, 0xb0, 0x31, 0xda, 0x4b, 0xfe, 0x45, 0xeb, 0x2a, 0x30, 0x43, 0x63, + 0xcf, 0xfd, 0x10, 0xa3, 0x1f, 0x06, 0xad, 0x35, 0xc0, 0x49, 0x1f, 0x76, 0x9d, 0xe4, 0x9f, 0x44, + 0xdf, 0x27, 0xab, 0x91, 0x5d, 0xc7, 0x62, 0x4a, 0x9d, 0xcd, 0x0b, 0xcb, 0xcb, 0xaa, 0xcf, 0xe8, + 0x47, 0x83, 0xce, 0x68, 0xb7, 0xee, 0x58, 0x2b, 0xca, 0xfe, 0x17, 0x70, 0xd0, 0x7e, 0x16, 0xe4, + 0x32, 0x6c, 0x4c, 0x71, 0x59, 0xf6, 0xb9, 0xc4, 0x2d, 0xc9, 0x21, 0x6c, 0x2d, 0x58, 0x31, 0xc7, + 0xb2, 0x99, 0x25, 0xa5, 0xf0, 0xb0, 0x73, 0x3f, 0x1a, 0xfe, 0x15, 0x41, 0x37, 0x68, 0xc4, 0xae, + 0x13, 0xd9, 0xa5, 0xc2, 0x56, 0x93, 0xf4, 0x08, 0xe9, 0xc3, 0x56, 0x81, 0x0b, 0x2c, 0x5a, 0x0d, + 0xb1, 0x84, 0x5c, 0x6d, 0xcd, 0xaa, 0xda, 0x0b, 0x7b, 0x60, 0x0d, 0x92, 0x53, 0xd8, 0x2d, 0x98, + 0x8b, 0x1e, 0x85, 0x6f, 0x80, 0xff, 0xe7, 0xb1, 0x35, 0x1e, 0xc8, 0xd7, 0x70, 0xa9, 0x1c, 0x2e, + 0x09, 0xbe, 0x42, 0x8d, 0x22, 0xc5, 0x6a, 0x50, 0x7c, 0xdc, 0x74, 0x0d, 0x1f, 0xcc, 0x79, 0x9b, + 0x94, 0xac, 0x5a, 0x0d, 0x7f, 0x89, 0xe0, 0x70, 0x1d, 0xd3, 0xc5, 0x9a, 0x6b, 0x39, 0x57, 0xad, + 0x6b, 0x28, 0x21, 0x17, 0xeb, 0xa2, 0x1c, 0x37, 0xad, 0x9b, 0xa8, 0x41, 0x77, 0x83, 0x53, 0x2e, + 0x32, 0x3f, 0x1d, 0x9b, 0x1b, 0x74, 0x88, 0xd3, 0xf8, 0xa1, 0xbd, 0x19, 0x6a, 0xfc, 0xe8, 0x1e, + 0xc2, 0x9e, 0x68, 0x4a, 0x3f, 0x1c, 0x02, 0x17, 0xf0, 0xf0, 0x05, 0xf4, 0x1e, 0xa3, 0x42, 0x91, + 0xa1, 0x48, 0x39, 0x1a, 0xf7, 0x05, 0x28, 0x64, 0x3a, 0xad, 0xd2, 0xec, 0xd7, 0x0e, 0xcb, 0x50, + 0x99, 0x2a, 0xcd, 0x7e, 0xed, 0x3a, 0x88, 0xc6, 0x9f, 0xe7, 0x5c, 0xe3, 0xcc, 0xfd, 0xa2, 0xca, + 0x04, 0x25, 0x2d, 0x6c, 0xa8, 0xe0, 0xca, 0x9a, 0xd1, 0x4a, 0x8e, 0x00, 0x2e, 0x86, 0x6b, 0xb5, + 0x51, 0x80, 0x90, 0x07, 0xd0, 0xcb, 0x82, 0x23, 0xf9, 0x6d, 0xc3, 0x0f, 0x41, 0x78, 0xde, 0xa4, + 0x45, 0x7d, 0x74, 0xf2, 0xe6, 0xed, 0x51, 0xf4, 0xdb, 0xdb, 0xa3, 0xe8, 0x8f, 0xb7, 0x47, 0xd1, + 0x8b, 0x4f, 0xff, 0xdb, 0x57, 0x2e, 0x2d, 0x38, 0x0a, 0x5b, 0x7d, 0x07, 0xff, 0x0e, 0x00, 0x00, + 0xff, 0xff, 0x18, 0xfd, 0x2a, 0xbe, 0x2a, 0x0a, 0x00, 0x00, } func (m *EventSource) Marshal() (dAtA []byte, err error) { @@ -1021,6 +1057,43 @@ func (m *ObjectSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + i-- + if m.AppMultiSourced { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xd8 + if m.DestName != nil { + i -= len(*m.DestName) + copy(dAtA[i:], *m.DestName) + i = encodeVarintEvents(dAtA, i, uint64(len(*m.DestName))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xd2 + } + i -= len(m.DestServer) + copy(dAtA[i:], m.DestServer) + i = encodeVarintEvents(dAtA, i, uint64(len(m.DestServer))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + if len(m.OperationSyncRevisions) > 0 { + for iNdEx := len(m.OperationSyncRevisions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.OperationSyncRevisions[iNdEx]) + copy(dAtA[i:], m.OperationSyncRevisions[iNdEx]) + i = encodeVarintEvents(dAtA, i, uint64(len(m.OperationSyncRevisions[iNdEx]))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xc2 + } + } i -= len(m.TrackingMethod) copy(dAtA[i:], m.TrackingMethod) i = encodeVarintEvents(dAtA, i, uint64(len(m.TrackingMethod))) @@ -1548,6 +1621,19 @@ func (m *ObjectSource) Size() (n int) { n += 2 + l + sovEvents(uint64(l)) l = len(m.TrackingMethod) n += 2 + l + sovEvents(uint64(l)) + if len(m.OperationSyncRevisions) > 0 { + for _, s := range m.OperationSyncRevisions { + l = len(s) + n += 2 + l + sovEvents(uint64(l)) + } + } + l = len(m.DestServer) + n += 2 + l + sovEvents(uint64(l)) + if m.DestName != nil { + l = len(*m.DestName) + n += 2 + l + sovEvents(uint64(l)) + } + n += 3 if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2137,6 +2223,7 @@ func (m *EventPayload) Unmarshal(dAtA []byte) error { return nil } func (m *ObjectSource) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2994,6 +3081,125 @@ func (m *ObjectSource) Unmarshal(dAtA []byte) error { } m.TrackingMethod = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OperationSyncRevisions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OperationSyncRevisions = append(m.OperationSyncRevisions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestServer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DestServer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 26: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.DestName = &s + iNdEx = postIndex + case 27: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AppMultiSourced", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AppMultiSourced = bool(v != 0) + hasFields[0] |= uint64(0x00000002) default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -3010,6 +3216,12 @@ func (m *ObjectSource) Unmarshal(dAtA []byte) error { iNdEx += skippy } } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("destServer") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("appMultiSourced") + } if iNdEx > l { return io.ErrUnexpectedEOF diff --git a/server/application/events.proto b/server/application/events.proto index f70d522e17a78..70095fbadf685 100644 --- a/server/application/events.proto +++ b/server/application/events.proto @@ -66,13 +66,17 @@ message ObjectSource { optional k8s.io.apimachinery.pkg.apis.meta.v1.Time syncFinishedAt = 14; optional string healthStatus = 15; optional string healthMessage = 16; - optional string cluster = 17 [(gogoproto.nullable) = false]; - optional int64 historyId = 18 [(gogoproto.nullable) = false]; + optional string cluster = 17 [(gogoproto.nullable) = false]; // legacy, returns only server, empty if destinatin.name used + optional int64 historyId = 18 [(gogoproto.nullable) = false]; // legacy optional string operationSyncRevision = 19 [(gogoproto.nullable) = false]; optional string appUID = 20 [(gogoproto.nullable) = false]; optional string appNamespace = 21 [(gogoproto.nullable) = false]; optional string appInstanceLabelKey = 22 [(gogoproto.nullable) = false]; optional string trackingMethod = 23 [(gogoproto.nullable) = false]; + repeated string operationSyncRevisions = 24; + required string destServer = 25 [(gogoproto.nullable) = false]; + optional string destName = 26; + required bool appMultiSourced = 27 [(gogoproto.nullable) = false]; } /** From 3408db6841ae25e6c783ec643a8c6061f56f8bba Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 24 Oct 2024 19:10:20 +0300 Subject: [PATCH 12/26] event-reporter / utils: added func GetOperationRevisions --- event_reporter/utils/app_revision.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/event_reporter/utils/app_revision.go b/event_reporter/utils/app_revision.go index f4bb1bcb232ae..1af805b7e25bc 100644 --- a/event_reporter/utils/app_revision.go +++ b/event_reporter/utils/app_revision.go @@ -65,6 +65,22 @@ func GetOperationRevision(a *appv1.Application) string { return revision } +func GetOperationRevisions(a *appv1.Application) []string { + if a == nil { + return nil + } + + // this value will be used in case if application hasn't resources , like gitsource + revisions := a.Status.Sync.Revisions + if a.Status.OperationState != nil && a.Status.OperationState.Operation.Sync != nil && a.Status.OperationState.Operation.Sync.Revisions != nil && len(a.Status.OperationState.Operation.Sync.Revisions) > 0 { + revisions = a.Status.OperationState.Operation.Sync.Revisions + } else if a.Operation != nil && a.Operation.Sync != nil && a.Operation.Sync.Revisions != nil && len(a.Operation.Sync.Revisions) > 0 { + revisions = a.Operation.Sync.Revisions + } + + return revisions +} + func GetOperationStateRevision(a *appv1.Application) *string { if a == nil || a.Status.OperationState == nil || a.Status.OperationState.SyncResult == nil { return nil From 673460c5d3fe7903f3feabf262d9c42e2c092eb0 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 7 Nov 2024 16:49:54 +0200 Subject: [PATCH 13/26] event-reporter(non-grpc app client): added support of new query params SourcePositions, Revisions for GetManifests request --- event_reporter/application/client.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/event_reporter/application/client.go b/event_reporter/application/client.go index 3c4fd356c092c..e87131cd9f9c6 100644 --- a/event_reporter/application/client.go +++ b/event_reporter/application/client.go @@ -126,6 +126,16 @@ func (c *httpApplicationClient) GetManifests(ctx context.Context, in *appclient. if in.Revision != nil { params = fmt.Sprintf("%s&revision=%s", params, *in.Revision) } + if in.SourcePositions != nil && len(in.SourcePositions) > 0 { + for _, sourcePosition := range in.SourcePositions { + params = fmt.Sprintf("%s&sourcePositions=%s", params, sourcePosition) + } + } + if in.Revisions != nil && len(in.Revisions) > 0 { + for _, revision := range in.Revisions { + params = fmt.Sprintf("%s&revisions=%s", params, revision) + } + } url := fmt.Sprintf("%s/api/v1/applications/%s/manifests%s", c.baseUrl, *in.Name, params) manifest := &repoapiclient.ManifestResponse{} From a8ff5c09e7c1472f08d07e17751e4a0d2bf9bf67 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 7 Nov 2024 16:50:58 +0200 Subject: [PATCH 14/26] event-reporter(getDesiredManifests): updated logic to retrieve appVersion for multi-sourced applications based on sync result revisions --- .../reporter/application_event_reporter.go | 51 +++++++++++++++---- event_reporter/utils/app_revision.go | 10 +++- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index 73e1481857965..6d62a5f351805 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -91,15 +91,28 @@ func (s *applicationEventReporter) shouldSendResourceEvent(a *appv1.Application, return true } -func (r *applicationEventReporter) getDesiredManifests(ctx context.Context, a *appv1.Application, revision *string, logCtx *log.Entry) (*apiclient.ManifestResponse, bool) { +func (r *applicationEventReporter) getDesiredManifests( + ctx context.Context, + logCtx *log.Entry, + a *appv1.Application, + revision *string, + sourcePositions *[]int64, + revisions *[]string, +) (*apiclient.ManifestResponse, bool) { // get the desired state manifests of the application project := a.Spec.GetProject() - desiredManifests, err := r.applicationServiceClient.GetManifests(ctx, &application.ApplicationManifestQuery{ + query := application.ApplicationManifestQuery{ Name: &a.Name, AppNamespace: &a.Namespace, Revision: revision, Project: &project, - }) + } + if sourcePositions != nil && query.Revisions != nil { + query.SourcePositions = *sourcePositions + query.Revisions = *revisions + } + + desiredManifests, err := r.applicationServiceClient.GetManifests(ctx, &query) if err != nil { // if it's manifest generation error we need to still report the actual state // of the resources, but since we can't get the desired state, we will report @@ -141,7 +154,7 @@ func (s *applicationEventReporter) StreamApplicationEvents( logCtx.Info("getting desired manifests") - desiredManifests, manifestGenErr := s.getDesiredManifests(ctx, a, nil, logCtx) + desiredManifests, manifestGenErr := s.getDesiredManifests(ctx, logCtx, a, nil, nil, nil) applicationVersions := s.resolveApplicationVersions(ctx, a, logCtx) @@ -162,7 +175,7 @@ func (s *applicationEventReporter) StreamApplicationEvents( rs := utils.GetAppAsResource(a) utils.SetHealthStatusIfMissing(rs) - parentDesiredManifests, manifestGenErr := s.getDesiredManifests(ctx, parentApplicationEntity, nil, logCtx) + parentDesiredManifests, manifestGenErr := s.getDesiredManifests(ctx, logCtx, parentApplicationEntity, nil, nil, nil) parentAppSyncRevisionsMetadata, err := s.getApplicationRevisionsMetadata(ctx, logCtx, parentApplicationEntity) if err != nil { @@ -226,14 +239,30 @@ func (s *applicationEventReporter) StreamApplicationEvents( return nil } +// returns appVersion from first non-ref source for multisourced apps func (s *applicationEventReporter) resolveApplicationVersions(ctx context.Context, a *appv1.Application, logCtx *log.Entry) *apiclient.ApplicationVersions { - syncRevision := utils.GetOperationStateRevision(a) var applicationVersions *apiclient.ApplicationVersions - if syncRevision != nil { - syncManifests, _ := s.getDesiredManifests(ctx, a, syncRevision, logCtx) - applicationVersions = syncManifests.GetApplicationVersions() - } else { - applicationVersions = nil + + if a.Spec.HasMultipleSources() { + syncResultRevisions := utils.GetOperationSyncResultRevisions(a) + if syncResultRevisions == nil { + return applicationVersions + } + + var sourcePositions []int64 + for i := 0; i < len(*syncResultRevisions); i++ { + sourcePositions = append(sourcePositions, int64(i+1)) + } + + syncManifests, _ := s.getDesiredManifests(ctx, logCtx, a, nil, &sourcePositions, syncResultRevisions) + return syncManifests.GetApplicationVersions() + } + + syncResultRevision := utils.GetOperationSyncResultRevision(a) + + if syncResultRevision != nil { + syncManifests, _ := s.getDesiredManifests(ctx, logCtx, a, syncResultRevision, nil, nil) + return syncManifests.GetApplicationVersions() } return applicationVersions diff --git a/event_reporter/utils/app_revision.go b/event_reporter/utils/app_revision.go index 1af805b7e25bc..0ff0eb8429ac4 100644 --- a/event_reporter/utils/app_revision.go +++ b/event_reporter/utils/app_revision.go @@ -81,7 +81,7 @@ func GetOperationRevisions(a *appv1.Application) []string { return revisions } -func GetOperationStateRevision(a *appv1.Application) *string { +func GetOperationSyncResultRevision(a *appv1.Application) *string { if a == nil || a.Status.OperationState == nil || a.Status.OperationState.SyncResult == nil { return nil } @@ -89,6 +89,14 @@ func GetOperationStateRevision(a *appv1.Application) *string { return &a.Status.OperationState.SyncResult.Revision } +func GetOperationSyncResultRevisions(a *appv1.Application) *[]string { + if a == nil || a.Status.OperationState == nil || a.Status.OperationState.SyncResult == nil { + return nil + } + + return &a.Status.OperationState.SyncResult.Revisions +} + func GetOperationSyncRevisions(a *appv1.Application) []string { if a == nil { return []string{} From fb8e25f72190abd936723b9b7a3a1c74a3e96a64 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 7 Nov 2024 16:58:03 +0200 Subject: [PATCH 15/26] event-reporter(resource source payload): added new field OperationSyncRevisions --- event_reporter/reporter/event_payload.go | 37 ++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index 4016fb8be8080..881f25fdae097 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -100,24 +100,25 @@ func getResourceEventPayload( } source := events.ObjectSource{ - DesiredManifest: rr.desiredState.CompiledManifest, - ActualManifest: *rr.actualState.Manifest, - GitManifest: rr.desiredState.RawManifest, - RepoURL: reportedEntityParentApp.app.Status.Sync.ComparedTo.Source.RepoURL, - Path: rr.desiredState.Path, - Revision: utils.GetApplicationLatestRevision(reportedEntityParentApp.app), - OperationSyncRevision: utils.GetOperationRevision(reportedEntityParentApp.app), - HistoryId: utils.GetLatestAppHistoryId(reportedEntityParentApp.app), - AppName: reportedEntityParentApp.app.Name, - AppNamespace: reportedEntityParentApp.app.Namespace, - AppUID: string(reportedEntityParentApp.app.ObjectMeta.UID), - AppLabels: reportedEntityParentApp.app.Labels, - SyncStatus: string(rr.rs.Status), - SyncStartedAt: syncStarted, - SyncFinishedAt: syncFinished, - Cluster: reportedEntityParentApp.app.Spec.Destination.Server, - AppInstanceLabelKey: *argoTrackingMetadata.AppInstanceLabelKey, - TrackingMethod: string(*argoTrackingMetadata.TrackingMethod), + DesiredManifest: rr.desiredState.CompiledManifest, + ActualManifest: *rr.actualState.Manifest, + GitManifest: rr.desiredState.RawManifest, + RepoURL: reportedEntityParentApp.app.Status.Sync.ComparedTo.Source.RepoURL, + Path: rr.desiredState.Path, + Revision: utils.GetApplicationLatestRevision(reportedEntityParentApp.app), + OperationSyncRevision: utils.GetOperationRevision(reportedEntityParentApp.app), + OperationSyncRevisions: utils.GetOperationRevisions(reportedEntityParentApp.app), + HistoryId: utils.GetLatestAppHistoryId(reportedEntityParentApp.app), + AppName: reportedEntityParentApp.app.Name, + AppNamespace: reportedEntityParentApp.app.Namespace, + AppUID: string(reportedEntityParentApp.app.ObjectMeta.UID), + AppLabels: reportedEntityParentApp.app.Labels, + SyncStatus: string(rr.rs.Status), + SyncStartedAt: syncStarted, + SyncFinishedAt: syncFinished, + Cluster: reportedEntityParentApp.app.Spec.Destination.Server, + AppInstanceLabelKey: *argoTrackingMetadata.AppInstanceLabelKey, + TrackingMethod: string(*argoTrackingMetadata.TrackingMethod), } if reportedEntityParentApp.revisionsMetadata != nil && reportedEntityParentApp.revisionsMetadata.SyncRevisions != nil { From 23233d355d906b407e311e57f813d55a95b16125 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 7 Nov 2024 17:16:21 +0200 Subject: [PATCH 16/26] event-reporter(resource source payload): added new fields DestName, DestServer --- .../reporter/application_event_reporter.go | 22 ++++++++++++++----- event_reporter/reporter/event_payload.go | 5 +++++ event_reporter/reporter/types.go | 7 +++--- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index 6d62a5f351805..c8322d2346b3a 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -13,6 +13,8 @@ import ( "github.com/argoproj/argo-cd/v2/event_reporter/utils" + argoutils "github.com/argoproj/argo-cd/v2/util/argo" + "github.com/argoproj/argo-cd/v2/reposerver/apiclient" argocommon "github.com/argoproj/argo-cd/v2/common" @@ -182,10 +184,14 @@ func (s *applicationEventReporter) StreamApplicationEvents( logCtx.WithError(err).Warn("failed to get parent application's revision metadata, resuming") } + validatedDestination := parentApplicationEntity.Spec.Destination.DeepCopy() + _ = argoutils.ValidateDestination(ctx, validatedDestination, s.db) // resolves server field if missing + err = s.processResource(ctx, *rs, logCtx, eventProcessingStartedAt, parentDesiredManifests, manifestGenErr, a, applicationVersions, &ReportedEntityParentApp{ - app: parentApplicationEntity, - appTree: appTree, - revisionsMetadata: parentAppSyncRevisionsMetadata, + app: parentApplicationEntity, + appTree: appTree, + revisionsMetadata: parentAppSyncRevisionsMetadata, + validatedDestination: validatedDestination, }, argoTrackingMetadata) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricChildAppEventType, metrics.MetricEventUnknownErrorType, a.Name) @@ -214,6 +220,9 @@ func (s *applicationEventReporter) StreamApplicationEvents( s.metricsServer.ObserveEventProcessingDurationHistogramDuration(a.Name, metrics.MetricParentAppEventType, metricTimer.Duration()) } + validatedDestination := a.Spec.Destination.DeepCopy() + _ = argoutils.ValidateDestination(ctx, validatedDestination, s.db) // resolves server field if missing + revisionsMetadata, _ := s.getApplicationRevisionsMetadata(ctx, logCtx, a) // for each resource in the application get desired and actual state, // then stream the event @@ -227,9 +236,10 @@ func (s *applicationEventReporter) StreamApplicationEvents( continue } err := s.processResource(ctx, rs, logCtx, eventProcessingStartedAt, desiredManifests, manifestGenErr, nil, nil, &ReportedEntityParentApp{ - app: a, - appTree: appTree, - revisionsMetadata: revisionsMetadata, + app: a, + appTree: appTree, + revisionsMetadata: revisionsMetadata, + validatedDestination: validatedDestination, }, argoTrackingMetadata) if err != nil { s.metricsServer.IncErroredEventsCounter(metrics.MetricResourceEventType, metrics.MetricEventUnknownErrorType, a.Name) diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index 881f25fdae097..f452d8de978e4 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -121,6 +121,11 @@ func getResourceEventPayload( TrackingMethod: string(*argoTrackingMetadata.TrackingMethod), } + if reportedEntityParentApp.validatedDestination != nil { + source.DestName = &reportedEntityParentApp.validatedDestination.Name + source.DestServer = reportedEntityParentApp.validatedDestination.Server + } + if reportedEntityParentApp.revisionsMetadata != nil && reportedEntityParentApp.revisionsMetadata.SyncRevisions != nil { revisionMetadata := getApplicationLegacyRevisionDetails(reportedEntityParentApp.app, reportedEntityParentApp.revisionsMetadata) if revisionMetadata != nil { diff --git a/event_reporter/reporter/types.go b/event_reporter/reporter/types.go index ff7f1948377d2..1f03daeb07d34 100644 --- a/event_reporter/reporter/types.go +++ b/event_reporter/reporter/types.go @@ -22,9 +22,10 @@ type ReportedResourceAsApp struct { } type ReportedEntityParentApp struct { - app *appv1.Application - appTree *appv1.ApplicationTree - revisionsMetadata *utils.AppSyncRevisionsMetadata + app *appv1.Application + appTree *appv1.ApplicationTree + revisionsMetadata *utils.AppSyncRevisionsMetadata + validatedDestination *appv1.ApplicationDestination // with resolved Server url field if server Name used } type ArgoTrackingMetadata struct { From 86c7b0e654cc033fbda26eb3c50ad3000e60c04a Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Thu, 7 Nov 2024 17:17:29 +0200 Subject: [PATCH 17/26] event-reporter(resource source payload): added new field AppMultiSourced --- event_reporter/reporter/event_payload.go | 1 + 1 file changed, 1 insertion(+) diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index f452d8de978e4..1e761b874d8b2 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -119,6 +119,7 @@ func getResourceEventPayload( Cluster: reportedEntityParentApp.app.Spec.Destination.Server, AppInstanceLabelKey: *argoTrackingMetadata.AppInstanceLabelKey, TrackingMethod: string(*argoTrackingMetadata.TrackingMethod), + AppMultiSourced: reportedEntityParentApp.app.Spec.HasMultipleSources(), } if reportedEntityParentApp.validatedDestination != nil { From 3539bc7d617eb5bc537feee1ca5c9bf14530c140 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Fri, 8 Nov 2024 11:58:23 +0200 Subject: [PATCH 18/26] event-reporter(resource source payload): added AppSourceIdx with source index to which this resource belongs. Also updated logic of retrieving correct git commit info based on AppSourceIdx --- assets/swagger.json | 8 + event_reporter/reporter/app_revision_test.go | 3 + .../reporter/application_event_reporter.go | 37 +- .../application_event_reporter_test.go | 29 +- event_reporter/reporter/event_payload.go | 51 +- event_reporter/reporter/types.go | 2 + event_reporter/utils/app_revision.go | 7 + pkg/apiclient/events/events.pb.go | 178 ++++--- reposerver/apiclient/repository.pb.go | 451 +++++++++++------- reposerver/repository/repository.proto | 2 + server/application/application.go | 1 + server/application/events.proto | 1 + 12 files changed, 511 insertions(+), 259 deletions(-) diff --git a/assets/swagger.json b/assets/swagger.json index ecdbf6062defd..9241eef9942f5 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -5294,6 +5294,14 @@ "sourceType": { "type": "string" }, + "sourcesManifestsStartingIdx": { + "type": "array", + "title": "for multisourced apps will be [0,12,20], so this means that 0-11 - from first app source, 12-19 from second one, 20-x - third one", + "items": { + "type": "integer", + "format": "int32" + } + }, "verifyResult": { "type": "string", "title": "Raw response of git verify-commit operation (always the empty string for Helm)" diff --git a/event_reporter/reporter/app_revision_test.go b/event_reporter/reporter/app_revision_test.go index 4b9611738432f..3dfc78127813b 100644 --- a/event_reporter/reporter/app_revision_test.go +++ b/event_reporter/reporter/app_revision_test.go @@ -54,6 +54,7 @@ func TestGetRevisionsDetails(t *testing.T) { newAppLister(), appServiceClient, &metrics.MetricsServer{}, + fakeArgoDb(), } result, _ := reporter.getRevisionsDetails(context.Background(), &app, []string{expectedRevision}) @@ -118,6 +119,7 @@ func TestGetRevisionsDetails(t *testing.T) { newAppLister(), appServiceClient, &metrics.MetricsServer{}, + fakeArgoDb(), } result, _ := reporter.getRevisionsDetails(context.Background(), &app, []string{expectedRevision1, expectedRevision2}) @@ -159,6 +161,7 @@ func TestGetRevisionsDetails(t *testing.T) { newAppLister(), appServiceClient, &metrics.MetricsServer{}, + fakeArgoDb(), } result, _ := reporter.getRevisionsDetails(context.Background(), &app, []string{expectedRevision}) diff --git a/event_reporter/reporter/application_event_reporter.go b/event_reporter/reporter/application_event_reporter.go index a3b534ef2308f..8edfe3013aabf 100644 --- a/event_reporter/reporter/application_event_reporter.go +++ b/event_reporter/reporter/application_event_reporter.go @@ -323,7 +323,7 @@ func (s *applicationEventReporter) processResource( }) // get resource desired state - desiredState := getResourceDesiredState(&rs, desiredManifests, logCtx) + desiredState, appSourceIdx := getResourceDesiredState(&rs, desiredManifests, logCtx) actualState, err := s.getResourceActualState(ctx, logCtx, metricsEventType, rs, reportedEntityParentApp.app, originalApplication) if err != nil { @@ -348,6 +348,7 @@ func (s *applicationEventReporter) processResource( actualState: actualState, desiredState: desiredState, manifestGenErr: manifestGenErr, + appSourceIdx: appSourceIdx, rsAsAppInfo: &ReportedResourceAsApp{ app: originalApplication, revisionsMetadata: originalAppRevisionMetadata, @@ -355,9 +356,11 @@ func (s *applicationEventReporter) processResource( }, }, &ReportedEntityParentApp{ - app: parentApplicationToReport, - appTree: reportedEntityParentApp.appTree, - revisionsMetadata: revisionMetadataToReport, + app: parentApplicationToReport, + appTree: reportedEntityParentApp.appTree, + revisionsMetadata: revisionMetadataToReport, + validatedDestination: reportedEntityParentApp.validatedDestination, + desiredManifests: reportedEntityParentApp.desiredManifests, }, argoTrackingMetadata, ) @@ -518,11 +521,11 @@ func applicationMetadataChanged(ae *appv1.ApplicationWatchEvent, cachedApp *appv return !reflect.DeepEqual(newEventAppMeta, cachedAppMeta) } -func getResourceDesiredState(rs *appv1.ResourceStatus, ds *apiclient.ManifestResponse, logger *log.Entry) *apiclient.Manifest { +func getResourceDesiredState(rs *appv1.ResourceStatus, ds *apiclient.ManifestResponse, logger *log.Entry) (manifest *apiclient.Manifest, sourceIdx int32) { if ds == nil { - return &apiclient.Manifest{} + return &apiclient.Manifest{}, 0 } - for _, m := range ds.Manifests { + for idx, m := range ds.Manifests { u, err := appv1.UnmarshalToUnstructured(m.CompiledManifest) if err != nil { logger.WithError(err).Warnf("failed to unmarshal compiled manifest") @@ -542,11 +545,27 @@ func getResourceDesiredState(rs *appv1.ResourceStatus, ds *apiclient.ManifestRes m.RawManifest = m.CompiledManifest } - return m + return m, getResourceSourceIdxFromManifestResponse(idx, ds) } } // no desired state for resource // it's probably deleted from git - return &apiclient.Manifest{} + return &apiclient.Manifest{}, 0 +} + +func getResourceSourceIdxFromManifestResponse(rsIdx int, ds *apiclient.ManifestResponse) int32 { + if ds.SourcesManifestsStartingIdx == nil { + return -1 + } + + sourceIdx := int32(-1) + + for currentSourceIdx, sourceStartingIdx := range ds.SourcesManifestsStartingIdx { + if int32(rsIdx) >= sourceStartingIdx { + sourceIdx = int32(currentSourceIdx) + } + } + + return sourceIdx } diff --git a/event_reporter/reporter/application_event_reporter_test.go b/event_reporter/reporter/application_event_reporter_test.go index 24f57525b9a5d..c9c0d710b4623 100644 --- a/event_reporter/reporter/application_event_reporter_test.go +++ b/event_reporter/reporter/application_event_reporter_test.go @@ -4,6 +4,9 @@ import ( "context" "encoding/json" "fmt" + "github.com/argoproj/argo-cd/v2/util/db" + "github.com/argoproj/argo-cd/v2/util/settings" + "k8s.io/client-go/kubernetes/fake" "net/http" "testing" "time" @@ -19,8 +22,8 @@ import ( "github.com/argoproj/argo-cd/v2/pkg/apiclient" apiclientapppkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" appv1reg "github.com/argoproj/argo-cd/v2/pkg/apis/application" + repoapiclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/util/io" - "google.golang.org/grpc" "k8s.io/apimachinery/pkg/runtime" @@ -93,6 +96,12 @@ func fakeAppServiceClient() apiclientapppkg.ApplicationServiceClient { return applicationServiceClient } +func fakeArgoDb() db.ArgoDB { + clientset := fake.NewSimpleClientset() + + return db.NewDB("", settings.NewSettingsManager(context.Background(), clientset, testNamespace), clientset) +} + func fakeReporter(customAppServiceClient appclient.ApplicationClient) *applicationEventReporter { guestbookApp := &appsv1.Application{ TypeMeta: metav1.TypeMeta{ @@ -159,6 +168,7 @@ func fakeReporter(customAppServiceClient appclient.ApplicationClient) *applicati appLister, customAppServiceClient, metricsServ, + fakeArgoDb(), } } @@ -459,3 +469,20 @@ func TestGetResourceActualState(t *testing.T) { assert.Equal(t, "", ptr.ToString(res.Manifest)) }) } + +func TestGetResourceSourceIdxFromManifestResponse(t *testing.T) { + t.Run("should return correct sourceIdx", func(t *testing.T) { + sourcesManifestsStartingIdx := []int32{0, 5, 15} + desiredManifests := &repoapiclient.ManifestResponse{ + SourcesManifestsStartingIdx: sourcesManifestsStartingIdx, + } + + assert.Equal(t, int32(0), getResourceSourceIdxFromManifestResponse(0, desiredManifests)) + assert.Equal(t, int32(0), getResourceSourceIdxFromManifestResponse(1, desiredManifests)) + assert.Equal(t, int32(1), getResourceSourceIdxFromManifestResponse(5, desiredManifests)) + assert.Equal(t, int32(1), getResourceSourceIdxFromManifestResponse(6, desiredManifests)) + assert.Equal(t, int32(2), getResourceSourceIdxFromManifestResponse(15, desiredManifests)) + assert.Equal(t, int32(2), getResourceSourceIdxFromManifestResponse(16, desiredManifests)) + assert.Equal(t, int32(-1), getResourceSourceIdxFromManifestResponse(2, &repoapiclient.ManifestResponse{})) + }) +} diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index c24bf3cec8ef8..81c140e7ac179 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -103,7 +103,6 @@ func getResourceEventPayload( DesiredManifest: rr.desiredState.CompiledManifest, ActualManifest: *rr.actualState.Manifest, GitManifest: rr.desiredState.RawManifest, - RepoURL: reportedEntityParentApp.app.Status.Sync.ComparedTo.Source.RepoURL, Path: rr.desiredState.Path, Revision: utils.GetApplicationLatestRevision(reportedEntityParentApp.app), OperationSyncRevision: utils.GetOperationRevision(reportedEntityParentApp.app), @@ -120,22 +119,17 @@ func getResourceEventPayload( AppInstanceLabelKey: *argoTrackingMetadata.AppInstanceLabelKey, TrackingMethod: string(*argoTrackingMetadata.TrackingMethod), AppMultiSourced: reportedEntityParentApp.app.Spec.HasMultipleSources(), + AppSourceIdx: rr.appSourceIdx, } + source.RepoURL = getResourceSourceRepoUrl(rr, reportedEntityParentApp) + addResourceEventPayloadGitCommitDetails(&source, rr, reportedEntityParentApp) + if reportedEntityParentApp.validatedDestination != nil { source.DestName = &reportedEntityParentApp.validatedDestination.Name source.DestServer = reportedEntityParentApp.validatedDestination.Server } - if reportedEntityParentApp.revisionsMetadata != nil && reportedEntityParentApp.revisionsMetadata.SyncRevisions != nil { - revisionMetadata := getApplicationLegacyRevisionDetails(reportedEntityParentApp.app, reportedEntityParentApp.revisionsMetadata) - if revisionMetadata != nil { - source.CommitMessage = revisionMetadata.Message - source.CommitAuthor = revisionMetadata.Author - source.CommitDate = &revisionMetadata.Date - } - } - if rr.rs.Health != nil { source.HealthStatus = (*string)(&rr.rs.Health.Status) source.HealthMessage = &rr.rs.Health.Message @@ -161,6 +155,43 @@ func getResourceEventPayload( return &events.Event{Payload: payloadBytes}, nil } +func getResourceSourceRepoUrl( + rr *ReportedResource, + reportedEntityParentApp *ReportedEntityParentApp, +) string { + specCopy := reportedEntityParentApp.app.Spec.DeepCopy() + + specCopy.Sources = reportedEntityParentApp.app.Status.Sync.ComparedTo.Sources + specCopy.Source = reportedEntityParentApp.app.Status.Sync.ComparedTo.Source.DeepCopy() + + if specCopy.HasMultipleSources() { + if rr.appSourceIdx == -1 { + return "" + } + return specCopy.GetSourcePtrByIndex(int(rr.appSourceIdx)).RepoURL + } + + return specCopy.Source.RepoURL +} + +func addResourceEventPayloadGitCommitDetails( + source *events.ObjectSource, + rr *ReportedResource, + reportedEntityParentApp *ReportedEntityParentApp, +) { + if reportedEntityParentApp.revisionsMetadata == nil || reportedEntityParentApp.revisionsMetadata.SyncRevisions == nil || rr.appSourceIdx == -1 { + return + } + + syncRevisionWithMetadata := reportedEntityParentApp.revisionsMetadata.GetSyncRevisionAt(int(rr.appSourceIdx)) + + if syncRevisionWithMetadata != nil && syncRevisionWithMetadata.Metadata != nil { + source.CommitMessage = syncRevisionWithMetadata.Metadata.Message + source.CommitAuthor = syncRevisionWithMetadata.Metadata.Author + source.CommitDate = &syncRevisionWithMetadata.Metadata.Date + } +} + func getResourceEventPayloadErrors( rr *ReportedResource, reportedEntityParentApp *ReportedEntityParentApp, diff --git a/event_reporter/reporter/types.go b/event_reporter/reporter/types.go index 0657ad7a27d23..dddfba5ebd03c 100644 --- a/event_reporter/reporter/types.go +++ b/event_reporter/reporter/types.go @@ -10,6 +10,7 @@ import ( type ReportedResource struct { rs *appv1.ResourceStatus rsAsAppInfo *ReportedResourceAsApp // passed if resource is application + appSourceIdx int32 actualState *application.ApplicationResourceResponse desiredState *apiclient.Manifest manifestGenErr bool @@ -26,6 +27,7 @@ type ReportedEntityParentApp struct { appTree *appv1.ApplicationTree revisionsMetadata *utils.AppSyncRevisionsMetadata validatedDestination *appv1.ApplicationDestination // with resolved Server url field if server Name used + desiredManifests *apiclient.ManifestResponse } type ArgoTrackingMetadata struct { diff --git a/event_reporter/utils/app_revision.go b/event_reporter/utils/app_revision.go index 0ff0eb8429ac4..29ea5f789e716 100644 --- a/event_reporter/utils/app_revision.go +++ b/event_reporter/utils/app_revision.go @@ -25,6 +25,13 @@ type RevisionsData struct { const annotationRevisionKey = "app.meta.revisions-metadata" +func (asrm *AppSyncRevisionsMetadata) GetSyncRevisionAt(idx int) *RevisionWithMetadata { + if asrm == nil || asrm.SyncRevisions == nil { + return nil + } + return asrm.SyncRevisions[idx] +} + func GetLatestAppHistoryId(a *appv1.Application) int64 { if lastHistory := getLatestAppHistoryItem(a); lastHistory != nil { return lastHistory.ID diff --git a/pkg/apiclient/events/events.pb.go b/pkg/apiclient/events/events.pb.go index fac639fa5b4c9..cbea9b89ffab3 100644 --- a/pkg/apiclient/events/events.pb.go +++ b/pkg/apiclient/events/events.pb.go @@ -265,6 +265,7 @@ type ObjectSource struct { DestServer string `protobuf:"bytes,25,req,name=destServer" json:"destServer"` DestName *string `protobuf:"bytes,26,opt,name=destName" json:"destName,omitempty"` AppMultiSourced bool `protobuf:"varint,27,req,name=appMultiSourced" json:"appMultiSourced"` + AppSourceIdx int32 `protobuf:"varint,28,req,name=appSourceIdx" json:"appSourceIdx"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -492,6 +493,13 @@ func (m *ObjectSource) GetAppMultiSourced() bool { return false } +func (m *ObjectSource) GetAppSourceIdx() int32 { + if m != nil { + return m.AppSourceIdx + } + return 0 +} + // * // Holds error information; present only when error sent with application but not resource itself type ObjectError struct { @@ -792,76 +800,77 @@ func init() { func init() { proto.RegisterFile("server/application/events.proto", fileDescriptor_3ad9267ec62b112f) } var fileDescriptor_3ad9267ec62b112f = []byte{ - // 1098 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x8f, 0x1b, 0x35, - 0x10, 0x67, 0x73, 0xff, 0x27, 0xb9, 0x6b, 0x71, 0xaf, 0xc5, 0x84, 0x72, 0x8d, 0xa2, 0x0a, 0x45, - 0x55, 0xbb, 0x51, 0x0f, 0xa8, 0xda, 0x0a, 0x21, 0x5d, 0xd5, 0x02, 0x85, 0x3b, 0x40, 0x7b, 0xb4, - 0x0f, 0x7d, 0x73, 0x77, 0xa7, 0x1b, 0x37, 0x1b, 0xdb, 0xd8, 0x4e, 0xa4, 0x7c, 0x25, 0x1e, 0xf8, - 0x1c, 0x7d, 0xe4, 0x13, 0x20, 0xd4, 0x17, 0xbe, 0x03, 0x4f, 0xc8, 0xde, 0x3f, 0xe7, 0x0d, 0x41, - 0xa2, 0xbc, 0x79, 0x7e, 0xf3, 0x9b, 0xb1, 0xc7, 0x33, 0x9e, 0x31, 0xdc, 0x30, 0xa8, 0x17, 0xa8, - 0xc7, 0x4c, 0xa9, 0x82, 0xa7, 0xcc, 0x72, 0x29, 0xc6, 0xb8, 0x40, 0x61, 0x4d, 0xac, 0xb4, 0xb4, - 0x92, 0xec, 0xe4, 0x28, 0x50, 0xf3, 0xb4, 0x7f, 0x9a, 0x73, 0x3b, 0x99, 0xbf, 0x8c, 0x53, 0x39, - 0x1b, 0x33, 0x9d, 0x4b, 0xa5, 0xe5, 0x6b, 0xbf, 0xb8, 0x93, 0x66, 0xe3, 0xc5, 0xf1, 0x58, 0x4d, - 0xf3, 0x31, 0x53, 0xdc, 0xb4, 0x5c, 0x2d, 0xee, 0xb2, 0x42, 0x4d, 0xd8, 0xdd, 0xb1, 0xf7, 0xc2, - 0x2c, 0x66, 0xa5, 0xdb, 0xfe, 0x67, 0xd3, 0xfb, 0x26, 0xe6, 0xd2, 0x59, 0xcc, 0x58, 0x3a, 0xe1, - 0x02, 0xf5, 0xf2, 0xc2, 0xc5, 0x0c, 0x2d, 0x1b, 0x2f, 0xfe, 0x69, 0x75, 0x98, 0x4b, 0xbf, 0xb1, - 0x95, 0x63, 0xb7, 0xaa, 0xd0, 0xeb, 0xb9, 0x94, 0x79, 0x81, 0xce, 0x74, 0xcc, 0x84, 0x90, 0xd6, - 0xef, 0x5d, 0x05, 0x30, 0x7c, 0x00, 0xdd, 0x27, 0x2e, 0xa0, 0x73, 0x39, 0xd7, 0x29, 0x12, 0x02, - 0x9b, 0x82, 0xcd, 0x90, 0x46, 0x83, 0xce, 0x68, 0x2f, 0xf1, 0x6b, 0x72, 0x0d, 0xb6, 0x53, 0x29, - 0x5e, 0xf1, 0x9c, 0x76, 0x06, 0xd1, 0xa8, 0x97, 0x54, 0xd2, 0xf0, 0x73, 0xd8, 0xf2, 0xa6, 0x6b, - 0x8d, 0x28, 0xec, 0x28, 0xb6, 0x2c, 0x24, 0xcb, 0x68, 0x67, 0xd0, 0x19, 0xf5, 0x92, 0x5a, 0x1c, - 0xfe, 0x19, 0x41, 0xcf, 0xdb, 0xfd, 0x58, 0x02, 0x64, 0x08, 0x7b, 0x96, 0xcf, 0xd0, 0x58, 0x36, - 0x53, 0xa5, 0x8f, 0x47, 0x9b, 0x6f, 0x7e, 0xbf, 0xf1, 0x5e, 0x72, 0x01, 0xbb, 0x33, 0xc8, 0x97, - 0xaf, 0x31, 0xb5, 0x95, 0xb7, 0x4a, 0x22, 0x77, 0x60, 0xdb, 0xf8, 0x93, 0xd3, 0x8d, 0x41, 0x67, - 0xd4, 0x3d, 0xbe, 0x1a, 0x57, 0x09, 0x89, 0x7f, 0xf0, 0x84, 0x32, 0xac, 0xa4, 0x22, 0x91, 0xdb, - 0xb0, 0x8d, 0x5a, 0x4b, 0x6d, 0xe8, 0xe6, 0x60, 0x63, 0xd4, 0x3d, 0x3e, 0x5c, 0xa1, 0x3f, 0x71, - 0xca, 0xa4, 0xe2, 0x90, 0x2f, 0xa1, 0xcb, 0x94, 0x7a, 0x8e, 0xda, 0xb8, 0x0b, 0xa3, 0x5b, 0x83, - 0x68, 0xd4, 0x3d, 0xbe, 0xde, 0x98, 0x9c, 0x5c, 0x64, 0xb2, 0xe6, 0x24, 0xa1, 0xc1, 0xf0, 0x57, - 0x80, 0x5e, 0x78, 0x0c, 0x12, 0xc3, 0xa5, 0x0c, 0x0d, 0xd7, 0x98, 0x9d, 0x31, 0xc1, 0x5f, 0xa1, - 0xb1, 0x34, 0x1a, 0x44, 0x4d, 0xbc, 0xab, 0x4a, 0x72, 0x1b, 0x0e, 0x58, 0x6a, 0xe7, 0xac, 0x68, - 0xe8, 0x9d, 0x80, 0xbe, 0xa2, 0x23, 0x9f, 0x40, 0x37, 0xe7, 0xb6, 0xa1, 0x6e, 0x04, 0xd4, 0x50, - 0x41, 0x8e, 0x60, 0x47, 0xa3, 0x92, 0xcf, 0x92, 0x53, 0xba, 0x19, 0x70, 0x6a, 0x90, 0x50, 0xd8, - 0x54, 0xcc, 0x4e, 0x7c, 0xbc, 0xb5, 0xd2, 0x23, 0x64, 0x00, 0xbb, 0x1a, 0x17, 0xdc, 0x45, 0x47, - 0xb7, 0x03, 0x6d, 0x83, 0x92, 0x5b, 0xb0, 0x9f, 0xca, 0xd9, 0x8c, 0xdb, 0x33, 0x34, 0x86, 0xe5, - 0x48, 0x77, 0x02, 0x5a, 0x5b, 0x45, 0x46, 0xd0, 0x2b, 0x81, 0x93, 0xb9, 0x9d, 0x48, 0x4d, 0x77, - 0x03, 0x6a, 0x4b, 0x43, 0xbe, 0x05, 0x28, 0xe5, 0xc7, 0xcc, 0x22, 0xdd, 0xf3, 0x79, 0xb8, 0x15, - 0x97, 0x6f, 0x24, 0x0e, 0xdf, 0x48, 0xac, 0xa6, 0xb9, 0x03, 0x4c, 0xec, 0xde, 0x48, 0xbc, 0xb8, - 0x1b, 0xff, 0xc4, 0x67, 0x98, 0x04, 0xd6, 0x2e, 0x7a, 0xa6, 0xd4, 0xf7, 0xae, 0x5e, 0x21, 0x8c, - 0xbe, 0x02, 0xc9, 0x37, 0xb0, 0xc7, 0x94, 0x3a, 0x65, 0x2f, 0xb1, 0x30, 0xb4, 0xeb, 0xab, 0xe4, - 0xe6, 0xda, 0xa2, 0x72, 0xf9, 0x2f, 0x69, 0x4f, 0x84, 0xd5, 0xcb, 0xba, 0x66, 0x1b, 0x63, 0x72, - 0x13, 0xc0, 0x2c, 0x45, 0x7a, 0x6e, 0x99, 0x9d, 0x1b, 0xda, 0x0b, 0x36, 0x0b, 0x70, 0xf2, 0x1c, - 0xf6, 0x2b, 0x49, 0x5b, 0xcc, 0x4e, 0x2c, 0xdd, 0x7f, 0xd7, 0xf0, 0xea, 0xdb, 0x6d, 0xb9, 0x21, - 0x09, 0x1c, 0x38, 0xe0, 0x2b, 0x2e, 0xb8, 0x99, 0x78, 0xc7, 0x07, 0xef, 0x7c, 0x6f, 0x2b, 0x1e, - 0xc8, 0x10, 0x7a, 0x13, 0x64, 0x85, 0x9d, 0x54, 0x31, 0x5d, 0x72, 0x31, 0x25, 0x2d, 0x8c, 0xdc, - 0x84, 0xfd, 0x52, 0xae, 0x2b, 0xe0, 0xb2, 0x27, 0xb5, 0x41, 0x97, 0x85, 0xb4, 0x98, 0x1b, 0x8b, - 0x9a, 0xbe, 0x1f, 0x66, 0xa1, 0x02, 0x5d, 0x4f, 0x98, 0x70, 0x63, 0xa5, 0x5e, 0x3e, 0xcd, 0x28, - 0x19, 0x44, 0xa3, 0x8d, 0xfa, 0x7e, 0x1b, 0x98, 0x3c, 0x84, 0xab, 0x52, 0xb9, 0x06, 0xc8, 0xa5, - 0x38, 0x5f, 0x8a, 0x34, 0xa9, 0x4b, 0xf3, 0x4a, 0xe0, 0x71, 0x3d, 0x85, 0x5c, 0x87, 0x6d, 0xa6, - 0xd4, 0xb3, 0xa7, 0x8f, 0xe9, 0x61, 0x40, 0xae, 0x30, 0x57, 0x99, 0x55, 0x39, 0x18, 0xc5, 0x52, - 0xa4, 0x57, 0xc3, 0xca, 0x0c, 0x35, 0xe4, 0x1e, 0x5c, 0x61, 0x4a, 0x3d, 0x15, 0xc6, 0x32, 0x91, - 0xa2, 0x4f, 0xfc, 0x77, 0xb8, 0xa4, 0xd7, 0x02, 0x83, 0x75, 0x04, 0xf7, 0xb2, 0xad, 0x66, 0xe9, - 0x94, 0x8b, 0xfc, 0x0c, 0xed, 0x44, 0x66, 0xf4, 0x83, 0xf0, 0x65, 0xb7, 0x75, 0xe4, 0x1e, 0x5c, - 0x5b, 0x1b, 0x86, 0xa1, 0x74, 0xb0, 0x31, 0xda, 0x4b, 0xfe, 0x45, 0xeb, 0x2a, 0x30, 0x43, 0x63, - 0xcf, 0xfd, 0x10, 0xa3, 0x1f, 0x06, 0xad, 0x35, 0xc0, 0x49, 0x1f, 0x76, 0x9d, 0xe4, 0x9f, 0x44, - 0xdf, 0x27, 0xab, 0x91, 0x5d, 0xc7, 0x62, 0x4a, 0x9d, 0xcd, 0x0b, 0xcb, 0xcb, 0xaa, 0xcf, 0xe8, - 0x47, 0x83, 0xce, 0x68, 0xb7, 0xee, 0x58, 0x2b, 0xca, 0xfe, 0x17, 0x70, 0xd0, 0x7e, 0x16, 0xe4, - 0x32, 0x6c, 0x4c, 0x71, 0x59, 0xf6, 0xb9, 0xc4, 0x2d, 0xc9, 0x21, 0x6c, 0x2d, 0x58, 0x31, 0xc7, - 0xb2, 0x99, 0x25, 0xa5, 0xf0, 0xb0, 0x73, 0x3f, 0x1a, 0xfe, 0x15, 0x41, 0x37, 0x68, 0xc4, 0xae, - 0x13, 0xd9, 0xa5, 0xc2, 0x56, 0x93, 0xf4, 0x08, 0xe9, 0xc3, 0x56, 0x81, 0x0b, 0x2c, 0x5a, 0x0d, - 0xb1, 0x84, 0x5c, 0x6d, 0xcd, 0xaa, 0xda, 0x0b, 0x7b, 0x60, 0x0d, 0x92, 0x53, 0xd8, 0x2d, 0x98, - 0x8b, 0x1e, 0x85, 0x6f, 0x80, 0xff, 0xe7, 0xb1, 0x35, 0x1e, 0xc8, 0xd7, 0x70, 0xa9, 0x1c, 0x2e, - 0x09, 0xbe, 0x42, 0x8d, 0x22, 0xc5, 0x6a, 0x50, 0x7c, 0xdc, 0x74, 0x0d, 0x1f, 0xcc, 0x79, 0x9b, - 0x94, 0xac, 0x5a, 0x0d, 0x7f, 0x89, 0xe0, 0x70, 0x1d, 0xd3, 0xc5, 0x9a, 0x6b, 0x39, 0x57, 0xad, - 0x6b, 0x28, 0x21, 0x17, 0xeb, 0xa2, 0x1c, 0x37, 0xad, 0x9b, 0xa8, 0x41, 0x77, 0x83, 0x53, 0x2e, - 0x32, 0x3f, 0x1d, 0x9b, 0x1b, 0x74, 0x88, 0xd3, 0xf8, 0xa1, 0xbd, 0x19, 0x6a, 0xfc, 0xe8, 0x1e, - 0xc2, 0x9e, 0x68, 0x4a, 0x3f, 0x1c, 0x02, 0x17, 0xf0, 0xf0, 0x05, 0xf4, 0x1e, 0xa3, 0x42, 0x91, - 0xa1, 0x48, 0x39, 0x1a, 0xf7, 0x05, 0x28, 0x64, 0x3a, 0xad, 0xd2, 0xec, 0xd7, 0x0e, 0xcb, 0x50, - 0x99, 0x2a, 0xcd, 0x7e, 0xed, 0x3a, 0x88, 0xc6, 0x9f, 0xe7, 0x5c, 0xe3, 0xcc, 0xfd, 0xa2, 0xca, - 0x04, 0x25, 0x2d, 0x6c, 0xa8, 0xe0, 0xca, 0x9a, 0xd1, 0x4a, 0x8e, 0x00, 0x2e, 0x86, 0x6b, 0xb5, - 0x51, 0x80, 0x90, 0x07, 0xd0, 0xcb, 0x82, 0x23, 0xf9, 0x6d, 0xc3, 0x0f, 0x41, 0x78, 0xde, 0xa4, - 0x45, 0x7d, 0x74, 0xf2, 0xe6, 0xed, 0x51, 0xf4, 0xdb, 0xdb, 0xa3, 0xe8, 0x8f, 0xb7, 0x47, 0xd1, - 0x8b, 0x4f, 0xff, 0xdb, 0x57, 0x2e, 0x2d, 0x38, 0x0a, 0x5b, 0x7d, 0x07, 0xff, 0x0e, 0x00, 0x00, - 0xff, 0xff, 0x18, 0xfd, 0x2a, 0xbe, 0x2a, 0x0a, 0x00, 0x00, + // 1115 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4d, 0x8f, 0x1c, 0x35, + 0x13, 0x7e, 0x7b, 0xf6, 0xbb, 0x66, 0x76, 0x93, 0xd7, 0xd9, 0x04, 0xb3, 0x2c, 0x9b, 0xd1, 0x28, + 0x42, 0xa3, 0x28, 0xe9, 0x51, 0x16, 0x88, 0x92, 0x08, 0x21, 0x6d, 0x94, 0x00, 0x0b, 0xbb, 0x80, + 0x7a, 0x49, 0x0e, 0xb9, 0x39, 0xdd, 0x95, 0x1e, 0x67, 0x7a, 0x6c, 0x63, 0x7b, 0x46, 0xcc, 0x5f, + 0xe2, 0x97, 0xe4, 0xc8, 0x91, 0x13, 0x42, 0xb9, 0xf0, 0x1f, 0x38, 0x21, 0xbb, 0x3f, 0xd6, 0x3d, + 0x0c, 0x12, 0xe1, 0xe6, 0x7a, 0xea, 0xa9, 0xea, 0xae, 0x0f, 0x57, 0x19, 0x6e, 0x1a, 0xd4, 0x73, + 0xd4, 0x23, 0xa6, 0x54, 0xc1, 0x53, 0x66, 0xb9, 0x14, 0x23, 0x9c, 0xa3, 0xb0, 0x26, 0x56, 0x5a, + 0x5a, 0x49, 0xb6, 0x72, 0x14, 0xa8, 0x79, 0x7a, 0x70, 0x96, 0x73, 0x3b, 0x9e, 0xbd, 0x8c, 0x53, + 0x39, 0x1d, 0x31, 0x9d, 0x4b, 0xa5, 0xe5, 0x6b, 0x7f, 0xb8, 0x9b, 0x66, 0xa3, 0xf9, 0xf1, 0x48, + 0x4d, 0xf2, 0x11, 0x53, 0xdc, 0xb4, 0x5c, 0xcd, 0xef, 0xb1, 0x42, 0x8d, 0xd9, 0xbd, 0x91, 0xf7, + 0xc2, 0x2c, 0x66, 0xa5, 0xdb, 0x83, 0x4f, 0x26, 0x0f, 0x4c, 0xcc, 0xa5, 0xb3, 0x98, 0xb2, 0x74, + 0xcc, 0x05, 0xea, 0xc5, 0xa5, 0x8b, 0x29, 0x5a, 0x36, 0x9a, 0xff, 0xdd, 0x6a, 0x3f, 0x97, 0xfe, + 0xc3, 0x56, 0x8e, 0xdc, 0xa9, 0x42, 0x0f, 0x73, 0x29, 0xf3, 0x02, 0x9d, 0xe9, 0x88, 0x09, 0x21, + 0xad, 0xff, 0x76, 0x15, 0xc0, 0xe0, 0x21, 0x74, 0x9f, 0xba, 0x80, 0x2e, 0xe4, 0x4c, 0xa7, 0x48, + 0x08, 0xac, 0x0b, 0x36, 0x45, 0x1a, 0xf5, 0x3b, 0xc3, 0x9d, 0xc4, 0x9f, 0xc9, 0x0d, 0xd8, 0x4c, + 0xa5, 0x78, 0xc5, 0x73, 0xda, 0xe9, 0x47, 0xc3, 0x5e, 0x52, 0x49, 0x83, 0x4f, 0x61, 0xc3, 0x9b, + 0xae, 0x34, 0xa2, 0xb0, 0xa5, 0xd8, 0xa2, 0x90, 0x2c, 0xa3, 0x9d, 0x7e, 0x67, 0xd8, 0x4b, 0x6a, + 0x71, 0xf0, 0x47, 0x04, 0x3d, 0x6f, 0xf7, 0x7d, 0x09, 0x90, 0x01, 0xec, 0x58, 0x3e, 0x45, 0x63, + 0xd9, 0x54, 0x95, 0x3e, 0x1e, 0xaf, 0xbf, 0xf9, 0xed, 0xe6, 0xff, 0x92, 0x4b, 0xd8, 0xfd, 0x83, + 0x7c, 0xf9, 0x1a, 0x53, 0x5b, 0x79, 0xab, 0x24, 0x72, 0x17, 0x36, 0x8d, 0xff, 0x73, 0xba, 0xd6, + 0xef, 0x0c, 0xbb, 0xc7, 0xd7, 0xe3, 0xaa, 0x20, 0xf1, 0x77, 0x9e, 0x50, 0x86, 0x95, 0x54, 0x24, + 0x72, 0x07, 0x36, 0x51, 0x6b, 0xa9, 0x0d, 0x5d, 0xef, 0xaf, 0x0d, 0xbb, 0xc7, 0xfb, 0x4b, 0xf4, + 0xa7, 0x4e, 0x99, 0x54, 0x1c, 0xf2, 0x39, 0x74, 0x99, 0x52, 0xcf, 0x51, 0x1b, 0x97, 0x30, 0xba, + 0xd1, 0x8f, 0x86, 0xdd, 0xe3, 0xc3, 0xc6, 0xe4, 0xe4, 0xb2, 0x92, 0x35, 0x27, 0x09, 0x0d, 0x06, + 0xbf, 0x02, 0xf4, 0xc2, 0xdf, 0x20, 0x31, 0x5c, 0xc9, 0xd0, 0x70, 0x8d, 0xd9, 0x39, 0x13, 0xfc, + 0x15, 0x1a, 0x4b, 0xa3, 0x7e, 0xd4, 0xc4, 0xbb, 0xac, 0x24, 0x77, 0x60, 0x8f, 0xa5, 0x76, 0xc6, + 0x8a, 0x86, 0xde, 0x09, 0xe8, 0x4b, 0x3a, 0xf2, 0x11, 0x74, 0x73, 0x6e, 0x1b, 0xea, 0x5a, 0x40, + 0x0d, 0x15, 0xe4, 0x08, 0xb6, 0x34, 0x2a, 0xf9, 0x2c, 0x39, 0xa3, 0xeb, 0x01, 0xa7, 0x06, 0x09, + 0x85, 0x75, 0xc5, 0xec, 0xd8, 0xc7, 0x5b, 0x2b, 0x3d, 0x42, 0xfa, 0xb0, 0xad, 0x71, 0xce, 0x5d, + 0x74, 0x74, 0x33, 0xd0, 0x36, 0x28, 0xb9, 0x0d, 0xbb, 0xa9, 0x9c, 0x4e, 0xb9, 0x3d, 0x47, 0x63, + 0x58, 0x8e, 0x74, 0x2b, 0xa0, 0xb5, 0x55, 0x64, 0x08, 0xbd, 0x12, 0x38, 0x99, 0xd9, 0xb1, 0xd4, + 0x74, 0x3b, 0xa0, 0xb6, 0x34, 0xe4, 0x6b, 0x80, 0x52, 0x7e, 0xc2, 0x2c, 0xd2, 0x1d, 0x5f, 0x87, + 0xdb, 0x71, 0x79, 0x47, 0xe2, 0xf0, 0x8e, 0xc4, 0x6a, 0x92, 0x3b, 0xc0, 0xc4, 0xee, 0x8e, 0xc4, + 0xf3, 0x7b, 0xf1, 0x0f, 0x7c, 0x8a, 0x49, 0x60, 0xed, 0xa2, 0x67, 0x4a, 0x7d, 0xeb, 0xfa, 0x15, + 0xc2, 0xe8, 0x2b, 0x90, 0x7c, 0x05, 0x3b, 0x4c, 0xa9, 0x33, 0xf6, 0x12, 0x0b, 0x43, 0xbb, 0xbe, + 0x4b, 0x6e, 0xad, 0x6c, 0x2a, 0x57, 0xff, 0x92, 0xf6, 0x54, 0x58, 0xbd, 0xa8, 0x7b, 0xb6, 0x31, + 0x26, 0xb7, 0x00, 0xcc, 0x42, 0xa4, 0x17, 0x96, 0xd9, 0x99, 0xa1, 0xbd, 0xe0, 0x63, 0x01, 0x4e, + 0x9e, 0xc3, 0x6e, 0x25, 0x69, 0x8b, 0xd9, 0x89, 0xa5, 0xbb, 0xef, 0x1a, 0x5e, 0x9d, 0xdd, 0x96, + 0x1b, 0x92, 0xc0, 0x9e, 0x03, 0xbe, 0xe0, 0x82, 0x9b, 0xb1, 0x77, 0xbc, 0xf7, 0xce, 0x79, 0x5b, + 0xf2, 0x40, 0x06, 0xd0, 0x1b, 0x23, 0x2b, 0xec, 0xb8, 0x8a, 0xe9, 0x8a, 0x8b, 0x29, 0x69, 0x61, + 0xe4, 0x16, 0xec, 0x96, 0x72, 0xdd, 0x01, 0x57, 0x3d, 0xa9, 0x0d, 0xba, 0x2a, 0xa4, 0xc5, 0xcc, + 0x58, 0xd4, 0xf4, 0xff, 0x61, 0x15, 0x2a, 0xd0, 0xcd, 0x84, 0x31, 0x37, 0x56, 0xea, 0xc5, 0x69, + 0x46, 0x49, 0x3f, 0x1a, 0xae, 0xd5, 0xf9, 0x6d, 0x60, 0xf2, 0x08, 0xae, 0x4b, 0xe5, 0x06, 0x20, + 0x97, 0xe2, 0x62, 0x21, 0xd2, 0xa4, 0x6e, 0xcd, 0x6b, 0x81, 0xc7, 0xd5, 0x14, 0x72, 0x08, 0x9b, + 0x4c, 0xa9, 0x67, 0xa7, 0x4f, 0xe8, 0x7e, 0x40, 0xae, 0x30, 0xd7, 0x99, 0x55, 0x3b, 0x18, 0xc5, + 0x52, 0xa4, 0xd7, 0xc3, 0xce, 0x0c, 0x35, 0xe4, 0x3e, 0x5c, 0x63, 0x4a, 0x9d, 0x0a, 0x63, 0x99, + 0x48, 0xd1, 0x17, 0xfe, 0x1b, 0x5c, 0xd0, 0x1b, 0x81, 0xc1, 0x2a, 0x82, 0xbb, 0xd9, 0x56, 0xb3, + 0x74, 0xc2, 0x45, 0x7e, 0x8e, 0x76, 0x2c, 0x33, 0xfa, 0x5e, 0x78, 0xb3, 0xdb, 0x3a, 0x72, 0x1f, + 0x6e, 0xac, 0x0c, 0xc3, 0x50, 0xda, 0x5f, 0x1b, 0xee, 0x24, 0xff, 0xa0, 0x75, 0x1d, 0x98, 0xa1, + 0xb1, 0x17, 0x7e, 0x89, 0xd1, 0xf7, 0x83, 0xd1, 0x1a, 0xe0, 0xe4, 0x00, 0xb6, 0x9d, 0xe4, 0xaf, + 0xc4, 0x81, 0x2f, 0x56, 0x23, 0xbb, 0x89, 0xc5, 0x94, 0x3a, 0x9f, 0x15, 0x96, 0x97, 0x5d, 0x9f, + 0xd1, 0x0f, 0xfa, 0x9d, 0xe1, 0x76, 0x3d, 0xb1, 0x96, 0x94, 0x55, 0xe6, 0x4a, 0xe9, 0x34, 0xfb, + 0x89, 0x1e, 0xf6, 0x3b, 0xc3, 0x8d, 0x20, 0x73, 0x8d, 0xe6, 0xe0, 0x33, 0xd8, 0x6b, 0x5f, 0x20, + 0x72, 0x15, 0xd6, 0x26, 0xb8, 0x28, 0x27, 0x62, 0xe2, 0x8e, 0x64, 0x1f, 0x36, 0xe6, 0xac, 0x98, + 0x61, 0x39, 0xf6, 0x92, 0x52, 0x78, 0xd4, 0x79, 0x10, 0x0d, 0xfe, 0x8c, 0xa0, 0x1b, 0x8c, 0x6c, + 0x37, 0xb3, 0xec, 0x42, 0x61, 0x6b, 0x9c, 0x7a, 0x84, 0x1c, 0xc0, 0x46, 0x81, 0x73, 0x2c, 0x5a, + 0xa3, 0xb3, 0x84, 0x5c, 0x17, 0x4e, 0xab, 0x2e, 0x0d, 0xa7, 0x65, 0x0d, 0x92, 0x33, 0xd8, 0x2e, + 0x98, 0xcb, 0x13, 0x0a, 0x3f, 0x2a, 0xff, 0xcb, 0xb5, 0x6c, 0x3c, 0x90, 0x2f, 0xe1, 0x4a, 0xb9, + 0x86, 0x12, 0x7c, 0x85, 0x1a, 0x45, 0x8a, 0xd5, 0x4a, 0xf9, 0xb0, 0x99, 0x2f, 0x3e, 0x98, 0x8b, + 0x36, 0x29, 0x59, 0xb6, 0x1a, 0xfc, 0x1c, 0xc1, 0xfe, 0x2a, 0xa6, 0x8b, 0x35, 0xd7, 0x72, 0xa6, + 0x5a, 0x69, 0x28, 0x21, 0x17, 0xeb, 0xbc, 0x5c, 0x4c, 0xad, 0x4c, 0xd4, 0xa0, 0xcb, 0xe0, 0x84, + 0x8b, 0xcc, 0xef, 0xd1, 0x26, 0x83, 0x0e, 0x71, 0x1a, 0xbf, 0xde, 0xd7, 0x43, 0x8d, 0x5f, 0xf2, + 0x03, 0xd8, 0x11, 0xcd, 0x25, 0x09, 0xd7, 0xc5, 0x25, 0x3c, 0x78, 0x01, 0xbd, 0x27, 0xa8, 0x50, + 0x64, 0x28, 0x52, 0x8e, 0xc6, 0x3d, 0x16, 0x0a, 0x99, 0x4e, 0xaa, 0x32, 0xfb, 0xb3, 0xc3, 0x32, + 0x54, 0xa6, 0x2a, 0xb3, 0x3f, 0xbb, 0x59, 0xa3, 0xf1, 0xc7, 0x19, 0xd7, 0x38, 0x75, 0xef, 0xad, + 0xb2, 0x40, 0x49, 0x0b, 0x1b, 0x28, 0xb8, 0xb6, 0x62, 0x09, 0x93, 0x23, 0x80, 0xcb, 0x35, 0x5c, + 0x7d, 0x28, 0x40, 0xc8, 0x43, 0xe8, 0x65, 0xc1, 0x2f, 0xf9, 0xcf, 0x86, 0x4f, 0x87, 0xf0, 0x7f, + 0x93, 0x16, 0xf5, 0xf1, 0xc9, 0x9b, 0xb7, 0x47, 0xd1, 0x2f, 0x6f, 0x8f, 0xa2, 0xdf, 0xdf, 0x1e, + 0x45, 0x2f, 0x3e, 0xfe, 0x77, 0x8f, 0xbe, 0xb4, 0xe0, 0x28, 0x6c, 0xf5, 0x70, 0xfc, 0x2b, 0x00, + 0x00, 0xff, 0xff, 0x7a, 0x3b, 0xe0, 0x5a, 0x54, 0x0a, 0x00, 0x00, } func (m *EventSource) Marshal() (dAtA []byte, err error) { @@ -1057,6 +1066,11 @@ func (m *ObjectSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + i = encodeVarintEvents(dAtA, i, uint64(m.AppSourceIdx)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xe0 i-- if m.AppMultiSourced { dAtA[i] = 1 @@ -1634,6 +1648,7 @@ func (m *ObjectSource) Size() (n int) { n += 2 + l + sovEvents(uint64(l)) } n += 3 + n += 2 + sovEvents(uint64(m.AppSourceIdx)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -3200,6 +3215,26 @@ func (m *ObjectSource) Unmarshal(dAtA []byte) error { } m.AppMultiSourced = bool(v != 0) hasFields[0] |= uint64(0x00000002) + case 28: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AppSourceIdx", wireType) + } + m.AppSourceIdx = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AppSourceIdx |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000004) default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -3222,6 +3257,9 @@ func (m *ObjectSource) Unmarshal(dAtA []byte) error { if hasFields[0]&uint64(0x00000002) == 0 { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("appMultiSourced") } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("appSourceIdx") + } if iNdEx > l { return io.ErrUnexpectedEOF diff --git a/reposerver/apiclient/repository.pb.go b/reposerver/apiclient/repository.pb.go index bd29211801e06..1b79360fa657b 100644 --- a/reposerver/apiclient/repository.pb.go +++ b/reposerver/apiclient/repository.pb.go @@ -903,10 +903,12 @@ type ManifestResponse struct { CommitAuthor string `protobuf:"bytes,9,opt,name=commitAuthor,proto3" json:"commitAuthor,omitempty"` CommitDate *v1.Time `protobuf:"bytes,10,opt,name=commitDate,proto3" json:"commitDate,omitempty"` // A version of the application and its dependencies - ApplicationVersions *ApplicationVersions `protobuf:"bytes,11,opt,name=applicationVersions,proto3" json:"applicationVersions,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ApplicationVersions *ApplicationVersions `protobuf:"bytes,11,opt,name=applicationVersions,proto3" json:"applicationVersions,omitempty"` + // for multisourced apps will be [0,12,20], so this means that 0-11 - from first app source, 12-19 from second one, 20-x - third one + SourcesManifestsStartingIdx []int32 `protobuf:"varint,12,rep,packed,name=sourcesManifestsStartingIdx,proto3" json:"sourcesManifestsStartingIdx,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ManifestResponse) Reset() { *m = ManifestResponse{} } @@ -1012,6 +1014,13 @@ func (m *ManifestResponse) GetApplicationVersions() *ApplicationVersions { return nil } +func (m *ManifestResponse) GetSourcesManifestsStartingIdx() []int32 { + if m != nil { + return m.SourcesManifestsStartingIdx + } + return nil +} + type ListRefsRequest struct { Repo *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2819,174 +2828,176 @@ func init() { } var fileDescriptor_dd8723cfcc820480 = []byte{ - // 2664 bytes of a gzipped FileDescriptorProto + // 2690 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x4d, 0x6f, 0x1c, 0x49, 0xd5, 0xf3, 0xe9, 0x99, 0x37, 0xfe, 0xac, 0xd8, 0x4e, 0x67, 0x76, 0x63, 0xbc, 0xcd, 0x6e, 0xe4, - 0xf5, 0xee, 0xce, 0x60, 0xef, 0x47, 0x96, 0x6c, 0x58, 0xe4, 0x75, 0x12, 0x3b, 0x1f, 0x4e, 0xbc, - 0x9d, 0xec, 0xa2, 0x2c, 0x01, 0x54, 0xd3, 0x53, 0x9e, 0xe9, 0x4c, 0x7f, 0x54, 0xba, 0x7b, 0x1c, - 0x1c, 0x09, 0x09, 0x09, 0xc4, 0x85, 0x3b, 0x12, 0xdc, 0x10, 0xbf, 0x01, 0x71, 0xe4, 0xb4, 0x82, - 0x13, 0x42, 0x5c, 0x90, 0xb8, 0x80, 0xf2, 0x4b, 0x50, 0x7d, 0x74, 0x77, 0x75, 0x4f, 0x7b, 0xec, - 0xc5, 0x89, 0x17, 0xb8, 0xd8, 0x55, 0xaf, 0xab, 0xde, 0x7b, 0xf5, 0xbe, 0xea, 0xbd, 0x57, 0x03, - 0x97, 0x7c, 0x42, 0xbd, 0x80, 0xf8, 0x07, 0xc4, 0x6f, 0xf3, 0xa1, 0x15, 0x7a, 0xfe, 0xa1, 0x32, - 0x6c, 0x51, 0xdf, 0x0b, 0x3d, 0x04, 0x09, 0xa4, 0xa9, 0x0f, 0x3e, 0x0c, 0x5a, 0x96, 0xd7, 0xc6, - 0xd4, 0x6a, 0x9b, 0x9e, 0x4f, 0xda, 0x07, 0xeb, 0xed, 0x1e, 0x71, 0x89, 0x8f, 0x43, 0xd2, 0x15, - 0xeb, 0x9b, 0xef, 0x25, 0x6b, 0x1c, 0x6c, 0xf6, 0x2d, 0x97, 0xf8, 0x87, 0x6d, 0x3a, 0xe8, 0x31, - 0x40, 0xd0, 0x76, 0x48, 0x88, 0xf3, 0x76, 0xdd, 0xe9, 0x59, 0x61, 0x7f, 0xd8, 0x69, 0x99, 0x9e, - 0xd3, 0xc6, 0x7e, 0xcf, 0xa3, 0xbe, 0xf7, 0x98, 0x0f, 0xde, 0x31, 0xbb, 0xed, 0x83, 0x8d, 0x04, - 0x01, 0xa6, 0xd4, 0xb6, 0x4c, 0x1c, 0x5a, 0x9e, 0xdb, 0x3e, 0x58, 0xc7, 0x36, 0xed, 0xe3, 0x51, - 0x6c, 0xaf, 0xf4, 0x3c, 0xaf, 0x67, 0x93, 0x36, 0x9f, 0x75, 0x86, 0xfb, 0x6d, 0xe2, 0xd0, 0x50, - 0x1e, 0x48, 0xff, 0xcb, 0x34, 0xcc, 0xee, 0x62, 0xd7, 0xda, 0x27, 0x41, 0x68, 0x90, 0x27, 0x43, - 0x12, 0x84, 0xe8, 0x11, 0x94, 0xd9, 0x31, 0xb5, 0xc2, 0x4a, 0x61, 0xb5, 0xb1, 0xb1, 0xd3, 0x4a, - 0xb8, 0x69, 0x45, 0xdc, 0xf0, 0xc1, 0x8f, 0xcc, 0x6e, 0xeb, 0x60, 0xa3, 0x45, 0x07, 0xbd, 0x16, - 0xe3, 0xa6, 0xa5, 0x70, 0xd3, 0x8a, 0xb8, 0x69, 0x19, 0xb1, 0xc0, 0x0c, 0x8e, 0x15, 0x35, 0xa1, - 0xe6, 0x93, 0x03, 0x2b, 0xb0, 0x3c, 0x57, 0x2b, 0xae, 0x14, 0x56, 0xeb, 0x46, 0x3c, 0x47, 0x1a, - 0x4c, 0xba, 0xde, 0x16, 0x36, 0xfb, 0x44, 0x2b, 0xad, 0x14, 0x56, 0x6b, 0x46, 0x34, 0x45, 0x2b, - 0xd0, 0xc0, 0x94, 0xde, 0xc1, 0x1d, 0x62, 0xdf, 0x26, 0x87, 0x5a, 0x99, 0x6f, 0x54, 0x41, 0x6c, - 0x2f, 0xa6, 0xf4, 0x2e, 0x76, 0x88, 0x56, 0xe1, 0x5f, 0xa3, 0x29, 0x7a, 0x15, 0xea, 0x2e, 0x76, - 0x48, 0x40, 0xb1, 0x49, 0xb4, 0x1a, 0xff, 0x96, 0x00, 0xd0, 0x4f, 0x60, 0x5e, 0x61, 0xfc, 0xbe, - 0x37, 0xf4, 0x4d, 0xa2, 0x01, 0x3f, 0xfa, 0xbd, 0xd3, 0x1d, 0x7d, 0x33, 0x8b, 0xd6, 0x18, 0xa5, - 0x84, 0x7e, 0x08, 0x15, 0x6e, 0x53, 0x5a, 0x63, 0xa5, 0xf4, 0x42, 0xa5, 0x2d, 0xd0, 0x22, 0x17, - 0x26, 0xa9, 0x3d, 0xec, 0x59, 0x6e, 0xa0, 0x4d, 0x71, 0x0a, 0x0f, 0x4e, 0x47, 0x61, 0xcb, 0x73, - 0xf7, 0xad, 0xde, 0x2e, 0x76, 0x71, 0x8f, 0x38, 0xc4, 0x0d, 0xf7, 0x38, 0x72, 0x23, 0x22, 0x82, - 0x9e, 0xc1, 0xdc, 0x60, 0x18, 0x84, 0x9e, 0x63, 0x3d, 0x23, 0xf7, 0x28, 0xdb, 0x1b, 0x68, 0xd3, - 0x5c, 0x9a, 0x77, 0x4f, 0x47, 0xf8, 0x76, 0x06, 0xab, 0x31, 0x42, 0x87, 0x19, 0xc9, 0x60, 0xd8, - 0x21, 0x9f, 0x13, 0x9f, 0x5b, 0xd7, 0x8c, 0x30, 0x12, 0x05, 0x24, 0xcc, 0xc8, 0x92, 0xb3, 0x40, - 0x9b, 0x5d, 0x29, 0x09, 0x33, 0x8a, 0x41, 0x68, 0x15, 0x66, 0x0f, 0x88, 0x6f, 0xed, 0x1f, 0xde, - 0xb7, 0x7a, 0x2e, 0x0e, 0x87, 0x3e, 0xd1, 0xe6, 0xb8, 0x29, 0x66, 0xc1, 0xc8, 0x81, 0xe9, 0x3e, - 0xb1, 0x1d, 0x26, 0xf2, 0x2d, 0x9f, 0x74, 0x03, 0x6d, 0x9e, 0xcb, 0x77, 0xfb, 0xf4, 0x1a, 0xe4, - 0xe8, 0x8c, 0x34, 0x76, 0xc6, 0x98, 0xeb, 0x19, 0xd2, 0x53, 0x84, 0x8f, 0x20, 0xc1, 0x58, 0x06, - 0x8c, 0x2e, 0xc1, 0x4c, 0xe8, 0x63, 0x73, 0x60, 0xb9, 0xbd, 0x5d, 0x12, 0xf6, 0xbd, 0xae, 0x76, - 0x8e, 0x4b, 0x22, 0x03, 0x45, 0x26, 0x20, 0xe2, 0xe2, 0x8e, 0x4d, 0xba, 0xc2, 0x16, 0x1f, 0x1c, - 0x52, 0x12, 0x68, 0x0b, 0xfc, 0x14, 0xef, 0xb6, 0x94, 0xd8, 0x97, 0x09, 0x10, 0xad, 0xeb, 0x23, - 0xbb, 0xae, 0xbb, 0xa1, 0x7f, 0x68, 0xe4, 0xa0, 0x43, 0x03, 0x68, 0xb0, 0x73, 0x44, 0xa6, 0xb0, - 0xc8, 0x4d, 0xe1, 0xe6, 0xe9, 0x64, 0xb4, 0x93, 0x20, 0x34, 0x54, 0xec, 0xa8, 0x05, 0xa8, 0x8f, - 0x83, 0xdd, 0xa1, 0x1d, 0x5a, 0xd4, 0x26, 0x82, 0x8d, 0x40, 0x5b, 0xe2, 0x62, 0xca, 0xf9, 0x82, - 0x6e, 0x03, 0xf8, 0x64, 0x3f, 0x5a, 0x77, 0x9e, 0x9f, 0xfc, 0xad, 0x71, 0x27, 0x37, 0xe2, 0xd5, - 0xe2, 0xc4, 0xca, 0x76, 0xd4, 0x81, 0x73, 0x0a, 0xb7, 0xbb, 0x24, 0xc4, 0x5d, 0x1c, 0x62, 0x4d, - 0xe3, 0x27, 0xfe, 0x56, 0x4b, 0xdc, 0x04, 0x2d, 0xf5, 0x26, 0x48, 0x8e, 0xc9, 0x6e, 0x82, 0xd6, - 0xc1, 0x7a, 0xeb, 0x5e, 0xe7, 0x31, 0x31, 0x43, 0xb6, 0xd7, 0xc8, 0x43, 0xc6, 0x0e, 0xc8, 0x44, - 0x45, 0xcc, 0x50, 0x46, 0x14, 0x1e, 0x3a, 0x2e, 0x70, 0x33, 0xce, 0xf9, 0xc2, 0xec, 0x5d, 0x42, - 0x79, 0x60, 0x6c, 0x0a, 0x8f, 0x50, 0x40, 0xcd, 0xeb, 0x70, 0xfe, 0x08, 0x75, 0xa2, 0x39, 0x28, - 0x0d, 0xc8, 0x21, 0xbf, 0x06, 0xea, 0x06, 0x1b, 0xa2, 0x05, 0xa8, 0x1c, 0x60, 0x7b, 0x48, 0x78, - 0xe0, 0xae, 0x19, 0x62, 0x72, 0xa5, 0xf8, 0x61, 0xa1, 0xf9, 0x8b, 0x02, 0xcc, 0x66, 0x84, 0x93, - 0xb3, 0xff, 0x07, 0xea, 0xfe, 0x17, 0xe0, 0x2a, 0xfb, 0x0f, 0xb0, 0xdf, 0x23, 0xa1, 0xc2, 0x88, - 0xfe, 0xb7, 0x02, 0x68, 0x19, 0xad, 0x7d, 0xcf, 0x0a, 0xfb, 0x37, 0x2c, 0x9b, 0x04, 0xe8, 0x32, - 0x4c, 0xfa, 0x02, 0x26, 0x2f, 0xb7, 0x57, 0xc6, 0x28, 0x7b, 0x67, 0xc2, 0x88, 0x56, 0xa3, 0x8f, - 0xa1, 0xe6, 0x44, 0x0a, 0x15, 0xbc, 0xaf, 0xe4, 0xed, 0x64, 0x54, 0x22, 0x5d, 0xed, 0x4c, 0x18, - 0xf1, 0x1e, 0xf4, 0x3e, 0x54, 0xcc, 0xfe, 0xd0, 0x1d, 0xf0, 0x6b, 0xad, 0xb1, 0x71, 0xf1, 0xa8, - 0xcd, 0x5b, 0x6c, 0xd1, 0xce, 0x84, 0x21, 0x56, 0x7f, 0x52, 0x85, 0x32, 0xc5, 0x7e, 0xa8, 0xdf, - 0x80, 0x85, 0x3c, 0x12, 0xec, 0x2e, 0x35, 0xfb, 0xc4, 0x1c, 0x04, 0x43, 0x47, 0x8a, 0x39, 0x9e, - 0x23, 0x04, 0xe5, 0xc0, 0x7a, 0x26, 0x44, 0x5d, 0x32, 0xf8, 0x58, 0x7f, 0x13, 0xe6, 0x47, 0xa8, - 0x31, 0xa5, 0x0a, 0xde, 0x18, 0x86, 0x29, 0x49, 0x5a, 0x1f, 0xc2, 0xe2, 0x03, 0x2e, 0x8b, 0xf8, - 0x42, 0x39, 0x8b, 0xec, 0x40, 0xdf, 0x81, 0xa5, 0x2c, 0xd9, 0x80, 0x7a, 0x6e, 0x40, 0x98, 0xe9, - 0xf3, 0x08, 0x6c, 0x91, 0x6e, 0xf2, 0x95, 0x73, 0x51, 0x33, 0x72, 0xbe, 0xe8, 0xbf, 0x2b, 0xc2, - 0x92, 0x41, 0x02, 0xcf, 0x3e, 0x20, 0x51, 0x78, 0x3c, 0x9b, 0x04, 0xe7, 0xfb, 0x50, 0xc2, 0x94, - 0x4a, 0x33, 0xb9, 0xf9, 0xc2, 0x52, 0x08, 0x83, 0x61, 0x45, 0x6f, 0xc3, 0x3c, 0x76, 0x3a, 0x56, - 0x6f, 0xe8, 0x0d, 0x83, 0xe8, 0x58, 0xdc, 0xa8, 0xea, 0xc6, 0xe8, 0x07, 0xe6, 0xfe, 0x01, 0xf7, - 0xc8, 0x9b, 0x6e, 0x97, 0xfc, 0x98, 0x67, 0x4d, 0x25, 0x43, 0x05, 0xe9, 0x26, 0x9c, 0x1f, 0x11, - 0x92, 0x14, 0xb8, 0x9a, 0xa8, 0x15, 0x32, 0x89, 0x5a, 0x2e, 0x1b, 0xc5, 0x23, 0xd8, 0xd0, 0x7f, - 0x5a, 0x80, 0x5a, 0x64, 0x77, 0x68, 0x0d, 0xe6, 0x4c, 0xcf, 0xa1, 0x96, 0x4d, 0xba, 0x11, 0x4c, - 0xa2, 0x1f, 0x81, 0x33, 0xfe, 0x7d, 0xfc, 0x34, 0x5e, 0x26, 0x08, 0xa8, 0x20, 0x66, 0xe5, 0x14, - 0x87, 0x7d, 0x29, 0x02, 0x3e, 0x66, 0x30, 0xdb, 0x72, 0x09, 0x3f, 0x6e, 0xc5, 0xe0, 0x63, 0xfd, - 0x0b, 0x98, 0xba, 0x46, 0x28, 0x71, 0xbb, 0xc4, 0x35, 0x2d, 0x12, 0xf0, 0x35, 0x9e, 0x39, 0x90, - 0x94, 0xf9, 0x98, 0xc1, 0xba, 0x84, 0x06, 0x92, 0x0c, 0x1f, 0x23, 0x1d, 0xa6, 0x58, 0x0c, 0xb0, - 0x7c, 0x9e, 0xec, 0x04, 0x92, 0x4e, 0x0a, 0xa6, 0x07, 0x70, 0x4e, 0xd1, 0x53, 0x9c, 0x49, 0x2c, - 0x03, 0x60, 0x4a, 0xa3, 0x64, 0x44, 0x10, 0x52, 0x20, 0xe8, 0x2a, 0x4c, 0x75, 0x15, 0x96, 0xa4, - 0xc1, 0x68, 0x6a, 0x68, 0x50, 0x59, 0x36, 0x52, 0xab, 0xf5, 0x2f, 0x4b, 0x30, 0x97, 0x04, 0x2c, - 0xa9, 0xb2, 0x0d, 0xa8, 0x3b, 0x12, 0x16, 0x68, 0x05, 0x7e, 0x9d, 0x2d, 0xe4, 0x46, 0xb8, 0x64, - 0x59, 0x3a, 0x3b, 0x2e, 0x66, 0xb3, 0xe3, 0x25, 0xa8, 0x8a, 0xb2, 0x48, 0x9e, 0x5c, 0xce, 0x52, + 0xf5, 0xee, 0xce, 0x60, 0xef, 0x27, 0xd9, 0xb0, 0xe0, 0x75, 0x12, 0x3b, 0x1f, 0x4e, 0xbc, 0x9d, + 0xec, 0xa2, 0x2c, 0x01, 0x54, 0xd3, 0x53, 0x9e, 0xe9, 0x4c, 0x7f, 0x54, 0xba, 0x7b, 0x9c, 0x75, + 0x24, 0x24, 0x24, 0x10, 0x1c, 0xb8, 0x23, 0xc1, 0x0d, 0xf1, 0x1b, 0x10, 0x47, 0x4e, 0x08, 0x4e, + 0x08, 0x71, 0x41, 0xe2, 0x02, 0xca, 0x2f, 0x41, 0xf5, 0xd1, 0xdd, 0xd5, 0x3d, 0xed, 0xb1, 0x17, + 0x27, 0x5e, 0xe0, 0x62, 0x57, 0xbd, 0x7e, 0xf5, 0xea, 0xd5, 0xfb, 0xaa, 0xf7, 0x5e, 0x0d, 0x5c, + 0xf2, 0x09, 0xf5, 0x02, 0xe2, 0x1f, 0x10, 0xbf, 0xcd, 0x87, 0x56, 0xe8, 0xf9, 0x87, 0xca, 0xb0, + 0x45, 0x7d, 0x2f, 0xf4, 0x10, 0x24, 0x90, 0xa6, 0x3e, 0xf8, 0x20, 0x68, 0x59, 0x5e, 0x1b, 0x53, + 0xab, 0x6d, 0x7a, 0x3e, 0x69, 0x1f, 0xac, 0xb7, 0x7b, 0xc4, 0x25, 0x3e, 0x0e, 0x49, 0x57, 0xe0, + 0x37, 0xdf, 0x49, 0x70, 0x1c, 0x6c, 0xf6, 0x2d, 0x97, 0xf8, 0x87, 0x6d, 0x3a, 0xe8, 0x31, 0x40, + 0xd0, 0x76, 0x48, 0x88, 0xf3, 0x56, 0xdd, 0xee, 0x59, 0x61, 0x7f, 0xd8, 0x69, 0x99, 0x9e, 0xd3, + 0xc6, 0x7e, 0xcf, 0xa3, 0xbe, 0xf7, 0x88, 0x0f, 0xde, 0x32, 0xbb, 0xed, 0x83, 0x8d, 0x84, 0x00, + 0xa6, 0xd4, 0xb6, 0x4c, 0x1c, 0x5a, 0x9e, 0xdb, 0x3e, 0x58, 0xc7, 0x36, 0xed, 0xe3, 0x51, 0x6a, + 0x2f, 0xf5, 0x3c, 0xaf, 0x67, 0x93, 0x36, 0x9f, 0x75, 0x86, 0xfb, 0x6d, 0xe2, 0xd0, 0x50, 0x1e, + 0x48, 0xff, 0xcb, 0x34, 0xcc, 0xee, 0x62, 0xd7, 0xda, 0x27, 0x41, 0x68, 0x90, 0xc7, 0x43, 0x12, + 0x84, 0xe8, 0x21, 0x94, 0xd9, 0x31, 0xb5, 0xc2, 0x4a, 0x61, 0xb5, 0xb1, 0xb1, 0xd3, 0x4a, 0xb8, + 0x69, 0x45, 0xdc, 0xf0, 0xc1, 0x0f, 0xcd, 0x6e, 0xeb, 0x60, 0xa3, 0x45, 0x07, 0xbd, 0x16, 0xe3, + 0xa6, 0xa5, 0x70, 0xd3, 0x8a, 0xb8, 0x69, 0x19, 0xb1, 0xc0, 0x0c, 0x4e, 0x15, 0x35, 0xa1, 0xe6, + 0x93, 0x03, 0x2b, 0xb0, 0x3c, 0x57, 0x2b, 0xae, 0x14, 0x56, 0xeb, 0x46, 0x3c, 0x47, 0x1a, 0x4c, + 0xba, 0xde, 0x16, 0x36, 0xfb, 0x44, 0x2b, 0xad, 0x14, 0x56, 0x6b, 0x46, 0x34, 0x45, 0x2b, 0xd0, + 0xc0, 0x94, 0xde, 0xc6, 0x1d, 0x62, 0xdf, 0x22, 0x87, 0x5a, 0x99, 0x2f, 0x54, 0x41, 0x6c, 0x2d, + 0xa6, 0xf4, 0x0e, 0x76, 0x88, 0x56, 0xe1, 0x5f, 0xa3, 0x29, 0x7a, 0x19, 0xea, 0x2e, 0x76, 0x48, + 0x40, 0xb1, 0x49, 0xb4, 0x1a, 0xff, 0x96, 0x00, 0xd0, 0x8f, 0x60, 0x5e, 0x61, 0xfc, 0x9e, 0x37, + 0xf4, 0x4d, 0xa2, 0x01, 0x3f, 0xfa, 0xdd, 0xd3, 0x1d, 0x7d, 0x33, 0x4b, 0xd6, 0x18, 0xdd, 0x09, + 0xfd, 0x00, 0x2a, 0xdc, 0xa6, 0xb4, 0xc6, 0x4a, 0xe9, 0xb9, 0x4a, 0x5b, 0x90, 0x45, 0x2e, 0x4c, + 0x52, 0x7b, 0xd8, 0xb3, 0xdc, 0x40, 0x9b, 0xe2, 0x3b, 0xdc, 0x3f, 0xdd, 0x0e, 0x5b, 0x9e, 0xbb, + 0x6f, 0xf5, 0x76, 0xb1, 0x8b, 0x7b, 0xc4, 0x21, 0x6e, 0xb8, 0xc7, 0x89, 0x1b, 0xd1, 0x26, 0xe8, + 0x29, 0xcc, 0x0d, 0x86, 0x41, 0xe8, 0x39, 0xd6, 0x53, 0x72, 0x97, 0xb2, 0xb5, 0x81, 0x36, 0xcd, + 0xa5, 0x79, 0xe7, 0x74, 0x1b, 0xdf, 0xca, 0x50, 0x35, 0x46, 0xf6, 0x61, 0x46, 0x32, 0x18, 0x76, + 0xc8, 0x67, 0xc4, 0xe7, 0xd6, 0x35, 0x23, 0x8c, 0x44, 0x01, 0x09, 0x33, 0xb2, 0xe4, 0x2c, 0xd0, + 0x66, 0x57, 0x4a, 0xc2, 0x8c, 0x62, 0x10, 0x5a, 0x85, 0xd9, 0x03, 0xe2, 0x5b, 0xfb, 0x87, 0xf7, + 0xac, 0x9e, 0x8b, 0xc3, 0xa1, 0x4f, 0xb4, 0x39, 0x6e, 0x8a, 0x59, 0x30, 0x72, 0x60, 0xba, 0x4f, + 0x6c, 0x87, 0x89, 0x7c, 0xcb, 0x27, 0xdd, 0x40, 0x9b, 0xe7, 0xf2, 0xdd, 0x3e, 0xbd, 0x06, 0x39, + 0x39, 0x23, 0x4d, 0x9d, 0x31, 0xe6, 0x7a, 0x86, 0xf4, 0x14, 0xe1, 0x23, 0x48, 0x30, 0x96, 0x01, + 0xa3, 0x4b, 0x30, 0x13, 0xfa, 0xd8, 0x1c, 0x58, 0x6e, 0x6f, 0x97, 0x84, 0x7d, 0xaf, 0xab, 0x9d, + 0xe3, 0x92, 0xc8, 0x40, 0x91, 0x09, 0x88, 0xb8, 0xb8, 0x63, 0x93, 0xae, 0xb0, 0xc5, 0xfb, 0x87, + 0x94, 0x04, 0xda, 0x02, 0x3f, 0xc5, 0xdb, 0x2d, 0x25, 0xf6, 0x65, 0x02, 0x44, 0xeb, 0xda, 0xc8, + 0xaa, 0x6b, 0x6e, 0xe8, 0x1f, 0x1a, 0x39, 0xe4, 0xd0, 0x00, 0x1a, 0xec, 0x1c, 0x91, 0x29, 0x2c, + 0x72, 0x53, 0xb8, 0x71, 0x3a, 0x19, 0xed, 0x24, 0x04, 0x0d, 0x95, 0x3a, 0x6a, 0x01, 0xea, 0xe3, + 0x60, 0x77, 0x68, 0x87, 0x16, 0xb5, 0x89, 0x60, 0x23, 0xd0, 0x96, 0xb8, 0x98, 0x72, 0xbe, 0xa0, + 0x5b, 0x00, 0x3e, 0xd9, 0x8f, 0xf0, 0xce, 0xf3, 0x93, 0xbf, 0x31, 0xee, 0xe4, 0x46, 0x8c, 0x2d, + 0x4e, 0xac, 0x2c, 0x47, 0x1d, 0x38, 0xa7, 0x70, 0xbb, 0x4b, 0x42, 0xdc, 0xc5, 0x21, 0xd6, 0x34, + 0x7e, 0xe2, 0x6f, 0xb4, 0xc4, 0x4d, 0xd0, 0x52, 0x6f, 0x82, 0xe4, 0x98, 0xec, 0x26, 0x68, 0x1d, + 0xac, 0xb7, 0xee, 0x76, 0x1e, 0x11, 0x33, 0x64, 0x6b, 0x8d, 0x3c, 0x62, 0xec, 0x80, 0x4c, 0x54, + 0xc4, 0x0c, 0x65, 0x44, 0xe1, 0xa1, 0xe3, 0x02, 0x37, 0xe3, 0x9c, 0x2f, 0xcc, 0xde, 0x25, 0x94, + 0x07, 0xc6, 0xa6, 0xf0, 0x08, 0x05, 0xd4, 0xbc, 0x06, 0xe7, 0x8f, 0x50, 0x27, 0x9a, 0x83, 0xd2, + 0x80, 0x1c, 0xf2, 0x6b, 0xa0, 0x6e, 0xb0, 0x21, 0x5a, 0x80, 0xca, 0x01, 0xb6, 0x87, 0x84, 0x07, + 0xee, 0x9a, 0x21, 0x26, 0x97, 0x8b, 0x1f, 0x14, 0x9a, 0x3f, 0x2b, 0xc0, 0x6c, 0x46, 0x38, 0x39, + 0xeb, 0xbf, 0xaf, 0xae, 0x7f, 0x0e, 0xae, 0xb2, 0x7f, 0x1f, 0xfb, 0x3d, 0x12, 0x2a, 0x8c, 0xe8, + 0x7f, 0x2b, 0x80, 0x96, 0xd1, 0xda, 0x77, 0xad, 0xb0, 0x7f, 0xdd, 0xb2, 0x49, 0x80, 0xde, 0x87, + 0x49, 0x5f, 0xc0, 0xe4, 0xe5, 0xf6, 0xd2, 0x18, 0x65, 0xef, 0x4c, 0x18, 0x11, 0x36, 0xfa, 0x08, + 0x6a, 0x4e, 0xa4, 0x50, 0xc1, 0xfb, 0x4a, 0xde, 0x4a, 0xb6, 0x4b, 0xa4, 0xab, 0x9d, 0x09, 0x23, + 0x5e, 0x83, 0xde, 0x85, 0x8a, 0xd9, 0x1f, 0xba, 0x03, 0x7e, 0xad, 0x35, 0x36, 0x2e, 0x1e, 0xb5, + 0x78, 0x8b, 0x21, 0xed, 0x4c, 0x18, 0x02, 0xfb, 0xe3, 0x2a, 0x94, 0x29, 0xf6, 0x43, 0xfd, 0x3a, + 0x2c, 0xe4, 0x6d, 0xc1, 0xee, 0x52, 0xb3, 0x4f, 0xcc, 0x41, 0x30, 0x74, 0xa4, 0x98, 0xe3, 0x39, + 0x42, 0x50, 0x0e, 0xac, 0xa7, 0x42, 0xd4, 0x25, 0x83, 0x8f, 0xf5, 0xd7, 0x61, 0x7e, 0x64, 0x37, + 0xa6, 0x54, 0xc1, 0x1b, 0xa3, 0x30, 0x25, 0xb7, 0xd6, 0x87, 0xb0, 0x78, 0x9f, 0xcb, 0x22, 0xbe, + 0x50, 0xce, 0x22, 0x3b, 0xd0, 0x77, 0x60, 0x29, 0xbb, 0x6d, 0x40, 0x3d, 0x37, 0x20, 0xcc, 0xf4, + 0x79, 0x04, 0xb6, 0x48, 0x37, 0xf9, 0xca, 0xb9, 0xa8, 0x19, 0x39, 0x5f, 0xf4, 0xdf, 0x16, 0x61, + 0xc9, 0x20, 0x81, 0x67, 0x1f, 0x90, 0x28, 0x3c, 0x9e, 0x4d, 0x82, 0xf3, 0x3d, 0x28, 0x61, 0x4a, + 0xa5, 0x99, 0xdc, 0x78, 0x6e, 0x29, 0x84, 0xc1, 0xa8, 0xa2, 0x37, 0x61, 0x1e, 0x3b, 0x1d, 0xab, + 0x37, 0xf4, 0x86, 0x41, 0x74, 0x2c, 0x6e, 0x54, 0x75, 0x63, 0xf4, 0x03, 0x73, 0xff, 0x80, 0x7b, + 0xe4, 0x0d, 0xb7, 0x4b, 0xbe, 0xe0, 0x59, 0x53, 0xc9, 0x50, 0x41, 0xba, 0x09, 0xe7, 0x47, 0x84, + 0x24, 0x05, 0xae, 0x26, 0x6a, 0x85, 0x4c, 0xa2, 0x96, 0xcb, 0x46, 0xf1, 0x08, 0x36, 0xf4, 0x1f, + 0x17, 0xa0, 0x16, 0xd9, 0x1d, 0x5a, 0x83, 0x39, 0xd3, 0x73, 0xa8, 0x65, 0x93, 0x6e, 0x04, 0x93, + 0xe4, 0x47, 0xe0, 0x8c, 0x7f, 0x1f, 0x3f, 0x89, 0xd1, 0xc4, 0x06, 0x2a, 0x88, 0x59, 0x39, 0xc5, + 0x61, 0x5f, 0x8a, 0x80, 0x8f, 0x19, 0xcc, 0xb6, 0x5c, 0xc2, 0x8f, 0x5b, 0x31, 0xf8, 0x58, 0xff, + 0x1c, 0xa6, 0xae, 0x12, 0x4a, 0xdc, 0x2e, 0x71, 0x4d, 0x8b, 0x04, 0x1c, 0xc7, 0x33, 0x07, 0x72, + 0x67, 0x3e, 0x66, 0xb0, 0x2e, 0xa1, 0x81, 0xdc, 0x86, 0x8f, 0x91, 0x0e, 0x53, 0x2c, 0x06, 0x58, + 0x3e, 0x4f, 0x76, 0x02, 0xb9, 0x4f, 0x0a, 0xa6, 0x07, 0x70, 0x4e, 0xd1, 0x53, 0x9c, 0x49, 0x2c, + 0x03, 0x60, 0x4a, 0xa3, 0x64, 0x44, 0x6c, 0xa4, 0x40, 0xd0, 0x15, 0x98, 0xea, 0x2a, 0x2c, 0x49, + 0x83, 0xd1, 0xd4, 0xd0, 0xa0, 0xb2, 0x6c, 0xa4, 0xb0, 0xf5, 0x9f, 0x97, 0x61, 0x2e, 0x09, 0x58, + 0x52, 0x65, 0x1b, 0x50, 0x77, 0x24, 0x2c, 0xd0, 0x0a, 0xfc, 0x3a, 0x5b, 0xc8, 0x8d, 0x70, 0x09, + 0x5a, 0x3a, 0x3b, 0x2e, 0x66, 0xb3, 0xe3, 0x25, 0xa8, 0x8a, 0xb2, 0x48, 0x9e, 0x5c, 0xce, 0x52, 0xc6, 0x51, 0xce, 0x18, 0xc7, 0x32, 0x40, 0x10, 0xdf, 0x25, 0x5a, 0x55, 0x1c, 0x3c, 0x81, 0x30, - 0x99, 0x8a, 0x5c, 0xca, 0x20, 0xc1, 0xd0, 0x0e, 0xb5, 0x49, 0x21, 0x53, 0x15, 0x86, 0x5e, 0x87, - 0x69, 0xd3, 0x73, 0x1c, 0x2b, 0xdc, 0x25, 0x41, 0x80, 0x7b, 0x51, 0xde, 0x9e, 0x06, 0x32, 0x4c, - 0x02, 0xb0, 0x39, 0x0c, 0xfb, 0x9e, 0xaf, 0xd5, 0x05, 0x26, 0x15, 0x86, 0x6e, 0x01, 0x88, 0xf9, - 0x35, 0x1c, 0x46, 0x89, 0xfd, 0xda, 0xc9, 0x6e, 0xe3, 0x07, 0x96, 0x43, 0x0c, 0x65, 0x37, 0xfa, - 0x34, 0x75, 0xc5, 0xc7, 0x69, 0x64, 0x83, 0x23, 0xfd, 0x86, 0x2a, 0xe9, 0x1c, 0x83, 0x30, 0xf2, - 0xf6, 0xea, 0x1e, 0xcc, 0xde, 0xb1, 0x98, 0x0a, 0xf7, 0x83, 0xb3, 0x89, 0xb0, 0x1f, 0x40, 0x99, - 0x11, 0x63, 0x1a, 0xec, 0xf8, 0xd8, 0x35, 0xfb, 0x44, 0x98, 0x4a, 0xdd, 0x88, 0xe7, 0xcc, 0x13, - 0x42, 0xdc, 0x63, 0x26, 0xc9, 0xe0, 0x7c, 0xac, 0xff, 0xa1, 0x28, 0x38, 0xdd, 0xa4, 0x34, 0xf8, - 0xfa, 0x2b, 0xc5, 0xfc, 0xdc, 0xb5, 0x34, 0x9a, 0xbb, 0x66, 0x58, 0xfe, 0x2a, 0xb9, 0xeb, 0x0b, - 0xca, 0x8d, 0xf4, 0x21, 0x4c, 0x6e, 0x52, 0xca, 0x18, 0x41, 0xeb, 0x50, 0xc6, 0x94, 0x46, 0xbe, - 0x79, 0x31, 0x63, 0x31, 0x6c, 0x09, 0xfb, 0x2f, 0x59, 0xe2, 0x4b, 0x9b, 0x97, 0xa1, 0x1e, 0x83, - 0x8e, 0x23, 0x5b, 0x57, 0xc9, 0xae, 0x00, 0x88, 0xe2, 0xec, 0xa6, 0xbb, 0xef, 0x31, 0x95, 0x32, - 0xaf, 0x8e, 0x02, 0x1e, 0x1b, 0xeb, 0x57, 0xa2, 0x15, 0x9c, 0xb7, 0xb7, 0xa1, 0x62, 0x85, 0xc4, - 0x89, 0x98, 0x5b, 0x52, 0x99, 0x4b, 0x10, 0x19, 0x62, 0x91, 0xfe, 0xa7, 0x1a, 0x5c, 0x60, 0x1a, - 0xbb, 0xcf, 0xe3, 0xc1, 0x26, 0xa5, 0xd7, 0x48, 0x88, 0x2d, 0x3b, 0xf8, 0x74, 0x48, 0xfc, 0xc3, - 0x97, 0x6c, 0x18, 0x3d, 0xa8, 0x8a, 0x70, 0x22, 0x63, 0xe6, 0x0b, 0xaf, 0xd3, 0x25, 0xfa, 0xa4, - 0x38, 0x2f, 0xbd, 0x9c, 0xe2, 0x3c, 0xaf, 0x58, 0x2e, 0x9f, 0x51, 0xb1, 0x7c, 0x74, 0xbf, 0x44, - 0xe9, 0xc2, 0x54, 0xd3, 0x5d, 0x98, 0x9c, 0x1a, 0x74, 0xf2, 0xa4, 0x35, 0x68, 0x2d, 0xb7, 0x06, - 0x75, 0x72, 0xfd, 0xb8, 0xce, 0xc5, 0xfd, 0x1d, 0xd5, 0x02, 0x8f, 0xb4, 0xb5, 0xd3, 0x54, 0xa3, - 0xf0, 0x52, 0xab, 0xd1, 0xcf, 0x52, 0xd5, 0xa5, 0xe8, 0xef, 0xbc, 0x7f, 0xb2, 0x33, 0x8d, 0xa9, - 0x33, 0xff, 0xef, 0x2a, 0xb6, 0x9f, 0xf3, 0x44, 0x9d, 0x7a, 0x89, 0x0c, 0xe2, 0x7c, 0x86, 0xdd, - 0x43, 0x2c, 0x87, 0x90, 0x41, 0x8b, 0x8d, 0xd1, 0x5b, 0x50, 0x66, 0x42, 0x96, 0x95, 0xd4, 0x79, - 0x55, 0x9e, 0x4c, 0x13, 0x9b, 0x94, 0xde, 0xa7, 0xc4, 0x34, 0xf8, 0x22, 0x74, 0x05, 0xea, 0xb1, - 0xe1, 0x4b, 0xcf, 0x7a, 0x55, 0xdd, 0x11, 0xfb, 0x49, 0xb4, 0x2d, 0x59, 0xce, 0xf6, 0x76, 0x2d, - 0x9f, 0x98, 0xbc, 0xce, 0xa8, 0x8c, 0xee, 0xbd, 0x16, 0x7d, 0x8c, 0xf7, 0xc6, 0xcb, 0xd1, 0x3a, - 0x54, 0x45, 0x43, 0x8c, 0x7b, 0x50, 0x63, 0xe3, 0xc2, 0x68, 0x30, 0x8d, 0x76, 0xc9, 0x85, 0xfa, - 0x97, 0x05, 0x78, 0x2d, 0x31, 0x88, 0xc8, 0x9b, 0xa2, 0x52, 0xef, 0xeb, 0xbf, 0x71, 0x2f, 0xc1, - 0x0c, 0xaf, 0x2d, 0x93, 0xbe, 0x98, 0x68, 0xd1, 0x66, 0xa0, 0xfa, 0xef, 0x0b, 0xf0, 0xc6, 0xe8, - 0x39, 0xb6, 0xfa, 0xd8, 0x0f, 0x63, 0xf5, 0x9e, 0xc5, 0x59, 0xa2, 0x0b, 0xaf, 0x98, 0x5c, 0x78, - 0xa9, 0xf3, 0x95, 0xd2, 0xe7, 0xd3, 0xff, 0x58, 0x84, 0x86, 0x62, 0x40, 0x79, 0x17, 0x26, 0xcb, - 0x6c, 0xb9, 0xdd, 0xf2, 0x6e, 0x02, 0xbf, 0x14, 0xea, 0x86, 0x02, 0x41, 0x03, 0x00, 0x8a, 0x7d, - 0xec, 0x90, 0x90, 0xf8, 0x2c, 0x92, 0x33, 0x8f, 0xbf, 0x7d, 0xfa, 0xe8, 0xb2, 0x17, 0xe1, 0x34, - 0x14, 0xf4, 0x2c, 0x35, 0xe7, 0xa4, 0x03, 0x19, 0xbf, 0xe5, 0x0c, 0x3d, 0x85, 0x99, 0x7d, 0xcb, - 0x26, 0x7b, 0x09, 0x23, 0x55, 0xce, 0xc8, 0xbd, 0xd3, 0x33, 0x72, 0x43, 0xc5, 0x6b, 0x64, 0xc8, - 0xe8, 0x6b, 0x30, 0x97, 0xf5, 0x27, 0xc6, 0xa4, 0xe5, 0xe0, 0x5e, 0x2c, 0x2d, 0x39, 0xd3, 0x11, - 0xcc, 0x65, 0xfd, 0x47, 0xff, 0x67, 0x11, 0x16, 0x63, 0x74, 0x9b, 0xae, 0xeb, 0x0d, 0x5d, 0x93, - 0x97, 0x58, 0xb9, 0xba, 0x58, 0x80, 0x4a, 0x68, 0x85, 0x76, 0x9c, 0xf8, 0xf0, 0x09, 0xbb, 0xbb, - 0x42, 0xcf, 0xb3, 0x43, 0x8b, 0x4a, 0x05, 0x47, 0x53, 0xa1, 0x7b, 0x5e, 0xb5, 0x75, 0x79, 0x24, - 0xa8, 0x19, 0xf1, 0x9c, 0x7d, 0x63, 0x59, 0x0d, 0xaf, 0x57, 0x84, 0x30, 0xe3, 0x39, 0xb7, 0x7b, - 0xcf, 0xb6, 0x89, 0xc9, 0xc4, 0xa1, 0x54, 0x34, 0x19, 0x28, 0xaf, 0x94, 0x42, 0xdf, 0x72, 0x7b, - 0xb2, 0x9e, 0x91, 0x33, 0xc6, 0x27, 0xf6, 0x7d, 0x7c, 0xa8, 0xd5, 0xb8, 0x00, 0xc4, 0x04, 0x5d, - 0x85, 0x92, 0x83, 0xa9, 0xbc, 0xe8, 0xd6, 0x52, 0xd1, 0x21, 0x4f, 0x02, 0xad, 0x5d, 0x4c, 0xc5, - 0x4d, 0xc0, 0xb6, 0x35, 0x3f, 0x60, 0xf5, 0x34, 0xfd, 0xea, 0x29, 0xe1, 0x63, 0x98, 0x4e, 0x05, - 0x1f, 0xf4, 0x10, 0x96, 0x12, 0x8b, 0x52, 0x09, 0xca, 0x24, 0xf0, 0xb5, 0x63, 0x39, 0x33, 0x8e, - 0x40, 0xa0, 0x3f, 0x81, 0x79, 0x66, 0x32, 0xdc, 0xf1, 0xcf, 0xa8, 0xb4, 0xf9, 0x08, 0xea, 0x31, - 0xc9, 0x5c, 0x9b, 0x69, 0x42, 0xed, 0x20, 0x2a, 0xda, 0x44, 0x6d, 0x13, 0xcf, 0xf5, 0x4d, 0x40, - 0x2a, 0xbf, 0xf2, 0x06, 0x7a, 0x2b, 0x9d, 0x14, 0x2f, 0x66, 0xaf, 0x1b, 0xbe, 0x3c, 0xca, 0x89, - 0xff, 0x5e, 0x84, 0xd9, 0x6d, 0x8b, 0xb7, 0xd6, 0xce, 0x28, 0xc8, 0xad, 0xc1, 0x5c, 0x30, 0xec, - 0x38, 0x5e, 0x77, 0x68, 0x13, 0x99, 0x14, 0xc8, 0x9b, 0x7e, 0x04, 0x3e, 0x2e, 0xf8, 0xc5, 0x6d, - 0x94, 0xb2, 0xd2, 0x46, 0xb9, 0x0a, 0x17, 0xee, 0x92, 0xa7, 0xf2, 0x3c, 0xdb, 0xb6, 0xd7, 0xe9, - 0x58, 0x6e, 0x2f, 0x22, 0x52, 0xe1, 0x44, 0x8e, 0x5e, 0x90, 0x97, 0x2a, 0x56, 0xf3, 0x53, 0xc5, - 0xb8, 0x1d, 0xb0, 0xc5, 0x0b, 0x6d, 0x99, 0x51, 0xa6, 0x60, 0xfa, 0xcf, 0x0a, 0x30, 0x97, 0x48, - 0x56, 0xea, 0xe6, 0xb2, 0xf0, 0x21, 0xa1, 0x99, 0x37, 0x54, 0xcd, 0x64, 0x97, 0xfe, 0xe7, 0xee, - 0x33, 0xa5, 0xba, 0xcf, 0x2f, 0x8b, 0xb0, 0xb8, 0x6d, 0x85, 0x51, 0xe0, 0xb2, 0xfe, 0xd7, 0xb4, - 0x9c, 0xa3, 0x93, 0xf2, 0xc9, 0x74, 0x52, 0xc9, 0xd1, 0x49, 0x0b, 0x96, 0xb2, 0xc2, 0x90, 0x8a, - 0x59, 0x80, 0x0a, 0xb3, 0xa0, 0xa8, 0xaf, 0x20, 0x26, 0xfa, 0x3f, 0xaa, 0x70, 0xf1, 0x33, 0xda, - 0xc5, 0x61, 0xdc, 0x6a, 0xbc, 0xe1, 0xf9, 0x7b, 0xec, 0xd3, 0xd9, 0x48, 0x31, 0xf3, 0x84, 0x5c, - 0x1c, 0xfb, 0x84, 0x5c, 0x1a, 0xf3, 0x84, 0x5c, 0x3e, 0xd1, 0x13, 0x72, 0xe5, 0xcc, 0x9e, 0x90, - 0x47, 0x6b, 0xad, 0x6a, 0x6e, 0xad, 0xf5, 0x30, 0x55, 0x8f, 0x4c, 0x72, 0xb7, 0xf9, 0xb6, 0xea, - 0x36, 0x63, 0xb5, 0x33, 0xf6, 0xed, 0x2b, 0xf3, 0xf2, 0x5a, 0x3b, 0xf6, 0xe5, 0xb5, 0x3e, 0xfa, - 0xf2, 0x9a, 0xff, 0x78, 0x07, 0x47, 0x3e, 0xde, 0x5d, 0x82, 0x99, 0xe0, 0xd0, 0x35, 0x49, 0x37, - 0x6e, 0x40, 0x37, 0xc4, 0xb1, 0xd3, 0xd0, 0x94, 0x47, 0x4c, 0x65, 0x3c, 0x22, 0xb6, 0xd4, 0x69, - 0xc5, 0x52, 0xf3, 0xfc, 0x64, 0x26, 0xd7, 0x4f, 0xfe, 0x7b, 0x8a, 0xa8, 0xcf, 0x61, 0xf9, 0x28, - 0xed, 0x49, 0xa7, 0xd4, 0x60, 0xd2, 0xec, 0x63, 0xb7, 0xc7, 0xdb, 0x7d, 0xbc, 0xaa, 0x97, 0xd3, - 0x71, 0x59, 0xbf, 0xfe, 0xeb, 0x22, 0x2c, 0x6e, 0xf1, 0x75, 0xd9, 0x47, 0x14, 0xc5, 0x59, 0x0a, - 0x63, 0x9c, 0x65, 0xa4, 0xa3, 0xbc, 0x0a, 0xb3, 0xe6, 0xd0, 0xf7, 0x59, 0xea, 0x90, 0x8e, 0x53, - 0x59, 0x30, 0x0b, 0x7b, 0x94, 0x31, 0xa2, 0xbe, 0x31, 0x08, 0xdf, 0x1b, 0x81, 0x27, 0x8a, 0xac, - 0xa8, 0x8a, 0x8c, 0x02, 0x4a, 0xf5, 0xa5, 0xa4, 0x1b, 0xef, 0xc1, 0x52, 0x56, 0x34, 0xc7, 0x3f, - 0x9d, 0x6c, 0xfc, 0xb6, 0x01, 0xf3, 0x49, 0x7d, 0xc4, 0xfe, 0x5a, 0x26, 0x41, 0xf7, 0x60, 0x6e, - 0x5b, 0xfe, 0x6e, 0x27, 0x7e, 0xdb, 0x18, 0xf7, 0x38, 0xd9, 0x7c, 0x35, 0xff, 0xa3, 0x60, 0x40, - 0x9f, 0x40, 0x26, 0x5c, 0xc8, 0x22, 0x4c, 0xde, 0x41, 0x5f, 0x1f, 0x83, 0x39, 0x5e, 0x75, 0x1c, - 0x89, 0xd5, 0x02, 0x7a, 0x08, 0x33, 0xe9, 0xd7, 0x3a, 0x94, 0x4a, 0x18, 0x73, 0x1f, 0x10, 0x9b, - 0xfa, 0xb8, 0x25, 0x31, 0xff, 0x8f, 0x98, 0x63, 0xa5, 0x1e, 0xa6, 0x90, 0x9e, 0xee, 0x9d, 0xe4, - 0x3d, 0xed, 0x35, 0xbf, 0x39, 0x76, 0x4d, 0x8c, 0xfd, 0x23, 0xa8, 0x45, 0x5d, 0xf7, 0xb4, 0x98, - 0x33, 0xbd, 0xf8, 0xe6, 0x5c, 0x1a, 0xdf, 0x7e, 0xa0, 0x4f, 0xa0, 0x8f, 0xc5, 0xe6, 0x4d, 0x4a, - 0x73, 0x36, 0x2b, 0xbd, 0xe6, 0xe6, 0xb9, 0x9c, 0xfe, 0xae, 0x3e, 0x81, 0xbe, 0x0b, 0x0d, 0x36, - 0xda, 0x93, 0xbf, 0x98, 0x59, 0x6a, 0x89, 0x1f, 0x68, 0xb5, 0xa2, 0x1f, 0x68, 0xb5, 0xae, 0x3b, - 0x34, 0x3c, 0x6c, 0xe6, 0x34, 0x60, 0x25, 0x82, 0x47, 0x30, 0xbd, 0x4d, 0xc2, 0xa4, 0x5f, 0x82, - 0xde, 0x38, 0x51, 0x57, 0xa9, 0xa9, 0x67, 0x97, 0x8d, 0xb6, 0x5c, 0xf4, 0x09, 0xf4, 0xab, 0x02, - 0x9c, 0xdb, 0x26, 0x61, 0xb6, 0x03, 0x81, 0xde, 0xc9, 0x27, 0x72, 0x44, 0xa7, 0xa2, 0x79, 0xf7, - 0xb4, 0xde, 0x96, 0x46, 0xab, 0x4f, 0xa0, 0xdf, 0x14, 0xe0, 0xbc, 0xc2, 0x98, 0xda, 0x52, 0x40, - 0xeb, 0xe3, 0x99, 0xcb, 0x69, 0x3f, 0x34, 0x6f, 0x9d, 0xf2, 0x87, 0x50, 0x0a, 0x4a, 0x7d, 0x02, - 0xed, 0x71, 0x9d, 0x24, 0x15, 0x04, 0xba, 0x98, 0x5b, 0x2a, 0xc4, 0xd4, 0x97, 0x8f, 0xfa, 0x1c, - 0xeb, 0xe1, 0x16, 0x34, 0xb6, 0x49, 0x18, 0xa5, 0xb2, 0x69, 0x4b, 0xcb, 0x54, 0x19, 0x69, 0x57, - 0xcd, 0x66, 0xbf, 0xdc, 0x62, 0xe6, 0x05, 0x2e, 0x25, 0x5d, 0x4b, 0xfb, 0x6a, 0x6e, 0x5e, 0x9b, - 0xb6, 0x98, 0xfc, 0x6c, 0x4f, 0x9f, 0x40, 0x4f, 0x60, 0x29, 0xff, 0xf2, 0x41, 0x6f, 0x9e, 0x38, - 0xbd, 0x68, 0xae, 0x9d, 0x64, 0x69, 0xe6, 0x40, 0xe9, 0xf0, 0x9b, 0x3e, 0x50, 0xee, 0xad, 0x95, - 0x3e, 0x50, 0x7e, 0xf4, 0xd6, 0x27, 0x3e, 0xd9, 0xfc, 0xf3, 0xf3, 0xe5, 0xc2, 0x5f, 0x9f, 0x2f, - 0x17, 0xfe, 0xf5, 0x7c, 0xb9, 0xf0, 0xc5, 0xbb, 0xc7, 0xfc, 0x1c, 0x53, 0xf9, 0xed, 0x28, 0xa6, - 0x96, 0x69, 0x5b, 0xc4, 0x0d, 0x3b, 0x55, 0xee, 0xcd, 0xef, 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, - 0xb7, 0x12, 0x5d, 0x05, 0x5a, 0x2a, 0x00, 0x00, + 0x99, 0x8a, 0x5c, 0xca, 0x20, 0xc1, 0xd0, 0x0e, 0xb5, 0x49, 0x21, 0x53, 0x15, 0x86, 0x5e, 0x85, + 0x69, 0xd3, 0x73, 0x1c, 0x2b, 0xdc, 0x25, 0x41, 0x80, 0x7b, 0x51, 0xde, 0x9e, 0x06, 0x32, 0x4a, + 0x02, 0xb0, 0x39, 0x0c, 0xfb, 0x9e, 0xaf, 0xd5, 0x05, 0x25, 0x15, 0x86, 0x6e, 0x02, 0x88, 0xf9, + 0x55, 0x1c, 0x46, 0x89, 0xfd, 0xda, 0xc9, 0x6e, 0xe3, 0xfb, 0x96, 0x43, 0x0c, 0x65, 0x35, 0xfa, + 0x24, 0x75, 0xc5, 0xc7, 0x69, 0x64, 0x83, 0x13, 0xfd, 0x9a, 0x2a, 0xe9, 0x1c, 0x83, 0x30, 0xf2, + 0xd6, 0xa2, 0xef, 0xc0, 0x4b, 0x42, 0x34, 0x41, 0xa4, 0x9c, 0xe0, 0x5e, 0x88, 0xfd, 0xd0, 0x72, + 0x7b, 0x37, 0xba, 0x5f, 0xf0, 0x9c, 0xbd, 0x62, 0x8c, 0x43, 0xd1, 0x3d, 0x98, 0xbd, 0x6d, 0x31, + 0x23, 0xd8, 0x0f, 0xce, 0x26, 0x46, 0xbf, 0x07, 0x65, 0xb6, 0x19, 0xb3, 0x81, 0x8e, 0x8f, 0x5d, + 0xb3, 0x4f, 0x84, 0xb1, 0xd5, 0x8d, 0x78, 0xce, 0x7c, 0x29, 0xc4, 0x3d, 0x66, 0xd4, 0x0c, 0xce, + 0xc7, 0xfa, 0xef, 0x8b, 0x82, 0xd3, 0x4d, 0x4a, 0x83, 0xaf, 0xbe, 0xd6, 0xcc, 0xcf, 0x7e, 0x4b, + 0xa3, 0xd9, 0x6f, 0x86, 0xe5, 0x2f, 0x93, 0xfd, 0x3e, 0xa7, 0xec, 0x4a, 0x1f, 0xc2, 0xe4, 0x26, + 0xa5, 0x8c, 0x11, 0xb4, 0x0e, 0x65, 0x4c, 0x69, 0xe4, 0xdd, 0x17, 0x33, 0x36, 0xc7, 0x50, 0xd8, + 0x7f, 0xc9, 0x12, 0x47, 0x6d, 0xbe, 0x0f, 0xf5, 0x18, 0x74, 0xdc, 0xb6, 0x75, 0x75, 0xdb, 0x15, + 0x00, 0x51, 0xde, 0xdd, 0x70, 0xf7, 0x3d, 0xa6, 0x52, 0x16, 0x17, 0xa2, 0x90, 0xc9, 0xc6, 0xfa, + 0xe5, 0x08, 0x83, 0xf3, 0xf6, 0x26, 0x54, 0xac, 0x90, 0x38, 0x11, 0x73, 0x4b, 0x2a, 0x73, 0x09, + 0x21, 0x43, 0x20, 0xe9, 0x7f, 0xaa, 0xc1, 0x05, 0xa6, 0xb1, 0x7b, 0x3c, 0xa2, 0x6c, 0x52, 0x7a, + 0x95, 0x84, 0xd8, 0xb2, 0x83, 0x4f, 0x86, 0xc4, 0x3f, 0x7c, 0xc1, 0x86, 0xd1, 0x83, 0xaa, 0x70, + 0x29, 0x19, 0x75, 0x9f, 0x7b, 0xa5, 0x2f, 0xc9, 0x27, 0xe5, 0x7d, 0xe9, 0xc5, 0x94, 0xf7, 0x79, + 0xe5, 0x76, 0xf9, 0x8c, 0xca, 0xed, 0xa3, 0x3b, 0x2e, 0x4a, 0x1f, 0xa7, 0x9a, 0xee, 0xe3, 0xe4, + 0x54, 0xb1, 0x93, 0x27, 0xad, 0x62, 0x6b, 0xb9, 0x55, 0xac, 0x93, 0xeb, 0xc7, 0x75, 0x2e, 0xee, + 0x6f, 0xa9, 0x16, 0x78, 0xa4, 0xad, 0x9d, 0xa6, 0x9e, 0x85, 0x17, 0x5a, 0xcf, 0x7e, 0x9a, 0xaa, + 0x4f, 0x45, 0x87, 0xe8, 0xdd, 0x93, 0x9d, 0x69, 0x4c, 0xa5, 0xfa, 0x7f, 0x57, 0xf3, 0xfd, 0x94, + 0xa7, 0xfa, 0xd4, 0x4b, 0x64, 0x10, 0x67, 0x44, 0xec, 0x1e, 0x62, 0x59, 0x88, 0x0c, 0x5a, 0x6c, + 0x8c, 0xde, 0x80, 0x32, 0x13, 0xb2, 0xac, 0xc5, 0xce, 0xab, 0xf2, 0x64, 0x9a, 0xd8, 0xa4, 0xf4, + 0x1e, 0x25, 0xa6, 0xc1, 0x91, 0xd0, 0x65, 0xa8, 0xc7, 0x86, 0x2f, 0x3d, 0xeb, 0x65, 0x75, 0x45, + 0xec, 0x27, 0xd1, 0xb2, 0x04, 0x9d, 0xad, 0xed, 0x5a, 0x3e, 0x31, 0x79, 0xa5, 0x52, 0x19, 0x5d, + 0x7b, 0x35, 0xfa, 0x18, 0xaf, 0x8d, 0xd1, 0xd1, 0x3a, 0x54, 0x45, 0x4b, 0x8d, 0x7b, 0x50, 0x63, + 0xe3, 0xc2, 0x68, 0x30, 0x8d, 0x56, 0x49, 0x44, 0xfd, 0x8f, 0x05, 0x78, 0x25, 0x31, 0x88, 0xc8, + 0x9b, 0xa2, 0x62, 0xf1, 0xab, 0xbf, 0x71, 0x2f, 0xc1, 0x0c, 0xaf, 0x4e, 0x93, 0xce, 0x9a, 0x68, + 0xf2, 0x66, 0xa0, 0xfa, 0xef, 0x0a, 0xf0, 0xda, 0xe8, 0x39, 0xb6, 0xfa, 0xd8, 0x0f, 0x63, 0xf5, + 0x9e, 0xc5, 0x59, 0xa2, 0x0b, 0xaf, 0x98, 0x5c, 0x78, 0xa9, 0xf3, 0x95, 0xd2, 0xe7, 0xd3, 0xff, + 0x50, 0x84, 0x86, 0x62, 0x40, 0x79, 0x17, 0x26, 0xcb, 0x8d, 0xb9, 0xdd, 0xf2, 0x7e, 0x04, 0xbf, + 0x14, 0xea, 0x86, 0x02, 0x41, 0x03, 0x00, 0x8a, 0x7d, 0xec, 0x90, 0x90, 0xf8, 0x2c, 0x92, 0x33, + 0x8f, 0xbf, 0x75, 0xfa, 0xe8, 0xb2, 0x17, 0xd1, 0x34, 0x14, 0xf2, 0x2c, 0xb9, 0xe7, 0x5b, 0x07, + 0x32, 0x7e, 0xcb, 0x19, 0x7a, 0x02, 0x33, 0xfb, 0x96, 0x4d, 0xf6, 0x12, 0x46, 0xaa, 0x9c, 0x91, + 0xbb, 0xa7, 0x67, 0xe4, 0xba, 0x4a, 0xd7, 0xc8, 0x6c, 0xa3, 0xaf, 0xc1, 0x5c, 0xd6, 0x9f, 0x18, + 0x93, 0x96, 0x83, 0x7b, 0xb1, 0xb4, 0xe4, 0x4c, 0x47, 0x30, 0x97, 0xf5, 0x1f, 0xfd, 0x9f, 0x45, + 0x58, 0x8c, 0xc9, 0x6d, 0xba, 0xae, 0x37, 0x74, 0x4d, 0x5e, 0xa4, 0xe5, 0xea, 0x62, 0x01, 0x2a, + 0xa1, 0x15, 0xda, 0x71, 0xe2, 0xc3, 0x27, 0xec, 0xee, 0x0a, 0x3d, 0xcf, 0x0e, 0x2d, 0x2a, 0x15, + 0x1c, 0x4d, 0x85, 0xee, 0x79, 0xdd, 0xd7, 0xe5, 0x91, 0xa0, 0x66, 0xc4, 0x73, 0xf6, 0x8d, 0x65, + 0x35, 0xbc, 0xe2, 0x11, 0xc2, 0x8c, 0xe7, 0xdc, 0xee, 0x3d, 0xdb, 0x26, 0x26, 0x13, 0x87, 0x52, + 0x13, 0x65, 0xa0, 0xbc, 0xd6, 0x0a, 0x7d, 0xcb, 0xed, 0xc9, 0x8a, 0x48, 0xce, 0x18, 0x9f, 0xd8, + 0xf7, 0xf1, 0xa1, 0x56, 0xe3, 0x02, 0x10, 0x13, 0x74, 0x05, 0x4a, 0x0e, 0xa6, 0xf2, 0xa2, 0x5b, + 0x4b, 0x45, 0x87, 0x3c, 0x09, 0xb4, 0x76, 0x31, 0x15, 0x37, 0x01, 0x5b, 0xd6, 0x7c, 0x8f, 0x55, + 0xe4, 0xf4, 0xcb, 0xa7, 0x84, 0x8f, 0x60, 0x3a, 0x15, 0x7c, 0xd0, 0x03, 0x58, 0x4a, 0x2c, 0x4a, + 0xdd, 0x50, 0x26, 0x81, 0xaf, 0x1c, 0xcb, 0x99, 0x71, 0x04, 0x01, 0xfd, 0x31, 0xcc, 0x33, 0x93, + 0xe1, 0x8e, 0x7f, 0x46, 0xa5, 0xcd, 0x87, 0x50, 0x8f, 0xb7, 0xcc, 0xb5, 0x99, 0x26, 0xd4, 0x0e, + 0xa2, 0xb2, 0x4f, 0xd4, 0x36, 0xf1, 0x5c, 0xdf, 0x04, 0xa4, 0xf2, 0x2b, 0x6f, 0xa0, 0x37, 0xd2, + 0x49, 0xf1, 0x62, 0xf6, 0xba, 0xe1, 0xe8, 0x51, 0x4e, 0xfc, 0xf7, 0x22, 0xcc, 0x6e, 0x5b, 0xbc, + 0x39, 0x77, 0x46, 0x41, 0x6e, 0x0d, 0xe6, 0x82, 0x61, 0xc7, 0xf1, 0xba, 0x43, 0x9b, 0xc8, 0xa4, + 0x40, 0xde, 0xf4, 0x23, 0xf0, 0x71, 0xc1, 0x2f, 0x6e, 0xc4, 0x94, 0x95, 0x46, 0xcc, 0x15, 0xb8, + 0x70, 0x87, 0x3c, 0x91, 0xe7, 0xd9, 0xb6, 0xbd, 0x4e, 0xc7, 0x72, 0x7b, 0xd1, 0x26, 0x15, 0xbe, + 0xc9, 0xd1, 0x08, 0x79, 0xa9, 0x62, 0x35, 0x3f, 0x55, 0x8c, 0x1b, 0x0a, 0x5b, 0xbc, 0x54, 0x97, + 0x19, 0x65, 0x0a, 0xa6, 0xff, 0xa4, 0x00, 0x73, 0x89, 0x64, 0xa5, 0x6e, 0xde, 0x17, 0x3e, 0x24, + 0x34, 0xf3, 0x9a, 0xaa, 0x99, 0x2c, 0xea, 0x7f, 0xee, 0x3e, 0x53, 0xaa, 0xfb, 0xfc, 0xa2, 0x08, + 0x8b, 0xdb, 0x56, 0x18, 0x05, 0x2e, 0xeb, 0x7f, 0x4d, 0xcb, 0x39, 0x3a, 0x29, 0x9f, 0x4c, 0x27, + 0x95, 0x1c, 0x9d, 0xb4, 0x60, 0x29, 0x2b, 0x0c, 0xa9, 0x98, 0x05, 0xa8, 0x30, 0x0b, 0x8a, 0xfa, + 0x0a, 0x62, 0xa2, 0xff, 0xa3, 0x0a, 0x17, 0x3f, 0xa5, 0x5d, 0x1c, 0xc6, 0xcd, 0xca, 0xeb, 0x9e, + 0xbf, 0xc7, 0x3e, 0x9d, 0x8d, 0x14, 0x33, 0x8f, 0xd0, 0xc5, 0xb1, 0x8f, 0xd0, 0xa5, 0x31, 0x8f, + 0xd0, 0xe5, 0x13, 0x3d, 0x42, 0x57, 0xce, 0xec, 0x11, 0x7a, 0xb4, 0xd6, 0xaa, 0xe6, 0xd6, 0x5a, + 0x0f, 0x52, 0xf5, 0xc8, 0x24, 0x77, 0x9b, 0x6f, 0xaa, 0x6e, 0x33, 0x56, 0x3b, 0x63, 0x5f, 0xcf, + 0x32, 0x6f, 0xb7, 0xb5, 0x63, 0xdf, 0x6e, 0xeb, 0xa3, 0x6f, 0xb7, 0xf9, 0xcf, 0x7f, 0x70, 0xe4, + 0xf3, 0xdf, 0x25, 0x98, 0x09, 0x0e, 0x5d, 0x93, 0x74, 0xe3, 0x16, 0x76, 0x43, 0x1c, 0x3b, 0x0d, + 0x4d, 0x79, 0xc4, 0x54, 0xc6, 0x23, 0x62, 0x4b, 0x9d, 0x56, 0x2c, 0x35, 0xcf, 0x4f, 0x66, 0x72, + 0xfd, 0xe4, 0xbf, 0xa7, 0x88, 0xfa, 0x0c, 0x96, 0x8f, 0xd2, 0x9e, 0x74, 0x4a, 0x0d, 0x26, 0xcd, + 0x3e, 0x76, 0x7b, 0xbc, 0xdd, 0xc7, 0xab, 0x7a, 0x39, 0x1d, 0x97, 0xf5, 0xeb, 0xbf, 0x2a, 0xc2, + 0xe2, 0x16, 0xc7, 0xcb, 0x3e, 0xc3, 0x28, 0xce, 0x52, 0x18, 0xe3, 0x2c, 0x23, 0x3d, 0xe9, 0x55, + 0x98, 0x35, 0x87, 0xbe, 0xcf, 0x52, 0x87, 0x74, 0x9c, 0xca, 0x82, 0x59, 0xd8, 0xa3, 0x8c, 0x11, + 0xf5, 0x95, 0x42, 0xf8, 0xde, 0x08, 0x3c, 0x51, 0x64, 0x45, 0x55, 0x64, 0x14, 0x50, 0xaa, 0x2f, + 0x24, 0xdd, 0x78, 0x07, 0x96, 0xb2, 0xa2, 0x39, 0xfe, 0xf1, 0x65, 0xe3, 0x37, 0x0d, 0x98, 0x4f, + 0xea, 0x23, 0xf6, 0xd7, 0x32, 0x09, 0xba, 0x0b, 0x73, 0xdb, 0xf2, 0x97, 0x3f, 0xf1, 0xeb, 0xc8, + 0xb8, 0xe7, 0xcd, 0xe6, 0xcb, 0xf9, 0x1f, 0x05, 0x03, 0xfa, 0x04, 0x32, 0xe1, 0x42, 0x96, 0x60, + 0xf2, 0x92, 0xfa, 0xea, 0x18, 0xca, 0x31, 0xd6, 0x71, 0x5b, 0xac, 0x16, 0xd0, 0x03, 0x98, 0x49, + 0xbf, 0xf7, 0xa1, 0x54, 0xc2, 0x98, 0xfb, 0x04, 0xd9, 0xd4, 0xc7, 0xa1, 0xc4, 0xfc, 0x3f, 0x64, + 0x8e, 0x95, 0x7a, 0xda, 0x42, 0x7a, 0xba, 0x77, 0x92, 0xf7, 0x38, 0xd8, 0xfc, 0xfa, 0x58, 0x9c, + 0x98, 0xfa, 0x87, 0x50, 0x8b, 0xba, 0xee, 0x69, 0x31, 0x67, 0x7a, 0xf1, 0xcd, 0xb9, 0x34, 0xbd, + 0xfd, 0x40, 0x9f, 0x40, 0x1f, 0x89, 0xc5, 0x9b, 0x94, 0xe6, 0x2c, 0x56, 0x7a, 0xcd, 0xcd, 0x73, + 0x39, 0xfd, 0x5d, 0x7d, 0x02, 0x7d, 0x1b, 0x1a, 0x6c, 0xb4, 0x27, 0x7f, 0x73, 0xb3, 0xd4, 0x12, + 0x3f, 0xf1, 0x6a, 0x45, 0x3f, 0xf1, 0x6a, 0x5d, 0x73, 0x68, 0x78, 0xd8, 0xcc, 0x69, 0xc0, 0x4a, + 0x02, 0x0f, 0x61, 0x7a, 0x9b, 0x84, 0x49, 0xbf, 0x04, 0xbd, 0x76, 0xa2, 0xae, 0x52, 0x53, 0xcf, + 0xa2, 0x8d, 0xb6, 0x5c, 0xf4, 0x09, 0xf4, 0xcb, 0x02, 0x9c, 0xdb, 0x26, 0x61, 0xb6, 0x03, 0x81, + 0xde, 0xca, 0xdf, 0xe4, 0x88, 0x4e, 0x45, 0xf3, 0xce, 0x69, 0xbd, 0x2d, 0x4d, 0x56, 0x9f, 0x40, + 0xbf, 0x2e, 0xc0, 0x79, 0x85, 0x31, 0xb5, 0xa5, 0x80, 0xd6, 0xc7, 0x33, 0x97, 0xd3, 0x7e, 0x68, + 0xde, 0x3c, 0xe5, 0x4f, 0xa9, 0x14, 0x92, 0xfa, 0x04, 0xda, 0xe3, 0x3a, 0x49, 0x2a, 0x08, 0x74, + 0x31, 0xb7, 0x54, 0x88, 0x77, 0x5f, 0x3e, 0xea, 0x73, 0xac, 0x87, 0x9b, 0xd0, 0xd8, 0x26, 0x61, + 0x94, 0xca, 0xa6, 0x2d, 0x2d, 0x53, 0x65, 0xa4, 0x5d, 0x35, 0x9b, 0xfd, 0x72, 0x8b, 0x99, 0x17, + 0xb4, 0x94, 0x74, 0x2d, 0xed, 0xab, 0xb9, 0x79, 0x6d, 0xda, 0x62, 0xf2, 0xb3, 0x3d, 0x7d, 0x02, + 0x3d, 0x86, 0xa5, 0xfc, 0xcb, 0x07, 0xbd, 0x7e, 0xe2, 0xf4, 0xa2, 0xb9, 0x76, 0x12, 0xd4, 0xcc, + 0x81, 0xd2, 0xe1, 0x37, 0x7d, 0xa0, 0xdc, 0x5b, 0x2b, 0x7d, 0xa0, 0xfc, 0xe8, 0xad, 0x4f, 0x7c, + 0xbc, 0xf9, 0xe7, 0x67, 0xcb, 0x85, 0xbf, 0x3e, 0x5b, 0x2e, 0xfc, 0xeb, 0xd9, 0x72, 0xe1, 0xf3, + 0xb7, 0x8f, 0xf9, 0x41, 0xa7, 0xf2, 0xeb, 0x53, 0x4c, 0x2d, 0xd3, 0xb6, 0x88, 0x1b, 0x76, 0xaa, + 0xdc, 0x9b, 0xdf, 0xfe, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2a, 0xb4, 0x26, 0x19, 0x9c, 0x2a, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4465,6 +4476,25 @@ func (m *ManifestResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.SourcesManifestsStartingIdx) > 0 { + dAtA15 := make([]byte, len(m.SourcesManifestsStartingIdx)*10) + var j14 int + for _, num1 := range m.SourcesManifestsStartingIdx { + num := uint64(num1) + for num >= 1<<7 { + dAtA15[j14] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j14++ + } + dAtA15[j14] = uint8(num) + j14++ + } + i -= j14 + copy(dAtA[i:], dAtA15[:j14]) + i = encodeVarintRepository(dAtA, i, uint64(j14)) + i-- + dAtA[i] = 0x62 + } if m.ApplicationVersions != nil { { size, err := m.ApplicationVersions.MarshalToSizedBuffer(dAtA[:i]) @@ -6590,6 +6620,13 @@ func (m *ManifestResponse) Size() (n int) { l = m.ApplicationVersions.Size() n += 1 + l + sovRepository(uint64(l)) } + if len(m.SourcesManifestsStartingIdx) > 0 { + l = 0 + for _, e := range m.SourcesManifestsStartingIdx { + l += sovRepository(uint64(e)) + } + n += 1 + sovRepository(uint64(l)) + l + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9852,6 +9889,82 @@ func (m *ManifestResponse) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType == 0 { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SourcesManifestsStartingIdx = append(m.SourcesManifestsStartingIdx, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.SourcesManifestsStartingIdx) == 0 { + m.SourcesManifestsStartingIdx = make([]int32, 0, elementCount) + } + for iNdEx < postIndex { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SourcesManifestsStartingIdx = append(m.SourcesManifestsStartingIdx, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field SourcesManifestsStartingIdx", wireType) + } default: iNdEx = preIndex skippy, err := skipRepository(dAtA[iNdEx:]) diff --git a/reposerver/repository/repository.proto b/reposerver/repository/repository.proto index ad295e95712a1..90de0e1a7c4b7 100644 --- a/reposerver/repository/repository.proto +++ b/reposerver/repository/repository.proto @@ -128,6 +128,8 @@ message ManifestResponse { k8s.io.apimachinery.pkg.apis.meta.v1.Time commitDate = 10; // A version of the application and its dependencies ApplicationVersions applicationVersions = 11; + // for multisourced apps will be [0,12,20], so this means that 0-11 - from first app source, 12-19 from second one, 20-x - third one + repeated int32 sourcesManifestsStartingIdx = 12; } message ListRefsRequest { diff --git a/server/application/application.go b/server/application/application.go index edf5fbe754427..8e9d765cfb04f 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -574,6 +574,7 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan manifestInfo.Manifests[i].CompiledManifest = string(data) } } + manifests.SourcesManifestsStartingIdx = append(manifests.SourcesManifestsStartingIdx, int32(len(manifests.Manifests))) manifests.Manifests = append(manifests.Manifests, manifestInfo.Manifests...) } if manifestInfosAppVersionsIdx >= 0 && manifestInfos[manifestInfosAppVersionsIdx] != nil { diff --git a/server/application/events.proto b/server/application/events.proto index 70095fbadf685..7e29da7a62cd1 100644 --- a/server/application/events.proto +++ b/server/application/events.proto @@ -77,6 +77,7 @@ message ObjectSource { required string destServer = 25 [(gogoproto.nullable) = false]; optional string destName = 26; required bool appMultiSourced = 27 [(gogoproto.nullable) = false]; + required int32 appSourceIdx = 28 [(gogoproto.nullable) = false]; } /** From ba5c91c631c43603a0b4676688fb025bb847eb56 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Fri, 8 Nov 2024 12:01:50 +0200 Subject: [PATCH 19/26] event-reporter: updated changelog --- changelog/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/changelog/CHANGELOG.md b/changelog/CHANGELOG.md index ac73e1b0295b1..f26d54ef9a0d6 100644 --- a/changelog/CHANGELOG.md +++ b/changelog/CHANGELOG.md @@ -1,2 +1,2 @@ -### Fixed -- fix: failures in update revision for path should not affect sync \ No newline at end of file +### Features +- feat(event-reporter): multisourced apps support improvements: reporting syncOperationRevisions, detecting correct resource sourceIdx, reporting correct git commit info \ No newline at end of file From b348e9a41316b2b3c3d01cdffd6042374183168f Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Tue, 12 Nov 2024 21:02:31 +0200 Subject: [PATCH 20/26] CR-25949: reposerver(repository): fixed repeated resources generation for ApplicationSourceTypeDirectory --- changelog/CHANGELOG.md | 5 +++-- reposerver/repository/repository.go | 15 +++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/changelog/CHANGELOG.md b/changelog/CHANGELOG.md index f26d54ef9a0d6..cdcea60b76fca 100644 --- a/changelog/CHANGELOG.md +++ b/changelog/CHANGELOG.md @@ -1,2 +1,3 @@ -### Features -- feat(event-reporter): multisourced apps support improvements: reporting syncOperationRevisions, detecting correct resource sourceIdx, reporting correct git commit info \ No newline at end of file +### Updates +- feat(event-reporter): multisourced apps support improvements: reporting syncOperationRevisions, detecting correct resource sourceIdx, reporting correct git commit info +- fix(repo-server): fixed repeated resources generation for ApplicationSourceTypeDirectory \ No newline at end of file diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index 62b95137c439c..530a20f014d92 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -1812,13 +1812,6 @@ var manifestFile = regexp.MustCompile(`^.*\.(yaml|yml|json|jsonnet)$`) // findManifests looks at all yaml files in a directory and unmarshals them into a list of unstructured objects func findManifests(logCtx *log.Entry, appPath string, repoRoot string, env *v1alpha1.Env, directory v1alpha1.ApplicationSourceDirectory, enabledManifestGeneration map[string]bool, maxCombinedManifestQuantity resource.Quantity) ([]manifest, error) { - absRepoRoot, err := filepath.Abs(repoRoot) - if err != nil { - return nil, err - } - - var manifests []manifest - // Validate the directory before loading any manifests to save memory. potentiallyValidManifests, err := getPotentiallyValidManifests(logCtx, appPath, repoRoot, directory.Recurse, directory.Include, directory.Exclude, maxCombinedManifestQuantity) if err != nil { @@ -1826,7 +1819,11 @@ func findManifests(logCtx *log.Entry, appPath string, repoRoot string, env *v1al return nil, fmt.Errorf("failed to get potentially valid manifests: %w", err) } - var objs []*unstructured.Unstructured + absRepoRoot, err := filepath.Abs(repoRoot) + if err != nil { + return nil, err + } + var manifests []manifest for _, potentiallyValidManifest := range potentiallyValidManifests { manifestPath := potentiallyValidManifest.path manifestFileInfo := potentiallyValidManifest.fileInfo @@ -1836,6 +1833,7 @@ func findManifests(logCtx *log.Entry, appPath string, repoRoot string, env *v1al repoRelPath, _ := filepath.Rel(absRepoRoot, absPath) if strings.HasSuffix(manifestFileInfo.Name(), ".jsonnet") { + var objs []*unstructured.Unstructured if !discovery.IsManifestGenerationEnabled(v1alpha1.ApplicationSourceTypeDirectory, enabledManifestGeneration) { continue } @@ -1875,6 +1873,7 @@ func findManifests(logCtx *log.Entry, appPath string, repoRoot string, env *v1al }) } } else { + var objs []*unstructured.Unstructured err := getObjsFromYAMLOrJson(logCtx, manifestPath, manifestFileInfo.Name(), &objs) if err != nil { return nil, err From 78094d62482d489e03c8952d9e5a598f2b87299f Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 13 Nov 2024 13:27:43 +0200 Subject: [PATCH 21/26] event-reporter: fixed lint issues --- event_reporter/application/client.go | 2 +- event_reporter/controller/controller.go | 3 ++- event_reporter/reporter/application_event_reporter_test.go | 7 ++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/event_reporter/application/client.go b/event_reporter/application/client.go index e87131cd9f9c6..86b0b53cb952c 100644 --- a/event_reporter/application/client.go +++ b/event_reporter/application/client.go @@ -128,7 +128,7 @@ func (c *httpApplicationClient) GetManifests(ctx context.Context, in *appclient. } if in.SourcePositions != nil && len(in.SourcePositions) > 0 { for _, sourcePosition := range in.SourcePositions { - params = fmt.Sprintf("%s&sourcePositions=%s", params, sourcePosition) + params = fmt.Sprintf("%s&sourcePositions=%d", params, sourcePosition) } } if in.Revisions != nil && len(in.Revisions) > 0 { diff --git a/event_reporter/controller/controller.go b/event_reporter/controller/controller.go index 597f8220c429b..262f55a7a7c34 100644 --- a/event_reporter/controller/controller.go +++ b/event_reporter/controller/controller.go @@ -2,11 +2,12 @@ package controller import ( "context" - "github.com/argoproj/argo-cd/v2/util/db" "math" "strings" "time" + "github.com/argoproj/argo-cd/v2/util/db" + appclient "github.com/argoproj/argo-cd/v2/event_reporter/application" log "github.com/sirupsen/logrus" diff --git a/event_reporter/reporter/application_event_reporter_test.go b/event_reporter/reporter/application_event_reporter_test.go index c9c0d710b4623..acda38922bc65 100644 --- a/event_reporter/reporter/application_event_reporter_test.go +++ b/event_reporter/reporter/application_event_reporter_test.go @@ -4,13 +4,14 @@ import ( "context" "encoding/json" "fmt" - "github.com/argoproj/argo-cd/v2/util/db" - "github.com/argoproj/argo-cd/v2/util/settings" - "k8s.io/client-go/kubernetes/fake" "net/http" "testing" "time" + "github.com/argoproj/argo-cd/v2/util/db" + "github.com/argoproj/argo-cd/v2/util/settings" + "k8s.io/client-go/kubernetes/fake" + "github.com/aws/smithy-go/ptr" "github.com/sirupsen/logrus" "github.com/stretchr/testify/mock" From 9f4fa6b76b31f1c7c41043fbc2de78e309683fc7 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 13 Nov 2024 13:48:44 +0200 Subject: [PATCH 22/26] CR-25949: reposerver(repository): fixed unit tests after fix of repeated resources generation for ApplicationSourceTypeDirectory --- reposerver/repository/repository_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index f99f26d6ec8f1..371f4fc523921 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -661,7 +661,7 @@ func TestGenerateManifestsUseExactRevision(t *testing.T) { res1, err := service.GenerateManifest(context.Background(), &q) require.NoError(t, err) - assert.Len(t, res1.Manifests, 6) + assert.Len(t, res1.Manifests, 4) assert.Equal(t, "abc", gitClient.Calls[0].Arguments[0]) } @@ -677,7 +677,7 @@ func TestRecurseManifestsInDir(t *testing.T) { res1, err := service.GenerateManifest(context.Background(), &q) require.NoError(t, err) - assert.Len(t, res1.Manifests, 6) + assert.Len(t, res1.Manifests, 4) } func TestInvalidManifestsInDir(t *testing.T) { @@ -2199,7 +2199,7 @@ func TestFindResources(t *testing.T) { }, { name: "Include Everything", include: "*.yaml", - expectedNames: []string{"nginx-deployment", "nginx-deployment", "nginx-deployment-sub"}, + expectedNames: []string{"nginx-deployment", "nginx-deployment-sub"}, }, { name: "Include Subdirectory", include: "**/*.yaml", @@ -2254,10 +2254,10 @@ func TestFindManifests_Exclude_NothingMatches(t *testing.T) { }, map[string]bool{}, resource.MustParse("0")) require.NoError(t, err) - require.Len(t, objs, 3) + require.Len(t, objs, 2) assert.ElementsMatch(t, - []string{"nginx-deployment", "nginx-deployment-sub"}, []string{objs[0].obj.GetName(), objs[2].obj.GetName()}) + []string{"nginx-deployment", "nginx-deployment-sub"}, []string{objs[0].obj.GetName(), objs[1].obj.GetName()}) } func tempDir(t *testing.T) string { @@ -2606,7 +2606,7 @@ func Test_findManifests(t *testing.T) { t.Run("recursion when recursion is enabled", func(t *testing.T) { recurse := argoappv1.ApplicationSourceDirectory{Recurse: true} manifests, err := findManifests(logCtx, "./testdata/recurse", "./testdata/recurse", nil, recurse, nil, resource.MustParse("0")) - assert.Len(t, manifests, 6) + assert.Len(t, manifests, 4) require.NoError(t, err) }) @@ -2665,7 +2665,7 @@ func Test_findManifests(t *testing.T) { t.Run("group of files should be limited at precisely the sum of their size", func(t *testing.T) { // There is a total of 10 files, each file being 10 bytes. manifests, err := findManifests(logCtx, "./testdata/several-files", "./testdata/several-files", nil, noRecurse, nil, resource.MustParse("365")) - assert.Len(t, manifests, 55) + assert.Len(t, manifests, 10) require.NoError(t, err) manifests, err = findManifests(logCtx, "./testdata/several-files", "./testdata/several-files", nil, noRecurse, nil, resource.MustParse("364")) @@ -2676,7 +2676,7 @@ func Test_findManifests(t *testing.T) { t.Run("jsonnet isn't counted against size limit", func(t *testing.T) { // Each file is 36 bytes. Only the 36-byte json file should be counted against the limit. manifests, err := findManifests(logCtx, "./testdata/jsonnet-and-json", "./testdata/jsonnet-and-json", nil, noRecurse, nil, resource.MustParse("36")) - assert.Len(t, manifests, 3) + assert.Len(t, manifests, 2) require.NoError(t, err) manifests, err = findManifests(logCtx, "./testdata/jsonnet-and-json", "./testdata/jsonnet-and-json", nil, noRecurse, nil, resource.MustParse("35")) From 4b88afa873d8d41a2b8c6dd33a89ea31d44bf204 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 13 Nov 2024 17:19:04 +0200 Subject: [PATCH 23/26] event-reporter: changes after pr review --- .../application_event_reporter_test.go | 1 + event_reporter/reporter/event_payload.go | 8 +- event_reporter/reporter/types.go | 4 + event_reporter/utils/app.go | 63 +++++ event_reporter/utils/app_revision.go | 37 +-- event_reporter/utils/app_revision_test.go | 221 ++++++++++++++++++ 6 files changed, 316 insertions(+), 18 deletions(-) create mode 100644 event_reporter/utils/app.go diff --git a/event_reporter/reporter/application_event_reporter_test.go b/event_reporter/reporter/application_event_reporter_test.go index acda38922bc65..b2414628c4cdd 100644 --- a/event_reporter/reporter/application_event_reporter_test.go +++ b/event_reporter/reporter/application_event_reporter_test.go @@ -10,6 +10,7 @@ import ( "github.com/argoproj/argo-cd/v2/util/db" "github.com/argoproj/argo-cd/v2/util/settings" + "k8s.io/client-go/kubernetes/fake" "github.com/aws/smithy-go/ptr" diff --git a/event_reporter/reporter/event_payload.go b/event_reporter/reporter/event_payload.go index 81c140e7ac179..22bb9efdc067b 100644 --- a/event_reporter/reporter/event_payload.go +++ b/event_reporter/reporter/event_payload.go @@ -165,10 +165,14 @@ func getResourceSourceRepoUrl( specCopy.Source = reportedEntityParentApp.app.Status.Sync.ComparedTo.Source.DeepCopy() if specCopy.HasMultipleSources() { - if rr.appSourceIdx == -1 { + if !rr.appSourceIdxDetected() { return "" } - return specCopy.GetSourcePtrByIndex(int(rr.appSourceIdx)).RepoURL + source := specCopy.GetSourcePtrByIndex(int(rr.appSourceIdx)) + if source == nil { + return "" + } + return source.RepoURL } return specCopy.Source.RepoURL diff --git a/event_reporter/reporter/types.go b/event_reporter/reporter/types.go index dddfba5ebd03c..810f26253ec1a 100644 --- a/event_reporter/reporter/types.go +++ b/event_reporter/reporter/types.go @@ -43,3 +43,7 @@ func (rr *ReportedResource) GetApiVersion() string { return apiVersion } + +func (rr *ReportedResource) appSourceIdxDetected() bool { + return rr.appSourceIdx >= 0 +} diff --git a/event_reporter/utils/app.go b/event_reporter/utils/app.go new file mode 100644 index 0000000000000..84dbe01d15b27 --- /dev/null +++ b/event_reporter/utils/app.go @@ -0,0 +1,63 @@ +package utils + +import appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" + +type AppRevisionsFieldNames string + +var AppRevisionFieldName AppRevisionsFieldNames = "Revision" +var AppRevisionsFieldName AppRevisionsFieldNames = "Revisions" + +type AppUtils struct { + App *appv1.Application +} + +func (au *AppUtils) operationStateSyncExists(fieldToCheck *AppRevisionsFieldNames) bool { + result := au.App != nil && au.App.Status.OperationState != nil && au.App.Status.OperationState.Operation.Sync != nil + if !result { + return false + } + + return revisionsToCheck(RevisionsData{ + Revision: au.App.Status.OperationState.Operation.Sync.Revision, + Revisions: au.App.Status.OperationState.Operation.Sync.Revisions, + }, fieldToCheck) +} + +func (au *AppUtils) operationSyncExists(fieldToCheck *AppRevisionsFieldNames) bool { + result := au.App != nil && au.App.Operation != nil && au.App.Operation.Sync != nil + if !result { + return false + } + + return revisionsToCheck(RevisionsData{ + Revision: au.App.Operation.Sync.Revision, + Revisions: au.App.Operation.Sync.Revisions, + }, fieldToCheck) +} + +func (au *AppUtils) operationSyncResultExists(fieldToCheck *AppRevisionsFieldNames) bool { + result := au.App != nil && au.App.Status.OperationState != nil && au.App.Status.OperationState.SyncResult != nil + if !result { + return false + } + + return revisionsToCheck(RevisionsData{ + Revision: au.App.Status.OperationState.SyncResult.Revision, + Revisions: au.App.Status.OperationState.SyncResult.Revisions, + }, fieldToCheck) +} + +// expected to return true if fieldToCheck == nil +func revisionsToCheck(obj RevisionsData, fieldToCheck *AppRevisionsFieldNames) bool { + if fieldToCheck == nil { + return true + } + if *fieldToCheck == AppRevisionFieldName { + return obj.Revision != "" + } + + if *fieldToCheck == AppRevisionsFieldName { + return obj.Revisions != nil && len(obj.Revisions) > 0 + } + return true +} diff --git a/event_reporter/utils/app_revision.go b/event_reporter/utils/app_revision.go index 29ea5f789e716..10ab89e0f8dd6 100644 --- a/event_reporter/utils/app_revision.go +++ b/event_reporter/utils/app_revision.go @@ -26,7 +26,7 @@ type RevisionsData struct { const annotationRevisionKey = "app.meta.revisions-metadata" func (asrm *AppSyncRevisionsMetadata) GetSyncRevisionAt(idx int) *RevisionWithMetadata { - if asrm == nil || asrm.SyncRevisions == nil { + if asrm == nil || asrm.SyncRevisions == nil || idx < 0 || idx >= len(asrm.SyncRevisions) { return nil } return asrm.SyncRevisions[idx] @@ -60,12 +60,12 @@ func GetOperationRevision(a *appv1.Application) string { if a == nil { return "" } - + au := &AppUtils{App: a} // this value will be used in case if application hasn't resources , like gitsource revision := a.Status.Sync.Revision - if a.Status.OperationState != nil && a.Status.OperationState.Operation.Sync != nil && a.Status.OperationState.Operation.Sync.Revision != "" { + if au.operationStateSyncExists(&AppRevisionFieldName) { revision = a.Status.OperationState.Operation.Sync.Revision - } else if a.Operation != nil && a.Operation.Sync != nil && a.Operation.Sync.Revision != "" { + } else if au.operationSyncExists(&AppRevisionFieldName) { revision = a.Operation.Sync.Revision } @@ -76,12 +76,13 @@ func GetOperationRevisions(a *appv1.Application) []string { if a == nil { return nil } + au := &AppUtils{App: a} // this value will be used in case if application hasn't resources , like gitsource revisions := a.Status.Sync.Revisions - if a.Status.OperationState != nil && a.Status.OperationState.Operation.Sync != nil && a.Status.OperationState.Operation.Sync.Revisions != nil && len(a.Status.OperationState.Operation.Sync.Revisions) > 0 { + if au.operationStateSyncExists(&AppRevisionsFieldName) { revisions = a.Status.OperationState.Operation.Sync.Revisions - } else if a.Operation != nil && a.Operation.Sync != nil && a.Operation.Sync.Revisions != nil && len(a.Operation.Sync.Revisions) > 0 { + } else if au.operationSyncExists(&AppRevisionsFieldName) { revisions = a.Operation.Sync.Revisions } @@ -89,25 +90,28 @@ func GetOperationRevisions(a *appv1.Application) []string { } func GetOperationSyncResultRevision(a *appv1.Application) *string { - if a == nil || a.Status.OperationState == nil || a.Status.OperationState.SyncResult == nil { - return nil + au := &AppUtils{App: a} + if au.operationSyncResultExists(nil) { + return &a.Status.OperationState.SyncResult.Revision } - return &a.Status.OperationState.SyncResult.Revision + return nil } func GetOperationSyncResultRevisions(a *appv1.Application) *[]string { - if a == nil || a.Status.OperationState == nil || a.Status.OperationState.SyncResult == nil { - return nil + au := &AppUtils{App: a} + if au.operationSyncResultExists(nil) { + return &a.Status.OperationState.SyncResult.Revisions } - return &a.Status.OperationState.SyncResult.Revisions + return nil } func GetOperationSyncRevisions(a *appv1.Application) []string { if a == nil { return []string{} } + au := &AppUtils{App: a} // this value will be used in case if application hasn't resources, like empty gitsource revisions := getRevisions(RevisionsData{ @@ -115,12 +119,12 @@ func GetOperationSyncRevisions(a *appv1.Application) []string { Revisions: a.Status.Sync.Revisions, }) - if a.Status.OperationState != nil && a.Status.OperationState.Operation.Sync != nil { + if au.operationStateSyncExists(nil) { revisions = getRevisions(RevisionsData{ Revision: a.Status.OperationState.Operation.Sync.Revision, Revisions: a.Status.OperationState.Operation.Sync.Revisions, }) - } else if a.Operation != nil && a.Operation.Sync != nil { + } else if au.operationSyncExists(nil) { revisions = getRevisions(RevisionsData{ Revision: a.Operation.Sync.Revision, Revisions: a.Operation.Sync.Revisions, @@ -137,16 +141,17 @@ func GetOperationChangeRevisions(a *appv1.Application) []string { if a == nil { return revisions } + au := &AppUtils{App: a} // this value will be used in case if application hasn't resources, like empty gitsource - if a.Status.OperationState != nil && a.Status.OperationState.Operation.Sync != nil { + if au.operationStateSyncExists(nil) { if a.Status.OperationState.Operation.Sync.ChangeRevision != "" || a.Status.OperationState.Operation.Sync.ChangeRevisions != nil { revisions = getRevisions(RevisionsData{ Revision: a.Status.OperationState.Operation.Sync.ChangeRevision, Revisions: a.Status.OperationState.Operation.Sync.ChangeRevisions, }) } - } else if a.Operation != nil && a.Operation.Sync != nil { + } else if au.operationSyncExists(nil) { if a.Operation.Sync.ChangeRevision != "" || a.Operation.Sync.ChangeRevisions != nil { revisions = getRevisions(RevisionsData{ Revision: a.Operation.Sync.ChangeRevision, diff --git a/event_reporter/utils/app_revision_test.go b/event_reporter/utils/app_revision_test.go index 370edecdb2d5a..f3e5ab35d93ca 100644 --- a/event_reporter/utils/app_revision_test.go +++ b/event_reporter/utils/app_revision_test.go @@ -441,3 +441,224 @@ func TestAddCommitDetailsToLabels(t *testing.T) { assert.Equal(t, "http://my-grafana.com/pre-generated-link", result.GetLabels()["link"]) }) } + +func TestGetSyncRevisionAt(t *testing.T) { + t.Run("should return nil once idx out of range", func(t *testing.T) { + revisionMetadata := AppSyncRevisionsMetadata{ + SyncRevisions: []*RevisionWithMetadata{{ + Metadata: &v1alpha1.RevisionMetadata{ + Author: "demo usert", + Date: metav1.Time{}, + Message: "some message", + }, + }}, + } + + assert.Nil(t, revisionMetadata.GetSyncRevisionAt(-1)) + assert.Nil(t, revisionMetadata.GetSyncRevisionAt(1)) + }) + t.Run("should return nil if data missing", func(t *testing.T) { + revisionMetadata := AppSyncRevisionsMetadata{} + + assert.Nil(t, revisionMetadata.GetSyncRevisionAt(1)) + }) + t.Run("should return correct idx", func(t *testing.T) { + revisionMetadata := AppSyncRevisionsMetadata{ + SyncRevisions: []*RevisionWithMetadata{ + { + Metadata: &v1alpha1.RevisionMetadata{ + Author: "demo usert", + Date: metav1.Time{}, + Message: "some message", + }, + }, + { + Metadata: &v1alpha1.RevisionMetadata{ + Author: "demo user2", + Date: metav1.Time{}, + Message: "some message 2", + }, + }, + }, + } + + syncRev := revisionMetadata.GetSyncRevisionAt(1) + assert.NotNil(t, syncRev) + assert.Equal(t, "demo user2", syncRev.Metadata.Author) + assert.Equal(t, "some message 2", syncRev.Metadata.Message) + }) +} + +func TestGetOperationRevision(t *testing.T) { + t.Run("should return empty strint once app in nil", func(t *testing.T) { + assert.Equal(t, "", GetOperationRevision(nil)) + }) + t.Run("should return Status.Sync.Revision as fallback", func(t *testing.T) { + assert.Equal(t, "Status.Sync.Revision", GetOperationRevision(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + Sync: v1alpha1.SyncStatus{ + Revision: "Status.Sync.Revision", + }, + }, + })) + }) + t.Run("should return Status.OperationState.Operation.Sync.Revision", func(t *testing.T) { + assert.Equal(t, "Status.OperationState.Operation.Sync.Revision", GetOperationRevision(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + Sync: v1alpha1.SyncStatus{ + Revision: "Status.Sync.Revision", + }, + OperationState: &v1alpha1.OperationState{ + Operation: v1alpha1.Operation{ + Sync: &v1alpha1.SyncOperation{ + Revision: "Status.OperationState.Operation.Sync.Revision", + }, + }, + }, + }, + Operation: &v1alpha1.Operation{ + Sync: &v1alpha1.SyncOperation{ + Revision: "Operation.Sync.Revision", + }, + }, + })) + }) + t.Run("should return Status-Sync-Revision", func(t *testing.T) { + assert.Equal(t, "Operation.Sync.Revision", GetOperationRevision(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + Sync: v1alpha1.SyncStatus{ + Revision: "Status-Sync-Revision", + }, + }, + Operation: &v1alpha1.Operation{ + Sync: &v1alpha1.SyncOperation{ + Revision: "Operation.Sync.Revision", + }, + }, + })) + }) +} + +func TestGetOperationRevisions(t *testing.T) { + t.Run("should return empty strint once app in nil", func(t *testing.T) { + assert.Nil(t, GetOperationRevisions(nil)) + }) + t.Run("should return Status.Sync.Revisions as fallback", func(t *testing.T) { + res := GetOperationRevisions(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + Sync: v1alpha1.SyncStatus{ + Revision: "Status.Sync.Revision", + Revisions: []string{"Status.Sync.Revisions"}, + }, + }, + }) + assert.Len(t, res, 1) + assert.Equal(t, res[0], "Status.Sync.Revisions") + }) + t.Run("should return Status.OperationState.Operation.Sync.Revisions", func(t *testing.T) { + res := GetOperationRevisions(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + Sync: v1alpha1.SyncStatus{ + Revision: "Status.Sync.Revision", + Revisions: []string{"Status.Sync.Revisions"}, + }, + OperationState: &v1alpha1.OperationState{ + Operation: v1alpha1.Operation{ + Sync: &v1alpha1.SyncOperation{ + Revision: "Status.OperationState.Operation.Sync.Revision", + Revisions: []string{"Status.OperationState.Operation.Sync.Revisions"}, + }, + }, + }, + }, + Operation: &v1alpha1.Operation{ + Sync: &v1alpha1.SyncOperation{ + Revision: "Operation.Sync.Revision", + Revisions: []string{"Operation.Sync.Revisions"}, + }, + }, + }) + assert.Len(t, res, 1) + assert.Equal(t, "Status.OperationState.Operation.Sync.Revisions", res[0]) + }) + t.Run("should return Status-Sync-Revisions", func(t *testing.T) { + res := GetOperationRevisions(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + Sync: v1alpha1.SyncStatus{ + Revision: "Status-Sync-Revision", + }, + }, + Operation: &v1alpha1.Operation{ + Sync: &v1alpha1.SyncOperation{ + Revision: "Operation.Sync.Revision", + Revisions: []string{"Operation.Sync.Revisions"}, + }, + }, + }) + assert.Len(t, res, 1) + assert.Equal(t, res[0], "Operation.Sync.Revisions") + }) +} + +func TestGetOperationSyncResultRevision(t *testing.T) { + t.Run("should return nil", func(t *testing.T) { + assert.Nil(t, GetOperationSyncResultRevision(nil)) + assert.Nil(t, GetOperationSyncResultRevision(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + OperationState: &v1alpha1.OperationState{ + Operation: v1alpha1.Operation{ + Sync: &v1alpha1.SyncOperation{ + Revision: "Status.OperationState.Operation.Sync.Revision", + Revisions: []string{"Status.OperationState.Operation.Sync.Revisions"}, + }, + }, + }, + }, + })) + }) + t.Run("should return revision", func(t *testing.T) { + res := GetOperationSyncResultRevision(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + OperationState: &v1alpha1.OperationState{ + SyncResult: &v1alpha1.SyncOperationResult{ + Revision: "Status.OperationState.SyncResult.Revision", + Revisions: []string{"Status.OperationState.SyncResult.Revisions"}, + }, + }, + }, + }) + assert.Equal(t, "Status.OperationState.SyncResult.Revision", *res) + }) +} + +func TestGetOperationSyncResultRevisions(t *testing.T) { + t.Run("should return nil", func(t *testing.T) { + assert.Nil(t, GetOperationSyncResultRevisions(nil)) + assert.Nil(t, GetOperationSyncResultRevisions(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + OperationState: &v1alpha1.OperationState{ + Operation: v1alpha1.Operation{ + Sync: &v1alpha1.SyncOperation{ + Revision: "Status.OperationState.Operation.Sync.Revision", + Revisions: []string{"Status.OperationState.Operation.Sync.Revisions"}, + }, + }, + }, + }, + })) + }) + t.Run("should return revisions", func(t *testing.T) { + res := GetOperationSyncResultRevisions(&v1alpha1.Application{ + Status: v1alpha1.ApplicationStatus{ + OperationState: &v1alpha1.OperationState{ + SyncResult: &v1alpha1.SyncOperationResult{ + Revision: "Status.OperationState.SyncResult.Revision", + Revisions: []string{"Status.OperationState.SyncResult.Revisions"}, + }, + }, + }, + }) + assert.NotNil(t, res) + assert.Len(t, *res, 1) + }) +} From b4f65262cbe4b5a986c744ea942b649eb0fe8b70 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 13 Nov 2024 17:48:18 +0200 Subject: [PATCH 24/26] fix lint issue --- event_reporter/utils/app_revision_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/event_reporter/utils/app_revision_test.go b/event_reporter/utils/app_revision_test.go index f3e5ab35d93ca..88cb9bccd8c82 100644 --- a/event_reporter/utils/app_revision_test.go +++ b/event_reporter/utils/app_revision_test.go @@ -553,7 +553,7 @@ func TestGetOperationRevisions(t *testing.T) { }, }) assert.Len(t, res, 1) - assert.Equal(t, res[0], "Status.Sync.Revisions") + assert.Equal(t, "Status.Sync.Revisions", res[0]) }) t.Run("should return Status.OperationState.Operation.Sync.Revisions", func(t *testing.T) { res := GetOperationRevisions(&v1alpha1.Application{ @@ -596,7 +596,7 @@ func TestGetOperationRevisions(t *testing.T) { }, }) assert.Len(t, res, 1) - assert.Equal(t, res[0], "Operation.Sync.Revisions") + assert.Equal(t, "Operation.Sync.Revisions", res[0]) }) } From 424b68ba35ba1a7aaac4dba13b2fb0cc245c8a23 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 13 Nov 2024 18:18:34 +0200 Subject: [PATCH 25/26] reporter: fix lint issue --- event_reporter/utils/app.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/event_reporter/utils/app.go b/event_reporter/utils/app.go index 84dbe01d15b27..cbb1756b20770 100644 --- a/event_reporter/utils/app.go +++ b/event_reporter/utils/app.go @@ -4,8 +4,10 @@ import appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" type AppRevisionsFieldNames string -var AppRevisionFieldName AppRevisionsFieldNames = "Revision" -var AppRevisionsFieldName AppRevisionsFieldNames = "Revisions" +var ( + AppRevisionFieldName AppRevisionsFieldNames = "Revision" + AppRevisionsFieldName AppRevisionsFieldNames = "Revisions" +) type AppUtils struct { App *appv1.Application From 69451f9667ce66c3c7c254e697a48c1b1d047b45 Mon Sep 17 00:00:00 2001 From: oleksandr-codefresh Date: Wed, 13 Nov 2024 19:10:02 +0200 Subject: [PATCH 26/26] reporter: fix lint issue --- event_reporter/reporter/application_event_reporter_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/event_reporter/reporter/application_event_reporter_test.go b/event_reporter/reporter/application_event_reporter_test.go index b2414628c4cdd..650b455094492 100644 --- a/event_reporter/reporter/application_event_reporter_test.go +++ b/event_reporter/reporter/application_event_reporter_test.go @@ -19,6 +19,9 @@ import ( "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/watch" + "google.golang.org/grpc" + "k8s.io/apimachinery/pkg/runtime" + appclient "github.com/argoproj/argo-cd/v2/event_reporter/application" appMocks "github.com/argoproj/argo-cd/v2/event_reporter/application/mocks" "github.com/argoproj/argo-cd/v2/pkg/apiclient" @@ -26,8 +29,6 @@ import ( appv1reg "github.com/argoproj/argo-cd/v2/pkg/apis/application" repoapiclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/util/io" - "google.golang.org/grpc" - "k8s.io/apimachinery/pkg/runtime" "github.com/argoproj/argo-cd/v2/event_reporter/metrics"