From 106ed0b3ef6a7d978f354f4744c927b08885759d Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 21 Aug 2019 12:29:01 +0100 Subject: [PATCH 1/8] Issue #1995 - Add maintenance windows for auto synced applications --- Gopkg.lock | 9 + assets/swagger.json | 21 + cmd/argocd/commands/app.go | 63 +- cmd/argocd/commands/app_test.go | 24 + controller/appcontroller.go | 33 + controller/appcontroller_test.go | 51 + manifests/base/kustomization.yaml | 14 +- manifests/crds/application-crd.yaml | 14 + manifests/ha/base/kustomization.yaml | 14 +- manifests/ha/install.yaml | 66 +- manifests/ha/namespace-install.yaml | 66 +- manifests/install.yaml | 42 +- manifests/namespace-install.yaml | 42 +- pkg/apis/application/v1alpha1/generated.pb.go | 967 +++++++++++------- pkg/apis/application/v1alpha1/generated.proto | 12 + .../application/v1alpha1/openapi_generated.go | 43 + pkg/apis/application/v1alpha1/types.go | 10 + .../v1alpha1/zz_generated.deepcopy.go | 39 +- .../application-summary.tsx | 26 +- ui/src/app/shared/models.ts | 7 +- 20 files changed, 1098 insertions(+), 465 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index e0b151ff91e09..705439c1078be 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -734,6 +734,14 @@ pruneopts = "" revision = "05ee40e3a273f7245e8777337fc7b46e533a9a92" +[[projects]] + digest = "1:6bb048133650d1fb7fbff9fb3c35bd5c7e8653fc95c3bae6df94cd17d1580278" + name = "github.com/robfig/cron" + packages = ["."] + pruneopts = "" + revision = "45fbe1491cdd47d74d1bf1396286d67faee8b8b5" + version = "v3.0.0" + [[projects]] digest = "1:5f47c69f85311c4dc292be6cc995a0a3fe8337a6ce38ef4f71e5b7efd5ad42e0" name = "github.com/rs/cors" @@ -1632,6 +1640,7 @@ "github.com/pkg/errors", "github.com/prometheus/client_golang/prometheus", "github.com/prometheus/client_golang/prometheus/promhttp", + "github.com/robfig/cron", "github.com/sirupsen/logrus", "github.com/sirupsen/logrus/hooks/test", "github.com/skratchdot/open-golang/open", diff --git a/assets/swagger.json b/assets/swagger.json index 802ae9293e610..89347bd51cb20 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -3200,6 +3200,20 @@ } } }, + "v1alpha1MaintenanceWindow": { + "type": "object", + "title": "MaintenanceWindow controls when automated syncs should be disabled", + "properties": { + "duration": { + "type": "string", + "title": "Duration is the amount of time the maintenance window will be open" + }, + "schedule": { + "type": "string", + "title": "Schedule is the time the window will begin" + } + } + }, "v1alpha1Operation": { "description": "Operation contains requested operation parameters.", "type": "object", @@ -3788,6 +3802,13 @@ "type": "object", "title": "SyncPolicyAutomated controls the behavior of an automated sync", "properties": { + "maintenanceWindows": { + "type": "array", + "title": "MaintenanceWindows disables auto-syncing during the configured time windows (default: false)", + "items": { + "$ref": "#/definitions/v1alpha1MaintenanceWindow" + } + }, "prune": { "type": "boolean", "format": "boolean", diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index d045467483b36..fd6f950ac3150 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -257,15 +257,22 @@ func printAppSummaryTable(app *argoappv1.Application, appURL string) { fmt.Printf(printOpFmtStr, "Path:", app.Spec.Source.Path) printAppSourceDetails(&app.Spec.Source) var syncPolicy string + var maintenanceWindows string if app.Spec.SyncPolicy != nil && app.Spec.SyncPolicy.Automated != nil { syncPolicy = "Automated" if app.Spec.SyncPolicy.Automated.Prune { syncPolicy += " (Prune)" } + if app.Spec.SyncPolicy.Automated.MaintenanceWindows != nil { + maintenanceWindows = formatMaintenanceWindows(*app) + } else { + maintenanceWindows = "" + } } else { syncPolicy = "" } fmt.Printf(printOpFmtStr, "Sync Policy:", syncPolicy) + fmt.Printf(printOpFmtStr, "Maintenance:", maintenanceWindows) syncStatusStr := string(app.Status.Sync.Status) switch app.Status.Sync.Status { case argoappv1.SyncStatusCodeSynced: @@ -447,6 +454,18 @@ func setAppOptions(flags *pflag.FlagSet, app *argoappv1.Application, appOpts *ap } app.Spec.SyncPolicy.Automated.Prune = appOpts.autoPrune } + if flags.Changed("self-heal") { + if app.Spec.SyncPolicy == nil || app.Spec.SyncPolicy.Automated == nil { + log.Fatal("Cannot set --self-heal: application not configured with automatic sync") + } + app.Spec.SyncPolicy.Automated.SelfHeal = appOpts.selfHeal + } + if flags.Changed("maintenance-windows") { + if app.Spec.SyncPolicy == nil || app.Spec.SyncPolicy.Automated == nil { + log.Fatal("Cannot set --maintenance-windows: application not configured with automatic sync") + } + setMaintenanceWindows(app, appOpts.maintenanceWindows) + } return visited } @@ -486,6 +505,20 @@ func setKustomizeImages(src *argoappv1.ApplicationSource, images []string) { } } +func setMaintenanceWindows(app *argoappv1.Application, windows string) { + var maintenanceWindows []*argoappv1.MaintenanceWindow + wn := strings.Split(windows, ",") + for _, w := range wn { + cfg := strings.Split(w, ":") + window := argoappv1.MaintenanceWindow{ + Schedule: &cfg[0], + Duration: &cfg[1], + } + maintenanceWindows = append(maintenanceWindows, &window) + } + app.Spec.SyncPolicy.Automated.MaintenanceWindows = maintenanceWindows +} + type helmOpts struct { valueFiles []string releaseName string @@ -564,12 +597,14 @@ type appOptions struct { destNamespace string parameters []string valuesFiles []string + maintenanceWindows string releaseName string helmSets []string helmSetStrings []string project string syncPolicy string autoPrune bool + selfHeal bool namePrefix string directoryRecurse bool configManagementPlugin string @@ -593,12 +628,14 @@ func addAppFlags(command *cobra.Command, opts *appOptions) { command.Flags().StringVar(&opts.project, "project", "", "Application project name") command.Flags().StringVar(&opts.syncPolicy, "sync-policy", "", "Set the sync policy (one of: automated, none)") command.Flags().BoolVar(&opts.autoPrune, "auto-prune", false, "Set automatic pruning when sync is automated") + command.Flags().BoolVar(&opts.selfHeal, "self-heal", false, "Set self healing when sync is automated") command.Flags().StringVar(&opts.namePrefix, "nameprefix", "", "Kustomize nameprefix") command.Flags().BoolVar(&opts.directoryRecurse, "directory-recurse", false, "Recurse directory") command.Flags().StringVar(&opts.configManagementPlugin, "config-management-plugin", "", "Config management plugin name") command.Flags().StringArrayVar(&opts.jsonnetTlaStr, "jsonnet-tla-str", []string{}, "Jsonnet top level string arguments") command.Flags().StringArrayVar(&opts.jsonnetTlaCode, "jsonnet-tla-code", []string{}, "Jsonnet top level code arguments") command.Flags().StringArrayVar(&opts.kustomizeImages, "kustomize-image", []string{}, "Kustomize images (e.g. --kustomize-image node:8.15.0 --kustomize-image mysql=mariadb,alpine@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d)") + command.Flags().StringVar(&opts.maintenanceWindows, "maintenance-windows", "", "Times during which auto-sync will be disabled (can specify multiple or separate values with commas: '0 11 * * *:1h,30 23 * * *:1h')") } // NewApplicationUnsetCommand returns a new instance of an `argocd app unset` command @@ -992,8 +1029,8 @@ func printApplicationTable(apps []argoappv1.Application, output *string) { var fmtStr string headers := []interface{}{"NAME", "CLUSTER", "NAMESPACE", "PROJECT", "STATUS", "HEALTH", "SYNCPOLICY", "CONDITIONS"} if *output == "wide" { - fmtStr = "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" - headers = append(headers, "REPO", "PATH", "TARGET") + fmtStr = "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" + headers = append(headers, "REPO", "PATH", "TARGET", "MAINTENANCE") } else { fmtStr = "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" } @@ -1010,7 +1047,7 @@ func printApplicationTable(apps []argoappv1.Application, output *string) { formatConditionsSummary(app), } if *output == "wide" { - vals = append(vals, app.Spec.Source.RepoURL, app.Spec.Source.Path, app.Spec.Source.TargetRevision) + vals = append(vals, app.Spec.Source.RepoURL, app.Spec.Source.Path, app.Spec.Source.TargetRevision, formatMaintenanceWindows(app)) } fmt.Fprintf(w, fmtStr, vals...) } @@ -1052,6 +1089,26 @@ func formatSyncPolicy(app argoappv1.Application) string { return policy } +func formatMaintenanceWindows(app argoappv1.Application) string { + if app.Spec.SyncPolicy == nil || app.Spec.SyncPolicy.Automated == nil { + return "" + } + var windows string + if app.Spec.SyncPolicy.Automated.MaintenanceWindows != nil { + noWindows := len(app.Spec.SyncPolicy.Automated.MaintenanceWindows) + for i, w := range app.Spec.SyncPolicy.Automated.MaintenanceWindows { + var window string + if i+1 < noWindows { + window = *w.Schedule + ":" + *w.Duration + "," + } else { + window = *w.Schedule + ":" + *w.Duration + } + windows += window + } + } + return windows +} + func formatConditionsSummary(app argoappv1.Application) string { typeToCnt := make(map[string]int) for i := range app.Status.Conditions { diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index 960ee41399ada..49db8ad676ac8 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -53,3 +53,27 @@ func Test_setHelmOpt(t *testing.T) { assert.Equal(t, []v1alpha1.HelmParameter{{Name: "foo", Value: "bar", ForceString: true}}, src.Helm.Parameters) }) } + +func Test_setMaintenanceWindows(t *testing.T) { + t.Run("SingleWindow", func(t *testing.T) { + sched := "0 10 * * *" + dur := "1h" + windows := sched + ":" + dur + ap := v1alpha1.Application{} + ap.Spec.SyncPolicy = &v1alpha1.SyncPolicy{Automated: &v1alpha1.SyncPolicyAutomated{}} + setMaintenanceWindows(&ap, windows) + assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched ,Duration: &dur }, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) + }) + t.Run("MultipleWindows", func(t *testing.T) { + sched1 := "0 10 * * *" + dur1 := "1h" + sched2 := "0 22 * * *" + dur2 := "1h" + windows := sched1 + ":" + dur1 + "," + sched2 + ":" + dur2 + ap := v1alpha1.Application{} + ap.Spec.SyncPolicy = &v1alpha1.SyncPolicy{Automated: &v1alpha1.SyncPolicyAutomated{}} + setMaintenanceWindows(&ap, windows) + assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched1 ,Duration: &dur1 }, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) + assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched2 ,Duration: &dur2 }, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[1]) + }) +} \ No newline at end of file diff --git a/controller/appcontroller.go b/controller/appcontroller.go index 7f7b0ca2bac68..c4ab15f522b4b 100644 --- a/controller/appcontroller.go +++ b/controller/appcontroller.go @@ -23,6 +23,8 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" + "github.com/robfig/cron" + "github.com/argoproj/argo-cd/common" statecache "github.com/argoproj/argo-cd/controller/cache" "github.com/argoproj/argo-cd/controller/metrics" @@ -940,6 +942,16 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus * logCtx.Infof("Skipping auto-sync: deletion in progress") return nil } + // Check if there are any active maintenance windows and skip if true + if app.Spec.SyncPolicy.Automated.MaintenanceWindows != nil { + active, err := maintenanceWindowActive(app) + if err != nil { + logCtx.Warnf("Error getting maintenance windows: %v", err) + } + if active { + return nil + } + } // Only perform auto-sync if we detect OutOfSync status. This is to prevent us from attempting // a sync when application is already in a Synced or Unknown state if syncStatus.Status != appv1.SyncStatusCodeOutOfSync { @@ -1117,3 +1129,24 @@ func toggledAutomatedSync(old *appv1.Application, new *appv1.Application) bool { // nothing changed return false } + +func maintenanceWindowActive(app *appv1.Application) (bool, error) { + specParser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow) + for _, w := range app.Spec.SyncPolicy.Automated.MaintenanceWindows { + schedule, err := specParser.Parse(*w.Schedule) + if err != nil { + return false, err + } + duration, err := time.ParseDuration(*w.Duration) + if err != nil { + return false, err + } + now := time.Now() + nextWindow := schedule.Next(now.Add(-duration)) + if nextWindow.Before(now) { + return true, nil + } + } + // No active maintenance windows + return false, nil +} diff --git a/controller/appcontroller_test.go b/controller/appcontroller_test.go index 81f15d321bfce..52303533b19ae 100644 --- a/controller/appcontroller_test.go +++ b/controller/appcontroller_test.go @@ -207,6 +207,36 @@ func TestAutoSync(t *testing.T) { assert.False(t, app.Operation.Sync.Prune) } +func TestMaintenanceWindows(t *testing.T) { + // Active window will always be true + { + app := newFakeApp() + sched := "* * * * *" + dur := "1m" + syncPol := &argoappv1.SyncPolicy{Automated: &argoappv1.SyncPolicyAutomated{}} + windows := []*argoappv1.MaintenanceWindow{{Schedule: &sched, Duration: &dur}} + syncPol.Automated.MaintenanceWindows = windows + app.Spec.SyncPolicy = syncPol + active, err := maintenanceWindowActive(app) + assert.NoError(t, err) + assert.True(t, active) + } + + // Check that incorrectly formatted schedules fail + { + app := newFakeApp() + sched := "100 * * * *" + dur := "1m" + syncPol := &argoappv1.SyncPolicy{Automated: &argoappv1.SyncPolicyAutomated{}} + windows := []*argoappv1.MaintenanceWindow{{Schedule: &sched, Duration: &dur}} + syncPol.Automated.MaintenanceWindows = windows + app.Spec.SyncPolicy = syncPol + active, err := maintenanceWindowActive(app) + assert.Error(t, err) + assert.False(t, active) + } +} + func TestSkipAutoSync(t *testing.T) { // Verify we skip when we previously synced to it in our most recent history // Set current to 'aaaaa', desired to 'aaaa' and mark system OutOfSync @@ -297,6 +327,27 @@ func TestSkipAutoSync(t *testing.T) { assert.NoError(t, err) assert.Nil(t, app.Operation) } + + // Verify we skip when there is an active maintenance window + { + app := newFakeApp() + sched := "* * * * *" + dur := "1m" + syncPol := &argoappv1.SyncPolicy{Automated: &argoappv1.SyncPolicyAutomated{}} + windows := []*argoappv1.MaintenanceWindow{{Schedule: &sched, Duration: &dur}} + syncPol.Automated.MaintenanceWindows = windows + app.Spec.SyncPolicy = syncPol + ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}}) + syncStatus := argoappv1.SyncStatus{ + Status: argoappv1.SyncStatusCodeOutOfSync, + Revision: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + } + cond := ctrl.autoSync(app, &syncStatus, []argoappv1.ResourceStatus{}) + assert.Nil(t, cond) + app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get("my-app", metav1.GetOptions{}) + assert.NoError(t, err) + assert.Nil(t, app.Operation) + } } // TestAutoSyncIndicateError verifies we skip auto-sync and return error condition if previous sync failed diff --git a/manifests/base/kustomization.yaml b/manifests/base/kustomization.yaml index 3e6d00296301d..4e64007c5dda3 100644 --- a/manifests/base/kustomization.yaml +++ b/manifests/base/kustomization.yaml @@ -1,13 +1,6 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization -bases: -- ./application-controller -- ./dex -- ./repo-server -- ./server -- ./config -- ./redis images: - name: argoproj/argocd @@ -16,3 +9,10 @@ images: - name: argoproj/argocd-ui newName: argoproj/argocd-ui newTag: latest +resources: +- ./application-controller +- ./dex +- ./repo-server +- ./server +- ./config +- ./redis diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index fc2a3b9cde47a..1f88e747bc38b 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -819,6 +819,20 @@ spec: description: Automated will keep an application synced to the target revision properties: + maintenanceWindows: + description: 'MaintenanceWindows disables auto-syncing during + the configured time windows (default: false)' + items: + properties: + duration: + description: Duration is the amount of time the maintenance + window will be open + type: string + schedule: + description: Schedule is the time the window will begin + type: string + type: object + type: array prune: description: 'Prune will prune resources automatically as part of automated sync (default: false)' diff --git a/manifests/ha/base/kustomization.yaml b/manifests/ha/base/kustomization.yaml index 022b54c7fc5de..a24ca4f555c92 100644 --- a/manifests/ha/base/kustomization.yaml +++ b/manifests/ha/base/kustomization.yaml @@ -7,13 +7,6 @@ patchesStrategicMerge: - overlays/argocd-server-deployment.yaml - overlays/argocd-application-controller-deployment.yaml -bases: -- ../../base/application-controller -- ../../base/dex -- ../../base/repo-server -- ../../base/server -- ../../base/config -- ./redis-ha images: - name: argoproj/argocd @@ -22,3 +15,10 @@ images: - name: argoproj/argocd-ui newName: argoproj/argocd-ui newTag: latest +resources: +- ../../base/application-controller +- ../../base/dex +- ../../base/repo-server +- ../../base/server +- ../../base/config +- ./redis-ha diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index d3d344bfca3d4..40e05dff3fcb9 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -820,6 +820,20 @@ spec: description: Automated will keep an application synced to the target revision properties: + maintenanceWindows: + description: 'MaintenanceWindows disables auto-syncing during + the configured time windows (default: false)' + items: + properties: + duration: + description: Duration is the amount of time the maintenance + window will be open + type: string + schedule: + description: Schedule is the time the window will begin + type: string + type: object + type: array prune: description: 'Prune will prune resources automatically as part of automated sync (default: false)' @@ -2741,14 +2755,14 @@ spec: apiVersion: v1 kind: Service metadata: - annotations: - service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" + annotations: null labels: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-0 + name: argocd-redis-ha spec: + clusterIP: None ports: - name: server port: 6379 @@ -2758,10 +2772,8 @@ spec: port: 26379 protocol: TCP targetPort: sentinel - publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 type: ClusterIP --- apiVersion: v1 @@ -2773,7 +2785,7 @@ metadata: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-1 + name: argocd-redis-ha-announce-0 spec: ports: - name: server @@ -2787,7 +2799,7 @@ spec: publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 type: ClusterIP --- apiVersion: v1 @@ -2799,7 +2811,7 @@ metadata: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-2 + name: argocd-redis-ha-announce-1 spec: ports: - name: server @@ -2813,20 +2825,20 @@ spec: publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 type: ClusterIP --- apiVersion: v1 kind: Service metadata: - annotations: null + annotations: + service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" labels: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha + name: argocd-redis-ha-announce-2 spec: - clusterIP: None ports: - name: server port: 6379 @@ -2836,8 +2848,10 @@ spec: port: 26379 protocol: TCP targetPort: sentinel + publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 type: ClusterIP --- apiVersion: v1 @@ -2866,15 +2880,19 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd - name: argocd-server-metrics + name: argocd-server spec: ports: - - name: metrics - port: 8083 + - name: http + port: 80 protocol: TCP - targetPort: 8083 + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: argocd-server --- @@ -2883,19 +2901,15 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server + app.kubernetes.io/name: argocd-server-metrics app.kubernetes.io/part-of: argocd - name: argocd-server + name: argocd-server-metrics spec: ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 + - name: metrics + port: 8083 protocol: TCP - targetPort: 8080 + targetPort: 8083 selector: app.kubernetes.io/name: argocd-server --- diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index 8a7b984dd4306..d2a6d569f55e8 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -820,6 +820,20 @@ spec: description: Automated will keep an application synced to the target revision properties: + maintenanceWindows: + description: 'MaintenanceWindows disables auto-syncing during + the configured time windows (default: false)' + items: + properties: + duration: + description: Duration is the amount of time the maintenance + window will be open + type: string + schedule: + description: Schedule is the time the window will begin + type: string + type: object + type: array prune: description: 'Prune will prune resources automatically as part of automated sync (default: false)' @@ -2656,14 +2670,14 @@ spec: apiVersion: v1 kind: Service metadata: - annotations: - service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" + annotations: null labels: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-0 + name: argocd-redis-ha spec: + clusterIP: None ports: - name: server port: 6379 @@ -2673,10 +2687,8 @@ spec: port: 26379 protocol: TCP targetPort: sentinel - publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 type: ClusterIP --- apiVersion: v1 @@ -2688,7 +2700,7 @@ metadata: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-1 + name: argocd-redis-ha-announce-0 spec: ports: - name: server @@ -2702,7 +2714,7 @@ spec: publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 type: ClusterIP --- apiVersion: v1 @@ -2714,7 +2726,7 @@ metadata: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-2 + name: argocd-redis-ha-announce-1 spec: ports: - name: server @@ -2728,20 +2740,20 @@ spec: publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 type: ClusterIP --- apiVersion: v1 kind: Service metadata: - annotations: null + annotations: + service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" labels: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha + name: argocd-redis-ha-announce-2 spec: - clusterIP: None ports: - name: server port: 6379 @@ -2751,8 +2763,10 @@ spec: port: 26379 protocol: TCP targetPort: sentinel + publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 type: ClusterIP --- apiVersion: v1 @@ -2781,15 +2795,19 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd - name: argocd-server-metrics + name: argocd-server spec: ports: - - name: metrics - port: 8083 + - name: http + port: 80 protocol: TCP - targetPort: 8083 + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: argocd-server --- @@ -2798,19 +2816,15 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server + app.kubernetes.io/name: argocd-server-metrics app.kubernetes.io/part-of: argocd - name: argocd-server + name: argocd-server-metrics spec: ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 + - name: metrics + port: 8083 protocol: TCP - targetPort: 8080 + targetPort: 8083 selector: app.kubernetes.io/name: argocd-server --- diff --git a/manifests/install.yaml b/manifests/install.yaml index fc98ba08a3bf5..8e7a43cd464f8 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -820,6 +820,20 @@ spec: description: Automated will keep an application synced to the target revision properties: + maintenanceWindows: + description: 'MaintenanceWindows disables auto-syncing during + the configured time windows (default: false)' + items: + properties: + duration: + description: Duration is the amount of time the maintenance + window will be open + type: string + schedule: + description: Schedule is the time the window will begin + type: string + type: object + type: array prune: description: 'Prune will prune resources automatically as part of automated sync (default: false)' @@ -2638,15 +2652,19 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd - name: argocd-server-metrics + name: argocd-server spec: ports: - - name: metrics - port: 8083 + - name: http + port: 80 protocol: TCP - targetPort: 8083 + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: argocd-server --- @@ -2655,19 +2673,15 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server + app.kubernetes.io/name: argocd-server-metrics app.kubernetes.io/part-of: argocd - name: argocd-server + name: argocd-server-metrics spec: ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 + - name: metrics + port: 8083 protocol: TCP - targetPort: 8080 + targetPort: 8083 selector: app.kubernetes.io/name: argocd-server --- diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 5742f5e889f63..7600466ba0287 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -820,6 +820,20 @@ spec: description: Automated will keep an application synced to the target revision properties: + maintenanceWindows: + description: 'MaintenanceWindows disables auto-syncing during + the configured time windows (default: false)' + items: + properties: + duration: + description: Duration is the amount of time the maintenance + window will be open + type: string + schedule: + description: Schedule is the time the window will begin + type: string + type: object + type: array prune: description: 'Prune will prune resources automatically as part of automated sync (default: false)' @@ -2553,15 +2567,19 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd - name: argocd-server-metrics + name: argocd-server spec: ports: - - name: metrics - port: 8083 + - name: http + port: 80 protocol: TCP - targetPort: 8083 + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: argocd-server --- @@ -2570,19 +2588,15 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server + app.kubernetes.io/name: argocd-server-metrics app.kubernetes.io/part-of: argocd - name: argocd-server + name: argocd-server-metrics spec: ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 + - name: metrics + port: 8083 protocol: TCP - targetPort: 8080 + targetPort: 8083 selector: app.kubernetes.io/name: argocd-server --- diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index 5e269992c655b..f9ae78cde4d6e 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -33,7 +33,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *AWSAuthConfig) Reset() { *m = AWSAuthConfig{} } func (*AWSAuthConfig) ProtoMessage() {} func (*AWSAuthConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{0} + return fileDescriptor_generated_4c40474306f8dbae, []int{0} } func (m *AWSAuthConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -61,7 +61,7 @@ var xxx_messageInfo_AWSAuthConfig proto.InternalMessageInfo func (m *AppProject) Reset() { *m = AppProject{} } func (*AppProject) ProtoMessage() {} func (*AppProject) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{1} + return fileDescriptor_generated_4c40474306f8dbae, []int{1} } func (m *AppProject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -89,7 +89,7 @@ var xxx_messageInfo_AppProject proto.InternalMessageInfo func (m *AppProjectList) Reset() { *m = AppProjectList{} } func (*AppProjectList) ProtoMessage() {} func (*AppProjectList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{2} + return fileDescriptor_generated_4c40474306f8dbae, []int{2} } func (m *AppProjectList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -117,7 +117,7 @@ var xxx_messageInfo_AppProjectList proto.InternalMessageInfo func (m *AppProjectSpec) Reset() { *m = AppProjectSpec{} } func (*AppProjectSpec) ProtoMessage() {} func (*AppProjectSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{3} + return fileDescriptor_generated_4c40474306f8dbae, []int{3} } func (m *AppProjectSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -145,7 +145,7 @@ var xxx_messageInfo_AppProjectSpec proto.InternalMessageInfo func (m *Application) Reset() { *m = Application{} } func (*Application) ProtoMessage() {} func (*Application) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{4} + return fileDescriptor_generated_4c40474306f8dbae, []int{4} } func (m *Application) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -173,7 +173,7 @@ var xxx_messageInfo_Application proto.InternalMessageInfo func (m *ApplicationCondition) Reset() { *m = ApplicationCondition{} } func (*ApplicationCondition) ProtoMessage() {} func (*ApplicationCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{5} + return fileDescriptor_generated_4c40474306f8dbae, []int{5} } func (m *ApplicationCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -201,7 +201,7 @@ var xxx_messageInfo_ApplicationCondition proto.InternalMessageInfo func (m *ApplicationDestination) Reset() { *m = ApplicationDestination{} } func (*ApplicationDestination) ProtoMessage() {} func (*ApplicationDestination) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{6} + return fileDescriptor_generated_4c40474306f8dbae, []int{6} } func (m *ApplicationDestination) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -229,7 +229,7 @@ var xxx_messageInfo_ApplicationDestination proto.InternalMessageInfo func (m *ApplicationList) Reset() { *m = ApplicationList{} } func (*ApplicationList) ProtoMessage() {} func (*ApplicationList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{7} + return fileDescriptor_generated_4c40474306f8dbae, []int{7} } func (m *ApplicationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -257,7 +257,7 @@ var xxx_messageInfo_ApplicationList proto.InternalMessageInfo func (m *ApplicationSource) Reset() { *m = ApplicationSource{} } func (*ApplicationSource) ProtoMessage() {} func (*ApplicationSource) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{8} + return fileDescriptor_generated_4c40474306f8dbae, []int{8} } func (m *ApplicationSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -285,7 +285,7 @@ var xxx_messageInfo_ApplicationSource proto.InternalMessageInfo func (m *ApplicationSourceDirectory) Reset() { *m = ApplicationSourceDirectory{} } func (*ApplicationSourceDirectory) ProtoMessage() {} func (*ApplicationSourceDirectory) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{9} + return fileDescriptor_generated_4c40474306f8dbae, []int{9} } func (m *ApplicationSourceDirectory) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -313,7 +313,7 @@ var xxx_messageInfo_ApplicationSourceDirectory proto.InternalMessageInfo func (m *ApplicationSourceHelm) Reset() { *m = ApplicationSourceHelm{} } func (*ApplicationSourceHelm) ProtoMessage() {} func (*ApplicationSourceHelm) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{10} + return fileDescriptor_generated_4c40474306f8dbae, []int{10} } func (m *ApplicationSourceHelm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -341,7 +341,7 @@ var xxx_messageInfo_ApplicationSourceHelm proto.InternalMessageInfo func (m *ApplicationSourceJsonnet) Reset() { *m = ApplicationSourceJsonnet{} } func (*ApplicationSourceJsonnet) ProtoMessage() {} func (*ApplicationSourceJsonnet) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{11} + return fileDescriptor_generated_4c40474306f8dbae, []int{11} } func (m *ApplicationSourceJsonnet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -369,7 +369,7 @@ var xxx_messageInfo_ApplicationSourceJsonnet proto.InternalMessageInfo func (m *ApplicationSourceKsonnet) Reset() { *m = ApplicationSourceKsonnet{} } func (*ApplicationSourceKsonnet) ProtoMessage() {} func (*ApplicationSourceKsonnet) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{12} + return fileDescriptor_generated_4c40474306f8dbae, []int{12} } func (m *ApplicationSourceKsonnet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -397,7 +397,7 @@ var xxx_messageInfo_ApplicationSourceKsonnet proto.InternalMessageInfo func (m *ApplicationSourceKustomize) Reset() { *m = ApplicationSourceKustomize{} } func (*ApplicationSourceKustomize) ProtoMessage() {} func (*ApplicationSourceKustomize) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{13} + return fileDescriptor_generated_4c40474306f8dbae, []int{13} } func (m *ApplicationSourceKustomize) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -425,7 +425,7 @@ var xxx_messageInfo_ApplicationSourceKustomize proto.InternalMessageInfo func (m *ApplicationSourcePlugin) Reset() { *m = ApplicationSourcePlugin{} } func (*ApplicationSourcePlugin) ProtoMessage() {} func (*ApplicationSourcePlugin) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{14} + return fileDescriptor_generated_4c40474306f8dbae, []int{14} } func (m *ApplicationSourcePlugin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -453,7 +453,7 @@ var xxx_messageInfo_ApplicationSourcePlugin proto.InternalMessageInfo func (m *ApplicationSpec) Reset() { *m = ApplicationSpec{} } func (*ApplicationSpec) ProtoMessage() {} func (*ApplicationSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{15} + return fileDescriptor_generated_4c40474306f8dbae, []int{15} } func (m *ApplicationSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -481,7 +481,7 @@ var xxx_messageInfo_ApplicationSpec proto.InternalMessageInfo func (m *ApplicationStatus) Reset() { *m = ApplicationStatus{} } func (*ApplicationStatus) ProtoMessage() {} func (*ApplicationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{16} + return fileDescriptor_generated_4c40474306f8dbae, []int{16} } func (m *ApplicationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -509,7 +509,7 @@ var xxx_messageInfo_ApplicationStatus proto.InternalMessageInfo func (m *ApplicationSummary) Reset() { *m = ApplicationSummary{} } func (*ApplicationSummary) ProtoMessage() {} func (*ApplicationSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{17} + return fileDescriptor_generated_4c40474306f8dbae, []int{17} } func (m *ApplicationSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -537,7 +537,7 @@ var xxx_messageInfo_ApplicationSummary proto.InternalMessageInfo func (m *ApplicationTree) Reset() { *m = ApplicationTree{} } func (*ApplicationTree) ProtoMessage() {} func (*ApplicationTree) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{18} + return fileDescriptor_generated_4c40474306f8dbae, []int{18} } func (m *ApplicationTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -565,7 +565,7 @@ var xxx_messageInfo_ApplicationTree proto.InternalMessageInfo func (m *ApplicationWatchEvent) Reset() { *m = ApplicationWatchEvent{} } func (*ApplicationWatchEvent) ProtoMessage() {} func (*ApplicationWatchEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{19} + return fileDescriptor_generated_4c40474306f8dbae, []int{19} } func (m *ApplicationWatchEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -593,7 +593,7 @@ var xxx_messageInfo_ApplicationWatchEvent proto.InternalMessageInfo func (m *Cluster) Reset() { *m = Cluster{} } func (*Cluster) ProtoMessage() {} func (*Cluster) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{20} + return fileDescriptor_generated_4c40474306f8dbae, []int{20} } func (m *Cluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -621,7 +621,7 @@ var xxx_messageInfo_Cluster proto.InternalMessageInfo func (m *ClusterConfig) Reset() { *m = ClusterConfig{} } func (*ClusterConfig) ProtoMessage() {} func (*ClusterConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{21} + return fileDescriptor_generated_4c40474306f8dbae, []int{21} } func (m *ClusterConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -649,7 +649,7 @@ var xxx_messageInfo_ClusterConfig proto.InternalMessageInfo func (m *ClusterList) Reset() { *m = ClusterList{} } func (*ClusterList) ProtoMessage() {} func (*ClusterList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{22} + return fileDescriptor_generated_4c40474306f8dbae, []int{22} } func (m *ClusterList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -677,7 +677,7 @@ var xxx_messageInfo_ClusterList proto.InternalMessageInfo func (m *Command) Reset() { *m = Command{} } func (*Command) ProtoMessage() {} func (*Command) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{23} + return fileDescriptor_generated_4c40474306f8dbae, []int{23} } func (m *Command) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -705,7 +705,7 @@ var xxx_messageInfo_Command proto.InternalMessageInfo func (m *ComparedTo) Reset() { *m = ComparedTo{} } func (*ComparedTo) ProtoMessage() {} func (*ComparedTo) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{24} + return fileDescriptor_generated_4c40474306f8dbae, []int{24} } func (m *ComparedTo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -733,7 +733,7 @@ var xxx_messageInfo_ComparedTo proto.InternalMessageInfo func (m *ComponentParameter) Reset() { *m = ComponentParameter{} } func (*ComponentParameter) ProtoMessage() {} func (*ComponentParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{25} + return fileDescriptor_generated_4c40474306f8dbae, []int{25} } func (m *ComponentParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -761,7 +761,7 @@ var xxx_messageInfo_ComponentParameter proto.InternalMessageInfo func (m *ConfigManagementPlugin) Reset() { *m = ConfigManagementPlugin{} } func (*ConfigManagementPlugin) ProtoMessage() {} func (*ConfigManagementPlugin) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{26} + return fileDescriptor_generated_4c40474306f8dbae, []int{26} } func (m *ConfigManagementPlugin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -789,7 +789,7 @@ var xxx_messageInfo_ConfigManagementPlugin proto.InternalMessageInfo func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{27} + return fileDescriptor_generated_4c40474306f8dbae, []int{27} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -817,7 +817,7 @@ var xxx_messageInfo_ConnectionState proto.InternalMessageInfo func (m *EnvEntry) Reset() { *m = EnvEntry{} } func (*EnvEntry) ProtoMessage() {} func (*EnvEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{28} + return fileDescriptor_generated_4c40474306f8dbae, []int{28} } func (m *EnvEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -845,7 +845,7 @@ var xxx_messageInfo_EnvEntry proto.InternalMessageInfo func (m *HealthStatus) Reset() { *m = HealthStatus{} } func (*HealthStatus) ProtoMessage() {} func (*HealthStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{29} + return fileDescriptor_generated_4c40474306f8dbae, []int{29} } func (m *HealthStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -873,7 +873,7 @@ var xxx_messageInfo_HealthStatus proto.InternalMessageInfo func (m *HelmParameter) Reset() { *m = HelmParameter{} } func (*HelmParameter) ProtoMessage() {} func (*HelmParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{30} + return fileDescriptor_generated_4c40474306f8dbae, []int{30} } func (m *HelmParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -901,7 +901,7 @@ var xxx_messageInfo_HelmParameter proto.InternalMessageInfo func (m *HelmRepository) Reset() { *m = HelmRepository{} } func (*HelmRepository) ProtoMessage() {} func (*HelmRepository) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{31} + return fileDescriptor_generated_4c40474306f8dbae, []int{31} } func (m *HelmRepository) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -929,7 +929,7 @@ var xxx_messageInfo_HelmRepository proto.InternalMessageInfo func (m *Info) Reset() { *m = Info{} } func (*Info) ProtoMessage() {} func (*Info) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{32} + return fileDescriptor_generated_4c40474306f8dbae, []int{32} } func (m *Info) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -957,7 +957,7 @@ var xxx_messageInfo_Info proto.InternalMessageInfo func (m *InfoItem) Reset() { *m = InfoItem{} } func (*InfoItem) ProtoMessage() {} func (*InfoItem) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{33} + return fileDescriptor_generated_4c40474306f8dbae, []int{33} } func (m *InfoItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -985,7 +985,7 @@ var xxx_messageInfo_InfoItem proto.InternalMessageInfo func (m *JWTToken) Reset() { *m = JWTToken{} } func (*JWTToken) ProtoMessage() {} func (*JWTToken) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{34} + return fileDescriptor_generated_4c40474306f8dbae, []int{34} } func (m *JWTToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1013,7 +1013,7 @@ var xxx_messageInfo_JWTToken proto.InternalMessageInfo func (m *JsonnetVar) Reset() { *m = JsonnetVar{} } func (*JsonnetVar) ProtoMessage() {} func (*JsonnetVar) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{35} + return fileDescriptor_generated_4c40474306f8dbae, []int{35} } func (m *JsonnetVar) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1041,7 +1041,7 @@ var xxx_messageInfo_JsonnetVar proto.InternalMessageInfo func (m *KsonnetParameter) Reset() { *m = KsonnetParameter{} } func (*KsonnetParameter) ProtoMessage() {} func (*KsonnetParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{36} + return fileDescriptor_generated_4c40474306f8dbae, []int{36} } func (m *KsonnetParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1069,7 +1069,7 @@ var xxx_messageInfo_KsonnetParameter proto.InternalMessageInfo func (m *KustomizeOptions) Reset() { *m = KustomizeOptions{} } func (*KustomizeOptions) ProtoMessage() {} func (*KustomizeOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{37} + return fileDescriptor_generated_4c40474306f8dbae, []int{37} } func (m *KustomizeOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1094,10 +1094,38 @@ func (m *KustomizeOptions) XXX_DiscardUnknown() { var xxx_messageInfo_KustomizeOptions proto.InternalMessageInfo +func (m *MaintenanceWindow) Reset() { *m = MaintenanceWindow{} } +func (*MaintenanceWindow) ProtoMessage() {} +func (*MaintenanceWindow) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_4c40474306f8dbae, []int{38} +} +func (m *MaintenanceWindow) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MaintenanceWindow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *MaintenanceWindow) XXX_Merge(src proto.Message) { + xxx_messageInfo_MaintenanceWindow.Merge(dst, src) +} +func (m *MaintenanceWindow) XXX_Size() int { + return m.Size() +} +func (m *MaintenanceWindow) XXX_DiscardUnknown() { + xxx_messageInfo_MaintenanceWindow.DiscardUnknown(m) +} + +var xxx_messageInfo_MaintenanceWindow proto.InternalMessageInfo + func (m *Operation) Reset() { *m = Operation{} } func (*Operation) ProtoMessage() {} func (*Operation) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{38} + return fileDescriptor_generated_4c40474306f8dbae, []int{39} } func (m *Operation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1125,7 +1153,7 @@ var xxx_messageInfo_Operation proto.InternalMessageInfo func (m *OperationState) Reset() { *m = OperationState{} } func (*OperationState) ProtoMessage() {} func (*OperationState) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{39} + return fileDescriptor_generated_4c40474306f8dbae, []int{40} } func (m *OperationState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1153,7 +1181,7 @@ var xxx_messageInfo_OperationState proto.InternalMessageInfo func (m *OrphanedResourcesMonitorSettings) Reset() { *m = OrphanedResourcesMonitorSettings{} } func (*OrphanedResourcesMonitorSettings) ProtoMessage() {} func (*OrphanedResourcesMonitorSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{40} + return fileDescriptor_generated_4c40474306f8dbae, []int{41} } func (m *OrphanedResourcesMonitorSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1181,7 +1209,7 @@ var xxx_messageInfo_OrphanedResourcesMonitorSettings proto.InternalMessageInfo func (m *ProjectRole) Reset() { *m = ProjectRole{} } func (*ProjectRole) ProtoMessage() {} func (*ProjectRole) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{41} + return fileDescriptor_generated_4c40474306f8dbae, []int{42} } func (m *ProjectRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1209,7 +1237,7 @@ var xxx_messageInfo_ProjectRole proto.InternalMessageInfo func (m *Repository) Reset() { *m = Repository{} } func (*Repository) ProtoMessage() {} func (*Repository) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{42} + return fileDescriptor_generated_4c40474306f8dbae, []int{43} } func (m *Repository) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1237,7 +1265,7 @@ var xxx_messageInfo_Repository proto.InternalMessageInfo func (m *RepositoryCertificate) Reset() { *m = RepositoryCertificate{} } func (*RepositoryCertificate) ProtoMessage() {} func (*RepositoryCertificate) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{43} + return fileDescriptor_generated_4c40474306f8dbae, []int{44} } func (m *RepositoryCertificate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1265,7 +1293,7 @@ var xxx_messageInfo_RepositoryCertificate proto.InternalMessageInfo func (m *RepositoryCertificateList) Reset() { *m = RepositoryCertificateList{} } func (*RepositoryCertificateList) ProtoMessage() {} func (*RepositoryCertificateList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{44} + return fileDescriptor_generated_4c40474306f8dbae, []int{45} } func (m *RepositoryCertificateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1293,7 +1321,7 @@ var xxx_messageInfo_RepositoryCertificateList proto.InternalMessageInfo func (m *RepositoryList) Reset() { *m = RepositoryList{} } func (*RepositoryList) ProtoMessage() {} func (*RepositoryList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{45} + return fileDescriptor_generated_4c40474306f8dbae, []int{46} } func (m *RepositoryList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1321,7 +1349,7 @@ var xxx_messageInfo_RepositoryList proto.InternalMessageInfo func (m *ResourceAction) Reset() { *m = ResourceAction{} } func (*ResourceAction) ProtoMessage() {} func (*ResourceAction) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{46} + return fileDescriptor_generated_4c40474306f8dbae, []int{47} } func (m *ResourceAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1349,7 +1377,7 @@ var xxx_messageInfo_ResourceAction proto.InternalMessageInfo func (m *ResourceActionDefinition) Reset() { *m = ResourceActionDefinition{} } func (*ResourceActionDefinition) ProtoMessage() {} func (*ResourceActionDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{47} + return fileDescriptor_generated_4c40474306f8dbae, []int{48} } func (m *ResourceActionDefinition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1377,7 +1405,7 @@ var xxx_messageInfo_ResourceActionDefinition proto.InternalMessageInfo func (m *ResourceActionParam) Reset() { *m = ResourceActionParam{} } func (*ResourceActionParam) ProtoMessage() {} func (*ResourceActionParam) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{48} + return fileDescriptor_generated_4c40474306f8dbae, []int{49} } func (m *ResourceActionParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1405,7 +1433,7 @@ var xxx_messageInfo_ResourceActionParam proto.InternalMessageInfo func (m *ResourceActions) Reset() { *m = ResourceActions{} } func (*ResourceActions) ProtoMessage() {} func (*ResourceActions) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{49} + return fileDescriptor_generated_4c40474306f8dbae, []int{50} } func (m *ResourceActions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1433,7 +1461,7 @@ var xxx_messageInfo_ResourceActions proto.InternalMessageInfo func (m *ResourceDiff) Reset() { *m = ResourceDiff{} } func (*ResourceDiff) ProtoMessage() {} func (*ResourceDiff) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{50} + return fileDescriptor_generated_4c40474306f8dbae, []int{51} } func (m *ResourceDiff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1461,7 +1489,7 @@ var xxx_messageInfo_ResourceDiff proto.InternalMessageInfo func (m *ResourceIgnoreDifferences) Reset() { *m = ResourceIgnoreDifferences{} } func (*ResourceIgnoreDifferences) ProtoMessage() {} func (*ResourceIgnoreDifferences) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{51} + return fileDescriptor_generated_4c40474306f8dbae, []int{52} } func (m *ResourceIgnoreDifferences) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1489,7 +1517,7 @@ var xxx_messageInfo_ResourceIgnoreDifferences proto.InternalMessageInfo func (m *ResourceNetworkingInfo) Reset() { *m = ResourceNetworkingInfo{} } func (*ResourceNetworkingInfo) ProtoMessage() {} func (*ResourceNetworkingInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{52} + return fileDescriptor_generated_4c40474306f8dbae, []int{53} } func (m *ResourceNetworkingInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1517,7 +1545,7 @@ var xxx_messageInfo_ResourceNetworkingInfo proto.InternalMessageInfo func (m *ResourceNode) Reset() { *m = ResourceNode{} } func (*ResourceNode) ProtoMessage() {} func (*ResourceNode) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{53} + return fileDescriptor_generated_4c40474306f8dbae, []int{54} } func (m *ResourceNode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1545,7 +1573,7 @@ var xxx_messageInfo_ResourceNode proto.InternalMessageInfo func (m *ResourceOverride) Reset() { *m = ResourceOverride{} } func (*ResourceOverride) ProtoMessage() {} func (*ResourceOverride) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{54} + return fileDescriptor_generated_4c40474306f8dbae, []int{55} } func (m *ResourceOverride) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1573,7 +1601,7 @@ var xxx_messageInfo_ResourceOverride proto.InternalMessageInfo func (m *ResourceRef) Reset() { *m = ResourceRef{} } func (*ResourceRef) ProtoMessage() {} func (*ResourceRef) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{55} + return fileDescriptor_generated_4c40474306f8dbae, []int{56} } func (m *ResourceRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1601,7 +1629,7 @@ var xxx_messageInfo_ResourceRef proto.InternalMessageInfo func (m *ResourceResult) Reset() { *m = ResourceResult{} } func (*ResourceResult) ProtoMessage() {} func (*ResourceResult) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{56} + return fileDescriptor_generated_4c40474306f8dbae, []int{57} } func (m *ResourceResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1629,7 +1657,7 @@ var xxx_messageInfo_ResourceResult proto.InternalMessageInfo func (m *ResourceStatus) Reset() { *m = ResourceStatus{} } func (*ResourceStatus) ProtoMessage() {} func (*ResourceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{57} + return fileDescriptor_generated_4c40474306f8dbae, []int{58} } func (m *ResourceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1657,7 +1685,7 @@ var xxx_messageInfo_ResourceStatus proto.InternalMessageInfo func (m *RevisionHistory) Reset() { *m = RevisionHistory{} } func (*RevisionHistory) ProtoMessage() {} func (*RevisionHistory) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{58} + return fileDescriptor_generated_4c40474306f8dbae, []int{59} } func (m *RevisionHistory) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1685,7 +1713,7 @@ var xxx_messageInfo_RevisionHistory proto.InternalMessageInfo func (m *RevisionMetadata) Reset() { *m = RevisionMetadata{} } func (*RevisionMetadata) ProtoMessage() {} func (*RevisionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{59} + return fileDescriptor_generated_4c40474306f8dbae, []int{60} } func (m *RevisionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1713,7 +1741,7 @@ var xxx_messageInfo_RevisionMetadata proto.InternalMessageInfo func (m *SyncOperation) Reset() { *m = SyncOperation{} } func (*SyncOperation) ProtoMessage() {} func (*SyncOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{60} + return fileDescriptor_generated_4c40474306f8dbae, []int{61} } func (m *SyncOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1741,7 +1769,7 @@ var xxx_messageInfo_SyncOperation proto.InternalMessageInfo func (m *SyncOperationResource) Reset() { *m = SyncOperationResource{} } func (*SyncOperationResource) ProtoMessage() {} func (*SyncOperationResource) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{61} + return fileDescriptor_generated_4c40474306f8dbae, []int{62} } func (m *SyncOperationResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1769,7 +1797,7 @@ var xxx_messageInfo_SyncOperationResource proto.InternalMessageInfo func (m *SyncOperationResult) Reset() { *m = SyncOperationResult{} } func (*SyncOperationResult) ProtoMessage() {} func (*SyncOperationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{62} + return fileDescriptor_generated_4c40474306f8dbae, []int{63} } func (m *SyncOperationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1797,7 +1825,7 @@ var xxx_messageInfo_SyncOperationResult proto.InternalMessageInfo func (m *SyncPolicy) Reset() { *m = SyncPolicy{} } func (*SyncPolicy) ProtoMessage() {} func (*SyncPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{63} + return fileDescriptor_generated_4c40474306f8dbae, []int{64} } func (m *SyncPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1825,7 +1853,7 @@ var xxx_messageInfo_SyncPolicy proto.InternalMessageInfo func (m *SyncPolicyAutomated) Reset() { *m = SyncPolicyAutomated{} } func (*SyncPolicyAutomated) ProtoMessage() {} func (*SyncPolicyAutomated) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{64} + return fileDescriptor_generated_4c40474306f8dbae, []int{65} } func (m *SyncPolicyAutomated) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1853,7 +1881,7 @@ var xxx_messageInfo_SyncPolicyAutomated proto.InternalMessageInfo func (m *SyncStatus) Reset() { *m = SyncStatus{} } func (*SyncStatus) ProtoMessage() {} func (*SyncStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{65} + return fileDescriptor_generated_4c40474306f8dbae, []int{66} } func (m *SyncStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1881,7 +1909,7 @@ var xxx_messageInfo_SyncStatus proto.InternalMessageInfo func (m *SyncStrategy) Reset() { *m = SyncStrategy{} } func (*SyncStrategy) ProtoMessage() {} func (*SyncStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{66} + return fileDescriptor_generated_4c40474306f8dbae, []int{67} } func (m *SyncStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1909,7 +1937,7 @@ var xxx_messageInfo_SyncStrategy proto.InternalMessageInfo func (m *SyncStrategyApply) Reset() { *m = SyncStrategyApply{} } func (*SyncStrategyApply) ProtoMessage() {} func (*SyncStrategyApply) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{67} + return fileDescriptor_generated_4c40474306f8dbae, []int{68} } func (m *SyncStrategyApply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1937,7 +1965,7 @@ var xxx_messageInfo_SyncStrategyApply proto.InternalMessageInfo func (m *SyncStrategyHook) Reset() { *m = SyncStrategyHook{} } func (*SyncStrategyHook) ProtoMessage() {} func (*SyncStrategyHook) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{68} + return fileDescriptor_generated_4c40474306f8dbae, []int{69} } func (m *SyncStrategyHook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1965,7 +1993,7 @@ var xxx_messageInfo_SyncStrategyHook proto.InternalMessageInfo func (m *TLSClientConfig) Reset() { *m = TLSClientConfig{} } func (*TLSClientConfig) ProtoMessage() {} func (*TLSClientConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_0dc9337a5e3280bf, []int{69} + return fileDescriptor_generated_4c40474306f8dbae, []int{70} } func (m *TLSClientConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2030,6 +2058,7 @@ func init() { proto.RegisterType((*JsonnetVar)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.JsonnetVar") proto.RegisterType((*KsonnetParameter)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.KsonnetParameter") proto.RegisterType((*KustomizeOptions)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.KustomizeOptions") + proto.RegisterType((*MaintenanceWindow)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.MaintenanceWindow") proto.RegisterType((*Operation)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.Operation") proto.RegisterType((*OperationState)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.OperationState") proto.RegisterType((*OrphanedResourcesMonitorSettings)(nil), "github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.OrphanedResourcesMonitorSettings") @@ -3656,6 +3685,36 @@ func (m *KustomizeOptions) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *MaintenanceWindow) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MaintenanceWindow) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Schedule != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Schedule))) + i += copy(dAtA[i:], *m.Schedule) + } + if m.Duration != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Duration))) + i += copy(dAtA[i:], *m.Duration) + } + return i, nil +} + func (m *Operation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4949,6 +5008,18 @@ func (m *SyncPolicyAutomated) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0 } i++ + if len(m.MaintenanceWindows) > 0 { + for _, msg := range m.MaintenanceWindows { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -5738,6 +5809,20 @@ func (m *KustomizeOptions) Size() (n int) { return n } +func (m *MaintenanceWindow) Size() (n int) { + var l int + _ = l + if m.Schedule != nil { + l = len(*m.Schedule) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Duration != nil { + l = len(*m.Duration) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *Operation) Size() (n int) { var l int _ = l @@ -6228,6 +6313,12 @@ func (m *SyncPolicyAutomated) Size() (n int) { _ = l n += 2 n += 2 + if len(m.MaintenanceWindows) > 0 { + for _, e := range m.MaintenanceWindows { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -6777,6 +6868,17 @@ func (this *KustomizeOptions) String() string { }, "") return s } +func (this *MaintenanceWindow) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MaintenanceWindow{`, + `Schedule:` + valueToStringGenerated(this.Schedule) + `,`, + `Duration:` + valueToStringGenerated(this.Duration) + `,`, + `}`, + }, "") + return s +} func (this *Operation) String() string { if this == nil { return "nil" @@ -7154,6 +7256,7 @@ func (this *SyncPolicyAutomated) String() string { s := strings.Join([]string{`&SyncPolicyAutomated{`, `Prune:` + fmt.Sprintf("%v", this.Prune) + `,`, `SelfHeal:` + fmt.Sprintf("%v", this.SelfHeal) + `,`, + `MaintenanceWindows:` + strings.Replace(fmt.Sprintf("%v", this.MaintenanceWindows), "MaintenanceWindow", "MaintenanceWindow", 1) + `,`, `}`, }, "") return s @@ -12737,6 +12840,116 @@ func (m *KustomizeOptions) Unmarshal(dAtA []byte) error { } return nil } +func (m *MaintenanceWindow) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MaintenanceWindow: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MaintenanceWindow: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Schedule", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Schedule = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Duration = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Operation) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -17637,6 +17850,37 @@ func (m *SyncPolicyAutomated) Unmarshal(dAtA []byte) error { } } m.SelfHeal = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaintenanceWindows", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MaintenanceWindows = append(m.MaintenanceWindows, &MaintenanceWindow{}) + if err := m.MaintenanceWindows[len(m.MaintenanceWindows)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -18360,293 +18604,298 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1/generated.proto", fileDescriptor_generated_0dc9337a5e3280bf) -} - -var fileDescriptor_generated_0dc9337a5e3280bf = []byte{ - // 4531 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3b, 0x5b, 0x8c, 0x1c, 0xd9, - 0x55, 0x5b, 0xfd, 0x9e, 0x33, 0x0f, 0x7b, 0xee, 0xae, 0x37, 0x9d, 0xd1, 0xae, 0xc7, 0x2a, 0x8b, - 0x64, 0x97, 0x6c, 0x7a, 0x58, 0xcb, 0x01, 0x07, 0x24, 0x96, 0xe9, 0x19, 0x3f, 0xc6, 0x1e, 0x8f, - 0x67, 0x6f, 0x8f, 0xd7, 0xd2, 0x26, 0x84, 0x2d, 0x57, 0xdf, 0xee, 0x2e, 0x4f, 0x77, 0x55, 0x6d, - 0x55, 0xf5, 0xd8, 0xbd, 0x90, 0x90, 0x00, 0x41, 0x21, 0xb0, 0x11, 0x12, 0xe2, 0x07, 0x14, 0x09, - 0x22, 0x7e, 0x58, 0xf1, 0x03, 0x1f, 0xe4, 0x8f, 0x8f, 0x7c, 0xc0, 0x7e, 0x06, 0x14, 0xa4, 0x28, - 0x20, 0x8b, 0x75, 0xf8, 0x40, 0xe4, 0x03, 0x10, 0xe2, 0xc7, 0x5f, 0xe8, 0xbe, 0x6f, 0x55, 0x77, - 0x7b, 0xda, 0xee, 0xb2, 0x23, 0xc2, 0x5f, 0xd7, 0x39, 0xe7, 0x9e, 0x73, 0xee, 0xb9, 0x8f, 0xf3, - 0xb8, 0xa7, 0x61, 0xa7, 0xeb, 0x25, 0xbd, 0xe1, 0xed, 0x86, 0x1b, 0x0c, 0x36, 0x9c, 0xa8, 0x1b, - 0x84, 0x51, 0x70, 0x87, 0xfd, 0xf8, 0xb4, 0xdb, 0xde, 0x08, 0x0f, 0xbb, 0x1b, 0x4e, 0xe8, 0xc5, - 0x1b, 0x4e, 0x18, 0xf6, 0x3d, 0xd7, 0x49, 0xbc, 0xc0, 0xdf, 0x38, 0x7a, 0xdd, 0xe9, 0x87, 0x3d, - 0xe7, 0xf5, 0x8d, 0x2e, 0xf1, 0x49, 0xe4, 0x24, 0xa4, 0xdd, 0x08, 0xa3, 0x20, 0x09, 0xd0, 0x67, - 0x35, 0xab, 0x86, 0x64, 0xc5, 0x7e, 0xfc, 0x8a, 0xdb, 0x6e, 0x84, 0x87, 0xdd, 0x06, 0x65, 0xd5, - 0x30, 0x58, 0x35, 0x24, 0xab, 0xb5, 0x4f, 0x1b, 0x5a, 0x74, 0x83, 0x6e, 0xb0, 0xc1, 0x38, 0xde, - 0x1e, 0x76, 0xd8, 0x17, 0xfb, 0x60, 0xbf, 0xb8, 0xa4, 0x35, 0xfb, 0xf0, 0x42, 0xdc, 0xf0, 0x02, - 0xaa, 0xdb, 0x86, 0x1b, 0x44, 0x64, 0xe3, 0x68, 0x4c, 0x9b, 0xb5, 0xf3, 0x9a, 0x66, 0xe0, 0xb8, - 0x3d, 0xcf, 0x27, 0xd1, 0x48, 0x4f, 0x68, 0x40, 0x12, 0x67, 0xd2, 0xa8, 0x8d, 0x69, 0xa3, 0xa2, - 0xa1, 0x9f, 0x78, 0x03, 0x32, 0x36, 0xe0, 0x67, 0x8f, 0x1b, 0x10, 0xbb, 0x3d, 0x32, 0x70, 0xb2, - 0xe3, 0xec, 0x77, 0x61, 0x79, 0xf3, 0x56, 0x6b, 0x73, 0x98, 0xf4, 0xb6, 0x02, 0xbf, 0xe3, 0x75, - 0xd1, 0x67, 0x60, 0xd1, 0xed, 0x0f, 0xe3, 0x84, 0x44, 0x7b, 0xce, 0x80, 0xd4, 0xad, 0x33, 0xd6, - 0x2b, 0x0b, 0xcd, 0xe7, 0x3f, 0xbc, 0xbf, 0xfe, 0xdc, 0x83, 0xfb, 0xeb, 0x8b, 0x5b, 0x1a, 0x85, - 0x4d, 0x3a, 0xf4, 0x2a, 0x54, 0xa3, 0xa0, 0x4f, 0x36, 0xf1, 0x5e, 0xbd, 0xc0, 0x86, 0x9c, 0x10, - 0x43, 0xaa, 0x98, 0x83, 0xb1, 0xc4, 0xdb, 0xff, 0x64, 0x01, 0x6c, 0x86, 0xe1, 0x7e, 0x14, 0xdc, - 0x21, 0x6e, 0x82, 0xde, 0x81, 0x1a, 0xb5, 0x42, 0xdb, 0x49, 0x1c, 0x26, 0x6d, 0xf1, 0xdc, 0xcf, - 0x34, 0xf8, 0x64, 0x1a, 0xe6, 0x64, 0xf4, 0xca, 0x51, 0xea, 0xc6, 0xd1, 0xeb, 0x8d, 0x1b, 0xb7, - 0xe9, 0xf8, 0xeb, 0x24, 0x71, 0x9a, 0x48, 0x08, 0x03, 0x0d, 0xc3, 0x8a, 0x2b, 0x3a, 0x84, 0x52, - 0x1c, 0x12, 0x97, 0x29, 0xb6, 0x78, 0x6e, 0xa7, 0xf1, 0xc4, 0xfb, 0xa3, 0xa1, 0xd5, 0x6e, 0x85, - 0xc4, 0x6d, 0x2e, 0x09, 0xb1, 0x25, 0xfa, 0x85, 0x99, 0x10, 0xfb, 0x07, 0x16, 0xac, 0x68, 0xb2, - 0x5d, 0x2f, 0x4e, 0xd0, 0xe7, 0xc7, 0x66, 0xd8, 0x98, 0x6d, 0x86, 0x74, 0x34, 0x9b, 0xdf, 0x49, - 0x21, 0xa8, 0x26, 0x21, 0xc6, 0xec, 0xee, 0x40, 0xd9, 0x4b, 0xc8, 0x20, 0xae, 0x17, 0xce, 0x14, - 0x5f, 0x59, 0x3c, 0x77, 0x31, 0x97, 0xe9, 0x35, 0x97, 0x85, 0xc4, 0xf2, 0x0e, 0xe5, 0x8d, 0xb9, - 0x08, 0xfb, 0x6f, 0x2a, 0xe6, 0xe4, 0xe8, 0xac, 0xd1, 0xeb, 0xb0, 0x18, 0x07, 0xc3, 0xc8, 0x25, - 0x98, 0x84, 0x41, 0x5c, 0xb7, 0xce, 0x14, 0xe9, 0xe2, 0xd3, 0xbd, 0xd2, 0xd2, 0x60, 0x6c, 0xd2, - 0xa0, 0xdf, 0xb5, 0x60, 0xa9, 0x4d, 0xe2, 0xc4, 0xf3, 0x99, 0x7c, 0xa9, 0xf9, 0x9b, 0xf3, 0x69, - 0x2e, 0x81, 0xdb, 0x9a, 0x73, 0xf3, 0x05, 0x31, 0x8b, 0x25, 0x03, 0x18, 0xe3, 0x94, 0x70, 0xba, - 0xe1, 0xdb, 0x24, 0x76, 0x23, 0x2f, 0xa4, 0xdf, 0xf5, 0x62, 0x7a, 0xc3, 0x6f, 0x6b, 0x14, 0x36, - 0xe9, 0xd0, 0x21, 0x94, 0xe9, 0x86, 0x8e, 0xeb, 0x25, 0xa6, 0xfc, 0xa5, 0x39, 0x94, 0x17, 0xe6, - 0xa4, 0x07, 0x45, 0xdb, 0x9d, 0x7e, 0xc5, 0x98, 0xcb, 0x40, 0xef, 0x5b, 0x50, 0x17, 0xa7, 0x0d, - 0x13, 0x6e, 0xca, 0x5b, 0x3d, 0x2f, 0x21, 0x7d, 0x2f, 0x4e, 0xea, 0x65, 0xa6, 0xc0, 0xc6, 0x6c, - 0x5b, 0xea, 0x72, 0x14, 0x0c, 0xc3, 0x6b, 0x9e, 0xdf, 0x6e, 0x9e, 0x11, 0x92, 0xea, 0x5b, 0x53, - 0x18, 0xe3, 0xa9, 0x22, 0xd1, 0x1f, 0x58, 0xb0, 0xe6, 0x3b, 0x03, 0x12, 0x87, 0x0e, 0x5d, 0x54, - 0x8e, 0x6e, 0xf6, 0x1d, 0xf7, 0x90, 0x69, 0x54, 0x79, 0x32, 0x8d, 0x6c, 0xa1, 0xd1, 0xda, 0xde, - 0x54, 0xd6, 0xf8, 0x11, 0x62, 0xd1, 0x9f, 0x58, 0xb0, 0x1a, 0x44, 0x61, 0xcf, 0xf1, 0x49, 0x5b, - 0x62, 0xe3, 0x7a, 0x95, 0x9d, 0xb8, 0xcf, 0xcd, 0xb1, 0x3e, 0x37, 0xb2, 0x3c, 0xaf, 0x07, 0xbe, - 0x97, 0x04, 0x51, 0x8b, 0x24, 0x89, 0xe7, 0x77, 0xe3, 0xe6, 0xa9, 0x07, 0xf7, 0xd7, 0x57, 0xc7, - 0xa8, 0xf0, 0xb8, 0x32, 0xf6, 0xdf, 0x16, 0x61, 0xd1, 0xd8, 0xab, 0xcf, 0xe0, 0xf2, 0xeb, 0xa7, - 0x2e, 0xbf, 0xab, 0xf9, 0x9c, 0xb1, 0x69, 0xb7, 0x1f, 0x4a, 0xa0, 0x12, 0x27, 0x4e, 0x32, 0x8c, - 0xd9, 0x39, 0x5a, 0x3c, 0xb7, 0x9b, 0x93, 0x3c, 0xc6, 0xb3, 0xb9, 0x22, 0x24, 0x56, 0xf8, 0x37, - 0x16, 0xb2, 0xd0, 0xbb, 0xb0, 0x10, 0x84, 0xd4, 0xad, 0xd1, 0x03, 0x5c, 0x62, 0x82, 0xb7, 0xe7, - 0x59, 0x6f, 0xc9, 0xab, 0xb9, 0xfc, 0xe0, 0xfe, 0xfa, 0x82, 0xfa, 0xc4, 0x5a, 0x8a, 0xed, 0xc2, - 0x0b, 0x86, 0x7e, 0x5b, 0x81, 0xdf, 0xf6, 0xd8, 0x82, 0x9e, 0x81, 0x52, 0x32, 0x0a, 0xa5, 0xdf, - 0x54, 0x26, 0x3a, 0x18, 0x85, 0x04, 0x33, 0x0c, 0xf5, 0x94, 0x03, 0x12, 0xc7, 0x4e, 0x97, 0x64, - 0x3d, 0xe5, 0x75, 0x0e, 0xc6, 0x12, 0x6f, 0xbf, 0x0b, 0x2f, 0x4e, 0xbe, 0xd8, 0xd0, 0x27, 0xa0, - 0x12, 0x93, 0xe8, 0x88, 0x44, 0x42, 0x90, 0xb6, 0x0c, 0x83, 0x62, 0x81, 0x45, 0x1b, 0xb0, 0xa0, - 0x0e, 0x8c, 0x10, 0xb7, 0x2a, 0x48, 0x17, 0xf4, 0x29, 0xd3, 0x34, 0xf6, 0x3f, 0x5b, 0x70, 0xc2, - 0x90, 0xf9, 0x0c, 0xfc, 0xd7, 0x61, 0xda, 0x7f, 0x5d, 0xca, 0x67, 0xc7, 0x4c, 0x71, 0x60, 0xdf, - 0xa8, 0xc0, 0xaa, 0xb9, 0xaf, 0xd8, 0xb1, 0x64, 0xc1, 0x0b, 0x09, 0x83, 0x9b, 0x78, 0x57, 0x98, - 0x53, 0x07, 0x2f, 0x1c, 0x8c, 0x25, 0x9e, 0xae, 0x6f, 0xe8, 0x24, 0x3d, 0x61, 0x4b, 0xb5, 0xbe, - 0xfb, 0x4e, 0xd2, 0xc3, 0x0c, 0x83, 0x7e, 0x11, 0x56, 0x12, 0x27, 0xea, 0x92, 0x04, 0x93, 0x23, - 0x2f, 0x96, 0x3b, 0x72, 0xa1, 0xf9, 0xa2, 0xa0, 0x5d, 0x39, 0x48, 0x61, 0x71, 0x86, 0x1a, 0xf9, - 0x50, 0xea, 0x91, 0xfe, 0x40, 0xdc, 0x5b, 0xfb, 0x39, 0x1d, 0x20, 0x36, 0xd1, 0x2b, 0xa4, 0x3f, - 0x68, 0xd6, 0xa8, 0xbe, 0xf4, 0x17, 0x66, 0x72, 0xd0, 0x6f, 0x58, 0xb0, 0x70, 0x38, 0x8c, 0x93, - 0x60, 0xe0, 0xbd, 0x47, 0xea, 0x35, 0x26, 0xf5, 0x66, 0x9e, 0x52, 0xaf, 0x49, 0xe6, 0xfc, 0x38, - 0xa9, 0x4f, 0xac, 0xc5, 0xa2, 0xf7, 0xa0, 0x7a, 0x18, 0x07, 0xbe, 0x4f, 0x92, 0xfa, 0x02, 0xd3, - 0xa0, 0x95, 0xab, 0x06, 0x9c, 0x75, 0x73, 0x91, 0x2e, 0xa9, 0xf8, 0xc0, 0x52, 0x20, 0x33, 0x40, - 0xdb, 0x8b, 0x88, 0x9b, 0x04, 0xd1, 0xa8, 0x0e, 0xf9, 0x1b, 0x60, 0x5b, 0x32, 0xe7, 0x06, 0x50, - 0x9f, 0x58, 0x8b, 0x45, 0x47, 0x50, 0x09, 0xfb, 0xc3, 0xae, 0xe7, 0xd7, 0x17, 0x99, 0x02, 0x38, - 0x4f, 0x05, 0xf6, 0x19, 0xe7, 0x26, 0xd0, 0x0b, 0x82, 0xff, 0xc6, 0x42, 0x9a, 0xfd, 0x77, 0x16, - 0xac, 0x4d, 0x57, 0x98, 0x9f, 0x0c, 0x77, 0x18, 0xc5, 0xfc, 0x46, 0xab, 0x99, 0x27, 0x83, 0x81, - 0xb1, 0xc4, 0xa3, 0x2f, 0x41, 0xf5, 0x8e, 0x58, 0xc2, 0x42, 0xfe, 0x4b, 0x78, 0x55, 0x2c, 0xa1, - 0x92, 0x7f, 0x55, 0x2e, 0xa3, 0x10, 0x6a, 0xff, 0x59, 0x01, 0x4e, 0x4d, 0xdc, 0xf1, 0xa8, 0x01, - 0x70, 0xe4, 0xf4, 0x87, 0xe4, 0x92, 0x47, 0xe3, 0x35, 0x1e, 0xa1, 0xae, 0x50, 0x87, 0xf9, 0x96, - 0x82, 0x62, 0x83, 0x02, 0xfd, 0x1a, 0x40, 0xe8, 0x44, 0xce, 0x80, 0x24, 0x24, 0x92, 0xd7, 0xd2, - 0x95, 0x39, 0x26, 0x43, 0x95, 0xd8, 0x97, 0x0c, 0xb5, 0xbb, 0x56, 0xa0, 0x18, 0x1b, 0xf2, 0x68, - 0x3c, 0x1a, 0x91, 0x3e, 0x71, 0x62, 0xc2, 0x12, 0xb0, 0x4c, 0x3c, 0x8a, 0x35, 0x0a, 0x9b, 0x74, - 0xd4, 0x23, 0xb0, 0x29, 0xc4, 0xe2, 0xba, 0x51, 0x1e, 0x81, 0x4d, 0x32, 0xc6, 0x02, 0x6b, 0xff, - 0x8f, 0x05, 0xf5, 0x69, 0xd6, 0x45, 0x21, 0x54, 0xc9, 0xbd, 0xe4, 0x2d, 0x27, 0xe2, 0x66, 0x9a, - 0x2f, 0x9b, 0x10, 0x4c, 0xdf, 0x72, 0x22, 0xbd, 0x6a, 0x17, 0x39, 0x77, 0x2c, 0xc5, 0xa0, 0x2e, - 0x94, 0x92, 0xbe, 0x93, 0x47, 0xf2, 0x62, 0x88, 0xd3, 0x6e, 0x77, 0x77, 0x33, 0xc6, 0x4c, 0x80, - 0xfd, 0x0f, 0x93, 0xe6, 0x2d, 0xee, 0x02, 0x6a, 0x73, 0xe2, 0x1f, 0x79, 0x51, 0xe0, 0x0f, 0x88, - 0x9f, 0x64, 0x93, 0xde, 0x8b, 0x1a, 0x85, 0x4d, 0x3a, 0xf4, 0xeb, 0x13, 0x36, 0xca, 0xb5, 0x39, - 0xa6, 0x20, 0xd4, 0x99, 0x79, 0xaf, 0xd8, 0x3f, 0x2a, 0x4c, 0x38, 0xbd, 0xea, 0x82, 0x45, 0xe7, - 0x00, 0xa8, 0x67, 0xdf, 0x8f, 0x48, 0xc7, 0xbb, 0x27, 0x66, 0xa5, 0x58, 0xee, 0x29, 0x0c, 0x36, - 0xa8, 0xd0, 0x79, 0xa8, 0x78, 0x03, 0xa7, 0x4b, 0x68, 0x04, 0x47, 0x0f, 0xca, 0x4b, 0x74, 0x0f, - 0xed, 0x30, 0xc8, 0xc3, 0xfb, 0xeb, 0x2b, 0x8a, 0x39, 0x03, 0x61, 0x41, 0x8b, 0xfe, 0xd4, 0x82, - 0x25, 0x37, 0x18, 0x0c, 0x02, 0x7f, 0xd7, 0xb9, 0x4d, 0xfa, 0x32, 0x2b, 0xea, 0x3e, 0x15, 0x3f, - 0xd2, 0xd8, 0x32, 0x24, 0x5d, 0xf4, 0x93, 0x68, 0xa4, 0x13, 0x3d, 0x13, 0x85, 0x53, 0x2a, 0xad, - 0xbd, 0x01, 0xab, 0x63, 0x03, 0xd1, 0x49, 0x28, 0x1e, 0x92, 0x11, 0xb7, 0x0d, 0xa6, 0x3f, 0xd1, - 0x0b, 0x50, 0x66, 0x47, 0x85, 0xbb, 0x78, 0xcc, 0x3f, 0x7e, 0xbe, 0x70, 0xc1, 0xb2, 0xff, 0xd8, - 0x82, 0x8f, 0x4d, 0xb9, 0x5b, 0x69, 0x5c, 0xe0, 0xeb, 0x7a, 0x89, 0xda, 0x80, 0xec, 0x9c, 0x32, - 0x0c, 0xfa, 0x02, 0x14, 0x89, 0x7f, 0x24, 0x76, 0xc9, 0xd6, 0x1c, 0x86, 0xb9, 0xe8, 0x1f, 0xf1, - 0x49, 0x57, 0x1f, 0xdc, 0x5f, 0x2f, 0x5e, 0xf4, 0x8f, 0x30, 0x65, 0x6c, 0x7f, 0xbb, 0x9c, 0x8a, - 0xdc, 0x5a, 0x32, 0x1c, 0x67, 0x5a, 0x8a, 0xb8, 0x6d, 0x37, 0xcf, 0xf5, 0x30, 0x82, 0x4e, 0x9e, - 0xdc, 0x0b, 0x59, 0xe8, 0x6b, 0x16, 0x4b, 0xa9, 0x65, 0xb0, 0x2a, 0xdc, 0xc1, 0x53, 0x48, 0xef, - 0xcd, 0x2c, 0x5d, 0x02, 0xb1, 0x29, 0x9a, 0xfa, 0xaf, 0x90, 0x67, 0xd7, 0xe2, 0x22, 0x55, 0x37, - 0x91, 0x4c, 0xba, 0x25, 0x1e, 0x0d, 0x01, 0xe2, 0x91, 0xef, 0xee, 0x07, 0x7d, 0xcf, 0x1d, 0x89, - 0x2c, 0x62, 0x9e, 0xfb, 0xa8, 0xa5, 0x98, 0x71, 0x67, 0xa3, 0xbf, 0xb1, 0x21, 0x08, 0x7d, 0xd3, - 0x82, 0x55, 0xaf, 0xeb, 0x07, 0x11, 0xd9, 0xf6, 0x3a, 0x1d, 0x12, 0x11, 0x9f, 0x26, 0xad, 0x3c, - 0xa7, 0x3f, 0x98, 0x43, 0xbc, 0xcc, 0x39, 0x77, 0xb2, 0xbc, 0x9b, 0x1f, 0x17, 0x26, 0x58, 0x1d, - 0x43, 0xe1, 0x71, 0x4d, 0x90, 0x03, 0x25, 0xcf, 0xef, 0x04, 0x22, 0xa7, 0x7f, 0x63, 0x0e, 0x8d, - 0x76, 0xfc, 0x4e, 0xa0, 0x4f, 0x06, 0xfd, 0xc2, 0x8c, 0xb5, 0xfd, 0xdf, 0xb5, 0x74, 0x50, 0xce, - 0x93, 0xba, 0xf7, 0x60, 0x21, 0x52, 0x49, 0x3c, 0xf7, 0x46, 0x3b, 0x39, 0xd8, 0x43, 0xa4, 0x92, - 0x2a, 0x0b, 0xd2, 0xe9, 0xba, 0x16, 0x47, 0xbd, 0x12, 0x5d, 0x22, 0xb1, 0x73, 0xe7, 0xdd, 0x05, - 0x42, 0xa4, 0xce, 0x97, 0x47, 0x3e, 0xcd, 0x97, 0x47, 0xbe, 0x8b, 0x02, 0xa8, 0xf4, 0x88, 0xd3, - 0x4f, 0x7a, 0x22, 0x5f, 0xbe, 0x3c, 0x57, 0x98, 0x41, 0x19, 0x65, 0x53, 0x65, 0x0e, 0xc5, 0x42, - 0x0c, 0x1a, 0x42, 0xb5, 0xe7, 0xc5, 0x2c, 0xd2, 0xe5, 0x57, 0xf4, 0xd5, 0xb9, 0x6c, 0xca, 0x73, - 0x96, 0x2b, 0x9c, 0xa3, 0x3e, 0x5c, 0x02, 0x80, 0xa5, 0x2c, 0xf4, 0x9b, 0x16, 0x80, 0x2b, 0x93, - 0x64, 0xb9, 0xbd, 0x6f, 0xe4, 0x73, 0x23, 0xa8, 0xe4, 0x5b, 0xfb, 0x36, 0x05, 0x8a, 0xb1, 0x21, - 0x16, 0xbd, 0x03, 0x4b, 0x11, 0x71, 0x03, 0xdf, 0xf5, 0xfa, 0xa4, 0xbd, 0x99, 0xd4, 0x2b, 0xcc, - 0xe6, 0x3f, 0x3d, 0x5b, 0x32, 0x7b, 0xe0, 0x0d, 0x48, 0xf3, 0x24, 0xf5, 0x31, 0xd8, 0xe0, 0x81, - 0x53, 0x1c, 0xd1, 0x57, 0x2d, 0x58, 0x51, 0x45, 0x02, 0xba, 0x14, 0x44, 0xe4, 0x71, 0x3b, 0x79, - 0xd4, 0x23, 0x18, 0xc3, 0x26, 0xa2, 0x49, 0x64, 0x1a, 0x86, 0x33, 0x42, 0xd1, 0xdb, 0x00, 0xc1, - 0x6d, 0x56, 0x03, 0xa0, 0xf3, 0xac, 0x3d, 0xf6, 0x3c, 0x57, 0x78, 0x3d, 0x49, 0x72, 0xc0, 0x06, - 0x37, 0x74, 0x0d, 0x80, 0x9f, 0x93, 0x83, 0x51, 0x48, 0x58, 0xba, 0xb6, 0xd0, 0xfc, 0x94, 0xb4, - 0x7c, 0x4b, 0x61, 0x1e, 0xde, 0x5f, 0x1f, 0x8f, 0xc7, 0x59, 0x1d, 0xc4, 0x18, 0x8e, 0xee, 0x41, - 0x35, 0x1e, 0x0e, 0x06, 0x8e, 0xca, 0xbc, 0xae, 0xe7, 0xe4, 0xa2, 0x38, 0x53, 0xbd, 0x25, 0x05, - 0x00, 0x4b, 0x71, 0xb6, 0x0f, 0x68, 0x9c, 0x1e, 0x9d, 0x87, 0x25, 0x72, 0x2f, 0x21, 0x91, 0xef, - 0xf4, 0x6f, 0xe2, 0x5d, 0x99, 0x2d, 0xb0, 0x65, 0xbf, 0x68, 0xc0, 0x71, 0x8a, 0x0a, 0xd9, 0x2a, - 0x68, 0x2a, 0x30, 0x7a, 0xd0, 0x41, 0x93, 0x0c, 0x91, 0xec, 0xdf, 0x2e, 0xa4, 0xfc, 0xf3, 0x41, - 0x44, 0x08, 0xea, 0x43, 0xd9, 0x0f, 0xda, 0xea, 0x7e, 0xbb, 0x9c, 0xc3, 0xfd, 0xb6, 0x17, 0xb4, - 0x8d, 0x2a, 0x32, 0xfd, 0x8a, 0x31, 0x17, 0x82, 0x7e, 0xcb, 0x82, 0x65, 0x59, 0x92, 0x64, 0x08, - 0x11, 0x8c, 0xe4, 0x26, 0xf6, 0x94, 0x10, 0xbb, 0x7c, 0xc3, 0x94, 0x82, 0xd3, 0x42, 0xed, 0x1f, - 0x5a, 0xa9, 0x44, 0xed, 0x96, 0x93, 0xb8, 0xbd, 0x8b, 0x47, 0x34, 0x9e, 0xbe, 0x96, 0x2a, 0x9e, - 0xfd, 0x9c, 0x59, 0x3c, 0x7b, 0x78, 0x7f, 0xfd, 0x93, 0xd3, 0x9e, 0xb8, 0xee, 0x52, 0x0e, 0x0d, - 0xc6, 0xc2, 0xa8, 0xb3, 0x7d, 0x11, 0x16, 0x0d, 0x8d, 0xc5, 0x55, 0x9e, 0x57, 0x75, 0x49, 0x45, - 0x1e, 0x06, 0x10, 0x9b, 0xf2, 0xec, 0x7f, 0x2c, 0x40, 0x55, 0x54, 0xd6, 0x67, 0xae, 0xd6, 0xc9, - 0x20, 0xb2, 0x30, 0x35, 0x88, 0x0c, 0xa1, 0xe2, 0xb2, 0x77, 0x3a, 0xe1, 0x2f, 0xe6, 0x49, 0x4b, - 0x85, 0x76, 0xfc, 0xdd, 0x4f, 0xeb, 0xc4, 0xbf, 0xb1, 0x90, 0x83, 0xde, 0xb7, 0xe0, 0x84, 0x4b, - 0xd3, 0x12, 0x57, 0x5f, 0x69, 0xa5, 0xb9, 0x6b, 0xc9, 0x5b, 0x69, 0x8e, 0xcd, 0x8f, 0x09, 0xe9, - 0x27, 0x32, 0x08, 0x9c, 0x95, 0x6d, 0xff, 0x75, 0x11, 0x96, 0x53, 0x9a, 0xa3, 0xd7, 0xa0, 0x36, - 0x8c, 0xe9, 0x59, 0x54, 0xe1, 0xb7, 0x2a, 0x37, 0xde, 0x14, 0x70, 0xac, 0x28, 0x28, 0x75, 0xe8, - 0xc4, 0xf1, 0xdd, 0x20, 0x6a, 0x0b, 0x3b, 0x2b, 0xea, 0x7d, 0x01, 0xc7, 0x8a, 0x82, 0x26, 0x86, - 0xb7, 0x89, 0x13, 0x91, 0xe8, 0x20, 0x38, 0x24, 0x63, 0x8f, 0x43, 0x4d, 0x8d, 0xc2, 0x26, 0x1d, - 0x33, 0x5a, 0xd2, 0x8f, 0xb7, 0xfa, 0x1e, 0xf1, 0x13, 0xae, 0x66, 0x0e, 0x46, 0x3b, 0xd8, 0x6d, - 0x99, 0x1c, 0xb5, 0xd1, 0x32, 0x08, 0x9c, 0x95, 0x8d, 0xbe, 0x62, 0xc1, 0xb2, 0x73, 0x37, 0xd6, - 0xcf, 0xbc, 0xf5, 0xf2, 0xdc, 0xdb, 0x27, 0xf5, 0x6c, 0xdc, 0x5c, 0xa5, 0xc7, 0x3e, 0x05, 0xc2, - 0x69, 0x89, 0xf6, 0xf7, 0x2c, 0x90, 0xcf, 0xc7, 0xcf, 0xa0, 0xaa, 0xdc, 0x4d, 0x57, 0x95, 0x9b, - 0xf3, 0x9f, 0x93, 0x29, 0x15, 0xe5, 0x3d, 0xa8, 0xd2, 0xac, 0xd2, 0xf1, 0xdb, 0xe8, 0xa7, 0xa0, - 0xea, 0xf2, 0x9f, 0xc2, 0x6d, 0xb0, 0x7a, 0xa3, 0xc0, 0x62, 0x89, 0x43, 0x2f, 0x41, 0xc9, 0x89, - 0xba, 0xd2, 0x55, 0xb0, 0x72, 0xec, 0x66, 0xd4, 0x8d, 0x31, 0x83, 0xda, 0xef, 0x17, 0x00, 0xb6, - 0x82, 0x41, 0xe8, 0x44, 0xa4, 0x7d, 0x10, 0xfc, 0xbf, 0xcf, 0xe0, 0xec, 0xdf, 0xb3, 0x00, 0x51, - 0x7b, 0x04, 0x3e, 0xf1, 0x75, 0x65, 0x04, 0x6d, 0xc0, 0x82, 0x2b, 0xa1, 0xe2, 0xd4, 0xab, 0x90, - 0x5e, 0x91, 0x63, 0x4d, 0x33, 0xc3, 0xdd, 0x7a, 0x56, 0x26, 0xfe, 0xfc, 0x94, 0xab, 0xe5, 0x66, - 0x05, 0x34, 0x51, 0x07, 0xb0, 0xbf, 0x51, 0x80, 0x17, 0xf9, 0x86, 0xbe, 0xee, 0xf8, 0x4e, 0x97, - 0x0c, 0xa8, 0x56, 0xb3, 0x96, 0x00, 0xde, 0xa1, 0xb9, 0x94, 0x27, 0xeb, 0xa3, 0x73, 0xed, 0x49, - 0xbe, 0x97, 0xf8, 0xee, 0xd9, 0xf1, 0xbd, 0x04, 0x33, 0xce, 0x28, 0x84, 0x9a, 0xec, 0xf0, 0x10, - 0x1e, 0x22, 0x0f, 0x29, 0xea, 0xa0, 0x5d, 0x16, 0xbc, 0xb1, 0x92, 0x62, 0x7f, 0xc7, 0x82, 0xec, - 0xa5, 0xcd, 0xfc, 0x1d, 0x7f, 0x05, 0xcc, 0xfa, 0xbb, 0xf4, 0xbb, 0xdd, 0xec, 0x4f, 0x61, 0xe8, - 0xf3, 0xb0, 0xe8, 0x24, 0x09, 0x19, 0x84, 0x09, 0x8b, 0x68, 0x8b, 0x4f, 0x16, 0xd1, 0x5e, 0x0f, - 0xda, 0x5e, 0xc7, 0x63, 0x11, 0xad, 0xc9, 0xce, 0x7e, 0x13, 0x6a, 0xb2, 0xaa, 0x32, 0xc3, 0x32, - 0x9e, 0x4d, 0x55, 0x88, 0xa6, 0x6c, 0x14, 0x07, 0x96, 0xcc, 0x84, 0xec, 0x29, 0xd8, 0xc4, 0x7e, - 0xdf, 0x82, 0xe5, 0x54, 0x6d, 0x39, 0x27, 0xdd, 0xa9, 0xd7, 0xeb, 0x04, 0x2c, 0x57, 0x8e, 0x3c, - 0x9f, 0x87, 0x1a, 0x35, 0x7d, 0x54, 0x2f, 0x69, 0x14, 0x36, 0xe9, 0xec, 0x6f, 0x15, 0x60, 0x85, - 0x3d, 0x2c, 0x91, 0x30, 0x88, 0x3d, 0x96, 0xf7, 0xbd, 0x0c, 0xc5, 0x61, 0xd4, 0x17, 0xfa, 0x2c, - 0x0a, 0x0e, 0xc5, 0x9b, 0x78, 0x17, 0x53, 0xf8, 0x0c, 0x87, 0xd2, 0x86, 0x8a, 0xeb, 0x6c, 0x53, - 0x1f, 0x41, 0xb5, 0x58, 0xe2, 0x91, 0xf5, 0xd6, 0x26, 0x85, 0x60, 0x81, 0x41, 0xaf, 0x40, 0xcd, - 0x25, 0x51, 0xc2, 0xa8, 0x4a, 0x8c, 0x6a, 0x89, 0x6e, 0xd6, 0x2d, 0x01, 0xc3, 0x0a, 0x4b, 0x6f, - 0xe8, 0x43, 0x32, 0x62, 0x84, 0x65, 0x46, 0xc8, 0x5f, 0x84, 0x38, 0x08, 0x4b, 0x5c, 0x2a, 0xa2, - 0xa8, 0x3c, 0x56, 0x44, 0x51, 0x3d, 0x2e, 0xa2, 0xb0, 0xaf, 0x03, 0x2b, 0x7d, 0xe4, 0xb5, 0xcd, - 0xde, 0x84, 0x1a, 0x65, 0x47, 0x5d, 0x52, 0x5e, 0x2c, 0x5b, 0x50, 0xbb, 0x7a, 0xeb, 0x80, 0x07, - 0x32, 0x36, 0x14, 0x3d, 0x87, 0x5f, 0xb0, 0x45, 0x3d, 0xad, 0x9d, 0x38, 0x1e, 0xb2, 0x43, 0x44, - 0x91, 0xe8, 0x2c, 0x14, 0xc9, 0xbd, 0x90, 0xb1, 0x2c, 0xea, 0x4b, 0xf8, 0xe2, 0xbd, 0xd0, 0x8b, - 0x48, 0x4c, 0x89, 0xc8, 0xbd, 0xd0, 0x1e, 0x02, 0xe8, 0x02, 0x7d, 0x5e, 0xfb, 0xf4, 0x0c, 0x94, - 0xdc, 0xa0, 0x4d, 0xc4, 0x06, 0x55, 0x6c, 0xb6, 0x82, 0x36, 0xc1, 0x0c, 0x63, 0x7f, 0xdd, 0x82, - 0x93, 0xd9, 0xaa, 0xfa, 0x8f, 0xcd, 0x77, 0xec, 0xc2, 0x49, 0x55, 0xc3, 0xbe, 0x11, 0xf2, 0x92, - 0xc4, 0x05, 0x58, 0xba, 0x3d, 0xf4, 0xfa, 0x6d, 0xf1, 0x2d, 0xd4, 0x51, 0xe5, 0xec, 0xa6, 0x81, - 0xc3, 0x29, 0x4a, 0x3b, 0x06, 0xdd, 0x99, 0x80, 0x3a, 0xa2, 0x60, 0x65, 0xcd, 0x1d, 0xd6, 0xb5, - 0x46, 0xbe, 0xab, 0x1b, 0x20, 0x6a, 0xe9, 0x7a, 0x95, 0xfd, 0xad, 0x12, 0x64, 0x4a, 0x0f, 0x68, - 0x68, 0x36, 0x5f, 0x58, 0x39, 0x36, 0x5f, 0xa8, 0x35, 0x99, 0xd4, 0x80, 0x81, 0x3e, 0x03, 0xe5, - 0xb0, 0xe7, 0xc4, 0x72, 0x51, 0xd6, 0xa5, 0xc5, 0xf7, 0x29, 0xf0, 0xa1, 0x59, 0x21, 0x61, 0x10, - 0xcc, 0xa9, 0xcd, 0xeb, 0xb5, 0x78, 0x8c, 0xcb, 0xf9, 0x12, 0x2f, 0x08, 0x63, 0x12, 0x0f, 0xfb, - 0x89, 0x08, 0xdf, 0xf7, 0xf2, 0xb2, 0x2c, 0xe7, 0xaa, 0x2b, 0xc3, 0xfc, 0x1b, 0x1b, 0x12, 0xd1, - 0xe7, 0x60, 0x21, 0x4e, 0x9c, 0x28, 0x79, 0xc2, 0x52, 0x95, 0x32, 0x5f, 0x4b, 0x32, 0xc1, 0x9a, - 0x1f, 0x7a, 0x1b, 0xa0, 0xe3, 0xf9, 0x5e, 0xdc, 0x63, 0xdc, 0xab, 0x4f, 0xe6, 0x4e, 0x2f, 0x29, - 0x0e, 0xd8, 0xe0, 0x66, 0xff, 0x12, 0x9c, 0x39, 0xae, 0x65, 0x8a, 0x06, 0xc1, 0x77, 0x9d, 0xc8, - 0x17, 0xaf, 0xca, 0x6c, 0x9b, 0xdd, 0x72, 0x22, 0x1f, 0x33, 0xa8, 0xfd, 0x41, 0x01, 0x16, 0x8d, - 0xae, 0xb8, 0x19, 0xee, 0x8b, 0x4c, 0x17, 0x5f, 0x61, 0xc6, 0x2e, 0xbe, 0x57, 0xa0, 0x16, 0x06, - 0x7d, 0xcf, 0xf5, 0xd4, 0x7b, 0x17, 0x73, 0x1d, 0xfb, 0x02, 0x86, 0x15, 0x16, 0x25, 0xb0, 0x70, - 0xe7, 0x6e, 0xc2, 0x6e, 0x45, 0xf9, 0xba, 0x35, 0xcf, 0x23, 0x8e, 0xbc, 0x61, 0xf5, 0x32, 0x49, - 0x48, 0x8c, 0xb5, 0x20, 0xea, 0xfe, 0xba, 0x51, 0x30, 0x0c, 0x79, 0xc9, 0x54, 0x14, 0x96, 0x58, - 0xc7, 0x5c, 0x8c, 0x05, 0xc6, 0xfe, 0xa3, 0x32, 0x80, 0xe1, 0x72, 0xcf, 0x40, 0x29, 0x22, 0x61, - 0x90, 0xb5, 0x15, 0xa5, 0xc0, 0x0c, 0x93, 0x72, 0x6f, 0x85, 0xc7, 0x72, 0x6f, 0xc5, 0x63, 0x13, - 0xe6, 0x5f, 0x80, 0xe5, 0x38, 0xee, 0xed, 0x47, 0xde, 0x91, 0x93, 0x90, 0x6b, 0x64, 0x24, 0x5e, - 0xa3, 0x55, 0x65, 0xa8, 0xd5, 0xba, 0xa2, 0x91, 0x38, 0x4d, 0x3b, 0xb1, 0xd6, 0x50, 0xfe, 0xf1, - 0xd5, 0x1a, 0x50, 0x0b, 0x4e, 0x79, 0x7e, 0x4c, 0xdc, 0x61, 0x24, 0x9e, 0x51, 0xae, 0x04, 0x71, - 0x42, 0x27, 0x55, 0x61, 0xbb, 0xf6, 0x65, 0xc1, 0xe8, 0xd4, 0xce, 0x24, 0x22, 0x3c, 0x79, 0x2c, - 0xb5, 0xa7, 0x44, 0xb0, 0x73, 0x57, 0x33, 0xfc, 0xaa, 0x80, 0x63, 0x45, 0x41, 0x7d, 0x15, 0xf1, - 0x9d, 0xdb, 0x7d, 0xb2, 0xdb, 0x89, 0x59, 0x1d, 0xb7, 0x66, 0xb8, 0x58, 0x8e, 0xb8, 0xd4, 0xc2, - 0x9a, 0x06, 0x5d, 0x86, 0x55, 0x9d, 0xfd, 0xcb, 0xa8, 0x88, 0x17, 0x69, 0xd5, 0xc3, 0x8f, 0xae, - 0x17, 0xc8, 0x10, 0x69, 0x7c, 0x0c, 0xda, 0x86, 0x93, 0x29, 0x20, 0x9d, 0x37, 0x30, 0x3e, 0x75, - 0xc1, 0xe7, 0x64, 0x8a, 0x0f, 0x9d, 0xf2, 0xd8, 0x08, 0xfb, 0x6b, 0x05, 0x38, 0xa5, 0x37, 0x27, - 0x85, 0x7a, 0x1d, 0xba, 0x42, 0xec, 0x71, 0x9a, 0x97, 0xbd, 0x8c, 0x3e, 0x73, 0x55, 0xc0, 0x6f, - 0x29, 0x0c, 0x36, 0xa8, 0xa8, 0xed, 0x68, 0x2c, 0xc7, 0x0a, 0xcf, 0x99, 0x9d, 0xbb, 0x25, 0xe0, - 0x58, 0x51, 0xb0, 0x56, 0x76, 0x12, 0x25, 0xad, 0xe1, 0x6d, 0x36, 0x20, 0x53, 0xbc, 0xd9, 0xd2, - 0x28, 0x6c, 0xd2, 0x3d, 0x46, 0x38, 0x29, 0xd4, 0xa1, 0x01, 0x18, 0xdb, 0xa7, 0x19, 0x75, 0xd8, - 0x13, 0x97, 0xa2, 0xb0, 0xff, 0xd3, 0x82, 0x8f, 0x4f, 0x34, 0xc5, 0x33, 0x28, 0x87, 0x0c, 0xd3, - 0xe5, 0x90, 0xfd, 0xb9, 0x2a, 0xbe, 0x13, 0xa6, 0x30, 0xa5, 0x38, 0xf2, 0x03, 0x0b, 0x56, 0x34, - 0xfd, 0xff, 0xad, 0x66, 0x78, 0xad, 0xf7, 0x94, 0xc9, 0x7d, 0xc0, 0x26, 0xc7, 0xfd, 0xdb, 0xa6, - 0x2b, 0xbb, 0x3f, 0x8f, 0xf1, 0x53, 0x47, 0x50, 0x61, 0xfd, 0x1b, 0x52, 0xc3, 0xbd, 0x1c, 0x6a, - 0xef, 0x5c, 0x38, 0x8b, 0x6f, 0x75, 0x5a, 0xc9, 0x3e, 0x63, 0x2c, 0xa4, 0xd9, 0x03, 0xa8, 0xa7, - 0xc9, 0xb7, 0x09, 0xf5, 0xd8, 0x33, 0x6a, 0xbd, 0x01, 0x0b, 0x0e, 0x1b, 0xb5, 0x3b, 0x74, 0xb2, - 0x6d, 0xa4, 0x9b, 0x12, 0x81, 0x35, 0x8d, 0xfd, 0xe7, 0x16, 0x3c, 0x3f, 0x41, 0xbd, 0x1c, 0x03, - 0xff, 0x44, 0x1f, 0xe9, 0x29, 0x5d, 0xb6, 0x6d, 0xd2, 0x71, 0x64, 0xe4, 0x66, 0xc4, 0x79, 0xdb, - 0x1c, 0x8c, 0x25, 0xde, 0xfe, 0x77, 0x0b, 0x4e, 0xa4, 0x75, 0x8d, 0xd1, 0x55, 0x40, 0x7c, 0x32, - 0xdb, 0x5e, 0xec, 0x06, 0x47, 0x24, 0x1a, 0xd1, 0x99, 0x73, 0xad, 0xd7, 0x04, 0x27, 0xb4, 0x39, - 0x46, 0x81, 0x27, 0x8c, 0x42, 0x5f, 0x67, 0xc5, 0x34, 0x69, 0x6d, 0xb9, 0xf0, 0xad, 0xdc, 0x16, - 0x5e, 0xaf, 0xa4, 0x19, 0xf0, 0x28, 0x79, 0xd8, 0x14, 0x6e, 0xff, 0x55, 0x01, 0x96, 0xe4, 0xf0, - 0x6d, 0xaf, 0xd3, 0xa1, 0xf6, 0x66, 0x71, 0x84, 0x98, 0x9c, 0xb2, 0x37, 0x0b, 0x32, 0x30, 0xc7, - 0x51, 0x7b, 0x1f, 0x7a, 0x7e, 0x3b, 0x9b, 0x00, 0x5d, 0xf3, 0xfc, 0x36, 0x66, 0x98, 0x74, 0xa3, - 0x71, 0xf1, 0xf8, 0x46, 0x63, 0xb5, 0x13, 0x4a, 0x8f, 0x0a, 0xe9, 0x78, 0x6b, 0xac, 0x0e, 0x04, - 0x8c, 0xeb, 0xfb, 0x40, 0xa3, 0xb0, 0x49, 0x47, 0x35, 0xe9, 0x7b, 0x47, 0x84, 0x0f, 0xaa, 0xa4, - 0x35, 0xd9, 0x95, 0x08, 0xac, 0x69, 0xa8, 0x26, 0x6d, 0xaf, 0xd3, 0x11, 0xb9, 0xbb, 0xd2, 0x84, - 0x5a, 0x07, 0x33, 0x8c, 0xfd, 0x23, 0x76, 0x73, 0x4f, 0xe9, 0xa7, 0xc8, 0xcb, 0x82, 0xd2, 0x20, - 0xc5, 0x47, 0x9d, 0x42, 0x6d, 0xe3, 0xd2, 0x0c, 0x36, 0x3e, 0x0f, 0x4b, 0x77, 0xe2, 0xc0, 0xdf, - 0x0f, 0x3c, 0x9f, 0x75, 0xa8, 0x95, 0xf5, 0x63, 0xe6, 0xd5, 0xd6, 0x8d, 0x3d, 0x09, 0xc7, 0x29, - 0x2a, 0xfb, 0x3b, 0x65, 0x78, 0x51, 0x3d, 0xeb, 0x91, 0xe4, 0x6e, 0x10, 0x1d, 0x7a, 0x7e, 0x97, - 0x15, 0x2d, 0xbe, 0x69, 0xc1, 0x12, 0xb7, 0xb5, 0x68, 0xf3, 0xe2, 0xef, 0x96, 0x6e, 0x1e, 0x0f, - 0x88, 0x29, 0x49, 0x8d, 0x03, 0x43, 0x4a, 0xa6, 0xc5, 0xcb, 0x44, 0xe1, 0x94, 0x3a, 0xe8, 0x3d, - 0x00, 0xd9, 0x4d, 0xdd, 0xc9, 0xa3, 0xa1, 0x5c, 0x2a, 0x87, 0x49, 0x47, 0xc7, 0x26, 0x07, 0x4a, - 0x02, 0x36, 0xa4, 0xa1, 0xaf, 0x5a, 0x50, 0xe9, 0x73, 0xab, 0x14, 0x99, 0xe0, 0x5f, 0xce, 0xdf, - 0x2a, 0xa6, 0x3d, 0xd4, 0x4d, 0x2f, 0x2c, 0x21, 0x84, 0x23, 0x0c, 0x55, 0xcf, 0xef, 0x46, 0x24, - 0x96, 0x69, 0xca, 0x27, 0x0d, 0xff, 0xda, 0x70, 0x83, 0x88, 0x30, 0x6f, 0x1a, 0x38, 0xed, 0xa6, - 0xd3, 0x77, 0x7c, 0x97, 0x44, 0x3b, 0x9c, 0x5c, 0x5f, 0x91, 0x02, 0x80, 0x25, 0xa3, 0xb1, 0x57, - 0xf1, 0xf2, 0x2c, 0xaf, 0xe2, 0x6b, 0x6f, 0xc0, 0xea, 0xd8, 0x32, 0x3e, 0x4e, 0xc3, 0xdd, 0xda, - 0x67, 0x61, 0xf1, 0x49, 0x7b, 0xf5, 0xbe, 0x57, 0xd6, 0xf7, 0xdc, 0x5e, 0xd0, 0x66, 0xcf, 0xc1, - 0x91, 0x5e, 0x4d, 0x11, 0x7a, 0xe4, 0xb5, 0x37, 0x8c, 0xf6, 0x5c, 0x05, 0xc4, 0xa6, 0x3c, 0xba, - 0x33, 0x43, 0x27, 0x22, 0xfe, 0x53, 0xdd, 0x99, 0xfb, 0x4a, 0x02, 0x36, 0xa4, 0x21, 0x22, 0x5a, - 0xb8, 0x8a, 0x73, 0x67, 0xad, 0xb2, 0xd4, 0x38, 0xa9, 0x8d, 0x8b, 0x66, 0x6f, 0x2b, 0x7e, 0x6a, - 0xbf, 0x8a, 0xa2, 0xc9, 0x9b, 0xb9, 0x1f, 0x04, 0xde, 0x03, 0x93, 0x86, 0xe1, 0x8c, 0x70, 0xb4, - 0x09, 0x27, 0xe4, 0x0a, 0xbc, 0x45, 0x22, 0xf6, 0x4f, 0x0c, 0xee, 0x43, 0x54, 0x02, 0x88, 0xd3, - 0x68, 0x9c, 0xa5, 0x37, 0xfa, 0x3a, 0x2a, 0xd3, 0xfa, 0x3a, 0xd0, 0xa1, 0x6a, 0xe1, 0xaa, 0xe6, - 0xdb, 0xc2, 0x05, 0xe3, 0xed, 0x5b, 0xf6, 0xb7, 0x2d, 0x38, 0x29, 0xb5, 0xbe, 0x71, 0x44, 0xa2, - 0xc8, 0x6b, 0x33, 0xbf, 0xc0, 0xd1, 0x3a, 0x46, 0x51, 0x7e, 0xe1, 0x8a, 0x44, 0x60, 0x4d, 0x43, - 0x73, 0xc4, 0xf1, 0x96, 0xc3, 0x42, 0x3a, 0x47, 0x9c, 0xa9, 0x39, 0xf0, 0x55, 0xa8, 0xf2, 0x80, - 0x27, 0xce, 0x56, 0xd3, 0x44, 0x20, 0x85, 0x25, 0xde, 0xfe, 0x2f, 0x0b, 0xcc, 0xd3, 0x31, 0x9b, - 0xd7, 0x7c, 0x15, 0xaa, 0x47, 0x62, 0xe9, 0x32, 0x8f, 0x21, 0x72, 0xc9, 0x24, 0x5e, 0x39, 0xd8, - 0xe2, 0x6c, 0x21, 0x4a, 0xe9, 0x31, 0x42, 0x94, 0xf2, 0x54, 0x8f, 0xfc, 0x32, 0x14, 0x87, 0x5e, - 0x5b, 0x44, 0x19, 0xfa, 0x79, 0x63, 0x67, 0x1b, 0x53, 0xb8, 0xfd, 0xaf, 0x45, 0x9d, 0x21, 0x88, - 0xa2, 0xde, 0x4f, 0xc4, 0xb4, 0xcf, 0xab, 0xb7, 0x2c, 0x3e, 0xf3, 0x97, 0xd2, 0x6f, 0x59, 0x0f, - 0xef, 0xaf, 0x03, 0x9f, 0x2e, 0xab, 0xc4, 0x4f, 0x78, 0xd9, 0xaa, 0x1e, 0x53, 0x7a, 0xbd, 0x00, - 0xb5, 0x5e, 0x10, 0x1c, 0xb2, 0xb4, 0xbd, 0x96, 0x12, 0x51, 0xbb, 0x22, 0xe0, 0x0f, 0x8d, 0xdf, - 0x58, 0x51, 0xa3, 0x4d, 0x58, 0xa0, 0xbf, 0x59, 0xcd, 0x57, 0x94, 0x3d, 0xce, 0xaa, 0xb3, 0x20, - 0x11, 0x13, 0xca, 0xc3, 0x7a, 0x14, 0x35, 0x18, 0xeb, 0xcf, 0x65, 0x2c, 0x20, 0x6d, 0xb0, 0x96, - 0x44, 0x60, 0x4d, 0x63, 0x7f, 0x64, 0x2c, 0xb3, 0x78, 0xed, 0xfb, 0x89, 0x58, 0xe6, 0x0b, 0x99, - 0x65, 0x3e, 0x33, 0xb6, 0xcc, 0x2b, 0xba, 0xbd, 0x35, 0xb5, 0xd4, 0xcf, 0xf2, 0x4e, 0xa4, 0x13, - 0xa1, 0x8b, 0x27, 0xaa, 0x63, 0x6a, 0x22, 0x74, 0xb5, 0x31, 0xc3, 0x70, 0x4f, 0xf0, 0xee, 0xd0, - 0x8b, 0x48, 0xbc, 0x1f, 0x0d, 0x7d, 0xcf, 0xef, 0xb2, 0xad, 0x51, 0x33, 0x3d, 0x41, 0x0a, 0x8d, - 0xb3, 0xf4, 0xf6, 0x5f, 0x16, 0x68, 0x92, 0x98, 0x6a, 0x77, 0x45, 0xaf, 0x41, 0x2d, 0x92, 0xff, - 0xf1, 0xcb, 0x54, 0xa3, 0xd4, 0xbf, 0xfb, 0x14, 0x05, 0xfa, 0x02, 0x40, 0x9b, 0x84, 0xfd, 0x60, - 0xc4, 0x2a, 0xee, 0xa5, 0xc7, 0xae, 0xb8, 0x2b, 0x2f, 0xbf, 0xad, 0xb8, 0x60, 0x83, 0x23, 0x5a, - 0x83, 0x82, 0xd7, 0x66, 0xab, 0x59, 0x6c, 0x82, 0xa0, 0x2d, 0xec, 0x6c, 0xe3, 0x82, 0xd7, 0x36, - 0xba, 0x48, 0x2a, 0xcf, 0xae, 0x8b, 0xc4, 0xfe, 0x7b, 0xe6, 0xac, 0xf8, 0xf4, 0xaf, 0xcb, 0x0a, - 0xcd, 0x27, 0xa0, 0xe2, 0x0c, 0x93, 0x5e, 0x30, 0xd6, 0x0b, 0xb7, 0xc9, 0xa0, 0x58, 0x60, 0xd1, - 0x2e, 0x94, 0xda, 0x34, 0x83, 0x2b, 0x3c, 0xb6, 0xa1, 0x74, 0x06, 0x47, 0x13, 0x3d, 0xc6, 0x05, - 0xbd, 0x04, 0xa5, 0xc4, 0xe9, 0xca, 0x1a, 0x3f, 0x7b, 0x6e, 0x38, 0x70, 0xba, 0x31, 0x66, 0x50, - 0xf3, 0x66, 0x2a, 0x1d, 0xf3, 0xe6, 0xfe, 0x17, 0x25, 0x58, 0x4e, 0x3d, 0xe4, 0xa4, 0x76, 0x81, - 0x75, 0xec, 0x2e, 0x38, 0x0b, 0xe5, 0x30, 0x1a, 0xfa, 0x7c, 0x5e, 0x35, 0x7d, 0x31, 0xd0, 0x7d, - 0x46, 0x30, 0xc7, 0x51, 0x1b, 0xb5, 0xa3, 0x11, 0x1e, 0xfa, 0xe2, 0x65, 0x53, 0xd9, 0x68, 0x9b, - 0x41, 0xb1, 0xc0, 0xa2, 0x2f, 0xc2, 0x52, 0xcc, 0x0e, 0x60, 0xe4, 0x24, 0xa4, 0x2b, 0xff, 0xb4, - 0x70, 0x79, 0xee, 0x76, 0x75, 0xce, 0x8e, 0xc7, 0xf7, 0x26, 0x04, 0xa7, 0xc4, 0xa1, 0xaf, 0x58, - 0x66, 0x8b, 0x7e, 0x65, 0xee, 0xca, 0x62, 0xf6, 0x81, 0x8c, 0xef, 0xae, 0x47, 0x77, 0xea, 0x87, - 0x6a, 0x67, 0x57, 0x9f, 0xc2, 0xce, 0x86, 0x09, 0xbd, 0x51, 0x9f, 0x82, 0x85, 0x81, 0xe3, 0x7b, - 0x1d, 0x12, 0x27, 0x71, 0xbd, 0xc6, 0xf6, 0x13, 0xfb, 0x5b, 0xe7, 0x75, 0x09, 0xc4, 0x1a, 0x6f, - 0x7f, 0xd9, 0x82, 0x53, 0x13, 0xa7, 0xf5, 0xcc, 0xaa, 0x06, 0xf4, 0xe6, 0x7a, 0x7e, 0xc2, 0xd3, - 0x23, 0x3a, 0x7a, 0x3a, 0xff, 0xaf, 0x10, 0x0f, 0x9b, 0xcb, 0x53, 0x57, 0xec, 0xf1, 0x6e, 0x4d, - 0x7d, 0x73, 0x15, 0x9f, 0xe1, 0xcd, 0xf5, 0x3b, 0x16, 0x18, 0xff, 0xd7, 0x41, 0xbf, 0x0a, 0x0b, - 0xce, 0x30, 0x09, 0x06, 0x4e, 0x42, 0xda, 0x22, 0x73, 0xdc, 0xcb, 0xe5, 0x9f, 0x41, 0x9b, 0x92, - 0x2b, 0xb7, 0x97, 0xfa, 0xc4, 0x5a, 0x9e, 0xdd, 0xe3, 0xcb, 0x97, 0x19, 0xa0, 0x2f, 0x12, 0xeb, - 0x11, 0x17, 0xc9, 0x6b, 0x50, 0x8b, 0x49, 0xbf, 0x43, 0x1d, 0xa6, 0xb8, 0x70, 0x94, 0xad, 0x5b, - 0x02, 0x8e, 0x15, 0x85, 0xfd, 0x1f, 0x62, 0xd6, 0x22, 0x86, 0xb9, 0x90, 0xe9, 0x58, 0x9a, 0xdd, - 0xfd, 0x8f, 0x00, 0x5c, 0xd5, 0xc2, 0x98, 0xc3, 0x9f, 0x68, 0x74, 0x3f, 0xa4, 0xf9, 0x17, 0x0f, - 0x09, 0xc3, 0x86, 0xb0, 0xd4, 0xee, 0x2a, 0x1e, 0xb7, 0xbb, 0xec, 0x7f, 0xb3, 0x20, 0x75, 0xc1, - 0xa1, 0x01, 0x94, 0xa9, 0x06, 0xa3, 0x1c, 0xba, 0x2d, 0x4d, 0xbe, 0x74, 0xe7, 0x8d, 0x9a, 0x0b, - 0x74, 0x7d, 0xd8, 0x4f, 0xcc, 0xa5, 0x20, 0x4f, 0x84, 0x2e, 0xdc, 0x44, 0xd7, 0x72, 0x92, 0x46, - 0x23, 0x1f, 0xf1, 0x37, 0x7f, 0x15, 0x03, 0xd9, 0x17, 0x60, 0x75, 0x4c, 0x23, 0xba, 0x89, 0x58, - 0x03, 0x57, 0x76, 0x13, 0xb1, 0x16, 0x2f, 0xcc, 0x71, 0xf6, 0x07, 0x16, 0x9c, 0xcc, 0xb2, 0x47, - 0x7f, 0x68, 0xc1, 0x6a, 0x9c, 0xe5, 0xf7, 0x54, 0xac, 0xa6, 0x32, 0xd2, 0x31, 0x14, 0x1e, 0xd7, - 0x80, 0xae, 0x68, 0xb6, 0x1d, 0x3a, 0xf5, 0xe2, 0x6a, 0x1d, 0xfb, 0xe2, 0x9a, 0x7e, 0x97, 0x2c, - 0xcc, 0xf4, 0x2e, 0x69, 0x3e, 0x19, 0x16, 0x67, 0xed, 0x40, 0x2b, 0x3d, 0xa2, 0x03, 0x4d, 0xb7, - 0xbd, 0x95, 0xa7, 0xb5, 0xbd, 0x35, 0x1b, 0x1f, 0x7e, 0x74, 0xfa, 0xb9, 0xef, 0x7e, 0x74, 0xfa, - 0xb9, 0xef, 0x7f, 0x74, 0xfa, 0xb9, 0x2f, 0x3f, 0x38, 0x6d, 0x7d, 0xf8, 0xe0, 0xb4, 0xf5, 0xdd, - 0x07, 0xa7, 0xad, 0xef, 0x3f, 0x38, 0x6d, 0xfd, 0xcb, 0x83, 0xd3, 0xd6, 0xef, 0xff, 0xf0, 0xf4, - 0x73, 0x6f, 0xd7, 0xa4, 0x69, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xeb, 0xe2, 0x9b, 0x0c, 0x63, - 0x4d, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1/generated.proto", fileDescriptor_generated_4c40474306f8dbae) +} + +var fileDescriptor_generated_4c40474306f8dbae = []byte{ + // 4613 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3c, 0x4d, 0x8c, 0x23, 0xe9, + 0x55, 0x5b, 0xb6, 0xdb, 0x76, 0xbf, 0xfe, 0x99, 0xe9, 0x2f, 0x3b, 0x1b, 0xa7, 0xb5, 0x3b, 0x3d, + 0xaa, 0x15, 0xc9, 0x2e, 0xd9, 0xb8, 0xd9, 0xd5, 0x04, 0x26, 0x20, 0xb1, 0xb4, 0xbb, 0xe7, 0xa7, + 0x67, 0xba, 0x7b, 0x7a, 0x3f, 0xf7, 0xec, 0x48, 0x9b, 0x10, 0xb6, 0xa6, 0xfc, 0xd9, 0xae, 0x69, + 0xbb, 0xaa, 0xb6, 0xaa, 0xdc, 0x33, 0x5e, 0x48, 0x48, 0x80, 0xa0, 0x10, 0xd8, 0x08, 0x09, 0xb8, + 0x80, 0x22, 0x41, 0xc4, 0x85, 0x15, 0x17, 0x38, 0x90, 0x1b, 0x87, 0x1c, 0x60, 0x8f, 0x01, 0x05, + 0x29, 0x0a, 0xa8, 0xc5, 0x76, 0x38, 0x20, 0x72, 0x00, 0x84, 0xb8, 0xcc, 0x05, 0xf4, 0xfd, 0x7f, + 0x55, 0xb6, 0xa7, 0x3d, 0xe3, 0x9a, 0x89, 0x08, 0x37, 0xd7, 0x7b, 0xaf, 0xde, 0x7b, 0xdf, 0xfb, + 0x7e, 0xde, 0xcf, 0xf7, 0xca, 0xb0, 0xdd, 0xf1, 0x92, 0xee, 0xe0, 0x4e, 0xdd, 0x0d, 0xfa, 0xeb, + 0x4e, 0xd4, 0x09, 0xc2, 0x28, 0xb8, 0xcb, 0x7e, 0x7c, 0xca, 0x6d, 0xad, 0x87, 0x87, 0x9d, 0x75, + 0x27, 0xf4, 0xe2, 0x75, 0x27, 0x0c, 0x7b, 0x9e, 0xeb, 0x24, 0x5e, 0xe0, 0xaf, 0x1f, 0xbd, 0xea, + 0xf4, 0xc2, 0xae, 0xf3, 0xea, 0x7a, 0x87, 0xf8, 0x24, 0x72, 0x12, 0xd2, 0xaa, 0x87, 0x51, 0x90, + 0x04, 0xe8, 0x33, 0x9a, 0x55, 0x5d, 0xb2, 0x62, 0x3f, 0x7e, 0xc9, 0x6d, 0xd5, 0xc3, 0xc3, 0x4e, + 0x9d, 0xb2, 0xaa, 0x1b, 0xac, 0xea, 0x92, 0xd5, 0xea, 0xa7, 0x0c, 0x2d, 0x3a, 0x41, 0x27, 0x58, + 0x67, 0x1c, 0xef, 0x0c, 0xda, 0xec, 0x89, 0x3d, 0xb0, 0x5f, 0x5c, 0xd2, 0xaa, 0x7d, 0x78, 0x29, + 0xae, 0x7b, 0x01, 0xd5, 0x6d, 0xdd, 0x0d, 0x22, 0xb2, 0x7e, 0x34, 0xa2, 0xcd, 0xea, 0x45, 0x4d, + 0xd3, 0x77, 0xdc, 0xae, 0xe7, 0x93, 0x68, 0xa8, 0x07, 0xd4, 0x27, 0x89, 0x33, 0xee, 0xad, 0xf5, + 0x49, 0x6f, 0x45, 0x03, 0x3f, 0xf1, 0xfa, 0x64, 0xe4, 0x85, 0x9f, 0x3e, 0xed, 0x85, 0xd8, 0xed, + 0x92, 0xbe, 0x93, 0x7d, 0xcf, 0x7e, 0x07, 0x96, 0x36, 0x6e, 0x37, 0x37, 0x06, 0x49, 0x77, 0x33, + 0xf0, 0xdb, 0x5e, 0x07, 0x7d, 0x1a, 0x16, 0xdc, 0xde, 0x20, 0x4e, 0x48, 0xb4, 0xe7, 0xf4, 0x49, + 0xcd, 0xba, 0x60, 0xbd, 0x34, 0xdf, 0xf8, 0xc8, 0x07, 0xc7, 0x6b, 0xcf, 0x9c, 0x1c, 0xaf, 0x2d, + 0x6c, 0x6a, 0x14, 0x36, 0xe9, 0xd0, 0xcb, 0x50, 0x89, 0x82, 0x1e, 0xd9, 0xc0, 0x7b, 0xb5, 0x02, + 0x7b, 0xe5, 0x8c, 0x78, 0xa5, 0x82, 0x39, 0x18, 0x4b, 0xbc, 0xfd, 0x8f, 0x16, 0xc0, 0x46, 0x18, + 0xee, 0x47, 0xc1, 0x5d, 0xe2, 0x26, 0xe8, 0x6d, 0xa8, 0x52, 0x2b, 0xb4, 0x9c, 0xc4, 0x61, 0xd2, + 0x16, 0x5e, 0xfb, 0xa9, 0x3a, 0x1f, 0x4c, 0xdd, 0x1c, 0x8c, 0x9e, 0x39, 0x4a, 0x5d, 0x3f, 0x7a, + 0xb5, 0x7e, 0xf3, 0x0e, 0x7d, 0x7f, 0x97, 0x24, 0x4e, 0x03, 0x09, 0x61, 0xa0, 0x61, 0x58, 0x71, + 0x45, 0x87, 0x50, 0x8a, 0x43, 0xe2, 0x32, 0xc5, 0x16, 0x5e, 0xdb, 0xae, 0x3f, 0xf6, 0xfa, 0xa8, + 0x6b, 0xb5, 0x9b, 0x21, 0x71, 0x1b, 0x8b, 0x42, 0x6c, 0x89, 0x3e, 0x61, 0x26, 0xc4, 0xfe, 0xbe, + 0x05, 0xcb, 0x9a, 0x6c, 0xc7, 0x8b, 0x13, 0xf4, 0xb9, 0x91, 0x11, 0xd6, 0xa7, 0x1b, 0x21, 0x7d, + 0x9b, 0x8d, 0xef, 0xac, 0x10, 0x54, 0x95, 0x10, 0x63, 0x74, 0x77, 0x61, 0xce, 0x4b, 0x48, 0x3f, + 0xae, 0x15, 0x2e, 0x14, 0x5f, 0x5a, 0x78, 0xed, 0x72, 0x2e, 0xc3, 0x6b, 0x2c, 0x09, 0x89, 0x73, + 0xdb, 0x94, 0x37, 0xe6, 0x22, 0xec, 0xbf, 0x2e, 0x9b, 0x83, 0xa3, 0xa3, 0x46, 0xaf, 0xc2, 0x42, + 0x1c, 0x0c, 0x22, 0x97, 0x60, 0x12, 0x06, 0x71, 0xcd, 0xba, 0x50, 0xa4, 0x93, 0x4f, 0xd7, 0x4a, + 0x53, 0x83, 0xb1, 0x49, 0x83, 0x7e, 0xdb, 0x82, 0xc5, 0x16, 0x89, 0x13, 0xcf, 0x67, 0xf2, 0xa5, + 0xe6, 0x6f, 0xcc, 0xa6, 0xb9, 0x04, 0x6e, 0x69, 0xce, 0x8d, 0x67, 0xc5, 0x28, 0x16, 0x0d, 0x60, + 0x8c, 0x53, 0xc2, 0xe9, 0x82, 0x6f, 0x91, 0xd8, 0x8d, 0xbc, 0x90, 0x3e, 0xd7, 0x8a, 0xe9, 0x05, + 0xbf, 0xa5, 0x51, 0xd8, 0xa4, 0x43, 0x87, 0x30, 0x47, 0x17, 0x74, 0x5c, 0x2b, 0x31, 0xe5, 0xaf, + 0xcc, 0xa0, 0xbc, 0x30, 0x27, 0xdd, 0x28, 0xda, 0xee, 0xf4, 0x29, 0xc6, 0x5c, 0x06, 0x7a, 0xcf, + 0x82, 0x9a, 0xd8, 0x6d, 0x98, 0x70, 0x53, 0xde, 0xee, 0x7a, 0x09, 0xe9, 0x79, 0x71, 0x52, 0x9b, + 0x63, 0x0a, 0xac, 0x4f, 0xb7, 0xa4, 0xae, 0x46, 0xc1, 0x20, 0xbc, 0xe1, 0xf9, 0xad, 0xc6, 0x05, + 0x21, 0xa9, 0xb6, 0x39, 0x81, 0x31, 0x9e, 0x28, 0x12, 0xfd, 0x9e, 0x05, 0xab, 0xbe, 0xd3, 0x27, + 0x71, 0xe8, 0xd0, 0x49, 0xe5, 0xe8, 0x46, 0xcf, 0x71, 0x0f, 0x99, 0x46, 0xe5, 0xc7, 0xd3, 0xc8, + 0x16, 0x1a, 0xad, 0xee, 0x4d, 0x64, 0x8d, 0x1f, 0x22, 0x16, 0xfd, 0xb1, 0x05, 0x2b, 0x41, 0x14, + 0x76, 0x1d, 0x9f, 0xb4, 0x24, 0x36, 0xae, 0x55, 0xd8, 0x8e, 0xfb, 0xec, 0x0c, 0xf3, 0x73, 0x33, + 0xcb, 0x73, 0x37, 0xf0, 0xbd, 0x24, 0x88, 0x9a, 0x24, 0x49, 0x3c, 0xbf, 0x13, 0x37, 0xce, 0x9d, + 0x1c, 0xaf, 0xad, 0x8c, 0x50, 0xe1, 0x51, 0x65, 0xec, 0xbf, 0x29, 0xc2, 0x82, 0xb1, 0x56, 0x9f, + 0xc2, 0xe1, 0xd7, 0x4b, 0x1d, 0x7e, 0xd7, 0xf3, 0xd9, 0x63, 0x93, 0x4e, 0x3f, 0x94, 0x40, 0x39, + 0x4e, 0x9c, 0x64, 0x10, 0xb3, 0x7d, 0xb4, 0xf0, 0xda, 0x4e, 0x4e, 0xf2, 0x18, 0xcf, 0xc6, 0xb2, + 0x90, 0x58, 0xe6, 0xcf, 0x58, 0xc8, 0x42, 0xef, 0xc0, 0x7c, 0x10, 0x52, 0xb7, 0x46, 0x37, 0x70, + 0x89, 0x09, 0xde, 0x9a, 0x65, 0xbe, 0x25, 0xaf, 0xc6, 0xd2, 0xc9, 0xf1, 0xda, 0xbc, 0x7a, 0xc4, + 0x5a, 0x8a, 0xed, 0xc2, 0xb3, 0x86, 0x7e, 0x9b, 0x81, 0xdf, 0xf2, 0xd8, 0x84, 0x5e, 0x80, 0x52, + 0x32, 0x0c, 0xa5, 0xdf, 0x54, 0x26, 0x3a, 0x18, 0x86, 0x04, 0x33, 0x0c, 0xf5, 0x94, 0x7d, 0x12, + 0xc7, 0x4e, 0x87, 0x64, 0x3d, 0xe5, 0x2e, 0x07, 0x63, 0x89, 0xb7, 0xdf, 0x81, 0xe7, 0xc6, 0x1f, + 0x6c, 0xe8, 0xe3, 0x50, 0x8e, 0x49, 0x74, 0x44, 0x22, 0x21, 0x48, 0x5b, 0x86, 0x41, 0xb1, 0xc0, + 0xa2, 0x75, 0x98, 0x57, 0x1b, 0x46, 0x88, 0x5b, 0x11, 0xa4, 0xf3, 0x7a, 0x97, 0x69, 0x1a, 0xfb, + 0x9f, 0x2c, 0x38, 0x63, 0xc8, 0x7c, 0x0a, 0xfe, 0xeb, 0x30, 0xed, 0xbf, 0xae, 0xe4, 0xb3, 0x62, + 0x26, 0x38, 0xb0, 0xaf, 0x97, 0x61, 0xc5, 0x5c, 0x57, 0x6c, 0x5b, 0xb2, 0xe0, 0x85, 0x84, 0xc1, + 0x2d, 0xbc, 0x23, 0xcc, 0xa9, 0x83, 0x17, 0x0e, 0xc6, 0x12, 0x4f, 0xe7, 0x37, 0x74, 0x92, 0xae, + 0xb0, 0xa5, 0x9a, 0xdf, 0x7d, 0x27, 0xe9, 0x62, 0x86, 0x41, 0x3f, 0x0f, 0xcb, 0x89, 0x13, 0x75, + 0x48, 0x82, 0xc9, 0x91, 0x17, 0xcb, 0x15, 0x39, 0xdf, 0x78, 0x4e, 0xd0, 0x2e, 0x1f, 0xa4, 0xb0, + 0x38, 0x43, 0x8d, 0x7c, 0x28, 0x75, 0x49, 0xaf, 0x2f, 0xce, 0xad, 0xfd, 0x9c, 0x36, 0x10, 0x1b, + 0xe8, 0x35, 0xd2, 0xeb, 0x37, 0xaa, 0x54, 0x5f, 0xfa, 0x0b, 0x33, 0x39, 0xe8, 0xd7, 0x2c, 0x98, + 0x3f, 0x1c, 0xc4, 0x49, 0xd0, 0xf7, 0xde, 0x25, 0xb5, 0x2a, 0x93, 0x7a, 0x2b, 0x4f, 0xa9, 0x37, + 0x24, 0x73, 0xbe, 0x9d, 0xd4, 0x23, 0xd6, 0x62, 0xd1, 0xbb, 0x50, 0x39, 0x8c, 0x03, 0xdf, 0x27, + 0x49, 0x6d, 0x9e, 0x69, 0xd0, 0xcc, 0x55, 0x03, 0xce, 0xba, 0xb1, 0x40, 0xa7, 0x54, 0x3c, 0x60, + 0x29, 0x90, 0x19, 0xa0, 0xe5, 0x45, 0xc4, 0x4d, 0x82, 0x68, 0x58, 0x83, 0xfc, 0x0d, 0xb0, 0x25, + 0x99, 0x73, 0x03, 0xa8, 0x47, 0xac, 0xc5, 0xa2, 0x23, 0x28, 0x87, 0xbd, 0x41, 0xc7, 0xf3, 0x6b, + 0x0b, 0x4c, 0x01, 0x9c, 0xa7, 0x02, 0xfb, 0x8c, 0x73, 0x03, 0xe8, 0x01, 0xc1, 0x7f, 0x63, 0x21, + 0xcd, 0xfe, 0x5b, 0x0b, 0x56, 0x27, 0x2b, 0xcc, 0x77, 0x86, 0x3b, 0x88, 0x62, 0x7e, 0xa2, 0x55, + 0xcd, 0x9d, 0xc1, 0xc0, 0x58, 0xe2, 0xd1, 0x17, 0xa1, 0x72, 0x57, 0x4c, 0x61, 0x21, 0xff, 0x29, + 0xbc, 0x2e, 0xa6, 0x50, 0xc9, 0xbf, 0x2e, 0xa7, 0x51, 0x08, 0xb5, 0xff, 0xb4, 0x00, 0xe7, 0xc6, + 0xae, 0x78, 0x54, 0x07, 0x38, 0x72, 0x7a, 0x03, 0x72, 0xc5, 0xa3, 0xf1, 0x1a, 0x8f, 0x50, 0x97, + 0xa9, 0xc3, 0x7c, 0x53, 0x41, 0xb1, 0x41, 0x81, 0x7e, 0x05, 0x20, 0x74, 0x22, 0xa7, 0x4f, 0x12, + 0x12, 0xc9, 0x63, 0xe9, 0xda, 0x0c, 0x83, 0xa1, 0x4a, 0xec, 0x4b, 0x86, 0xda, 0x5d, 0x2b, 0x50, + 0x8c, 0x0d, 0x79, 0x34, 0x1e, 0x8d, 0x48, 0x8f, 0x38, 0x31, 0x61, 0x09, 0x58, 0x26, 0x1e, 0xc5, + 0x1a, 0x85, 0x4d, 0x3a, 0xea, 0x11, 0xd8, 0x10, 0x62, 0x71, 0xdc, 0x28, 0x8f, 0xc0, 0x06, 0x19, + 0x63, 0x81, 0xb5, 0xff, 0xdb, 0x82, 0xda, 0x24, 0xeb, 0xa2, 0x10, 0x2a, 0xe4, 0x7e, 0xf2, 0xa6, + 0x13, 0x71, 0x33, 0xcd, 0x96, 0x4d, 0x08, 0xa6, 0x6f, 0x3a, 0x91, 0x9e, 0xb5, 0xcb, 0x9c, 0x3b, + 0x96, 0x62, 0x50, 0x07, 0x4a, 0x49, 0xcf, 0xc9, 0x23, 0x79, 0x31, 0xc4, 0x69, 0xb7, 0xbb, 0xb3, + 0x11, 0x63, 0x26, 0xc0, 0xfe, 0xfb, 0x71, 0xe3, 0x16, 0x67, 0x01, 0xb5, 0x39, 0xf1, 0x8f, 0xbc, + 0x28, 0xf0, 0xfb, 0xc4, 0x4f, 0xb2, 0x49, 0xef, 0x65, 0x8d, 0xc2, 0x26, 0x1d, 0xfa, 0xd5, 0x31, + 0x0b, 0xe5, 0xc6, 0x0c, 0x43, 0x10, 0xea, 0x4c, 0xbd, 0x56, 0xec, 0x1f, 0x16, 0xc6, 0xec, 0x5e, + 0x75, 0xc0, 0xa2, 0xd7, 0x00, 0xa8, 0x67, 0xdf, 0x8f, 0x48, 0xdb, 0xbb, 0x2f, 0x46, 0xa5, 0x58, + 0xee, 0x29, 0x0c, 0x36, 0xa8, 0xd0, 0x45, 0x28, 0x7b, 0x7d, 0xa7, 0x43, 0x68, 0x04, 0x47, 0x37, + 0xca, 0xf3, 0x74, 0x0d, 0x6d, 0x33, 0xc8, 0x83, 0xe3, 0xb5, 0x65, 0xc5, 0x9c, 0x81, 0xb0, 0xa0, + 0x45, 0x7f, 0x62, 0xc1, 0xa2, 0x1b, 0xf4, 0xfb, 0x81, 0xbf, 0xe3, 0xdc, 0x21, 0x3d, 0x99, 0x15, + 0x75, 0x9e, 0x88, 0x1f, 0xa9, 0x6f, 0x1a, 0x92, 0x2e, 0xfb, 0x49, 0x34, 0xd4, 0x89, 0x9e, 0x89, + 0xc2, 0x29, 0x95, 0x56, 0x5f, 0x87, 0x95, 0x91, 0x17, 0xd1, 0x59, 0x28, 0x1e, 0x92, 0x21, 0xb7, + 0x0d, 0xa6, 0x3f, 0xd1, 0xb3, 0x30, 0xc7, 0xb6, 0x0a, 0x77, 0xf1, 0x98, 0x3f, 0xfc, 0x6c, 0xe1, + 0x92, 0x65, 0xff, 0x91, 0x05, 0x1f, 0x9d, 0x70, 0xb6, 0xd2, 0xb8, 0xc0, 0xd7, 0xf5, 0x12, 0xb5, + 0x00, 0xd9, 0x3e, 0x65, 0x18, 0xf4, 0x79, 0x28, 0x12, 0xff, 0x48, 0xac, 0x92, 0xcd, 0x19, 0x0c, + 0x73, 0xd9, 0x3f, 0xe2, 0x83, 0xae, 0x9c, 0x1c, 0xaf, 0x15, 0x2f, 0xfb, 0x47, 0x98, 0x32, 0xb6, + 0xbf, 0x35, 0x97, 0x8a, 0xdc, 0x9a, 0x32, 0x1c, 0x67, 0x5a, 0x8a, 0xb8, 0x6d, 0x27, 0xcf, 0xf9, + 0x30, 0x82, 0x4e, 0x9e, 0xdc, 0x0b, 0x59, 0xe8, 0xab, 0x16, 0x4b, 0xa9, 0x65, 0xb0, 0x2a, 0xdc, + 0xc1, 0x13, 0x48, 0xef, 0xcd, 0x2c, 0x5d, 0x02, 0xb1, 0x29, 0x9a, 0xfa, 0xaf, 0x90, 0x67, 0xd7, + 0xe2, 0x20, 0x55, 0x27, 0x91, 0x4c, 0xba, 0x25, 0x1e, 0x0d, 0x00, 0xe2, 0xa1, 0xef, 0xee, 0x07, + 0x3d, 0xcf, 0x1d, 0x8a, 0x2c, 0x62, 0x96, 0xf3, 0xa8, 0xa9, 0x98, 0x71, 0x67, 0xa3, 0x9f, 0xb1, + 0x21, 0x08, 0x7d, 0xc3, 0x82, 0x15, 0xaf, 0xe3, 0x07, 0x11, 0xd9, 0xf2, 0xda, 0x6d, 0x12, 0x11, + 0x9f, 0x26, 0xad, 0x3c, 0xa7, 0x3f, 0x98, 0x41, 0xbc, 0xcc, 0x39, 0xb7, 0xb3, 0xbc, 0x1b, 0x1f, + 0x13, 0x26, 0x58, 0x19, 0x41, 0xe1, 0x51, 0x4d, 0x90, 0x03, 0x25, 0xcf, 0x6f, 0x07, 0x22, 0xa7, + 0x7f, 0x7d, 0x06, 0x8d, 0xb6, 0xfd, 0x76, 0xa0, 0x77, 0x06, 0x7d, 0xc2, 0x8c, 0xb5, 0xfd, 0x5f, + 0xd5, 0x74, 0x50, 0xce, 0x93, 0xba, 0x77, 0x61, 0x3e, 0x52, 0x49, 0x3c, 0xf7, 0x46, 0xdb, 0x39, + 0xd8, 0x43, 0xa4, 0x92, 0x2a, 0x0b, 0xd2, 0xe9, 0xba, 0x16, 0x47, 0xbd, 0x12, 0x9d, 0x22, 0xb1, + 0x72, 0x67, 0x5d, 0x05, 0x42, 0xa4, 0xce, 0x97, 0x87, 0x3e, 0xcd, 0x97, 0x87, 0xbe, 0x8b, 0x02, + 0x28, 0x77, 0x89, 0xd3, 0x4b, 0xba, 0x22, 0x5f, 0xbe, 0x3a, 0x53, 0x98, 0x41, 0x19, 0x65, 0x53, + 0x65, 0x0e, 0xc5, 0x42, 0x0c, 0x1a, 0x40, 0xa5, 0xeb, 0xc5, 0x2c, 0xd2, 0xe5, 0x47, 0xf4, 0xf5, + 0x99, 0x6c, 0xca, 0x73, 0x96, 0x6b, 0x9c, 0xa3, 0xde, 0x5c, 0x02, 0x80, 0xa5, 0x2c, 0xf4, 0xeb, + 0x16, 0x80, 0x2b, 0x93, 0x64, 0xb9, 0xbc, 0x6f, 0xe6, 0x73, 0x22, 0xa8, 0xe4, 0x5b, 0xfb, 0x36, + 0x05, 0x8a, 0xb1, 0x21, 0x16, 0xbd, 0x0d, 0x8b, 0x11, 0x71, 0x03, 0xdf, 0xf5, 0x7a, 0xa4, 0xb5, + 0x91, 0xd4, 0xca, 0xcc, 0xe6, 0x3f, 0x39, 0x5d, 0x32, 0x7b, 0xe0, 0xf5, 0x49, 0xe3, 0x2c, 0xf5, + 0x31, 0xd8, 0xe0, 0x81, 0x53, 0x1c, 0xd1, 0x57, 0x2c, 0x58, 0x56, 0x45, 0x02, 0x3a, 0x15, 0x44, + 0xe4, 0x71, 0xdb, 0x79, 0xd4, 0x23, 0x18, 0xc3, 0x06, 0xa2, 0x49, 0x64, 0x1a, 0x86, 0x33, 0x42, + 0xd1, 0x5b, 0x00, 0xc1, 0x1d, 0x56, 0x03, 0xa0, 0xe3, 0xac, 0x3e, 0xf2, 0x38, 0x97, 0x79, 0x3d, + 0x49, 0x72, 0xc0, 0x06, 0x37, 0x74, 0x03, 0x80, 0xef, 0x93, 0x83, 0x61, 0x48, 0x58, 0xba, 0x36, + 0xdf, 0xf8, 0xa4, 0xb4, 0x7c, 0x53, 0x61, 0x1e, 0x1c, 0xaf, 0x8d, 0xc6, 0xe3, 0xac, 0x0e, 0x62, + 0xbc, 0x8e, 0xee, 0x43, 0x25, 0x1e, 0xf4, 0xfb, 0x8e, 0xca, 0xbc, 0x76, 0x73, 0x72, 0x51, 0x9c, + 0xa9, 0x5e, 0x92, 0x02, 0x80, 0xa5, 0x38, 0xdb, 0x07, 0x34, 0x4a, 0x8f, 0x2e, 0xc2, 0x22, 0xb9, + 0x9f, 0x90, 0xc8, 0x77, 0x7a, 0xb7, 0xf0, 0x8e, 0xcc, 0x16, 0xd8, 0xb4, 0x5f, 0x36, 0xe0, 0x38, + 0x45, 0x85, 0x6c, 0x15, 0x34, 0x15, 0x18, 0x3d, 0xe8, 0xa0, 0x49, 0x86, 0x48, 0xf6, 0x6f, 0x16, + 0x52, 0xfe, 0xf9, 0x20, 0x22, 0x04, 0xf5, 0x60, 0xce, 0x0f, 0x5a, 0xea, 0x7c, 0xbb, 0x9a, 0xc3, + 0xf9, 0xb6, 0x17, 0xb4, 0x8c, 0x2a, 0x32, 0x7d, 0x8a, 0x31, 0x17, 0x82, 0x7e, 0xc3, 0x82, 0x25, + 0x59, 0x92, 0x64, 0x08, 0x11, 0x8c, 0xe4, 0x26, 0xf6, 0x9c, 0x10, 0xbb, 0x74, 0xd3, 0x94, 0x82, + 0xd3, 0x42, 0xed, 0x1f, 0x58, 0xa9, 0x44, 0xed, 0xb6, 0x93, 0xb8, 0xdd, 0xcb, 0x47, 0x34, 0x9e, + 0xbe, 0x91, 0x2a, 0x9e, 0xfd, 0x8c, 0x59, 0x3c, 0x7b, 0x70, 0xbc, 0xf6, 0x89, 0x49, 0x57, 0x5c, + 0xf7, 0x28, 0x87, 0x3a, 0x63, 0x61, 0xd4, 0xd9, 0xbe, 0x00, 0x0b, 0x86, 0xc6, 0xe2, 0x28, 0xcf, + 0xab, 0xba, 0xa4, 0x22, 0x0f, 0x03, 0x88, 0x4d, 0x79, 0xf6, 0x3f, 0x14, 0xa0, 0x22, 0x2a, 0xeb, + 0x53, 0x57, 0xeb, 0x64, 0x10, 0x59, 0x98, 0x18, 0x44, 0x86, 0x50, 0x76, 0xd9, 0x3d, 0x9d, 0xf0, + 0x17, 0xb3, 0xa4, 0xa5, 0x42, 0x3b, 0x7e, 0xef, 0xa7, 0x75, 0xe2, 0xcf, 0x58, 0xc8, 0x41, 0xef, + 0x59, 0x70, 0xc6, 0xa5, 0x69, 0x89, 0xab, 0x8f, 0xb4, 0xd2, 0xcc, 0xb5, 0xe4, 0xcd, 0x34, 0xc7, + 0xc6, 0x47, 0x85, 0xf4, 0x33, 0x19, 0x04, 0xce, 0xca, 0xb6, 0xff, 0xaa, 0x08, 0x4b, 0x29, 0xcd, + 0xd1, 0x2b, 0x50, 0x1d, 0xc4, 0x74, 0x2f, 0xaa, 0xf0, 0x5b, 0x95, 0x1b, 0x6f, 0x09, 0x38, 0x56, + 0x14, 0x94, 0x3a, 0x74, 0xe2, 0xf8, 0x5e, 0x10, 0xb5, 0x84, 0x9d, 0x15, 0xf5, 0xbe, 0x80, 0x63, + 0x45, 0x41, 0x13, 0xc3, 0x3b, 0xc4, 0x89, 0x48, 0x74, 0x10, 0x1c, 0x92, 0x91, 0xcb, 0xa1, 0x86, + 0x46, 0x61, 0x93, 0x8e, 0x19, 0x2d, 0xe9, 0xc5, 0x9b, 0x3d, 0x8f, 0xf8, 0x09, 0x57, 0x33, 0x07, + 0xa3, 0x1d, 0xec, 0x34, 0x4d, 0x8e, 0xda, 0x68, 0x19, 0x04, 0xce, 0xca, 0x46, 0x5f, 0xb6, 0x60, + 0xc9, 0xb9, 0x17, 0xeb, 0x6b, 0xde, 0xda, 0xdc, 0xcc, 0xcb, 0x27, 0x75, 0x6d, 0xdc, 0x58, 0xa1, + 0xdb, 0x3e, 0x05, 0xc2, 0x69, 0x89, 0xf6, 0x77, 0x2d, 0x90, 0xd7, 0xc7, 0x4f, 0xa1, 0xaa, 0xdc, + 0x49, 0x57, 0x95, 0x1b, 0xb3, 0xef, 0x93, 0x09, 0x15, 0xe5, 0x3d, 0xa8, 0xd0, 0xac, 0xd2, 0xf1, + 0x5b, 0xe8, 0x27, 0xa0, 0xe2, 0xf2, 0x9f, 0xc2, 0x6d, 0xb0, 0x7a, 0xa3, 0xc0, 0x62, 0x89, 0x43, + 0xcf, 0x43, 0xc9, 0x89, 0x3a, 0xd2, 0x55, 0xb0, 0x72, 0xec, 0x46, 0xd4, 0x89, 0x31, 0x83, 0xda, + 0xef, 0x15, 0x00, 0x36, 0x83, 0x7e, 0xe8, 0x44, 0xa4, 0x75, 0x10, 0xfc, 0xbf, 0xcf, 0xe0, 0xec, + 0xdf, 0xb1, 0x00, 0x51, 0x7b, 0x04, 0x3e, 0xf1, 0x75, 0x65, 0x04, 0xad, 0xc3, 0xbc, 0x2b, 0xa1, + 0x62, 0xd7, 0xab, 0x90, 0x5e, 0x91, 0x63, 0x4d, 0x33, 0xc5, 0xd9, 0xfa, 0xa2, 0x4c, 0xfc, 0xf9, + 0x2e, 0x57, 0xd3, 0xcd, 0x0a, 0x68, 0xa2, 0x0e, 0x60, 0x7f, 0xbd, 0x00, 0xcf, 0xf1, 0x05, 0xbd, + 0xeb, 0xf8, 0x4e, 0x87, 0xf4, 0xa9, 0x56, 0xd3, 0x96, 0x00, 0xde, 0xa6, 0xb9, 0x94, 0x27, 0xeb, + 0xa3, 0x33, 0xad, 0x49, 0xbe, 0x96, 0xf8, 0xea, 0xd9, 0xf6, 0xbd, 0x04, 0x33, 0xce, 0x28, 0x84, + 0xaa, 0xec, 0xf0, 0x10, 0x1e, 0x22, 0x0f, 0x29, 0x6a, 0xa3, 0x5d, 0x15, 0xbc, 0xb1, 0x92, 0x62, + 0x7f, 0xdb, 0x82, 0xec, 0xa1, 0xcd, 0xfc, 0x1d, 0xbf, 0x05, 0xcc, 0xfa, 0xbb, 0xf4, 0xbd, 0xdd, + 0xf4, 0x57, 0x61, 0xe8, 0x73, 0xb0, 0xe0, 0x24, 0x09, 0xe9, 0x87, 0x09, 0x8b, 0x68, 0x8b, 0x8f, + 0x17, 0xd1, 0xee, 0x06, 0x2d, 0xaf, 0xed, 0xb1, 0x88, 0xd6, 0x64, 0x67, 0xbf, 0x01, 0x55, 0x59, + 0x55, 0x99, 0x62, 0x1a, 0x5f, 0x4c, 0x55, 0x88, 0x26, 0x2c, 0x14, 0x07, 0x16, 0xcd, 0x84, 0xec, + 0x09, 0xd8, 0xc4, 0x7e, 0xcf, 0x82, 0xa5, 0x54, 0x6d, 0x39, 0x27, 0xdd, 0xa9, 0xd7, 0x6b, 0x07, + 0x2c, 0x57, 0x8e, 0x3c, 0x9f, 0x87, 0x1a, 0x55, 0xbd, 0x55, 0xaf, 0x68, 0x14, 0x36, 0xe9, 0xec, + 0x6f, 0x16, 0x60, 0x99, 0x5d, 0x2c, 0x91, 0x30, 0x88, 0x3d, 0x96, 0xf7, 0xbd, 0x00, 0xc5, 0x41, + 0xd4, 0x13, 0xfa, 0x2c, 0x08, 0x0e, 0xc5, 0x5b, 0x78, 0x07, 0x53, 0xf8, 0x14, 0x9b, 0xd2, 0x86, + 0xb2, 0xeb, 0x6c, 0x51, 0x1f, 0x41, 0xb5, 0x58, 0xe4, 0x91, 0xf5, 0xe6, 0x06, 0x85, 0x60, 0x81, + 0x41, 0x2f, 0x41, 0xd5, 0x25, 0x51, 0xc2, 0xa8, 0x4a, 0x8c, 0x6a, 0x91, 0x2e, 0xd6, 0x4d, 0x01, + 0xc3, 0x0a, 0x4b, 0x4f, 0xe8, 0x43, 0x32, 0x64, 0x84, 0x73, 0x8c, 0x90, 0xdf, 0x08, 0x71, 0x10, + 0x96, 0xb8, 0x54, 0x44, 0x51, 0x7e, 0xa4, 0x88, 0xa2, 0x72, 0x5a, 0x44, 0x61, 0xef, 0x02, 0x2b, + 0x7d, 0xe4, 0xb5, 0xcc, 0xde, 0x80, 0x2a, 0x65, 0x47, 0x5d, 0x52, 0x5e, 0x2c, 0x9b, 0x50, 0xbd, + 0x7e, 0xfb, 0x80, 0x07, 0x32, 0x36, 0x14, 0x3d, 0x87, 0x1f, 0xb0, 0x45, 0x3d, 0xac, 0xed, 0x38, + 0x1e, 0xb0, 0x4d, 0x44, 0x91, 0xe8, 0x45, 0x28, 0x92, 0xfb, 0x21, 0x63, 0x59, 0xd4, 0x87, 0xf0, + 0xe5, 0xfb, 0xa1, 0x17, 0x91, 0x98, 0x12, 0x91, 0xfb, 0xa1, 0x3d, 0x00, 0xd0, 0x05, 0xfa, 0xbc, + 0xd6, 0xe9, 0x05, 0x28, 0xb9, 0x41, 0x8b, 0x88, 0x05, 0xaa, 0xd8, 0x6c, 0x06, 0x2d, 0x82, 0x19, + 0xc6, 0xfe, 0x9a, 0x05, 0x67, 0xb3, 0x55, 0xf5, 0x1f, 0x99, 0xef, 0xd8, 0x81, 0xb3, 0xaa, 0x86, + 0x7d, 0x33, 0xe4, 0x25, 0x89, 0x4b, 0xb0, 0x78, 0x67, 0xe0, 0xf5, 0x5a, 0xe2, 0x59, 0xa8, 0xa3, + 0xca, 0xd9, 0x0d, 0x03, 0x87, 0x53, 0x94, 0x76, 0x07, 0x56, 0x76, 0x1d, 0xcf, 0x4f, 0x88, 0xef, + 0xf8, 0x2e, 0xb9, 0xed, 0xf9, 0xad, 0xe0, 0x1e, 0xdd, 0x0a, 0xb1, 0xdb, 0x25, 0xad, 0x41, 0x4f, + 0x19, 0x97, 0x4e, 0x58, 0x53, 0xc0, 0xb0, 0xc2, 0x52, 0xca, 0xd6, 0x20, 0xd2, 0xee, 0x5d, 0x50, + 0x6e, 0x09, 0x18, 0x56, 0x58, 0x3b, 0x06, 0xdd, 0x02, 0x81, 0xda, 0xa2, 0x32, 0x66, 0xcd, 0x1c, + 0x3f, 0x36, 0x87, 0xbe, 0xab, 0x3b, 0x2d, 0xaa, 0xe9, 0xc2, 0x98, 0xfd, 0xcd, 0x12, 0x64, 0x6a, + 0x1c, 0x68, 0x60, 0x76, 0x79, 0x58, 0x39, 0x76, 0x79, 0xa8, 0xc9, 0x1f, 0xd7, 0xe9, 0x81, 0x3e, + 0x0d, 0x73, 0x61, 0xd7, 0x89, 0xe5, 0xec, 0xaf, 0xc9, 0xa9, 0xdd, 0xa7, 0xc0, 0x07, 0x66, 0x29, + 0x86, 0x41, 0x30, 0xa7, 0x36, 0xcf, 0xf1, 0xe2, 0x29, 0xbe, 0xed, 0x8b, 0xbc, 0xf2, 0x8c, 0x49, + 0x3c, 0xe8, 0x25, 0x22, 0x4f, 0xd8, 0xcb, 0xcb, 0xb2, 0x9c, 0xab, 0x2e, 0x41, 0xf3, 0x67, 0x6c, + 0x48, 0x44, 0x9f, 0x85, 0xf9, 0x38, 0x71, 0xa2, 0xe4, 0x31, 0x6b, 0x62, 0xca, 0x7c, 0x4d, 0xc9, + 0x04, 0x6b, 0x7e, 0xe8, 0x2d, 0x80, 0xb6, 0xe7, 0x7b, 0x71, 0x97, 0x71, 0xaf, 0x3c, 0x9e, 0xdf, + 0xbe, 0xa2, 0x38, 0x60, 0x83, 0x9b, 0xfd, 0x0b, 0x70, 0xe1, 0xb4, 0xde, 0x2c, 0x1a, 0x6d, 0xdf, + 0x73, 0x22, 0x5f, 0x5c, 0x5f, 0xb3, 0x65, 0x76, 0xdb, 0x89, 0x7c, 0xcc, 0xa0, 0xf6, 0xfb, 0x05, + 0x58, 0x30, 0xda, 0xef, 0xa6, 0x38, 0x98, 0x32, 0xed, 0x82, 0x85, 0x29, 0xdb, 0x05, 0x5f, 0x82, + 0x6a, 0x18, 0xf4, 0x3c, 0xd7, 0x53, 0x17, 0x6b, 0x6c, 0xbb, 0xed, 0x0b, 0x18, 0x56, 0x58, 0x94, + 0xc0, 0xfc, 0xdd, 0x7b, 0x09, 0x3b, 0x7e, 0xe5, 0x35, 0xda, 0x2c, 0xb7, 0x45, 0xf2, 0x28, 0xd7, + 0xd3, 0x24, 0x21, 0x31, 0xd6, 0x82, 0xa8, 0x9f, 0xed, 0x44, 0xc1, 0x20, 0xe4, 0xb5, 0x59, 0x51, + 0xc1, 0x62, 0xad, 0x79, 0x31, 0x16, 0x18, 0xfb, 0x0f, 0xe7, 0x00, 0x0c, 0xdf, 0x7e, 0x01, 0x4a, + 0x11, 0x09, 0x83, 0xac, 0xad, 0x28, 0x05, 0x66, 0x98, 0x94, 0x1f, 0x2d, 0x3c, 0x92, 0x1f, 0x2d, + 0x9e, 0x9a, 0x99, 0xff, 0x1c, 0x2c, 0xc5, 0x71, 0x77, 0x3f, 0xf2, 0x8e, 0x9c, 0x84, 0xdc, 0x20, + 0x43, 0x71, 0xed, 0xad, 0x4a, 0x50, 0xcd, 0xe6, 0x35, 0x8d, 0xc4, 0x69, 0xda, 0xb1, 0x45, 0x8d, + 0xb9, 0x1f, 0x5d, 0x51, 0x03, 0x35, 0xe1, 0x9c, 0xe7, 0xc7, 0xc4, 0x1d, 0x44, 0xe2, 0xbe, 0xe6, + 0x5a, 0x10, 0x27, 0x74, 0x50, 0x65, 0xb6, 0x6a, 0x5f, 0x10, 0x8c, 0xce, 0x6d, 0x8f, 0x23, 0xc2, + 0xe3, 0xdf, 0xa5, 0xf6, 0x94, 0x08, 0xb6, 0xef, 0xaa, 0x86, 0x03, 0x17, 0x70, 0xac, 0x28, 0xa8, + 0x53, 0x24, 0xbe, 0x73, 0xa7, 0x47, 0x76, 0xda, 0x31, 0x2b, 0x18, 0x57, 0x0d, 0x5f, 0xce, 0x11, + 0x57, 0x9a, 0x58, 0xd3, 0xa0, 0xab, 0xb0, 0xa2, 0xcb, 0x0c, 0x32, 0xfc, 0xe2, 0xd5, 0x60, 0x75, + 0xc3, 0xa4, 0x0b, 0x13, 0x32, 0x16, 0x1b, 0x7d, 0x07, 0x6d, 0xc1, 0xd9, 0x14, 0x90, 0x8e, 0x1b, + 0x18, 0x9f, 0x9a, 0xe0, 0x73, 0x36, 0xc5, 0x87, 0x0e, 0x79, 0xe4, 0x0d, 0xfb, 0xab, 0x05, 0x38, + 0xa7, 0x17, 0x27, 0x85, 0x7a, 0x6d, 0x3a, 0x43, 0xec, 0x16, 0x9c, 0xd7, 0xd7, 0x8c, 0x86, 0x76, + 0x75, 0x53, 0xd0, 0x54, 0x18, 0x6c, 0x50, 0x51, 0xdb, 0xd1, 0xa0, 0x91, 0x55, 0xb8, 0x33, 0x2b, + 0x77, 0x53, 0xc0, 0xb1, 0xa2, 0x60, 0x3d, 0xf3, 0x24, 0x4a, 0x9a, 0x83, 0x3b, 0xec, 0x85, 0x4c, + 0x95, 0x68, 0x53, 0xa3, 0xb0, 0x49, 0xf7, 0x08, 0x71, 0xab, 0x50, 0x87, 0x46, 0x7a, 0x6c, 0x9d, + 0x66, 0xd4, 0x61, 0x77, 0x69, 0x8a, 0xc2, 0xfe, 0x0f, 0x0b, 0x3e, 0x36, 0xd6, 0x14, 0x4f, 0xa1, + 0xee, 0x32, 0x48, 0xd7, 0x5d, 0xf6, 0x67, 0x2a, 0x2d, 0x8f, 0x19, 0xc2, 0x84, 0x2a, 0xcc, 0xf7, + 0x2d, 0x58, 0xd6, 0xf4, 0xff, 0xb7, 0xba, 0xee, 0xb5, 0xde, 0x13, 0x06, 0xf7, 0x3e, 0x1b, 0x1c, + 0xf7, 0x6f, 0x1b, 0xae, 0x6c, 0x33, 0x3d, 0xc5, 0x4f, 0x1d, 0x41, 0x99, 0x35, 0x8a, 0x48, 0x0d, + 0xf7, 0x72, 0x28, 0xf2, 0x73, 0xe1, 0x2c, 0x90, 0xd6, 0xf9, 0x2b, 0x7b, 0x8c, 0xb1, 0x90, 0x66, + 0xf7, 0xa1, 0x96, 0x26, 0xdf, 0x22, 0xd4, 0x63, 0x4f, 0xa9, 0xf5, 0x3a, 0xcc, 0x3b, 0xec, 0xad, + 0x9d, 0x81, 0x93, 0xed, 0x57, 0xdd, 0x90, 0x08, 0xac, 0x69, 0xec, 0x3f, 0xb3, 0xe0, 0x23, 0x63, + 0xd4, 0xcb, 0x31, 0xc3, 0x48, 0xf4, 0x96, 0x9e, 0xd0, 0xce, 0xdb, 0x22, 0x6d, 0x47, 0x46, 0x6e, + 0x46, 0x9c, 0xb7, 0xc5, 0xc1, 0x58, 0xe2, 0xed, 0x7f, 0xb3, 0xe0, 0x4c, 0x5a, 0xd7, 0x18, 0x5d, + 0x07, 0xc4, 0x07, 0xb3, 0xe5, 0xc5, 0x6e, 0x70, 0x44, 0xa2, 0x21, 0x1d, 0x39, 0xd7, 0x7a, 0x55, + 0x70, 0x42, 0x1b, 0x23, 0x14, 0x78, 0xcc, 0x5b, 0xe8, 0x6b, 0xac, 0x6a, 0x27, 0xad, 0x2d, 0x27, + 0xbe, 0x99, 0xdb, 0xc4, 0xeb, 0x99, 0x34, 0x03, 0x1e, 0x25, 0x0f, 0x9b, 0xc2, 0xed, 0xbf, 0x2c, + 0xc0, 0xa2, 0x7c, 0x7d, 0xcb, 0x6b, 0xb7, 0xa9, 0xbd, 0x59, 0x1c, 0x21, 0x06, 0xa7, 0xec, 0xcd, + 0x82, 0x0c, 0xcc, 0x71, 0xd4, 0xde, 0x87, 0x9e, 0xdf, 0xca, 0x66, 0x5a, 0x37, 0x3c, 0xbf, 0x85, + 0x19, 0x26, 0xdd, 0xd1, 0x5c, 0x3c, 0xbd, 0xa3, 0x59, 0xad, 0x84, 0xd2, 0xc3, 0x42, 0x3a, 0xde, + 0x83, 0xab, 0x03, 0x01, 0xe3, 0xf8, 0x3e, 0xd0, 0x28, 0x6c, 0xd2, 0x51, 0x4d, 0x7a, 0xde, 0x11, + 0xe1, 0x2f, 0x95, 0xd3, 0x9a, 0xec, 0x48, 0x04, 0xd6, 0x34, 0x54, 0x93, 0x96, 0xd7, 0x6e, 0x8b, + 0x22, 0x81, 0xd2, 0x84, 0x5a, 0x07, 0x33, 0x8c, 0xfd, 0x43, 0x76, 0x72, 0x4f, 0x68, 0xdc, 0xc8, + 0xcb, 0x82, 0xd2, 0x20, 0xc5, 0x87, 0xed, 0x42, 0x6d, 0xe3, 0xd2, 0x14, 0x36, 0xbe, 0x08, 0x8b, + 0x77, 0xe3, 0xc0, 0xdf, 0x0f, 0x68, 0x3e, 0x1a, 0xc9, 0x18, 0x92, 0xdd, 0x9a, 0x5e, 0x6f, 0xde, + 0xdc, 0x93, 0x70, 0x9c, 0xa2, 0xb2, 0xbf, 0x3d, 0x07, 0xcf, 0xa9, 0xfb, 0x43, 0x92, 0xdc, 0x0b, + 0xa2, 0x43, 0xcf, 0xef, 0xb0, 0xea, 0xc8, 0x37, 0x2c, 0x58, 0xe4, 0xb6, 0x16, 0xfd, 0x64, 0xfc, + 0x82, 0xd4, 0xcd, 0xe3, 0xa6, 0x32, 0x25, 0xa9, 0x7e, 0x60, 0x48, 0xc9, 0xf4, 0x92, 0x99, 0x28, + 0x9c, 0x52, 0x07, 0xbd, 0x0b, 0x20, 0xdb, 0xb6, 0xdb, 0x79, 0x74, 0xae, 0x4b, 0xe5, 0x30, 0x69, + 0xeb, 0xd8, 0xe4, 0x40, 0x49, 0xc0, 0x86, 0x34, 0xf4, 0x15, 0x0b, 0xca, 0x3d, 0x6e, 0x95, 0x22, + 0x13, 0xfc, 0x8b, 0xf9, 0x5b, 0xc5, 0xb4, 0x87, 0x3a, 0xe9, 0x85, 0x25, 0x84, 0x70, 0x84, 0xa1, + 0xe2, 0xf9, 0x9d, 0x88, 0xc4, 0x32, 0x4d, 0xf9, 0x84, 0xe1, 0x5f, 0xeb, 0x6e, 0x10, 0x11, 0xe6, + 0x4d, 0x03, 0xa7, 0xd5, 0x70, 0x7a, 0x8e, 0xef, 0x92, 0x68, 0x9b, 0x93, 0xeb, 0x23, 0x52, 0x00, + 0xb0, 0x64, 0x34, 0x72, 0xfd, 0x3e, 0x37, 0xcd, 0xf5, 0xfb, 0xea, 0xeb, 0xb0, 0x32, 0x32, 0x8d, + 0x8f, 0xd2, 0xd9, 0xb7, 0xfa, 0x19, 0x58, 0x78, 0xdc, 0xa6, 0xc0, 0xef, 0xce, 0xe9, 0x73, 0x6e, + 0x2f, 0x68, 0xb1, 0x7b, 0xe7, 0x48, 0xcf, 0xa6, 0x08, 0x3d, 0xf2, 0x5a, 0x1b, 0x46, 0x1f, 0xb0, + 0x02, 0x62, 0x53, 0x1e, 0x5d, 0x99, 0xa1, 0x13, 0x11, 0xff, 0x89, 0xae, 0xcc, 0x7d, 0x25, 0x01, + 0x1b, 0xd2, 0x10, 0x11, 0xbd, 0x62, 0xc5, 0x99, 0xb3, 0x56, 0x59, 0xd3, 0x1c, 0xd7, 0x2f, 0x46, + 0xb3, 0xb7, 0x65, 0x3f, 0xb5, 0x5e, 0x45, 0xd1, 0xe4, 0x8d, 0xdc, 0x37, 0x02, 0x6f, 0xb6, 0x49, + 0xc3, 0x70, 0x46, 0x38, 0xda, 0x80, 0x33, 0x72, 0x06, 0xde, 0x24, 0x11, 0xfb, 0xe4, 0x83, 0xfb, + 0x10, 0x95, 0x00, 0xe2, 0x34, 0x1a, 0x67, 0xe9, 0x8d, 0x06, 0x92, 0xf2, 0xa4, 0x06, 0x12, 0x74, + 0xa8, 0x7a, 0xc5, 0x2a, 0xf9, 0xf6, 0x8a, 0xc1, 0x68, 0x9f, 0x98, 0xfd, 0x2d, 0x0b, 0xce, 0x4a, + 0xad, 0x6f, 0x1e, 0x91, 0x28, 0xf2, 0x5a, 0xcc, 0x2f, 0x70, 0xb4, 0x8e, 0x51, 0x94, 0x5f, 0xb8, + 0x26, 0x11, 0x58, 0xd3, 0xd0, 0x1c, 0x71, 0xb4, 0xb7, 0xb1, 0x90, 0xce, 0x11, 0xa7, 0xea, 0x42, + 0x7c, 0x19, 0x2a, 0x3c, 0xe0, 0x89, 0xb3, 0xd5, 0x34, 0x11, 0x48, 0x61, 0x89, 0xb7, 0xff, 0xd3, + 0x02, 0x73, 0x77, 0x4c, 0xe7, 0x35, 0x5f, 0x86, 0xca, 0x91, 0x98, 0xba, 0xcc, 0xad, 0x8b, 0x9c, + 0x32, 0x89, 0x57, 0x0e, 0xb6, 0x38, 0x5d, 0x88, 0x52, 0x7a, 0x84, 0x10, 0x65, 0x6e, 0xa2, 0x47, + 0x7e, 0x01, 0x8a, 0x03, 0xaf, 0x25, 0xa2, 0x0c, 0x7d, 0x8f, 0xb2, 0xbd, 0x85, 0x29, 0xdc, 0xfe, + 0x97, 0xa2, 0xce, 0x10, 0x44, 0x51, 0xef, 0xc7, 0x62, 0xd8, 0x17, 0xd5, 0xa5, 0x19, 0x1f, 0xf9, + 0xf3, 0xe9, 0x4b, 0xb3, 0x07, 0xc7, 0x6b, 0xc0, 0x87, 0xcb, 0x4a, 0xfe, 0x63, 0xae, 0xd0, 0x2a, + 0xa7, 0x94, 0x5e, 0x2f, 0x41, 0xb5, 0x1b, 0x04, 0x87, 0x2c, 0x6d, 0xaf, 0xa6, 0x44, 0x54, 0xaf, + 0x09, 0xf8, 0x03, 0xe3, 0x37, 0x56, 0xd4, 0x68, 0x03, 0xe6, 0xe9, 0x6f, 0x56, 0xf3, 0x15, 0x65, + 0x8f, 0x17, 0xd5, 0x5e, 0x90, 0x88, 0x31, 0xe5, 0x61, 0xfd, 0x16, 0x35, 0x18, 0x6b, 0x04, 0x66, + 0x2c, 0x20, 0x6d, 0xb0, 0xa6, 0x44, 0x60, 0x4d, 0x63, 0x7f, 0x68, 0x4c, 0xb3, 0xb8, 0x56, 0xfc, + 0xb1, 0x98, 0xe6, 0x4b, 0x99, 0x69, 0xbe, 0x30, 0x32, 0xcd, 0xcb, 0xba, 0x8f, 0x36, 0x35, 0xd5, + 0x4f, 0xf3, 0x4c, 0xa4, 0x03, 0xa1, 0x93, 0x27, 0xaa, 0x63, 0x6a, 0x20, 0x74, 0xb6, 0x31, 0xc3, + 0x70, 0x4f, 0xf0, 0xce, 0xc0, 0x8b, 0x48, 0xbc, 0x1f, 0x0d, 0x7c, 0xcf, 0xef, 0xb0, 0xa5, 0x51, + 0x35, 0x3d, 0x41, 0x0a, 0x8d, 0xb3, 0xf4, 0xf6, 0x5f, 0x14, 0x68, 0x92, 0x98, 0xea, 0xab, 0x45, + 0xaf, 0x40, 0x35, 0x92, 0x1f, 0x13, 0x66, 0xaa, 0x51, 0xea, 0x33, 0x42, 0x45, 0x81, 0x3e, 0x0f, + 0xd0, 0x22, 0x61, 0x2f, 0x18, 0xb2, 0x8a, 0x7b, 0xe9, 0x91, 0x2b, 0xee, 0xca, 0xcb, 0x6f, 0x29, + 0x2e, 0xd8, 0xe0, 0x88, 0x56, 0xa1, 0xe0, 0xb5, 0xd8, 0x6c, 0x16, 0x1b, 0x20, 0x68, 0x0b, 0xdb, + 0x5b, 0xb8, 0xe0, 0xb5, 0x8c, 0x76, 0x95, 0xf2, 0xd3, 0x6b, 0x57, 0xb1, 0xff, 0x8e, 0x39, 0x2b, + 0x3e, 0xfc, 0x5d, 0x59, 0xa1, 0xf9, 0x38, 0x94, 0x9d, 0x41, 0xd2, 0x0d, 0x46, 0x9a, 0xee, 0x36, + 0x18, 0x14, 0x0b, 0x2c, 0xda, 0x81, 0x52, 0x8b, 0x66, 0x70, 0x85, 0x47, 0x36, 0x94, 0xce, 0xe0, + 0x68, 0xa2, 0xc7, 0xb8, 0xa0, 0xe7, 0xa1, 0x94, 0x38, 0x1d, 0x59, 0xe3, 0x67, 0xd7, 0x0d, 0x07, + 0x4e, 0x27, 0xc6, 0x0c, 0x6a, 0x9e, 0x4c, 0xa5, 0x53, 0x2e, 0xf7, 0xff, 0xbc, 0x04, 0x4b, 0xa9, + 0x8b, 0x9c, 0xd4, 0x2a, 0xb0, 0x4e, 0x5d, 0x05, 0x2f, 0xc2, 0x5c, 0x18, 0x0d, 0x7c, 0x3e, 0xae, + 0xaa, 0x3e, 0x18, 0xe8, 0x3a, 0x23, 0x98, 0xe3, 0xa8, 0x8d, 0x5a, 0xd1, 0x10, 0x0f, 0x7c, 0x71, + 0x85, 0xaa, 0x6c, 0xb4, 0xc5, 0xa0, 0x58, 0x60, 0xd1, 0x17, 0x60, 0x31, 0x66, 0x1b, 0x30, 0x72, + 0x12, 0xd2, 0x91, 0x5f, 0x47, 0x5c, 0x9d, 0xb9, 0x2f, 0x9e, 0xb3, 0xe3, 0xf1, 0xbd, 0x09, 0xc1, + 0x29, 0x71, 0xe8, 0xcb, 0x96, 0xf9, 0x2d, 0x40, 0x79, 0xe6, 0xca, 0x62, 0xf6, 0x82, 0x8c, 0xaf, + 0xae, 0x87, 0x7f, 0x12, 0x10, 0xaa, 0x95, 0x5d, 0x79, 0x02, 0x2b, 0x1b, 0xc6, 0x34, 0x61, 0x7d, + 0x12, 0xe6, 0xfb, 0x8e, 0xef, 0xb5, 0x49, 0x9c, 0xc4, 0xb5, 0x2a, 0x5b, 0x4f, 0xec, 0xfb, 0xd1, + 0x5d, 0x09, 0xc4, 0x1a, 0x6f, 0x7f, 0xc9, 0x82, 0x73, 0x63, 0x87, 0xf5, 0xd4, 0xaa, 0x06, 0xf4, + 0xe4, 0xfa, 0xc8, 0x98, 0xab, 0x47, 0x74, 0xf4, 0x64, 0x3e, 0xe4, 0x10, 0x17, 0x9b, 0x4b, 0x13, + 0x67, 0xec, 0xd1, 0x4e, 0x4d, 0x7d, 0x72, 0x15, 0x9f, 0xe2, 0xc9, 0xf5, 0x5b, 0x16, 0x18, 0x1f, + 0x06, 0xa1, 0x5f, 0x86, 0x79, 0x67, 0x90, 0x04, 0x7d, 0x27, 0x21, 0x2d, 0x91, 0x39, 0xee, 0xe5, + 0xf2, 0x09, 0xd2, 0x86, 0xe4, 0xca, 0xed, 0xa5, 0x1e, 0xb1, 0x96, 0x67, 0xff, 0x8f, 0xc5, 0xe7, + 0x2f, 0xf3, 0x86, 0x3e, 0x49, 0xac, 0x87, 0x9c, 0x24, 0xaf, 0x40, 0x35, 0x26, 0xbd, 0x36, 0xf5, + 0x98, 0xe2, 0xc4, 0x51, 0xc6, 0x6e, 0x0a, 0x38, 0x56, 0x14, 0xe8, 0xf7, 0x2d, 0x40, 0xfd, 0x6c, + 0xf3, 0x82, 0x2c, 0x67, 0xcc, 0x62, 0xf9, 0x91, 0x8e, 0x88, 0xc6, 0x73, 0x27, 0xc7, 0x6b, 0x68, + 0x04, 0x1c, 0xe3, 0x31, 0xf2, 0xed, 0x7f, 0x17, 0xb3, 0x21, 0x62, 0xab, 0x4b, 0x99, 0x96, 0xad, + 0xe9, 0xc3, 0x92, 0x21, 0x80, 0xab, 0x7a, 0x38, 0x73, 0xf8, 0x8a, 0x48, 0x37, 0x84, 0x9a, 0xdf, + 0xb8, 0x48, 0x18, 0x36, 0x84, 0xa5, 0x56, 0x7d, 0xf1, 0xb4, 0x55, 0x6f, 0xff, 0xab, 0x05, 0xa9, + 0x83, 0x17, 0xf5, 0x61, 0x8e, 0x6a, 0x30, 0xcc, 0xa1, 0xdd, 0xd4, 0xe4, 0x4b, 0x77, 0xc4, 0xb0, + 0x31, 0x4f, 0x97, 0x0d, 0xfb, 0x89, 0xb9, 0x14, 0xe4, 0x89, 0x90, 0x8a, 0x9b, 0xe8, 0x46, 0x4e, + 0xd2, 0x68, 0x44, 0x26, 0xfe, 0xe7, 0x40, 0xc5, 0x66, 0xf6, 0x25, 0x58, 0x19, 0xd1, 0x88, 0xae, + 0x6d, 0xd6, 0xc1, 0x96, 0x5d, 0xdb, 0xac, 0xc7, 0x0d, 0x73, 0x9c, 0xfd, 0xbe, 0x05, 0x67, 0xb3, + 0xec, 0xd1, 0x1f, 0x58, 0xb0, 0x12, 0x67, 0xf9, 0x3d, 0x11, 0xab, 0xa9, 0x4c, 0x79, 0x04, 0x85, + 0x47, 0x35, 0xa0, 0x33, 0x9a, 0xed, 0x07, 0x4f, 0xdd, 0x04, 0x5b, 0xa7, 0xde, 0x04, 0xa7, 0xef, + 0x4b, 0x0b, 0x53, 0xdd, 0x97, 0x9a, 0x57, 0x99, 0xc5, 0x69, 0x5b, 0xf0, 0x4a, 0x0f, 0x69, 0xc1, + 0xd3, 0x7d, 0x7f, 0x73, 0x93, 0xfa, 0xfe, 0x1a, 0xf5, 0x0f, 0x3e, 0x3c, 0xff, 0xcc, 0x77, 0x3e, + 0x3c, 0xff, 0xcc, 0xf7, 0x3e, 0x3c, 0xff, 0xcc, 0x97, 0x4e, 0xce, 0x5b, 0x1f, 0x9c, 0x9c, 0xb7, + 0xbe, 0x73, 0x72, 0xde, 0xfa, 0xde, 0xc9, 0x79, 0xeb, 0x9f, 0x4f, 0xce, 0x5b, 0xbf, 0xfb, 0x83, + 0xf3, 0xcf, 0xbc, 0x55, 0x95, 0xa6, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x33, 0x48, 0x79, + 0x97, 0x64, 0x4e, 0x00, 0x00, } diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 7be3a9aa3d61f..7bedf4e0db40c 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -441,6 +441,15 @@ message KustomizeOptions { optional string buildOptions = 1; } +// MaintenanceWindow controls when automated syncs should be disabled +message MaintenanceWindow { + // Schedule is the time the window will begin + optional string schedule = 1; + + // Duration is the amount of time the maintenance window will be open + optional string duration = 2; +} + // Operation contains requested operation parameters. message Operation { optional SyncOperation sync = 1; @@ -811,6 +820,9 @@ message SyncPolicyAutomated { // SelfHeal enables auto-syncing if (default: false) optional bool selfHeal = 2; + + // MaintenanceWindows disables auto-syncing during the configured time windows (default: false) + repeated MaintenanceWindow maintenanceWindows = 3; } // SyncStatus is a comparison result of application spec and deployed application. diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index 7b926189eec3c..2f54419ba1fef 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -51,6 +51,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.JsonnetVar": schema_pkg_apis_application_v1alpha1_JsonnetVar(ref), "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.KsonnetParameter": schema_pkg_apis_application_v1alpha1_KsonnetParameter(ref), "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.KustomizeOptions": schema_pkg_apis_application_v1alpha1_KustomizeOptions(ref), + "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.MaintenanceWindow": schema_pkg_apis_application_v1alpha1_MaintenanceWindow(ref), "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.Operation": schema_pkg_apis_application_v1alpha1_Operation(ref), "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.OperationState": schema_pkg_apis_application_v1alpha1_OperationState(ref), "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.OrphanedResourcesMonitorSettings": schema_pkg_apis_application_v1alpha1_OrphanedResourcesMonitorSettings(ref), @@ -1604,6 +1605,33 @@ func schema_pkg_apis_application_v1alpha1_KustomizeOptions(ref common.ReferenceC } } +func schema_pkg_apis_application_v1alpha1_MaintenanceWindow(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "MaintenanceWindow controls when automated syncs should be disabled", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "schedule": { + SchemaProps: spec.SchemaProps{ + Description: "Schedule is the time the window will begin", + Type: []string{"string"}, + Format: "", + }, + }, + "duration": { + SchemaProps: spec.SchemaProps{ + Description: "Duration is the amount of time the maintenance window will be open", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_application_v1alpha1_Operation(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -2893,9 +2921,24 @@ func schema_pkg_apis_application_v1alpha1_SyncPolicyAutomated(ref common.Referen Format: "", }, }, + "maintenanceWindows": { + SchemaProps: spec.SchemaProps{ + Description: "MaintenanceWindows disables auto-syncing during the configured time windows (default: false)", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.MaintenanceWindow"), + }, + }, + }, + }, + }, }, }, }, + Dependencies: []string{ + "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.MaintenanceWindow"}, } } diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 93017c27d9a6d..adaf88e4553a4 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -437,6 +437,16 @@ type SyncPolicyAutomated struct { Prune bool `json:"prune,omitempty" protobuf:"bytes,1,opt,name=prune"` // SelfHeal enables auto-syncing if (default: false) SelfHeal bool `json:"selfHeal,omitempty" protobuf:"bytes,2,opt,name=selfHeal"` + // MaintenanceWindows disables auto-syncing during the configured time windows (default: false) + MaintenanceWindows []*MaintenanceWindow `json:"maintenanceWindows,omitempty" protobuf:"bytes,3,opt,name=maintenanceWindows"` +} + +// MaintenanceWindow controls when automated syncs should be disabled +type MaintenanceWindow struct { + // Schedule is the time the window will begin + Schedule *string `json:"schedule,omitempty" protobuf:"bytes,1,opt,name=schedule"` + // Duration is the amount of time the maintenance window will be open + Duration *string `json:"duration,omitempty" protobuf:"bytes,2,opt,name=duration"` } // SyncStrategy controls the manner in which a sync is performed diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index f2a8188716083..dbbded9cadbea 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -964,6 +964,32 @@ func (in *KustomizeOptions) DeepCopy() *KustomizeOptions { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MaintenanceWindow) DeepCopyInto(out *MaintenanceWindow) { + *out = *in + if in.Schedule != nil { + in, out := &in.Schedule, &out.Schedule + *out = new(string) + **out = **in + } + if in.Duration != nil { + in, out := &in.Duration, &out.Duration + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MaintenanceWindow. +func (in *MaintenanceWindow) DeepCopy() *MaintenanceWindow { + if in == nil { + return nil + } + out := new(MaintenanceWindow) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Operation) DeepCopyInto(out *Operation) { *out = *in @@ -1569,7 +1595,7 @@ func (in *SyncPolicy) DeepCopyInto(out *SyncPolicy) { if in.Automated != nil { in, out := &in.Automated, &out.Automated *out = new(SyncPolicyAutomated) - **out = **in + (*in).DeepCopyInto(*out) } return } @@ -1587,6 +1613,17 @@ func (in *SyncPolicy) DeepCopy() *SyncPolicy { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SyncPolicyAutomated) DeepCopyInto(out *SyncPolicyAutomated) { *out = *in + if in.MaintenanceWindows != nil { + in, out := &in.MaintenanceWindows, &out.MaintenanceWindows + *out = make([]*MaintenanceWindow, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(MaintenanceWindow) + (*in).DeepCopyInto(*out) + } + } + } return } diff --git a/ui/src/app/applications/components/application-summary/application-summary.tsx b/ui/src/app/applications/components/application-summary/application-summary.tsx index 4fcb7c02720e3..ebb3aca78d1bc 100644 --- a/ui/src/app/applications/components/application-summary/application-summary.tsx +++ b/ui/src/app/applications/components/application-summary/application-summary.tsx @@ -11,6 +11,7 @@ import * as models from '../../../shared/models'; import { services } from '../../../shared/services'; import { ComparisonStatusIcon, HealthStatusIcon, syncStatusMessage } from '../utils'; +import {MaintenanceWindow} from "../../../shared/models"; const urlPattern = new RegExp('^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))' + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i'); @@ -99,11 +100,11 @@ export const ApplicationSummary = (props: { ) }); } - async function setAutoSync(ctx: { popup: PopupApi }, confirmationTitle: string, confirmationText: string, prune: boolean, selfHeal: boolean) { + async function setAutoSync(ctx: { popup: PopupApi }, confirmationTitle: string, confirmationText: string, prune: boolean, selfHeal: boolean, maintenanceWindows: MaintenanceWindow[]) { const confirmed = await ctx.popup.confirm(confirmationTitle, confirmationText); if (confirmed) { const updatedApp = JSON.parse(JSON.stringify(props.app)) as models.Application; - updatedApp.spec.syncPolicy = { automated: { prune, selfHeal } }; + updatedApp.spec.syncPolicy = { automated: { prune, selfHeal ,maintenanceWindows} }; props.updateApp(updatedApp); } } @@ -127,6 +128,7 @@ export const ApplicationSummary = (props: { for (let i = 0; i > adjustedCount; i--) { items.pop(); } + const allItems = items.concat(added); const infoItems: EditablePanelItem[] = allItems.map((info, i) => ({ key: i.toString(), @@ -190,7 +192,7 @@ export const ApplicationSummary = (props: { ) || ( )} @@ -206,12 +208,12 @@ export const ApplicationSummary = (props: { {app.spec.syncPolicy.automated.prune && ( ) || ( )} @@ -224,16 +226,26 @@ export const ApplicationSummary = (props: { {app.spec.syncPolicy.automated.selfHeal && ( ) || ( )} + {app.spec.syncPolicy.automated.maintenanceWindows && ( +
+
+ Maintenance Windows +
+
+ {app.spec.syncPolicy.automated.maintenanceWindows.map(window =>

{window.schedule} : {window.duration}

)} +
+
+ )} )} diff --git a/ui/src/app/shared/models.ts b/ui/src/app/shared/models.ts index 7fa748c4558ca..4a4a6a8b6af48 100644 --- a/ui/src/app/shared/models.ts +++ b/ui/src/app/shared/models.ts @@ -176,7 +176,7 @@ export interface ApplicationSourceDirectory { } export interface SyncPolicy { - automated?: { prune: boolean; selfHeal: boolean; }; + automated?: { prune: boolean; selfHeal: boolean; maintenanceWindows?: MaintenanceWindow[]; }; } export interface Info { @@ -184,6 +184,11 @@ export interface Info { value: string; } +export interface MaintenanceWindow { + schedule: string; + duration: string; +} + export interface ApplicationSpec { project: string; source: ApplicationSource; From 1aa582d1f6a40b6e43da8712e564503b35e6c6de Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 21 Aug 2019 12:57:23 +0100 Subject: [PATCH 2/8] Issue #1995 - Fix usage description --- cmd/argocd/commands/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index fd6f950ac3150..0d2a87ce10228 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -635,7 +635,7 @@ func addAppFlags(command *cobra.Command, opts *appOptions) { command.Flags().StringArrayVar(&opts.jsonnetTlaStr, "jsonnet-tla-str", []string{}, "Jsonnet top level string arguments") command.Flags().StringArrayVar(&opts.jsonnetTlaCode, "jsonnet-tla-code", []string{}, "Jsonnet top level code arguments") command.Flags().StringArrayVar(&opts.kustomizeImages, "kustomize-image", []string{}, "Kustomize images (e.g. --kustomize-image node:8.15.0 --kustomize-image mysql=mariadb,alpine@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d)") - command.Flags().StringVar(&opts.maintenanceWindows, "maintenance-windows", "", "Times during which auto-sync will be disabled (can specify multiple or separate values with commas: '0 11 * * *:1h,30 23 * * *:1h')") + command.Flags().StringVar(&opts.maintenanceWindows, "maintenance-windows", "", "Times during which auto-sync will be disabled, quote and separate values with commas: '0 11 * * *:1h,30 23 * * *:1h')") } // NewApplicationUnsetCommand returns a new instance of an `argocd app unset` command From 4858b18ed3a8d9af76ec4346edf82dcd8c97986f Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 21 Aug 2019 13:43:16 +0100 Subject: [PATCH 3/8] Fix formatting --- cmd/argocd/commands/app.go | 3 ++- .../components/application-summary/application-summary.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index 0d2a87ce10228..23db0dfc3cf88 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -597,7 +597,6 @@ type appOptions struct { destNamespace string parameters []string valuesFiles []string - maintenanceWindows string releaseName string helmSets []string helmSetStrings []string @@ -611,6 +610,8 @@ type appOptions struct { jsonnetTlaStr []string jsonnetTlaCode []string kustomizeImages []string + maintenanceWindows string + } func addAppFlags(command *cobra.Command, opts *appOptions) { diff --git a/ui/src/app/applications/components/application-summary/application-summary.tsx b/ui/src/app/applications/components/application-summary/application-summary.tsx index ebb3aca78d1bc..ab78f662c940d 100644 --- a/ui/src/app/applications/components/application-summary/application-summary.tsx +++ b/ui/src/app/applications/components/application-summary/application-summary.tsx @@ -104,7 +104,7 @@ export const ApplicationSummary = (props: { const confirmed = await ctx.popup.confirm(confirmationTitle, confirmationText); if (confirmed) { const updatedApp = JSON.parse(JSON.stringify(props.app)) as models.Application; - updatedApp.spec.syncPolicy = { automated: { prune, selfHeal ,maintenanceWindows} }; + updatedApp.spec.syncPolicy = { automated: { prune, selfHeal, maintenanceWindows} }; props.updateApp(updatedApp); } } From c64fa5d2de25ffd05bf8f5d0ab5f785a70bd1db2 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 21 Aug 2019 14:44:36 +0100 Subject: [PATCH 4/8] Revert manifests --- manifests/base/kustomization.yaml | 14 ++++---- manifests/ha/base/kustomization.yaml | 14 ++++---- manifests/ha/install.yaml | 52 ++++++++++++++-------------- manifests/ha/namespace-install.yaml | 52 ++++++++++++++-------------- manifests/install.yaml | 28 +++++++-------- manifests/namespace-install.yaml | 28 +++++++-------- 6 files changed, 94 insertions(+), 94 deletions(-) diff --git a/manifests/base/kustomization.yaml b/manifests/base/kustomization.yaml index 4e64007c5dda3..3e6d00296301d 100644 --- a/manifests/base/kustomization.yaml +++ b/manifests/base/kustomization.yaml @@ -1,6 +1,13 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization +bases: +- ./application-controller +- ./dex +- ./repo-server +- ./server +- ./config +- ./redis images: - name: argoproj/argocd @@ -9,10 +16,3 @@ images: - name: argoproj/argocd-ui newName: argoproj/argocd-ui newTag: latest -resources: -- ./application-controller -- ./dex -- ./repo-server -- ./server -- ./config -- ./redis diff --git a/manifests/ha/base/kustomization.yaml b/manifests/ha/base/kustomization.yaml index a24ca4f555c92..022b54c7fc5de 100644 --- a/manifests/ha/base/kustomization.yaml +++ b/manifests/ha/base/kustomization.yaml @@ -7,6 +7,13 @@ patchesStrategicMerge: - overlays/argocd-server-deployment.yaml - overlays/argocd-application-controller-deployment.yaml +bases: +- ../../base/application-controller +- ../../base/dex +- ../../base/repo-server +- ../../base/server +- ../../base/config +- ./redis-ha images: - name: argoproj/argocd @@ -15,10 +22,3 @@ images: - name: argoproj/argocd-ui newName: argoproj/argocd-ui newTag: latest -resources: -- ../../base/application-controller -- ../../base/dex -- ../../base/repo-server -- ../../base/server -- ../../base/config -- ./redis-ha diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 40e05dff3fcb9..e602b97ad451a 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -2755,14 +2755,14 @@ spec: apiVersion: v1 kind: Service metadata: - annotations: null + annotations: + service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" labels: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha + name: argocd-redis-ha-announce-0 spec: - clusterIP: None ports: - name: server port: 6379 @@ -2772,8 +2772,10 @@ spec: port: 26379 protocol: TCP targetPort: sentinel + publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 type: ClusterIP --- apiVersion: v1 @@ -2785,7 +2787,7 @@ metadata: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-0 + name: argocd-redis-ha-announce-1 spec: ports: - name: server @@ -2799,7 +2801,7 @@ spec: publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 type: ClusterIP --- apiVersion: v1 @@ -2811,7 +2813,7 @@ metadata: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-1 + name: argocd-redis-ha-announce-2 spec: ports: - name: server @@ -2825,20 +2827,20 @@ spec: publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 type: ClusterIP --- apiVersion: v1 kind: Service metadata: - annotations: - service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" + annotations: null labels: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-2 + name: argocd-redis-ha spec: + clusterIP: None ports: - name: server port: 6379 @@ -2848,10 +2850,8 @@ spec: port: 26379 protocol: TCP targetPort: sentinel - publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 type: ClusterIP --- apiVersion: v1 @@ -2880,19 +2880,15 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server + app.kubernetes.io/name: argocd-server-metrics app.kubernetes.io/part-of: argocd - name: argocd-server + name: argocd-server-metrics spec: ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 + - name: metrics + port: 8083 protocol: TCP - targetPort: 8080 + targetPort: 8083 selector: app.kubernetes.io/name: argocd-server --- @@ -2901,15 +2897,19 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd - name: argocd-server-metrics + name: argocd-server spec: ports: - - name: metrics - port: 8083 + - name: http + port: 80 protocol: TCP - targetPort: 8083 + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: argocd-server --- diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index d2a6d569f55e8..de8869c84547f 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -2670,14 +2670,14 @@ spec: apiVersion: v1 kind: Service metadata: - annotations: null + annotations: + service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" labels: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha + name: argocd-redis-ha-announce-0 spec: - clusterIP: None ports: - name: server port: 6379 @@ -2687,8 +2687,10 @@ spec: port: 26379 protocol: TCP targetPort: sentinel + publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 type: ClusterIP --- apiVersion: v1 @@ -2700,7 +2702,7 @@ metadata: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-0 + name: argocd-redis-ha-announce-1 spec: ports: - name: server @@ -2714,7 +2716,7 @@ spec: publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 type: ClusterIP --- apiVersion: v1 @@ -2726,7 +2728,7 @@ metadata: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-1 + name: argocd-redis-ha-announce-2 spec: ports: - name: server @@ -2740,20 +2742,20 @@ spec: publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 type: ClusterIP --- apiVersion: v1 kind: Service metadata: - annotations: - service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" + annotations: null labels: app.kubernetes.io/component: redis app.kubernetes.io/name: argocd-redis-ha app.kubernetes.io/part-of: argocd - name: argocd-redis-ha-announce-2 + name: argocd-redis-ha spec: + clusterIP: None ports: - name: server port: 6379 @@ -2763,10 +2765,8 @@ spec: port: 26379 protocol: TCP targetPort: sentinel - publishNotReadyAddresses: true selector: app.kubernetes.io/name: argocd-redis-ha - statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 type: ClusterIP --- apiVersion: v1 @@ -2795,19 +2795,15 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server + app.kubernetes.io/name: argocd-server-metrics app.kubernetes.io/part-of: argocd - name: argocd-server + name: argocd-server-metrics spec: ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 + - name: metrics + port: 8083 protocol: TCP - targetPort: 8080 + targetPort: 8083 selector: app.kubernetes.io/name: argocd-server --- @@ -2816,15 +2812,19 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd - name: argocd-server-metrics + name: argocd-server spec: ports: - - name: metrics - port: 8083 + - name: http + port: 80 protocol: TCP - targetPort: 8083 + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: argocd-server --- diff --git a/manifests/install.yaml b/manifests/install.yaml index 8e7a43cd464f8..73a45150ba761 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -2652,19 +2652,15 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server + app.kubernetes.io/name: argocd-server-metrics app.kubernetes.io/part-of: argocd - name: argocd-server + name: argocd-server-metrics spec: ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 + - name: metrics + port: 8083 protocol: TCP - targetPort: 8080 + targetPort: 8083 selector: app.kubernetes.io/name: argocd-server --- @@ -2673,15 +2669,19 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd - name: argocd-server-metrics + name: argocd-server spec: ports: - - name: metrics - port: 8083 + - name: http + port: 80 protocol: TCP - targetPort: 8083 + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: argocd-server --- diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 7600466ba0287..ec63a593dbec7 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -2567,19 +2567,15 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server + app.kubernetes.io/name: argocd-server-metrics app.kubernetes.io/part-of: argocd - name: argocd-server + name: argocd-server-metrics spec: ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 + - name: metrics + port: 8083 protocol: TCP - targetPort: 8080 + targetPort: 8083 selector: app.kubernetes.io/name: argocd-server --- @@ -2588,15 +2584,19 @@ kind: Service metadata: labels: app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/name: argocd-server app.kubernetes.io/part-of: argocd - name: argocd-server-metrics + name: argocd-server spec: ports: - - name: metrics - port: 8083 + - name: http + port: 80 protocol: TCP - targetPort: 8083 + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: argocd-server --- From 3a6c120d02612457e125a4ddc1bcd3e2e6a91b82 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 21 Aug 2019 15:12:23 +0100 Subject: [PATCH 5/8] Add k8s.io/utils/pointer to Gopkg.lock --- Gopkg.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/Gopkg.lock b/Gopkg.lock index 705439c1078be..711c543d5ee57 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1736,6 +1736,7 @@ "k8s.io/kubernetes/pkg/kubectl/scheme", "k8s.io/kubernetes/pkg/kubectl/util/term", "k8s.io/kubernetes/pkg/util/node", + "k8s.io/utils/pointer", "layeh.com/gopher-json", ] solver-name = "gps-cdcl" From db4f92acccc8d4c84469276a22e60140145b0bb3 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 21 Aug 2019 15:41:17 +0100 Subject: [PATCH 6/8] Fix formatting --- cmd/argocd/commands/app.go | 1 - cmd/argocd/commands/app_test.go | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index 23db0dfc3cf88..732689a733b6b 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -611,7 +611,6 @@ type appOptions struct { jsonnetTlaCode []string kustomizeImages []string maintenanceWindows string - } func addAppFlags(command *cobra.Command, opts *appOptions) { diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index 49db8ad676ac8..70196bdb6b4bc 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -62,7 +62,7 @@ func Test_setMaintenanceWindows(t *testing.T) { ap := v1alpha1.Application{} ap.Spec.SyncPolicy = &v1alpha1.SyncPolicy{Automated: &v1alpha1.SyncPolicyAutomated{}} setMaintenanceWindows(&ap, windows) - assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched ,Duration: &dur }, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) + assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched, Duration: &dur}, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) }) t.Run("MultipleWindows", func(t *testing.T) { sched1 := "0 10 * * *" @@ -73,7 +73,7 @@ func Test_setMaintenanceWindows(t *testing.T) { ap := v1alpha1.Application{} ap.Spec.SyncPolicy = &v1alpha1.SyncPolicy{Automated: &v1alpha1.SyncPolicyAutomated{}} setMaintenanceWindows(&ap, windows) - assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched1 ,Duration: &dur1 }, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) - assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched2 ,Duration: &dur2 }, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[1]) + assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched1, Duration: &dur1}, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) + assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched2, Duration: &dur2}, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[1]) }) -} \ No newline at end of file +} From ed6a6a8a7527f2c46a4ca6bd1e07afc0013f7ff2 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 21 Aug 2019 16:22:20 +0100 Subject: [PATCH 7/8] Fix linting errors --- .../application-summary/application-summary.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ui/src/app/applications/components/application-summary/application-summary.tsx b/ui/src/app/applications/components/application-summary/application-summary.tsx index ab78f662c940d..518ff76d073b7 100644 --- a/ui/src/app/applications/components/application-summary/application-summary.tsx +++ b/ui/src/app/applications/components/application-summary/application-summary.tsx @@ -11,7 +11,6 @@ import * as models from '../../../shared/models'; import { services } from '../../../shared/services'; import { ComparisonStatusIcon, HealthStatusIcon, syncStatusMessage } from '../utils'; -import {MaintenanceWindow} from "../../../shared/models"; const urlPattern = new RegExp('^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))' + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i'); @@ -100,7 +99,8 @@ export const ApplicationSummary = (props: { ) }); } - async function setAutoSync(ctx: { popup: PopupApi }, confirmationTitle: string, confirmationText: string, prune: boolean, selfHeal: boolean, maintenanceWindows: MaintenanceWindow[]) { + async function setAutoSync(ctx: { popup: PopupApi }, confirmationTitle: string, confirmationText: string, prune: boolean, selfHeal: boolean, + maintenanceWindows: models.MaintenanceWindow[]) { const confirmed = await ctx.popup.confirm(confirmationTitle, confirmationText); if (confirmed) { const updatedApp = JSON.parse(JSON.stringify(props.app)) as models.Application; @@ -192,7 +192,8 @@ export const ApplicationSummary = (props: { ) || ( )} @@ -242,7 +243,7 @@ export const ApplicationSummary = (props: { Maintenance Windows
- {app.spec.syncPolicy.automated.maintenanceWindows.map(window =>

{window.schedule} : {window.duration}

)} + {app.spec.syncPolicy.automated.maintenanceWindows.map((window) =>

{window.schedule} : {window.duration}

)}
)} From d327739b87938769fba833054d64f49755875f53 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Thu, 22 Aug 2019 12:47:49 +0100 Subject: [PATCH 8/8] Added documentation and updated based on recommendations --- cmd/argocd/commands/app.go | 46 +--------- cmd/argocd/commands/app_test.go | 24 ------ controller/appcontroller.go | 40 ++------- controller/appcontroller_test.go | 30 ------- docs/user-guide/auto_sync.md | 24 ++++++ pkg/apis/application/v1alpha1/types.go | 71 ++++++++++++++- pkg/apis/application/v1alpha1/types_test.go | 96 ++++++++++++++++++++- 7 files changed, 199 insertions(+), 132 deletions(-) diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index 732689a733b6b..1660e5b59ea8a 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -257,22 +257,16 @@ func printAppSummaryTable(app *argoappv1.Application, appURL string) { fmt.Printf(printOpFmtStr, "Path:", app.Spec.Source.Path) printAppSourceDetails(&app.Spec.Source) var syncPolicy string - var maintenanceWindows string if app.Spec.SyncPolicy != nil && app.Spec.SyncPolicy.Automated != nil { syncPolicy = "Automated" if app.Spec.SyncPolicy.Automated.Prune { syncPolicy += " (Prune)" } - if app.Spec.SyncPolicy.Automated.MaintenanceWindows != nil { - maintenanceWindows = formatMaintenanceWindows(*app) - } else { - maintenanceWindows = "" - } } else { syncPolicy = "" } fmt.Printf(printOpFmtStr, "Sync Policy:", syncPolicy) - fmt.Printf(printOpFmtStr, "Maintenance:", maintenanceWindows) + fmt.Printf(printOpFmtStr, "Maintenance:", app.Spec.SyncPolicy.Automated.ListMaintenanceWindows()) syncStatusStr := string(app.Status.Sync.Status) switch app.Status.Sync.Status { case argoappv1.SyncStatusCodeSynced: @@ -464,7 +458,7 @@ func setAppOptions(flags *pflag.FlagSet, app *argoappv1.Application, appOpts *ap if app.Spec.SyncPolicy == nil || app.Spec.SyncPolicy.Automated == nil { log.Fatal("Cannot set --maintenance-windows: application not configured with automatic sync") } - setMaintenanceWindows(app, appOpts.maintenanceWindows) + app.Spec.SyncPolicy.Automated.AddMaintenanceWindows(appOpts.maintenanceWindows) } return visited @@ -505,20 +499,6 @@ func setKustomizeImages(src *argoappv1.ApplicationSource, images []string) { } } -func setMaintenanceWindows(app *argoappv1.Application, windows string) { - var maintenanceWindows []*argoappv1.MaintenanceWindow - wn := strings.Split(windows, ",") - for _, w := range wn { - cfg := strings.Split(w, ":") - window := argoappv1.MaintenanceWindow{ - Schedule: &cfg[0], - Duration: &cfg[1], - } - maintenanceWindows = append(maintenanceWindows, &window) - } - app.Spec.SyncPolicy.Automated.MaintenanceWindows = maintenanceWindows -} - type helmOpts struct { valueFiles []string releaseName string @@ -1047,7 +1027,7 @@ func printApplicationTable(apps []argoappv1.Application, output *string) { formatConditionsSummary(app), } if *output == "wide" { - vals = append(vals, app.Spec.Source.RepoURL, app.Spec.Source.Path, app.Spec.Source.TargetRevision, formatMaintenanceWindows(app)) + vals = append(vals, app.Spec.Source.RepoURL, app.Spec.Source.Path, app.Spec.Source.TargetRevision, app.Spec.SyncPolicy.Automated.ListMaintenanceWindows()) } fmt.Fprintf(w, fmtStr, vals...) } @@ -1089,26 +1069,6 @@ func formatSyncPolicy(app argoappv1.Application) string { return policy } -func formatMaintenanceWindows(app argoappv1.Application) string { - if app.Spec.SyncPolicy == nil || app.Spec.SyncPolicy.Automated == nil { - return "" - } - var windows string - if app.Spec.SyncPolicy.Automated.MaintenanceWindows != nil { - noWindows := len(app.Spec.SyncPolicy.Automated.MaintenanceWindows) - for i, w := range app.Spec.SyncPolicy.Automated.MaintenanceWindows { - var window string - if i+1 < noWindows { - window = *w.Schedule + ":" + *w.Duration + "," - } else { - window = *w.Schedule + ":" + *w.Duration - } - windows += window - } - } - return windows -} - func formatConditionsSummary(app argoappv1.Application) string { typeToCnt := make(map[string]int) for i := range app.Status.Conditions { diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index 70196bdb6b4bc..960ee41399ada 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -53,27 +53,3 @@ func Test_setHelmOpt(t *testing.T) { assert.Equal(t, []v1alpha1.HelmParameter{{Name: "foo", Value: "bar", ForceString: true}}, src.Helm.Parameters) }) } - -func Test_setMaintenanceWindows(t *testing.T) { - t.Run("SingleWindow", func(t *testing.T) { - sched := "0 10 * * *" - dur := "1h" - windows := sched + ":" + dur - ap := v1alpha1.Application{} - ap.Spec.SyncPolicy = &v1alpha1.SyncPolicy{Automated: &v1alpha1.SyncPolicyAutomated{}} - setMaintenanceWindows(&ap, windows) - assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched, Duration: &dur}, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) - }) - t.Run("MultipleWindows", func(t *testing.T) { - sched1 := "0 10 * * *" - dur1 := "1h" - sched2 := "0 22 * * *" - dur2 := "1h" - windows := sched1 + ":" + dur1 + "," + sched2 + ":" + dur2 - ap := v1alpha1.Application{} - ap.Spec.SyncPolicy = &v1alpha1.SyncPolicy{Automated: &v1alpha1.SyncPolicyAutomated{}} - setMaintenanceWindows(&ap, windows) - assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched1, Duration: &dur1}, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) - assert.Equal(t, &v1alpha1.MaintenanceWindow{Schedule: &sched2, Duration: &dur2}, ap.Spec.SyncPolicy.Automated.MaintenanceWindows[1]) - }) -} diff --git a/controller/appcontroller.go b/controller/appcontroller.go index c4ab15f522b4b..701b15830da64 100644 --- a/controller/appcontroller.go +++ b/controller/appcontroller.go @@ -12,7 +12,7 @@ import ( "time" log "github.com/sirupsen/logrus" - v1 "k8s.io/api/core/v1" + "k8s.io/api/core/v1" apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -23,8 +23,6 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" - "github.com/robfig/cron" - "github.com/argoproj/argo-cd/common" statecache "github.com/argoproj/argo-cd/controller/cache" "github.com/argoproj/argo-cd/controller/metrics" @@ -943,14 +941,12 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus * return nil } // Check if there are any active maintenance windows and skip if true - if app.Spec.SyncPolicy.Automated.MaintenanceWindows != nil { - active, err := maintenanceWindowActive(app) - if err != nil { - logCtx.Warnf("Error getting maintenance windows: %v", err) - } - if active { - return nil - } + active, err := app.Spec.SyncPolicy.Automated.MaintenanceWindowActive() + if err != nil { + logCtx.Warnf("Error getting maintenance windows: %v", err) + } + if active { + return nil } // Only perform auto-sync if we detect OutOfSync status. This is to prevent us from attempting // a sync when application is already in a Synced or Unknown state @@ -1005,7 +1001,7 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus * } appIf := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace) - _, err := argo.SetAppOperation(appIf, app.Name, &op) + _, err = argo.SetAppOperation(appIf, app.Name, &op) if err != nil { logCtx.Errorf("Failed to initiate auto-sync to %s: %v", desiredCommitSHA, err) return &appv1.ApplicationCondition{Type: appv1.ApplicationConditionSyncError, Message: err.Error()} @@ -1130,23 +1126,3 @@ func toggledAutomatedSync(old *appv1.Application, new *appv1.Application) bool { return false } -func maintenanceWindowActive(app *appv1.Application) (bool, error) { - specParser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow) - for _, w := range app.Spec.SyncPolicy.Automated.MaintenanceWindows { - schedule, err := specParser.Parse(*w.Schedule) - if err != nil { - return false, err - } - duration, err := time.ParseDuration(*w.Duration) - if err != nil { - return false, err - } - now := time.Now() - nextWindow := schedule.Next(now.Add(-duration)) - if nextWindow.Before(now) { - return true, nil - } - } - // No active maintenance windows - return false, nil -} diff --git a/controller/appcontroller_test.go b/controller/appcontroller_test.go index 52303533b19ae..164393d6df707 100644 --- a/controller/appcontroller_test.go +++ b/controller/appcontroller_test.go @@ -207,36 +207,6 @@ func TestAutoSync(t *testing.T) { assert.False(t, app.Operation.Sync.Prune) } -func TestMaintenanceWindows(t *testing.T) { - // Active window will always be true - { - app := newFakeApp() - sched := "* * * * *" - dur := "1m" - syncPol := &argoappv1.SyncPolicy{Automated: &argoappv1.SyncPolicyAutomated{}} - windows := []*argoappv1.MaintenanceWindow{{Schedule: &sched, Duration: &dur}} - syncPol.Automated.MaintenanceWindows = windows - app.Spec.SyncPolicy = syncPol - active, err := maintenanceWindowActive(app) - assert.NoError(t, err) - assert.True(t, active) - } - - // Check that incorrectly formatted schedules fail - { - app := newFakeApp() - sched := "100 * * * *" - dur := "1m" - syncPol := &argoappv1.SyncPolicy{Automated: &argoappv1.SyncPolicyAutomated{}} - windows := []*argoappv1.MaintenanceWindow{{Schedule: &sched, Duration: &dur}} - syncPol.Automated.MaintenanceWindows = windows - app.Spec.SyncPolicy = syncPol - active, err := maintenanceWindowActive(app) - assert.Error(t, err) - assert.False(t, active) - } -} - func TestSkipAutoSync(t *testing.T) { // Verify we skip when we previously synced to it in our most recent history // Set current to 'aaaaa', desired to 'aaaa' and mark system OutOfSync diff --git a/docs/user-guide/auto_sync.md b/docs/user-guide/auto_sync.md index 132c4efbc2be8..1d50b75412dfa 100644 --- a/docs/user-guide/auto_sync.md +++ b/docs/user-guide/auto_sync.md @@ -40,6 +40,30 @@ spec: selfHeal: true ``` +## Maintenance Windows + +Maintenance windows are configurable windows of time where auto sync will not run. These are defined +by a start time in cron format and a duration. These windows do not affect the running of a manual +sync. + + +```bash +argocd app set --maintenance-windows '0 11 * * *:1h,30 23 * * *:1h' +``` + +Or by creating a maintenance windows list in the automated sync policy: + +```yaml +spec: + syncPolicy: + automated: + maintenanceWindows: + - schedule: 0 11 * * * + duration: 1h + - schedule: 0 23 * * * + duration: 1h +``` + ## Automated Sync Semantics * An automated sync will only be performed if the application is OutOfSync. Applications in a diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index adaf88e4553a4..35367e88ceb6c 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -24,6 +24,8 @@ import ( "github.com/argoproj/argo-cd/common" "github.com/argoproj/argo-cd/util/git" "github.com/argoproj/argo-cd/util/rbac" + "github.com/robfig/cron" + "time" ) // Application is a definition of Application resource. @@ -437,18 +439,83 @@ type SyncPolicyAutomated struct { Prune bool `json:"prune,omitempty" protobuf:"bytes,1,opt,name=prune"` // SelfHeal enables auto-syncing if (default: false) SelfHeal bool `json:"selfHeal,omitempty" protobuf:"bytes,2,opt,name=selfHeal"` - // MaintenanceWindows disables auto-syncing during the configured time windows (default: false) + // MaintenanceWindows disables auto-syncing during the configured time windows MaintenanceWindows []*MaintenanceWindow `json:"maintenanceWindows,omitempty" protobuf:"bytes,3,opt,name=maintenanceWindows"` } // MaintenanceWindow controls when automated syncs should be disabled type MaintenanceWindow struct { - // Schedule is the time the window will begin + // Schedule is the time the window will begin, specified in cron format Schedule *string `json:"schedule,omitempty" protobuf:"bytes,1,opt,name=schedule"` // Duration is the amount of time the maintenance window will be open Duration *string `json:"duration,omitempty" protobuf:"bytes,2,opt,name=duration"` } +func (s *SyncPolicyAutomated) MaintenanceWindowActive() (bool, error) { + if s.MaintenanceWindows != nil { + specParser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow) + for _, w := range s.MaintenanceWindows { + schedule, err := specParser.Parse(*w.Schedule) + if err != nil { + return false, err + } + duration, err := time.ParseDuration(*w.Duration) + if err != nil { + return false, err + } + now := time.Now() + nextWindow := schedule.Next(now.Add(-duration)) + if nextWindow.Before(now) { + return true, nil + } + } + } + // No active maintenance windows + return false, nil +} + +func (s *SyncPolicyAutomated) ListMaintenanceWindows() string { + if s.MaintenanceWindows == nil { + return "" + } + var windows string + noWindows := len(s.MaintenanceWindows) + for i, w := range s.MaintenanceWindows { + var window string + if i+1 < noWindows { + window = *w.Schedule + ":" + *w.Duration + "," + } else { + window = *w.Schedule + ":" + *w.Duration + } + windows += window + } + return windows +} + +func (s *SyncPolicyAutomated) AddMaintenanceWindows(windows string) () { + if s.MaintenanceWindows == nil { + s.MaintenanceWindows = []*MaintenanceWindow{} + } + newWindows := strings.Split(windows, ",") + for _, w := range newWindows { + cfg := strings.Split(w, ":") + n := &MaintenanceWindow{ + Schedule: &cfg[0], + Duration: &cfg[1], + } + exists := false + for _, e := range s.MaintenanceWindows { + if n == e { + exists = true + break + } + } + if !exists { + s.MaintenanceWindows = append(s.MaintenanceWindows, n) + } + } +} + // SyncStrategy controls the manner in which a sync is performed type SyncStrategy struct { // Apply wil perform a `kubectl apply` to perform the sync. diff --git a/pkg/apis/application/v1alpha1/types_test.go b/pkg/apis/application/v1alpha1/types_test.go index c1d3be10c03a8..d268d585dbcbe 100644 --- a/pkg/apis/application/v1alpha1/types_test.go +++ b/pkg/apis/application/v1alpha1/types_test.go @@ -5,7 +5,8 @@ import ( "testing" "github.com/stretchr/testify/assert" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1" + "fmt" ) func TestAppProject_IsSourcePermitted(t *testing.T) { @@ -889,3 +890,96 @@ func TestApplicationSourceKustomize_MergeImage(t *testing.T) { assert.Equal(t, KustomizeImages{"foo=2"}, k.Images) }) } + +func TestMaintenanceWindowActive(t *testing.T) { + // Active window will always be true + t.Run("AwaysTrue", func(t *testing.T) { + app := &Application{} + sched := "* * * * *" + dur := "1m" + syncPol := &SyncPolicy{Automated: &SyncPolicyAutomated{}} + windows := []*MaintenanceWindow{{Schedule: &sched, Duration: &dur}} + syncPol.Automated.MaintenanceWindows = windows + app.Spec.SyncPolicy = syncPol + active, err := app.Spec.SyncPolicy.Automated.MaintenanceWindowActive() + assert.NoError(t, err) + assert.True(t, active) + }) + // Check that incorrectly formatted schedules fail + t.Run("FailIfIncorrectFormatting", func(t *testing.T) { + app := &Application{} + sched := "100 * * * *" + dur := "1m" + syncPol := &SyncPolicy{Automated: &SyncPolicyAutomated{}} + windows := []*MaintenanceWindow{{Schedule: &sched, Duration: &dur}} + syncPol.Automated.MaintenanceWindows = windows + app.Spec.SyncPolicy = syncPol + active, err := app.Spec.SyncPolicy.Automated.MaintenanceWindowActive() + assert.Error(t, err) + assert.False(t, active) + }) +} + +func TestAddMaintenanceWindows(t *testing.T) { + t.Run("SingleWindow", func(t *testing.T) { + sched := "0 10 * * *" + dur := "1h" + windows := sched + ":" + dur + app := &Application{ + Spec: ApplicationSpec{SyncPolicy: &SyncPolicy{Automated: &SyncPolicyAutomated{},},}, + } + app.Spec.SyncPolicy.Automated.AddMaintenanceWindows(windows) + assert.Equal(t, &MaintenanceWindow{Schedule: &sched, Duration: &dur}, app.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) + }) + t.Run("MultipleWindows", func(t *testing.T) { + sched1 := "0 10 * * *" + dur1 := "1h" + sched2 := "0 22 * * *" + dur2 := "1h" + windows := sched1 + ":" + dur1 + "," + sched2 + ":" + dur2 + app := &Application{ + Spec: ApplicationSpec{SyncPolicy: &SyncPolicy{Automated: &SyncPolicyAutomated{},},}, + } + app.Spec.SyncPolicy.Automated.AddMaintenanceWindows(windows) + assert.Equal(t, &MaintenanceWindow{Schedule: &sched1, Duration: &dur1}, app.Spec.SyncPolicy.Automated.MaintenanceWindows[0]) + assert.Equal(t, &MaintenanceWindow{Schedule: &sched2, Duration: &dur2}, app.Spec.SyncPolicy.Automated.MaintenanceWindows[1]) + }) +} + +func TestListMaintenanceWindows(t *testing.T) { + t.Run("", func(t *testing.T) { + app := &Application{ + Spec: ApplicationSpec{SyncPolicy: &SyncPolicy{Automated: &SyncPolicyAutomated{},},}, + } + assert.Equal(t, "", app.Spec.SyncPolicy.Automated.ListMaintenanceWindows()) + }) + t.Run("SingleWindow", func(t *testing.T) { + app := &Application{ + Spec: ApplicationSpec{SyncPolicy: &SyncPolicy{Automated: &SyncPolicyAutomated{},},}, + } + app.Spec.SyncPolicy.Automated.MaintenanceWindows = []*MaintenanceWindow{} + sched := "0 10 * * *" + dur := "1h" + n := &MaintenanceWindow{Schedule: &sched, Duration: &dur,} + fmt.Println(app.Spec.SyncPolicy.Automated.ListMaintenanceWindows()) + app.Spec.SyncPolicy.Automated.MaintenanceWindows = append(app.Spec.SyncPolicy.Automated.MaintenanceWindows, n) + assert.Equal(t, sched + ":" + dur, app.Spec.SyncPolicy.Automated.ListMaintenanceWindows()) + }) + t.Run("MultipleWindows", func(t *testing.T) { + app := &Application{ + Spec: ApplicationSpec{SyncPolicy: &SyncPolicy{Automated: &SyncPolicyAutomated{},},}, + } + app.Spec.SyncPolicy.Automated.MaintenanceWindows = []*MaintenanceWindow{} + sched1 := "0 10 * * *" + dur1 := "1h" + sched2 := "0 22 * * *" + dur2 := "1h" + windows := sched1 + ":" + dur1 + "," + sched2 + ":" + dur2 + n1 := &MaintenanceWindow{Schedule: &sched1, Duration: &dur1,} + n2 := &MaintenanceWindow{Schedule: &sched2, Duration: &dur2,} + app.Spec.SyncPolicy.Automated.MaintenanceWindows = append(app.Spec.SyncPolicy.Automated.MaintenanceWindows, n1, n2) + assert.Equal(t, windows, app.Spec.SyncPolicy.Automated.ListMaintenanceWindows()) + }) + +} +