Skip to content

Commit e9c3aab

Browse files
authoredApr 12, 2020
Merge pull request fluxcd#10 from fluxcd/factor-out-ctrl-kind
Factor out kind injection into controllers
2 parents bb8ec6e + 4bde6bf commit e9c3aab

File tree

5 files changed

+53
-44
lines changed

5 files changed

+53
-44
lines changed
 

Diff for: ‎controllers/gitrepository_controller.go

+20-19
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"k8s.io/apimachinery/pkg/types"
3939
ctrl "sigs.k8s.io/controller-runtime"
4040
"sigs.k8s.io/controller-runtime/pkg/client"
41+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
4142
"sigs.k8s.io/controller-runtime/pkg/event"
4243
"sigs.k8s.io/controller-runtime/pkg/predicate"
4344

@@ -50,7 +51,6 @@ type GitRepositoryReconciler struct {
5051
Log logr.Logger
5152
Scheme *runtime.Scheme
5253
Storage *Storage
53-
Kind string
5454
}
5555

5656
// +kubebuilder:rbac:groups=source.fluxcd.io,resources=gitrepositories,verbs=get;list;watch;create;update;patch;delete
@@ -60,16 +60,16 @@ func (r *GitRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, erro
6060
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
6161
defer cancel()
6262

63-
log := r.Log.WithValues(r.Kind, req.NamespacedName)
64-
6563
var repo sourcev1.GitRepository
6664
if err := r.Get(ctx, req.NamespacedName, &repo); err != nil {
6765
return ctrl.Result{}, client.IgnoreNotFound(err)
6866
}
6967

68+
log := r.Log.WithValues(repo.Kind, req.NamespacedName)
69+
7070
// set initial status
7171
if reset, status := r.shouldResetStatus(repo); reset {
72-
log.Info("Initializing repository")
72+
log.Info("Initializing Git repository")
7373
repo.Status = status
7474
if err := r.Status().Update(ctx, &repo); err != nil {
7575
log.Error(err, "unable to update GitRepository status")
@@ -83,7 +83,7 @@ func (r *GitRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, erro
8383
// try git clone
8484
syncedRepo, err := r.sync(*repo.DeepCopy())
8585
if err != nil {
86-
log.Info("Repository sync failed", "error", err.Error())
86+
log.Info("Git repository sync failed", "error", err.Error())
8787
}
8888

8989
// update status
@@ -92,7 +92,7 @@ func (r *GitRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, erro
9292
return ctrl.Result{Requeue: true}, err
9393
}
9494

95-
log.Info("Repository sync succeeded", "msg", sourcev1.GitRepositoryReadyMessage(syncedRepo))
95+
log.Info("Git repository sync succeeded", "msg", sourcev1.GitRepositoryReadyMessage(syncedRepo))
9696

9797
// requeue repository
9898
return ctrl.Result{RequeueAfter: repo.Spec.Interval.Duration}, nil
@@ -104,16 +104,21 @@ func (r *GitRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error {
104104
WithEventFilter(RepositoryChangePredicate{}).
105105
WithEventFilter(predicate.Funcs{
106106
DeleteFunc: func(e event.DeleteEvent) bool {
107+
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
108+
if err != nil {
109+
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
110+
return false
111+
}
107112
// delete artifacts
108-
artifact := r.Storage.ArtifactFor(r.Kind, e.Meta, "dummy", "")
113+
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
109114
if err := r.Storage.RemoveAll(artifact); err != nil {
110115
r.Log.Error(err, "unable to delete artifacts",
111-
r.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
116+
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
112117
} else {
113-
r.Log.Info("Repository artifacts deleted",
114-
r.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
118+
r.Log.Info("Git repository artifacts deleted",
119+
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
115120
}
116-
return false
121+
return true
117122
},
118123
}).
119124
Complete(r)
@@ -199,7 +204,7 @@ func (r *GitRepositoryReconciler) sync(repository sourcev1.GitRepository) (sourc
199204
Force: true,
200205
})
201206
if err != nil {
202-
err = fmt.Errorf("git checkout %s for %s error: %w", commit, branch, err)
207+
err = fmt.Errorf("git checkout '%s' for '%s' error: %w", commit, branch, err)
203208
return sourcev1.GitRepositoryNotReady(repository, sourcev1.GitOperationFailedReason, err.Error()), err
204209
}
205210
} else if exp := repository.Spec.Reference.SemVer; exp != "" {
@@ -222,7 +227,7 @@ func (r *GitRepositoryReconciler) sync(repository sourcev1.GitRepository) (sourc
222227
})
223228

224229
svTags := make(map[string]string)
225-
svers := []semver.Version{}
230+
var svers []semver.Version
226231
for tag, _ := range tags {
227232
v, _ := semver.ParseTolerant(tag)
228233
if rng(v) {
@@ -269,7 +274,7 @@ func (r *GitRepositoryReconciler) sync(repository sourcev1.GitRepository) (sourc
269274
revision = fmt.Sprintf("%s/%s", branch, ref.Hash().String())
270275
}
271276

272-
artifact := r.Storage.ArtifactFor(r.Kind, repository.ObjectMeta.GetObjectMeta(),
277+
artifact := r.Storage.ArtifactFor(repository.Kind, repository.ObjectMeta.GetObjectMeta(),
273278
fmt.Sprintf("%s.tar.gz", ref.Hash().String()), revision)
274279

275280
// create artifact dir
@@ -301,7 +306,7 @@ func (r *GitRepositoryReconciler) sync(repository sourcev1.GitRepository) (sourc
301306
return sourcev1.GitRepositoryNotReady(repository, sourcev1.StorageOperationFailedReason, err.Error()), err
302307
}
303308

304-
message := fmt.Sprintf("Artifact is available at: %s", artifact.Path)
309+
message := fmt.Sprintf("Git repoistory artifacts are available at: %s", artifact.Path)
305310
return sourcev1.GitRepositoryReady(repository, artifact, url, sourcev1.GitOperationSucceedReason, message), nil
306311
}
307312

@@ -361,13 +366,9 @@ func (r *GitRepositoryReconciler) auth(repository sourcev1.GitRepository, tmp st
361366
auth := &http.BasicAuth{}
362367
if username, ok := credentials["username"]; ok {
363368
auth.Username = string(username)
364-
} else {
365-
return nil, fmt.Errorf("%s secret does not contain username", repository.Spec.SecretRef.Name)
366369
}
367370
if password, ok := credentials["password"]; ok {
368371
auth.Password = string(password)
369-
} else {
370-
return nil, fmt.Errorf("%s secret does not contain password", repository.Spec.SecretRef.Name)
371372
}
372373

373374
if auth.Username == "" || auth.Password == "" {

Diff for: ‎controllers/helmchart_controller.go

+11-6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/apimachinery/pkg/types"
3434
ctrl "sigs.k8s.io/controller-runtime"
3535
"sigs.k8s.io/controller-runtime/pkg/client"
36+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3637
"sigs.k8s.io/controller-runtime/pkg/event"
3738
"sigs.k8s.io/controller-runtime/pkg/predicate"
3839
"sigs.k8s.io/yaml"
@@ -46,7 +47,6 @@ type HelmChartReconciler struct {
4647
Log logr.Logger
4748
Scheme *runtime.Scheme
4849
Storage *Storage
49-
Kind string
5050
Getters getter.Providers
5151
}
5252

@@ -90,7 +90,7 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
9090
// try to pull chart
9191
pulledChart, err := r.sync(repository, *chart.DeepCopy())
9292
if err != nil {
93-
log.Info("Helm chart pull failed", "error", err.Error())
93+
log.Info("Helm chart sync failed", "error", err.Error())
9494
}
9595

9696
// update status
@@ -111,16 +111,21 @@ func (r *HelmChartReconciler) SetupWithManager(mgr ctrl.Manager) error {
111111
WithEventFilter(RepositoryChangePredicate{}).
112112
WithEventFilter(predicate.Funcs{
113113
DeleteFunc: func(e event.DeleteEvent) bool {
114+
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
115+
if err != nil {
116+
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
117+
return false
118+
}
114119
// delete artifacts
115-
artifact := r.Storage.ArtifactFor(r.Kind, e.Meta, "", "")
120+
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
116121
if err := r.Storage.RemoveAll(artifact); err != nil {
117122
r.Log.Error(err, "unable to delete artifacts",
118-
r.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
123+
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
119124
} else {
120125
r.Log.Info("Helm chart artifacts deleted",
121-
r.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
126+
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
122127
}
123-
return false
128+
return true
124129
},
125130
}).
126131
Complete(r)

Diff for: ‎controllers/helmrepository_controller.go

+19-14
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"k8s.io/apimachinery/pkg/runtime"
3333
ctrl "sigs.k8s.io/controller-runtime"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
35+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3536
"sigs.k8s.io/controller-runtime/pkg/event"
3637
"sigs.k8s.io/controller-runtime/pkg/predicate"
3738
"sigs.k8s.io/yaml"
@@ -45,7 +46,6 @@ type HelmRepositoryReconciler struct {
4546
Log logr.Logger
4647
Scheme *runtime.Scheme
4748
Storage *Storage
48-
Kind string
4949
Getters getter.Providers
5050
}
5151

@@ -56,16 +56,16 @@ func (r *HelmRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, err
5656
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
5757
defer cancel()
5858

59-
log := r.Log.WithValues(r.Kind, req.NamespacedName)
60-
6159
var repository sourcev1.HelmRepository
6260
if err := r.Get(ctx, req.NamespacedName, &repository); err != nil {
6361
return ctrl.Result{}, client.IgnoreNotFound(err)
6462
}
6563

64+
log := r.Log.WithValues(repository.Kind, req.NamespacedName)
65+
6666
// set initial status
6767
if reset, status := r.shouldResetStatus(repository); reset {
68-
log.Info("Initializing repository")
68+
log.Info("Initializing Helm repository")
6969
repository.Status = status
7070
if err := r.Status().Update(ctx, &repository); err != nil {
7171
log.Error(err, "unable to update HelmRepository status")
@@ -79,7 +79,7 @@ func (r *HelmRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, err
7979
// try to download index
8080
syncedRepo, err := r.sync(*repository.DeepCopy())
8181
if err != nil {
82-
log.Info("Helm repository index failed", "error", err.Error())
82+
log.Info("Helm repository sync failed", "error", err.Error())
8383
}
8484

8585
// update status
@@ -88,7 +88,7 @@ func (r *HelmRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, err
8888
return ctrl.Result{Requeue: true}, err
8989
}
9090

91-
log.Info("Repository sync succeeded", "msg", sourcev1.HelmRepositoryReadyMessage(syncedRepo))
91+
log.Info("Helm repository sync succeeded", "msg", sourcev1.HelmRepositoryReadyMessage(syncedRepo))
9292

9393
// requeue repository
9494
return ctrl.Result{RequeueAfter: repository.Spec.Interval.Duration}, nil
@@ -100,16 +100,21 @@ func (r *HelmRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error {
100100
WithEventFilter(RepositoryChangePredicate{}).
101101
WithEventFilter(predicate.Funcs{
102102
DeleteFunc: func(e event.DeleteEvent) bool {
103+
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
104+
if err != nil {
105+
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
106+
return false
107+
}
103108
// delete artifacts
104-
artifact := r.Storage.ArtifactFor(r.Kind, e.Meta, "", "")
109+
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
105110
if err := r.Storage.RemoveAll(artifact); err != nil {
106111
r.Log.Error(err, "unable to delete artifacts",
107-
r.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
112+
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
108113
} else {
109-
r.Log.Info("Repository artifacts deleted",
110-
r.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
114+
r.Log.Info("Helm repository artifacts deleted",
115+
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
111116
}
112-
return false
117+
return true
113118
},
114119
}).
115120
Complete(r)
@@ -152,7 +157,7 @@ func (r *HelmRepositoryReconciler) sync(repository sourcev1.HelmRepository) (sou
152157
}
153158

154159
sum := r.Storage.Checksum(index)
155-
artifact := r.Storage.ArtifactFor(r.Kind, repository.ObjectMeta.GetObjectMeta(),
160+
artifact := r.Storage.ArtifactFor(repository.Kind, repository.ObjectMeta.GetObjectMeta(),
156161
fmt.Sprintf("index-%s.yaml", sum), sum)
157162

158163
// create artifact dir
@@ -180,11 +185,11 @@ func (r *HelmRepositoryReconciler) sync(repository sourcev1.HelmRepository) (sou
180185
// update index symlink
181186
indexUrl, err := r.Storage.Symlink(artifact, "index.yaml")
182187
if err != nil {
183-
err = fmt.Errorf("storage error %w", err)
188+
err = fmt.Errorf("storage error: %w", err)
184189
return sourcev1.HelmRepositoryNotReady(repository, sourcev1.StorageOperationFailedReason, err.Error()), err
185190
}
186191

187-
message := fmt.Sprintf("Index is available at %s", artifact.Path)
192+
message := fmt.Sprintf("Helm repository index is available at: %s", artifact.Path)
188193
return sourcev1.HelmRepositoryReady(repository, artifact, indexUrl, sourcev1.IndexationSucceededReason, message), nil
189194
}
190195

Diff for: ‎controllers/storage.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ type Storage struct {
4848
// NewStorage creates the storage helper for a given path and hostname
4949
func NewStorage(basePath string, hostname string, timeout time.Duration) (*Storage, error) {
5050
if f, err := os.Stat(basePath); os.IsNotExist(err) || !f.IsDir() {
51-
return nil, fmt.Errorf("invalid dir path %s", basePath)
51+
return nil, fmt.Errorf("invalid dir path: %s", basePath)
5252
}
5353

5454
return &Storage{
@@ -60,7 +60,8 @@ func NewStorage(basePath string, hostname string, timeout time.Duration) (*Stora
6060

6161
// ArtifactFor returns an artifact for the given Kubernetes object
6262
func (s *Storage) ArtifactFor(kind string, metadata metav1.Object, fileName, revision string) sourcev1.Artifact {
63-
path := fmt.Sprintf("%s/%s-%s/%s", kind, metadata.GetName(), metadata.GetNamespace(), fileName)
63+
kind = strings.ToLower(kind)
64+
path := fmt.Sprintf("%s/%s-%s/%s", kind, metadata.GetNamespace(), metadata.GetName(), fileName)
6465
localPath := filepath.Join(s.BasePath, path)
6566
url := fmt.Sprintf("http://%s/%s", s.Hostname, path)
6667

Diff for: ‎main.go

-3
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ func main() {
9292
Client: mgr.GetClient(),
9393
Log: ctrl.Log.WithName("controllers").WithName("GitRepository"),
9494
Scheme: mgr.GetScheme(),
95-
Kind: "gitrepository",
9695
Storage: storage,
9796
}).SetupWithManager(mgr); err != nil {
9897
setupLog.Error(err, "unable to create controller", "controller", "GitRepository")
@@ -102,7 +101,6 @@ func main() {
102101
Client: mgr.GetClient(),
103102
Log: ctrl.Log.WithName("controllers").WithName("HelmRepository"),
104103
Scheme: mgr.GetScheme(),
105-
Kind: "helmrepository",
106104
Storage: storage,
107105
Getters: getters,
108106
}).SetupWithManager(mgr); err != nil {
@@ -113,7 +111,6 @@ func main() {
113111
Client: mgr.GetClient(),
114112
Log: ctrl.Log.WithName("controllers").WithName("HelmChart"),
115113
Scheme: mgr.GetScheme(),
116-
Kind: "helmchart",
117114
Storage: storage,
118115
Getters: getters,
119116
}).SetupWithManager(mgr); err != nil {

0 commit comments

Comments
 (0)
Please sign in to comment.