@@ -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
407408func 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+
875907func 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
943980func 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
11491193func 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
12071257func 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