Skip to content

Commit 0e8fcd5

Browse files
Merge pull request #584 from sector2000/centralize-patterns-operator-config
Cantralize PatternsOperator config
2 parents 5c37f98 + d472f54 commit 0e8fcd5

10 files changed

Lines changed: 83 additions & 123 deletions

File tree

cmd/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func main() {
8686
setupLog.Info("detected operator namespace", "namespace", controllers.DetectOperatorNamespace())
8787

8888
// Create initial config map for gitops
89-
err := createGitOpsConfigMap()
89+
err := createPatternsOperatorConfigMap()
9090
if err != nil {
9191
setupLog.Error(err, "unable to create config map")
9292
}
@@ -165,7 +165,7 @@ func printVersion() {
165165
// Creates the patterns operator configmap
166166
// This will include configuration parameters that
167167
// will allow operator configuration
168-
func createGitOpsConfigMap() error {
168+
func createPatternsOperatorConfigMap() error {
169169
config, err := ctrl.GetConfig()
170170
if err != nil {
171171
return fmt.Errorf("failed to get config: %s", err)

internal/controller/argo.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,7 @@ func newArgoApplication(p *api.Pattern) *argoapi.Application {
911911
return targetApp
912912
}
913913

914-
func newArgoGiteaApplication(p *api.Pattern) *argoapi.Application {
914+
func newArgoGiteaApplication(p *api.Pattern, patternsOperatorConfig PatternsOperatorConfig) *argoapi.Application {
915915
consoleHref := fmt.Sprintf("https://%s-%s.%s", GiteaRouteName, GiteaNamespace, p.Status.AppClusterDomain)
916916
parameters := []argoapi.HelmParameter{
917917
{
@@ -934,9 +934,9 @@ func newArgoGiteaApplication(p *api.Pattern) *argoapi.Application {
934934
},
935935
Project: "default",
936936
Source: &argoapi.ApplicationSource{
937-
RepoURL: PatternsOperatorConfig.getValueWithDefault("gitea.helmRepoUrl"),
938-
TargetRevision: PatternsOperatorConfig.getValueWithDefault("gitea.chartVersion"),
939-
Chart: PatternsOperatorConfig.getValueWithDefault("gitea.chartName"),
937+
RepoURL: patternsOperatorConfig.getValueWithDefault("gitea.helmRepoUrl"),
938+
TargetRevision: patternsOperatorConfig.getValueWithDefault("gitea.chartVersion"),
939+
Chart: patternsOperatorConfig.getValueWithDefault("gitea.chartName"),
940940
Helm: &argoapi.ApplicationSourceHelm{
941941
Parameters: parameters,
942942
},

internal/controller/argo_test.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,9 +1420,12 @@ var _ = Describe("getChildApplications", func() {
14201420

14211421
var _ = Describe("NewArgoGiteaApplication", func() {
14221422
var pattern *api.Pattern
1423+
var patternsOperatorConfig PatternsOperatorConfig
1424+
var app *argoapi.Application
1425+
14231426
BeforeEach(func() {
14241427
tmpFalse := false
1425-
PatternsOperatorConfig = DefaultPatternOperatorConfig
1428+
patternsOperatorConfig = DefaultPatternsOperatorConfig
14261429
pattern = &api.Pattern{
14271430
ObjectMeta: metav1.ObjectMeta{Name: "test-pattern", Namespace: defaultNamespace},
14281431
TypeMeta: metav1.TypeMeta{Kind: "Pattern", APIVersion: api.GroupVersion.String()},
@@ -1444,10 +1447,11 @@ var _ = Describe("NewArgoGiteaApplication", func() {
14441447
ClusterDomain: "hub-cluster.validatedpatterns.io",
14451448
},
14461449
}
1450+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
1451+
14471452
})
14481453

14491454
It("should create a gitea application with correct properties", func() {
1450-
app := newArgoGiteaApplication(pattern)
14511455
Expect(app).ToNot(BeNil())
14521456
Expect(app.Name).To(Equal(GiteaApplicationName))
14531457
Expect(app.Namespace).To(Equal(getClusterWideArgoNamespace()))
@@ -2001,6 +2005,8 @@ var _ = Describe("removeApplication", func() {
20012005

20022006
var _ = Describe("newArgoGiteaApplication", func() {
20032007
var pattern *api.Pattern
2008+
var patternsOperatorConfig PatternsOperatorConfig
2009+
var app *argoapi.Application
20042010

20052011
BeforeEach(func() {
20062012
tmpFalse := false
@@ -2028,37 +2034,37 @@ var _ = Describe("newArgoGiteaApplication", func() {
20282034
ClusterVersion: "4.14.0",
20292035
},
20302036
}
2031-
PatternsOperatorConfig = GitOpsConfig{}
2037+
patternsOperatorConfig = DefaultPatternsOperatorConfig
20322038
})
20332039

20342040
It("should create the Gitea application with correct name", func() {
2035-
app := newArgoGiteaApplication(pattern)
2041+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20362042
Expect(app.Name).To(Equal(GiteaApplicationName))
20372043
Expect(app.Namespace).To(Equal(getClusterWideArgoNamespace()))
20382044
})
20392045

20402046
It("should set the pattern label", func() {
2041-
app := newArgoGiteaApplication(pattern)
2047+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20422048
Expect(app.Labels).To(HaveKeyWithValue("validatedpatterns.io/pattern", "test-pattern"))
20432049
})
20442050

20452051
It("should set the destination namespace to GiteaNamespace", func() {
2046-
app := newArgoGiteaApplication(pattern)
2052+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20472053
Expect(app.Spec.Destination.Namespace).To(Equal(GiteaNamespace))
20482054
})
20492055

20502056
It("should set destination to in-cluster", func() {
2051-
app := newArgoGiteaApplication(pattern)
2057+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20522058
Expect(app.Spec.Destination.Name).To(Equal("in-cluster"))
20532059
})
20542060

20552061
It("should set the project to default", func() {
2056-
app := newArgoGiteaApplication(pattern)
2062+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20572063
Expect(app.Spec.Project).To(Equal("default"))
20582064
})
20592065

20602066
It("should include helm parameters for gitea admin secret and console href", func() {
2061-
app := newArgoGiteaApplication(pattern)
2067+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20622068
Expect(app.Spec.Source).ToNot(BeNil())
20632069
Expect(app.Spec.Source.Helm).ToNot(BeNil())
20642070

@@ -2074,19 +2080,19 @@ var _ = Describe("newArgoGiteaApplication", func() {
20742080
})
20752081

20762082
It("should have the foreground propagation finalizer", func() {
2077-
app := newArgoGiteaApplication(pattern)
2083+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20782084
Expect(controllerutil.ContainsFinalizer(app, argoapi.ForegroundPropagationPolicyFinalizer)).To(BeTrue())
20792085
})
20802086

20812087
It("should set a sync policy when not manual sync", func() {
2082-
app := newArgoGiteaApplication(pattern)
2088+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20832089
Expect(app.Spec.SyncPolicy).ToNot(BeNil())
20842090
Expect(app.Spec.SyncPolicy.Automated).ToNot(BeNil())
20852091
})
20862092

20872093
It("should have nil sync policy when manual sync is enabled", func() {
20882094
pattern.Spec.GitOpsConfig.ManualSync = true
2089-
app := newArgoGiteaApplication(pattern)
2095+
app = newArgoGiteaApplication(pattern, patternsOperatorConfig)
20902096
Expect(app.Spec.SyncPolicy).To(BeNil())
20912097
})
20922098
})

internal/controller/defaults.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ const (
8686
// Experimental Capabilities that can be enabled
8787
// Currently none
8888

89-
var DefaultPatternOperatorConfig = map[string]string{
89+
var DefaultPatternsOperatorConfig = map[string]string{
9090
"gitops.catalogSource": GitOpsDefaultCatalogSource,
9191
"gitops.channel": GitOpsDefaultChannel,
9292
"gitops.sourceNamespace": GitOpsDefaultCatalogSourceNamespace,
@@ -99,15 +99,13 @@ var DefaultPatternOperatorConfig = map[string]string{
9999
"catalog.image": "",
100100
}
101101

102-
type GitOpsConfig map[string]string
102+
type PatternsOperatorConfig map[string]string
103103

104-
var PatternsOperatorConfig GitOpsConfig
105-
106-
func (g GitOpsConfig) getValueWithDefault(k string) string {
104+
func (g PatternsOperatorConfig) getValueWithDefault(k string) string {
107105
if v, present := g[k]; present {
108106
return v
109107
}
110-
if defaultValue, present := DefaultPatternOperatorConfig[k]; present {
108+
if defaultValue, present := DefaultPatternsOperatorConfig[k]; present {
111109
return defaultValue
112110
}
113111
return ""

internal/controller/defaults_test.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import (
55
. "github.com/onsi/gomega"
66
)
77

8-
var _ = Describe("GitOpsConfig getValueWithDefault", func() {
8+
var _ = Describe("PatternsOperatorConfig getValueWithDefault", func() {
99
Context("when the key exists in the config", func() {
1010
It("should return the config value", func() {
11-
config := GitOpsConfig{
11+
config := PatternsOperatorConfig{
1212
"gitops.channel": "custom-channel",
1313
}
1414
Expect(config.getValueWithDefault("gitops.channel")).To(Equal("custom-channel"))
@@ -17,56 +17,56 @@ var _ = Describe("GitOpsConfig getValueWithDefault", func() {
1717

1818
Context("when the key does not exist in config but exists in defaults", func() {
1919
It("should return the default value for gitops.channel", func() {
20-
config := GitOpsConfig{}
20+
config := PatternsOperatorConfig{}
2121
Expect(config.getValueWithDefault("gitops.channel")).To(Equal(GitOpsDefaultChannel))
2222
})
2323

2424
It("should return the default value for gitops.catalogSource", func() {
25-
config := GitOpsConfig{}
25+
config := PatternsOperatorConfig{}
2626
Expect(config.getValueWithDefault("gitops.catalogSource")).To(Equal(GitOpsDefaultCatalogSource))
2727
})
2828

2929
It("should return the default value for gitops.sourceNamespace", func() {
30-
config := GitOpsConfig{}
30+
config := PatternsOperatorConfig{}
3131
Expect(config.getValueWithDefault("gitops.sourceNamespace")).To(Equal(GitOpsDefaultCatalogSourceNamespace))
3232
})
3333

3434
It("should return the default value for gitops.installApprovalPlan", func() {
35-
config := GitOpsConfig{}
35+
config := PatternsOperatorConfig{}
3636
Expect(config.getValueWithDefault("gitops.installApprovalPlan")).To(Equal(GitOpsDefaultApprovalPlan))
3737
})
3838

3939
It("should return the default value for gitea.chartName", func() {
40-
config := GitOpsConfig{}
40+
config := PatternsOperatorConfig{}
4141
Expect(config.getValueWithDefault("gitea.chartName")).To(Equal(GiteaChartName))
4242
})
4343

4444
It("should return the default value for gitea.helmRepoUrl", func() {
45-
config := GitOpsConfig{}
45+
config := PatternsOperatorConfig{}
4646
Expect(config.getValueWithDefault("gitea.helmRepoUrl")).To(Equal(GiteaHelmRepoUrl))
4747
})
4848

4949
It("should return the default value for gitea.chartVersion", func() {
50-
config := GitOpsConfig{}
50+
config := PatternsOperatorConfig{}
5151
Expect(config.getValueWithDefault("gitea.chartVersion")).To(Equal(GiteaDefaultChartVersion))
5252
})
5353

5454
It("should return the default value for analytics.enabled", func() {
55-
config := GitOpsConfig{}
55+
config := PatternsOperatorConfig{}
5656
Expect(config.getValueWithDefault("analytics.enabled")).To(Equal("true"))
5757
})
5858
})
5959

6060
Context("when the key does not exist in config or defaults", func() {
6161
It("should return an empty string", func() {
62-
config := GitOpsConfig{}
62+
config := PatternsOperatorConfig{}
6363
Expect(config.getValueWithDefault("nonexistent.key")).To(Equal(""))
6464
})
6565
})
6666

6767
Context("when config overrides a default value", func() {
6868
It("should return the overridden value, not the default", func() {
69-
config := GitOpsConfig{
69+
config := PatternsOperatorConfig{
7070
"gitops.channel": "gitops-1.99",
7171
}
7272
Expect(config.getValueWithDefault("gitops.channel")).To(Equal("gitops-1.99"))
@@ -75,13 +75,13 @@ var _ = Describe("GitOpsConfig getValueWithDefault", func() {
7575

7676
Context("when config is nil", func() {
7777
It("should return the default value", func() {
78-
var config GitOpsConfig
78+
var config PatternsOperatorConfig
7979
Expect(config.getValueWithDefault("gitops.channel")).To(Equal(GitOpsDefaultChannel))
8080
})
8181
})
8282
})
8383

84-
var _ = Describe("DefaultPatternOperatorConfig", func() {
84+
var _ = Describe("DefaultPatternsOperatorConfig", func() {
8585
It("should contain all expected keys", func() {
8686
expectedKeys := []string{
8787
"gitops.catalogSource",
@@ -94,14 +94,14 @@ var _ = Describe("DefaultPatternOperatorConfig", func() {
9494
"analytics.enabled",
9595
}
9696
for _, key := range expectedKeys {
97-
Expect(DefaultPatternOperatorConfig).To(HaveKey(key))
97+
Expect(DefaultPatternsOperatorConfig).To(HaveKey(key))
9898
}
9999
})
100100

101101
It("should have correct default values", func() {
102-
Expect(DefaultPatternOperatorConfig["gitops.catalogSource"]).To(Equal("redhat-operators"))
103-
Expect(DefaultPatternOperatorConfig["gitops.sourceNamespace"]).To(Equal("openshift-marketplace"))
104-
Expect(DefaultPatternOperatorConfig["gitops.installApprovalPlan"]).To(Equal("Automatic"))
105-
Expect(DefaultPatternOperatorConfig["analytics.enabled"]).To(Equal("true"))
102+
Expect(DefaultPatternsOperatorConfig["gitops.catalogSource"]).To(Equal("redhat-operators"))
103+
Expect(DefaultPatternsOperatorConfig["gitops.sourceNamespace"]).To(Equal("openshift-marketplace"))
104+
Expect(DefaultPatternsOperatorConfig["gitops.installApprovalPlan"]).To(Equal("Automatic"))
105+
Expect(DefaultPatternsOperatorConfig["analytics.enabled"]).To(Equal("true"))
106106
})
107107
})

internal/controller/pattern_controller.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,17 @@ func (r *PatternReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
150150
return reconcile.Result{}, err
151151
}
152152

153+
patternsOperatorConfig := DefaultPatternsOperatorConfig
154+
155+
configCM, err := GetPatternsOperatorConfigMap()
156+
// If we hit an error that is not related to the configmap not existing bubble it up
157+
if err != nil && !kerrors.IsNotFound(err) {
158+
return r.actionPerformed(instance, "failed to get the configuration ConfigMap", err)
159+
}
160+
if configCM != nil {
161+
patternsOperatorConfig = configCM.Data
162+
}
163+
153164
// Remove the ArgoCD application on deletion
154165
if instance.DeletionTimestamp.IsZero() {
155166
// Add finalizer when object is created
@@ -198,7 +209,7 @@ func (r *PatternReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
198209
}
199210

200211
// -- GitOps Subscription
201-
if done, result, subErr := r.reconcileGitOpsSubscription(qualifiedInstance); done {
212+
if done, result, subErr := r.reconcileGitOpsSubscription(qualifiedInstance, patternsOperatorConfig); done {
202213
return result, subErr
203214
}
204215
logOnce("subscription found")
@@ -262,7 +273,7 @@ func (r *PatternReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
262273

263274
// If you specified OriginRepo then we automatically spawn a gitea instance via a special argo gitea application
264275
if qualifiedInstance.Spec.GitConfig.OriginRepo != "" {
265-
giteaErr := r.createGiteaInstance(qualifiedInstance)
276+
giteaErr := r.createGiteaInstance(qualifiedInstance, patternsOperatorConfig)
266277
if giteaErr != nil {
267278
return r.actionPerformed(qualifiedInstance, "error created gitea instance", giteaErr)
268279
}
@@ -339,16 +350,12 @@ func (r *PatternReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
339350

340351
// reconcileGitOpsSubscription ensures the GitOps operator subscription exists and is up-to-date.
341352
// It returns (done, result, err) — when done is true the caller should return result/err immediately.
342-
func (r *PatternReconciler) reconcileGitOpsSubscription(qualifiedInstance *api.Pattern) (done bool, result ctrl.Result, err error) {
353+
func (r *PatternReconciler) reconcileGitOpsSubscription(qualifiedInstance *api.Pattern, patternsOperatorConfig PatternsOperatorConfig) (done bool, result ctrl.Result, err error) {
343354
// Only disable the default ArgoCD instance for non-legacy deployments.
344355
// For legacy deployments, the gitops-operator's default instance is still in use.
345356
disableDefault := !isLegacyArgoNamespace()
346-
targetSub, err := newSubscriptionFromConfigMap(r.fullClient, disableDefault)
357+
targetSub := newSubscription(patternsOperatorConfig, disableDefault)
347358

348-
if err != nil {
349-
res, e := r.actionPerformed(qualifiedInstance, "error creating new subscription from configmap", err)
350-
return true, res, e
351-
}
352359
subscriptionName, subscriptionNamespace := DetectGitOpsSubscription()
353360
// If the pattern operator is installed to the new vp namespace we need to create a ns, operatorgroup for the new sub
354361
if DetectOperatorNamespace() != LegacyOperatorNamespace {
@@ -392,7 +399,7 @@ func (r *PatternReconciler) reconcileGitOpsSubscription(qualifiedInstance *api.P
392399
if err := controllerutil.RemoveOwnerReference(qualifiedInstance, currentSub, r.Scheme); err == nil {
393400
changed = true
394401
}
395-
operatorConfigMap, cmErr := GetOperatorConfigmap()
402+
operatorConfigMap, cmErr := GetPatternsOperatorConfigMap()
396403
if cmErr == nil {
397404
if err := controllerutil.RemoveOwnerReference(operatorConfigMap, currentSub, r.Scheme); err == nil {
398405
changed = true
@@ -418,7 +425,7 @@ func (r *PatternReconciler) reconcileGitOpsSubscription(qualifiedInstance *api.P
418425
return false, ctrl.Result{}, nil
419426
}
420427

421-
func (r *PatternReconciler) createGiteaInstance(input *api.Pattern) error {
428+
func (r *PatternReconciler) createGiteaInstance(input *api.Pattern, patternsOperatorConfig PatternsOperatorConfig) error {
422429
gitConfig := input.Spec.GitConfig
423430
clusterWideNS := getClusterWideArgoNamespace()
424431
// The reason we create the vp-gitea namespace and and the
@@ -449,7 +456,7 @@ func (r *PatternReconciler) createGiteaInstance(input *api.Pattern) error {
449456
}
450457

451458
log.Printf("Origin repo is set, creating gitea instance: %s", gitConfig.OriginRepo)
452-
giteaApp := newArgoGiteaApplication(input)
459+
giteaApp := newArgoGiteaApplication(input, patternsOperatorConfig)
453460
_ = controllerutil.SetOwnerReference(input, giteaApp, r.Scheme)
454461
app, err := getApplication(r.argoClient, GiteaApplicationName, clusterWideNS)
455462
if app == nil {

0 commit comments

Comments
 (0)