Skip to content

Commit 74420bd

Browse files
author
Sanskar Jaiswal
committed
refactor controller and git tests to use managed transport
Signed-off-by: Sanskar Jaiswal <[email protected]>
1 parent d2174b4 commit 74420bd

File tree

4 files changed

+116
-48
lines changed

4 files changed

+116
-48
lines changed

controllers/git_test.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
libgit2 "github.com/libgit2/git2go/v33"
1313

1414
"github.com/fluxcd/pkg/gittestserver"
15+
"github.com/fluxcd/source-controller/pkg/git/libgit2/managed"
1516
)
1617

1718
func populateRepoFromFixture(repo *libgit2.Repository, fixture string) error {
@@ -128,21 +129,26 @@ func TestPushRejected(t *testing.T) {
128129
}
129130

130131
// this is currently defined in update_test.go, but handy right here ..
131-
if err = initGitRepo(gitServer, "testdata/appconfig", "main", "/appconfig.git"); err != nil {
132+
if err = initGitRepo(gitServer, "testdata/appconfig", "master", "/appconfig.git"); err != nil {
132133
t.Fatal(err)
133134
}
134135

135136
repoURL := gitServer.HTTPAddressWithCredentials() + "/appconfig.git"
136-
repo, err := clone(repoURL, "origin", "main")
137+
repo, err := clone(repoURL, "master")
137138
if err != nil {
138139
t.Fatal(err)
139140
}
141+
defer repo.Free()
140142

141-
// This is here to guard against push in general being broken
142-
err = push(context.TODO(), repo.Workdir(), "main", repoAccess{
143-
url: repoURL,
144-
auth: nil,
143+
transportOptsURL := "http://" + randStringRunes(5)
144+
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
145+
TargetURL: repoURL,
145146
})
147+
defer managed.RemoveTransportOptions(transportOptsURL)
148+
repo.Remotes.SetUrl("origin", transportOptsURL)
149+
150+
// This is here to guard against push in general being broken
151+
err = push(context.TODO(), repo.Workdir(), "master", repoAccess{})
146152
if err != nil {
147153
t.Fatal(err)
148154
}
@@ -154,10 +160,7 @@ func TestPushRejected(t *testing.T) {
154160

155161
// This is supposed to fail, because the hook rejects the branch
156162
// pushed to.
157-
err = push(context.TODO(), repo.Workdir(), branch, repoAccess{
158-
url: repoURL,
159-
auth: nil,
160-
})
163+
err = push(context.TODO(), repo.Workdir(), branch, repoAccess{})
161164
if err == nil {
162165
t.Error("push to a forbidden branch is expected to fail, but succeeded")
163166
}

controllers/imageupdateautomation_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ type repoAccess struct {
510510
func (r *ImageUpdateAutomationReconciler) getRepoAccess(ctx context.Context, repository *sourcev1.GitRepository) (repoAccess, error) {
511511
var access repoAccess
512512
access.url = repository.Spec.URL
513+
access.auth = &git.AuthOptions{}
513514

514515
if repository.Spec.SecretRef != nil {
515516
name := types.NamespacedName{

controllers/suite_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ import (
2424
"testing"
2525
"time"
2626

27+
"github.com/go-logr/logr"
2728
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2829
"k8s.io/client-go/kubernetes/scheme"
2930
ctrl "sigs.k8s.io/controller-runtime"
3031

3132
imagev1_reflect "github.com/fluxcd/image-reflector-controller/api/v1beta1"
3233
"github.com/fluxcd/pkg/runtime/testenv"
3334
sourcev1 "github.com/fluxcd/source-controller/api/v1beta2"
35+
"github.com/fluxcd/source-controller/pkg/git/libgit2/managed"
3436

3537
imagev1 "github.com/fluxcd/image-automation-controller/api/v1beta1"
3638
// +kubebuilder:scaffold:imports
@@ -61,6 +63,8 @@ func TestMain(m *testing.M) {
6163
filepath.Join("testdata", "crds"),
6264
))
6365

66+
managed.InitManagedTransport(logr.Discard())
67+
6468
controllerName := "image-automation-controller"
6569
if err := (&ImageUpdateAutomationReconciler{
6670
Client: testEnv,

controllers/update_test.go

Lines changed: 98 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import (
5454
"github.com/fluxcd/pkg/gittestserver"
5555
"github.com/fluxcd/pkg/ssh"
5656
sourcev1 "github.com/fluxcd/source-controller/api/v1beta2"
57+
"github.com/fluxcd/source-controller/pkg/git/libgit2/managed"
5758

5859
imagev1 "github.com/fluxcd/image-automation-controller/api/v1beta1"
5960
"github.com/fluxcd/image-automation-controller/pkg/test"
@@ -405,10 +406,9 @@ func TestImageAutomationReconciler_signedCommit(t *testing.T) {
405406
}
406407

407408
func TestImageAutomationReconciler_e2e(t *testing.T) {
408-
gitImpls := []string{sourcev1.GoGitImplementation, sourcev1.LibGit2Implementation}
409409
protos := []string{"http", "ssh"}
410410

411-
testFunc := func(t *testing.T, proto string, impl string) {
411+
testFunc := func(t *testing.T, proto string) {
412412
g := NewWithT(t)
413413

414414
const latestImage = "helloworld:1.0.1"
@@ -462,10 +462,10 @@ func TestImageAutomationReconciler_e2e(t *testing.T) {
462462
// in a secret.
463463
err = createSSHIdentitySecret(testEnv, gitSecretName, namespace, repoURL)
464464
g.Expect(err).ToNot(HaveOccurred())
465-
err = createGitRepository(testEnv, gitRepoName, namespace, impl, repoURL, gitSecretName)
465+
err = createGitRepository(testEnv, gitRepoName, namespace, repoURL, gitSecretName)
466466
g.Expect(err).ToNot(HaveOccurred())
467467
} else {
468-
err = createGitRepository(testEnv, gitRepoName, namespace, impl, repoURL, "")
468+
err = createGitRepository(testEnv, gitRepoName, namespace, repoURL, "")
469469
g.Expect(err).ToNot(HaveOccurred())
470470
}
471471

@@ -480,8 +480,12 @@ func TestImageAutomationReconciler_e2e(t *testing.T) {
480480

481481
t.Run("PushSpec", func(t *testing.T) {
482482
// Clone the repo locally.
483-
localRepo, err := clone(cloneLocalRepoURL, "origin", branch)
483+
localRepo, err := clone(cloneLocalRepoURL, branch)
484484
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
485+
defer localRepo.Free()
486+
origin, err := localRepo.Remotes.Lookup("origin")
487+
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
488+
defer origin.Free()
485489

486490
// NB not testing the image reflector controller; this
487491
// will make a "fully formed" ImagePolicy object.
@@ -613,8 +617,9 @@ func TestImageAutomationReconciler_e2e(t *testing.T) {
613617
// test helper. When switching branches, the localRepo seems to get
614618
// stuck in one particular branch. As a workaround, create a
615619
// separate localRepo.
616-
localRepo, err := clone(cloneLocalRepoURL, "origin", branch)
620+
localRepo, err := clone(cloneLocalRepoURL, branch)
617621
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
622+
defer localRepo.Free()
618623

619624
g.Expect(checkoutBranch(localRepo, branch)).ToNot(HaveOccurred())
620625
err = createImagePolicyWithLatestImage(testEnv, imagePolicyName, namespace, "not-expected-to-exist", "1.x", latestImage)
@@ -736,13 +741,10 @@ func TestImageAutomationReconciler_e2e(t *testing.T) {
736741
})
737742
}
738743

739-
// Run the protocol based e2e tests against the git implementations.
740-
for _, gitImpl := range gitImpls {
741-
for _, proto := range protos {
742-
t.Run(fmt.Sprintf("%s_%s", gitImpl, proto), func(t *testing.T) {
743-
testFunc(t, proto, gitImpl)
744-
})
745-
}
744+
for _, proto := range protos {
745+
t.Run(fmt.Sprintf("%s", proto), func(t *testing.T) {
746+
testFunc(t, proto)
747+
})
746748
}
747749
}
748750

@@ -861,8 +863,9 @@ func compareRepoWithExpected(g *WithT, repoURL, branch, fixture string, changeFi
861863
copy.Copy(fixture, expected)
862864
changeFixture(expected)
863865

864-
repo, err := clone(repoURL, "origin", branch)
866+
repo, err := clone(repoURL, branch)
865867
g.Expect(err).ToNot(HaveOccurred())
868+
defer repo.Free()
866869
// NOTE: The workdir contains a trailing /. Clean it to not confuse the
867870
// DiffDirectories().
868871
actual := filepath.Clean(repo.Workdir())
@@ -872,10 +875,39 @@ func compareRepoWithExpected(g *WithT, repoURL, branch, fixture string, changeFi
872875
test.ExpectMatchingDirectories(g, actual, expected)
873876
}
874877

878+
// configureManagedTransportOptions registers the transport options for this repository
879+
// and sets the remote url of origin to the transport options url. If repoURL is empty
880+
// it tries to figure it out by looking at the remote url of origin. It returns a function
881+
// which removes the transport options for this repo and sets the remote url of the origin
882+
// back to the actual url. Callers are expected to call this function in a deferred manner.
883+
func configureManagedTransportOptions(repo *libgit2.Repository, repoURL string) (func(), error) {
884+
if repoURL == "" {
885+
origin, err := repo.Remotes.Lookup(originRemote)
886+
if err != nil {
887+
return nil, err
888+
}
889+
defer origin.Free()
890+
repoURL = origin.Url()
891+
}
892+
transportOptsURL := "http://" + randStringRunes(5)
893+
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
894+
TargetURL: repoURL,
895+
})
896+
897+
err := repo.Remotes.SetUrl(originRemote, transportOptsURL)
898+
if err != nil {
899+
return nil, fmt.Errorf("could not set remote origin url: %v", err)
900+
}
901+
return func() {
902+
managed.RemoveTransportOptions(transportOptsURL)
903+
repo.Remotes.SetUrl(originRemote, repoURL)
904+
}, nil
905+
}
906+
875907
func commitInRepo(g *WithT, repoURL, branch, msg string, changeFiles func(path string)) {
876-
originRemote := "origin"
877-
repo, err := clone(repoURL, originRemote, branch)
908+
repo, err := clone(repoURL, branch)
878909
g.Expect(err).ToNot(HaveOccurred())
910+
defer repo.Free()
879911

880912
changeFiles(repo.Workdir())
881913

@@ -887,6 +919,11 @@ func commitInRepo(g *WithT, repoURL, branch, msg string, changeFiles func(path s
887919
_, err = commitWorkDir(repo, branch, msg, sig)
888920
g.Expect(err).ToNot(HaveOccurred())
889921

922+
cleanup, err := configureManagedTransportOptions(repo, repoURL)
923+
if err != nil {
924+
panic(err)
925+
}
926+
defer cleanup()
890927
origin, err := repo.Remotes.Lookup(originRemote)
891928
if err != nil {
892929
panic(fmt.Errorf("cannot find origin: %v", err))
@@ -941,7 +978,7 @@ func initGitRepoPlain(fixture, repositoryPath string) (*git2go.Repository, error
941978
}
942979

943980
func headFromBranch(repo *git2go.Repository, branchName string) (*git2go.Commit, error) {
944-
branch, err := repo.LookupBranch(branchName, git2go.BranchAll)
981+
branch, err := repo.LookupBranch(branchName, git2go.BranchLocal)
945982
if err != nil {
946983
return nil, err
947984
}
@@ -1123,40 +1160,53 @@ func mockSignature(time time.Time) *git2go.Signature {
11231160
}
11241161
}
11251162

1126-
func clone(repoURL, remoteName, branchName string) (*git2go.Repository, error) {
1163+
func clone(repoURL, branchName string) (*git2go.Repository, error) {
11271164
dir, err := os.MkdirTemp("", "iac-clone-*")
11281165
if err != nil {
11291166
return nil, err
11301167
}
1168+
transportOptsURL := "http://" + randStringRunes(5)
1169+
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
1170+
TargetURL: repoURL,
1171+
})
1172+
defer managed.RemoveTransportOptions(transportOptsURL)
1173+
11311174
opts := &git2go.CloneOptions{
11321175
Bare: false,
11331176
CheckoutBranch: branchName,
11341177
CheckoutOptions: git2go.CheckoutOptions{
11351178
Strategy: git2go.CheckoutForce,
11361179
},
1137-
FetchOptions: git2go.FetchOptions{
1138-
RemoteCallbacks: git2go.RemoteCallbacks{
1139-
CertificateCheckCallback: func(cert *git2go.Certificate, valid bool, hostname string) error {
1140-
return nil
1141-
},
1142-
},
1143-
},
11441180
}
1181+
repo, err := git2go.Clone(transportOptsURL, dir, opts)
11451182

1146-
return git2go.Clone(repoURL, dir, opts)
1183+
// set the origin remote url to the actual repo url, since
1184+
// the origin remote will have transportOptsURl as the it's url
1185+
// because that's the url used to clone the repo.
1186+
err = repo.Remotes.SetUrl("origin", repoURL)
1187+
if err != nil {
1188+
return nil, err
1189+
}
1190+
return repo, nil
11471191
}
11481192

11491193
func waitForNewHead(g *WithT, repo *git2go.Repository, branch, preChangeHash string) {
11501194
var commitToResetTo *git2go.Commit
11511195

1196+
cleanup, err := configureManagedTransportOptions(repo, "")
1197+
if err != nil {
1198+
panic(err)
1199+
}
1200+
defer cleanup()
1201+
1202+
origin, err := repo.Remotes.Lookup("origin")
1203+
if err != nil {
1204+
panic("origin not set")
1205+
}
1206+
defer origin.Free()
1207+
11521208
// Now try to fetch new commits from that remote branch
11531209
g.Eventually(func() bool {
1154-
origin, err := repo.Remotes.Lookup("origin")
1155-
if err != nil {
1156-
panic("origin not set")
1157-
}
1158-
defer origin.Free()
1159-
11601210
if err := origin.Fetch(
11611211
[]string{branchRefName(branch)},
11621212
&libgit2.FetchOptions{}, "",
@@ -1205,6 +1255,12 @@ func commitIdFromBranch(repo *git2go.Repository, branchName string) string {
12051255
}
12061256

12071257
func getRemoteHead(repo *git2go.Repository, branchName string) (*git2go.Oid, error) {
1258+
cleanup, err := configureManagedTransportOptions(repo, "")
1259+
if err != nil {
1260+
return nil, err
1261+
}
1262+
defer cleanup()
1263+
12081264
remote, err := repo.Remotes.Lookup("origin")
12091265
if err != nil {
12101266
return nil, err
@@ -1385,11 +1441,17 @@ func testWithCustomRepoAndImagePolicy(
13851441

13861442
// Clone the repo.
13871443
repoURL := gitServer.HTTPAddressWithCredentials() + repositoryPath
1388-
localRepo, err := clone(repoURL, "origin", args.branch)
1444+
localRepo, err := clone(repoURL, args.branch)
13891445
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
1446+
defer localRepo.Free()
1447+
1448+
origin, err := localRepo.Remotes.Lookup("origin")
1449+
g.Expect(err).ToNot(HaveOccurred(), "failed to look up remote origin")
1450+
defer origin.Free()
1451+
localRepo.Remotes.SetUrl("origin", repoURL)
13901452

13911453
// Create GitRepository resource for the above repo.
1392-
err = createGitRepository(kClient, args.gitRepoName, args.gitRepoNamespace, "", repoURL, "")
1454+
err = createGitRepository(kClient, args.gitRepoName, args.gitRepoNamespace, repoURL, "")
13931455
g.Expect(err).ToNot(HaveOccurred(), "failed to create GitRepository resource")
13941456

13951457
// Create ImagePolicy with populated latest image in the status.
@@ -1440,7 +1502,7 @@ func createNamespace(kClient client.Client, name string) (cleanup, error) {
14401502
return cleanup, nil
14411503
}
14421504

1443-
func createGitRepository(kClient client.Client, name, namespace, impl, repoURL, secretRef string) error {
1505+
func createGitRepository(kClient client.Client, name, namespace, repoURL, secretRef string) error {
14441506
gitRepo := &sourcev1.GitRepository{
14451507
Spec: sourcev1.GitRepositorySpec{
14461508
URL: repoURL,
@@ -1452,9 +1514,7 @@ func createGitRepository(kClient client.Client, name, namespace, impl, repoURL,
14521514
if secretRef != "" {
14531515
gitRepo.Spec.SecretRef = &meta.LocalObjectReference{Name: secretRef}
14541516
}
1455-
if impl != "" {
1456-
gitRepo.Spec.GitImplementation = impl
1457-
}
1517+
gitRepo.Spec.GitImplementation = sourcev1.LibGit2Implementation
14581518
return kClient.Create(context.Background(), gitRepo)
14591519
}
14601520

0 commit comments

Comments
 (0)