Skip to content

Commit fda481e

Browse files
committed
Upgrade controller-runtime to v0.7.0
This commit upgrades the `controller-runtime` dependency to `v0.7.0`, including all changes required to make all wiring work again. - Upgrade `runtime` to v0.6.0 to include `controller-runtime` changes. - Loggers have been removed from the reconcilers and are now retrieved from the `context.Context` passed to the `Reconcile` method and downwards functions. - Logger configuration flags are now bound to the flag set using `BindFlags` from `runtime/logger`, ensuring the same contract across GitOps Toolkit controllers, and the `--log-json` flag has been deprecated in favour of the `--log-encoding=json` default. - The `ChangePredicate` from `runtime` has changed to a `ReconcilateAtChangedPredicate`, and is now chained with the `GenerationChangedPredicate` from `controller-runtime` using `predicate.Or`. - Signatures that made use of `runtime.Object` have changed to `client.Object`, removing the requirement to e.g. call `runtime.Object#Object`. - The `client.MatchingField` function was deprecated, and has been replaced with `client.MatchingFields{}`. - The `leader-election-role` was changed, as leader election now works via the `coordination/v1` API. Other notable changes: - `util.ObjectKey` was added to easily construct a `client.ObjectKey` / `types.NamespacedName` from a `metav1.Object`. - The `SourceIndexKey` constant has been split out into `{GitRepository,HelmRepository,Bucket}IndexKey` constants. Signed-off-by: Hidde Beydals <[email protected]>
1 parent 9020143 commit fda481e

17 files changed

+567
-412
lines changed

api/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ require (
66
github.com/fluxcd/pkg/apis/meta v0.5.0
77
k8s.io/api v0.19.4
88
k8s.io/apimachinery v0.19.4
9-
sigs.k8s.io/controller-runtime v0.6.4
9+
sigs.k8s.io/controller-runtime v0.7.0
1010
)

api/go.sum

Lines changed: 183 additions & 58 deletions
Large diffs are not rendered by default.

api/v1beta1/gitrepository_types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ import (
2626
const (
2727
// GitRepositoryKind is the string representation of a GitRepository.
2828
GitRepositoryKind = "GitRepository"
29-
// Represents the go-git git implementation kind
29+
// GoGitImplementation represents the go-git git implementation kind.
3030
GoGitImplementation = "go-git"
31-
// Represents the gi2go git implementation kind
31+
// LibGit2Implementation represents the gi2go git implementation kind.
3232
LibGit2Implementation = "libgit2"
3333
)
3434

api/v1beta1/source.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,35 @@
1+
/*
2+
Copyright 2020 The Flux authors
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
117
package v1beta1
218

319
import (
420
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
521
)
622

723
const (
8-
// SourceIndexKey is the key used for indexing resources based on
9-
// their sources.
10-
SourceIndexKey string = ".metadata.source"
24+
// GitRepositoryIndexKey is the key used for indexing resources
25+
// resources based on their GitRepository source.
26+
GitRepositoryIndexKey string = ".metadata.gitRepository"
27+
// HelmRepositoryIndexKey is the key used for indexing resources
28+
// resources based on their HelmRepository source.
29+
HelmRepositoryIndexKey string = ".meta.helmRepository"
30+
// BucketIndexKey is the key used for indexing resources based on
31+
// their Bucket source.
32+
BucketIndexKey string = ".meta.bucket"
1133
)
1234

1335
// Source interface must be supported by all API types.

config/manager/deployment.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ spec:
3838
args:
3939
- --watch-all-namespaces
4040
- --log-level=info
41-
- --log-json
41+
- --log-encoding=json
4242
- --enable-leader-election
4343
- --storage-path=/data
4444
- --storage-adv-addr=source-controller.$(RUNTIME_NAMESPACE).svc.cluster.local.
Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,45 @@
1+
12
# permissions to do leader election.
23
apiVersion: rbac.authorization.k8s.io/v1
34
kind: Role
45
metadata:
56
name: leader-election-role
67
rules:
7-
- apiGroups:
8-
- ""
9-
resources:
10-
- configmaps
11-
verbs:
12-
- get
13-
- list
14-
- watch
15-
- create
16-
- update
17-
- patch
18-
- delete
19-
- apiGroups:
20-
- ""
21-
resources:
22-
- configmaps/status
23-
verbs:
24-
- get
25-
- update
26-
- patch
27-
8+
- apiGroups:
9+
- ""
10+
resources:
11+
- configmaps
12+
verbs:
13+
- get
14+
- list
15+
- watch
16+
- create
17+
- update
18+
- patch
19+
- delete
20+
- apiGroups:
21+
- ""
22+
resources:
23+
- configmaps/status
24+
verbs:
25+
- get
26+
- update
27+
- patch
28+
- apiGroups:
29+
- ""
30+
resources:
31+
- events
32+
verbs:
33+
- create
34+
- apiGroups:
35+
- "coordination.k8s.io"
36+
resources:
37+
- leases
38+
verbs:
39+
- get
40+
- list
41+
- watch
42+
- create
43+
- update
44+
- patch
45+
- delete

controllers/bucket_controller.go

Lines changed: 39 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"strings"
2727
"time"
2828

29-
"github.com/fluxcd/pkg/apis/meta"
3029
"github.com/go-logr/logr"
3130
"github.com/minio/minio-go/v7"
3231
"github.com/minio/minio-go/v7/pkg/credentials"
@@ -42,41 +41,56 @@ import (
4241
"sigs.k8s.io/controller-runtime/pkg/client"
4342
"sigs.k8s.io/controller-runtime/pkg/controller"
4443
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
44+
"sigs.k8s.io/controller-runtime/pkg/predicate"
4545

46+
"github.com/fluxcd/pkg/apis/meta"
4647
"github.com/fluxcd/pkg/runtime/events"
4748
"github.com/fluxcd/pkg/runtime/metrics"
4849
"github.com/fluxcd/pkg/runtime/predicates"
4950

5051
sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
5152
)
5253

54+
// +kubebuilder:rbac:groups=source.toolkit.fluxcd.io,resources=buckets,verbs=get;list;watch;create;update;patch;delete
55+
// +kubebuilder:rbac:groups=source.toolkit.fluxcd.io,resources=buckets/status,verbs=get;update;patch
56+
// +kubebuilder:rbac:groups=source.toolkit.fluxcd.io,resources=buckets/finalizers,verbs=get;create;update;patch;delete
57+
// +kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch
58+
5359
// BucketReconciler reconciles a Bucket object
5460
type BucketReconciler struct {
5561
client.Client
56-
Log logr.Logger
5762
Scheme *runtime.Scheme
5863
Storage *Storage
5964
EventRecorder kuberecorder.EventRecorder
6065
ExternalEventRecorder *events.Recorder
6166
MetricsRecorder *metrics.Recorder
6267
}
6368

64-
// +kubebuilder:rbac:groups=source.toolkit.fluxcd.io,resources=buckets,verbs=get;list;watch;create;update;patch;delete
65-
// +kubebuilder:rbac:groups=source.toolkit.fluxcd.io,resources=buckets/status,verbs=get;update;patch
66-
// +kubebuilder:rbac:groups=source.toolkit.fluxcd.io,resources=buckets/finalizers,verbs=get;create;update;patch;delete
67-
// +kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch
69+
type BucketReconcilerOptions struct {
70+
MaxConcurrentReconciles int
71+
}
72+
73+
func (r *BucketReconciler) SetupWithManager(mgr ctrl.Manager) error {
74+
return r.SetupWithManagerAndOptions(mgr, BucketReconcilerOptions{})
75+
}
76+
77+
func (r *BucketReconciler) SetupWithManagerAndOptions(mgr ctrl.Manager, opts BucketReconcilerOptions) error {
78+
return ctrl.NewControllerManagedBy(mgr).
79+
For(&sourcev1.Bucket{}).
80+
WithEventFilter(predicate.Or(predicate.GenerationChangedPredicate{}, predicates.ReconcilateAtChangedPredicate{})).
81+
WithOptions(controller.Options{MaxConcurrentReconciles: opts.MaxConcurrentReconciles}).
82+
Complete(r)
83+
}
6884

69-
func (r *BucketReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
70-
ctx := context.Background()
85+
func (r *BucketReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
7186
start := time.Now()
87+
log := ctrl.LoggerFrom(ctx)
7288

7389
var bucket sourcev1.Bucket
7490
if err := r.Get(ctx, req.NamespacedName, &bucket); err != nil {
7591
return ctrl.Result{}, client.IgnoreNotFound(err)
7692
}
7793

78-
log := r.Log.WithValues("controller", strings.ToLower(sourcev1.BucketKind), "request", req.NamespacedName)
79-
8094
// Add our finalizer if it does not exist
8195
if !controllerutil.ContainsFinalizer(&bucket, sourcev1.SourceFinalizer) {
8296
controllerutil.AddFinalizer(&bucket, sourcev1.SourceFinalizer)
@@ -113,7 +127,7 @@ func (r *BucketReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
113127
log.Error(err, "unable to update status")
114128
return ctrl.Result{Requeue: true}, err
115129
}
116-
r.recordReadiness(bucket)
130+
r.recordReadiness(ctx, bucket)
117131
}
118132

119133
// record the value of the reconciliation request, if any
@@ -139,16 +153,16 @@ func (r *BucketReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
139153

140154
// if reconciliation failed, record the failure and requeue immediately
141155
if reconcileErr != nil {
142-
r.event(reconciledBucket, events.EventSeverityError, reconcileErr.Error())
143-
r.recordReadiness(reconciledBucket)
156+
r.event(ctx, reconciledBucket, events.EventSeverityError, reconcileErr.Error())
157+
r.recordReadiness(ctx, reconciledBucket)
144158
return ctrl.Result{Requeue: true}, reconcileErr
145159
}
146160

147161
// emit revision change event
148162
if bucket.Status.Artifact == nil || reconciledBucket.Status.Artifact.Revision != bucket.Status.Artifact.Revision {
149-
r.event(reconciledBucket, events.EventSeverityInfo, sourcev1.BucketReadyMessage(reconciledBucket))
163+
r.event(ctx, reconciledBucket, events.EventSeverityInfo, sourcev1.BucketReadyMessage(reconciledBucket))
150164
}
151-
r.recordReadiness(reconciledBucket)
165+
r.recordReadiness(ctx, reconciledBucket)
152166

153167
log.Info(fmt.Sprintf("Reconciliation finished in %s, next run in %s",
154168
time.Now().Sub(start).String(),
@@ -158,22 +172,6 @@ func (r *BucketReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
158172
return ctrl.Result{RequeueAfter: bucket.GetInterval().Duration}, nil
159173
}
160174

161-
type BucketReconcilerOptions struct {
162-
MaxConcurrentReconciles int
163-
}
164-
165-
func (r *BucketReconciler) SetupWithManager(mgr ctrl.Manager) error {
166-
return r.SetupWithManagerAndOptions(mgr, BucketReconcilerOptions{})
167-
}
168-
169-
func (r *BucketReconciler) SetupWithManagerAndOptions(mgr ctrl.Manager, opts BucketReconcilerOptions) error {
170-
return ctrl.NewControllerManagedBy(mgr).
171-
For(&sourcev1.Bucket{}).
172-
WithEventFilter(predicates.ChangePredicate{}).
173-
WithOptions(controller.Options{MaxConcurrentReconciles: opts.MaxConcurrentReconciles}).
174-
Complete(r)
175-
}
176-
177175
func (r *BucketReconciler) reconcile(ctx context.Context, bucket sourcev1.Bucket) (sourcev1.Bucket, error) {
178176
s3Client, err := r.auth(ctx, bucket)
179177
if err != nil {
@@ -272,13 +270,14 @@ func (r *BucketReconciler) reconcile(ctx context.Context, bucket sourcev1.Bucket
272270

273271
func (r *BucketReconciler) reconcileDelete(ctx context.Context, bucket sourcev1.Bucket) (ctrl.Result, error) {
274272
if err := r.gc(bucket); err != nil {
275-
r.event(bucket, events.EventSeverityError, fmt.Sprintf("garbage collection for deleted resource failed: %s", err.Error()))
273+
r.event(ctx, bucket, events.EventSeverityError,
274+
fmt.Sprintf("garbage collection for deleted resource failed: %s", err.Error()))
276275
// Return the error so we retry the failed garbage collection
277276
return ctrl.Result{}, err
278277
}
279278

280279
// Record deleted status
281-
r.recordReadiness(bucket)
280+
r.recordReadiness(ctx, bucket)
282281

283282
// Remove our finalizer from the list and update it
284283
controllerutil.RemoveFinalizer(&bucket, sourcev1.SourceFinalizer)
@@ -383,41 +382,33 @@ func (r *BucketReconciler) gc(bucket sourcev1.Bucket) error {
383382
}
384383

385384
// event emits a Kubernetes event and forwards the event to notification controller if configured
386-
func (r *BucketReconciler) event(bucket sourcev1.Bucket, severity, msg string) {
385+
func (r *BucketReconciler) event(ctx context.Context, bucket sourcev1.Bucket, severity, msg string) {
386+
log := logr.FromContext(ctx)
387387
if r.EventRecorder != nil {
388388
r.EventRecorder.Eventf(&bucket, "Normal", severity, msg)
389389
}
390390
if r.ExternalEventRecorder != nil {
391391
objRef, err := reference.GetReference(r.Scheme, &bucket)
392392
if err != nil {
393-
r.Log.WithValues(
394-
"request",
395-
fmt.Sprintf("%s/%s", bucket.GetNamespace(), bucket.GetName()),
396-
).Error(err, "unable to send event")
393+
log.Error(err, "unable to send event")
397394
return
398395
}
399396

400397
if err := r.ExternalEventRecorder.Eventf(*objRef, nil, severity, severity, msg); err != nil {
401-
r.Log.WithValues(
402-
"request",
403-
fmt.Sprintf("%s/%s", bucket.GetNamespace(), bucket.GetName()),
404-
).Error(err, "unable to send event")
398+
log.Error(err, "unable to send event")
405399
return
406400
}
407401
}
408402
}
409403

410-
func (r *BucketReconciler) recordReadiness(bucket sourcev1.Bucket) {
404+
func (r *BucketReconciler) recordReadiness(ctx context.Context, bucket sourcev1.Bucket) {
405+
log := logr.FromContext(ctx)
411406
if r.MetricsRecorder == nil {
412407
return
413408
}
414-
415409
objRef, err := reference.GetReference(r.Scheme, &bucket)
416410
if err != nil {
417-
r.Log.WithValues(
418-
strings.ToLower(bucket.Kind),
419-
fmt.Sprintf("%s/%s", bucket.GetNamespace(), bucket.GetName()),
420-
).Error(err, "unable to record readiness metric")
411+
log.Error(err, "unable to record readiness metric")
421412
return
422413
}
423414
if rc := apimeta.FindStatusCondition(bucket.Status.Conditions, meta.ReadyCondition); rc != nil {

0 commit comments

Comments
 (0)