Skip to content

Commit 4f11dd9

Browse files
committed
gitrepo: Enable default feature gates in tests
Introduce a new field in the GitRepositoryReconciler to set the enabled features. This makes it test friendly compared to using global flags for setting and checking flags in the tests. Enable default feature gates in all the GitRepo reconciler tests. Add test cases for reconcileSource() to test the behavior of optimized git clone when the Repo is ready and not ready. This ensures that the full reconciliation is not skipped when GitRepo is not ready. Signed-off-by: Sunny <[email protected]>
1 parent 76245fa commit 4f11dd9

File tree

3 files changed

+57
-2
lines changed

3 files changed

+57
-2
lines changed

controllers/gitrepository_controller.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ type GitRepositoryReconciler struct {
115115
ControllerName string
116116

117117
requeueDependency time.Duration
118+
features map[string]bool
118119
}
119120

120121
type GitRepositoryReconcilerOptions struct {
@@ -134,6 +135,15 @@ func (r *GitRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error {
134135
func (r *GitRepositoryReconciler) SetupWithManagerAndOptions(mgr ctrl.Manager, opts GitRepositoryReconcilerOptions) error {
135136
r.requeueDependency = opts.DependencyRequeueInterval
136137

138+
if r.features == nil {
139+
r.features = map[string]bool{}
140+
}
141+
142+
// Check and enable gated features.
143+
if oc, _ := features.Enabled(features.OptimizedGitClones); oc {
144+
r.features[features.OptimizedGitClones] = true
145+
}
146+
137147
return ctrl.NewControllerManagedBy(mgr).
138148
For(&sourcev1.GitRepository{}, builder.WithPredicates(
139149
predicate.Or(predicate.GenerationChangedPredicate{}, predicates.ReconcileRequestedPredicate{}),
@@ -414,7 +424,7 @@ func (r *GitRepositoryReconciler) reconcileSource(ctx context.Context,
414424
checkoutOpts.SemVer = ref.SemVer
415425
}
416426

417-
if oc, _ := features.Enabled(features.OptimizedGitClones); oc {
427+
if val, ok := r.features[features.OptimizedGitClones]; ok && val {
418428
// Only if the object is ready, use the last revision to attempt
419429
// short-circuiting clone operation.
420430
if conditions.IsTrue(obj, meta.ReadyCondition) {

controllers/gitrepository_controller_test.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import (
5757
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
5858

5959
sourcev1 "github.com/fluxcd/source-controller/api/v1beta2"
60+
"github.com/fluxcd/source-controller/internal/features"
6061
sreconcile "github.com/fluxcd/source-controller/internal/reconcile"
6162
"github.com/fluxcd/source-controller/internal/reconcile/summarize"
6263
"github.com/fluxcd/source-controller/pkg/git"
@@ -499,6 +500,7 @@ func TestGitRepositoryReconciler_reconcileSource_authStrategy(t *testing.T) {
499500
Client: builder.Build(),
500501
EventRecorder: record.NewFakeRecorder(32),
501502
Storage: testStorage,
503+
features: features.FeatureGates(),
502504
}
503505

504506
for _, i := range testGitImplementations {
@@ -545,6 +547,7 @@ func TestGitRepositoryReconciler_reconcileSource_checkoutStrategy(t *testing.T)
545547
name string
546548
skipForImplementation string
547549
reference *sourcev1.GitRepositoryRef
550+
beforeFunc func(obj *sourcev1.GitRepository, latestRev string)
548551
want sreconcile.Result
549552
wantErr bool
550553
wantRevision string
@@ -614,6 +617,34 @@ func TestGitRepositoryReconciler_reconcileSource_checkoutStrategy(t *testing.T)
614617
wantRevision: "v1.0.0-alpha/<commit>",
615618
want: sreconcile.ResultSuccess,
616619
},
620+
{
621+
name: "Optimized clone, Ready=True",
622+
reference: &sourcev1.GitRepositoryRef{
623+
Branch: "staging",
624+
},
625+
beforeFunc: func(obj *sourcev1.GitRepository, latestRev string) {
626+
obj.Status = sourcev1.GitRepositoryStatus{
627+
Artifact: &sourcev1.Artifact{
628+
Revision: "staging/" + latestRev,
629+
},
630+
}
631+
conditions.MarkTrue(obj, meta.ReadyCondition, meta.SucceededReason, "ready")
632+
},
633+
want: sreconcile.ResultEmpty,
634+
wantErr: true,
635+
wantRevision: "staging/<commit>",
636+
},
637+
{
638+
name: "Optimized clone, Ready=False",
639+
reference: &sourcev1.GitRepositoryRef{
640+
Branch: "staging",
641+
},
642+
beforeFunc: func(obj *sourcev1.GitRepository, latestRev string) {
643+
conditions.MarkFalse(obj, meta.ReadyCondition, meta.FailedReason, "not ready")
644+
},
645+
want: sreconcile.ResultSuccess,
646+
wantRevision: "staging/<commit>",
647+
},
617648
}
618649

619650
server, err := gittestserver.NewTempGitServer()
@@ -641,6 +672,7 @@ func TestGitRepositoryReconciler_reconcileSource_checkoutStrategy(t *testing.T)
641672
Client: fakeclient.NewClientBuilder().WithScheme(runtime.NewScheme()).Build(),
642673
EventRecorder: record.NewFakeRecorder(32),
643674
Storage: testStorage,
675+
features: features.FeatureGates(),
644676
}
645677

646678
for _, tt := range tests {
@@ -674,6 +706,10 @@ func TestGitRepositoryReconciler_reconcileSource_checkoutStrategy(t *testing.T)
674706
obj := obj.DeepCopy()
675707
obj.Spec.GitImplementation = i
676708

709+
if tt.beforeFunc != nil {
710+
tt.beforeFunc(obj, headRef.Hash().String())
711+
}
712+
677713
var commit git.Commit
678714
var includes artifactSet
679715
got, err := r.reconcileSource(ctx, obj, &commit, &includes, tmpDir)
@@ -682,7 +718,7 @@ func TestGitRepositoryReconciler_reconcileSource_checkoutStrategy(t *testing.T)
682718
}
683719
g.Expect(err != nil).To(Equal(tt.wantErr))
684720
g.Expect(got).To(Equal(tt.want))
685-
if tt.wantRevision != "" {
721+
if tt.wantRevision != "" && !tt.wantErr {
686722
revision := strings.ReplaceAll(tt.wantRevision, "<commit>", headRef.Hash().String())
687723
g.Expect(commit.String()).To(Equal(revision))
688724
g.Expect(conditions.IsTrue(obj, sourcev1.ArtifactOutdatedCondition)).To(BeTrue())
@@ -857,6 +893,7 @@ func TestGitRepositoryReconciler_reconcileArtifact(t *testing.T) {
857893
r := &GitRepositoryReconciler{
858894
EventRecorder: record.NewFakeRecorder(32),
859895
Storage: testStorage,
896+
features: features.FeatureGates(),
860897
}
861898

862899
obj := &sourcev1.GitRepository{
@@ -1042,6 +1079,7 @@ func TestGitRepositoryReconciler_reconcileInclude(t *testing.T) {
10421079
EventRecorder: record.NewFakeRecorder(32),
10431080
Storage: storage,
10441081
requeueDependency: dependencyInterval,
1082+
features: features.FeatureGates(),
10451083
}
10461084

10471085
obj := &sourcev1.GitRepository{
@@ -1206,6 +1244,7 @@ func TestGitRepositoryReconciler_reconcileStorage(t *testing.T) {
12061244
r := &GitRepositoryReconciler{
12071245
EventRecorder: record.NewFakeRecorder(32),
12081246
Storage: testStorage,
1247+
features: features.FeatureGates(),
12091248
}
12101249

12111250
obj := &sourcev1.GitRepository{
@@ -1247,6 +1286,7 @@ func TestGitRepositoryReconciler_reconcileDelete(t *testing.T) {
12471286
r := &GitRepositoryReconciler{
12481287
EventRecorder: record.NewFakeRecorder(32),
12491288
Storage: testStorage,
1289+
features: features.FeatureGates(),
12501290
}
12511291

12521292
obj := &sourcev1.GitRepository{
@@ -1384,6 +1424,7 @@ func TestGitRepositoryReconciler_verifyCommitSignature(t *testing.T) {
13841424
r := &GitRepositoryReconciler{
13851425
EventRecorder: record.NewFakeRecorder(32),
13861426
Client: builder.Build(),
1427+
features: features.FeatureGates(),
13871428
}
13881429

13891430
obj := &sourcev1.GitRepository{
@@ -1525,6 +1566,7 @@ func TestGitRepositoryReconciler_ConditionsUpdate(t *testing.T) {
15251566
Client: builder.Build(),
15261567
EventRecorder: record.NewFakeRecorder(32),
15271568
Storage: testStorage,
1569+
features: features.FeatureGates(),
15281570
}
15291571

15301572
key := client.ObjectKeyFromObject(obj)
@@ -1857,6 +1899,7 @@ func TestGitRepositoryReconciler_notify(t *testing.T) {
18571899

18581900
reconciler := &GitRepositoryReconciler{
18591901
EventRecorder: recorder,
1902+
features: features.FeatureGates(),
18601903
}
18611904
commit := &git.Commit{
18621905
Message: "test commit",

controllers/suite_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636

3737
sourcev1 "github.com/fluxcd/source-controller/api/v1beta2"
3838
"github.com/fluxcd/source-controller/internal/cache"
39+
"github.com/fluxcd/source-controller/internal/features"
3940
// +kubebuilder:scaffold:imports
4041
)
4142

@@ -106,6 +107,7 @@ func TestMain(m *testing.M) {
106107
EventRecorder: record.NewFakeRecorder(32),
107108
Metrics: testMetricsH,
108109
Storage: testStorage,
110+
features: features.FeatureGates(),
109111
}).SetupWithManager(testEnv); err != nil {
110112
panic(fmt.Sprintf("Failed to start GitRepositoryReconciler: %v", err))
111113
}

0 commit comments

Comments
 (0)