vendor containers/image and OCI/image-spec

Signed-off-by: Antonio Murdaca <runcom@redhat.com>
This commit is contained in:
Antonio Murdaca
2016-09-06 16:19:52 +02:00
parent 4421e7ea2f
commit 649ea391a4
11 changed files with 516 additions and 36 deletions

View File

@@ -6,6 +6,7 @@ import (
"encoding/json"
"github.com/docker/libtrust"
imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
)
// FIXME: Should we just use docker/distribution and docker/docker implementations directly?
@@ -20,23 +21,12 @@ const (
DockerV2Schema2MIMEType = "application/vnd.docker.distribution.manifest.v2+json"
// DockerV2ListMIMEType MIME type represents Docker manifest schema 2 list
DockerV2ListMIMEType = "application/vnd.docker.distribution.manifest.list.v2+json"
// OCIV1DescriptorMIMEType specifies the mediaType for a content descriptor.
OCIV1DescriptorMIMEType = "application/vnd.oci.descriptor.v1+json"
// OCIV1ImageManifestMIMEType specifies the mediaType for an image manifest.
OCIV1ImageManifestMIMEType = "application/vnd.oci.image.manifest.v1+json"
// OCIV1ImageManifestListMIMEType specifies the mediaType for an image manifest list.
OCIV1ImageManifestListMIMEType = "application/vnd.oci.image.manifest.list.v1+json"
// OCIV1ImageSerializationMIMEType is the mediaType used for layers referenced by the manifest.
OCIV1ImageSerializationMIMEType = "application/vnd.oci.image.layer.tar+gzip"
// OCIV1ImageSerializationConfigMIMEType specifies the mediaType for the image configuration.
OCIV1ImageSerializationConfigMIMEType = "application/vnd.oci.image.config.v1+json"
)
// DefaultRequestedManifestMIMETypes is a list of MIME types a types.ImageSource
// should request from the backend unless directed otherwise.
var DefaultRequestedManifestMIMETypes = []string{
OCIV1ImageManifestMIMEType,
imgspecv1.MediaTypeImageManifest,
DockerV2Schema2MIMEType,
DockerV2Schema1SignedMIMEType,
DockerV2Schema1MIMEType,
@@ -58,7 +48,7 @@ func GuessMIMEType(manifest []byte) string {
}
switch meta.MediaType {
case DockerV2Schema2MIMEType, DockerV2ListMIMEType, OCIV1DescriptorMIMEType, OCIV1ImageManifestMIMEType, OCIV1ImageManifestListMIMEType: // A recognized type.
case DockerV2Schema2MIMEType, DockerV2ListMIMEType, imgspecv1.MediaTypeImageManifest, imgspecv1.MediaTypeImageManifestList: // A recognized type.
return meta.MediaType
}
// this is the only way the function can return DockerV2Schema1MIMEType, and recognizing that is essential for stripping the JWS signatures = computing the correct manifest digest.

View File

@@ -10,22 +10,10 @@ import (
"github.com/containers/image/manifest"
"github.com/containers/image/types"
imgspec "github.com/opencontainers/image-spec/specs-go"
imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
)
type ociManifest struct {
SchemaVersion int `json:"schemaVersion"`
MediaType string `json:"mediaType"`
Config descriptor `json:"config"`
Layers []descriptor `json:"layers"`
Annotations map[string]string `json:"annotations"`
}
type descriptor struct {
Digest string `json:"digest"`
MediaType string `json:"mediaType"`
Size int64 `json:"size"`
}
type ociImageDestination struct {
ref ociReference
}
@@ -91,7 +79,7 @@ func (d *ociImageDestination) PutBlob(digest string, expectedSize int64, stream
}
func createManifest(m []byte) ([]byte, string, error) {
om := ociManifest{}
om := imgspecv1.Manifest{}
mt := manifest.GuessMIMEType(m)
switch mt {
case manifest.DockerV2Schema1MIMEType:
@@ -104,11 +92,11 @@ func createManifest(m []byte) ([]byte, string, error) {
if err := json.Unmarshal(m, &om); err != nil {
return nil, "", err
}
om.MediaType = manifest.OCIV1ImageManifestMIMEType
om.MediaType = imgspecv1.MediaTypeImageManifest
for i := range om.Layers {
om.Layers[i].MediaType = manifest.OCIV1ImageSerializationMIMEType
om.Layers[i].MediaType = imgspecv1.MediaTypeImageSerialization
}
om.Config.MediaType = manifest.OCIV1ImageSerializationConfigMIMEType
om.Config.MediaType = imgspecv1.MediaTypeImageSerializationConfig
b, err := json.Marshal(om)
if err != nil {
return nil, "", err
@@ -116,10 +104,10 @@ func createManifest(m []byte) ([]byte, string, error) {
return b, om.MediaType, nil
case manifest.DockerV2ListMIMEType:
return nil, "", fmt.Errorf("can't create OCI manifest from Docker V2 schema 2 manifest list")
case manifest.OCIV1ImageManifestListMIMEType:
case imgspecv1.MediaTypeImageManifestList:
return nil, "", fmt.Errorf("can't create OCI manifest from OCI manifest list")
case manifest.OCIV1ImageManifestMIMEType:
return m, om.MediaType, nil
case imgspecv1.MediaTypeImageManifest:
return m, mt, nil
}
return nil, "", fmt.Errorf("Unrecognized manifest media type")
}
@@ -135,7 +123,7 @@ func (d *ociImageDestination) PutManifest(m []byte) error {
if err != nil {
return err
}
desc := descriptor{}
desc := imgspec.Descriptor{}
desc.Digest = digest
// TODO(runcom): beaware and add support for OCI manifest list
desc.MediaType = mt
@@ -176,7 +164,7 @@ func ensureParentDirectoryExists(path string) error {
func (d *ociImageDestination) SupportedManifestMIMETypes() []string {
return []string{
manifest.OCIV1ImageManifestMIMEType,
imgspecv1.MediaTypeImageManifest,
manifest.DockerV2Schema2MIMEType,
}
}