Skip to content

Commit d5b647f

Browse files
committed
configurable template version lock
1 parent cd04440 commit d5b647f

File tree

7 files changed

+83
-46
lines changed

7 files changed

+83
-46
lines changed

cyclops-ctrl/.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ WATCH_NAMESPACE=cyclops
44
WATCH_NAMESPACE_HELM=
55
CYCLOPS_VERSION=v0.0.0
66
MODULE_TARGET_NAMESPACE=
7+
MODULE_DISABLE_TEMPLATE_VERSION_LOCK=

cyclops-ctrl/api/v1alpha1/module_types.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,18 @@ type ModuleList struct {
147147
Items []Module `json:"items"`
148148
}
149149

150+
func (m *Module) TemplateResolvedVersion(disableTemplateVersionLock bool) string {
151+
if disableTemplateVersionLock {
152+
return m.Spec.TemplateRef.Version
153+
}
154+
155+
if len(m.Status.TemplateResolvedVersion) == 0 {
156+
return m.Spec.TemplateRef.Version
157+
}
158+
159+
return m.Status.TemplateResolvedVersion
160+
}
161+
150162
func init() {
151163
SchemeBuilder.Register(&Module{}, &ModuleList{})
152164
}

cyclops-ctrl/cmd/main/main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ func main() {
7676
watchNamespace := getWatchNamespace()
7777
helmWatchNamespace := getHelmWatchNamespace()
7878
moduleTargetNamespace := getModuleTargetNamespace()
79+
disableTemplateVersionLock := getEnvBool("MODULE_DISABLE_TEMPLATE_VERSION_LOCK")
7980

8081
k8sClient, err := k8sclient.New(
8182
watchNamespace,
@@ -107,7 +108,7 @@ func main() {
107108
helmReleaseClient := helm.NewReleaseClient(helmWatchNamespace, k8sClient)
108109
gitWriteClient := git.NewWriteClient(credsResolver, getCommitMessageTemplate(), setupLog)
109110

110-
handler, err := handler.New(templatesRepo, k8sClient, helmReleaseClient, renderer, gitWriteClient, moduleTargetNamespace, telemetryClient, monitor)
111+
handler, err := handler.New(templatesRepo, k8sClient, helmReleaseClient, renderer, gitWriteClient, moduleTargetNamespace, disableTemplateVersionLock, telemetryClient, monitor)
111112
if err != nil {
112113
panic(err)
113114
}
@@ -142,6 +143,7 @@ func main() {
142143
templatesRepo,
143144
k8sClient,
144145
renderer,
146+
disableTemplateVersionLock,
145147
telemetryClient,
146148
monitor,
147149
)).SetupWithManager(mgr); err != nil {

cyclops-ctrl/internal/controller/modules.go

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ type Modules struct {
3131
renderer *render.Renderer
3232
gitWriteClient *git.WriteClient
3333

34-
moduleTargetNamespace string
34+
moduleTargetNamespace string
35+
disableTemplateVersionLock bool
3536

3637
telemetryClient telemetry.Client
3738
monitor prometheus.Monitor
@@ -43,17 +44,19 @@ func NewModulesController(
4344
renderer *render.Renderer,
4445
gitWriteClient *git.WriteClient,
4546
moduleTargetNamespace string,
47+
disableTemplateVersionLock bool,
4648
telemetryClient telemetry.Client,
4749
monitor prometheus.Monitor,
4850
) *Modules {
4951
return &Modules{
50-
kubernetesClient: kubernetes,
51-
templatesRepo: templatesRepo,
52-
renderer: renderer,
53-
gitWriteClient: gitWriteClient,
54-
moduleTargetNamespace: moduleTargetNamespace,
55-
telemetryClient: telemetryClient,
56-
monitor: monitor,
52+
kubernetesClient: kubernetes,
53+
templatesRepo: templatesRepo,
54+
renderer: renderer,
55+
gitWriteClient: gitWriteClient,
56+
moduleTargetNamespace: moduleTargetNamespace,
57+
disableTemplateVersionLock: disableTemplateVersionLock,
58+
telemetryClient: telemetryClient,
59+
monitor: monitor,
5760
}
5861
}
5962

@@ -243,7 +246,7 @@ func (m *Modules) CurrentManifest(ctx *gin.Context) {
243246
module.Spec.TemplateRef.URL,
244247
module.Spec.TemplateRef.Path,
245248
module.Spec.TemplateRef.Version,
246-
module.Status.TemplateResolvedVersion,
249+
module.TemplateResolvedVersion(m.disableTemplateVersionLock),
247250
module.Spec.TemplateRef.SourceType,
248251
)
249252
if err != nil {
@@ -540,8 +543,8 @@ func (m *Modules) ResourcesForModule(ctx *gin.Context) {
540543
t, err := m.templatesRepo.GetTemplate(
541544
module.Spec.TemplateRef.URL,
542545
module.Spec.TemplateRef.Path,
543-
templateVersion,
544-
module.Status.TemplateResolvedVersion,
546+
module.TemplateResolvedVersion(m.disableTemplateVersionLock),
547+
"",
545548
module.Spec.TemplateRef.SourceType,
546549
)
547550
if err != nil {
@@ -587,7 +590,7 @@ func (m *Modules) Template(ctx *gin.Context) {
587590
module.Spec.TemplateRef.URL,
588591
module.Spec.TemplateRef.Path,
589592
module.Spec.TemplateRef.Version,
590-
module.Status.TemplateResolvedVersion,
593+
module.TemplateResolvedVersion(m.disableTemplateVersionLock),
591594
module.Spec.TemplateRef.SourceType,
592595
)
593596
if err != nil {
@@ -607,7 +610,7 @@ func (m *Modules) Template(ctx *gin.Context) {
607610
module.Spec.TemplateRef.URL,
608611
module.Spec.TemplateRef.Path,
609612
module.Spec.TemplateRef.Version,
610-
module.Status.TemplateResolvedVersion,
613+
module.TemplateResolvedVersion(m.disableTemplateVersionLock),
611614
module.Spec.TemplateRef.SourceType,
612615
)
613616
if err != nil {
@@ -645,7 +648,7 @@ func (m *Modules) HelmTemplate(ctx *gin.Context) {
645648
module.Spec.TemplateRef.URL,
646649
module.Spec.TemplateRef.Path,
647650
module.Spec.TemplateRef.Version,
648-
module.Status.TemplateResolvedVersion,
651+
module.TemplateResolvedVersion(m.disableTemplateVersionLock),
649652
module.Spec.TemplateRef.SourceType,
650653
)
651654
if err != nil {

cyclops-ctrl/internal/git/writeclient.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"github.com/go-logr/logr"
8+
json "github.com/json-iterator/go"
89
path2 "path"
910
"text/template"
1011
"time"
@@ -57,8 +58,17 @@ func getModulePath(module cyclopsv1alpha1.Module) (string, error) {
5758
return "", err
5859
}
5960

61+
moduleMap := make(map[string]interface{})
62+
moduleData, err := json.Marshal(module)
63+
if err != nil {
64+
return "", err
65+
}
66+
if err := json.Unmarshal(moduleData, &moduleMap); err != nil {
67+
return "", err
68+
}
69+
6070
var o bytes.Buffer
61-
err = tmpl.Execute(&o, module)
71+
err = tmpl.Execute(&o, moduleMap)
6272
if err != nil {
6373
return "", err
6474
}

cyclops-ctrl/internal/handler/handler.go

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ type Handler struct {
2424
renderer *render.Renderer
2525
gitWriteClient *git.WriteClient
2626

27-
moduleTargetNamespace string
27+
moduleTargetNamespace string
28+
disableTemplateVersionLock bool
2829

2930
telemetryClient telemetry.Client
3031
monitor prometheus.Monitor
@@ -37,26 +38,37 @@ func New(
3738
renderer *render.Renderer,
3839
gitWriteClient *git.WriteClient,
3940
moduleTargetNamespace string,
41+
disableTemplateVersionLock bool,
4042
telemetryClient telemetry.Client,
4143
monitor prometheus.Monitor,
4244
) (*Handler, error) {
4345
return &Handler{
44-
templatesRepo: templatesRepo,
45-
k8sClient: kubernetesClient,
46-
renderer: renderer,
47-
releaseClient: releaseClient,
48-
gitWriteClient: gitWriteClient,
49-
moduleTargetNamespace: moduleTargetNamespace,
50-
telemetryClient: telemetryClient,
51-
monitor: monitor,
46+
templatesRepo: templatesRepo,
47+
k8sClient: kubernetesClient,
48+
renderer: renderer,
49+
releaseClient: releaseClient,
50+
gitWriteClient: gitWriteClient,
51+
moduleTargetNamespace: moduleTargetNamespace,
52+
disableTemplateVersionLock: disableTemplateVersionLock,
53+
telemetryClient: telemetryClient,
54+
monitor: monitor,
5255
}, nil
5356
}
5457

5558
func (h *Handler) Start() error {
5659
gin.SetMode(gin.DebugMode)
5760

5861
templatesController := controller.NewTemplatesController(h.templatesRepo, h.k8sClient, h.telemetryClient)
59-
modulesController := controller.NewModulesController(h.templatesRepo, h.k8sClient, h.renderer, h.gitWriteClient, h.moduleTargetNamespace, h.telemetryClient, h.monitor)
62+
modulesController := controller.NewModulesController(
63+
h.templatesRepo,
64+
h.k8sClient,
65+
h.renderer,
66+
h.gitWriteClient,
67+
h.moduleTargetNamespace,
68+
h.disableTemplateVersionLock,
69+
h.telemetryClient,
70+
h.monitor,
71+
)
6072
clusterController := controller.NewClusterController(h.k8sClient)
6173
helmController := controller.NewHelmController(h.k8sClient, h.releaseClient, h.telemetryClient)
6274

cyclops-ctrl/internal/modulecontroller/module_controller.go

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ type ModuleReconciler struct {
5454
kubernetesClient k8sclient.IKubernetesClient
5555
renderer *render.Renderer
5656

57+
disableTemplateVersionLock bool
58+
5759
telemetryClient telemetry.Client
5860
monitor prometheus.Monitor
5961
logger logr.Logger
@@ -65,18 +67,20 @@ func NewModuleReconciler(
6567
templatesRepo templaterepo.ITemplateRepo,
6668
kubernetesClient k8sclient.IKubernetesClient,
6769
renderer *render.Renderer,
70+
disableTemplateVersionLock bool,
6871
telemetryClient telemetry.Client,
6972
monitor prometheus.Monitor,
7073
) *ModuleReconciler {
7174
return &ModuleReconciler{
72-
Client: client,
73-
Scheme: scheme,
74-
templatesRepo: templatesRepo,
75-
kubernetesClient: kubernetesClient,
76-
renderer: renderer,
77-
telemetryClient: telemetryClient,
78-
monitor: monitor,
79-
logger: ctrl.Log.WithName("reconciler"),
75+
Client: client,
76+
Scheme: scheme,
77+
templatesRepo: templatesRepo,
78+
kubernetesClient: kubernetesClient,
79+
renderer: renderer,
80+
disableTemplateVersionLock: disableTemplateVersionLock,
81+
telemetryClient: telemetryClient,
82+
monitor: monitor,
83+
logger: ctrl.Log.WithName("reconciler"),
8084
}
8185
}
8286

@@ -86,13 +90,6 @@ func NewModuleReconciler(
8690

8791
// Reconcile is part of the main kubernetes reconciliation loop which aims to
8892
// move the current state of the cluster closer to the desired state.
89-
// TODO(user): Modify the Reconcile function to compare the state specified by
90-
// the Module object against the actual cluster state, and then
91-
// perform operations to make the cluster state reflect the state specified by
92-
// the user.
93-
//
94-
// For more details, check Reconcile and its Result here:
95-
// - https://pkg.go.dev/sigs.k8s.io/[email protected]/pkg/reconcile
9693
func (r *ModuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
9794
_ = log.FromContext(ctx)
9895
r.telemetryClient.ModuleReconciliation()
@@ -137,16 +134,16 @@ func (r *ModuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
137134

138135
r.logger.Info("upsert module", "namespaced name", req.NamespacedName)
139136

140-
templateVersion := module.Status.TemplateResolvedVersion
141-
if len(templateVersion) == 0 {
142-
templateVersion = module.Spec.TemplateRef.Version
143-
}
137+
templateVersion := module.TemplateResolvedVersion(r.disableTemplateVersionLock)
138+
//if len(templateVersion) == 0 {
139+
// templateVersion = module.Spec.TemplateRef.Version
140+
//}
144141

145142
template, err := r.templatesRepo.GetTemplate(
146143
module.Spec.TemplateRef.URL,
147144
module.Spec.TemplateRef.Path,
148145
templateVersion,
149-
module.Status.TemplateResolvedVersion,
146+
"",
150147
module.Spec.TemplateRef.SourceType,
151148
)
152149
if err != nil {

0 commit comments

Comments
 (0)