Skip to content

Commit e42e9d0

Browse files
somtochiamastefanprodan
authored andcommitted
Add tests for getArtifactURL
Signed-off-by: Somtochi Onyekwere <[email protected]>
1 parent b072d78 commit e42e9d0

File tree

1 file changed

+120
-25
lines changed

1 file changed

+120
-25
lines changed

controllers/ocirepository_controller_test.go

Lines changed: 120 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ limitations under the License.
1616
package controllers
1717

1818
import (
19-
"context"
2019
"crypto/rand"
2120
"crypto/rsa"
2221
"crypto/tls"
@@ -64,22 +63,13 @@ func TestOCIRepository_Reconcile(t *testing.T) {
6463
g := NewWithT(t)
6564

6665
// Registry server with public images
67-
regServer, err := setupRegistryServer(context.Background(), registryOptions{})
66+
regServer, err := setupRegistryServer(ctx, registryOptions{})
6867
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))
7768
g.Expect(err).ToNot(HaveOccurred())
78-
79-
podinfoVersions[versions[i]] = *pi
80-
8169
}
8270

71+
podinfoVersions, err := pushMultiplePodinfoImage(regServer.registryHost, []string{"6.1.4", "6.1.5", "6.1.6"})
72+
8373
tests := []struct {
8474
name string
8575
url string
@@ -465,10 +455,10 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
465455
},
466456
}
467457

468-
server, err := setupRegistryServer(context.Background(), tt.registryOpts)
458+
server, err := setupRegistryServer(ctx, tt.registryOpts)
469459
g.Expect(err).NotTo(HaveOccurred())
470460

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...)
472462
g.Expect(err).ToNot(HaveOccurred())
473463
obj.Spec.URL = img.url
474464
obj.Spec.Reference = &sourcev1.OCIRepositoryRef{
@@ -520,7 +510,7 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
520510
Storage: testStorage,
521511
}
522512

523-
repoURL, err := r.getArtifactURL(context.Background(), obj, nil, nil)
513+
repoURL, err := r.getArtifactURL(ctx, obj, nil, nil)
524514
g.Expect(err).To(BeNil())
525515

526516
assertConditions := tt.assertConditions
@@ -530,7 +520,7 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
530520
}
531521

532522
tmpDir := t.TempDir()
533-
got, err := r.reconcileSource(context.Background(), obj, &sourcev1.Artifact{}, tmpDir)
523+
got, err := r.reconcileSource(ctx, obj, &sourcev1.Artifact{}, tmpDir)
534524

535525
if tt.wantErr {
536526
g.Expect(err).ToNot(BeNil())
@@ -547,14 +537,12 @@ func TestOCIRepository_reconcileSource_authStrategy(t *testing.T) {
547537
func TestOCIRepository_reconcileSource_remoteReference(t *testing.T) {
548538
g := NewWithT(t)
549539

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{})
554541
g.Expect(err).ToNot(HaveOccurred())
555542

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"]
558546

559547
tests := []struct {
560548
name string
@@ -676,7 +664,7 @@ func TestOCIRepository_reconcileSource_remoteReference(t *testing.T) {
676664

677665
artifact := &sourcev1.Artifact{}
678666
tmpDir := t.TempDir()
679-
got, err := r.reconcileSource(context.TODO(), obj, artifact, tmpDir)
667+
got, err := r.reconcileSource(ctx, obj, artifact, tmpDir)
680668
if tt.wantErr {
681669
g.Expect(err).To(HaveOccurred())
682670
} else {
@@ -690,6 +678,93 @@ func TestOCIRepository_reconcileSource_remoteReference(t *testing.T) {
690678
}
691679
}
692680

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+
693768
func TestOCIRepository_CertSecret(t *testing.T) {
694769
g := NewWithT(t)
695770

@@ -839,7 +914,6 @@ func TestOCIRepository_CertSecret(t *testing.T) {
839914
}, timeout).Should(BeTrue())
840915
})
841916
}
842-
843917
}
844918

845919
type artifactFixture struct {
@@ -861,6 +935,11 @@ func createPodinfoImageFromTar(tarFileName, tag, registryURL string, opts ...cra
861935

862936
image = setPodinfoImageAnnotations(image, tag)
863937

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+
864943
myURL, err := url.Parse(registryURL)
865944
if err != nil {
866945
return nil, err
@@ -892,6 +971,22 @@ func createPodinfoImageFromTar(tarFileName, tag, registryURL string, opts ...cra
892971
}, nil
893972
}
894973

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+
895990
func setPodinfoImageAnnotations(img gcrv1.Image, tag string) gcrv1.Image {
896991
metadata := map[string]string{
897992
"org.opencontainers.image.source": "https://github.com/stefanprodan/podinfo",

0 commit comments

Comments
 (0)