feat: Argocd notification self service (#16488)

* self service notification

Signed-off-by: May Zhang <may_zhang@intuit.com>

* revert back the changes for redis-ha

Signed-off-by: May Zhang <may_zhang@intuit.com>

* revert back the changes for redis-ha

Signed-off-by: May Zhang <may_zhang@intuit.com>

* update notification engine

Signed-off-by: May Zhang <may_zhang@intuit.com>

* re-trigger build

Signed-off-by: May Zhang <may_zhang@intuit.com>

* self service notification

Signed-off-by: May Zhang <may_zhang@intuit.com>

* revert back the changes for redis-ha

Signed-off-by: May Zhang <may_zhang@intuit.com>

* revert back the changes for redis-ha

Signed-off-by: May Zhang <may_zhang@intuit.com>

* update notification engine

Signed-off-by: May Zhang <may_zhang@intuit.com>

* re-trigger build

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* update notification enginer version

Signed-off-by: May Zhang <may_zhang@intuit.com>

* update notification enginer version

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* add back checkAppNotInAdditionalNamespaces

Signed-off-by: May Zhang <may_zhang@intuit.com>

* add cm and secret to clusterRole

Signed-off-by: May Zhang <may_zhang@intuit.com>

* if applicationNamespaces is not used, then use namespaced appClient

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix merge conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix doc and test based on review

Signed-off-by: May Zhang <may_zhang@intuit.com>

* self service notification

Signed-off-by: May Zhang <may_zhang@intuit.com>

* revert back the changes for redis-ha

Signed-off-by: May Zhang <may_zhang@intuit.com>

* revert back the changes for redis-ha

Signed-off-by: May Zhang <may_zhang@intuit.com>

* update notification engine

Signed-off-by: May Zhang <may_zhang@intuit.com>

* re-trigger build

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* self service notification

Signed-off-by: May Zhang <may_zhang@intuit.com>

* revert back the changes for redis-ha

Signed-off-by: May Zhang <may_zhang@intuit.com>

* revert back the changes for redis-ha

Signed-off-by: May Zhang <may_zhang@intuit.com>

* update notification engine

Signed-off-by: May Zhang <may_zhang@intuit.com>

* re-trigger build

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* update notification enginer version

Signed-off-by: May Zhang <may_zhang@intuit.com>

* update notification enginer version

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fixing go tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>

* add back checkAppNotInAdditionalNamespaces

Signed-off-by: May Zhang <may_zhang@intuit.com>

* add cm and secret to clusterRole

Signed-off-by: May Zhang <may_zhang@intuit.com>

* if applicationNamespaces is not used, then use namespaced appClient

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix doc and test based on review

Signed-off-by: May Zhang <may_zhang@intuit.com>

* disable defining and using secrets within notification templates for self-service

Signed-off-by: May Zhang <may_zhang@intuit.com>

* tweaks

Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com>

* fix docs formatting

Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com>

* more docs and Procfile update for local run convenience

Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com>

---------

Signed-off-by: May Zhang <may_zhang@intuit.com>
Signed-off-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com>
Co-authored-by: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com>
This commit is contained in:
May Zhang
2023-11-30 13:40:33 -08:00
committed by GitHub
parent 27e927be82
commit 19fa5b9418
17 changed files with 220 additions and 55 deletions

View File

@@ -63,19 +63,27 @@ func NewController(
registry *controller.MetricsRegistry,
secretName string,
configMapName string,
selfServiceNotificationEnabled bool,
) *notificationController {
var appClient dynamic.ResourceInterface
namespaceableAppClient := client.Resource(applications)
appClient = namespaceableAppClient
if len(applicationNamespaces) == 0 {
appClient = namespaceableAppClient.Namespace(namespace)
}
appInformer := newInformer(appClient, namespace, applicationNamespaces, appLabelSelector)
appProjInformer := newInformer(newAppProjClient(client, namespace), namespace, []string{namespace}, "")
secretInformer := k8s.NewSecretInformer(k8sClient, namespace, secretName)
configMapInformer := k8s.NewConfigMapInformer(k8sClient, namespace, configMapName)
apiFactory := api.NewFactory(settings.GetFactorySettings(argocdService, secretName, configMapName), namespace, secretInformer, configMapInformer)
var notificationConfigNamespace string
if selfServiceNotificationEnabled {
notificationConfigNamespace = v1.NamespaceAll
} else {
notificationConfigNamespace = namespace
}
secretInformer := k8s.NewSecretInformer(k8sClient, notificationConfigNamespace, secretName)
configMapInformer := k8s.NewConfigMapInformer(k8sClient, notificationConfigNamespace, configMapName)
apiFactory := api.NewFactory(settings.GetFactorySettings(argocdService, secretName, configMapName, selfServiceNotificationEnabled), namespace, secretInformer, configMapInformer)
res := &notificationController{
secretInformer: secretInformer,
@@ -83,19 +91,30 @@ func NewController(
appInformer: appInformer,
appProjInformer: appProjInformer,
apiFactory: apiFactory}
res.ctrl = controller.NewController(namespaceableAppClient, appInformer, apiFactory,
controller.WithSkipProcessing(func(obj v1.Object) (bool, string) {
app, ok := (obj).(*unstructured.Unstructured)
if !ok {
return false, ""
}
if checkAppNotInAdditionalNamespaces(app, namespace, applicationNamespaces) {
return true, "app is not in one of the application-namespaces, nor the notification controller namespace"
}
return !isAppSyncStatusRefreshed(app, log.WithField("app", obj.GetName())), "sync status out of date"
}),
controller.WithMetricsRegistry(registry),
controller.WithAlterDestinations(res.alterDestinations))
skipProcessingOpt := controller.WithSkipProcessing(func(obj v1.Object) (bool, string) {
app, ok := (obj).(*unstructured.Unstructured)
if !ok {
return false, ""
}
if checkAppNotInAdditionalNamespaces(app, namespace, applicationNamespaces) {
return true, "app is not in one of the application-namespaces, nor the notification controller namespace"
}
return !isAppSyncStatusRefreshed(app, log.WithField("app", obj.GetName())), "sync status out of date"
})
metricsRegistryOpt := controller.WithMetricsRegistry(registry)
alterDestinationsOpt := controller.WithAlterDestinations(res.alterDestinations)
if !selfServiceNotificationEnabled {
res.ctrl = controller.NewController(namespaceableAppClient, appInformer, apiFactory,
skipProcessingOpt,
metricsRegistryOpt,
alterDestinationsOpt)
} else {
res.ctrl = controller.NewControllerWithNamespaceSupport(namespaceableAppClient, appInformer, apiFactory,
skipProcessingOpt,
metricsRegistryOpt,
alterDestinationsOpt)
}
return res
}
@@ -118,6 +137,7 @@ func (c *notificationController) alterDestinations(obj v1.Object, destinations s
}
func newInformer(resClient dynamic.ResourceInterface, controllerNamespace string, applicationNamespaces []string, selector string) cache.SharedIndexInformer {
informer := cache.NewSharedIndexInformer(
&cache.ListWatch{
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {

View File

@@ -110,26 +110,30 @@ func TestInit(t *testing.T) {
k8sClient := k8sfake.NewSimpleClientset()
appLabelSelector := "app=test"
nc := NewController(
k8sClient,
dynamicClient,
nil,
"default",
[]string{},
appLabelSelector,
nil,
"my-secret",
"my-configmap",
)
selfServiceNotificationEnabledFlags := []bool{false, true}
for _, selfServiceNotificationEnabled := range selfServiceNotificationEnabledFlags {
nc := NewController(
k8sClient,
dynamicClient,
nil,
"default",
[]string{},
appLabelSelector,
nil,
"my-secret",
"my-configmap",
selfServiceNotificationEnabled,
)
assert.NotNil(t, nc)
assert.NotNil(t, nc)
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err = nc.Init(ctx)
err = nc.Init(ctx)
assert.NoError(t, err)
assert.NoError(t, err)
}
}
func TestInitTimeout(t *testing.T) {
@@ -152,6 +156,7 @@ func TestInitTimeout(t *testing.T) {
nil,
"my-secret",
"my-configmap",
false,
)
assert.NotNil(t, nc)