Skip to content

Commit 1488661

Browse files
zmotsoMykolaMarusenko
authored andcommitted
fix: Branch repository provisioning with gitprovider v2 (#231)
1 parent baa09f3 commit 1488661

25 files changed

+845
-471
lines changed

controllers/codebase/service/chain/checkout_branch.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,28 @@ func GetRepositoryCredentialsIfExists(cb *codebaseApi.Codebase, c client.Client)
3333

3434
func CheckoutBranch(
3535
ctx context.Context,
36-
repository, projectPath, branchName string,
37-
g gitproviderv2.Git,
36+
branchName string,
37+
repoContext *GitRepositoryContext,
3838
cb *codebaseApi.Codebase,
3939
c client.Client,
40-
createGitProviderWithConfig func(config gitproviderv2.Config) gitproviderv2.Git,
40+
gitProviderFactory func(config gitproviderv2.Config) gitproviderv2.Git,
4141
) error {
42-
currentBranchName, err := g.GetCurrentBranchName(ctx, projectPath)
42+
log := ctrl.LoggerFrom(ctx)
43+
gitProvider := gitProviderFactory(gitproviderv2.NewConfigFromGitServerAndSecret(repoContext.GitServer, repoContext.GitServerSecret))
44+
45+
currentBranchName, err := gitProvider.GetCurrentBranchName(ctx, repoContext.WorkDir)
4346
if err != nil {
4447
return fmt.Errorf("failed to get current branch name: %w", err)
4548
}
4649

4750
if currentBranchName == branchName {
48-
ctrl.Log.Info("default branch is already active", "name", branchName)
51+
log.Info("Default branch is already active", "name", branchName)
4952
return nil
5053
}
5154

5255
switch cb.Spec.Strategy {
5356
case "create":
54-
if err := g.Checkout(ctx, projectPath, branchName, false); err != nil {
57+
if err := gitProvider.Checkout(ctx, repoContext.WorkDir, branchName, false); err != nil {
5558
return fmt.Errorf("failed to checkout to default branch %s (create strategy): %w", branchName, err)
5659
}
5760

@@ -61,20 +64,17 @@ func CheckoutBranch(
6164
return err
6265
}
6366

64-
cloneRepoGitProvider := g
65-
67+
cfg := gitproviderv2.Config{}
6668
if user != nil && password != nil {
67-
cloneRepoGitProvider = createGitProviderWithConfig(gitproviderv2.Config{
68-
Username: *user,
69-
Token: *password,
70-
})
69+
cfg.Username = *user
70+
cfg.Token = *password
7171
}
7272

73-
if err := cloneRepoGitProvider.Checkout(ctx, projectPath, branchName, true); err != nil {
73+
if err := gitProviderFactory(cfg).Checkout(ctx, repoContext.WorkDir, branchName, true); err != nil {
7474
return fmt.Errorf("failed to checkout to default branch %s (clone strategy): %w", branchName, err)
7575
}
7676
case "import":
77-
if err := g.CheckoutRemoteBranch(ctx, projectPath, branchName); err != nil {
77+
if err := gitProvider.CheckoutRemoteBranch(ctx, repoContext.WorkDir, branchName); err != nil {
7878
return fmt.Errorf("failed to checkout to default branch %s (import strategy): %w", branchName, err)
7979
}
8080
default:

controllers/codebase/service/chain/checkout_branch_test.go

Lines changed: 73 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -81,48 +81,30 @@ func TestGetRepositoryCredentialsIfExists_ShouldFail(t *testing.T) {
8181
}
8282
}
8383

84-
func TestCheckoutBranch_ShouldFailOnGetSecret(t *testing.T) {
84+
func TestCheckoutBranch_ShouldFailOnGetCurrentBranchName(t *testing.T) {
8585
c := &codebaseApi.Codebase{
8686
ObjectMeta: metaV1.ObjectMeta{
8787
Name: "fake-name",
8888
Namespace: fakeNamespace,
8989
},
9090
Spec: codebaseApi.CodebaseSpec{
91+
GitServer: "git",
9192
Repository: &codebaseApi.Repository{
9293
Url: "repo",
9394
},
9495
Strategy: codebaseApi.Clone,
9596
},
9697
}
97-
98-
scheme := runtime.NewScheme()
99-
scheme.AddKnownTypes(codebaseApi.GroupVersion, c)
100-
fakeCl := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(c).Build()
101-
102-
mGit := gitServerMocks.NewMockGit(t)
103-
mGit.On("GetCurrentBranchName", testify.Anything, "project-path").Return("some-other-branch", nil)
104-
105-
err := CheckoutBranch(context.Background(), "repo", "project-path", "branch", mGit, c, fakeCl, func(config gitproviderv2.Config) gitproviderv2.Git {
106-
return mGit
107-
})
108-
assert.Error(t, err)
109-
110-
if !strings.Contains(err.Error(), "failed to get secret repository-codebase-fake-name-temp") {
111-
t.Fatalf("wrong error returned: %s", err.Error())
112-
}
113-
}
114-
115-
func TestCheckoutBranch_ShouldFailOnGetCurrentBranchName(t *testing.T) {
116-
c := &codebaseApi.Codebase{
98+
gs := &codebaseApi.GitServer{
11799
ObjectMeta: metaV1.ObjectMeta{
118-
Name: "fake-name",
100+
Name: "git",
119101
Namespace: fakeNamespace,
120102
},
121-
Spec: codebaseApi.CodebaseSpec{
122-
Repository: &codebaseApi.Repository{
123-
Url: "repo",
124-
},
125-
Strategy: codebaseApi.Clone,
103+
Spec: codebaseApi.GitServerSpec{
104+
NameSshKeySecret: fakeName,
105+
GitHost: fakeName,
106+
SshPort: 22,
107+
GitUser: fakeName,
126108
},
127109
}
128110
s := &coreV1.Secret{
@@ -135,15 +117,32 @@ func TestCheckoutBranch_ShouldFailOnGetCurrentBranchName(t *testing.T) {
135117
"password": []byte("pass"),
136118
},
137119
}
120+
ssh := &coreV1.Secret{
121+
ObjectMeta: metaV1.ObjectMeta{
122+
Name: fakeName,
123+
Namespace: fakeNamespace,
124+
},
125+
Data: map[string][]byte{
126+
util.PrivateSShKeyName: []byte("fake-ssh-key"),
127+
},
128+
}
138129
scheme := runtime.NewScheme()
139-
scheme.AddKnownTypes(coreV1.SchemeGroupVersion, s)
140-
scheme.AddKnownTypes(codebaseApi.GroupVersion, c)
141-
fakeCl := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(s, c).Build()
130+
scheme.AddKnownTypes(coreV1.SchemeGroupVersion, s, ssh)
131+
scheme.AddKnownTypes(codebaseApi.GroupVersion, c, gs)
132+
fakeCl := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(s, c, gs, ssh).Build()
142133

143134
mGit := gitServerMocks.NewMockGit(t)
144135
mGit.On("GetCurrentBranchName", testify.Anything, "project-path").Return("", errors.New("FATAL:FAILED"))
145136

146-
err := CheckoutBranch(context.Background(), "repo", "project-path", "branch", mGit, c, fakeCl, func(config gitproviderv2.Config) gitproviderv2.Git {
137+
err := CheckoutBranch(context.Background(), "branch", &GitRepositoryContext{
138+
GitServer: gs,
139+
GitServerSecret: ssh,
140+
PrivateSSHKey: "fake-ssh-key",
141+
UserName: "user",
142+
Token: "pass",
143+
RepoGitUrl: "repo",
144+
WorkDir: "project-path",
145+
}, c, fakeCl, func(config gitproviderv2.Config) gitproviderv2.Git {
147146
return mGit
148147
})
149148
assert.Error(t, err)
@@ -154,19 +153,31 @@ func TestCheckoutBranch_ShouldFailOnGetCurrentBranchName(t *testing.T) {
154153
}
155154

156155
func TestCheckoutBranch_ShouldFailOnCheckout(t *testing.T) {
157-
repo := "repo"
158156
c := &codebaseApi.Codebase{
159157
ObjectMeta: metaV1.ObjectMeta{
160158
Name: "fake-name",
161159
Namespace: fakeNamespace,
162160
},
163161
Spec: codebaseApi.CodebaseSpec{
162+
GitServer: "git",
164163
Repository: &codebaseApi.Repository{
165164
Url: "repo",
166165
},
167166
Strategy: codebaseApi.Clone,
168167
},
169168
}
169+
gs := &codebaseApi.GitServer{
170+
ObjectMeta: metaV1.ObjectMeta{
171+
Name: "git",
172+
Namespace: fakeNamespace,
173+
},
174+
Spec: codebaseApi.GitServerSpec{
175+
NameSshKeySecret: fakeName,
176+
GitHost: fakeName,
177+
SshPort: 22,
178+
GitUser: fakeName,
179+
},
180+
}
170181
s := &coreV1.Secret{
171182
ObjectMeta: metaV1.ObjectMeta{
172183
Name: "repository-codebase-fake-name-temp",
@@ -177,16 +188,33 @@ func TestCheckoutBranch_ShouldFailOnCheckout(t *testing.T) {
177188
"password": []byte("pass1"),
178189
},
179190
}
191+
ssh := &coreV1.Secret{
192+
ObjectMeta: metaV1.ObjectMeta{
193+
Name: fakeName,
194+
Namespace: fakeNamespace,
195+
},
196+
Data: map[string][]byte{
197+
util.PrivateSShKeyName: []byte("fake-ssh-key"),
198+
},
199+
}
180200
scheme := runtime.NewScheme()
181-
scheme.AddKnownTypes(coreV1.SchemeGroupVersion, s)
182-
scheme.AddKnownTypes(codebaseApi.GroupVersion, c)
183-
fakeCl := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(s, c).Build()
201+
scheme.AddKnownTypes(coreV1.SchemeGroupVersion, s, ssh)
202+
scheme.AddKnownTypes(codebaseApi.GroupVersion, c, gs)
203+
fakeCl := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(s, c, gs, ssh).Build()
184204

185205
mGit := gitServerMocks.NewMockGit(t)
186206
mGit.On("GetCurrentBranchName", testify.Anything, "project-path").Return("some-other-branch", nil)
187207
mGit.On("Checkout", testify.Anything, "project-path", "branch", true).Return(errors.New("FATAL:FAILED"))
188208

189-
err := CheckoutBranch(context.Background(), repo, "project-path", "branch", mGit, c, fakeCl, func(config gitproviderv2.Config) gitproviderv2.Git {
209+
err := CheckoutBranch(context.Background(), "branch", &GitRepositoryContext{
210+
GitServer: gs,
211+
GitServerSecret: ssh,
212+
PrivateSSHKey: "fake-ssh-key",
213+
UserName: "user1",
214+
Token: "pass1",
215+
RepoGitUrl: "repo",
216+
WorkDir: "project-path",
217+
}, c, fakeCl, func(config gitproviderv2.Config) gitproviderv2.Git {
190218
return mGit
191219
})
192220
assert.Error(t, err)
@@ -197,7 +225,6 @@ func TestCheckoutBranch_ShouldFailOnCheckout(t *testing.T) {
197225
}
198226

199227
func TestCheckoutBranch_ShouldPassForCloneStrategy(t *testing.T) {
200-
repo := "repo"
201228
c := &codebaseApi.Codebase{
202229
ObjectMeta: metaV1.ObjectMeta{
203230
Name: "fake-name",
@@ -251,7 +278,15 @@ func TestCheckoutBranch_ShouldPassForCloneStrategy(t *testing.T) {
251278
mGit.On("GetCurrentBranchName", testify.Anything, "project-path").Return("some-other-branch", nil)
252279
mGit.On("CheckoutRemoteBranch", testify.Anything, "project-path", "branch").Return(nil)
253280

254-
err := CheckoutBranch(context.Background(), repo, "project-path", "branch", mGit, c, fakeCl, func(config gitproviderv2.Config) gitproviderv2.Git {
281+
err := CheckoutBranch(context.Background(), "branch", &GitRepositoryContext{
282+
GitServer: gs,
283+
GitServerSecret: ssh,
284+
PrivateSSHKey: "fake",
285+
UserName: "user",
286+
Token: "pass",
287+
RepoGitUrl: "repo",
288+
WorkDir: "project-path",
289+
}, c, fakeCl, func(config gitproviderv2.Config) gitproviderv2.Git {
255290
return mGit
256291
})
257292
assert.NoError(t, err)

controllers/codebase/service/chain/common.go

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,47 +105,35 @@ func PrepareGitRepository(
105105
c client.Client,
106106
codebase *codebaseApi.Codebase,
107107
gitProviderFactory gitproviderv2.GitProviderFactory,
108-
createGitProviderWithConfig func(config gitproviderv2.Config) gitproviderv2.Git,
109108
) (*GitRepositoryContext, error) {
110109
log := ctrl.LoggerFrom(ctx)
111110

112-
// Step 1-2: Get git repository context (GitServer, Secret, and paths)
113111
gitRepoCtx, err := GetGitRepositoryContext(ctx, c, codebase)
114112
if err != nil {
115113
return nil, err
116114
}
117115

118-
// Step 3: Create git provider using factory
119-
g := gitProviderFactory(gitRepoCtx.GitServer, gitRepoCtx.GitServerSecret)
116+
gitProvider := gitProviderFactory(gitproviderv2.NewConfigFromGitServerAndSecret(gitRepoCtx.GitServer, gitRepoCtx.GitServerSecret))
120117

121-
// Step 4: Clone repository if needed
122118
if !util.DoesDirectoryExist(gitRepoCtx.WorkDir) || util.IsDirectoryEmpty(gitRepoCtx.WorkDir) {
123119
log.Info("Start cloning repository", "url", gitRepoCtx.RepoGitUrl)
124120

125-
if err := g.Clone(ctx, gitRepoCtx.RepoGitUrl, gitRepoCtx.WorkDir, 0); err != nil {
121+
if err := gitProvider.Clone(ctx, gitRepoCtx.RepoGitUrl, gitRepoCtx.WorkDir); err != nil {
126122
return nil, fmt.Errorf("failed to clone git repository: %w", err)
127123
}
128124

129125
log.Info("Repository has been cloned", "url", gitRepoCtx.RepoGitUrl)
130126
}
131127

132-
// Step 5: Get repo URL for checkout
133-
repoUrl, err := util.GetRepoUrl(codebase)
134-
if err != nil {
135-
return nil, fmt.Errorf("failed to build repo url: %w", err)
136-
}
137-
138-
// Step 6: Checkout default branch
139-
log.Info("Start checkout default branch", "branch", codebase.Spec.DefaultBranch, "repo", repoUrl)
128+
log.Info("Start checkout default branch", "branch", codebase.Spec.DefaultBranch)
140129

141-
err = CheckoutBranch(ctx, repoUrl, gitRepoCtx.WorkDir, codebase.Spec.DefaultBranch, g, codebase, c, createGitProviderWithConfig)
130+
err = CheckoutBranch(ctx, codebase.Spec.DefaultBranch, gitRepoCtx, codebase, c, gitProviderFactory)
142131
if err != nil {
143132
return nil, fmt.Errorf("failed to checkout default branch %v: %w", codebase.Spec.DefaultBranch, err)
144133
}
145134

146-
log.Info("Default branch has been checked out", "branch", codebase.Spec.DefaultBranch, "repo", repoUrl)
135+
log.Info("Default branch has been checked out", "branch", codebase.Spec.DefaultBranch)
147136

148-
// Return context for subsequent operations
149137
return gitRepoCtx, nil
150138
}
151139

controllers/codebase/service/chain/common_test.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -310,9 +310,7 @@ func TestPrepareGitRepository(t *testing.T) {
310310
objects: []client.Object{gitServer, secret},
311311
gitClient: func(t *testing.T) *gitMocks.MockGit {
312312
m := gitMocks.NewMockGit(t)
313-
m.On("Clone",
314-
testify.Anything, testify.Anything, testify.Anything, testify.Anything,
315-
).Return(nil)
313+
m.On("Clone", testify.Anything, testify.Anything, testify.Anything).Return(nil)
316314
m.On("GetCurrentBranchName", testify.Anything, testify.Anything).Return("main", nil)
317315
return m
318316
},
@@ -388,7 +386,7 @@ func TestPrepareGitRepository(t *testing.T) {
388386
objects: []client.Object{gitServer, secret},
389387
gitClient: func(t *testing.T) *gitMocks.MockGit {
390388
m := gitMocks.NewMockGit(t)
391-
m.On("Clone", testify.Anything, testify.Anything, testify.Anything, testify.Anything).
389+
m.On("Clone", testify.Anything, testify.Anything, testify.Anything).
392390
Return(assert.AnError)
393391
return m
394392
},
@@ -431,8 +429,7 @@ func TestPrepareGitRepository(t *testing.T) {
431429
},
432430
gitClient: func(t *testing.T) *gitMocks.MockGit {
433431
m := gitMocks.NewMockGit(t)
434-
m.On("Clone", testify.Anything, testify.Anything, testify.Anything, testify.Anything).
435-
Return(nil)
432+
m.On("Clone", testify.Anything, testify.Anything, testify.Anything).Return(nil)
436433
m.On("GetCurrentBranchName", testify.Anything, testify.Anything).
437434
Return("", errors.New("failed to get current branch"))
438435
return m
@@ -463,15 +460,14 @@ func TestPrepareGitRepository(t *testing.T) {
463460
WithObjects(allObjects...).
464461
Build()
465462

463+
gitProvider := tt.gitClient(t)
464+
466465
gitCtx, err := PrepareGitRepository(
467466
context.Background(),
468467
k8sClient,
469468
tt.codebase,
470-
func(gitServer *codebaseApi.GitServer, secret *corev1.Secret) gitproviderv2.Git {
471-
return tt.gitClient(t)
472-
},
473-
func(config gitproviderv2.Config) gitproviderv2.Git {
474-
return tt.gitClient(t)
469+
func(cfg gitproviderv2.Config) gitproviderv2.Git {
470+
return gitProvider
475471
},
476472
)
477473

controllers/codebase/service/chain/factory.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,17 @@ func MakeChain(ctx context.Context, c client.Client) handler.CodebaseHandler {
2222
ch := &chain{}
2323
gitlabCIManager := gitlabci.NewManager(c)
2424

25-
createGitProviderWithConfig := func(config gitproviderv2.Config) gitproviderv2.Git {
26-
return gitproviderv2.NewGitProvider(config)
27-
}
28-
2925
ch.Use(
3026
NewPutGitWebRepoUrl(c),
3127
NewPutProject(
3228
c,
3329
&gerrit.SSHGerritClient{},
3430
gitprovider.NewGitProjectProvider,
35-
gitproviderv2.DefaultGitProviderFactory,
36-
createGitProviderWithConfig,
31+
gitproviderv2.NewGitProviderFactory,
3732
),
3833
NewPutWebHook(c, resty.New()),
39-
NewPutGitLabCIConfig(c, gitlabCIManager, gitproviderv2.DefaultGitProviderFactory, createGitProviderWithConfig),
40-
NewPutDeployConfigs(c, gitproviderv2.DefaultGitProviderFactory, createGitProviderWithConfig),
34+
NewPutGitLabCIConfig(c, gitlabCIManager, gitproviderv2.NewGitProviderFactory),
35+
NewPutDeployConfigs(c, gitproviderv2.NewGitProviderFactory),
4136
NewPutDefaultCodeBaseBranch(c),
4237
NewCleaner(c),
4338
)

0 commit comments

Comments
 (0)