diff --git a/pkg/cluster/controller/projects/projects/zz_project.go b/pkg/cluster/controller/projects/projects/zz_project.go index 3fd0ca12..c69a17a4 100644 --- a/pkg/cluster/controller/projects/projects/zz_project.go +++ b/pkg/cluster/controller/projects/projects/zz_project.go @@ -376,28 +376,12 @@ func (e *external) lateInitialize(ctx context.Context, cr *v1alpha1.Project, pro } in.MergeRequestsTemplate = clients.LateInitializeStringPtr(in.MergeRequestsTemplate, project.MergeRequestsTemplate) - if in.Mirror == nil { - in.Mirror = &project.Mirror - } - if in.MirrorOverwritesDivergedBranches == nil { - in.MirrorOverwritesDivergedBranches = &project.MirrorOverwritesDivergedBranches - } - if in.MirrorTriggerBuilds == nil { - in.MirrorTriggerBuilds = &project.MirrorTriggerBuilds - } - if in.MirrorUserID == nil && project.MirrorUserID != 0 { // since project.MirrorUserID is non-nullable, value `0` treated as `not set` - val := project.MirrorUserID - in.MirrorUserID = &val - } if in.OnlyAllowMergeIfAllDiscussionsAreResolved == nil { in.OnlyAllowMergeIfAllDiscussionsAreResolved = &project.OnlyAllowMergeIfAllDiscussionsAreResolved } if in.OnlyAllowMergeIfPipelineSucceeds == nil { in.OnlyAllowMergeIfPipelineSucceeds = &project.OnlyAllowMergeIfPipelineSucceeds } - if in.OnlyMirrorProtectedBranches == nil { - in.OnlyMirrorProtectedBranches = &project.OnlyMirrorProtectedBranches - } in.OperationsAccessLevel = clients.LateInitializeAccessControlValue(in.OperationsAccessLevel, project.OperationsAccessLevel) @@ -448,6 +432,8 @@ func (e *external) lateInitialize(ctx context.Context, cr *v1alpha1.Project, pro in.Visibility = clients.LateInitializeVisibilityValue(in.Visibility, project.Visibility) in.WikiAccessLevel = clients.LateInitializeAccessControlValue(in.WikiAccessLevel, project.WikiAccessLevel) + // Mirror fields are deliberately not late-initialized (see TestLateInitializeSkipsMirrorFields). + if err := e.lateInitializePushRules(ctx, cr); err != nil { return errors.Wrap(err, errLateInitializePushRules) } diff --git a/pkg/cluster/controller/projects/projects/zz_project_test.go b/pkg/cluster/controller/projects/projects/zz_project_test.go index d5d068d0..63f66f0c 100644 --- a/pkg/cluster/controller/projects/projects/zz_project_test.go +++ b/pkg/cluster/controller/projects/projects/zz_project_test.go @@ -1540,3 +1540,31 @@ func TestSanitizeImportURL(t *testing.T) { }) } } + +// TestLateInitializeSkipsMirrorFields guards against stamping mirror_user on +// non-mirrored projects: unset mirror fields must stay nil after late-init. +func TestLateInitializeSkipsMirrorFields(t *testing.T) { + e := &external{client: &fake.MockClient{ + MockGetProjectPushRules: func(pid interface{}, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectPushRules, *gitlab.Response, error) { + return nil, &gitlab.Response{Response: &http.Response{StatusCode: http.StatusNotFound}}, nil + }, + }} + cr := &v1alpha1.Project{} + glProject := &gitlab.Project{ + Mirror: true, + MirrorUserID: 5, + MirrorTriggerBuilds: true, + OnlyMirrorProtectedBranches: true, + MirrorOverwritesDivergedBranches: true, + } + + if err := e.lateInitialize(context.Background(), cr, glProject); err != nil { + t.Fatalf("lateInitialize returned error: %v", err) + } + + p := cr.Spec.ForProvider + if p.Mirror != nil || p.MirrorUserID != nil || p.MirrorTriggerBuilds != nil || + p.OnlyMirrorProtectedBranches != nil || p.MirrorOverwritesDivergedBranches != nil { + t.Errorf("mirror fields must stay nil, got %+v", p) + } +} diff --git a/pkg/namespaced/controller/projects/projects/project.go b/pkg/namespaced/controller/projects/projects/project.go index 56e7767b..2d786db8 100644 --- a/pkg/namespaced/controller/projects/projects/project.go +++ b/pkg/namespaced/controller/projects/projects/project.go @@ -374,28 +374,12 @@ func (e *external) lateInitialize(ctx context.Context, cr *v1alpha1.Project, pro } in.MergeRequestsTemplate = clients.LateInitializeStringPtr(in.MergeRequestsTemplate, project.MergeRequestsTemplate) - if in.Mirror == nil { - in.Mirror = &project.Mirror - } - if in.MirrorOverwritesDivergedBranches == nil { - in.MirrorOverwritesDivergedBranches = &project.MirrorOverwritesDivergedBranches - } - if in.MirrorTriggerBuilds == nil { - in.MirrorTriggerBuilds = &project.MirrorTriggerBuilds - } - if in.MirrorUserID == nil && project.MirrorUserID != 0 { // since project.MirrorUserID is non-nullable, value `0` treated as `not set` - val := project.MirrorUserID - in.MirrorUserID = &val - } if in.OnlyAllowMergeIfAllDiscussionsAreResolved == nil { in.OnlyAllowMergeIfAllDiscussionsAreResolved = &project.OnlyAllowMergeIfAllDiscussionsAreResolved } if in.OnlyAllowMergeIfPipelineSucceeds == nil { in.OnlyAllowMergeIfPipelineSucceeds = &project.OnlyAllowMergeIfPipelineSucceeds } - if in.OnlyMirrorProtectedBranches == nil { - in.OnlyMirrorProtectedBranches = &project.OnlyMirrorProtectedBranches - } in.OperationsAccessLevel = clients.LateInitializeAccessControlValue(in.OperationsAccessLevel, project.OperationsAccessLevel) @@ -446,6 +430,8 @@ func (e *external) lateInitialize(ctx context.Context, cr *v1alpha1.Project, pro in.Visibility = clients.LateInitializeVisibilityValue(in.Visibility, project.Visibility) in.WikiAccessLevel = clients.LateInitializeAccessControlValue(in.WikiAccessLevel, project.WikiAccessLevel) + // Mirror fields are deliberately not late-initialized (see TestLateInitializeSkipsMirrorFields). + if err := e.lateInitializePushRules(ctx, cr); err != nil { return errors.Wrap(err, errLateInitializePushRules) } diff --git a/pkg/namespaced/controller/projects/projects/project_test.go b/pkg/namespaced/controller/projects/projects/project_test.go index 75cca308..1558d768 100644 --- a/pkg/namespaced/controller/projects/projects/project_test.go +++ b/pkg/namespaced/controller/projects/projects/project_test.go @@ -1538,3 +1538,31 @@ func TestSanitizeImportURL(t *testing.T) { }) } } + +// TestLateInitializeSkipsMirrorFields guards against stamping mirror_user on +// non-mirrored projects: unset mirror fields must stay nil after late-init. +func TestLateInitializeSkipsMirrorFields(t *testing.T) { + e := &external{client: &fake.MockClient{ + MockGetProjectPushRules: func(pid interface{}, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectPushRules, *gitlab.Response, error) { + return nil, &gitlab.Response{Response: &http.Response{StatusCode: http.StatusNotFound}}, nil + }, + }} + cr := &v1alpha1.Project{} + glProject := &gitlab.Project{ + Mirror: true, + MirrorUserID: 5, + MirrorTriggerBuilds: true, + OnlyMirrorProtectedBranches: true, + MirrorOverwritesDivergedBranches: true, + } + + if err := e.lateInitialize(context.Background(), cr, glProject); err != nil { + t.Fatalf("lateInitialize returned error: %v", err) + } + + p := cr.Spec.ForProvider + if p.Mirror != nil || p.MirrorUserID != nil || p.MirrorTriggerBuilds != nil || + p.OnlyMirrorProtectedBranches != nil || p.MirrorOverwritesDivergedBranches != nil { + t.Errorf("mirror fields must stay nil, got %+v", p) + } +}