mirror of
https://github.com/project-zot/zot.git
synced 2026-06-17 21:17:58 +08:00
chore: update image and dist specs to v1.1.1 (#3023)
chore: update image-spec and dist-spec to v1.1.1 As side effect the warnings mentioned in https://github.com/project-zot/zui/issues/475#issuecomment-2715802363 should no longer show up. Signed-off-by: Andrei Aaron <aaaron@luxoft.com>
This commit is contained in:
@@ -301,7 +301,7 @@ func TestRedisOptions(t *testing.T) {
|
||||
|
||||
Convey("Test redis options from json", func(c C) {
|
||||
fileContent := []byte(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"remoteCache": true,
|
||||
"cacheDriver": {
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
// @title Open Container Initiative Distribution Specification
|
||||
// @version v1.1.0
|
||||
// @version v1.1.1
|
||||
// @description APIs for Open Container Initiative Distribution Specification
|
||||
|
||||
// @license.name Apache 2.0
|
||||
|
||||
@@ -37,7 +37,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
defer os.Remove(logFile.Name()) // clean up
|
||||
|
||||
content := fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
@@ -96,7 +96,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
test.WaitTillServerReady(baseURL)
|
||||
|
||||
content = fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
@@ -169,7 +169,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
defer os.Remove(logFile.Name()) // clean up
|
||||
|
||||
content := fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"gc": false,
|
||||
@@ -213,7 +213,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
test.WaitTillServerReady(baseURL)
|
||||
|
||||
content = fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"gc": true,
|
||||
@@ -276,7 +276,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
defer os.Remove(logFile.Name()) // clean up
|
||||
|
||||
content := fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
@@ -332,7 +332,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
test.WaitTillServerReady(baseURL)
|
||||
|
||||
content = fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
@@ -409,7 +409,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
defer os.Remove(logFile.Name()) // clean up
|
||||
|
||||
content := fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
@@ -455,7 +455,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
test.WaitTillServerReady(baseURL)
|
||||
|
||||
content = fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
@@ -525,7 +525,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
defer os.Remove(logFile.Name()) // clean up
|
||||
|
||||
content := fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
|
||||
@@ -1468,7 +1468,7 @@ func TestOverlappingSyncRetentionConfig(t *testing.T) {
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := `{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"gc": true,
|
||||
@@ -1537,7 +1537,7 @@ func TestOverlappingSyncRetentionConfig(t *testing.T) {
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := `{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"gc": true,
|
||||
@@ -1604,7 +1604,7 @@ func TestOverlappingSyncRetentionConfig(t *testing.T) {
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := `{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"gc": true,
|
||||
@@ -1669,7 +1669,7 @@ func TestOverlappingSyncRetentionConfig(t *testing.T) {
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := `{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"gc": true,
|
||||
@@ -1743,7 +1743,7 @@ func TestSyncWithRemoteStorageConfig(t *testing.T) {
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := `{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"dedupe": false,
|
||||
@@ -1812,7 +1812,7 @@ func TestSyncWithRemoteStorageConfig(t *testing.T) {
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"dedupe": false,
|
||||
@@ -1884,7 +1884,7 @@ func TestSyncWithRemoteStorageConfig(t *testing.T) {
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s",
|
||||
"subPaths":{
|
||||
|
||||
+19
-19
@@ -90,7 +90,7 @@ func TestServe(t *testing.T) {
|
||||
|
||||
// missing storage config should result in an error in Controller.Init()
|
||||
content := []byte(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"http": {
|
||||
"address":"127.0.0.1",
|
||||
"port":"8080"
|
||||
@@ -142,7 +142,7 @@ func TestVerify(t *testing.T) {
|
||||
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
|
||||
content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
|
||||
"http":{"address":"127.0.0.1","port":"8080","realm":"zot"},
|
||||
"log":{"level":"debug"}}`)
|
||||
_, err = tmpfile.Write(content)
|
||||
@@ -162,7 +162,7 @@ func TestVerify(t *testing.T) {
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := []byte(`
|
||||
distspecversion: 1.1.0
|
||||
distspecversion: 1.1.1
|
||||
http:
|
||||
address: 127.0.0.1
|
||||
port: 8080
|
||||
@@ -579,7 +579,7 @@ storage:
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := []byte(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "/tmp/zot",
|
||||
"gc": true,
|
||||
@@ -631,7 +631,7 @@ storage:
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := []byte(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "/tmp/zot",
|
||||
"gc": true,
|
||||
@@ -1196,7 +1196,7 @@ storage:
|
||||
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
|
||||
content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
|
||||
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
|
||||
"auth":{"openid":{"providers":{"oidc":{"issuer":"http://127.0.0.1:5556/dex"}}}}},
|
||||
"log":{"level":"debug"}}`)
|
||||
@@ -1216,7 +1216,7 @@ storage:
|
||||
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
|
||||
content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
|
||||
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
|
||||
"auth":{"openid":{"providers":{"github":{"clientid":"client_id"}}}}},
|
||||
"log":{"level":"debug"}}`)
|
||||
@@ -1236,7 +1236,7 @@ storage:
|
||||
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
|
||||
content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
|
||||
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
|
||||
"auth":{"openid":{"providers":{"unsupported":{"issuer":"http://127.0.0.1:5556/dex"}}}}},
|
||||
"log":{"level":"debug"}}`)
|
||||
@@ -1256,7 +1256,7 @@ storage:
|
||||
|
||||
defer os.Remove(tmpfile.Name()) // clean up
|
||||
|
||||
content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
|
||||
content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
|
||||
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
|
||||
"auth":{"openid":{"providers":{"oidc":{"issuer":"http://127.0.0.1:5556/dex",
|
||||
"clientid":"client_id","scopes":["openid"]}}}}},
|
||||
@@ -1369,7 +1369,7 @@ storage:
|
||||
err = tmpCredsFile.Close()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
|
||||
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
|
||||
"auth":{"htpasswd":{"path":"test/data/htpasswd"}, "sessionKeysFile": "%s",
|
||||
"failDelay": 5 } }, "log": { "level": "debug" } }`,
|
||||
@@ -1404,7 +1404,7 @@ storage:
|
||||
err = tmpCredsFile.Close()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
|
||||
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
|
||||
"auth":{"htpasswd":{"path":"test/data/htpasswd"}, "sessionKeysFile": "%s",
|
||||
"failDelay": 5 } }, "log": { "level": "debug" } }`,
|
||||
@@ -1440,7 +1440,7 @@ storage:
|
||||
err = tmpCredsFile.Close()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
|
||||
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
|
||||
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
|
||||
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
|
||||
@@ -1478,7 +1478,7 @@ storage:
|
||||
err = tmpCredsFile.Close()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
|
||||
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
|
||||
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
|
||||
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
|
||||
@@ -1518,7 +1518,7 @@ storage:
|
||||
err = tmpCredsFile.Close()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
|
||||
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
|
||||
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
|
||||
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
|
||||
@@ -1555,7 +1555,7 @@ storage:
|
||||
err = tmpCredsFile.Close()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
|
||||
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
|
||||
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
|
||||
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
|
||||
@@ -1592,7 +1592,7 @@ storage:
|
||||
err = tmpCredsFile.Close()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
|
||||
content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
|
||||
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
|
||||
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
|
||||
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
|
||||
@@ -1621,7 +1621,7 @@ func TestApiKeyConfig(t *testing.T) {
|
||||
|
||||
defer os.Remove(tmpfile.Name())
|
||||
|
||||
content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
|
||||
content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
|
||||
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
|
||||
"auth":{"openid":{"providers":{"oidc":{"issuer":"http://127.0.0.1:5556/dex",
|
||||
"clientid":"client_id","scopes":["openid"]}}}}},
|
||||
@@ -1642,7 +1642,7 @@ func TestApiKeyConfig(t *testing.T) {
|
||||
|
||||
defer os.Remove(tmpfile.Name())
|
||||
|
||||
content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
|
||||
content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
|
||||
"http":{"address":"127.0.0.1","port":"8080","realm":"zot"},
|
||||
"log":{"level":"debug"}}`)
|
||||
|
||||
@@ -1661,7 +1661,7 @@ func TestApiKeyConfig(t *testing.T) {
|
||||
|
||||
defer os.Remove(tmpfile.Name())
|
||||
|
||||
content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
|
||||
content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
|
||||
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
|
||||
"auth":{"htpasswd":{"path":"test/data/htpasswd"}}},
|
||||
"log":{"level":"debug"}}`)
|
||||
|
||||
@@ -23,7 +23,7 @@ curl http://localhost:8080/v2/_zot/ext/mgmt | jq
|
||||
|
||||
```json
|
||||
{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"binaryType": "-sync-search-scrub-metrics-lint-ui-mgmt",
|
||||
"http": {
|
||||
"auth": {
|
||||
|
||||
@@ -2058,7 +2058,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
|
||||
//nolint: dupl
|
||||
Convey("Reload config without sync", func() {
|
||||
content := fmt.Sprintf(`{"distSpecVersion": "1.1.0", "storage": {"rootDirectory": "%s"},
|
||||
content := fmt.Sprintf(`{"distSpecVersion": "1.1.1", "storage": {"rootDirectory": "%s"},
|
||||
"http": {"address": "127.0.0.1", "port": "%s"},
|
||||
"log": {"level": "debug", "output": "%s"}}`, destDir, destPort, logFile.Name())
|
||||
|
||||
@@ -2116,7 +2116,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
|
||||
// reload config from extensions nil to sync
|
||||
content = fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
@@ -2176,7 +2176,7 @@ func TestConfigReloader(t *testing.T) {
|
||||
//nolint: dupl
|
||||
Convey("Reload bad sync config", func() {
|
||||
content := fmt.Sprintf(`{
|
||||
"distSpecVersion": "1.1.0",
|
||||
"distSpecVersion": "1.1.1",
|
||||
"storage": {
|
||||
"rootDirectory": "%s"
|
||||
},
|
||||
|
||||
@@ -18,6 +18,7 @@ import (
|
||||
"github.com/opencontainers/image-spec/schema"
|
||||
imeta "github.com/opencontainers/image-spec/specs-go"
|
||||
ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/santhosh-tekuri/jsonschema/v5"
|
||||
|
||||
zerr "zotregistry.dev/zot/errors"
|
||||
zcommon "zotregistry.dev/zot/pkg/common"
|
||||
@@ -30,7 +31,7 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
manifestWithEmptyLayersErrMsg = "layers: Array must have at least 1 items"
|
||||
manifestWithEmptyLayersErrMsg = "layers/minItems: minimum 1 items required, but found 0 items"
|
||||
cosignSignatureTagSuffix = "sig"
|
||||
)
|
||||
|
||||
@@ -848,9 +849,9 @@ func ValidateImageIndexSchema(buf []byte) error {
|
||||
}
|
||||
|
||||
func IsEmptyLayersError(err error) bool {
|
||||
var validationErr schema.ValidationError
|
||||
var validationErr *jsonschema.ValidationError
|
||||
if errors.As(err, &validationErr) {
|
||||
if len(validationErr.Errs) == 1 && strings.Contains(err.Error(), manifestWithEmptyLayersErrMsg) {
|
||||
if len(validationErr.Causes) == 1 && strings.Contains(err.Error(), manifestWithEmptyLayersErrMsg) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
|
||||
@@ -103,7 +103,7 @@ func TestValidateManifest(t *testing.T) {
|
||||
|
||||
So(errors.As(err, &internalErr), ShouldBeTrue)
|
||||
So(internalErr.GetDetails(), ShouldContainKey, "jsonSchemaValidation")
|
||||
So(internalErr.GetDetails()["jsonSchemaValidation"], ShouldEqual, "[schemaVersion: Must be less than or equal to 2]")
|
||||
So(internalErr.GetDetails()["jsonSchemaValidation"], ShouldContainSubstring, "must be <= 2 but found 999")
|
||||
})
|
||||
|
||||
Convey("bad config blob", func() {
|
||||
@@ -165,6 +165,25 @@ func TestValidateManifest(t *testing.T) {
|
||||
_, _, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("manifest with empty layers should not error", func() {
|
||||
manifest := ispec.Manifest{
|
||||
Config: ispec.Descriptor{
|
||||
MediaType: ispec.MediaTypeImageConfig,
|
||||
Digest: cdigest,
|
||||
Size: int64(len(cblob)),
|
||||
},
|
||||
Layers: []ispec.Descriptor{},
|
||||
}
|
||||
|
||||
manifest.SchemaVersion = 2
|
||||
|
||||
body, err := json.Marshal(manifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user