diff --git a/api/v1alpha1/argocd_conversion.go b/api/v1alpha1/argocd_conversion.go index 4e1f8c08b..3b54e465f 100644 --- a/api/v1alpha1/argocd_conversion.go +++ b/api/v1alpha1/argocd_conversion.go @@ -6,11 +6,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/conversion" -<<<<<<< HEAD - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" -======= "github.com/argoproj-labs/argocd-operator/api/v1beta1" ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d ) var conversionLogger = ctrl.Log.WithName("conversion-webhook") @@ -18,11 +14,7 @@ var conversionLogger = ctrl.Log.WithName("conversion-webhook") // ConvertTo converts this (v1alpha1) ArgoCD to the Hub version (v1beta1). func (src *ArgoCD) ConvertTo(dstRaw conversion.Hub) error { conversionLogger.Info("v1alpha1 to v1beta1 conversion requested.") -<<<<<<< HEAD - dst := dstRaw.(*argoproj.ArgoCD) -======= dst := dstRaw.(*v1beta1.ArgoCD) ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d // ObjectMeta conversion dst.ObjectMeta = src.ObjectMeta @@ -38,11 +30,7 @@ func (src *ArgoCD) ConvertTo(dstRaw conversion.Hub) error { if src.Spec.SSO != nil && !reflect.DeepEqual(src.Spec.SSO, &ArgoCDSSOSpec{}) { if src.Spec.SSO.Image != "" || src.Spec.SSO.Version != "" || src.Spec.SSO.VerifyTLS != nil || src.Spec.SSO.Resources != nil { if sso.Keycloak == nil { -<<<<<<< HEAD - sso.Keycloak = &argoproj.ArgoCDKeycloakSpec{} -======= sso.Keycloak = &v1beta1.ArgoCDKeycloakSpec{} ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d } sso.Keycloak.Image = src.Spec.SSO.Image sso.Keycloak.Version = src.Spec.SSO.Version @@ -54,15 +42,9 @@ func (src *ArgoCD) ConvertTo(dstRaw conversion.Hub) error { // deprecated dex configs set in alpha (.spec.dex), override .spec.sso.dex in beta if src.Spec.Dex != nil && !reflect.DeepEqual(src.Spec.Dex, &ArgoCDDexSpec{}) && (src.Spec.Dex.Config != "" || src.Spec.Dex.OpenShiftOAuth) { if sso == nil { -<<<<<<< HEAD - sso = &argoproj.ArgoCDSSOSpec{} - } - sso.Provider = argoproj.SSOProviderTypeDex -======= sso = &v1beta1.ArgoCDSSOSpec{} } sso.Provider = v1beta1.SSOProviderTypeDex ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d sso.Dex = ConvertAlphaToBetaDex(src.Spec.Dex) } @@ -83,19 +65,6 @@ func (src *ArgoCD) ConvertTo(dstRaw conversion.Hub) error { dst.Spec.HelpChatURL = src.Spec.HelpChatURL dst.Spec.HelpChatText = src.Spec.HelpChatText dst.Spec.Image = src.Spec.Image -<<<<<<< HEAD - dst.Spec.Import = (*argoproj.ArgoCDImportSpec)(src.Spec.Import) - dst.Spec.InitialRepositories = src.Spec.InitialRepositories - dst.Spec.InitialSSHKnownHosts = argoproj.SSHHostsSpec(src.Spec.InitialSSHKnownHosts) - dst.Spec.KustomizeBuildOptions = src.Spec.KustomizeBuildOptions - dst.Spec.KustomizeVersions = ConvertAlphaToBetaKustomizeVersions(src.Spec.KustomizeVersions) - dst.Spec.OIDCConfig = src.Spec.OIDCConfig - dst.Spec.Monitoring = argoproj.ArgoCDMonitoringSpec(src.Spec.Monitoring) - dst.Spec.NodePlacement = (*argoproj.ArgoCDNodePlacementSpec)(src.Spec.NodePlacement) - dst.Spec.Notifications = argoproj.ArgoCDNotifications(src.Spec.Notifications) - dst.Spec.Prometheus = *ConvertAlphaToBetaPrometheus(&src.Spec.Prometheus) - dst.Spec.RBAC = argoproj.ArgoCDRBACSpec(src.Spec.RBAC) -======= dst.Spec.Import = (*v1beta1.ArgoCDImportSpec)(src.Spec.Import) dst.Spec.InitialRepositories = src.Spec.InitialRepositories dst.Spec.InitialSSHKnownHosts = v1beta1.SSHHostsSpec(src.Spec.InitialSSHKnownHosts) @@ -107,7 +76,6 @@ func (src *ArgoCD) ConvertTo(dstRaw conversion.Hub) error { dst.Spec.Notifications = v1beta1.ArgoCDNotifications(src.Spec.Notifications) dst.Spec.Prometheus = *ConvertAlphaToBetaPrometheus(&src.Spec.Prometheus) dst.Spec.RBAC = v1beta1.ArgoCDRBACSpec(src.Spec.RBAC) ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d dst.Spec.Redis = *ConvertAlphaToBetaRedis(&src.Spec.Redis) dst.Spec.Repo = *ConvertAlphaToBetaRepo(&src.Spec.Repo) dst.Spec.RepositoryCredentials = src.Spec.RepositoryCredentials @@ -123,17 +91,10 @@ func (src *ArgoCD) ConvertTo(dstRaw conversion.Hub) error { dst.Spec.TLS = *ConvertAlphaToBetaTLS(&src.Spec.TLS) dst.Spec.UsersAnonymousEnabled = src.Spec.UsersAnonymousEnabled dst.Spec.Version = src.Spec.Version -<<<<<<< HEAD - dst.Spec.Banner = (*argoproj.Banner)(src.Spec.Banner) - - // Status conversion - dst.Status = argoproj.ArgoCDStatus(src.Status) -======= dst.Spec.Banner = (*v1beta1.Banner)(src.Spec.Banner) // Status conversion dst.Status = v1beta1.ArgoCDStatus(src.Status) ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d return nil } @@ -142,11 +103,7 @@ func (src *ArgoCD) ConvertTo(dstRaw conversion.Hub) error { func (dst *ArgoCD) ConvertFrom(srcRaw conversion.Hub) error { conversionLogger.Info("v1beta1 to v1alpha1 conversion requested.") -<<<<<<< HEAD - src := srcRaw.(*argoproj.ArgoCD) -======= src := srcRaw.(*v1beta1.ArgoCD) ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d // ObjectMeta conversion dst.ObjectMeta = src.ObjectMeta @@ -210,46 +167,27 @@ func (dst *ArgoCD) ConvertFrom(srcRaw conversion.Hub) error { } // Conversion funcs for v1alpha1 to v1beta1. -<<<<<<< HEAD -func ConvertAlphaToBetaController(src *ArgoCDApplicationControllerSpec) *argoproj.ArgoCDApplicationControllerSpec { - var dst *argoproj.ArgoCDApplicationControllerSpec - if src != nil { - dst = &argoproj.ArgoCDApplicationControllerSpec{ - Processors: argoproj.ArgoCDApplicationControllerProcessorsSpec(src.Processors), -======= func ConvertAlphaToBetaController(src *ArgoCDApplicationControllerSpec) *v1beta1.ArgoCDApplicationControllerSpec { var dst *v1beta1.ArgoCDApplicationControllerSpec if src != nil { dst = &v1beta1.ArgoCDApplicationControllerSpec{ Processors: v1beta1.ArgoCDApplicationControllerProcessorsSpec(src.Processors), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d LogLevel: src.LogLevel, LogFormat: src.LogFormat, Resources: src.Resources, ParallelismLimit: src.ParallelismLimit, AppSync: src.AppSync, -<<<<<<< HEAD - Sharding: argoproj.ArgoCDApplicationControllerShardSpec(src.Sharding), -======= Sharding: v1beta1.ArgoCDApplicationControllerShardSpec(src.Sharding), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Env: src.Env, } } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaRedis(src *ArgoCDRedisSpec) *argoproj.ArgoCDRedisSpec { - var dst *argoproj.ArgoCDRedisSpec - if src != nil { - dst = &argoproj.ArgoCDRedisSpec{ -======= func ConvertAlphaToBetaRedis(src *ArgoCDRedisSpec) *v1beta1.ArgoCDRedisSpec { var dst *v1beta1.ArgoCDRedisSpec if src != nil { dst = &v1beta1.ArgoCDRedisSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d AutoTLS: src.AutoTLS, DisableTLSVerification: src.DisableTLSVerification, Image: src.Image, @@ -260,17 +198,10 @@ func ConvertAlphaToBetaRedis(src *ArgoCDRedisSpec) *v1beta1.ArgoCDRedisSpec { return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaRepo(src *ArgoCDRepoSpec) *argoproj.ArgoCDRepoSpec { - var dst *argoproj.ArgoCDRepoSpec - if src != nil { - dst = &argoproj.ArgoCDRepoSpec{ -======= func ConvertAlphaToBetaRepo(src *ArgoCDRepoSpec) *v1beta1.ArgoCDRepoSpec { var dst *v1beta1.ArgoCDRepoSpec if src != nil { dst = &v1beta1.ArgoCDRepoSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d AutoTLS: src.AutoTLS, Env: src.Env, ExecTimeout: src.ExecTimeout, @@ -293,15 +224,6 @@ func ConvertAlphaToBetaRepo(src *ArgoCDRepoSpec) *v1beta1.ArgoCDRepoSpec { return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaWebhookServer(src *WebhookServerSpec) *argoproj.WebhookServerSpec { - var dst *argoproj.WebhookServerSpec - if src != nil { - dst = &argoproj.WebhookServerSpec{ - Host: src.Host, - Ingress: argoproj.ArgoCDIngressSpec(src.Ingress), - Route: argoproj.ArgoCDRouteSpec(src.Route), -======= func ConvertAlphaToBetaWebhookServer(src *WebhookServerSpec) *v1beta1.WebhookServerSpec { var dst *v1beta1.WebhookServerSpec if src != nil { @@ -309,23 +231,15 @@ func ConvertAlphaToBetaWebhookServer(src *WebhookServerSpec) *v1beta1.WebhookSer Host: src.Host, Ingress: v1beta1.ArgoCDIngressSpec(src.Ingress), Route: v1beta1.ArgoCDRouteSpec(src.Route), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d } } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaApplicationSet(src *ArgoCDApplicationSet) *argoproj.ArgoCDApplicationSet { - var dst *argoproj.ArgoCDApplicationSet - if src != nil { - dst = &argoproj.ArgoCDApplicationSet{ -======= func ConvertAlphaToBetaApplicationSet(src *ArgoCDApplicationSet) *v1beta1.ArgoCDApplicationSet { var dst *v1beta1.ArgoCDApplicationSet if src != nil { dst = &v1beta1.ArgoCDApplicationSet{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Env: src.Env, ExtraCommandArgs: src.ExtraCommandArgs, Image: src.Image, @@ -338,16 +252,6 @@ func ConvertAlphaToBetaApplicationSet(src *ArgoCDApplicationSet) *v1beta1.ArgoCD return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaGrafana(src *ArgoCDGrafanaSpec) *argoproj.ArgoCDGrafanaSpec { - var dst *argoproj.ArgoCDGrafanaSpec - if src != nil { - dst = &argoproj.ArgoCDGrafanaSpec{ - Enabled: src.Enabled, - Host: src.Host, - Image: src.Image, - Ingress: argoproj.ArgoCDIngressSpec(src.Ingress), -======= func ConvertAlphaToBetaGrafana(src *ArgoCDGrafanaSpec) *v1beta1.ArgoCDGrafanaSpec { var dst *v1beta1.ArgoCDGrafanaSpec if src != nil { @@ -356,22 +260,11 @@ func ConvertAlphaToBetaGrafana(src *ArgoCDGrafanaSpec) *v1beta1.ArgoCDGrafanaSpe Host: src.Host, Image: src.Image, Ingress: v1beta1.ArgoCDIngressSpec(src.Ingress), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d } } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaPrometheus(src *ArgoCDPrometheusSpec) *argoproj.ArgoCDPrometheusSpec { - var dst *argoproj.ArgoCDPrometheusSpec - if src != nil { - dst = &argoproj.ArgoCDPrometheusSpec{ - Enabled: src.Enabled, - Host: src.Host, - Ingress: argoproj.ArgoCDIngressSpec(src.Ingress), - Route: argoproj.ArgoCDRouteSpec(src.Route), -======= func ConvertAlphaToBetaPrometheus(src *ArgoCDPrometheusSpec) *v1beta1.ArgoCDPrometheusSpec { var dst *v1beta1.ArgoCDPrometheusSpec if src != nil { @@ -380,22 +273,12 @@ func ConvertAlphaToBetaPrometheus(src *ArgoCDPrometheusSpec) *v1beta1.ArgoCDProm Host: src.Host, Ingress: v1beta1.ArgoCDIngressSpec(src.Ingress), Route: v1beta1.ArgoCDRouteSpec(src.Route), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Size: src.Size, } } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaSSO(src *ArgoCDSSOSpec) *argoproj.ArgoCDSSOSpec { - var dst *argoproj.ArgoCDSSOSpec - if src != nil { - dst = &argoproj.ArgoCDSSOSpec{ - Provider: argoproj.SSOProviderType(src.Provider), - Dex: ConvertAlphaToBetaDex(src.Dex), - Keycloak: (*argoproj.ArgoCDKeycloakSpec)(src.Keycloak), -======= func ConvertAlphaToBetaSSO(src *ArgoCDSSOSpec) *v1beta1.ArgoCDSSOSpec { var dst *v1beta1.ArgoCDSSOSpec if src != nil { @@ -403,23 +286,15 @@ func ConvertAlphaToBetaSSO(src *ArgoCDSSOSpec) *v1beta1.ArgoCDSSOSpec { Provider: v1beta1.SSOProviderType(src.Provider), Dex: ConvertAlphaToBetaDex(src.Dex), Keycloak: (*v1beta1.ArgoCDKeycloakSpec)(src.Keycloak), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d } } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaDex(src *ArgoCDDexSpec) *argoproj.ArgoCDDexSpec { - var dst *argoproj.ArgoCDDexSpec - if src != nil { - dst = &argoproj.ArgoCDDexSpec{ -======= func ConvertAlphaToBetaDex(src *ArgoCDDexSpec) *v1beta1.ArgoCDDexSpec { var dst *v1beta1.ArgoCDDexSpec if src != nil { dst = &v1beta1.ArgoCDDexSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Config: src.Config, Groups: src.Groups, Image: src.Image, @@ -432,17 +307,10 @@ func ConvertAlphaToBetaDex(src *ArgoCDDexSpec) *v1beta1.ArgoCDDexSpec { return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaHA(src *ArgoCDHASpec) *argoproj.ArgoCDHASpec { - var dst *argoproj.ArgoCDHASpec - if src != nil { - dst = &argoproj.ArgoCDHASpec{ -======= func ConvertAlphaToBetaHA(src *ArgoCDHASpec) *v1beta1.ArgoCDHASpec { var dst *v1beta1.ArgoCDHASpec if src != nil { dst = &v1beta1.ArgoCDHASpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Enabled: src.Enabled, RedisProxyImage: src.RedisProxyImage, RedisProxyVersion: src.RedisProxyVersion, @@ -452,35 +320,17 @@ func ConvertAlphaToBetaHA(src *ArgoCDHASpec) *v1beta1.ArgoCDHASpec { return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaTLS(src *ArgoCDTLSSpec) *argoproj.ArgoCDTLSSpec { - var dst *argoproj.ArgoCDTLSSpec - if src != nil { - dst = &argoproj.ArgoCDTLSSpec{ - CA: argoproj.ArgoCDCASpec(src.CA), -======= func ConvertAlphaToBetaTLS(src *ArgoCDTLSSpec) *v1beta1.ArgoCDTLSSpec { var dst *v1beta1.ArgoCDTLSSpec if src != nil { dst = &v1beta1.ArgoCDTLSSpec{ CA: v1beta1.ArgoCDCASpec(src.CA), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d InitialCerts: src.InitialCerts, } } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaServer(src *ArgoCDServerSpec) *argoproj.ArgoCDServerSpec { - var dst *argoproj.ArgoCDServerSpec - if src != nil { - dst = &argoproj.ArgoCDServerSpec{ - Autoscale: argoproj.ArgoCDServerAutoscaleSpec(src.Autoscale), - GRPC: *ConvertAlphaToBetaGRPC(&src.GRPC), - Host: src.Host, - Ingress: argoproj.ArgoCDIngressSpec(src.Ingress), -======= func ConvertAlphaToBetaServer(src *ArgoCDServerSpec) *v1beta1.ArgoCDServerSpec { var dst *v1beta1.ArgoCDServerSpec if src != nil { @@ -489,19 +339,13 @@ func ConvertAlphaToBetaServer(src *ArgoCDServerSpec) *v1beta1.ArgoCDServerSpec { GRPC: *ConvertAlphaToBetaGRPC(&src.GRPC), Host: src.Host, Ingress: v1beta1.ArgoCDIngressSpec(src.Ingress), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Insecure: src.Insecure, LogLevel: src.LogLevel, LogFormat: src.LogFormat, Replicas: src.Replicas, Resources: src.Resources, -<<<<<<< HEAD - Route: argoproj.ArgoCDRouteSpec(src.Route), - Service: argoproj.ArgoCDServerServiceSpec(src.Service), -======= Route: v1beta1.ArgoCDRouteSpec(src.Route), Service: v1beta1.ArgoCDServerServiceSpec(src.Service), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Env: src.Env, ExtraCommandArgs: src.ExtraCommandArgs, } @@ -509,37 +353,21 @@ func ConvertAlphaToBetaServer(src *ArgoCDServerSpec) *v1beta1.ArgoCDServerSpec { return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaGRPC(src *ArgoCDServerGRPCSpec) *argoproj.ArgoCDServerGRPCSpec { - var dst *argoproj.ArgoCDServerGRPCSpec - if src != nil { - dst = &argoproj.ArgoCDServerGRPCSpec{ - Host: src.Host, - Ingress: argoproj.ArgoCDIngressSpec(src.Ingress), -======= func ConvertAlphaToBetaGRPC(src *ArgoCDServerGRPCSpec) *v1beta1.ArgoCDServerGRPCSpec { var dst *v1beta1.ArgoCDServerGRPCSpec if src != nil { dst = &v1beta1.ArgoCDServerGRPCSpec{ Host: src.Host, Ingress: v1beta1.ArgoCDIngressSpec(src.Ingress), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d } } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaKustomizeVersions(src []KustomizeVersionSpec) []argoproj.KustomizeVersionSpec { - var dst []argoproj.KustomizeVersionSpec - for _, s := range src { - dst = append(dst, argoproj.KustomizeVersionSpec{ -======= func ConvertAlphaToBetaKustomizeVersions(src []KustomizeVersionSpec) []v1beta1.KustomizeVersionSpec { var dst []v1beta1.KustomizeVersionSpec for _, s := range src { dst = append(dst, v1beta1.KustomizeVersionSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Version: s.Version, Path: s.Path, }, @@ -548,34 +376,17 @@ func ConvertAlphaToBetaKustomizeVersions(src []KustomizeVersionSpec) []v1beta1.K return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaResourceIgnoreDifferences(src *ResourceIgnoreDifference) *argoproj.ResourceIgnoreDifference { - var dst *argoproj.ResourceIgnoreDifference - if src != nil { - dst = &argoproj.ResourceIgnoreDifference{ - All: (*argoproj.IgnoreDifferenceCustomization)(src.All), -======= func ConvertAlphaToBetaResourceIgnoreDifferences(src *ResourceIgnoreDifference) *v1beta1.ResourceIgnoreDifference { var dst *v1beta1.ResourceIgnoreDifference if src != nil { dst = &v1beta1.ResourceIgnoreDifference{ All: (*v1beta1.IgnoreDifferenceCustomization)(src.All), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d ResourceIdentifiers: ConvertAlphaToBetaResourceIdentifiers(src.ResourceIdentifiers), } } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaResourceIdentifiers(src []ResourceIdentifiers) []argoproj.ResourceIdentifiers { - var dst []argoproj.ResourceIdentifiers - for _, s := range src { - dst = append(dst, argoproj.ResourceIdentifiers{ - Group: s.Group, - Kind: s.Kind, - Customization: argoproj.IgnoreDifferenceCustomization(s.Customization), -======= func ConvertAlphaToBetaResourceIdentifiers(src []ResourceIdentifiers) []v1beta1.ResourceIdentifiers { var dst []v1beta1.ResourceIdentifiers for _, s := range src { @@ -583,24 +394,16 @@ func ConvertAlphaToBetaResourceIdentifiers(src []ResourceIdentifiers) []v1beta1. Group: s.Group, Kind: s.Kind, Customization: v1beta1.IgnoreDifferenceCustomization(s.Customization), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d }, ) } return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaResourceActions(src []ResourceAction) []argoproj.ResourceAction { - var dst []argoproj.ResourceAction - for _, s := range src { - dst = append(dst, argoproj.ResourceAction{ -======= func ConvertAlphaToBetaResourceActions(src []ResourceAction) []v1beta1.ResourceAction { var dst []v1beta1.ResourceAction for _, s := range src { dst = append(dst, v1beta1.ResourceAction{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Group: s.Group, Kind: s.Kind, Action: s.Action, @@ -610,17 +413,10 @@ func ConvertAlphaToBetaResourceActions(src []ResourceAction) []v1beta1.ResourceA return dst } -<<<<<<< HEAD -func ConvertAlphaToBetaResourceHealthChecks(src []ResourceHealthCheck) []argoproj.ResourceHealthCheck { - var dst []argoproj.ResourceHealthCheck - for _, s := range src { - dst = append(dst, argoproj.ResourceHealthCheck{ -======= func ConvertAlphaToBetaResourceHealthChecks(src []ResourceHealthCheck) []v1beta1.ResourceHealthCheck { var dst []v1beta1.ResourceHealthCheck for _, s := range src { dst = append(dst, v1beta1.ResourceHealthCheck{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Group: s.Group, Kind: s.Kind, Check: s.Check, @@ -631,11 +427,7 @@ func ConvertAlphaToBetaResourceHealthChecks(src []ResourceHealthCheck) []v1beta1 } // Conversion funcs for v1beta1 to v1alpha1. -<<<<<<< HEAD -func ConvertBetaToAlphaController(src *argoproj.ArgoCDApplicationControllerSpec) *ArgoCDApplicationControllerSpec { -======= func ConvertBetaToAlphaController(src *v1beta1.ArgoCDApplicationControllerSpec) *ArgoCDApplicationControllerSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDApplicationControllerSpec if src != nil { dst = &ArgoCDApplicationControllerSpec{ @@ -652,11 +444,7 @@ func ConvertBetaToAlphaController(src *v1beta1.ArgoCDApplicationControllerSpec) return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaWebhookServer(src *argoproj.WebhookServerSpec) *WebhookServerSpec { -======= func ConvertBetaToAlphaWebhookServer(src *v1beta1.WebhookServerSpec) *WebhookServerSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *WebhookServerSpec if src != nil { dst = &WebhookServerSpec{ @@ -668,11 +456,7 @@ func ConvertBetaToAlphaWebhookServer(src *v1beta1.WebhookServerSpec) *WebhookSer return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaApplicationSet(src *argoproj.ArgoCDApplicationSet) *ArgoCDApplicationSet { -======= func ConvertBetaToAlphaApplicationSet(src *v1beta1.ArgoCDApplicationSet) *ArgoCDApplicationSet { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDApplicationSet if src != nil { dst = &ArgoCDApplicationSet{ @@ -688,11 +472,7 @@ func ConvertBetaToAlphaApplicationSet(src *v1beta1.ArgoCDApplicationSet) *ArgoCD return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaGrafana(src *argoproj.ArgoCDGrafanaSpec) *ArgoCDGrafanaSpec { -======= func ConvertBetaToAlphaGrafana(src *v1beta1.ArgoCDGrafanaSpec) *ArgoCDGrafanaSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDGrafanaSpec if src != nil { dst = &ArgoCDGrafanaSpec{ @@ -705,11 +485,7 @@ func ConvertBetaToAlphaGrafana(src *v1beta1.ArgoCDGrafanaSpec) *ArgoCDGrafanaSpe return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaPrometheus(src *argoproj.ArgoCDPrometheusSpec) *ArgoCDPrometheusSpec { -======= func ConvertBetaToAlphaPrometheus(src *v1beta1.ArgoCDPrometheusSpec) *ArgoCDPrometheusSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDPrometheusSpec if src != nil { dst = &ArgoCDPrometheusSpec{ @@ -723,11 +499,7 @@ func ConvertBetaToAlphaPrometheus(src *v1beta1.ArgoCDPrometheusSpec) *ArgoCDProm return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaSSO(src *argoproj.ArgoCDSSOSpec) *ArgoCDSSOSpec { -======= func ConvertBetaToAlphaSSO(src *v1beta1.ArgoCDSSOSpec) *ArgoCDSSOSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDSSOSpec if src != nil { dst = &ArgoCDSSOSpec{ @@ -739,11 +511,7 @@ func ConvertBetaToAlphaSSO(src *v1beta1.ArgoCDSSOSpec) *ArgoCDSSOSpec { return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaDex(src *argoproj.ArgoCDDexSpec) *ArgoCDDexSpec { -======= func ConvertBetaToAlphaDex(src *v1beta1.ArgoCDDexSpec) *ArgoCDDexSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDDexSpec if src != nil { dst = &ArgoCDDexSpec{ @@ -758,11 +526,7 @@ func ConvertBetaToAlphaDex(src *v1beta1.ArgoCDDexSpec) *ArgoCDDexSpec { return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaHA(src *argoproj.ArgoCDHASpec) *ArgoCDHASpec { -======= func ConvertBetaToAlphaHA(src *v1beta1.ArgoCDHASpec) *ArgoCDHASpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDHASpec if src != nil { dst = &ArgoCDHASpec{ @@ -775,11 +539,7 @@ func ConvertBetaToAlphaHA(src *v1beta1.ArgoCDHASpec) *ArgoCDHASpec { return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaTLS(src *argoproj.ArgoCDTLSSpec) *ArgoCDTLSSpec { -======= func ConvertBetaToAlphaTLS(src *v1beta1.ArgoCDTLSSpec) *ArgoCDTLSSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDTLSSpec if src != nil { dst = &ArgoCDTLSSpec{ @@ -790,11 +550,7 @@ func ConvertBetaToAlphaTLS(src *v1beta1.ArgoCDTLSSpec) *ArgoCDTLSSpec { return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaServer(src *argoproj.ArgoCDServerSpec) *ArgoCDServerSpec { -======= func ConvertBetaToAlphaServer(src *v1beta1.ArgoCDServerSpec) *ArgoCDServerSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDServerSpec if src != nil { dst = &ArgoCDServerSpec{ @@ -816,11 +572,7 @@ func ConvertBetaToAlphaServer(src *v1beta1.ArgoCDServerSpec) *ArgoCDServerSpec { return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaGRPC(src *argoproj.ArgoCDServerGRPCSpec) *ArgoCDServerGRPCSpec { -======= func ConvertBetaToAlphaGRPC(src *v1beta1.ArgoCDServerGRPCSpec) *ArgoCDServerGRPCSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDServerGRPCSpec if src != nil { dst = &ArgoCDServerGRPCSpec{ @@ -831,11 +583,7 @@ func ConvertBetaToAlphaGRPC(src *v1beta1.ArgoCDServerGRPCSpec) *ArgoCDServerGRPC return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaKustomizeVersions(src []argoproj.KustomizeVersionSpec) []KustomizeVersionSpec { -======= func ConvertBetaToAlphaKustomizeVersions(src []v1beta1.KustomizeVersionSpec) []KustomizeVersionSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst []KustomizeVersionSpec for _, s := range src { dst = append(dst, KustomizeVersionSpec{ @@ -847,11 +595,7 @@ func ConvertBetaToAlphaKustomizeVersions(src []v1beta1.KustomizeVersionSpec) []K return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaResourceIgnoreDifferences(src *argoproj.ResourceIgnoreDifference) *ResourceIgnoreDifference { -======= func ConvertBetaToAlphaResourceIgnoreDifferences(src *v1beta1.ResourceIgnoreDifference) *ResourceIgnoreDifference { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ResourceIgnoreDifference if src != nil { dst = &ResourceIgnoreDifference{ @@ -862,11 +606,7 @@ func ConvertBetaToAlphaResourceIgnoreDifferences(src *v1beta1.ResourceIgnoreDiff return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaResourceIdentifiers(src []argoproj.ResourceIdentifiers) []ResourceIdentifiers { -======= func ConvertBetaToAlphaResourceIdentifiers(src []v1beta1.ResourceIdentifiers) []ResourceIdentifiers { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst []ResourceIdentifiers for _, s := range src { dst = append(dst, ResourceIdentifiers{ @@ -879,11 +619,7 @@ func ConvertBetaToAlphaResourceIdentifiers(src []v1beta1.ResourceIdentifiers) [] return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaResourceActions(src []argoproj.ResourceAction) []ResourceAction { -======= func ConvertBetaToAlphaResourceActions(src []v1beta1.ResourceAction) []ResourceAction { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst []ResourceAction for _, s := range src { dst = append(dst, ResourceAction{ @@ -896,11 +632,7 @@ func ConvertBetaToAlphaResourceActions(src []v1beta1.ResourceAction) []ResourceA return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaResourceHealthChecks(src []argoproj.ResourceHealthCheck) []ResourceHealthCheck { -======= func ConvertBetaToAlphaResourceHealthChecks(src []v1beta1.ResourceHealthCheck) []ResourceHealthCheck { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst []ResourceHealthCheck for _, s := range src { dst = append(dst, ResourceHealthCheck{ @@ -913,11 +645,7 @@ func ConvertBetaToAlphaResourceHealthChecks(src []v1beta1.ResourceHealthCheck) [ return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaRedis(src *argoproj.ArgoCDRedisSpec) *ArgoCDRedisSpec { -======= func ConvertBetaToAlphaRedis(src *v1beta1.ArgoCDRedisSpec) *ArgoCDRedisSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDRedisSpec if src != nil { dst = &ArgoCDRedisSpec{ @@ -931,11 +659,7 @@ func ConvertBetaToAlphaRedis(src *v1beta1.ArgoCDRedisSpec) *ArgoCDRedisSpec { return dst } -<<<<<<< HEAD -func ConvertBetaToAlphaRepo(src *argoproj.ArgoCDRepoSpec) *ArgoCDRepoSpec { -======= func ConvertBetaToAlphaRepo(src *v1beta1.ArgoCDRepoSpec) *ArgoCDRepoSpec { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d var dst *ArgoCDRepoSpec if src != nil { dst = &ArgoCDRepoSpec{ diff --git a/api/v1alpha1/argocd_conversion_test.go b/api/v1alpha1/argocd_conversion_test.go index da998954c..08f13d999 100644 --- a/api/v1alpha1/argocd_conversion_test.go +++ b/api/v1alpha1/argocd_conversion_test.go @@ -10,11 +10,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/conversion" -<<<<<<< HEAD - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" -======= v1beta1 "github.com/argoproj-labs/argocd-operator/api/v1beta1" ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d ) type argoCDAlphaOpt func(*ArgoCD) @@ -35,17 +31,10 @@ func makeTestArgoCDAlpha(opts ...argoCDAlphaOpt) *ArgoCD { return a } -<<<<<<< HEAD -type argoCDBetaOpt func(*argoproj.ArgoCD) - -func makeTestArgoCDBeta(opts ...argoCDBetaOpt) *argoproj.ArgoCD { - a := &argoproj.ArgoCD{ -======= type argoCDBetaOpt func(*v1beta1.ArgoCD) func makeTestArgoCDBeta(opts ...argoCDBetaOpt) *v1beta1.ArgoCD { a := &v1beta1.ArgoCD{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d ObjectMeta: metav1.ObjectMeta{ Name: "test-argocd", Namespace: "default", @@ -65,11 +54,7 @@ func TestAlphaToBetaConversion(t *testing.T) { tests := []struct { name string input *ArgoCD -<<<<<<< HEAD - expectedOutput *argoproj.ArgoCD -======= expectedOutput *v1beta1.ArgoCD ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d }{ // dex conversion { @@ -81,17 +66,10 @@ func TestAlphaToBetaConversion(t *testing.T) { Version: "latest", } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Provider: "dex", - Dex: &argoproj.ArgoCDDexSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Provider: "dex", Dex: &v1beta1.ArgoCDDexSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d OpenShiftOAuth: true, Image: "test", Version: "latest", @@ -119,17 +97,10 @@ func TestAlphaToBetaConversion(t *testing.T) { }, } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Provider: argoproj.SSOProviderTypeDex, - Dex: &argoproj.ArgoCDDexSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Provider: v1beta1.SSOProviderTypeDex, Dex: &v1beta1.ArgoCDDexSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d OpenShiftOAuth: true, Resources: &corev1.ResourceRequirements{ Limits: corev1.ResourceList{ @@ -153,17 +124,10 @@ func TestAlphaToBetaConversion(t *testing.T) { }, } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Provider: argoproj.SSOProviderTypeDex, - Dex: &argoproj.ArgoCDDexSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Provider: v1beta1.SSOProviderTypeDex, Dex: &v1beta1.ArgoCDDexSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Config: "test-config", }, } @@ -178,15 +142,9 @@ func TestAlphaToBetaConversion(t *testing.T) { }, } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Dex: &argoproj.ArgoCDDexSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Dex: &v1beta1.ArgoCDDexSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d OpenShiftOAuth: false, }, } @@ -207,15 +165,6 @@ func TestAlphaToBetaConversion(t *testing.T) { }, } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Provider: argoproj.SSOProviderTypeDex, - Dex: &argoproj.ArgoCDDexSpec{ - OpenShiftOAuth: true, - }, - Keycloak: &argoproj.ArgoCDKeycloakSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Provider: v1beta1.SSOProviderTypeDex, @@ -223,7 +172,6 @@ func TestAlphaToBetaConversion(t *testing.T) { OpenShiftOAuth: true, }, Keycloak: &v1beta1.ArgoCDKeycloakSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Image: "keycloak", }, } @@ -244,21 +192,12 @@ func TestAlphaToBetaConversion(t *testing.T) { VerifyTLS: tls, } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - tls := new(bool) - *tls = false - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Provider: argoproj.SSOProviderTypeKeycloak, - Keycloak: &argoproj.ArgoCDKeycloakSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { tls := new(bool) *tls = false cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Provider: v1beta1.SSOProviderTypeKeycloak, Keycloak: &v1beta1.ArgoCDKeycloakSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d RootCA: "__CA__", VerifyTLS: tls, }, @@ -272,15 +211,9 @@ func TestAlphaToBetaConversion(t *testing.T) { Image: "test-image", } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Keycloak: &argoproj.ArgoCDKeycloakSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Keycloak: &v1beta1.ArgoCDKeycloakSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Image: "test-image", }, } @@ -291,11 +224,7 @@ func TestAlphaToBetaConversion(t *testing.T) { { name: "ArgoCD Example - Empty", input: makeTestArgoCDAlpha(func(cr *ArgoCD) {}), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) {}), -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) {}), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d }, { name: "ArgoCD Example - Dex + RBAC", @@ -319,17 +248,10 @@ func TestAlphaToBetaConversion(t *testing.T) { }, } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Provider: argoproj.SSOProviderTypeDex, - Dex: &argoproj.ArgoCDDexSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Provider: v1beta1.SSOProviderTypeDex, Dex: &v1beta1.ArgoCDDexSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d OpenShiftOAuth: true, }, } @@ -337,23 +259,14 @@ func TestAlphaToBetaConversion(t *testing.T) { defaultPolicy := "role:readonly" policy := "g, system:cluster-admins, role:admin" scope := "[groups]" -<<<<<<< HEAD - cr.Spec.RBAC = argoproj.ArgoCDRBACSpec{ -======= cr.Spec.RBAC = v1beta1.ArgoCDRBACSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d DefaultPolicy: &defaultPolicy, Policy: &policy, Scopes: &scope, } -<<<<<<< HEAD - cr.Spec.Server = argoproj.ArgoCDServerSpec{ - Route: argoproj.ArgoCDRouteSpec{ -======= cr.Spec.Server = v1beta1.ArgoCDServerSpec{ Route: v1beta1.ArgoCDRouteSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Enabled: true, }, } @@ -408,15 +321,9 @@ func TestAlphaToBetaConversion(t *testing.T) { }, } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.ResourceIgnoreDifferences = &argoproj.ResourceIgnoreDifference{ - All: &argoproj.IgnoreDifferenceCustomization{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.ResourceIgnoreDifferences = &v1beta1.ResourceIgnoreDifference{ All: &v1beta1.IgnoreDifferenceCustomization{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d JsonPointers: []string{ "/spec/replicas", }, @@ -424,19 +331,11 @@ func TestAlphaToBetaConversion(t *testing.T) { "kube-controller-manager", }, }, -<<<<<<< HEAD - ResourceIdentifiers: []argoproj.ResourceIdentifiers{ - { - Group: "admissionregistration.k8s.io", - Kind: "MutatingWebhookConfiguration", - Customization: argoproj.IgnoreDifferenceCustomization{ -======= ResourceIdentifiers: []v1beta1.ResourceIdentifiers{ { Group: "admissionregistration.k8s.io", Kind: "MutatingWebhookConfiguration", Customization: v1beta1.IgnoreDifferenceCustomization{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d JqPathExpressions: []string{ "'.webhooks[]?.clientConfig.caBundle'", }, @@ -445,11 +344,7 @@ func TestAlphaToBetaConversion(t *testing.T) { { Group: "apps", Kind: "Deployment", -<<<<<<< HEAD - Customization: argoproj.IgnoreDifferenceCustomization{ -======= Customization: v1beta1.IgnoreDifferenceCustomization{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d ManagedFieldsManagers: []string{ "kube-controller-manager", }, @@ -460,21 +355,13 @@ func TestAlphaToBetaConversion(t *testing.T) { }, }, } -<<<<<<< HEAD - cr.Spec.ResourceHealthChecks = []argoproj.ResourceHealthCheck{ -======= cr.Spec.ResourceHealthChecks = []v1beta1.ResourceHealthCheck{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d { Group: "certmanager.k8s.io", Kind: "Certificate", }, } -<<<<<<< HEAD - cr.Spec.ResourceActions = []argoproj.ResourceAction{ -======= cr.Spec.ResourceActions = []v1beta1.ResourceAction{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d { Group: "apps", Kind: "Deployment", @@ -490,11 +377,7 @@ func TestAlphaToBetaConversion(t *testing.T) { "ping": "pong", } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d cr.Spec.Image = "test-image" cr.Spec.ExtraConfig = map[string]string{ "ping": "pong", @@ -528,23 +411,6 @@ func TestAlphaToBetaConversion(t *testing.T) { Insecure: true, } }), -<<<<<<< HEAD - expectedOutput: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.Server.Autoscale = argoproj.ArgoCDServerAutoscaleSpec{ - Enabled: true, - } - cr.Spec.Import = &argoproj.ArgoCDImportSpec{ - Name: "test-name", - } - cr.Spec.Server = argoproj.ArgoCDServerSpec{ - Host: "test-host.argocd.org", - GRPC: argoproj.ArgoCDServerGRPCSpec{ - Ingress: argoproj.ArgoCDIngressSpec{ - Enabled: false, - }, - }, - Ingress: argoproj.ArgoCDIngressSpec{ -======= expectedOutput: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.Server.Autoscale = v1beta1.ArgoCDServerAutoscaleSpec{ Enabled: true, @@ -560,7 +426,6 @@ func TestAlphaToBetaConversion(t *testing.T) { }, }, Ingress: v1beta1.ArgoCDIngressSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Enabled: true, TLS: []v1.IngressTLS{ {Hosts: []string{ @@ -578,21 +443,13 @@ func TestAlphaToBetaConversion(t *testing.T) { t.Run(test.name, func(t *testing.T) { // Set v1beta1 object in Hub, converted values will be set in this object. -<<<<<<< HEAD - var hub conversion.Hub = &argoproj.ArgoCD{} -======= var hub conversion.Hub = &v1beta1.ArgoCD{} ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d // Call ConvertTo function to convert v1alpha1 version to v1beta1 test.input.ConvertTo(hub) // Fetch the converted object -<<<<<<< HEAD - result := hub.(*argoproj.ArgoCD) -======= result := hub.(*v1beta1.ArgoCD) ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d // Compare converted object with expected. assert.Equal(t, test.expectedOutput, result) @@ -605,29 +462,17 @@ func TestAlphaToBetaConversion(t *testing.T) { func TestBetaToAlphaConversion(t *testing.T) { tests := []struct { name string -<<<<<<< HEAD - input *argoproj.ArgoCD -======= input *v1beta1.ArgoCD ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d expectedOutput *ArgoCD }{ { name: "ArgoCD Example - Empty", -<<<<<<< HEAD - input: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) {}), -======= input: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) {}), ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d expectedOutput: makeTestArgoCDAlpha(func(cr *ArgoCD) {}), }, { name: "ArgoCD Example - Image + ExtraConfig", -<<<<<<< HEAD - input: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { -======= input: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d cr.Spec.Image = "test-image" cr.Spec.ExtraConfig = map[string]string{ "ping": "pong", @@ -642,17 +487,10 @@ func TestBetaToAlphaConversion(t *testing.T) { }, { name: "ArgoCD Example - Dex + RBAC", -<<<<<<< HEAD - input: makeTestArgoCDBeta(func(cr *argoproj.ArgoCD) { - cr.Spec.SSO = &argoproj.ArgoCDSSOSpec{ - Provider: argoproj.SSOProviderTypeDex, - Dex: &argoproj.ArgoCDDexSpec{ -======= input: makeTestArgoCDBeta(func(cr *v1beta1.ArgoCD) { cr.Spec.SSO = &v1beta1.ArgoCDSSOSpec{ Provider: v1beta1.SSOProviderTypeDex, Dex: &v1beta1.ArgoCDDexSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d OpenShiftOAuth: true, }, } @@ -660,23 +498,14 @@ func TestBetaToAlphaConversion(t *testing.T) { defaultPolicy := "role:readonly" policy := "g, system:cluster-admins, role:admin" scope := "[groups]" -<<<<<<< HEAD - cr.Spec.RBAC = argoproj.ArgoCDRBACSpec{ -======= cr.Spec.RBAC = v1beta1.ArgoCDRBACSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d DefaultPolicy: &defaultPolicy, Policy: &policy, Scopes: &scope, } -<<<<<<< HEAD - cr.Spec.Server = argoproj.ArgoCDServerSpec{ - Route: argoproj.ArgoCDRouteSpec{ -======= cr.Spec.Server = v1beta1.ArgoCDServerSpec{ Route: v1beta1.ArgoCDRouteSpec{ ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d Enabled: true, }, } diff --git a/api/v1alpha1/argocd_types.go b/api/v1alpha1/argocd_types.go index ffc8d2dce..ee5273d31 100644 --- a/api/v1alpha1/argocd_types.go +++ b/api/v1alpha1/argocd_types.go @@ -37,11 +37,7 @@ func init() { // Important: Run "make" to regenerate code after modifying this file // +kubebuilder:deprecatedversion:warning="ArgoCD v1alpha1 version is deprecated and will be converted to v1beta1 automatically. Moving forward, please use v1beta1 as the ArgoCD API version." -<<<<<<< HEAD // +kubebuilder:object:root=true -======= -//+kubebuilder:object:root=true ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d // ArgoCD is the Schema for the argocds API // +k8s:openapi-gen=true diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 51d735b0a..cbd6307b8 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -24,7 +24,7 @@ package v1alpha1 import ( routev1 "github.com/openshift/api/route/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" - v1 "k8s.io/api/core/v1" + "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go index bce2b256d..cdb36778e 100644 --- a/api/v1beta1/zz_generated.deepcopy.go +++ b/api/v1beta1/zz_generated.deepcopy.go @@ -24,11 +24,7 @@ package v1beta1 import ( routev1 "github.com/openshift/api/route/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" -<<<<<<< HEAD - v1 "k8s.io/api/core/v1" -======= "k8s.io/api/core/v1" ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d networkingv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" diff --git a/common/defaults.go b/common/defaults.go index 19204c5d9..1c6256729 100644 --- a/common/defaults.go +++ b/common/defaults.go @@ -120,8 +120,6 @@ gitlab.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsj2bNKTBSpIYDEGk9KxsGh3mySTRgM ssh.dev.azure.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H vs-ssh.visualstudio.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H ` - // OperatorMetricsPort is the port that is used to expose default controller-runtime metrics for the operator pod. - OperatorMetricsPort = 8080 ) // DefaultLabels returns the default set of labels for controllers. diff --git a/common/keys.go b/common/keys.go index c44c64a66..956ece08d 100644 --- a/common/keys.go +++ b/common/keys.go @@ -129,9 +129,6 @@ const ( // ArgoCDDexSecretKey is used to reference Dex secret from Argo CD secret into Argo CD configmap ArgoCDDexSecretKey = "oidc.dex.clientSecret" - - // Label Selector is an env variable for ArgoCD instance reconcilliation. - ArgoCDLabelSelectorKey = "ARGOCD_LABEL_SELECTOR" ) // openshift.io keys diff --git a/controllers/argocd/applicationset.go b/controllers/argocd/applicationset.go deleted file mode 100644 index 3eb850ea7..000000000 --- a/controllers/argocd/applicationset.go +++ /dev/null @@ -1,592 +0,0 @@ -// Copyright 2021 ArgoCD Operator Developers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package argocd - -import ( - "context" - "fmt" - "os" - "reflect" - - corev1 "k8s.io/api/core/v1" - v1 "k8s.io/api/rbac/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" - "github.com/argoproj-labs/argocd-operator/common" - "github.com/argoproj-labs/argocd-operator/controllers/argoutil" -) - -const ( - ApplicationSetGitlabSCMTlsCertPath = "/app/tls/scm/cert" -) - -// getArgoApplicationSetCommand will return the command for the ArgoCD ApplicationSet component. -func getArgoApplicationSetCommand(cr *argoproj.ArgoCD) []string { - cmd := make([]string, 0) - - cmd = append(cmd, "entrypoint.sh") - cmd = append(cmd, "argocd-applicationset-controller") - - if cr.Spec.Repo.IsEnabled() { - cmd = append(cmd, "--argocd-repo-server", getRepoServerAddress(cr)) - } else { - log.Info("Repo Server is disabled. This would affect the functioning of ApplicationSet Controller.") - } - - cmd = append(cmd, "--loglevel") - cmd = append(cmd, getLogLevel(cr.Spec.ApplicationSet.LogLevel)) - - if cr.Spec.ApplicationSet.SCMRootCAConfigMap != "" { - cmd = append(cmd, "--scm-root-ca-path") - cmd = append(cmd, ApplicationSetGitlabSCMTlsCertPath) - } - - // ApplicationSet command arguments provided by the user - extraArgs := cr.Spec.ApplicationSet.ExtraCommandArgs - err := isMergable(extraArgs, cmd) - if err != nil { - return cmd - } - - cmd = append(cmd, extraArgs...) - - return cmd -} - -func (r *ReconcileArgoCD) reconcileApplicationSetController(cr *argoproj.ArgoCD) error { - - log.Info("reconciling applicationset serviceaccounts") - sa, err := r.reconcileApplicationSetServiceAccount(cr) - if err != nil { - return err - } - - log.Info("reconciling applicationset roles") - role, err := r.reconcileApplicationSetRole(cr) - if err != nil { - return err - } - - log.Info("reconciling applicationset role bindings") - if err := r.reconcileApplicationSetRoleBinding(cr, role, sa); err != nil { - return err - } - - log.Info("reconciling applicationset deployments") - if err := r.reconcileApplicationSetDeployment(cr, sa); err != nil { - return err - } - - log.Info("reconciling applicationset service") - if err := r.reconcileApplicationSetService(cr); err != nil { - return err - } - - return nil -} - -// reconcileApplicationControllerDeployment will ensure the Deployment resource is present for the ArgoCD Application Controller component. -func (r *ReconcileArgoCD) reconcileApplicationSetDeployment(cr *argoproj.ArgoCD, sa *corev1.ServiceAccount) error { - deploy := newDeploymentWithSuffix("applicationset-controller", "controller", cr) - - setAppSetLabels(&deploy.ObjectMeta) - - podSpec := &deploy.Spec.Template.Spec - - // sa would be nil when spec.applicationset.enabled = false - if sa != nil { - podSpec.ServiceAccountName = sa.ObjectMeta.Name - } - podSpec.Volumes = []corev1.Volume{ - { - Name: "ssh-known-hosts", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDKnownHostsConfigMapName, - }, - }, - }, - }, - { - Name: "tls-certs", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDTLSCertsConfigMapName, - }, - }, - }, - }, - { - Name: "gpg-keys", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDGPGKeysConfigMapName, - }, - }, - }, - }, - { - Name: "gpg-keyring", - VolumeSource: corev1.VolumeSource{ - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }, - }, - { - Name: "tmp", - VolumeSource: corev1.VolumeSource{ - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }, - }, - } - addSCMGitlabVolumeMount := false - if scmRootCAConfigMapName := getSCMRootCAConfigMapName(cr); scmRootCAConfigMapName != "" { - cm := newConfigMapWithName(scmRootCAConfigMapName, cr) - if argoutil.IsObjectFound(r.Client, cr.Namespace, cr.Spec.ApplicationSet.SCMRootCAConfigMap, cm) { - addSCMGitlabVolumeMount = true - podSpec.Volumes = append(podSpec.Volumes, corev1.Volume{ - Name: "appset-gitlab-scm-tls-cert", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDAppSetGitlabSCMTLSCertsConfigMapName, - }, - }, - }, - }) - } - } - - podSpec.Containers = []corev1.Container{ - applicationSetContainer(cr, addSCMGitlabVolumeMount), - } - AddSeccompProfileForOpenShift(r.Client, podSpec) - - if existing := newDeploymentWithSuffix("applicationset-controller", "controller", cr); argoutil.IsObjectFound(r.Client, cr.Namespace, existing.Name, existing) { - - if cr.Spec.ApplicationSet != nil && !cr.Spec.ApplicationSet.IsEnabled() { - err := r.Client.Delete(context.TODO(), existing) - return err - } - - existingSpec := existing.Spec.Template.Spec - - deploymentsDifferent := !reflect.DeepEqual(existingSpec.Containers[0], podSpec.Containers) || - !reflect.DeepEqual(existingSpec.Volumes, podSpec.Volumes) || - existingSpec.ServiceAccountName != podSpec.ServiceAccountName || - !reflect.DeepEqual(existing.Labels, deploy.Labels) || - !reflect.DeepEqual(existing.Spec.Template.Labels, deploy.Spec.Template.Labels) || - !reflect.DeepEqual(existing.Spec.Selector, deploy.Spec.Selector) || - !reflect.DeepEqual(existing.Spec.Template.Spec.NodeSelector, deploy.Spec.Template.Spec.NodeSelector) || - !reflect.DeepEqual(existing.Spec.Template.Spec.Tolerations, deploy.Spec.Template.Spec.Tolerations) - - // If the Deployment already exists, make sure the values we care about are up-to-date - if deploymentsDifferent { - existing.Spec.Template.Spec.Containers = podSpec.Containers - existing.Spec.Template.Spec.Volumes = podSpec.Volumes - existing.Spec.Template.Spec.ServiceAccountName = podSpec.ServiceAccountName - existing.Labels = deploy.Labels - existing.Spec.Template.Labels = deploy.Spec.Template.Labels - existing.Spec.Selector = deploy.Spec.Selector - existing.Spec.Template.Spec.NodeSelector = deploy.Spec.Template.Spec.NodeSelector - existing.Spec.Template.Spec.Tolerations = deploy.Spec.Template.Spec.Tolerations - return r.Client.Update(context.TODO(), existing) - } - return nil // Deployment found with nothing to do, move along... - } - - if !cr.Spec.ApplicationSet.IsEnabled() { - return nil - } - - if err := controllerutil.SetControllerReference(cr, deploy, r.Scheme); err != nil { - return err - } - return r.Client.Create(context.TODO(), deploy) - -} - -func applicationSetContainer(cr *argoproj.ArgoCD, addSCMGitlabVolumeMount bool) corev1.Container { - // Global proxy env vars go first - appSetEnv := []corev1.EnvVar{{ - Name: "NAMESPACE", - ValueFrom: &corev1.EnvVarSource{ - FieldRef: &corev1.ObjectFieldSelector{ - FieldPath: "metadata.namespace", - }, - }, - }} - - // Merge ApplicationSet env vars provided by the user - // User should be able to override the default NAMESPACE environmental variable - appSetEnv = argoutil.EnvMerge(cr.Spec.ApplicationSet.Env, appSetEnv, true) - // Environment specified in the CR take precedence over everything else - appSetEnv = argoutil.EnvMerge(appSetEnv, proxyEnvVars(), false) - - container := corev1.Container{ - Command: getArgoApplicationSetCommand(cr), - Env: appSetEnv, - Image: getApplicationSetContainerImage(cr), - ImagePullPolicy: corev1.PullAlways, - Name: "argocd-applicationset-controller", - Resources: getApplicationSetResources(cr), - VolumeMounts: []corev1.VolumeMount{ - { - Name: "ssh-known-hosts", - MountPath: "/app/config/ssh", - }, - { - Name: "tls-certs", - MountPath: "/app/config/tls", - }, - { - Name: "gpg-keys", - MountPath: "/app/config/gpg/source", - }, - { - Name: "gpg-keyring", - MountPath: "/app/config/gpg/keys", - }, - { - Name: "tmp", - MountPath: "/tmp", - }, - }, - Ports: []corev1.ContainerPort{ - { - ContainerPort: 7000, - Name: "webhook", - }, - { - ContainerPort: 8080, - Name: "metrics", - }, - }, - SecurityContext: &corev1.SecurityContext{ - Capabilities: &corev1.Capabilities{ - Drop: []corev1.Capability{ - "ALL", - }, - }, - AllowPrivilegeEscalation: boolPtr(false), - ReadOnlyRootFilesystem: boolPtr(true), - RunAsNonRoot: boolPtr(true), - }, - } - if addSCMGitlabVolumeMount { - container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{ - Name: "appset-gitlab-scm-tls-cert", - MountPath: ApplicationSetGitlabSCMTlsCertPath, - }) - } - return container -} - -func (r *ReconcileArgoCD) reconcileApplicationSetServiceAccount(cr *argoproj.ArgoCD) (*corev1.ServiceAccount, error) { - - sa := newServiceAccountWithName("applicationset-controller", cr) - setAppSetLabels(&sa.ObjectMeta) - - exists := true - if err := argoutil.FetchObject(r.Client, cr.Namespace, sa.Name, sa); err != nil { - if !errors.IsNotFound(err) { - return nil, err - } - exists = false - } - - if exists { - if cr.Spec.ApplicationSet != nil && !cr.Spec.ApplicationSet.IsEnabled() { - err := r.Client.Delete(context.TODO(), sa) - return nil, err - } - return sa, nil - } - - if err := controllerutil.SetControllerReference(cr, sa, r.Scheme); err != nil { - return nil, err - } - - if cr.Spec.ApplicationSet != nil && !cr.Spec.ApplicationSet.IsEnabled() { - return nil, nil - } - - err := r.Client.Create(context.TODO(), sa) - if err != nil { - return nil, err - } - - return sa, err -} - -func (r *ReconcileArgoCD) reconcileApplicationSetRole(cr *argoproj.ArgoCD) (*v1.Role, error) { - - policyRules := []v1.PolicyRule{ - - // ApplicationSet - { - APIGroups: []string{"argoproj.io"}, - Resources: []string{ - "applications", - "applicationsets", - "appprojects", - "applicationsets/finalizers", - }, - Verbs: []string{ - "create", - "delete", - "get", - "list", - "patch", - "update", - "watch", - }, - }, - // ApplicationSet Status - { - APIGroups: []string{"argoproj.io"}, - Resources: []string{ - "applicationsets/status", - }, - Verbs: []string{ - "get", - "patch", - "update", - }, - }, - - // Events - { - APIGroups: []string{""}, - Resources: []string{ - "events", - }, - Verbs: []string{ - "create", - "delete", - "get", - "list", - "patch", - "update", - "watch", - }, - }, - - // Read Secrets/ConfigMaps - { - APIGroups: []string{""}, - Resources: []string{ - "secrets", - "configmaps", - }, - Verbs: []string{ - "get", - "list", - "watch", - }, - }, - - // Read Deployments - { - APIGroups: []string{"apps", "extensions"}, - Resources: []string{ - "deployments", - }, - Verbs: []string{ - "get", - "list", - "watch", - }, - }, - } - - role := newRole("applicationset-controller", policyRules, cr) - setAppSetLabels(&role.ObjectMeta) - - err := r.Client.Get(context.TODO(), types.NamespacedName{Name: role.Name, Namespace: cr.Namespace}, role) - if err != nil { - if !errors.IsNotFound(err) { - return nil, fmt.Errorf("failed to reconcile the role for the service account associated with %s : %s", role.Name, err) - } - if errors.IsNotFound(err) && cr.Spec.ApplicationSet != nil && !cr.Spec.ApplicationSet.IsEnabled() { - return nil, nil - } - if err = controllerutil.SetControllerReference(cr, role, r.Scheme); err != nil { - return nil, err - } - return role, r.Client.Create(context.TODO(), role) - } - if cr.Spec.ApplicationSet != nil && !cr.Spec.ApplicationSet.IsEnabled() { - return nil, r.Client.Delete(context.TODO(), role) - } - - role.Rules = policyRules - if err = controllerutil.SetControllerReference(cr, role, r.Scheme); err != nil { - return nil, err - } - return role, r.Client.Update(context.TODO(), role) -} - -func (r *ReconcileArgoCD) reconcileApplicationSetRoleBinding(cr *argoproj.ArgoCD, role *v1.Role, sa *corev1.ServiceAccount) error { - - name := "applicationset-controller" - - // get expected name - roleBinding := newRoleBindingWithname(name, cr) - - // fetch existing rolebinding by name - roleBindingExists := true - if err := r.Client.Get(context.TODO(), types.NamespacedName{Name: roleBinding.Name, Namespace: cr.Namespace}, roleBinding); err != nil { - if !errors.IsNotFound(err) { - return fmt.Errorf("failed to get the rolebinding associated with %s : %s", name, err) - } - if errors.IsNotFound(err) && cr.Spec.ApplicationSet != nil && !cr.Spec.ApplicationSet.IsEnabled() { - return nil - } - roleBindingExists = false - } - - if cr.Spec.ApplicationSet != nil && !cr.Spec.ApplicationSet.IsEnabled() { - return r.Client.Delete(context.TODO(), roleBinding) - } - - setAppSetLabels(&roleBinding.ObjectMeta) - - roleBinding.RoleRef = v1.RoleRef{ - APIGroup: v1.GroupName, - Kind: "Role", - Name: role.Name, - } - - roleBinding.Subjects = []v1.Subject{ - { - Kind: v1.ServiceAccountKind, - Name: sa.Name, - Namespace: sa.Namespace, - }, - } - - if err := controllerutil.SetControllerReference(cr, roleBinding, r.Scheme); err != nil { - return err - } - - if roleBindingExists { - return r.Client.Update(context.TODO(), roleBinding) - } - - return r.Client.Create(context.TODO(), roleBinding) -} - -func getApplicationSetContainerImage(cr *argoproj.ArgoCD) string { - defaultImg, defaultTag := false, false - - img := "" - tag := "" - - // First pull from spec, if it exists - if cr.Spec.ApplicationSet != nil { - img = cr.Spec.ApplicationSet.Image - tag = cr.Spec.ApplicationSet.Version - } - - // If spec is empty, use the defaults - if img == "" { - img = common.ArgoCDDefaultArgoImage - defaultImg = true - } - if tag == "" { - tag = common.ArgoCDDefaultArgoVersion - defaultTag = true - } - - // If an env var is specified then use that, but don't override the spec values (if they are present) - if e := os.Getenv(common.ArgoCDImageEnvName); e != "" && (defaultTag && defaultImg) { - return e - } - return argoutil.CombineImageTag(img, tag) -} - -// getApplicationSetResources will return the ResourceRequirements for the Application Sets container. -func getApplicationSetResources(cr *argoproj.ArgoCD) corev1.ResourceRequirements { - resources := corev1.ResourceRequirements{} - - // Allow override of resource requirements from CR - if cr.Spec.ApplicationSet.Resources != nil { - resources = *cr.Spec.ApplicationSet.Resources - } - - return resources -} - -func setAppSetLabels(obj *metav1.ObjectMeta) { - obj.Labels["app.kubernetes.io/name"] = "argocd-applicationset-controller" - obj.Labels["app.kubernetes.io/part-of"] = "argocd-applicationset" - obj.Labels["app.kubernetes.io/component"] = "controller" -} - -// reconcileApplicationSetService will ensure that the Service is present for the ApplicationSet webhook and metrics component. -func (r *ReconcileArgoCD) reconcileApplicationSetService(cr *argoproj.ArgoCD) error { - log.Info("reconciling applicationset service") - - svc := newServiceWithSuffix(common.ApplicationSetServiceNameSuffix, common.ApplicationSetServiceNameSuffix, cr) - if cr.Spec.ApplicationSet == nil || !cr.Spec.ApplicationSet.IsEnabled() { - - if argoutil.IsObjectFound(r.Client, cr.Namespace, svc.Name, svc) { - err := argoutil.FetchObject(r.Client, cr.Namespace, svc.Name, svc) - if err != nil { - return err - } - log.Info(fmt.Sprintf("Deleting applicationset controller service %s as applicationset is disabled", svc.Name)) - err = r.Delete(context.TODO(), svc) - if err != nil { - return err - } - } - return nil - } else { - if argoutil.IsObjectFound(r.Client, cr.Namespace, svc.Name, svc) { - return nil // Service found, do nothing - } - } - svc.Spec.Ports = []corev1.ServicePort{ - { - Name: "webhook", - Port: 7000, - Protocol: corev1.ProtocolTCP, - TargetPort: intstr.FromInt(7000), - }, { - Name: "metrics", - Port: 8080, - Protocol: corev1.ProtocolTCP, - TargetPort: intstr.FromInt(8080), - }, - } - - svc.Spec.Selector = map[string]string{ - common.ArgoCDKeyName: nameWithSuffix(common.ApplicationSetServiceNameSuffix, cr), - } - - if err := controllerutil.SetControllerReference(cr, svc, r.Scheme); err != nil { - return err - } - return r.Client.Create(context.TODO(), svc) -} diff --git a/controllers/argocd/applicationset_test.go b/controllers/argocd/applicationset_test.go deleted file mode 100644 index 65b7f264a..000000000 --- a/controllers/argocd/applicationset_test.go +++ /dev/null @@ -1,725 +0,0 @@ -// Copyright 2021 ArgoCD Operator Developers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package argocd - -import ( - "context" - "sort" - "testing" - - "github.com/google/go-cmp/cmp" - "github.com/stretchr/testify/assert" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - logf "sigs.k8s.io/controller-runtime/pkg/log" - - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" - "github.com/argoproj-labs/argocd-operator/common" - "github.com/argoproj-labs/argocd-operator/controllers/argoutil" -) - -func applicationSetDefaultVolumeMounts() []corev1.VolumeMount { - repoMounts := repoServerDefaultVolumeMounts() - ignoredMounts := map[string]bool{ - "plugins": true, - "argocd-repo-server-tls": true, - common.ArgoCDRedisServerTLSSecretName: true, - } - mounts := make([]corev1.VolumeMount, len(repoMounts)-len(ignoredMounts), len(repoMounts)-len(ignoredMounts)) - j := 0 - for _, mount := range repoMounts { - if !ignoredMounts[mount.Name] { - mounts[j] = mount - j += 1 - } - } - return mounts -} - -func applicationSetDefaultVolumes() []corev1.Volume { - repoVolumes := repoServerDefaultVolumes() - ignoredVolumes := map[string]bool{ - "var-files": true, - "plugins": true, - "argocd-repo-server-tls": true, - common.ArgoCDRedisServerTLSSecretName: true, - } - volumes := make([]corev1.Volume, len(repoVolumes)-len(ignoredVolumes), len(repoVolumes)-len(ignoredVolumes)) - j := 0 - for _, volume := range repoVolumes { - if !ignoredVolumes[volume.Name] { - volumes[j] = volume - j += 1 - } - } - return volumes -} - -func TestReconcileApplicationSet_CreateDeployments(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD() - a.Spec.ApplicationSet = &argoproj.ArgoCDApplicationSet{} - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - sa := corev1.ServiceAccount{} - - assert.NoError(t, r.reconcileApplicationSetDeployment(a, &sa)) - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - // Ensure the created Deployment has the expected properties - checkExpectedDeploymentValues(t, r, deployment, &sa, a) -} - -func checkExpectedDeploymentValues(t *testing.T, r *ReconcileArgoCD, deployment *appsv1.Deployment, sa *corev1.ServiceAccount, a *argoproj.ArgoCD) { - assert.Equal(t, deployment.Spec.Template.Spec.ServiceAccountName, sa.ObjectMeta.Name) - appsetAssertExpectedLabels(t, &deployment.ObjectMeta) - - want := []corev1.Container{applicationSetContainer(a, false)} - - if diff := cmp.Diff(want, deployment.Spec.Template.Spec.Containers); diff != "" { - t.Fatalf("failed to reconcile applicationset-controller deployment containers:\n%s", diff) - } - - volumes := []corev1.Volume{ - { - Name: "ssh-known-hosts", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDKnownHostsConfigMapName, - }, - }, - }, - }, - { - Name: "tls-certs", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDTLSCertsConfigMapName, - }, - }, - }, - }, - { - Name: "gpg-keys", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDGPGKeysConfigMapName, - }, - }, - }, - }, - { - Name: "gpg-keyring", - VolumeSource: corev1.VolumeSource{ - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }, - }, - { - Name: "tmp", - VolumeSource: corev1.VolumeSource{ - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }, - }, - } - - if a.Spec.ApplicationSet.SCMRootCAConfigMap != "" && argoutil.IsObjectFound(r.Client, a.Namespace, common.ArgoCDAppSetGitlabSCMTLSCertsConfigMapName, a) { - volumes = append(volumes, corev1.Volume{ - Name: "appset-gitlab-scm-tls-cert", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDAppSetGitlabSCMTLSCertsConfigMapName, - }, - }, - }, - }) - } - - if diff := cmp.Diff(volumes, deployment.Spec.Template.Spec.Volumes); diff != "" { - t.Fatalf("failed to reconcile applicationset-controller deployment volumes:\n%s", diff) - } - - expectedSelector := &metav1.LabelSelector{ - MatchLabels: map[string]string{ - common.ArgoCDKeyName: deployment.Name, - }, - } - - if diff := cmp.Diff(expectedSelector, deployment.Spec.Selector); diff != "" { - t.Fatalf("failed to reconcile applicationset-controller label selector:\n%s", diff) - } -} - -func TestReconcileApplicationSetProxyConfiguration(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - - // Proxy Env vars - setProxyEnvVars(t) - - a := makeTestArgoCD() - a.Spec.ApplicationSet = &argoproj.ArgoCDApplicationSet{} - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - sa := corev1.ServiceAccount{} - - r.reconcileApplicationSetDeployment(a, &sa) - - want := []corev1.EnvVar{ - { - Name: "HTTPS_PROXY", - Value: "https://example.com", - }, - { - Name: "HTTP_PROXY", - Value: "http://example.com", - }, - { - Name: "NAMESPACE", - ValueFrom: &corev1.EnvVarSource{ - FieldRef: &corev1.ObjectFieldSelector{ - FieldPath: "metadata.namespace", - }, - }, - }, - { - Name: "NO_PROXY", - Value: ".cluster.local", - }, - } - - deployment := &appsv1.Deployment{} - - // reconcile ApplicationSets - r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment) - - if diff := cmp.Diff(want, deployment.Spec.Template.Spec.Containers[0].Env); diff != "" { - t.Fatalf("failed to reconcile applicationset-controller deployment containers:\n%s", diff) - } - -} - -func TestReconcileApplicationSet_UpdateExistingDeployments(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD() - - a.Spec.ApplicationSet = &argoproj.ArgoCDApplicationSet{} - - existingDeployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: a.Name + "-applicationset-controller", - Namespace: a.Namespace, - }, - Spec: appsv1.DeploymentSpec{ - Template: corev1.PodTemplateSpec{ - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Name: "fake-container", - }, - }, - }, - }, - }, - } - - resObjs := []client.Object{a, existingDeployment} - subresObjs := []client.Object{a, existingDeployment} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - sa := corev1.ServiceAccount{} - - assert.NoError(t, r.reconcileApplicationSetDeployment(a, &sa)) - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - // Ensure the updated Deployment has the expected properties - checkExpectedDeploymentValues(t, r, deployment, &sa, a) - -} - -func TestReconcileApplicationSet_Deployments_resourceRequirements(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCDWithResources() - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - sa := corev1.ServiceAccount{} - - assert.NoError(t, r.reconcileApplicationSetDeployment(a, &sa)) - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - assert.Equal(t, deployment.Spec.Template.Spec.ServiceAccountName, sa.ObjectMeta.Name) - appsetAssertExpectedLabels(t, &deployment.ObjectMeta) - - containerWant := []corev1.Container{applicationSetContainer(a, false)} - - if diff := cmp.Diff(containerWant, deployment.Spec.Template.Spec.Containers); diff != "" { - t.Fatalf("failed to reconcile argocd-server deployment:\n%s", diff) - } - - volumesWant := applicationSetDefaultVolumes() - - if diff := cmp.Diff(volumesWant, deployment.Spec.Template.Spec.Volumes); diff != "" { - t.Fatalf("failed to reconcile argocd-server deployment:\n%s", diff) - } -} - -func TestReconcileApplicationSet_Deployments_SpecOverride(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - - tests := []struct { - name string - appSetField *argoproj.ArgoCDApplicationSet - envVars map[string]string - expectedContainerImage string - }{ - { - name: "unspecified fields should use default", - appSetField: &argoproj.ArgoCDApplicationSet{}, - expectedContainerImage: argoutil.CombineImageTag(common.ArgoCDDefaultArgoImage, common.ArgoCDDefaultArgoVersion), - }, - { - name: "ensure that sha hashes are formatted correctly", - appSetField: &argoproj.ArgoCDApplicationSet{ - Image: "custom-image", - Version: "sha256:b835999eb5cf75d01a2678cd971095926d9c2566c9ffe746d04b83a6a0a2849f", - }, - expectedContainerImage: "custom-image@sha256:b835999eb5cf75d01a2678cd971095926d9c2566c9ffe746d04b83a6a0a2849f", - }, - { - name: "custom image should properly substitute", - appSetField: &argoproj.ArgoCDApplicationSet{ - Image: "custom-image", - Version: "custom-version", - }, - expectedContainerImage: "custom-image:custom-version", - }, - { - name: "verify env var substitution overrides default", - appSetField: &argoproj.ArgoCDApplicationSet{}, - envVars: map[string]string{common.ArgoCDImageEnvName: "custom-env-image"}, - expectedContainerImage: "custom-env-image", - }, - - { - name: "env var should not override spec fields", - appSetField: &argoproj.ArgoCDApplicationSet{ - Image: "custom-image", - Version: "custom-version", - }, - envVars: map[string]string{common.ArgoCDImageEnvName: "custom-env-image"}, - expectedContainerImage: "custom-image:custom-version", - }, - { - name: "ensure scm tls cert mount is present", - appSetField: &argoproj.ArgoCDApplicationSet{ - SCMRootCAConfigMap: "test-scm-tls-mount", - }, - envVars: map[string]string{common.ArgoCDImageEnvName: "custom-env-image"}, - expectedContainerImage: "custom-env-image", - }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - - for testEnvName, testEnvValue := range test.envVars { - t.Setenv(testEnvName, testEnvValue) - } - - a := makeTestArgoCD() - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - cm := newConfigMapWithName(getCAConfigMapName(a), a) - r.Client.Create(context.Background(), cm, &client.CreateOptions{}) - - a.Spec.ApplicationSet = test.appSetField - - sa := corev1.ServiceAccount{} - assert.NoError(t, r.reconcileApplicationSetDeployment(a, &sa)) - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - specImage := deployment.Spec.Template.Spec.Containers[0].Image - assert.Equal(t, test.expectedContainerImage, specImage) - checkExpectedDeploymentValues(t, r, deployment, &sa, a) - }) - } - -} - -func TestReconcileApplicationSet_ServiceAccount(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD() - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - retSa, err := r.reconcileApplicationSetServiceAccount(a) - assert.NoError(t, err) - - sa := &corev1.ServiceAccount{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - sa)) - - assert.Equal(t, sa.Name, retSa.Name) - - appsetAssertExpectedLabels(t, &sa.ObjectMeta) -} - -func TestReconcileApplicationSet_Role(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD() - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - roleRet, err := r.reconcileApplicationSetRole(a) - assert.NoError(t, err) - - role := &rbacv1.Role{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - role)) - - assert.Equal(t, roleRet.Name, role.Name) - appsetAssertExpectedLabels(t, &role.ObjectMeta) - - expectedResources := []string{ - "deployments", - "secrets", - "configmaps", - "events", - "applicationsets/status", - "applications", - "applicationsets", - "appprojects", - "applicationsets/finalizers", - } - - foundResources := []string{} - - for _, rule := range role.Rules { - for _, resource := range rule.Resources { - foundResources = append(foundResources, resource) - } - } - - sort.Strings(expectedResources) - sort.Strings(foundResources) - - assert.Equal(t, expectedResources, foundResources) -} - -func TestReconcileApplicationSet_RoleBinding(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD() - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - role := &rbacv1.Role{ObjectMeta: metav1.ObjectMeta{Name: "role-name"}} - sa := &corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Name: "sa-name"}} - - err := r.reconcileApplicationSetRoleBinding(a, role, sa) - assert.NoError(t, err) - - roleBinding := &rbacv1.RoleBinding{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - roleBinding)) - - appsetAssertExpectedLabels(t, &roleBinding.ObjectMeta) - - assert.Equal(t, roleBinding.RoleRef.Name, role.Name) - assert.Equal(t, roleBinding.Subjects[0].Name, sa.Name) - -} - -func appsetAssertExpectedLabels(t *testing.T, meta *metav1.ObjectMeta) { - assert.Equal(t, meta.Labels["app.kubernetes.io/name"], "argocd-applicationset-controller") - assert.Equal(t, meta.Labels["app.kubernetes.io/part-of"], "argocd-applicationset") - assert.Equal(t, meta.Labels["app.kubernetes.io/component"], "controller") -} - -func setProxyEnvVars(t *testing.T) { - t.Setenv("HTTPS_PROXY", "https://example.com") - t.Setenv("HTTP_PROXY", "http://example.com") - t.Setenv("NO_PROXY", ".cluster.local") -} - -func TestReconcileApplicationSet_Service(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD() - a.Spec.ApplicationSet = &argoproj.ArgoCDApplicationSet{} - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - s := newServiceWithSuffix(common.ApplicationSetServiceNameSuffix, common.ApplicationSetServiceNameSuffix, a) - - assert.NoError(t, r.reconcileApplicationSetService(a)) - assert.NoError(t, r.Client.Get(context.TODO(), types.NamespacedName{Namespace: s.Namespace, Name: s.Name}, s)) -} - -func TestArgoCDApplicationSetCommand(t *testing.T) { - a := makeTestArgoCD() - a.Spec.ApplicationSet = &argoproj.ArgoCDApplicationSet{} - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - baseCommand := []string{ - "entrypoint.sh", - "argocd-applicationset-controller", - "--argocd-repo-server", - "argocd-repo-server.argocd.svc.cluster.local:8081", - "--loglevel", - "info", - } - - // When a single command argument is passed - a.Spec.ApplicationSet.ExtraCommandArgs = []string{ - "--foo", - "bar", - } - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.reconcileApplicationSetController(a)) - - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - cmd := append(baseCommand, "--foo", "bar") - assert.Equal(t, cmd, deployment.Spec.Template.Spec.Containers[0].Command) - - // When multiple command arguments are passed - a.Spec.ApplicationSet.ExtraCommandArgs = []string{ - "--foo", - "bar", - "--ping", - "pong", - "test", - } - - assert.NoError(t, r.reconcileApplicationSetController(a)) - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - cmd = append(cmd, "--ping", "pong", "test") - assert.Equal(t, cmd, deployment.Spec.Template.Spec.Containers[0].Command) - - // When one of the ExtraCommandArgs already exists in cmd with same or different value - a.Spec.ApplicationSet.ExtraCommandArgs = []string{ - "--argocd-repo-server", - "foo.scv.cluster.local:6379", - } - - assert.NoError(t, r.reconcileApplicationSetController(a)) - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - assert.Equal(t, baseCommand, deployment.Spec.Template.Spec.Containers[0].Command) - - // Remove all the command arguments that were added. - a.Spec.ApplicationSet.ExtraCommandArgs = []string{} - - assert.NoError(t, r.reconcileApplicationSetController(a)) - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - assert.Equal(t, baseCommand, deployment.Spec.Template.Spec.Containers[0].Command) -} - -func TestArgoCDApplicationSetEnv(t *testing.T) { - a := makeTestArgoCD() - a.Spec.ApplicationSet = &argoproj.ArgoCDApplicationSet{} - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - defaultEnv := []corev1.EnvVar{ - { - Name: "NAMESPACE", - ValueFrom: &corev1.EnvVarSource{ - FieldRef: &corev1.ObjectFieldSelector{ - APIVersion: "", - FieldPath: "metadata.namespace", - }, - }, - }, - } - - // Pass an environment variable using Argo CD CR. - customEnv := []corev1.EnvVar{ - { - Name: "foo", - Value: "bar", - }, - } - a.Spec.ApplicationSet.Env = customEnv - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.reconcileApplicationSetController(a)) - - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - expectedEnv := append(defaultEnv, customEnv...) - assert.Equal(t, expectedEnv, deployment.Spec.Template.Spec.Containers[0].Env) - - // Remove all the env vars that were added. - a.Spec.ApplicationSet.Env = []corev1.EnvVar{} - - assert.NoError(t, r.reconcileApplicationSetController(a)) - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: "argocd-applicationset-controller", - Namespace: a.Namespace, - }, - deployment)) - - assert.Equal(t, defaultEnv, deployment.Spec.Template.Spec.Containers[0].Env) -} diff --git a/controllers/argocd/argocd_controller.go b/controllers/argocd/argocd_controller.go index 13c03be77..edff56471 100644 --- a/controllers/argocd/argocd_controller.go +++ b/controllers/argocd/argocd_controller.go @@ -23,8 +23,6 @@ import ( "github.com/prometheus/client_golang/prometheus" - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" "github.com/argoproj-labs/argocd-operator/common" "github.com/argoproj-labs/argocd-operator/controllers/argocd/appcontroller" @@ -97,12 +95,6 @@ var log = ctrl.Log.WithName("controller_argocd") // as, having multiple Argo CD instances in the same namespace is considered an anti-pattern var ActiveInstanceMap = make(map[string]string) -// Map to keep track of running Argo CD instances using their namespaces as key and phase as value -// This map will be used for the performance metrics purposes -// Important note: This assumes that each instance only contains one Argo CD instance -// as, having multiple Argo CD instances in the same namespace is considered an anti-pattern -var ActiveInstanceMap = make(map[string]string) - //+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=clusterroles;clusterrolebindings,verbs=* //+kubebuilder:rbac:groups="",resources=configmaps;endpoints;events;persistentvolumeclaims;pods;namespaces;secrets;serviceaccounts;services;services/finalizers,verbs=* //+kubebuilder:rbac:groups=apps.openshift.io,resources=deploymentconfigs,verbs=* diff --git a/controllers/argocd/hpa_test.go b/controllers/argocd/hpa_test.go index 23ee6e221..0e91204ff 100644 --- a/controllers/argocd/hpa_test.go +++ b/controllers/argocd/hpa_test.go @@ -4,7 +4,6 @@ import ( "context" "testing" - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" "github.com/stretchr/testify/assert" autoscaling "k8s.io/api/autoscaling/v1" "k8s.io/apimachinery/pkg/api/errors" diff --git a/controllers/argocd/notifications.go b/controllers/argocd/notifications.go deleted file mode 100644 index 5e0699568..000000000 --- a/controllers/argocd/notifications.go +++ /dev/null @@ -1,547 +0,0 @@ -package argocd - -import ( - "context" - "fmt" - "reflect" - "time" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" - "github.com/argoproj-labs/argocd-operator/common" - "github.com/argoproj-labs/argocd-operator/controllers/argoutil" -) - -func (r *ReconcileArgoCD) reconcileNotificationsController(cr *argoproj.ArgoCD) error { - - log.Info("reconciling notifications serviceaccount") - sa, err := r.reconcileNotificationsServiceAccount(cr) - if err != nil { - return err - } - - log.Info("reconciling notifications role") - role, err := r.reconcileNotificationsRole(cr) - if err != nil { - return err - } - - log.Info("reconciling notifications role binding") - if err := r.reconcileNotificationsRoleBinding(cr, role, sa); err != nil { - return err - } - - log.Info("reconciling notifications configmap") - if err := r.reconcileNotificationsConfigMap(cr); err != nil { - return err - } - - log.Info("reconciling notifications secret") - if err := r.reconcileNotificationsSecret(cr); err != nil { - return err - } - - log.Info("reconciling notifications deployment") - if err := r.reconcileNotificationsDeployment(cr, sa); err != nil { - return err - } - - return nil -} - -// The code to create/delete notifications resources is written within the reconciliation logic itself. However, these functions must be called -// in the right order depending on whether resources are getting created or deleted. During creation we must create the role and sa first. -// RoleBinding and deployment are dependent on these resouces. During deletion the order is reversed. -// Deployment and RoleBinding must be deleted before the role and sa. deleteNotificationsResources will only be called during -// delete events, so we don't need to worry about duplicate, recurring reconciliation calls -func (r *ReconcileArgoCD) deleteNotificationsResources(cr *argoproj.ArgoCD) error { - - sa := &corev1.ServiceAccount{} - role := &rbacv1.Role{} - - if err := argoutil.FetchObject(r.Client, cr.Namespace, fmt.Sprintf("%s-%s", cr.Name, common.ArgoCDNotificationsControllerComponent), sa); err != nil { - if !errors.IsNotFound(err) { - return err - } - } - if err := argoutil.FetchObject(r.Client, cr.Namespace, fmt.Sprintf("%s-%s", cr.Name, common.ArgoCDNotificationsControllerComponent), role); err != nil { - if !errors.IsNotFound(err) { - return err - } - } - - log.Info("reconciling notifications deployment") - if err := r.reconcileNotificationsDeployment(cr, sa); err != nil { - return err - } - - log.Info("reconciling notifications secret") - if err := r.reconcileNotificationsSecret(cr); err != nil { - return err - } - - log.Info("reconciling notifications configmap") - if err := r.reconcileNotificationsConfigMap(cr); err != nil { - return err - } - - log.Info("reconciling notifications role binding") - if err := r.reconcileNotificationsRoleBinding(cr, role, sa); err != nil { - return err - } - - log.Info("reconciling notifications role") - _, err := r.reconcileNotificationsRole(cr) - if err != nil { - return err - } - - log.Info("reconciling notifications serviceaccount") - _, err = r.reconcileNotificationsServiceAccount(cr) - if err != nil { - return err - } - - return nil -} - -func (r *ReconcileArgoCD) reconcileNotificationsServiceAccount(cr *argoproj.ArgoCD) (*corev1.ServiceAccount, error) { - - sa := newServiceAccountWithName(common.ArgoCDNotificationsControllerComponent, cr) - - if err := argoutil.FetchObject(r.Client, cr.Namespace, sa.Name, sa); err != nil { - if !errors.IsNotFound(err) { - return nil, fmt.Errorf("failed to get the serviceAccount associated with %s : %s", sa.Name, err) - } - - // SA doesn't exist and shouldn't, nothing to do here - if !cr.Spec.Notifications.Enabled { - return nil, nil - } - - // SA doesn't exist but should, so it should be created - if err := controllerutil.SetControllerReference(cr, sa, r.Scheme); err != nil { - return nil, err - } - - log.Info(fmt.Sprintf("Creating serviceaccount %s", sa.Name)) - err := r.Client.Create(context.TODO(), sa) - if err != nil { - return nil, err - } - } - - // SA exists but shouldn't, so it should be deleted - if !cr.Spec.Notifications.Enabled { - log.Info(fmt.Sprintf("Deleting serviceaccount %s as notifications is disabled", sa.Name)) - return nil, r.Client.Delete(context.TODO(), sa) - } - - return sa, nil -} - -func (r *ReconcileArgoCD) reconcileNotificationsRole(cr *argoproj.ArgoCD) (*rbacv1.Role, error) { - - policyRules := policyRuleForNotificationsController() - desiredRole := newRole(common.ArgoCDNotificationsControllerComponent, policyRules, cr) - - existingRole := &rbacv1.Role{} - if err := argoutil.FetchObject(r.Client, cr.Namespace, desiredRole.Name, existingRole); err != nil { - if !errors.IsNotFound(err) { - return nil, fmt.Errorf("failed to get the role associated with %s : %s", desiredRole.Name, err) - } - - // role does not exist and shouldn't, nothing to do here - if !cr.Spec.Notifications.Enabled { - return nil, nil - } - - // role does not exist but should, so it should be created - if err := controllerutil.SetControllerReference(cr, desiredRole, r.Scheme); err != nil { - return nil, err - } - - log.Info(fmt.Sprintf("Creating role %s", desiredRole.Name)) - err := r.Client.Create(context.TODO(), desiredRole) - if err != nil { - return nil, err - } - return desiredRole, nil - } - - // role exists but shouldn't, so it should be deleted - if !cr.Spec.Notifications.Enabled { - log.Info(fmt.Sprintf("Deleting role %s as notifications is disabled", existingRole.Name)) - return nil, r.Client.Delete(context.TODO(), existingRole) - } - - // role exists and should. Reconcile role if changed - if !reflect.DeepEqual(existingRole.Rules, desiredRole.Rules) { - existingRole.Rules = desiredRole.Rules - if err := controllerutil.SetControllerReference(cr, existingRole, r.Scheme); err != nil { - return nil, err - } - return existingRole, r.Client.Update(context.TODO(), existingRole) - } - - return desiredRole, nil -} - -func (r *ReconcileArgoCD) reconcileNotificationsRoleBinding(cr *argoproj.ArgoCD, role *rbacv1.Role, sa *corev1.ServiceAccount) error { - - desiredRoleBinding := newRoleBindingWithname(common.ArgoCDNotificationsControllerComponent, cr) - desiredRoleBinding.RoleRef = rbacv1.RoleRef{ - APIGroup: rbacv1.GroupName, - Kind: "Role", - Name: role.Name, - } - - desiredRoleBinding.Subjects = []rbacv1.Subject{ - { - Kind: rbacv1.ServiceAccountKind, - Name: sa.Name, - Namespace: sa.Namespace, - }, - } - - // fetch existing rolebinding by name - existingRoleBinding := &rbacv1.RoleBinding{} - if err := r.Client.Get(context.TODO(), types.NamespacedName{Name: desiredRoleBinding.Name, Namespace: cr.Namespace}, existingRoleBinding); err != nil { - if !errors.IsNotFound(err) { - return fmt.Errorf("failed to get the rolebinding associated with %s : %s", desiredRoleBinding.Name, err) - } - - // roleBinding does not exist and shouldn't, nothing to do here - if !cr.Spec.Notifications.Enabled { - return nil - } - - // roleBinding does not exist but should, so it should be created - if err := controllerutil.SetControllerReference(cr, desiredRoleBinding, r.Scheme); err != nil { - return err - } - - log.Info(fmt.Sprintf("Creating roleBinding %s", desiredRoleBinding.Name)) - return r.Client.Create(context.TODO(), desiredRoleBinding) - } - - // roleBinding exists but shouldn't, so it should be deleted - if !cr.Spec.Notifications.Enabled { - log.Info(fmt.Sprintf("Deleting roleBinding %s as notifications is disabled", existingRoleBinding.Name)) - return r.Client.Delete(context.TODO(), existingRoleBinding) - } - - // roleBinding exists and should. Reconcile roleBinding if changed - if !reflect.DeepEqual(existingRoleBinding.RoleRef, desiredRoleBinding.RoleRef) { - // if the RoleRef changes, delete the existing role binding and create a new one - if err := r.Client.Delete(context.TODO(), existingRoleBinding); err != nil { - return err - } - } else if !reflect.DeepEqual(existingRoleBinding.Subjects, desiredRoleBinding.Subjects) { - existingRoleBinding.Subjects = desiredRoleBinding.Subjects - if err := controllerutil.SetControllerReference(cr, existingRoleBinding, r.Scheme); err != nil { - return err - } - return r.Client.Update(context.TODO(), existingRoleBinding) - } - - return nil -} - -func (r *ReconcileArgoCD) reconcileNotificationsDeployment(cr *argoproj.ArgoCD, sa *corev1.ServiceAccount) error { - - desiredDeployment := newDeploymentWithSuffix("notifications-controller", "controller", cr) - - desiredDeployment.Spec.Strategy = appsv1.DeploymentStrategy{ - Type: appsv1.RecreateDeploymentStrategyType, - } - - if replicas := getArgoCDNotificationsControllerReplicas(cr); replicas != nil { - desiredDeployment.Spec.Replicas = replicas - } - - notificationEnv := cr.Spec.Notifications.Env - // Let user specify their own environment first - notificationEnv = argoutil.EnvMerge(notificationEnv, proxyEnvVars(), false) - - podSpec := &desiredDeployment.Spec.Template.Spec - podSpec.SecurityContext = &corev1.PodSecurityContext{ - RunAsNonRoot: boolPtr(true), - } - AddSeccompProfileForOpenShift(r.Client, podSpec) - podSpec.ServiceAccountName = sa.ObjectMeta.Name - podSpec.Volumes = []corev1.Volume{ - { - Name: "tls-certs", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: common.ArgoCDTLSCertsConfigMapName, - }, - }, - }, - }, - { - Name: "argocd-repo-server-tls", - VolumeSource: corev1.VolumeSource{ - Secret: &corev1.SecretVolumeSource{ - SecretName: common.ArgoCDRepoServerTLSSecretName, - Optional: boolPtr(true), - }, - }, - }, - } - - podSpec.Containers = []corev1.Container{{ - Command: getNotificationsCommand(cr), - Image: getArgoContainerImage(cr), - ImagePullPolicy: corev1.PullAlways, - Name: common.ArgoCDNotificationsControllerComponent, - Env: notificationEnv, - Resources: getNotificationsResources(cr), - LivenessProbe: &corev1.Probe{ - ProbeHandler: corev1.ProbeHandler{ - TCPSocket: &corev1.TCPSocketAction{ - Port: intstr.IntOrString{ - IntVal: int32(9001), - }, - }, - }, - }, - SecurityContext: &corev1.SecurityContext{ - AllowPrivilegeEscalation: boolPtr(false), - Capabilities: &corev1.Capabilities{ - Drop: []corev1.Capability{ - "ALL", - }, - }, - }, - VolumeMounts: []corev1.VolumeMount{ - { - Name: "tls-certs", - MountPath: "/app/config/tls", - }, - { - Name: "argocd-repo-server-tls", - MountPath: "/app/config/reposerver/tls", - }, - }, - WorkingDir: "/app", - }} - - // fetch existing deployment by name - deploymentChanged := false - existingDeployment := &appsv1.Deployment{} - if err := r.Client.Get(context.TODO(), types.NamespacedName{Name: desiredDeployment.Name, Namespace: cr.Namespace}, existingDeployment); err != nil { - if !errors.IsNotFound(err) { - return fmt.Errorf("failed to get the deployment associated with %s : %s", existingDeployment.Name, err) - } - - // deployment does not exist and shouldn't, nothing to do here - if !cr.Spec.Notifications.Enabled { - return nil - } - - // deployment does not exist but should, so it should be created - if err := controllerutil.SetControllerReference(cr, desiredDeployment, r.Scheme); err != nil { - return err - } - - log.Info(fmt.Sprintf("Creating deployment %s", desiredDeployment.Name)) - return r.Client.Create(context.TODO(), desiredDeployment) - } - - // deployment exists but shouldn't, so it should be deleted - if !cr.Spec.Notifications.Enabled { - log.Info(fmt.Sprintf("Deleting deployment %s as notifications is disabled", existingDeployment.Name)) - return r.Client.Delete(context.TODO(), existingDeployment) - } - - // deployment exists and should. Reconcile deployment if changed - updateNodePlacement(existingDeployment, desiredDeployment, &deploymentChanged) - - if existingDeployment.Spec.Template.Spec.Containers[0].Image != desiredDeployment.Spec.Template.Spec.Containers[0].Image { - existingDeployment.Spec.Template.Spec.Containers[0].Image = desiredDeployment.Spec.Template.Spec.Containers[0].Image - existingDeployment.Spec.Template.ObjectMeta.Labels["image.upgraded"] = time.Now().UTC().Format("01022006-150406-MST") - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Template.Spec.Containers[0].Command, desiredDeployment.Spec.Template.Spec.Containers[0].Command) { - existingDeployment.Spec.Template.Spec.Containers[0].Command = desiredDeployment.Spec.Template.Spec.Containers[0].Command - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Template.Spec.Containers[0].Env, - desiredDeployment.Spec.Template.Spec.Containers[0].Env) { - existingDeployment.Spec.Template.Spec.Containers[0].Env = desiredDeployment.Spec.Template.Spec.Containers[0].Env - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Template.Spec.Volumes, desiredDeployment.Spec.Template.Spec.Volumes) { - existingDeployment.Spec.Template.Spec.Volumes = desiredDeployment.Spec.Template.Spec.Volumes - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Replicas, desiredDeployment.Spec.Replicas) { - existingDeployment.Spec.Replicas = desiredDeployment.Spec.Replicas - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Template.Spec.Containers[0].VolumeMounts, desiredDeployment.Spec.Template.Spec.Containers[0].VolumeMounts) { - existingDeployment.Spec.Template.Spec.Containers[0].VolumeMounts = desiredDeployment.Spec.Template.Spec.Containers[0].VolumeMounts - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Template.Spec.Containers[0].Resources, desiredDeployment.Spec.Template.Spec.Containers[0].Resources) { - existingDeployment.Spec.Template.Spec.Containers[0].Resources = desiredDeployment.Spec.Template.Spec.Containers[0].Resources - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Template.Spec.ServiceAccountName, desiredDeployment.Spec.Template.Spec.ServiceAccountName) { - existingDeployment.Spec.Template.Spec.ServiceAccountName = desiredDeployment.Spec.Template.Spec.ServiceAccountName - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Labels, desiredDeployment.Labels) { - existingDeployment.Labels = desiredDeployment.Labels - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Template.Labels, desiredDeployment.Spec.Template.Labels) { - existingDeployment.Spec.Template.Labels = desiredDeployment.Spec.Template.Labels - deploymentChanged = true - } - - if !reflect.DeepEqual(existingDeployment.Spec.Selector, desiredDeployment.Spec.Selector) { - existingDeployment.Spec.Selector = desiredDeployment.Spec.Selector - deploymentChanged = true - } - - if deploymentChanged { - return r.Client.Update(context.TODO(), existingDeployment) - } - - return nil - -} - -// reconcileNotificationsConfigMap only creates/deletes the argocd-notifications-cm based on whether notifications is enabled/disabled in the CR -// It does not reconcile/overwrite any fields or information in the configmap itself -func (r *ReconcileArgoCD) reconcileNotificationsConfigMap(cr *argoproj.ArgoCD) error { - - desiredConfigMap := newConfigMapWithName("argocd-notifications-cm", cr) - desiredConfigMap.Data = getDefaultNotificationsConfig() - - cmExists := true - existingConfigMap := &corev1.ConfigMap{} - if err := argoutil.FetchObject(r.Client, cr.Namespace, desiredConfigMap.Name, existingConfigMap); err != nil { - if !errors.IsNotFound(err) { - return fmt.Errorf("failed to get the configmap associated with %s : %s", desiredConfigMap.Name, err) - } - cmExists = false - } - - if cmExists { - // CM exists but shouldn't, so it should be deleted - if !cr.Spec.Notifications.Enabled { - log.Info(fmt.Sprintf("Deleting configmap %s as notifications is disabled", existingConfigMap.Name)) - return r.Client.Delete(context.TODO(), existingConfigMap) - } - - // CM exists and should, nothing to do here - return nil - } - - // CM doesn't exist and shouldn't, nothing to do here - if !cr.Spec.Notifications.Enabled { - return nil - } - - // CM doesn't exist but should, so it should be created - if err := controllerutil.SetControllerReference(cr, desiredConfigMap, r.Scheme); err != nil { - return err - } - - log.Info(fmt.Sprintf("Creating configmap %s", desiredConfigMap.Name)) - err := r.Client.Create(context.TODO(), desiredConfigMap) - if err != nil { - return err - } - - return nil -} - -// reconcileNotificationsSecret only creates/deletes the argocd-notifications-secret based on whether notifications is enabled/disabled in the CR -// It does not reconcile/overwrite any fields or information in the secret itself -func (r *ReconcileArgoCD) reconcileNotificationsSecret(cr *argoproj.ArgoCD) error { - - desiredSecret := argoutil.NewSecretWithName(cr, "argocd-notifications-secret") - - secretExists := true - existingSecret := &corev1.Secret{} - if err := argoutil.FetchObject(r.Client, cr.Namespace, desiredSecret.Name, existingSecret); err != nil { - if !errors.IsNotFound(err) { - return fmt.Errorf("failed to get the secret associated with %s : %s", desiredSecret.Name, err) - } - secretExists = false - } - - if secretExists { - // secret exists but shouldn't, so it should be deleted - if !cr.Spec.Notifications.Enabled { - log.Info(fmt.Sprintf("Deleting secret %s as notifications is disabled", existingSecret.Name)) - return r.Client.Delete(context.TODO(), existingSecret) - } - - // secret exists and should, nothing to do here - return nil - } - - // secret doesn't exist and shouldn't, nothing to do here - if !cr.Spec.Notifications.Enabled { - return nil - } - - // secret doesn't exist but should, so it should be created - if err := controllerutil.SetControllerReference(cr, desiredSecret, r.Scheme); err != nil { - return err - } - - log.Info(fmt.Sprintf("Creating secret %s", desiredSecret.Name)) - err := r.Client.Create(context.TODO(), desiredSecret) - if err != nil { - return err - } - - return nil -} - -func getNotificationsCommand(cr *argoproj.ArgoCD) []string { - - cmd := make([]string, 0) - cmd = append(cmd, "argocd-notifications") - - cmd = append(cmd, "--loglevel") - cmd = append(cmd, getLogLevel(cr.Spec.Notifications.LogLevel)) - - return cmd -} - -// getNotificationsResources will return the ResourceRequirements for the Notifications container. -func getNotificationsResources(cr *argoproj.ArgoCD) corev1.ResourceRequirements { - resources := corev1.ResourceRequirements{} - - // Allow override of resource requirements from CR - if cr.Spec.Notifications.Resources != nil { - resources = *cr.Spec.Notifications.Resources - } - - return resources -} diff --git a/controllers/argocd/notifications_test.go b/controllers/argocd/notifications_test.go deleted file mode 100644 index 11bbd5f18..000000000 --- a/controllers/argocd/notifications_test.go +++ /dev/null @@ -1,447 +0,0 @@ -package argocd - -import ( - "context" - "testing" - - "github.com/google/go-cmp/cmp" - "github.com/stretchr/testify/assert" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/controller-runtime/pkg/client" - logf "sigs.k8s.io/controller-runtime/pkg/log" - - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" - "github.com/argoproj-labs/argocd-operator/common" - "github.com/argoproj-labs/argocd-operator/controllers/argoutil" -) - -func TestReconcileNotifications_CreateRoles(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.Notifications.Enabled = true - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - _, err := r.reconcileNotificationsRole(a) - assert.NoError(t, err) - - testRole := &rbacv1.Role{} - assert.NoError(t, r.Client.Get(context.TODO(), types.NamespacedName{ - Name: generateResourceName(common.ArgoCDNotificationsControllerComponent, a), - Namespace: a.Namespace, - }, testRole)) - - desiredPolicyRules := policyRuleForNotificationsController() - - assert.Equal(t, desiredPolicyRules, testRole.Rules) - - a.Spec.Notifications.Enabled = false - _, err = r.reconcileNotificationsRole(a) - assert.NoError(t, err) - - err = r.Client.Get(context.TODO(), types.NamespacedName{ - Name: generateResourceName(common.ArgoCDNotificationsControllerComponent, a), - Namespace: a.Namespace, - }, testRole) - assert.True(t, errors.IsNotFound(err)) -} - -func TestReconcileNotifications_CreateServiceAccount(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.Notifications.Enabled = true - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - desiredSa, err := r.reconcileNotificationsServiceAccount(a) - assert.NoError(t, err) - - testSa := &corev1.ServiceAccount{} - assert.NoError(t, r.Client.Get(context.TODO(), types.NamespacedName{ - Name: generateResourceName(common.ArgoCDNotificationsControllerComponent, a), - Namespace: a.Namespace, - }, testSa)) - - assert.Equal(t, testSa.Name, desiredSa.Name) - - a.Spec.Notifications.Enabled = false - _, err = r.reconcileNotificationsServiceAccount(a) - assert.NoError(t, err) - - err = r.Client.Get(context.TODO(), types.NamespacedName{ - Name: generateResourceName(common.ArgoCDNotificationsControllerComponent, a), - Namespace: a.Namespace, - }, testSa) - assert.True(t, errors.IsNotFound(err)) - -} - -func TestReconcileNotifications_CreateRoleBinding(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.Notifications.Enabled = true - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - role := &rbacv1.Role{ObjectMeta: metav1.ObjectMeta{Name: "role-name"}} - sa := &corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Name: "sa-name"}} - - err := r.reconcileNotificationsRoleBinding(a, role, sa) - assert.NoError(t, err) - - roleBinding := &rbacv1.RoleBinding{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: generateResourceName(common.ArgoCDNotificationsControllerComponent, a), - Namespace: a.Namespace, - }, - roleBinding)) - - assert.Equal(t, roleBinding.RoleRef.Name, role.Name) - assert.Equal(t, roleBinding.Subjects[0].Name, sa.Name) - - a.Spec.Notifications.Enabled = false - err = r.reconcileNotificationsRoleBinding(a, role, sa) - assert.NoError(t, err) - - err = r.Client.Get(context.TODO(), types.NamespacedName{ - Name: generateResourceName(common.ArgoCDNotificationsControllerComponent, a), - Namespace: a.Namespace, - }, roleBinding) - assert.True(t, errors.IsNotFound(err)) -} - -func TestReconcileNotifications_CreateDeployments(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.Notifications.Enabled = true - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - sa := corev1.ServiceAccount{} - - assert.NoError(t, r.reconcileNotificationsDeployment(a, &sa)) - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: a.Name + "-notifications-controller", - Namespace: a.Namespace, - }, - deployment)) - - // Ensure the created Deployment has the expected properties - assert.Equal(t, deployment.Spec.Template.Spec.ServiceAccountName, sa.ObjectMeta.Name) - - want := []corev1.Container{{ - Command: []string{"argocd-notifications", "--loglevel", "info"}, - Image: argoutil.CombineImageTag(common.ArgoCDDefaultArgoImage, common.ArgoCDDefaultArgoVersion), - ImagePullPolicy: corev1.PullAlways, - Name: "argocd-notifications-controller", - SecurityContext: &corev1.SecurityContext{ - AllowPrivilegeEscalation: boolPtr(false), - Capabilities: &corev1.Capabilities{ - Drop: []corev1.Capability{ - "ALL", - }, - }, - }, - VolumeMounts: []corev1.VolumeMount{ - { - Name: "tls-certs", - MountPath: "/app/config/tls", - }, - { - Name: "argocd-repo-server-tls", - MountPath: "/app/config/reposerver/tls", - }, - }, - Resources: corev1.ResourceRequirements{}, - WorkingDir: "/app", - LivenessProbe: &corev1.Probe{ - ProbeHandler: corev1.ProbeHandler{ - TCPSocket: &corev1.TCPSocketAction{ - Port: intstr.IntOrString{ - IntVal: int32(9001), - }, - }, - }, - }, - }} - - if diff := cmp.Diff(want, deployment.Spec.Template.Spec.Containers); diff != "" { - t.Fatalf("failed to reconcile notifications-controller deployment containers:\n%s", diff) - } - - volumes := []corev1.Volume{ - { - Name: "tls-certs", - VolumeSource: corev1.VolumeSource{ - ConfigMap: &corev1.ConfigMapVolumeSource{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "argocd-tls-certs-cm", - }, - }, - }, - }, - { - Name: "argocd-repo-server-tls", - VolumeSource: corev1.VolumeSource{ - Secret: &corev1.SecretVolumeSource{ - SecretName: "argocd-repo-server-tls", - Optional: boolPtr(true), - }, - }, - }, - } - - if diff := cmp.Diff(volumes, deployment.Spec.Template.Spec.Volumes); diff != "" { - t.Fatalf("failed to reconcile notifications-controller deployment volumes:\n%s", diff) - } - - expectedSelector := &metav1.LabelSelector{ - MatchLabels: map[string]string{ - common.ArgoCDKeyName: deployment.Name, - }, - } - - if diff := cmp.Diff(expectedSelector, deployment.Spec.Selector); diff != "" { - t.Fatalf("failed to reconcile notifications-controller label selector:\n%s", diff) - } - - a.Spec.Notifications.Enabled = false - err := r.reconcileNotificationsDeployment(a, &sa) - assert.NoError(t, err) - - err = r.Client.Get(context.TODO(), types.NamespacedName{ - Name: generateResourceName(common.ArgoCDNotificationsControllerComponent, a), - Namespace: a.Namespace, - }, deployment) - assert.True(t, errors.IsNotFound(err)) -} - -func TestReconcileNotifications_CreateSecret(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.Notifications.Enabled = true - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - err := r.reconcileNotificationsSecret(a) - assert.NoError(t, err) - - testSecret := &corev1.Secret{} - assert.NoError(t, r.Client.Get(context.TODO(), types.NamespacedName{ - Name: "argocd-notifications-secret", - Namespace: a.Namespace, - }, testSecret)) - - a.Spec.Notifications.Enabled = false - err = r.reconcileNotificationsSecret(a) - assert.NoError(t, err) - secret := &corev1.Secret{} - err = r.Client.Get(context.TODO(), types.NamespacedName{Name: "argocd-notifications-secret", Namespace: a.Namespace}, secret) - assertNotFound(t, err) -} - -func TestReconcileNotifications_CreateConfigMap(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.Notifications.Enabled = true - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - err := r.reconcileNotificationsConfigMap(a) - assert.NoError(t, err) - - testCm := &corev1.ConfigMap{} - assert.NoError(t, r.Client.Get(context.TODO(), types.NamespacedName{ - Name: "argocd-notifications-cm", - Namespace: a.Namespace, - }, testCm)) - - assert.True(t, len(testCm.Data) > 0) - - a.Spec.Notifications.Enabled = false - err = r.reconcileNotificationsConfigMap(a) - assert.NoError(t, err) - testCm = &corev1.ConfigMap{} - err = r.Client.Get(context.TODO(), types.NamespacedName{Name: "argocd-notifications-cm", Namespace: a.Namespace}, testCm) - assertNotFound(t, err) -} - -func TestReconcileNotifications_testEnvVars(t *testing.T) { - - envMap := []corev1.EnvVar{ - { - Name: "foo", - Value: "bar", - }, - } - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.Notifications.Enabled = true - a.Spec.Notifications.Env = envMap - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - sa := corev1.ServiceAccount{} - assert.NoError(t, r.reconcileNotificationsDeployment(a, &sa)) - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: a.Name + "-notifications-controller", - Namespace: a.Namespace, - }, - deployment)) - - if diff := cmp.Diff(envMap, deployment.Spec.Template.Spec.Containers[0].Env); diff != "" { - t.Fatalf("failed to reconcile notifications-controller deployment env:\n%s", diff) - } - - // Verify any manual updates to the env vars should be overridden by the operator. - unwantedEnv := []corev1.EnvVar{ - { - Name: "foo", - Value: "bar", - }, - { - Name: "ping", - Value: "pong", - }, - } - - deployment.Spec.Template.Spec.Containers[0].Env = unwantedEnv - assert.NoError(t, r.Client.Update(context.TODO(), deployment)) - - // Reconcile back - assert.NoError(t, r.reconcileNotificationsDeployment(a, &sa)) - - // Get the updated deployment - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: a.Name + "-notifications-controller", - Namespace: a.Namespace, - }, - deployment)) - - if diff := cmp.Diff(envMap, deployment.Spec.Template.Spec.Containers[0].Env); diff != "" { - t.Fatalf("operator failed to override the manual changes to notification controller:\n%s", diff) - } -} - -func TestReconcileNotifications_testLogLevel(t *testing.T) { - - testLogLevel := "debug" - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.Notifications.Enabled = true - a.Spec.Notifications.LogLevel = testLogLevel - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - sa := corev1.ServiceAccount{} - assert.NoError(t, r.reconcileNotificationsDeployment(a, &sa)) - - deployment := &appsv1.Deployment{} - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: a.Name + "-notifications-controller", - Namespace: a.Namespace, - }, - deployment)) - - expectedCMD := []string{ - "argocd-notifications", - "--loglevel", - "debug", - } - - if diff := cmp.Diff(expectedCMD, deployment.Spec.Template.Spec.Containers[0].Command); diff != "" { - t.Fatalf("failed to reconcile notifications-controller deployment logLevel:\n%s", diff) - } - - // Verify any manual updates to the logLevel should be overridden by the operator. - unwantedCommand := []string{ - "argocd-notifications", - "--logLevel", - "info", - } - - deployment.Spec.Template.Spec.Containers[0].Command = unwantedCommand - assert.NoError(t, r.Client.Update(context.TODO(), deployment)) - - // Reconcile back - assert.NoError(t, r.reconcileNotificationsDeployment(a, &sa)) - - // Get the updated deployment - assert.NoError(t, r.Client.Get( - context.TODO(), - types.NamespacedName{ - Name: a.Name + "-notifications-controller", - Namespace: a.Namespace, - }, - deployment)) - - if diff := cmp.Diff(expectedCMD, deployment.Spec.Template.Spec.Containers[0].Command); diff != "" { - t.Fatalf("operator failed to override the manual changes to notification controller:\n%s", diff) - } -} diff --git a/controllers/argocd/service_account_test.go b/controllers/argocd/service_account_test.go index 8c5c258b5..9b90f35a7 100644 --- a/controllers/argocd/service_account_test.go +++ b/controllers/argocd/service_account_test.go @@ -20,7 +20,6 @@ import ( "os" "testing" - argoproj "github.com/argoproj-labs/argocd-operator/api/v1beta1" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" v1 "k8s.io/api/rbac/v1" diff --git a/go.mod b/go.mod index 5fea61e37..a2afa2ebc 100644 --- a/go.mod +++ b/go.mod @@ -3,20 +3,12 @@ module github.com/argoproj-labs/argocd-operator go 1.20 require ( -<<<<<<< HEAD github.com/argoproj/argo-cd/v2 v2.9.3 -======= - github.com/argoproj/argo-cd/v2 v2.8.3 ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d github.com/coreos/prometheus-operator v0.40.0 github.com/go-logr/logr v1.2.4 github.com/google/go-cmp v0.5.9 github.com/json-iterator/go v1.1.12 -<<<<<<< HEAD - github.com/onsi/ginkgo v1.16.4 -======= github.com/onsi/ginkgo v1.16.5 ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d github.com/onsi/gomega v1.27.10 github.com/openshift/api v3.9.1-0.20190916204813-cdbe64fb0c91+incompatible github.com/openshift/client-go v0.0.0-20200325131901-f7baeb993edb @@ -25,10 +17,7 @@ require ( github.com/prometheus/client_golang v1.16.0 github.com/sethvargo/go-password v0.2.0 github.com/stretchr/testify v1.8.4 -<<<<<<< HEAD go.uber.org/zap v1.25.0 -======= ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d golang.org/x/mod v0.10.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.28.3 @@ -71,18 +60,10 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/pflag v1.0.5 // indirect go.uber.org/multierr v1.11.0 // indirect -<<<<<<< HEAD golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.11.0 // indirect -======= - go.uber.org/zap v1.25.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.9.0 // indirect ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect diff --git a/go.sum b/go.sum index fa26fdbe9..e75956a2b 100644 --- a/go.sum +++ b/go.sum @@ -649,13 +649,8 @@ github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4x github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -<<<<<<< HEAD github.com/argoproj/argo-cd/v2 v2.9.3 h1:P3oi9WEzi7NkPoinPhv/RCS6vKJT5vmB1YjgZduK0uw= github.com/argoproj/argo-cd/v2 v2.9.3/go.mod h1:+Ve37mJedhW4fpRTpQNbE9VaSmkijET1UgxZOFNi3dI= -======= -github.com/argoproj/argo-cd/v2 v2.8.3 h1:ybJ7eNoP7/u5Vqncais6WeVRBEGmZmriAIwLEKmWHIA= -github.com/argoproj/argo-cd/v2 v2.8.3/go.mod h1:Pkw7r6HKh5k/5Ynl4MvwCG79ktYBk+7PbJxCjXSlT30= ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d github.com/argoproj/pkg v0.13.7-0.20230626144333-d56162821bd1 h1:qsHwwOJ21K2Ao0xPju1sNuqphyMnMYkyB3ZLoLtxWpo= github.com/argoproj/pkg v0.13.7-0.20230626144333-d56162821bd1/go.mod h1:CZHlkyAD1/+FbEn6cB2DQTj48IoLGvEYsWEvtzP3238= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -1504,14 +1499,9 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -<<<<<<< HEAD -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -======= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= @@ -2156,13 +2146,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -<<<<<<< HEAD golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -======= -golang.org/x/oauth2 v0.9.0 h1:BPpt2kU7oMRq3kCHAA1tbSEshXRw1LpG2ztgDwrzuAs= -golang.org/x/oauth2 v0.9.0/go.mod h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw= ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d 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= @@ -2872,10 +2857,6 @@ sigs.k8s.io/kustomize/kustomize/v5 v5.0.4-0.20230601165947-6ce0bf390ce3/go.mod h sigs.k8s.io/kustomize/kyaml v0.14.2/go.mod h1:AN1/IpawKilWD7V+YvQwRGUvuUOOWpjsHu6uHwonSF4= sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -<<<<<<< HEAD -======= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= ->>>>>>> d424ebd71f4d1e67ade00a8b329e3a6e8688950d sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= diff --git a/main.go b/main.go index 041441c6a..1fc231da9 100644 --- a/main.go +++ b/main.go @@ -49,8 +49,6 @@ import ( metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" - metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth"