mirror of
https://github.com/project-zot/zot.git
synced 2025-03-25 02:32:57 -05:00
fix(sync): fix syncing signatures when using destination in sync's config (#1429)
Signed-off-by: Petu Eusebiu <peusebiu@cisco.com>
This commit is contained in:
parent
449f0d0ac3
commit
d62dbcdf63
2 changed files with 114 additions and 47 deletions
|
@ -631,7 +631,7 @@ func (sig *signaturesCopier) canSkipOCIRefs(localRepo, digestStr string, index i
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncBlob(sig *signaturesCopier, imageStore storage.ImageStore, remoteRepo, localRepo string,
|
func syncBlob(sig *signaturesCopier, imageStore storage.ImageStore, localRepo, remoteRepo string,
|
||||||
digest godigest.Digest,
|
digest godigest.Digest,
|
||||||
) error {
|
) error {
|
||||||
getBlobURL := sig.upstreamURL
|
getBlobURL := sig.upstreamURL
|
||||||
|
|
|
@ -2946,7 +2946,7 @@ func TestPeriodicallySignaturesErr(t *testing.T) {
|
||||||
So(found, ShouldBeTrue)
|
So(found, ShouldBeTrue)
|
||||||
|
|
||||||
// should not be synced nor sync on demand
|
// should not be synced nor sync on demand
|
||||||
resp, err := resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err := resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusNotFound)
|
So(resp.StatusCode(), ShouldEqual, http.StatusNotFound)
|
||||||
})
|
})
|
||||||
|
@ -3285,7 +3285,7 @@ func TestSignatures(t *testing.T) {
|
||||||
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
||||||
destPort := splittedURL[len(splittedURL)-1]
|
destPort := splittedURL[len(splittedURL)-1]
|
||||||
|
|
||||||
a := &options.AnnotationOptions{Annotations: []string{"tag=1.0"}}
|
a := &options.AnnotationOptions{Annotations: []string{fmt.Sprintf("tag=%s", testImageTag)}}
|
||||||
amap, err := a.AnnotationsMap()
|
amap, err := a.AnnotationsMap()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
@ -3294,7 +3294,7 @@ func TestSignatures(t *testing.T) {
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
// notation verify the image
|
// notation verify the image
|
||||||
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")
|
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)
|
||||||
|
|
||||||
err = test.VerifyWithNotation(image, tdir)
|
err = test.VerifyWithNotation(image, tdir)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
@ -3308,7 +3308,7 @@ func TestSignatures(t *testing.T) {
|
||||||
IgnoreTlog: true,
|
IgnoreTlog: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")})
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)})
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// get oci references from downstream, should be synced
|
// get oci references from downstream, should be synced
|
||||||
|
@ -3369,7 +3369,7 @@ func TestSignatures(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3387,7 +3387,7 @@ func TestSignatures(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3403,7 +3403,7 @@ func TestSignatures(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3448,7 +3448,7 @@ func TestSignatures(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3469,7 +3469,7 @@ func TestSignatures(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3492,7 +3492,7 @@ func TestSignatures(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3513,7 +3513,7 @@ func TestSignatures(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3530,7 +3530,7 @@ func TestSignatures(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3571,7 +3571,7 @@ func TestSignatures(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3595,7 +3595,7 @@ func TestSignatures(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -3616,7 +3616,7 @@ func TestSignatures(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
})
|
})
|
||||||
|
@ -4157,21 +4157,21 @@ func TestSignaturesOnDemand(t *testing.T) {
|
||||||
defer dcm.StopServer()
|
defer dcm.StopServer()
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err := resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err := resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
||||||
destPort := splittedURL[len(splittedURL)-1]
|
destPort := splittedURL[len(splittedURL)-1]
|
||||||
|
|
||||||
a := &options.AnnotationOptions{Annotations: []string{"tag=1.0"}}
|
a := &options.AnnotationOptions{Annotations: []string{fmt.Sprintf("tag=%s", testImageTag)}}
|
||||||
amap, err := a.AnnotationsMap()
|
amap, err := a.AnnotationsMap()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// notation verify the synced image
|
// notation verify the synced image
|
||||||
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")
|
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)
|
||||||
err = test.VerifyWithNotation(image, tdir)
|
err = test.VerifyWithNotation(image, tdir)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
@ -4183,7 +4183,7 @@ func TestSignaturesOnDemand(t *testing.T) {
|
||||||
Annotations: amap,
|
Annotations: amap,
|
||||||
IgnoreTlog: true,
|
IgnoreTlog: true,
|
||||||
}
|
}
|
||||||
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")})
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)})
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// test negative case
|
// test negative case
|
||||||
|
@ -4211,7 +4211,7 @@ func TestSignaturesOnDemand(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -4230,7 +4230,7 @@ func TestSignaturesOnDemand(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -4324,7 +4324,7 @@ func TestSignaturesOnDemand(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err = resty.R().Get(destBaseURL + "/v2/" + testSignedImage + "/manifests/1.0")
|
resp, err = resty.R().Get(destBaseURL + "/v2/" + testSignedImage + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -4412,7 +4412,7 @@ func TestOnlySignaturesOnDemand(t *testing.T) {
|
||||||
defer dcm.StopServer()
|
defer dcm.StopServer()
|
||||||
|
|
||||||
// sync on demand
|
// sync on demand
|
||||||
resp, err := resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/1.0")
|
resp, err := resty.R().Get(destBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
@ -4421,7 +4421,7 @@ func TestOnlySignaturesOnDemand(t *testing.T) {
|
||||||
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
||||||
destPort := splittedURL[len(splittedURL)-1]
|
destPort := splittedURL[len(splittedURL)-1]
|
||||||
|
|
||||||
a := &options.AnnotationOptions{Annotations: []string{"tag=1.0"}}
|
a := &options.AnnotationOptions{Annotations: []string{fmt.Sprintf("tag=%s", testImageTag)}}
|
||||||
amap, err := a.AnnotationsMap()
|
amap, err := a.AnnotationsMap()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
@ -4430,7 +4430,7 @@ func TestOnlySignaturesOnDemand(t *testing.T) {
|
||||||
generateKeyPairs(tdir)
|
generateKeyPairs(tdir)
|
||||||
|
|
||||||
// sync signature on demand when upstream doesn't have the signature
|
// sync signature on demand when upstream doesn't have the signature
|
||||||
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")
|
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)
|
||||||
err = test.VerifyWithNotation(image, tdir)
|
err = test.VerifyWithNotation(image, tdir)
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
|
|
||||||
|
@ -4443,14 +4443,14 @@ func TestOnlySignaturesOnDemand(t *testing.T) {
|
||||||
IgnoreTlog: true,
|
IgnoreTlog: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")})
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)})
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
|
|
||||||
// sign upstream image
|
// sign upstream image
|
||||||
So(func() { signImage(tdir, srcPort, repoName, digest) }, ShouldNotPanic)
|
So(func() { signImage(tdir, srcPort, repoName, digest) }, ShouldNotPanic)
|
||||||
|
|
||||||
// now it should sync signatures on demand, even if we already have the image
|
// now it should sync signatures on demand, even if we already have the image
|
||||||
image = fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")
|
image = fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)
|
||||||
err = test.VerifyWithNotation(image, tdir)
|
err = test.VerifyWithNotation(image, tdir)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
@ -4463,7 +4463,7 @@ func TestOnlySignaturesOnDemand(t *testing.T) {
|
||||||
IgnoreTlog: true,
|
IgnoreTlog: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")})
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)})
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// trigger syncing OCI references on demand
|
// trigger syncing OCI references on demand
|
||||||
|
@ -4791,14 +4791,14 @@ func TestSyncSignaturesDiff(t *testing.T) {
|
||||||
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
||||||
destPort := splittedURL[len(splittedURL)-1]
|
destPort := splittedURL[len(splittedURL)-1]
|
||||||
|
|
||||||
a := &options.AnnotationOptions{Annotations: []string{"tag=1.0"}}
|
a := &options.AnnotationOptions{Annotations: []string{fmt.Sprintf("tag=%s", testImageTag)}}
|
||||||
amap, err := a.AnnotationsMap()
|
amap, err := a.AnnotationsMap()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// notation verify the image
|
// notation verify the image
|
||||||
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")
|
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)
|
||||||
err = test.VerifyWithNotation(image, tdir)
|
err = test.VerifyWithNotation(image, tdir)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
@ -4810,7 +4810,7 @@ func TestSyncSignaturesDiff(t *testing.T) {
|
||||||
Annotations: amap,
|
Annotations: amap,
|
||||||
IgnoreTlog: true,
|
IgnoreTlog: true,
|
||||||
}
|
}
|
||||||
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")})
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)})
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// now add new signatures to upstream and let sync detect that upstream signatures changed and pull them
|
// now add new signatures to upstream and let sync detect that upstream signatures changed and pull them
|
||||||
|
@ -4825,7 +4825,7 @@ func TestSyncSignaturesDiff(t *testing.T) {
|
||||||
time.Sleep(10 * time.Second)
|
time.Sleep(10 * time.Second)
|
||||||
|
|
||||||
// notation verify the image
|
// notation verify the image
|
||||||
image = fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")
|
image = fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)
|
||||||
err = test.VerifyWithNotation(image, tdir)
|
err = test.VerifyWithNotation(image, tdir)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
@ -4837,7 +4837,7 @@ func TestSyncSignaturesDiff(t *testing.T) {
|
||||||
Annotations: amap,
|
Annotations: amap,
|
||||||
IgnoreTlog: true,
|
IgnoreTlog: true,
|
||||||
}
|
}
|
||||||
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, "1.0")})
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort, repoName, testImageTag)})
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
// compare signatures
|
// compare signatures
|
||||||
|
@ -4868,7 +4868,7 @@ func TestSyncSignaturesDiff(t *testing.T) {
|
||||||
|
|
||||||
var manifestDigest string
|
var manifestDigest string
|
||||||
for _, manifestDesc := range srcIndex.Manifests {
|
for _, manifestDesc := range srcIndex.Manifests {
|
||||||
if manifestDesc.Annotations[ispec.AnnotationRefName] == "1.0" {
|
if manifestDesc.Annotations[ispec.AnnotationRefName] == testImageTag {
|
||||||
manifestDigest = string(manifestDesc.Digest)
|
manifestDigest = string(manifestDesc.Digest)
|
||||||
} else if manifestDesc.MediaType == notreg.ArtifactTypeNotation {
|
} else if manifestDesc.MediaType == notreg.ArtifactTypeNotation {
|
||||||
upstreamRefsDigests = append(upstreamRefsDigests, manifestDesc.Digest.String())
|
upstreamRefsDigests = append(upstreamRefsDigests, manifestDesc.Digest.String())
|
||||||
|
@ -5036,6 +5036,8 @@ func TestOnlySignedFlag(t *testing.T) {
|
||||||
|
|
||||||
func TestSyncWithDestination(t *testing.T) {
|
func TestSyncWithDestination(t *testing.T) {
|
||||||
Convey("Test sync computes destination option correctly", t, func() {
|
Convey("Test sync computes destination option correctly", t, func() {
|
||||||
|
repoName := "zot-fold/zot-test"
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
content syncconf.Content
|
content syncconf.Content
|
||||||
expected string
|
expected string
|
||||||
|
@ -5044,42 +5046,34 @@ func TestSyncWithDestination(t *testing.T) {
|
||||||
{
|
{
|
||||||
expected: "zot-test/zot-fold/zot-test",
|
expected: "zot-test/zot-fold/zot-test",
|
||||||
content: syncconf.Content{Prefix: "zot-fold/zot-test", Destination: "/zot-test", StripPrefix: false},
|
content: syncconf.Content{Prefix: "zot-fold/zot-test", Destination: "/zot-test", StripPrefix: false},
|
||||||
repo: "zot-fold/zot-test",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
expected: "zot-fold/zot-test",
|
expected: "zot-fold/zot-test",
|
||||||
content: syncconf.Content{Prefix: "zot-fold/zot-test", Destination: "/", StripPrefix: false},
|
content: syncconf.Content{Prefix: "zot-fold/zot-test", Destination: "/", StripPrefix: false},
|
||||||
repo: "zot-fold/zot-test",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
expected: "zot-test",
|
expected: "zot-test",
|
||||||
content: syncconf.Content{Prefix: "zot-fold/zot-test", Destination: "/zot-test", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/zot-test", Destination: "/zot-test", StripPrefix: true},
|
||||||
repo: "zot-fold/zot-test",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
expected: "zot-test",
|
expected: "zot-test",
|
||||||
content: syncconf.Content{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
||||||
repo: "zot-fold/zot-test",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
expected: "zot-test",
|
expected: "zot-test",
|
||||||
content: syncconf.Content{Prefix: "zot-fold/zot-test", Destination: "/zot-test", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/zot-test", Destination: "/zot-test", StripPrefix: true},
|
||||||
repo: "zot-fold/zot-test",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
expected: "zot-test",
|
expected: "zot-test",
|
||||||
content: syncconf.Content{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
||||||
repo: "zot-fold/zot-test",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
expected: "zot-test",
|
expected: "zot-test",
|
||||||
content: syncconf.Content{Prefix: "zot-fold/**", Destination: "/", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/**", Destination: "/", StripPrefix: true},
|
||||||
repo: "zot-fold/zot-test",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
expected: "zot-fold/zot-test",
|
expected: "zot-fold/zot-test",
|
||||||
content: syncconf.Content{Prefix: "zot-fold/**", Destination: "/", StripPrefix: false},
|
content: syncconf.Content{Prefix: "zot-fold/**", Destination: "/", StripPrefix: false},
|
||||||
repo: "zot-fold/zot-test",
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5116,6 +5110,27 @@ func TestSyncWithDestination(t *testing.T) {
|
||||||
scm.StartAndWait(srcPort)
|
scm.StartAndWait(srcPort)
|
||||||
defer scm.StopServer()
|
defer scm.StopServer()
|
||||||
|
|
||||||
|
splittedURL := strings.SplitAfter(srcBaseURL, ":")
|
||||||
|
srcPort = splittedURL[len(splittedURL)-1]
|
||||||
|
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
defer func() { _ = os.Chdir(cwd) }()
|
||||||
|
tdir := t.TempDir()
|
||||||
|
_ = os.Chdir(tdir)
|
||||||
|
|
||||||
|
generateKeyPairs(tdir)
|
||||||
|
|
||||||
|
// get manifest digest from source
|
||||||
|
resp, err := resty.R().Get(srcBaseURL + "/v2/" + repoName + "/manifests/" + testImageTag)
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
digest := godigest.FromBytes(resp.Body())
|
||||||
|
|
||||||
|
So(func() { signImage(tdir, srcPort, repoName, digest) }, ShouldNotPanic)
|
||||||
|
|
||||||
Convey("Test peridiocally sync", func() {
|
Convey("Test peridiocally sync", func() {
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
updateDuration, _ := time.ParseDuration("30m")
|
updateDuration, _ := time.ParseDuration("30m")
|
||||||
|
@ -5148,6 +5163,32 @@ func TestSyncWithDestination(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp, ShouldNotBeNil)
|
So(resp, ShouldNotBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
||||||
|
destPort := splittedURL[len(splittedURL)-1]
|
||||||
|
|
||||||
|
a := &options.AnnotationOptions{Annotations: []string{fmt.Sprintf("tag=%s", testImageTag)}}
|
||||||
|
amap, err := a.AnnotationsMap()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// notation verify the synced image
|
||||||
|
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, testCase.expected, testImageTag)
|
||||||
|
err = test.VerifyWithNotation(image, tdir)
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
// cosign verify the synced image
|
||||||
|
vrfy := verify.VerifyCommand{
|
||||||
|
RegistryOptions: options.RegistryOptions{AllowInsecure: true},
|
||||||
|
CheckClaims: true,
|
||||||
|
KeyRef: path.Join(tdir, "cosign.pub"),
|
||||||
|
Annotations: amap,
|
||||||
|
IgnoreTlog: true,
|
||||||
|
}
|
||||||
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort,
|
||||||
|
testCase.expected, testImageTag)})
|
||||||
|
So(err, ShouldBeNil)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -5179,6 +5220,32 @@ func TestSyncWithDestination(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(resp, ShouldNotBeNil)
|
So(resp, ShouldNotBeNil)
|
||||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||||
|
|
||||||
|
splittedURL = strings.SplitAfter(destBaseURL, ":")
|
||||||
|
destPort := splittedURL[len(splittedURL)-1]
|
||||||
|
|
||||||
|
a := &options.AnnotationOptions{Annotations: []string{fmt.Sprintf("tag=%s", testImageTag)}}
|
||||||
|
amap, err := a.AnnotationsMap()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// notation verify the synced image
|
||||||
|
image := fmt.Sprintf("localhost:%s/%s:%s", destPort, testCase.expected, testImageTag)
|
||||||
|
err = test.VerifyWithNotation(image, tdir)
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
// cosign verify the synced image
|
||||||
|
vrfy := verify.VerifyCommand{
|
||||||
|
RegistryOptions: options.RegistryOptions{AllowInsecure: true},
|
||||||
|
CheckClaims: true,
|
||||||
|
KeyRef: path.Join(tdir, "cosign.pub"),
|
||||||
|
Annotations: amap,
|
||||||
|
IgnoreTlog: true,
|
||||||
|
}
|
||||||
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", destPort,
|
||||||
|
testCase.expected, testImageTag)})
|
||||||
|
So(err, ShouldBeNil)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -5671,7 +5738,7 @@ func generateKeyPairs(tdir string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func signImage(tdir, port, repoName string, digest godigest.Digest) {
|
func signImage(tdir, port, repoName string, digest godigest.Digest) {
|
||||||
annotations := []string{"tag=1.0"}
|
annotations := []string{fmt.Sprintf("tag=%s", testImageTag)}
|
||||||
|
|
||||||
// push signatures to upstream server so that we can sync them later
|
// push signatures to upstream server so that we can sync them later
|
||||||
// sign the image
|
// sign the image
|
||||||
|
@ -5703,7 +5770,7 @@ func signImage(tdir, port, repoName string, digest godigest.Digest) {
|
||||||
IgnoreTlog: true,
|
IgnoreTlog: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", port, repoName, "1.0")})
|
err = vrfy.Exec(context.TODO(), []string{fmt.Sprintf("localhost:%s/%s:%s", port, repoName, testImageTag)})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -5714,7 +5781,7 @@ func signImage(tdir, port, repoName string, digest godigest.Digest) {
|
||||||
test.LoadNotationPath(tdir)
|
test.LoadNotationPath(tdir)
|
||||||
|
|
||||||
// sign the image
|
// sign the image
|
||||||
image := fmt.Sprintf("localhost:%s/%s:%s", port, repoName, "1.0")
|
image := fmt.Sprintf("localhost:%s/%s:%s", port, repoName, testImageTag)
|
||||||
|
|
||||||
err = test.SignWithNotation("good", image, tdir)
|
err = test.SignWithNotation("good", image, tdir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -5805,7 +5872,7 @@ func pushRepo(url, repoName string) godigest.Digest {
|
||||||
digest = godigest.FromBytes(content)
|
digest = godigest.FromBytes(content)
|
||||||
|
|
||||||
_, err = resty.R().SetHeader("Content-Type", "application/vnd.oci.image.manifest.v1+json").
|
_, err = resty.R().SetHeader("Content-Type", "application/vnd.oci.image.manifest.v1+json").
|
||||||
SetBody(content).Put(url + fmt.Sprintf("/v2/%s/manifests/1.0", repoName))
|
SetBody(content).Put(url + fmt.Sprintf("/v2/%s/manifests/%s", repoName, testImageTag))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue