Add a new generic container registry client via a new `container` package. Use this to create a command line utility as well as a new upload target for container registries. The code uses the github.com/containers/* project and packages to interact with container registires that is also used by skopeo, podman et al. One if the dependencies is `proglottis/gpgme` that is using cgo to bind libgpgme, so we have to add the corresponding devel package to the BuildRequires as well as installing it on CI. Checks will follow later via an integration test.
119 lines
3.4 KiB
Go
119 lines
3.4 KiB
Go
package distribution
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/opencontainers/go-digest"
|
|
)
|
|
|
|
// ErrAccessDenied is returned when an access to a requested resource is
|
|
// denied.
|
|
var ErrAccessDenied = errors.New("access denied")
|
|
|
|
// 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")
|
|
|
|
// ErrSchemaV1Unsupported is returned when a client tries to upload a schema v1
|
|
// manifest but the registry is configured to reject it
|
|
var ErrSchemaV1Unsupported = errors.New("manifest schema v1 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 "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)
|
|
}
|