Skip to content

Commit

Permalink
serialization: remove extra "hierarchy" from mediatypes
Browse files Browse the repository at this point in the history
The fact that we are serializing is implied. This PR removes the extra
bits in the media type that only serve to confuse and waste bytes. The
new media types better reflect the reality for the usage of each type
and how they relate.

This must be followed up by a split of the serialization document, but
this change _should_ be applied first.

This change is backwards incompatible with previous versions of the OCI
specification. Since we are before 1.0, this is acceptable.

Signed-off-by: Stephen J Day <stephen.day@docker.com>
  • Loading branch information
stevvooe committed Aug 26, 2016
1 parent 09fc80c commit 432c134
Show file tree
Hide file tree
Showing 13 changed files with 34 additions and 34 deletions.
2 changes: 1 addition & 1 deletion cmd/oci-image-tool/validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func (v *validateCmd) validatePath(name string) error {
return schema.MediaTypeManifestList.Validate(f)

case typeConfig:
return schema.MediaTypeImageSerializationConfig.Validate(f)
return schema.MediaTypeImageConfig.Validate(f)
}

return fmt.Errorf("type %q unimplemented", typ)
Expand Down
4 changes: 2 additions & 2 deletions image-layout.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,13 @@ $ cat ./blobs/sha256-afff3924849e458c5ef237db5f89539274d5e609db5db935ed3959c90f1
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": [
"mediaType": "application/vnd.oci.image.serialization.config.v1+json",
"mediaType": "application/vnd.oci.image.config.v1+json",
"size": 7023,
"digest": "sha256:5b0bcabd1ed22e9fb1310cf6c2dec7cdef19f0ad69efa1f392e94a4333501270"
},
"layers": [
{
"mediaType": "application/vnd.oci.image.serialization.rootfs.tar.gzip",
"mediaType": "application/vnd.oci.image.layer.tar+gzip",
"size": 32654,
"digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f"
},
Expand Down
2 changes: 1 addition & 1 deletion image/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func findConfig(w walker, d *descriptor) (*config, error) {
return errors.Wrapf(err, "%s: error reading config", path)
}

if err := schema.MediaTypeImageSerializationConfig.Validate(bytes.NewReader(buf)); err != nil {
if err := schema.MediaTypeImageConfig.Validate(bytes.NewReader(buf)); err != nil {
return errors.Wrapf(err, "%s: config validation failed", path)
}

Expand Down
2 changes: 1 addition & 1 deletion image/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func (m *manifest) validate(w walker) error {

func (m *manifest) unpack(w walker, dest string) error {
for _, d := range m.Layers {
if d.MediaType != string(schema.MediaTypeImageSerialization) {
if d.MediaType != string(schema.MediaTypeImageConfig) {
continue
}

Expand Down
4 changes: 2 additions & 2 deletions img/media-types.dot
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ digraph G {
{
manifestList [shape=note, label="Manifest list\n<<optional>>\napplication/vnd.oci.image.manifest.list.v1+json"]
manifest [shape=note, label="Image manifest\napplication/vnd.oci.image.manifest.v1+json"]
config [shape=note, label="Image JSON\napplication/vnd.oci.image.serialization.config.v1+json"]
layer [shape=note, label="Layer tar+gzip\napplication/vnd.oci.image.serialization.rootfs.tar.gzip"]
config [shape=note, label="Image JSON\napplication/vnd.oci.image.config.v1+json"]
layer [shape=note, label="Layer tar+gzip\napplication/vnd.oci.image.layer.tar+gzip"]
combined [shape=note, label="Combined image JSON and filesystem changesets\n<<optional>>\napplication/vnd.oci.image.serialization.combined.v1+json"]
}

Expand Down
8 changes: 4 additions & 4 deletions manifest.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,23 +158,23 @@ Unlike the [Manifest List](#manifest-list), which contains information about a s
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.serialization.config.v1+json",
"mediaType": "application/vnd.oci.image.config.v1+json",
"size": 7023,
"digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
},
"layers": [
{
"mediaType": "application/vnd.oci.image.serialization.rootfs.tar.gzip",
"mediaType": "application/vnd.oci.image.layer.tar+gzip",
"size": 32654,
"digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f"
},
{
"mediaType": "application/vnd.oci.image.serialization.rootfs.tar.gzip",
"mediaType": "application/vnd.oci.image.layer.tar+gzip",
"size": 16724,
"digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b"
},
{
"mediaType": "application/vnd.oci.image.serialization.rootfs.tar.gzip",
"mediaType": "application/vnd.oci.image.layer.tar+gzip",
"size": 73109,
"digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736"
}
Expand Down
6 changes: 3 additions & 3 deletions media-types.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ The following `mediaType` MIME types are used by the formats described here, and
- `application/vnd.oci.descriptor.v1+json`: [Content Descriptor](descriptor.md)
- `application/vnd.oci.image.manifest.list.v1+json`: [Manifest list](manifest.md#manifest-list)
- `application/vnd.oci.image.manifest.v1+json`: [Image manifest format](manifest.md#image-manifest)
- `application/vnd.oci.image.serialization.rootfs.tar.gzip`: ["Layer", as a gzipped tar archive](serialization.md#creating-an-image-filesystem-changeset)
- `application/vnd.oci.image.serialization.config.v1+json`: [Container config JSON](serialization.md#image-json-description)
- `application/vnd.oci.image.layer.tar+gzip`: ["Layer", as a gzipped tar archive](serialization.md#creating-an-image-filesystem-changeset)
- `application/vnd.oci.image.config.v1+json`: [Container config JSON](serialization.md#image-json-description)

## Compatibility Matrix

Expand All @@ -32,7 +32,7 @@ This section shows where the OCI Image Specification is compatible with formats

- [application/vnd.docker.image.rootfs.diff.tar.gzip](https://github.com/docker/docker/blob/master/image/spec/v1.md#creating-an-image-filesystem-changeset)

### application/vnd.oci.image.serialization.config.v1+json
### application/vnd.oci.image.config.v1+json

**Similar/related schema**

Expand Down
2 changes: 1 addition & 1 deletion schema/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ func TestConfig(t *testing.T) {
},
} {
r := strings.NewReader(tt.config)
err := schema.MediaTypeImageSerializationConfig.Validate(r)
err := schema.MediaTypeImageConfig.Validate(r)

if got := err != nil; tt.fail != got {
t.Errorf("test %d: expected validation failure %t but got %t, err %v", i, tt.fail, got, err)
Expand Down
4 changes: 2 additions & 2 deletions schema/manifest_backwards_compatibility_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ var compatMap = map[string]string{
"application/vnd.docker.distribution.manifest.list.v2+json": "application/vnd.oci.image.manifest.list.v1+json",
"application/vnd.docker.distribution.manifest.v2+json": "application/vnd.oci.image.manifest.v1+json",
"application/vnd.docker.image.rootfs.diff.tar.gzip": "application/vnd.oci.image.rootfs.tar.gzip",
"application/vnd.docker.container.image.v1+json": "application/vnd.oci.image.serialization.config.v1+json",
"application/vnd.docker.container.image.v1+json": "application/vnd.oci.image.config.v1+json",
}

// convertFormats converts Docker v2.2 image format JSON documents to OCI
Expand Down Expand Up @@ -220,7 +220,7 @@ func TestBackwardsCompatibilityConfig(t *testing.T) {

manifest := convertFormats(tt.manifest)
r := strings.NewReader(manifest)
err := schema.MediaTypeImageSerializationConfig.Validate(r)
err := schema.MediaTypeImageConfig.Validate(r)

if got := err != nil; tt.fail != got {
t.Errorf("test %d: expected validation failure %t but got %t, err %v", i, tt.fail, got, err)
Expand Down
8 changes: 4 additions & 4 deletions schema/manifest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func TestManifest(t *testing.T) {
},
"layers": [
{
"mediaType": "application/vnd.oci.image.serialization.rootfs.tar.gzip",
"mediaType": "application/vnd.oci.image.layer.tar+gzip",
"size": "675598"
}
]
Expand All @@ -88,17 +88,17 @@ func TestManifest(t *testing.T) {
},
"layers": [
{
"mediaType": "application/vnd.oci.image.serialization.rootfs.tar.gzip",
"mediaType": "application/vnd.oci.image.layer.tar+gzip",
"size": 675598,
"digest": "sha256:9d3dd9504c685a304985025df4ed0283e47ac9ffa9bd0326fddf4d59513f0827"
},
{
"mediaType": "application/vnd.oci.image.serialization.rootfs.tar.gzip",
"mediaType": "application/vnd.oci.image.layer.tar+gzip",
"size": 156,
"digest": "sha256:2b689805fbd00b2db1df73fae47562faac1a626d5f61744bfe29946ecff5d73d"
},
{
"mediaType": "application/vnd.oci.image.serialization.rootfs.tar.gzip",
"mediaType": "application/vnd.oci.image.layer.tar+gzip",
"size": 148,
"digest": "sha256:c57089565e894899735d458f0fd4bb17a0f1e0df8d72da392b85c9b35ee777cd"
}
Expand Down
18 changes: 9 additions & 9 deletions schema/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ import "net/http"

// Media types for the OCI image formats
const (
MediaTypeDescriptor Validator = `application/vnd.oci.descriptor.v1+json`
MediaTypeManifest Validator = `application/vnd.oci.image.manifest.v1+json`
MediaTypeManifestList Validator = `application/vnd.oci.image.manifest.list.v1+json`
MediaTypeImageSerialization unimplemented = `application/vnd.oci.image.serialization.rootfs.tar.gzip`
MediaTypeImageSerializationConfig Validator = `application/vnd.oci.image.serialization.config.v1+json`
MediaTypeDescriptor Validator = `application/vnd.oci.descriptor.v1+json`
MediaTypeManifest Validator = `application/vnd.oci.image.manifest.v1+json`
MediaTypeManifestList Validator = `application/vnd.oci.image.manifest.list.v1+json`
MediaTypeImageConfig Validator = `application/vnd.oci.image.config.v1+json`
MediaTypeImageLayer unimplemented = `application/vnd.oci.image.layer.tar+gzip`
)

var (
Expand All @@ -32,10 +32,10 @@ var (

// specs maps OCI schema media types to schema files.
specs = map[Validator]string{
MediaTypeDescriptor: "content-descriptor.json",
MediaTypeManifest: "image-manifest-schema.json",
MediaTypeManifestList: "manifest-list-schema.json",
MediaTypeImageSerializationConfig: "config-schema.json",
MediaTypeDescriptor: "content-descriptor.json",
MediaTypeManifest: "image-manifest-schema.json",
MediaTypeManifestList: "manifest-list-schema.json",
MediaTypeImageConfig: "config-schema.json",
}
)

Expand Down
4 changes: 2 additions & 2 deletions serialization.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ This specification uses the following terms:
<dd>
A layer DiffID is a SHA256 digest over the layer's uncompressed tar archive and serialized in the descriptor digest format, e.g., <code>sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9</code>.
Layers must be packed and unpacked reproducibly to avoid changing the layer ID, for example by using tar-split to save the tar headers.
NOTE: the DiffID is different than the digest in the manifest list because the manifest digest is taken over the gzipped layer for `application/vnd.oci.image.serialization.rootfs.tar.gzip` types.
NOTE: the DiffID is different than the digest in the manifest list because the manifest digest is taken over the gzipped layer for `application/vnd.oci.image.layer.tar+gzip` types.
</dd>
<dt>
Layer ChainID
Expand Down Expand Up @@ -86,7 +86,7 @@ This specification uses the following terms:

Here is an example image JSON file:

```json,title=Image%20JSON&mediatype=application/vnd.oci.image.serialization.config.v1%2Bjson
```json,title=Image%20JSON&mediatype=application/vnd.oci.image.config.v1%2Bjson
{
"created": "2015-10-31T22:22:56.015925234Z",
"author": "Alyssa P. Hacker <alyspdev@example.com>",
Expand Down
4 changes: 2 additions & 2 deletions specs-go/v1/mediatype.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ const (
MediaTypeImageManifestList = "application/vnd.oci.image.manifest.list.v1+json"

// MediaTypeImageSerialization is the mediaType used for layers referenced by the manifest.
MediaTypeImageSerialization = "application/vnd.oci.image.serialization.rootfs.tar.gzip"
MediaTypeImageSerialization = "application/vnd.oci.image.layer.tar+gzip"

// MediaTypeImageSerializationConfig specifies the mediaType for the image configuration.
MediaTypeImageSerializationConfig = "application/vnd.oci.image.serialization.config.v1+json"
MediaTypeImageSerializationConfig = "application/vnd.oci.image.config.v1+json"
)

0 comments on commit 432c134

Please sign in to comment.