mirror of https://github.com/docker/cli.git
vendor updates for manifest cmd
Signed-off-by: Christy Perez <christy@linux.vnet.ibm.com>
This commit is contained in:
parent
16cccc30f9
commit
17886d7547
|
@ -0,0 +1 @@
|
||||||
|
package manifest
|
155
vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go
generated
vendored
Normal file
155
vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go
generated
vendored
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
package manifestlist
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/docker/distribution"
|
||||||
|
"github.com/docker/distribution/manifest"
|
||||||
|
"github.com/opencontainers/go-digest"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MediaTypeManifestList specifies the mediaType for manifest lists.
|
||||||
|
const MediaTypeManifestList = "application/vnd.docker.distribution.manifest.list.v2+json"
|
||||||
|
|
||||||
|
// SchemaVersion provides a pre-initialized version structure for this
|
||||||
|
// packages version of the manifest.
|
||||||
|
var SchemaVersion = manifest.Versioned{
|
||||||
|
SchemaVersion: 2,
|
||||||
|
MediaType: MediaTypeManifestList,
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
manifestListFunc := func(b []byte) (distribution.Manifest, distribution.Descriptor, error) {
|
||||||
|
m := new(DeserializedManifestList)
|
||||||
|
err := m.UnmarshalJSON(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, distribution.Descriptor{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dgst := digest.FromBytes(b)
|
||||||
|
return m, distribution.Descriptor{Digest: dgst, Size: int64(len(b)), MediaType: MediaTypeManifestList}, err
|
||||||
|
}
|
||||||
|
err := distribution.RegisterManifestSchema(MediaTypeManifestList, manifestListFunc)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("Unable to register manifest: %s", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PlatformSpec specifies a platform where a particular image manifest is
|
||||||
|
// applicable.
|
||||||
|
type PlatformSpec struct {
|
||||||
|
// Architecture field specifies the CPU architecture, for example
|
||||||
|
// `amd64` or `ppc64`.
|
||||||
|
Architecture string `json:"architecture"`
|
||||||
|
|
||||||
|
// OS specifies the operating system, for example `linux` or `windows`.
|
||||||
|
OS string `json:"os"`
|
||||||
|
|
||||||
|
// OSVersion is an optional field specifying the operating system
|
||||||
|
// version, for example `10.0.10586`.
|
||||||
|
OSVersion string `json:"os.version,omitempty"`
|
||||||
|
|
||||||
|
// OSFeatures is an optional field specifying an array of strings,
|
||||||
|
// each listing a required OS feature (for example on Windows `win32k`).
|
||||||
|
OSFeatures []string `json:"os.features,omitempty"`
|
||||||
|
|
||||||
|
// Variant is an optional field specifying a variant of the CPU, for
|
||||||
|
// example `ppc64le` to specify a little-endian version of a PowerPC CPU.
|
||||||
|
Variant string `json:"variant,omitempty"`
|
||||||
|
|
||||||
|
// Features is an optional field specifying an array of strings, each
|
||||||
|
// listing a required CPU feature (for example `sse4` or `aes`).
|
||||||
|
Features []string `json:"features,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// A ManifestDescriptor references a platform-specific manifest.
|
||||||
|
type ManifestDescriptor struct {
|
||||||
|
distribution.Descriptor
|
||||||
|
|
||||||
|
// Platform specifies which platform the manifest pointed to by the
|
||||||
|
// descriptor runs on.
|
||||||
|
Platform PlatformSpec `json:"platform"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ManifestList references manifests for various platforms.
|
||||||
|
type ManifestList struct {
|
||||||
|
manifest.Versioned
|
||||||
|
|
||||||
|
// Config references the image configuration as a blob.
|
||||||
|
Manifests []ManifestDescriptor `json:"manifests"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// References returns the distribution descriptors for the referenced image
|
||||||
|
// manifests.
|
||||||
|
func (m ManifestList) References() []distribution.Descriptor {
|
||||||
|
dependencies := make([]distribution.Descriptor, len(m.Manifests))
|
||||||
|
for i := range m.Manifests {
|
||||||
|
dependencies[i] = m.Manifests[i].Descriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
return dependencies
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeserializedManifestList wraps ManifestList with a copy of the original
|
||||||
|
// JSON.
|
||||||
|
type DeserializedManifestList struct {
|
||||||
|
ManifestList
|
||||||
|
|
||||||
|
// canonical is the canonical byte representation of the Manifest.
|
||||||
|
canonical []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromDescriptors takes a slice of descriptors, and returns a
|
||||||
|
// DeserializedManifestList which contains the resulting manifest list
|
||||||
|
// and its JSON representation.
|
||||||
|
func FromDescriptors(descriptors []ManifestDescriptor) (*DeserializedManifestList, error) {
|
||||||
|
m := ManifestList{
|
||||||
|
Versioned: SchemaVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Manifests = make([]ManifestDescriptor, len(descriptors), len(descriptors))
|
||||||
|
copy(m.Manifests, descriptors)
|
||||||
|
|
||||||
|
deserialized := DeserializedManifestList{
|
||||||
|
ManifestList: m,
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
deserialized.canonical, err = json.MarshalIndent(&m, "", " ")
|
||||||
|
return &deserialized, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON populates a new ManifestList struct from JSON data.
|
||||||
|
func (m *DeserializedManifestList) UnmarshalJSON(b []byte) error {
|
||||||
|
m.canonical = make([]byte, len(b), len(b))
|
||||||
|
// store manifest list in canonical
|
||||||
|
copy(m.canonical, b)
|
||||||
|
|
||||||
|
// Unmarshal canonical JSON into ManifestList object
|
||||||
|
var manifestList ManifestList
|
||||||
|
if err := json.Unmarshal(m.canonical, &manifestList); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.ManifestList = manifestList
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON returns the contents of canonical. If canonical is empty,
|
||||||
|
// marshals the inner contents.
|
||||||
|
func (m *DeserializedManifestList) MarshalJSON() ([]byte, error) {
|
||||||
|
if len(m.canonical) > 0 {
|
||||||
|
return m.canonical, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New("JSON representation not initialized in DeserializedManifestList")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Payload returns the raw content of the manifest list. The contents can be
|
||||||
|
// used to calculate the content identifier.
|
||||||
|
func (m DeserializedManifestList) Payload() (string, []byte, error) {
|
||||||
|
return m.MediaType, m.canonical, nil
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
package schema2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/docker/distribution"
|
||||||
|
"github.com/docker/distribution/context"
|
||||||
|
"github.com/opencontainers/go-digest"
|
||||||
|
)
|
||||||
|
|
||||||
|
// builder is a type for constructing manifests.
|
||||||
|
type builder struct {
|
||||||
|
// bs is a BlobService used to publish the configuration blob.
|
||||||
|
bs distribution.BlobService
|
||||||
|
|
||||||
|
// configMediaType is media type used to describe configuration
|
||||||
|
configMediaType string
|
||||||
|
|
||||||
|
// configJSON references
|
||||||
|
configJSON []byte
|
||||||
|
|
||||||
|
// dependencies is a list of descriptors that gets built by successive
|
||||||
|
// calls to AppendReference. In case of image configuration these are layers.
|
||||||
|
dependencies []distribution.Descriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewManifestBuilder is used to build new manifests for the current schema
|
||||||
|
// version. It takes a BlobService so it can publish the configuration blob
|
||||||
|
// as part of the Build process.
|
||||||
|
func NewManifestBuilder(bs distribution.BlobService, configMediaType string, configJSON []byte) distribution.ManifestBuilder {
|
||||||
|
mb := &builder{
|
||||||
|
bs: bs,
|
||||||
|
configMediaType: configMediaType,
|
||||||
|
configJSON: make([]byte, len(configJSON)),
|
||||||
|
}
|
||||||
|
copy(mb.configJSON, configJSON)
|
||||||
|
|
||||||
|
return mb
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build produces a final manifest from the given references.
|
||||||
|
func (mb *builder) Build(ctx context.Context) (distribution.Manifest, error) {
|
||||||
|
m := Manifest{
|
||||||
|
Versioned: SchemaVersion,
|
||||||
|
Layers: make([]distribution.Descriptor, len(mb.dependencies)),
|
||||||
|
}
|
||||||
|
copy(m.Layers, mb.dependencies)
|
||||||
|
|
||||||
|
configDigest := digest.FromBytes(mb.configJSON)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
m.Config, err = mb.bs.Stat(ctx, configDigest)
|
||||||
|
switch err {
|
||||||
|
case nil:
|
||||||
|
// Override MediaType, since Put always replaces the specified media
|
||||||
|
// type with application/octet-stream in the descriptor it returns.
|
||||||
|
m.Config.MediaType = mb.configMediaType
|
||||||
|
return FromStruct(m)
|
||||||
|
case distribution.ErrBlobUnknown:
|
||||||
|
// nop
|
||||||
|
default:
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add config to the blob store
|
||||||
|
m.Config, err = mb.bs.Put(ctx, mb.configMediaType, mb.configJSON)
|
||||||
|
// Override MediaType, since Put always replaces the specified media
|
||||||
|
// type with application/octet-stream in the descriptor it returns.
|
||||||
|
m.Config.MediaType = mb.configMediaType
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return FromStruct(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendReference adds a reference to the current ManifestBuilder.
|
||||||
|
func (mb *builder) AppendReference(d distribution.Describable) error {
|
||||||
|
mb.dependencies = append(mb.dependencies, d.Descriptor())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// References returns the current references added to this builder.
|
||||||
|
func (mb *builder) References() []distribution.Descriptor {
|
||||||
|
return mb.dependencies
|
||||||
|
}
|
138
vendor/github.com/docker/distribution/manifest/schema2/manifest.go
generated
vendored
Normal file
138
vendor/github.com/docker/distribution/manifest/schema2/manifest.go
generated
vendored
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
package schema2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/docker/distribution"
|
||||||
|
"github.com/docker/distribution/manifest"
|
||||||
|
"github.com/opencontainers/go-digest"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// MediaTypeManifest specifies the mediaType for the current version.
|
||||||
|
MediaTypeManifest = "application/vnd.docker.distribution.manifest.v2+json"
|
||||||
|
|
||||||
|
// MediaTypeImageConfig specifies the mediaType for the image configuration.
|
||||||
|
MediaTypeImageConfig = "application/vnd.docker.container.image.v1+json"
|
||||||
|
|
||||||
|
// MediaTypePluginConfig specifies the mediaType for plugin configuration.
|
||||||
|
MediaTypePluginConfig = "application/vnd.docker.plugin.v1+json"
|
||||||
|
|
||||||
|
// MediaTypeLayer is the mediaType used for layers referenced by the
|
||||||
|
// manifest.
|
||||||
|
MediaTypeLayer = "application/vnd.docker.image.rootfs.diff.tar.gzip"
|
||||||
|
|
||||||
|
// MediaTypeForeignLayer is the mediaType used for layers that must be
|
||||||
|
// downloaded from foreign URLs.
|
||||||
|
MediaTypeForeignLayer = "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip"
|
||||||
|
|
||||||
|
// MediaTypeUncompressedLayer is the mediaType used for layers which
|
||||||
|
// are not compressed.
|
||||||
|
MediaTypeUncompressedLayer = "application/vnd.docker.image.rootfs.diff.tar"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// SchemaVersion provides a pre-initialized version structure for this
|
||||||
|
// packages version of the manifest.
|
||||||
|
SchemaVersion = manifest.Versioned{
|
||||||
|
SchemaVersion: 2,
|
||||||
|
MediaType: MediaTypeManifest,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
schema2Func := func(b []byte) (distribution.Manifest, distribution.Descriptor, error) {
|
||||||
|
m := new(DeserializedManifest)
|
||||||
|
err := m.UnmarshalJSON(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, distribution.Descriptor{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dgst := digest.FromBytes(b)
|
||||||
|
return m, distribution.Descriptor{Digest: dgst, Size: int64(len(b)), MediaType: MediaTypeManifest}, err
|
||||||
|
}
|
||||||
|
err := distribution.RegisterManifestSchema(MediaTypeManifest, schema2Func)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("Unable to register manifest: %s", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manifest defines a schema2 manifest.
|
||||||
|
type Manifest struct {
|
||||||
|
manifest.Versioned
|
||||||
|
|
||||||
|
// Config references the image configuration as a blob.
|
||||||
|
Config distribution.Descriptor `json:"config"`
|
||||||
|
|
||||||
|
// Layers lists descriptors for the layers referenced by the
|
||||||
|
// configuration.
|
||||||
|
Layers []distribution.Descriptor `json:"layers"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// References returnes the descriptors of this manifests references.
|
||||||
|
func (m Manifest) References() []distribution.Descriptor {
|
||||||
|
references := make([]distribution.Descriptor, 0, 1+len(m.Layers))
|
||||||
|
references = append(references, m.Config)
|
||||||
|
references = append(references, m.Layers...)
|
||||||
|
return references
|
||||||
|
}
|
||||||
|
|
||||||
|
// Target returns the target of this signed manifest.
|
||||||
|
func (m Manifest) Target() distribution.Descriptor {
|
||||||
|
return m.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeserializedManifest wraps Manifest with a copy of the original JSON.
|
||||||
|
// It satisfies the distribution.Manifest interface.
|
||||||
|
type DeserializedManifest struct {
|
||||||
|
Manifest
|
||||||
|
|
||||||
|
// canonical is the canonical byte representation of the Manifest.
|
||||||
|
canonical []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromStruct takes a Manifest structure, marshals it to JSON, and returns a
|
||||||
|
// DeserializedManifest which contains the manifest and its JSON representation.
|
||||||
|
func FromStruct(m Manifest) (*DeserializedManifest, error) {
|
||||||
|
var deserialized DeserializedManifest
|
||||||
|
deserialized.Manifest = m
|
||||||
|
|
||||||
|
var err error
|
||||||
|
deserialized.canonical, err = json.MarshalIndent(&m, "", " ")
|
||||||
|
return &deserialized, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON populates a new Manifest struct from JSON data.
|
||||||
|
func (m *DeserializedManifest) UnmarshalJSON(b []byte) error {
|
||||||
|
m.canonical = make([]byte, len(b), len(b))
|
||||||
|
// store manifest in canonical
|
||||||
|
copy(m.canonical, b)
|
||||||
|
|
||||||
|
// Unmarshal canonical JSON into Manifest object
|
||||||
|
var manifest Manifest
|
||||||
|
if err := json.Unmarshal(m.canonical, &manifest); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Manifest = manifest
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON returns the contents of canonical. If canonical is empty,
|
||||||
|
// marshals the inner contents.
|
||||||
|
func (m *DeserializedManifest) MarshalJSON() ([]byte, error) {
|
||||||
|
if len(m.canonical) > 0 {
|
||||||
|
return m.canonical, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New("JSON representation not initialized in DeserializedManifest")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Payload returns the raw content of the manifest. The contents can be used to
|
||||||
|
// calculate the content identifier.
|
||||||
|
func (m DeserializedManifest) Payload() (string, []byte, error) {
|
||||||
|
return m.MediaType, m.canonical, nil
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package manifest
|
||||||
|
|
||||||
|
// Versioned provides a struct with the manifest schemaVersion and mediaType.
|
||||||
|
// Incoming content with unknown schema version can be decoded against this
|
||||||
|
// struct to check the version.
|
||||||
|
type Versioned struct {
|
||||||
|
// SchemaVersion is the image manifest schema that this image follows
|
||||||
|
SchemaVersion int `json:"schemaVersion"`
|
||||||
|
|
||||||
|
// MediaType is the media type of this schema.
|
||||||
|
MediaType string `json:"mediaType,omitempty"`
|
||||||
|
}
|
Loading…
Reference in New Issue