From 2ab5bdcbaef5f1851547fe7551aa931440606a33 Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 6 Jul 2023 12:43:52 -0500 Subject: [PATCH 01/14] self service rollouts Signed-off-by: zachaller --- cmd/rollouts-controller/main.go | 14 +++-- controller/controller.go | 94 ++++++++++++++++----------------- controller/controller_test.go | 2 +- utils/record/record.go | 29 +++++----- 4 files changed, 71 insertions(+), 68 deletions(-) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index bb3cfeba1a..e7caf2c6f3 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -151,12 +151,16 @@ func newCommand() *cobra.Command { } istioDynamicInformerFactory := dynamicinformer.NewFilteredDynamicSharedInformerFactory(istioPrimaryDynamicClient, resyncDuration, namespace, nil) - controllerNamespaceInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( + controllerClusterInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( kubeClient, resyncDuration, - kubeinformers.WithNamespace(defaults.Namespace())) - configMapInformer := controllerNamespaceInformerFactory.Core().V1().ConfigMaps() - secretInformer := controllerNamespaceInformerFactory.Core().V1().Secrets() + //kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { + // options.LabelSelector = jobprovider.AnalysisRunUIDLabelKey + // options.FieldSelector = "metadata.name==" + namespace + //}), + ) + configMapInformer := controllerClusterInformerFactory.Core().V1().ConfigMaps() + secretInformer := controllerClusterInformerFactory.Core().V1().Secrets() mode, err := ingressutil.DetermineIngressMode(ingressVersion, kubeClient.DiscoveryClient) checkError(err) @@ -196,7 +200,7 @@ func newCommand() *cobra.Command { istioDynamicInformerFactory, namespaced, kubeInformerFactory, - controllerNamespaceInformerFactory, + controllerClusterInformerFactory, jobInformerFactory) if err = cm.Run(ctx, rolloutThreads, serviceThreads, ingressThreads, experimentThreads, analysisThreads, electOpts); err != nil { diff --git a/controller/controller.go b/controller/controller.go index 5e5fb3fb2e..8efe776bee 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -154,14 +154,14 @@ type Manager struct { namespace string - dynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - clusterDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - namespaced bool - kubeInformerFactory kubeinformers.SharedInformerFactory - controllerNamespaceInformerFactory kubeinformers.SharedInformerFactory - jobInformerFactory kubeinformers.SharedInformerFactory - istioPrimaryDynamicClient dynamic.Interface + dynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + clusterDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + namespaced bool + kubeInformerFactory kubeinformers.SharedInformerFactory + controllerClusterInformerFactory kubeinformers.SharedInformerFactory + jobInformerFactory kubeinformers.SharedInformerFactory + istioPrimaryDynamicClient dynamic.Interface } // NewManager returns a new manager to manage all the controllers @@ -198,7 +198,7 @@ func NewManager( istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory, namespaced bool, kubeInformerFactory kubeinformers.SharedInformerFactory, - controllerNamespaceInformerFactory kubeinformers.SharedInformerFactory, + controllerClusterInformerFactory kubeinformers.SharedInformerFactory, jobInformerFactory kubeinformers.SharedInformerFactory, ) *Manager { @@ -226,7 +226,7 @@ func NewManager( refResolver := rollout.NewInformerBasedWorkloadRefResolver(namespace, dynamicclientset, discoveryClient, argoprojclientset, rolloutsInformer.Informer()) apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(), defaults.Namespace(), secretInformer.Informer(), configMapInformer.Informer()) recorder := record.NewEventRecorder(kubeclientset, metrics.MetricRolloutEventsTotal, metrics.MetricNotificationFailedTotal, metrics.MetricNotificationSuccessTotal, metrics.MetricNotificationSend, apiFactory) - notificationsController := notificationcontroller.NewController(dynamicclientset.Resource(v1alpha1.RolloutGVR), rolloutsInformer.Informer(), apiFactory, + notificationsController := notificationcontroller.NewControllerWithNamespaceSupport(dynamicclientset.Resource(v1alpha1.RolloutGVR), rolloutsInformer.Informer(), apiFactory, notificationcontroller.WithToUnstructured(func(obj metav1.Object) (*unstructured.Unstructured, error) { data, err := json.Marshal(obj) if err != nil { @@ -320,42 +320,42 @@ func NewManager( }) cm := &Manager{ - wg: &sync.WaitGroup{}, - metricsServer: metricsServer, - healthzServer: healthzServer, - rolloutSynced: rolloutsInformer.Informer().HasSynced, - serviceSynced: servicesInformer.Informer().HasSynced, - ingressSynced: ingressWrap.HasSynced, - jobSynced: jobInformer.Informer().HasSynced, - experimentSynced: experimentsInformer.Informer().HasSynced, - analysisRunSynced: analysisRunInformer.Informer().HasSynced, - analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced, - clusterAnalysisTemplateSynced: clusterAnalysisTemplateInformer.Informer().HasSynced, - replicasSetSynced: replicaSetInformer.Informer().HasSynced, - configMapSynced: configMapInformer.Informer().HasSynced, - secretSynced: secretInformer.Informer().HasSynced, - rolloutWorkqueue: rolloutWorkqueue, - experimentWorkqueue: experimentWorkqueue, - analysisRunWorkqueue: analysisRunWorkqueue, - serviceWorkqueue: serviceWorkqueue, - ingressWorkqueue: ingressWorkqueue, - rolloutController: rolloutController, - serviceController: serviceController, - ingressController: ingressController, - experimentController: experimentController, - analysisController: analysisController, - notificationsController: notificationsController, - refResolver: refResolver, - namespace: namespace, - kubeClientSet: kubeclientset, - dynamicInformerFactory: dynamicInformerFactory, - clusterDynamicInformerFactory: clusterDynamicInformerFactory, - istioDynamicInformerFactory: istioDynamicInformerFactory, - namespaced: namespaced, - kubeInformerFactory: kubeInformerFactory, - controllerNamespaceInformerFactory: controllerNamespaceInformerFactory, - jobInformerFactory: jobInformerFactory, - istioPrimaryDynamicClient: istioPrimaryDynamicClient, + wg: &sync.WaitGroup{}, + metricsServer: metricsServer, + healthzServer: healthzServer, + rolloutSynced: rolloutsInformer.Informer().HasSynced, + serviceSynced: servicesInformer.Informer().HasSynced, + ingressSynced: ingressWrap.HasSynced, + jobSynced: jobInformer.Informer().HasSynced, + experimentSynced: experimentsInformer.Informer().HasSynced, + analysisRunSynced: analysisRunInformer.Informer().HasSynced, + analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced, + clusterAnalysisTemplateSynced: clusterAnalysisTemplateInformer.Informer().HasSynced, + replicasSetSynced: replicaSetInformer.Informer().HasSynced, + configMapSynced: configMapInformer.Informer().HasSynced, + secretSynced: secretInformer.Informer().HasSynced, + rolloutWorkqueue: rolloutWorkqueue, + experimentWorkqueue: experimentWorkqueue, + analysisRunWorkqueue: analysisRunWorkqueue, + serviceWorkqueue: serviceWorkqueue, + ingressWorkqueue: ingressWorkqueue, + rolloutController: rolloutController, + serviceController: serviceController, + ingressController: ingressController, + experimentController: experimentController, + analysisController: analysisController, + notificationsController: notificationsController, + refResolver: refResolver, + namespace: namespace, + kubeClientSet: kubeclientset, + dynamicInformerFactory: dynamicInformerFactory, + clusterDynamicInformerFactory: clusterDynamicInformerFactory, + istioDynamicInformerFactory: istioDynamicInformerFactory, + namespaced: namespaced, + kubeInformerFactory: kubeInformerFactory, + controllerClusterInformerFactory: controllerClusterInformerFactory, + jobInformerFactory: jobInformerFactory, + istioPrimaryDynamicClient: istioPrimaryDynamicClient, } _, err := rolloutsConfig.InitializeConfig(kubeclientset, defaults.DefaultRolloutsConfigMapName) @@ -470,7 +470,7 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT c.clusterDynamicInformerFactory.Start(ctx.Done()) } c.kubeInformerFactory.Start(ctx.Done()) - c.controllerNamespaceInformerFactory.Start(ctx.Done()) + c.controllerClusterInformerFactory.Start(ctx.Done()) c.jobInformerFactory.Start(ctx.Done()) // Check if Istio installed on cluster before starting dynamicInformerFactory diff --git a/controller/controller_test.go b/controller/controller_test.go index 1a601c9248..3124423e45 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -120,7 +120,7 @@ func (f *fixture) newManager(t *testing.T) *Manager { cm.dynamicInformerFactory = dynamicInformerFactory cm.clusterDynamicInformerFactory = dynamicInformerFactory cm.kubeInformerFactory = k8sI - cm.controllerNamespaceInformerFactory = k8sI + cm.controllerClusterInformerFactory = k8sI cm.jobInformerFactory = k8sI cm.istioPrimaryDynamicClient = dynamicClient cm.istioDynamicInformerFactory = dynamicInformerFactory diff --git a/utils/record/record.go b/utils/record/record.go index c41dbd34c7..c2599cb536 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -17,7 +17,6 @@ import ( "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" @@ -207,12 +206,21 @@ func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, o if kind == "Rollout" { e.RolloutEventCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } - err := e.sendNotifications(object, opts) + + apis, err := e.apiFactory.GetAPIsWithNamespace(namespace) if err != nil { - logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) + logCtx.Errorf("notifications failed to get apis for eventReason %s with error: %s", opts.EventReason, err) e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + } else { + for _, api := range apis { + err := e.sendNotifications(api, object, opts) + if err != nil { + logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) + e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + } + e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + } } - e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } logFn := logCtx.Infof @@ -239,7 +247,7 @@ func NewAPIFactorySettings() api.Settings { } // Send notifications for triggered event if user is subscribed -func (e *EventRecorderAdapter) sendNotifications(object runtime.Object, opts EventOptions) error { +func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, object runtime.Object, opts EventOptions) error { logCtx := logutil.WithObject(object) _, namespace, name := logutil.KindNamespaceName(logCtx) startTime := timeutil.Now() @@ -248,16 +256,7 @@ func (e *EventRecorderAdapter) sendNotifications(object runtime.Object, opts Eve e.NotificationSendPerformance.WithLabelValues(namespace, name).Observe(duration.Seconds()) logCtx.WithField("time_ms", duration.Seconds()*1e3).Debug("Notification sent") }() - notificationsAPI, err := e.apiFactory.GetAPI() - if err != nil { - // don't return error if notifications are not configured and rollout has no subscribers - subsFromAnnotations := subscriptions.Annotations(object.(metav1.Object).GetAnnotations()) - logCtx.Infof("subsFromAnnotations: %s", subsFromAnnotations) - if errors.IsNotFound(err) && len(subsFromAnnotations.GetDestinations(nil, map[string][]string{})) == 0 { - return nil - } - return err - } + cfg := notificationsAPI.GetConfig() destByTrigger := cfg.GetGlobalDestinations(object.(metav1.Object).GetLabels()) destByTrigger.Merge(subscriptions.NewAnnotations(object.(metav1.Object).GetAnnotations()).GetDestinations(cfg.DefaultTriggers, cfg.ServiceDefaultTriggers)) From ce25e2786ba5e3571554ec274a39c1daa3f6217f Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 6 Jul 2023 13:15:20 -0500 Subject: [PATCH 02/14] cleanup Signed-off-by: zachaller --- cmd/rollouts-controller/main.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index e7caf2c6f3..92548c499c 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -154,10 +154,6 @@ func newCommand() *cobra.Command { controllerClusterInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( kubeClient, resyncDuration, - //kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { - // options.LabelSelector = jobprovider.AnalysisRunUIDLabelKey - // options.FieldSelector = "metadata.name==" + namespace - //}), ) configMapInformer := controllerClusterInformerFactory.Core().V1().ConfigMaps() secretInformer := controllerClusterInformerFactory.Core().V1().Secrets() From eae20dbaa345d3db7cc252a0985145de97aa5abe Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 6 Jul 2023 14:08:03 -0500 Subject: [PATCH 03/14] update function name Signed-off-by: zachaller --- utils/record/record.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/record/record.go b/utils/record/record.go index c2599cb536..14169a6151 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -207,7 +207,7 @@ func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, o e.RolloutEventCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } - apis, err := e.apiFactory.GetAPIsWithNamespace(namespace) + apis, err := e.apiFactory.GetAPIsFromNamespace(namespace) if err != nil { logCtx.Errorf("notifications failed to get apis for eventReason %s with error: %s", opts.EventReason, err) e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() From bdff9bd317ea2fd80f9811fd8f0973b8b8edc59f Mon Sep 17 00:00:00 2001 From: zachaller Date: Fri, 7 Jul 2023 09:46:02 -0500 Subject: [PATCH 04/14] continue sending other api's on error Signed-off-by: zachaller --- utils/record/record.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/record/record.go b/utils/record/record.go index 14169a6151..85b5511497 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -211,7 +211,8 @@ func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, o if err != nil { logCtx.Errorf("notifications failed to get apis for eventReason %s with error: %s", opts.EventReason, err) e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() - } else { + } + if len(apis) > 0 { for _, api := range apis { err := e.sendNotifications(api, object, opts) if err != nil { From cb97647202a438d7c5f0b408b58d4d2ade58d78c Mon Sep 17 00:00:00 2001 From: zachaller Date: Wed, 12 Jul 2023 15:55:29 -0500 Subject: [PATCH 05/14] update go mod Signed-off-by: zachaller --- go.mod | 30 +++++++++-------- go.sum | 104 +++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 84 insertions(+), 50 deletions(-) diff --git a/go.mod b/go.mod index 465afc74fa..aaa2cb76b0 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.19 require ( github.com/antonmedv/expr v1.12.5 - github.com/argoproj/notifications-engine v0.4.0 + github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.18.1 github.com/aws/aws-sdk-go-v2/config v1.18.27 @@ -65,11 +65,10 @@ require ( github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/PagerDuty/go-pagerduty v1.6.0 // indirect - github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 // indirect + github.com/PagerDuty/go-pagerduty v1.7.0 // indirect + github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 // indirect github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect github.com/google/go-github/v41 v41.0.0 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect github.com/matryer/is v1.4.0 // indirect github.com/russross/blackfriday v1.6.0 // indirect ) @@ -78,8 +77,9 @@ require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.22.0+incompatible // indirect + github.com/Masterminds/semver/v3 v3.2.0 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.26 // indirect @@ -96,6 +96,7 @@ require ( github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect + github.com/cloudflare/circl v1.3.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.11.0 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect @@ -110,12 +111,13 @@ require ( github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.21.1 // indirect - github.com/golang-jwt/jwt/v4 v4.4.3 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.1.2 // indirect github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-github/v53 v53.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect @@ -127,7 +129,7 @@ require ( github.com/hashicorp/go-hclog v0.14.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.1 // indirect github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect - github.com/huandu/xstrings v1.3.2 // indirect + github.com/huandu/xstrings v1.3.3 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect @@ -158,7 +160,9 @@ require ( github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect - github.com/slack-go/slack v0.12.1 // indirect + github.com/shopspring/decimal v1.2.0 // indirect + github.com/slack-go/slack v0.12.2 // indirect + github.com/spf13/cast v1.5.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect @@ -167,12 +171,12 @@ require ( github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.5.0 // indirect + golang.org/x/crypto v0.7.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.8.0 // indirect golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect diff --git a/go.sum b/go.sum index d21daece7d..48d165ca70 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,7 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -68,14 +69,16 @@ github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= +github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PagerDuty/go-pagerduty v1.6.0 h1:am81SzvG5Pw+s3JZ5yEy6kGvsXXklTNRrGr3d8WKpsU= -github.com/PagerDuty/go-pagerduty v1.6.0/go.mod h1:7eaBLzsDpK7VUvU0SJ5mohczQkoWrrr5CjDaw5gh1as= +github.com/PagerDuty/go-pagerduty v1.7.0 h1:S1NcMKECxT5hJwV4VT+QzeSsSiv4oWl1s2821dUqG/8= +github.com/PagerDuty/go-pagerduty v1.7.0/go.mod h1:PuFyJKRz1liIAH4h5KVXVD18Obpp1ZXRdxHvmGXooro= +github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= +github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -91,11 +94,10 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/antonmedv/expr v1.12.5 h1:Fq4okale9swwL3OeLLs9WD9H6GbgBLJyN/NUHRv+n0E= github.com/antonmedv/expr v1.12.5/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= -github.com/argoproj/notifications-engine v0.4.0 h1:XyE4jAw0oeRQKL9vlDQBnycmqhN7EIqUdWgPsSUqnkQ= -github.com/argoproj/notifications-engine v0.4.0/go.mod h1:uGas18+DbCCwjif1zSwWWuwR0xJ18FXF+c2dkhPbF2k= +github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= +github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= @@ -134,16 +136,17 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bombsimon/logrusr/v4 v4.0.0 h1:Pm0InGphX0wMhPqC02t31onlq9OVyJ98eP/Vh63t1Oo= github.com/bombsimon/logrusr/v4 v4.0.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= -github.com/bradleyfalzon/ghinstallation/v2 v2.1.0 h1:5+NghM1Zred9Z078QEZtm28G/kfDfZN/92gkDlLwGVA= -github.com/bradleyfalzon/ghinstallation/v2 v2.1.0/go.mod h1:Xg3xPRN5Mcq6GDqeUVhFbjEWMb4JHCyWEeeBGEYQoTU= +github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 h1:yaYcGQ7yEIGbsJfW/9z7v1sLiZg/5rSNNXwmMct5XaE= +github.com/bradleyfalzon/ghinstallation/v2 v2.5.0/go.mod h1:amcvPQMrRkWNdueWOjPytGL25xQGzox7425qMgzo+Vo= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwmarrin/discordgo v0.19.0/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -157,6 +160,9 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -211,6 +217,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= @@ -277,9 +284,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= @@ -342,8 +348,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= +github.com/google/go-github/v53 v53.0.0 h1:T1RyHbSnpHYnoF0ZYKiIPSgPtuJ8G6vgc0MKodXsQDQ= +github.com/google/go-github/v53 v53.0.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= @@ -388,7 +394,6 @@ github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJr github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -396,7 +401,6 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk= github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= @@ -408,10 +412,11 @@ github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= +github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -497,14 +502,12 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.10/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -517,7 +520,7 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/minio-go/v7 v7.0.29/go.mod h1:x81+AX5gHSfCSqw7jxRKHvxUXMlE5uKX0Vb75Xk5yYg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -527,6 +530,7 @@ github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQ github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= @@ -588,7 +592,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -628,14 +631,16 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/servicemeshinterface/smi-sdk-go v0.5.0 h1:9cZdhvGbGDlmnp9qqmcQL+RL6KZ3IzHfDLoA5Axg8n0= github.com/servicemeshinterface/smi-sdk-go v0.5.0/go.mod h1:nm1Slf3pfaZPP3g2tE/K5wDmQ1uWVSP0p3uu5rQAQLc= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/slack-go/slack v0.12.1 h1:X97b9g2hnITDtNsNe5GkGx6O2/Sz/uC20ejRZN6QxOw= -github.com/slack-go/slack v0.12.1/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= +github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ= +github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -647,6 +652,9 @@ github.com/spaceapegames/go-wavefront v1.8.1 h1:Xuby0uBfw1WVxD9d+l8Gh+zINqnBfd0R github.com/spaceapegames/go-wavefront v1.8.1/go.mod h1:GtdIjtJ0URkfPmaKx0+7vMSDvT/MON9v+4pbdagA8As= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= @@ -702,6 +710,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -727,8 +736,10 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -761,6 +772,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -809,16 +821,20 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -830,9 +846,10 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -890,19 +907,28 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220406155245-289d7a0edf71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -912,6 +938,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -972,6 +1001,7 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From b1672a951e86557fd41f6cfd2699c60b6c7e2652 Mon Sep 17 00:00:00 2001 From: zachaller Date: Wed, 12 Jul 2023 16:14:32 -0500 Subject: [PATCH 06/14] fix tests Signed-off-by: zachaller --- utils/record/record.go | 5 +++++ utils/record/record_test.go | 14 +++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/utils/record/record.go b/utils/record/record.go index 85b5511497..374ec02747 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -5,6 +5,7 @@ import ( "crypto/sha1" "encoding/base64" "encoding/json" + "fmt" "regexp" "strings" "time" @@ -258,6 +259,10 @@ func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, objec logCtx.WithField("time_ms", duration.Seconds()*1e3).Debug("Notification sent") }() + if notificationsAPI == nil { + return fmt.Errorf("notificationsAPI is nil") + } + cfg := notificationsAPI.GetConfig() destByTrigger := cfg.GetGlobalDestinations(object.(metav1.Object).GetLabels()) destByTrigger.Merge(subscriptions.NewAnnotations(object.(metav1.Object).GetAnnotations()).GetDestinations(cfg.DefaultTriggers, cfg.ServiceDefaultTriggers)) diff --git a/utils/record/record_test.go b/utils/record/record_test.go index fb8794bcf5..d7e64af1fa 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -112,7 +112,7 @@ func TestSendNotifications(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory //ch := make(chan prometheus.HistogramVec, 1) - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) assert.NoError(t, err) } @@ -139,7 +139,7 @@ func TestSendNotificationsWhenCondition(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory //ch := make(chan prometheus.HistogramVec, 1) - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) assert.NoError(t, err) } @@ -339,7 +339,7 @@ func TestSendNotificationsFails(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) assert.Error(t, err) }) @@ -348,7 +348,7 @@ func TestSendNotificationsFails(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(nil, &r, EventOptions{EventReason: "FooReason"}) assert.Error(t, err) }) @@ -379,7 +379,7 @@ func TestSendNotificationsFailsWithRunTriggerError(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) assert.Error(t, err) }) @@ -388,7 +388,7 @@ func TestSendNotificationsFailsWithRunTriggerError(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "FooReason"}) + err := rec.sendNotifications(nil, &r, EventOptions{EventReason: "FooReason"}) assert.Error(t, err) }) @@ -418,7 +418,7 @@ func TestSendNotificationsNoTrigger(t *testing.T) { rec := NewFakeEventRecorder() rec.EventRecorderAdapter.apiFactory = apiFactory - err := rec.sendNotifications(&r, EventOptions{EventReason: "MissingReason"}) + err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "MissingReason"}) assert.Error(t, err) } From da3a80b4370abe2d328a62ed08760039bf140b19 Mon Sep 17 00:00:00 2001 From: zachaller Date: Wed, 12 Jul 2023 16:40:17 -0500 Subject: [PATCH 07/14] codegen Signed-off-by: zachaller --- docs/generated/notification-services/email.md | 2 +- .../generated/notification-services/github.md | 8 +- .../notification-services/pagerduty.md | 4 +- .../notification-services/pagerduty_v2.md | 78 +++++++++++++++++++ .../notification-services/rocketchat.md | 2 +- docs/generated/notification-services/slack.md | 6 +- docs/generated/notification-services/teams.md | 4 +- mkdocs.yml | 1 + .../rollouts/v1alpha1/openapi_generated.go | 48 ++++++++++-- 9 files changed, 136 insertions(+), 17 deletions(-) create mode 100755 docs/generated/notification-services/pagerduty_v2.md diff --git a/docs/generated/notification-services/email.md b/docs/generated/notification-services/email.md index e3c4b7d9e6..b81ab6cde8 100755 --- a/docs/generated/notification-services/email.md +++ b/docs/generated/notification-services/email.md @@ -46,7 +46,7 @@ data: ## Template -Notification templates support specifying subject for email notifications: +[Notification templates](../templates.md) support specifying subject for email notifications: ```yaml apiVersion: v1 diff --git a/docs/generated/notification-services/github.md b/docs/generated/notification-services/github.md index 2b5bbf1e8c..c24ea00f43 100755 --- a/docs/generated/notification-services/github.md +++ b/docs/generated/notification-services/github.md @@ -12,7 +12,7 @@ The GitHub notification service changes commit status using [GitHub Apps](https: ## Configuration 1. Create a GitHub Apps using https://github.com/settings/apps/new -2. Change repository permissions to enable write commit statuses +2. Change repository permissions to enable write commit statuses and/or deployments ![2](https://user-images.githubusercontent.com/18019529/108397381-3ca57980-725b-11eb-8d17-5b8992dc009e.png) 3. Generate a private key, and download it automatically ![3](https://user-images.githubusercontent.com/18019529/108397926-d4a36300-725b-11eb-83fe-74795c8c3e03.png) @@ -69,6 +69,12 @@ template.app-deployed: | state: success label: "continuous-delivery/{{.app.metadata.name}}" targetURL: "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true" + deployment: + state: success + environment: production + environmentURL: "https://{{.app.metadata.name}}.example.com" + logURL: "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true" + requiredContexts: [] ``` **Notes**: diff --git a/docs/generated/notification-services/pagerduty.md b/docs/generated/notification-services/pagerduty.md index 849b4db802..0e1ab96533 100755 --- a/docs/generated/notification-services/pagerduty.md +++ b/docs/generated/notification-services/pagerduty.md @@ -35,7 +35,7 @@ data: ## Template -Notification templates support specifying subject for pagerduty notifications: +[Notification templates](../templates.md) support specifying subject for pagerduty notifications: ```yaml apiVersion: v1 @@ -63,4 +63,4 @@ kind: Rollout metadata: annotations: notifications.argoproj.io/subscribe.on-rollout-aborted.pagerduty: "" -``` \ No newline at end of file +``` diff --git a/docs/generated/notification-services/pagerduty_v2.md b/docs/generated/notification-services/pagerduty_v2.md new file mode 100755 index 0000000000..21e8d942e4 --- /dev/null +++ b/docs/generated/notification-services/pagerduty_v2.md @@ -0,0 +1,78 @@ +# PagerDuty V2 + +## Parameters + +The PagerDuty notification service is used to trigger PagerDuty events and requires specifying the following settings: + +* `serviceKeys` - a dictionary with the following structure: + * `service-name: $pagerduty-key-service-name` where `service-name` is the name you want to use for the service to make events for, and `$pagerduty-key-service-name` is a reference to the secret that contains the actual PagerDuty integration key (Events API v2 integration) + +If you want multiple Argo apps to trigger events to their respective PagerDuty services, create an integration key in each service you want to setup alerts for. + +To create a PagerDuty integration key, [follow these instructions](https://support.pagerduty.com/docs/services-and-integrations#create-a-generic-events-api-integration) to add an Events API v2 integration to the service of your choice. + +## Configuration + +The following snippet contains sample PagerDuty service configuration. It assumes the service you want to alert on is called `my-service`. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: +stringData: + pagerduty-key-my-service: +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: +data: + service.pagerdutyv2: | + serviceKeys: + my-service: $pagerduty-key-my-service +``` + +## Template + +[Notification templates](../templates.md) support specifying subject for PagerDuty notifications: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: +data: + template.rollout-aborted: | + message: Rollout {{.rollout.metadata.name}} is aborted. + pagerdutyv2: + summary: "Rollout {{.rollout.metadata.name}} is aborted." + severity: "critical" + source: "{{.rollout.metadata.name}}" +``` + +The parameters for the PagerDuty configuration in the template generally match with the payload for the Events API v2 endpoint. All parameters are strings. + +* `summary` - (required) A brief text summary of the event, used to generate the summaries/titles of any associated alerts. +* `severity` - (required) The perceived severity of the status the event is describing with respect to the affected system. Allowed values: `critical`, `warning`, `error`, `info` +* `source` - (required) The unique location of the affected system, preferably a hostname or FQDN. +* `component` - Component of the source machine that is responsible for the event. +* `group` - Logical grouping of components of a service. +* `class` - The class/type of the event. +* `url` - The URL that should be used for the link "View in ArgoCD" in PagerDuty. + +The `timestamp` and `custom_details` parameters are not currently supported. + +## Annotation + +Annotation sample for PagerDuty notifications: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + annotations: + notifications.argoproj.io/subscribe.on-rollout-aborted.pagerdutyv2: "" +``` diff --git a/docs/generated/notification-services/rocketchat.md b/docs/generated/notification-services/rocketchat.md index 554f42a808..f115705013 100755 --- a/docs/generated/notification-services/rocketchat.md +++ b/docs/generated/notification-services/rocketchat.md @@ -64,7 +64,7 @@ metadata: ## Templates -Notification templates can be customized with RocketChat [attachments](https://developer.rocket.chat/api/rest-api/methods/chat/postmessage#attachments-detail). +[Notification templates](../templates.md) can be customized with RocketChat [attachments](https://developer.rocket.chat/api/rest-api/methods/chat/postmessage#attachments-detail). *Note: Attachments structure in Rocketchat is same with Slack attachments [feature](https://api.slack.com/messaging/composing/layouts).* diff --git a/docs/generated/notification-services/slack.md b/docs/generated/notification-services/slack.md index 0cd9a0f177..876445bfec 100755 --- a/docs/generated/notification-services/slack.md +++ b/docs/generated/notification-services/slack.md @@ -50,7 +50,7 @@ The Slack notification service configuration includes following settings: token: $slack-token ``` -1. Add annotation in application yaml file to enable notifications for specific argocd app +1. Add annotation in application yaml file to enable notifications for specific argocd app. The following example uses the [on-sync-succeeded trigger](../catalog.md#triggers): ```yaml apiVersion: argoproj.io/v1alpha1 @@ -60,7 +60,7 @@ The Slack notification service configuration includes following settings: notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel ``` -1. Annotation with more than one trigger multiple of destinations and recipients +1. Annotation with more than one [trigger](../catalog.md#triggers), with multiple destinations and recipients ```yaml apiVersion: argoproj.io/v1alpha1 @@ -82,7 +82,7 @@ The Slack notification service configuration includes following settings: ## Templates -Notification templates can be customized to leverage slack message blocks and attachments +[Notification templates](../templates.md) can be customized to leverage slack message blocks and attachments [feature](https://api.slack.com/messaging/composing/layouts). ![](https://user-images.githubusercontent.com/426437/72776856-6dcef880-3bc8-11ea-8e3b-c72df16ee8e6.png) diff --git a/docs/generated/notification-services/teams.md b/docs/generated/notification-services/teams.md index eb50f5538c..b5b9a228c4 100755 --- a/docs/generated/notification-services/teams.md +++ b/docs/generated/notification-services/teams.md @@ -48,7 +48,7 @@ metadata: ![](https://user-images.githubusercontent.com/18019529/114271500-9d2b8880-9a4c-11eb-85c1-f6935f0431d5.png) -Notification templates can be customized to leverage teams message sections, facts, themeColor, summary and potentialAction [feature](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using). +[Notification templates](../templates.md) can be customized to leverage teams message sections, facts, themeColor, summary and potentialAction [feature](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using). ```yaml template.app-sync-succeeded: | @@ -123,4 +123,4 @@ You can set a summary of the message that will be shown on Notifcation & Activit template.app-sync-succeeded: | teams: summary: "Sync Succeeded" -``` \ No newline at end of file +``` diff --git a/mkdocs.yml b/mkdocs.yml index 6f851fa425..471359c778 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -84,6 +84,7 @@ nav: - generated/notification-services/opsgenie.md - generated/notification-services/overview.md - generated/notification-services/pagerduty.md + - generated/notification-services/pagerduty_v2.md - generated/notification-services/pushover.md - generated/notification-services/rocketchat.md - generated/notification-services/slack.md diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 79251e03a0..fdb24d4d31 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -168,6 +168,12 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBStatus(ref common.ReferenceCallback) c Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AwsResourceRef"), }, }, + "ingress": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -186,7 +192,6 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBTrafficRouting(ref common.ReferenceCal "ingress": { SchemaProps: spec.SchemaProps{ Description: "Ingress refers to the name of an `Ingress` resource in the same namespace as the `Rollout`", - Default: "", Type: []string{"string"}, Format: "", }, @@ -206,21 +211,36 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBTrafficRouting(ref common.ReferenceCal Format: "", }, }, + "annotationPrefix": { + SchemaProps: spec.SchemaProps{ + Description: "AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller", + Type: []string{"string"}, + Format: "", + }, + }, "stickinessConfig": { SchemaProps: spec.SchemaProps{ - Description: "AdditionalForwardConfig allows to specify further settings on the ForwaredConfig", + Description: "StickinessConfig refers to the duration-based stickiness of the target groups associated with an `Ingress`", Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.StickinessConfig"), }, }, - "annotationPrefix": { + "ingresses": { SchemaProps: spec.SchemaProps{ - Description: "AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller", - Type: []string{"string"}, - Format: "", + Description: "Ingresses refers to the name of an `Ingress` resource in the same namespace as the `Rollout` in a multi ingress scenario", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, }, }, }, - Required: []string{"ingress", "servicePort"}, + Required: []string{"servicePort"}, }, }, Dependencies: []string{ @@ -4406,6 +4426,20 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutStatus(ref common.ReferenceCallbac Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ALBStatus"), }, }, + "albs": { + SchemaProps: spec.SchemaProps{ + Description: "/ ALBs keeps information regarding multiple ALBs and TargetGroups in a multi ingress scenario", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ALBStatus"), + }, + }, + }, + }, + }, }, }, }, From c62494cd4f4bfc7fc1086290a948e5a604d4c814 Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 13 Jul 2023 07:43:56 -0500 Subject: [PATCH 08/14] codegen Signed-off-by: zachaller --- .../rollouts/v1alpha1/openapi_generated.go | 48 +++---------------- 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index fdb24d4d31..79251e03a0 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -168,12 +168,6 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBStatus(ref common.ReferenceCallback) c Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AwsResourceRef"), }, }, - "ingress": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, }, }, }, @@ -192,6 +186,7 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBTrafficRouting(ref common.ReferenceCal "ingress": { SchemaProps: spec.SchemaProps{ Description: "Ingress refers to the name of an `Ingress` resource in the same namespace as the `Rollout`", + Default: "", Type: []string{"string"}, Format: "", }, @@ -211,36 +206,21 @@ func schema_pkg_apis_rollouts_v1alpha1_ALBTrafficRouting(ref common.ReferenceCal Format: "", }, }, - "annotationPrefix": { - SchemaProps: spec.SchemaProps{ - Description: "AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller", - Type: []string{"string"}, - Format: "", - }, - }, "stickinessConfig": { SchemaProps: spec.SchemaProps{ - Description: "StickinessConfig refers to the duration-based stickiness of the target groups associated with an `Ingress`", + Description: "AdditionalForwardConfig allows to specify further settings on the ForwaredConfig", Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.StickinessConfig"), }, }, - "ingresses": { + "annotationPrefix": { SchemaProps: spec.SchemaProps{ - Description: "Ingresses refers to the name of an `Ingress` resource in the same namespace as the `Rollout` in a multi ingress scenario", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, + Description: "AnnotationPrefix has to match the configured annotation prefix on the alb ingress controller", + Type: []string{"string"}, + Format: "", }, }, }, - Required: []string{"servicePort"}, + Required: []string{"ingress", "servicePort"}, }, }, Dependencies: []string{ @@ -4426,20 +4406,6 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutStatus(ref common.ReferenceCallbac Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ALBStatus"), }, }, - "albs": { - SchemaProps: spec.SchemaProps{ - Description: "/ ALBs keeps information regarding multiple ALBs and TargetGroups in a multi ingress scenario", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ALBStatus"), - }, - }, - }, - }, - }, }, }, }, From 0c1597e733198ae1572a3def2a4bcbe89ee2cb69 Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 13 Jul 2023 09:01:18 -0500 Subject: [PATCH 09/14] add docs Signed-off-by: zachaller --- docs/features/notifications.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/features/notifications.md b/docs/features/notifications.md index 3a7dfb2e4e..6825ed084a 100644 --- a/docs/features/notifications.md +++ b/docs/features/notifications.md @@ -50,6 +50,20 @@ stringData: Learn more about supported services and configuration settings in services [documentation](../generated/notification-services/overview.md). +## Namespace based configuration + +!!! important +Available since v1.6 + +A common installation method for Argo Rollouts is to install it in a dedicated namespace to manage a whole cluster. In this case, the administrator is the only +person who can configure notifications in that namespace generally. However, in some cases, it is required to allow end-users to configure notifications +for their Rollout resources. For example, the end-user can configure notifications for their Rollouts in the namespace where they have access to and their rollout is running in. + +To use this feature all you need to do is create the same configmap named `argo-rollouts-notification-configmap` and possibly +a secrete `argo-rollouts-notification-secret` in the namespace where the rollout object lives. When it is configured this way the controller +will send notifications using both the controller level configuration aka the configmap located in the same namespaces as the controller +as well as the namespace level configuration where the rollout object is at. + ## Default Trigger templates Currently the following triggers have [built-in templates](https://github.com/argoproj/argo-rollouts/tree/master/manifests/notifications). From 5a6989b32993641b3e9158516e48b7df9ff3d209 Mon Sep 17 00:00:00 2001 From: zachaller Date: Wed, 2 Aug 2023 15:32:02 -0500 Subject: [PATCH 10/14] put self serve notifications behind a flag Signed-off-by: zachaller --- cmd/rollouts-controller/main.go | 84 ++++++++++++++++---------- controller/controller.go | 103 ++++++++++++++++---------------- controller/controller_test.go | 51 ++++++++-------- 3 files changed, 132 insertions(+), 106 deletions(-) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index 92548c499c..2b603ec8b6 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -6,6 +6,8 @@ import ( "strings" "time" + "github.com/argoproj/argo-rollouts/utils/record" + "github.com/argoproj/pkg/kubeclientmetrics" smiclientset "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned" log "github.com/sirupsen/logrus" @@ -44,31 +46,32 @@ const ( func newCommand() *cobra.Command { var ( - clientConfig clientcmd.ClientConfig - rolloutResyncPeriod int64 - logLevel string - logFormat string - klogLevel int - metricsPort int - healthzPort int - instanceID string - qps float32 - burst int - rolloutThreads int - experimentThreads int - analysisThreads int - serviceThreads int - ingressThreads int - istioVersion string - trafficSplitVersion string - ambassadorVersion string - ingressVersion string - appmeshCRDVersion string - albIngressClasses []string - nginxIngressClasses []string - awsVerifyTargetGroup bool - namespaced bool - printVersion bool + clientConfig clientcmd.ClientConfig + rolloutResyncPeriod int64 + logLevel string + logFormat string + klogLevel int + metricsPort int + healthzPort int + instanceID string + qps float32 + burst int + rolloutThreads int + experimentThreads int + analysisThreads int + serviceThreads int + ingressThreads int + istioVersion string + trafficSplitVersion string + ambassadorVersion string + ingressVersion string + appmeshCRDVersion string + albIngressClasses []string + nginxIngressClasses []string + awsVerifyTargetGroup bool + namespaced bool + printVersion bool + selfServiceNotificationEnabled bool ) electOpts := controller.NewLeaderElectionOptions() var command = cobra.Command{ @@ -151,12 +154,31 @@ func newCommand() *cobra.Command { } istioDynamicInformerFactory := dynamicinformer.NewFilteredDynamicSharedInformerFactory(istioPrimaryDynamicClient, resyncDuration, namespace, nil) - controllerClusterInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( + var notificationConfigNamespace string + if selfServiceNotificationEnabled { + notificationConfigNamespace = metav1.NamespaceAll + } else { + notificationConfigNamespace = defaults.Namespace() + } + notificationSecretInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( + kubeClient, + resyncDuration, + kubeinformers.WithNamespace(notificationConfigNamespace), + kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { + options.Kind = "Secrete" + options.FieldSelector = fmt.Sprintf("metadata.name=%s", record.NotificationSecret) + }), + ) + + notificationConfigMapInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( kubeClient, resyncDuration, + kubeinformers.WithNamespace(notificationConfigNamespace), + kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { + options.Kind = "ConfigMap" + options.FieldSelector = fmt.Sprintf("metadata.name=%s", record.NotificationConfigMap) + }), ) - configMapInformer := controllerClusterInformerFactory.Core().V1().ConfigMaps() - secretInformer := controllerClusterInformerFactory.Core().V1().Secrets() mode, err := ingressutil.DetermineIngressMode(ingressVersion, kubeClient.DiscoveryClient) checkError(err) @@ -182,8 +204,8 @@ func newCommand() *cobra.Command { istioPrimaryDynamicClient, istioDynamicInformerFactory.ForResource(istioutil.GetIstioVirtualServiceGVR()).Informer(), istioDynamicInformerFactory.ForResource(istioutil.GetIstioDestinationRuleGVR()).Informer(), - configMapInformer, - secretInformer, + notificationConfigMapInformerFactory, + notificationSecretInformerFactory, resyncDuration, instanceID, metricsPort, @@ -196,7 +218,6 @@ func newCommand() *cobra.Command { istioDynamicInformerFactory, namespaced, kubeInformerFactory, - controllerClusterInformerFactory, jobInformerFactory) if err = cm.Run(ctx, rolloutThreads, serviceThreads, ingressThreads, experimentThreads, analysisThreads, electOpts); err != nil { @@ -240,6 +261,7 @@ func newCommand() *cobra.Command { command.Flags().DurationVar(&electOpts.LeaderElectionLeaseDuration, "leader-election-lease-duration", controller.DefaultLeaderElectionLeaseDuration, "The duration that non-leader candidates will wait after observing a leadership renewal until attempting to acquire leadership of a led but unrenewed leader slot. This is effectively the maximum duration that a leader can be stopped before it is replaced by another candidate. This is only applicable if leader election is enabled.") command.Flags().DurationVar(&electOpts.LeaderElectionRenewDeadline, "leader-election-renew-deadline", controller.DefaultLeaderElectionRenewDeadline, "The interval between attempts by the acting master to renew a leadership slot before it stops leading. This must be less than or equal to the lease duration. This is only applicable if leader election is enabled.") command.Flags().DurationVar(&electOpts.LeaderElectionRetryPeriod, "leader-election-retry-period", controller.DefaultLeaderElectionRetryPeriod, "The duration the clients should wait between attempting acquisition and renewal of a leadership. This is only applicable if leader election is enabled.") + command.Flags().BoolVar(&selfServiceNotificationEnabled, "self-service-notification-enabled", false, "Allows rollouts controller to pull notification config from the namespace that the rollout resource is in. This is useful for self-service notification.") return &command } diff --git a/controller/controller.go b/controller/controller.go index 8efe776bee..5429cfe743 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -154,14 +154,15 @@ type Manager struct { namespace string - dynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - clusterDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory - namespaced bool - kubeInformerFactory kubeinformers.SharedInformerFactory - controllerClusterInformerFactory kubeinformers.SharedInformerFactory - jobInformerFactory kubeinformers.SharedInformerFactory - istioPrimaryDynamicClient dynamic.Interface + dynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + clusterDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory + namespaced bool + kubeInformerFactory kubeinformers.SharedInformerFactory + notificationConfigMapInformerFactory kubeinformers.SharedInformerFactory + notificationSecretInformerFactory kubeinformers.SharedInformerFactory + jobInformerFactory kubeinformers.SharedInformerFactory + istioPrimaryDynamicClient dynamic.Interface } // NewManager returns a new manager to manage all the controllers @@ -184,8 +185,8 @@ func NewManager( istioPrimaryDynamicClient dynamic.Interface, istioVirtualServiceInformer cache.SharedIndexInformer, istioDestinationRuleInformer cache.SharedIndexInformer, - configMapInformer coreinformers.ConfigMapInformer, - secretInformer coreinformers.SecretInformer, + notificationConfigMapInformerFactory kubeinformers.SharedInformerFactory, + notificationSecretInformerFactory kubeinformers.SharedInformerFactory, resyncPeriod time.Duration, instanceID string, metricsPort int, @@ -198,10 +199,8 @@ func NewManager( istioDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory, namespaced bool, kubeInformerFactory kubeinformers.SharedInformerFactory, - controllerClusterInformerFactory kubeinformers.SharedInformerFactory, jobInformerFactory kubeinformers.SharedInformerFactory, ) *Manager { - runtime.Must(rolloutscheme.AddToScheme(scheme.Scheme)) log.Info("Creating event broadcaster") @@ -224,7 +223,7 @@ func NewManager( ingressWorkqueue := workqueue.NewNamedRateLimitingQueue(queue.DefaultArgoRolloutsRateLimiter(), "Ingresses") refResolver := rollout.NewInformerBasedWorkloadRefResolver(namespace, dynamicclientset, discoveryClient, argoprojclientset, rolloutsInformer.Informer()) - apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(), defaults.Namespace(), secretInformer.Informer(), configMapInformer.Informer()) + apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(), defaults.Namespace(), notificationSecretInformerFactory.Core().V1().Secrets().Informer(), notificationConfigMapInformerFactory.Core().V1().ConfigMaps().Informer()) recorder := record.NewEventRecorder(kubeclientset, metrics.MetricRolloutEventsTotal, metrics.MetricNotificationFailedTotal, metrics.MetricNotificationSuccessTotal, metrics.MetricNotificationSend, apiFactory) notificationsController := notificationcontroller.NewControllerWithNamespaceSupport(dynamicclientset.Resource(v1alpha1.RolloutGVR), rolloutsInformer.Informer(), apiFactory, notificationcontroller.WithToUnstructured(func(obj metav1.Object) (*unstructured.Unstructured, error) { @@ -320,42 +319,43 @@ func NewManager( }) cm := &Manager{ - wg: &sync.WaitGroup{}, - metricsServer: metricsServer, - healthzServer: healthzServer, - rolloutSynced: rolloutsInformer.Informer().HasSynced, - serviceSynced: servicesInformer.Informer().HasSynced, - ingressSynced: ingressWrap.HasSynced, - jobSynced: jobInformer.Informer().HasSynced, - experimentSynced: experimentsInformer.Informer().HasSynced, - analysisRunSynced: analysisRunInformer.Informer().HasSynced, - analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced, - clusterAnalysisTemplateSynced: clusterAnalysisTemplateInformer.Informer().HasSynced, - replicasSetSynced: replicaSetInformer.Informer().HasSynced, - configMapSynced: configMapInformer.Informer().HasSynced, - secretSynced: secretInformer.Informer().HasSynced, - rolloutWorkqueue: rolloutWorkqueue, - experimentWorkqueue: experimentWorkqueue, - analysisRunWorkqueue: analysisRunWorkqueue, - serviceWorkqueue: serviceWorkqueue, - ingressWorkqueue: ingressWorkqueue, - rolloutController: rolloutController, - serviceController: serviceController, - ingressController: ingressController, - experimentController: experimentController, - analysisController: analysisController, - notificationsController: notificationsController, - refResolver: refResolver, - namespace: namespace, - kubeClientSet: kubeclientset, - dynamicInformerFactory: dynamicInformerFactory, - clusterDynamicInformerFactory: clusterDynamicInformerFactory, - istioDynamicInformerFactory: istioDynamicInformerFactory, - namespaced: namespaced, - kubeInformerFactory: kubeInformerFactory, - controllerClusterInformerFactory: controllerClusterInformerFactory, - jobInformerFactory: jobInformerFactory, - istioPrimaryDynamicClient: istioPrimaryDynamicClient, + wg: &sync.WaitGroup{}, + metricsServer: metricsServer, + healthzServer: healthzServer, + rolloutSynced: rolloutsInformer.Informer().HasSynced, + serviceSynced: servicesInformer.Informer().HasSynced, + ingressSynced: ingressWrap.HasSynced, + jobSynced: jobInformer.Informer().HasSynced, + experimentSynced: experimentsInformer.Informer().HasSynced, + analysisRunSynced: analysisRunInformer.Informer().HasSynced, + analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced, + clusterAnalysisTemplateSynced: clusterAnalysisTemplateInformer.Informer().HasSynced, + replicasSetSynced: replicaSetInformer.Informer().HasSynced, + configMapSynced: notificationConfigMapInformerFactory.Core().V1().ConfigMaps().Informer().HasSynced, + secretSynced: notificationSecretInformerFactory.Core().V1().Secrets().Informer().HasSynced, + rolloutWorkqueue: rolloutWorkqueue, + experimentWorkqueue: experimentWorkqueue, + analysisRunWorkqueue: analysisRunWorkqueue, + serviceWorkqueue: serviceWorkqueue, + ingressWorkqueue: ingressWorkqueue, + rolloutController: rolloutController, + serviceController: serviceController, + ingressController: ingressController, + experimentController: experimentController, + analysisController: analysisController, + notificationsController: notificationsController, + refResolver: refResolver, + namespace: namespace, + kubeClientSet: kubeclientset, + dynamicInformerFactory: dynamicInformerFactory, + clusterDynamicInformerFactory: clusterDynamicInformerFactory, + istioDynamicInformerFactory: istioDynamicInformerFactory, + namespaced: namespaced, + kubeInformerFactory: kubeInformerFactory, + jobInformerFactory: jobInformerFactory, + istioPrimaryDynamicClient: istioPrimaryDynamicClient, + notificationConfigMapInformerFactory: notificationConfigMapInformerFactory, + notificationSecretInformerFactory: notificationSecretInformerFactory, } _, err := rolloutsConfig.InitializeConfig(kubeclientset, defaults.DefaultRolloutsConfigMapName) @@ -470,7 +470,10 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT c.clusterDynamicInformerFactory.Start(ctx.Done()) } c.kubeInformerFactory.Start(ctx.Done()) - c.controllerClusterInformerFactory.Start(ctx.Done()) + + c.notificationConfigMapInformerFactory.Start(ctx.Done()) + c.notificationSecretInformerFactory.Start(ctx.Done()) + c.jobInformerFactory.Start(ctx.Done()) // Check if Istio installed on cluster before starting dynamicInformerFactory diff --git a/controller/controller_test.go b/controller/controller_test.go index 3124423e45..f3d7e350d0 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -67,27 +67,29 @@ func (f *fixture) newManager(t *testing.T) *Manager { analysisRunWorkqueue := workqueue.NewNamedRateLimitingQueue(queue.DefaultArgoRolloutsRateLimiter(), "AnalysisRuns") cm := &Manager{ - wg: &sync.WaitGroup{}, - healthzServer: NewHealthzServer(fmt.Sprintf(listenAddr, 8080)), - rolloutSynced: alwaysReady, - experimentSynced: alwaysReady, - analysisRunSynced: alwaysReady, - analysisTemplateSynced: alwaysReady, - clusterAnalysisTemplateSynced: alwaysReady, - serviceSynced: alwaysReady, - ingressSynced: alwaysReady, - jobSynced: alwaysReady, - replicasSetSynced: alwaysReady, - configMapSynced: alwaysReady, - secretSynced: alwaysReady, - rolloutWorkqueue: rolloutWorkqueue, - serviceWorkqueue: serviceWorkqueue, - ingressWorkqueue: ingressWorkqueue, - experimentWorkqueue: experimentWorkqueue, - analysisRunWorkqueue: analysisRunWorkqueue, - kubeClientSet: f.kubeclient, - namespace: "", - namespaced: false, + wg: &sync.WaitGroup{}, + healthzServer: NewHealthzServer(fmt.Sprintf(listenAddr, 8080)), + rolloutSynced: alwaysReady, + experimentSynced: alwaysReady, + analysisRunSynced: alwaysReady, + analysisTemplateSynced: alwaysReady, + clusterAnalysisTemplateSynced: alwaysReady, + serviceSynced: alwaysReady, + ingressSynced: alwaysReady, + jobSynced: alwaysReady, + replicasSetSynced: alwaysReady, + configMapSynced: alwaysReady, + secretSynced: alwaysReady, + rolloutWorkqueue: rolloutWorkqueue, + serviceWorkqueue: serviceWorkqueue, + ingressWorkqueue: ingressWorkqueue, + experimentWorkqueue: experimentWorkqueue, + analysisRunWorkqueue: analysisRunWorkqueue, + kubeClientSet: f.kubeclient, + namespace: "", + namespaced: false, + notificationSecretInformerFactory: kubeinformers.NewSharedInformerFactoryWithOptions(f.kubeclient, noResyncPeriodFunc()), + notificationConfigMapInformerFactory: kubeinformers.NewSharedInformerFactoryWithOptions(f.kubeclient, noResyncPeriodFunc()), } metricsAddr := fmt.Sprintf(listenAddr, 8090) @@ -120,7 +122,7 @@ func (f *fixture) newManager(t *testing.T) *Manager { cm.dynamicInformerFactory = dynamicInformerFactory cm.clusterDynamicInformerFactory = dynamicInformerFactory cm.kubeInformerFactory = k8sI - cm.controllerClusterInformerFactory = k8sI + //cm.controllerClusterInformerFactory = k8sI cm.jobInformerFactory = k8sI cm.istioPrimaryDynamicClient = dynamicClient cm.istioDynamicInformerFactory = dynamicInformerFactory @@ -253,8 +255,8 @@ func TestNewManager(t *testing.T) { dynamicClient, istioVirtualServiceInformer, istioDestinationRuleInformer, - k8sI.Core().V1().ConfigMaps(), - k8sI.Core().V1().Secrets(), + k8sI, + k8sI, noResyncPeriodFunc(), "test", 8090, @@ -268,7 +270,6 @@ func TestNewManager(t *testing.T) { false, nil, nil, - nil, ) assert.NotNil(t, cm) From 8ac7c07f1a7b358407f9089c41ec717dd5da87e6 Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 3 Aug 2023 08:53:26 -0500 Subject: [PATCH 11/14] put self serve notifications behind a flag Signed-off-by: zachaller --- docs/features/notifications.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/features/notifications.md b/docs/features/notifications.md index 6825ed084a..5c0617622e 100644 --- a/docs/features/notifications.md +++ b/docs/features/notifications.md @@ -64,6 +64,8 @@ a secrete `argo-rollouts-notification-secret` in the namespace where the rollout will send notifications using both the controller level configuration aka the configmap located in the same namespaces as the controller as well as the namespace level configuration where the rollout object is at. +To enable you need to add a flag to the controller `--self-service-notification-enabled` + ## Default Trigger templates Currently the following triggers have [built-in templates](https://github.com/argoproj/argo-rollouts/tree/master/manifests/notifications). From 0249301df98b3f44b2a151cd62267622d06f30b5 Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 3 Aug 2023 09:49:07 -0500 Subject: [PATCH 12/14] remove un-needed len check Signed-off-by: zachaller --- utils/record/record.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/utils/record/record.go b/utils/record/record.go index 374ec02747..87d83092f7 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -213,15 +213,14 @@ func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, o logCtx.Errorf("notifications failed to get apis for eventReason %s with error: %s", opts.EventReason, err) e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } - if len(apis) > 0 { - for _, api := range apis { - err := e.sendNotifications(api, object, opts) - if err != nil { - logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) - e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() - } - e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + + for _, api := range apis { + err := e.sendNotifications(api, object, opts) + if err != nil { + logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) + e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } + e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } } From d00adbfd40993e558013e3c337ccde4bbd3510fd Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 3 Aug 2023 11:46:46 -0500 Subject: [PATCH 13/14] fix up typo and cleanup Signed-off-by: zachaller --- controller/controller_test.go | 1 - docs/features/notifications.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/controller/controller_test.go b/controller/controller_test.go index f3d7e350d0..f724ef0712 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -122,7 +122,6 @@ func (f *fixture) newManager(t *testing.T) *Manager { cm.dynamicInformerFactory = dynamicInformerFactory cm.clusterDynamicInformerFactory = dynamicInformerFactory cm.kubeInformerFactory = k8sI - //cm.controllerClusterInformerFactory = k8sI cm.jobInformerFactory = k8sI cm.istioPrimaryDynamicClient = dynamicClient cm.istioDynamicInformerFactory = dynamicInformerFactory diff --git a/docs/features/notifications.md b/docs/features/notifications.md index 5c0617622e..e1c4e47ef6 100644 --- a/docs/features/notifications.md +++ b/docs/features/notifications.md @@ -60,7 +60,7 @@ person who can configure notifications in that namespace generally. However, in for their Rollout resources. For example, the end-user can configure notifications for their Rollouts in the namespace where they have access to and their rollout is running in. To use this feature all you need to do is create the same configmap named `argo-rollouts-notification-configmap` and possibly -a secrete `argo-rollouts-notification-secret` in the namespace where the rollout object lives. When it is configured this way the controller +a secret `argo-rollouts-notification-secret` in the namespace where the rollout object lives. When it is configured this way the controller will send notifications using both the controller level configuration aka the configmap located in the same namespaces as the controller as well as the namespace level configuration where the rollout object is at. From d2e1cd990e5c4e3fc4a86ab21cd418187696a637 Mon Sep 17 00:00:00 2001 From: zachaller Date: Thu, 3 Aug 2023 11:52:19 -0500 Subject: [PATCH 14/14] cleanup wording Signed-off-by: zachaller --- docs/features/notifications.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/notifications.md b/docs/features/notifications.md index e1c4e47ef6..5574ab566f 100644 --- a/docs/features/notifications.md +++ b/docs/features/notifications.md @@ -61,8 +61,8 @@ for their Rollout resources. For example, the end-user can configure notificatio To use this feature all you need to do is create the same configmap named `argo-rollouts-notification-configmap` and possibly a secret `argo-rollouts-notification-secret` in the namespace where the rollout object lives. When it is configured this way the controller -will send notifications using both the controller level configuration aka the configmap located in the same namespaces as the controller -as well as the namespace level configuration where the rollout object is at. +will send notifications using both the controller level configuration (the configmap located in the same namespaces as the controller) as well as +the configmap located in the same namespaces where the rollout object is at. To enable you need to add a flag to the controller `--self-service-notification-enabled`