cb6f002350
Add a generic Manifest interface to represent manifests in the registry and remove references to schema specific manifests. Add a ManifestBuilder to construct Manifest objects. Concrete manifest builders will exist for each manifest type and implementations will contain manifest specific data used to build a manifest. Remove Signatures() from Repository interface. Signatures are relevant only to schema1 manifests. Move access to the signature store inside the schema1 manifestStore. Add some API tests to verify signature roundtripping. schema1 ------- Change the way data is stored in schema1.Manifest to enable Payload() to be used to return complete Manifest JSON from the HTTP handler without knowledge of the schema1 protocol. tags ---- Move tag functionality to a seperate TagService and update ManifestService to use the new interfaces. Implement a driver based tagService to be backward compatible with the current tag service. Add a proxyTagService to enable the registry to get a digest for remote manifests from a tag. manifest store -------------- Remove revision store and move all signing functionality into the signed manifeststore. manifest registration --------------------- Add a mechanism to register manifest media types and to allow different manifest types to be Unmarshalled correctly. client ------ Add ManifestServiceOptions to client functions to allow tags to be passed into Put and Get for building correct registry URLs. Change functional arguments to be an interface type to allow passing data without mutating shared state. Signed-off-by: Richard Scothern <richard.scothern@gmail.com> Signed-off-by: Richard Scothern <richard.scothern@docker.com>
112 lines
3.1 KiB
Go
112 lines
3.1 KiB
Go
package distribution
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/docker/distribution/digest"
|
|
)
|
|
|
|
// ErrManifestNotModified is returned when a conditional manifest GetByTag
|
|
// returns nil due to the client indicating it has the latest version
|
|
var ErrManifestNotModified = errors.New("manifest not modified")
|
|
|
|
// ErrUnsupported is returned when an unimplemented or unsupported action is
|
|
// performed
|
|
var ErrUnsupported = errors.New("operation unsupported")
|
|
|
|
// ErrTagUnknown is returned if the given tag is not known by the tag service
|
|
type ErrTagUnknown struct {
|
|
Tag string
|
|
}
|
|
|
|
func (err ErrTagUnknown) Error() string {
|
|
return fmt.Sprintf("unknown tag=%s", err.Tag)
|
|
}
|
|
|
|
// ErrRepositoryUnknown is returned if the named repository is not known by
|
|
// the registry.
|
|
type ErrRepositoryUnknown struct {
|
|
Name string
|
|
}
|
|
|
|
func (err ErrRepositoryUnknown) Error() string {
|
|
return fmt.Sprintf("unknown repository name=%s", err.Name)
|
|
}
|
|
|
|
// ErrRepositoryNameInvalid should be used to denote an invalid repository
|
|
// name. Reason may set, indicating the cause of invalidity.
|
|
type ErrRepositoryNameInvalid struct {
|
|
Name string
|
|
Reason error
|
|
}
|
|
|
|
func (err ErrRepositoryNameInvalid) Error() string {
|
|
return fmt.Sprintf("repository name %q invalid: %v", err.Name, err.Reason)
|
|
}
|
|
|
|
// ErrManifestUnknown is returned if the manifest is not known by the
|
|
// registry.
|
|
type ErrManifestUnknown struct {
|
|
Name string
|
|
Tag string
|
|
}
|
|
|
|
func (err ErrManifestUnknown) Error() string {
|
|
return fmt.Sprintf("unknown manifest name=%s tag=%s", err.Name, err.Tag)
|
|
}
|
|
|
|
// ErrManifestUnknownRevision is returned when a manifest cannot be found by
|
|
// revision within a repository.
|
|
type ErrManifestUnknownRevision struct {
|
|
Name string
|
|
Revision digest.Digest
|
|
}
|
|
|
|
func (err ErrManifestUnknownRevision) Error() string {
|
|
return fmt.Sprintf("unknown manifest name=%s revision=%s", err.Name, err.Revision)
|
|
}
|
|
|
|
// ErrManifestUnverified is returned when the registry is unable to verify
|
|
// the manifest.
|
|
type ErrManifestUnverified struct{}
|
|
|
|
func (ErrManifestUnverified) Error() string {
|
|
return fmt.Sprintf("unverified manifest")
|
|
}
|
|
|
|
// ErrManifestVerification provides a type to collect errors encountered
|
|
// during manifest verification. Currently, it accepts errors of all types,
|
|
// but it may be narrowed to those involving manifest verification.
|
|
type ErrManifestVerification []error
|
|
|
|
func (errs ErrManifestVerification) Error() string {
|
|
var parts []string
|
|
for _, err := range errs {
|
|
parts = append(parts, err.Error())
|
|
}
|
|
|
|
return fmt.Sprintf("errors verifying manifest: %v", strings.Join(parts, ","))
|
|
}
|
|
|
|
// ErrManifestBlobUnknown returned when a referenced blob cannot be found.
|
|
type ErrManifestBlobUnknown struct {
|
|
Digest digest.Digest
|
|
}
|
|
|
|
func (err ErrManifestBlobUnknown) Error() string {
|
|
return fmt.Sprintf("unknown blob %v on manifest", err.Digest)
|
|
}
|
|
|
|
// ErrManifestNameInvalid should be used to denote an invalid manifest
|
|
// name. Reason may set, indicating the cause of invalidity.
|
|
type ErrManifestNameInvalid struct {
|
|
Name string
|
|
Reason error
|
|
}
|
|
|
|
func (err ErrManifestNameInvalid) Error() string {
|
|
return fmt.Sprintf("manifest name %q invalid: %v", err.Name, err.Reason)
|
|
}
|