2020-06-05 19:34:23 +02:00
|
|
|
package manifest
|
|
|
|
|
|
|
|
import (
|
2024-01-26 22:48:06 +01:00
|
|
|
"context"
|
2020-06-05 19:34:23 +02:00
|
|
|
"fmt"
|
2022-07-20 05:33:08 +02:00
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
|
|
|
|
2024-01-26 22:48:06 +01:00
|
|
|
"github.com/distribution/distribution/v3/registry/storage/driver/inmemory"
|
|
|
|
"github.com/distribution/distribution/v3/testutil"
|
2020-06-05 19:34:23 +02:00
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/stretchr/testify/assert"
|
2022-07-20 05:33:08 +02:00
|
|
|
|
|
|
|
"github.com/goharbor/harbor/src/registryctl/api/registry/test"
|
2020-06-05 19:34:23 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestDeleteManifest(t *testing.T) {
|
|
|
|
ctx := context.Background()
|
|
|
|
inmemoryDriver := inmemory.New()
|
|
|
|
|
|
|
|
registry := test.CreateRegistry(t, inmemoryDriver)
|
|
|
|
repo := test.MakeRepository(t, registry, "mftest")
|
|
|
|
|
|
|
|
// Create random layers
|
|
|
|
randomLayers, err := testutil.CreateRandomLayers(3)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed to make layers: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Upload all layers
|
|
|
|
err = testutil.UploadBlobs(repo, randomLayers)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed to upload layers: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
sharedKey := test.GetAnyKey(randomLayers)
|
|
|
|
manifest, err := testutil.MakeSchema2Manifest(repo, append(test.GetKeys(randomLayers), sharedKey))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed to make manifest: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
manifestService := test.MakeManifestService(t, repo)
|
|
|
|
_, err = manifestService.Put(ctx, manifest)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("manifest upload failed: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
manifestDigest, err := manifestService.Put(ctx, manifest)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("manifest upload failed: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
req, err := http.NewRequest(http.MethodDelete, "http://api/registry/{name}/manifests/{reference}/?tags=1,2,3", nil)
|
|
|
|
varMap := make(map[string]string, 1)
|
|
|
|
varMap["reference"] = manifestDigest.String()
|
|
|
|
varMap["name"] = fmt.Sprintf("%v", repo.Named())
|
|
|
|
req = mux.SetURLVars(req, varMap)
|
|
|
|
|
|
|
|
manifestHandler := NewHandler(inmemoryDriver)
|
|
|
|
rec := httptest.NewRecorder()
|
|
|
|
manifestHandler.ServeHTTP(rec, req)
|
|
|
|
assert.True(t, rec.Result().StatusCode == 200)
|
|
|
|
|
|
|
|
// check that all of the layers of manifest are deleted.
|
|
|
|
blobs := test.AllBlobs(t, registry)
|
|
|
|
for dgst := range randomLayers {
|
|
|
|
if _, ok := blobs[dgst]; !ok {
|
|
|
|
t.Fatalf("random layer blob missing: %v", dgst)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|