@@ -16,7 +16,6 @@ limitations under the License.
16
16
package controllers
17
17
18
18
import (
19
- "context"
20
19
"crypto/rand"
21
20
"crypto/rsa"
22
21
"crypto/tls"
@@ -64,22 +63,13 @@ func TestOCIRepository_Reconcile(t *testing.T) {
64
63
g := NewWithT (t )
65
64
66
65
// Registry server with public images
67
- regServer , err := setupRegistryServer (context . Background () , registryOptions {})
66
+ regServer , err := setupRegistryServer (ctx , registryOptions {})
68
67
if err != nil {
69
- t .Fatalf (err .Error ())
70
- }
71
-
72
- versions := []string {"6.1.4" , "6.1.5" , "6.1.6" }
73
- podinfoVersions := make (map [string ]podinfoImage )
74
-
75
- for i := 0 ; i < len (versions ); i ++ {
76
- pi , err := createPodinfoImageFromTar (fmt .Sprintf ("podinfo-%s.tar" , versions [i ]), versions [i ], fmt .Sprintf ("http://%s" , regServer .registryHost ))
77
68
g .Expect (err ).ToNot (HaveOccurred ())
78
-
79
- podinfoVersions [versions [i ]] = * pi
80
-
81
69
}
82
70
71
+ podinfoVersions , err := pushMultiplePodinfoImage (regServer .registryHost , []string {"6.1.4" , "6.1.5" , "6.1.6" })
72
+
83
73
tests := []struct {
84
74
name string
85
75
url string
@@ -465,10 +455,10 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
465
455
},
466
456
}
467
457
468
- server , err := setupRegistryServer (context . Background () , tt .registryOpts )
458
+ server , err := setupRegistryServer (ctx , tt .registryOpts )
469
459
g .Expect (err ).NotTo (HaveOccurred ())
470
460
471
- img , err := createPodinfoImageFromTar ("podinfo-6.1.6.tar" , "6.1.6" , fmt . Sprintf ( "http://%s" , server .registryHost ) , tt .craneOpts ... )
461
+ img , err := createPodinfoImageFromTar ("podinfo-6.1.6.tar" , "6.1.6" , server .registryHost , tt .craneOpts ... )
472
462
g .Expect (err ).ToNot (HaveOccurred ())
473
463
obj .Spec .URL = img .url
474
464
obj .Spec .Reference = & sourcev1.OCIRepositoryRef {
@@ -520,7 +510,7 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
520
510
Storage : testStorage ,
521
511
}
522
512
523
- repoURL , err := r .getArtifactURL (context . Background () , obj , nil , nil )
513
+ repoURL , err := r .getArtifactURL (ctx , obj , nil , nil )
524
514
g .Expect (err ).To (BeNil ())
525
515
526
516
assertConditions := tt .assertConditions
@@ -530,7 +520,7 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
530
520
}
531
521
532
522
tmpDir := t .TempDir ()
533
- got , err := r .reconcileSource (context . Background () , obj , & sourcev1.Artifact {}, tmpDir )
523
+ got , err := r .reconcileSource (ctx , obj , & sourcev1.Artifact {}, tmpDir )
534
524
535
525
if tt .wantErr {
536
526
g .Expect (err ).ToNot (BeNil ())
@@ -547,14 +537,12 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
547
537
func TestOCIRepository_reconcileSource_remoteReference (t * testing.T ) {
548
538
g := NewWithT (t )
549
539
550
- server , err := setupRegistryServer (context .Background (), registryOptions {})
551
- g .Expect (err ).ToNot (HaveOccurred ())
552
-
553
- img5 , err := createPodinfoImageFromTar ("podinfo-6.1.5.tar" , "6.1.5" , fmt .Sprintf ("http://%s" , server .registryHost ))
540
+ server , err := setupRegistryServer (ctx , registryOptions {})
554
541
g .Expect (err ).ToNot (HaveOccurred ())
555
542
556
- img6 , err := createPodinfoImageFromTar ("podinfo-6.1.6.tar" , "6.1.6" , fmt .Sprintf ("http://%s" , server .registryHost ))
557
- g .Expect (err ).ToNot (HaveOccurred ())
543
+ podinfoVersions , err := pushMultiplePodinfoImage (server .registryHost , []string {"6.1.4" , "6.1.5" , "6.1.6" })
544
+ img6 := podinfoVersions ["6.1.6" ]
545
+ img5 := podinfoVersions ["6.1.5" ]
558
546
559
547
tests := []struct {
560
548
name string
@@ -676,7 +664,7 @@ func TestOCIRepository_reconcileSource_remoteReference(t *testing.T) {
676
664
677
665
artifact := & sourcev1.Artifact {}
678
666
tmpDir := t .TempDir ()
679
- got , err := r .reconcileSource (context . TODO () , obj , artifact , tmpDir )
667
+ got , err := r .reconcileSource (ctx , obj , artifact , tmpDir )
680
668
if tt .wantErr {
681
669
g .Expect (err ).To (HaveOccurred ())
682
670
} else {
@@ -690,6 +678,93 @@ func TestOCIRepository_reconcileSource_remoteReference(t *testing.T) {
690
678
}
691
679
}
692
680
681
+ func TestOCIRepository_getArtifactURL (t * testing.T ) {
682
+ g := NewWithT (t )
683
+
684
+ server , err := setupRegistryServer (ctx , registryOptions {})
685
+ g .Expect (err ).ToNot (HaveOccurred ())
686
+
687
+ imgs , err := pushMultiplePodinfoImage (server .registryHost , []string {"6.1.4" , "6.1.5" , "6.1.6" })
688
+ g .Expect (err ).ToNot (HaveOccurred ())
689
+
690
+ tests := []struct {
691
+ name string
692
+ url string
693
+ reference * sourcev1.OCIRepositoryRef
694
+ wantErr bool
695
+ want string
696
+ }{
697
+ {
698
+ name : "valid url with no reference" ,
699
+ url : "oci://ghcr.io/stefanprodan/charts" ,
700
+ want : "ghcr.io/stefanprodan/charts" ,
701
+ },
702
+ {
703
+ name : "valid url with tag reference" ,
704
+ url : "oci://ghcr.io/stefanprodan/charts" ,
705
+ reference : & sourcev1.OCIRepositoryRef {
706
+ Tag : "6.1.6" ,
707
+ },
708
+ want : "ghcr.io/stefanprodan/charts:6.1.6" ,
709
+ },
710
+ {
711
+ name : "valid url with digest reference" ,
712
+ url : "oci://ghcr.io/stefanprodan/charts" ,
713
+ reference : & sourcev1.OCIRepositoryRef {
714
+ Digest : imgs ["6.1.6" ].digest .Hex ,
715
+ },
716
+ want : "ghcr.io/stefanprodan/charts@" + imgs ["6.1.6" ].digest .Hex ,
717
+ },
718
+ {
719
+ name : "valid url with semver reference" ,
720
+ url : fmt .Sprintf ("oci://%s/podinfo" , server .registryHost ),
721
+ reference : & sourcev1.OCIRepositoryRef {
722
+ SemVer : ">= 6.1.6" ,
723
+ },
724
+ want : server .registryHost + "/podinfo:6.1.6" ,
725
+ },
726
+ {
727
+ name : "invalid url without oci prefix" ,
728
+ url : "ghcr.io/stefanprodan/charts" ,
729
+ wantErr : true ,
730
+ },
731
+ }
732
+
733
+ builder := fakeclient .NewClientBuilder ().WithScheme (testEnv .GetScheme ())
734
+ r := & OCIRepositoryReconciler {
735
+ Client : builder .Build (),
736
+ EventRecorder : record .NewFakeRecorder (32 ),
737
+ Storage : testStorage ,
738
+ }
739
+
740
+ for _ , tt := range tests {
741
+ t .Run (tt .name , func (t * testing.T ) {
742
+ obj := & sourcev1.OCIRepository {
743
+ ObjectMeta : metav1.ObjectMeta {
744
+ GenerateName : "artifact-url-" ,
745
+ },
746
+ Spec : sourcev1.OCIRepositorySpec {
747
+ URL : tt .url ,
748
+ Interval : metav1.Duration {Duration : interval },
749
+ Timeout : & metav1.Duration {Duration : timeout },
750
+ },
751
+ }
752
+
753
+ if tt .reference != nil {
754
+ obj .Spec .Reference = tt .reference
755
+ }
756
+
757
+ got , err := r .getArtifactURL (ctx , obj , authn .DefaultKeychain , nil )
758
+ if tt .wantErr {
759
+ g .Expect (err ).To (HaveOccurred ())
760
+ return
761
+ }
762
+ g .Expect (err ).ToNot (HaveOccurred ())
763
+ g .Expect (got ).To (Equal (tt .want ))
764
+ })
765
+ }
766
+ }
767
+
693
768
func TestOCIRepository_CertSecret (t * testing.T ) {
694
769
g := NewWithT (t )
695
770
@@ -839,7 +914,6 @@ func TestOCIRepository_CertSecret(t *testing.T) {
839
914
}, timeout ).Should (BeTrue ())
840
915
})
841
916
}
842
-
843
917
}
844
918
845
919
type artifactFixture struct {
@@ -861,6 +935,11 @@ func createPodinfoImageFromTar(tarFileName, tag, registryURL string, opts ...cra
861
935
862
936
image = setPodinfoImageAnnotations (image , tag )
863
937
938
+ // url.Parse doesn't handle urls with no scheme well e.g localhost:<port>
939
+ if ! (strings .HasPrefix (registryURL , "http://" ) || strings .HasPrefix (registryURL , "https://" )) {
940
+ registryURL = fmt .Sprintf ("http://%s" , registryURL )
941
+ }
942
+
864
943
myURL , err := url .Parse (registryURL )
865
944
if err != nil {
866
945
return nil , err
@@ -892,6 +971,22 @@ func createPodinfoImageFromTar(tarFileName, tag, registryURL string, opts ...cra
892
971
}, nil
893
972
}
894
973
974
+ func pushMultiplePodinfoImage (serverURL string , versions []string ) (map [string ]podinfoImage , error ) {
975
+ podinfoVersions := make (map [string ]podinfoImage )
976
+
977
+ for i := 0 ; i < len (versions ); i ++ {
978
+ pi , err := createPodinfoImageFromTar (fmt .Sprintf ("podinfo-%s.tar" , versions [i ]), versions [i ], serverURL )
979
+ if err != nil {
980
+ return nil , err
981
+ }
982
+
983
+ podinfoVersions [versions [i ]] = * pi
984
+
985
+ }
986
+
987
+ return podinfoVersions , nil
988
+ }
989
+
895
990
func setPodinfoImageAnnotations (img gcrv1.Image , tag string ) gcrv1.Image {
896
991
metadata := map [string ]string {
897
992
"org.opencontainers.image.source" : "https://github.com/stefanprodan/podinfo" ,
0 commit comments