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:
Andrei Aaron
2025-03-13 10:06:02 +02:00
committed by GitHub
parent d87cdc9840
commit 2a4edde637
99 changed files with 169 additions and 149 deletions
+1 -1
View File
@@ -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
View File
@@ -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
+9 -9
View File
@@ -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"
},
+7 -7
View File
@@ -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
View File
@@ -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"}}`)
+1 -1
View File
@@ -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": {
+3 -3
View File
@@ -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"
},
+4 -3
View File
@@ -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
+20 -1
View File
@@ -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)
})
})
}