ea5b999fc0
In support of making the storage API ready for supporting notifications and mirroring, we've begun the process of paring down the storage model. The process started by creating a central Registry interface. From there, the common name argument on the LayerService and ManifestService was factored into a Repository interface. The rest of the changes directly follow from this. An interface wishlist was added, suggesting a direction to take the registry package that should support the distribution project's future goals. As these objects move out of the storage package and we implement a Registry backed by the http client, these design choices will start getting validation. Signed-off-by: Stephen J Day <stephen.day@docker.com>
84 lines
3.0 KiB
Go
84 lines
3.0 KiB
Go
package storage
|
|
|
|
import (
|
|
"github.com/docker/distribution/digest"
|
|
"github.com/docker/distribution/manifest"
|
|
)
|
|
|
|
// TODO(stevvooe): These types need to be moved out of the storage package.
|
|
|
|
// Registry represents a collection of repositories, addressable by name.
|
|
type Registry interface {
|
|
// Repository should return a reference to the named repository. The
|
|
// registry may or may not have the repository but should always return a
|
|
// reference.
|
|
Repository(name string) Repository
|
|
}
|
|
|
|
// Repository is a named collection of manifests and layers.
|
|
type Repository interface {
|
|
// Name returns the name of the repository.
|
|
Name() string
|
|
|
|
// Manifests returns a reference to this repository's manifest service.
|
|
Manifests() ManifestService
|
|
|
|
// Layers returns a reference to this repository's layers service.
|
|
Layers() LayerService
|
|
}
|
|
|
|
// ManifestService provides operations on image manifests.
|
|
type ManifestService interface {
|
|
// Tags lists the tags under the named repository.
|
|
Tags() ([]string, error)
|
|
|
|
// Exists returns true if the manifest exists.
|
|
Exists(tag string) (bool, error)
|
|
|
|
// Get retrieves the named manifest, if it exists.
|
|
Get(tag string) (*manifest.SignedManifest, error)
|
|
|
|
// Put creates or updates the named manifest.
|
|
// Put(tag string, manifest *manifest.SignedManifest) (digest.Digest, error)
|
|
Put(tag string, manifest *manifest.SignedManifest) error
|
|
|
|
// Delete removes the named manifest, if it exists.
|
|
Delete(tag string) error
|
|
|
|
// TODO(stevvooe): There are several changes that need to be done to this
|
|
// interface:
|
|
//
|
|
// 1. Get(tag string) should be GetByTag(tag string)
|
|
// 2. Put(tag string, manifest *manifest.SignedManifest) should be
|
|
// Put(manifest *manifest.SignedManifest). The method can read the
|
|
// tag on manifest to automatically tag it in the repository.
|
|
// 3. Need a GetByDigest(dgst digest.Digest) method.
|
|
// 4. Allow explicit tagging with Tag(digest digest.Digest, tag string)
|
|
// 5. Support reading tags with a re-entrant reader to avoid large
|
|
// allocations in the registry.
|
|
// 6. Long-term: Provide All() method that lets one scroll through all of
|
|
// the manifest entries.
|
|
// 7. Long-term: break out concept of signing from manifests. This is
|
|
// really a part of the distribution sprint.
|
|
// 8. Long-term: Manifest should be an interface. This code shouldn't
|
|
// really be concerned with the storage format.
|
|
}
|
|
|
|
// LayerService provides operations on layer files in a backend storage.
|
|
type LayerService interface {
|
|
// Exists returns true if the layer exists.
|
|
Exists(digest digest.Digest) (bool, error)
|
|
|
|
// Fetch the layer identifed by TarSum.
|
|
Fetch(digest digest.Digest) (Layer, error)
|
|
|
|
// Upload begins a layer upload to repository identified by name,
|
|
// returning a handle.
|
|
Upload() (LayerUpload, error)
|
|
|
|
// Resume continues an in progress layer upload, returning a handle to the
|
|
// upload. The caller should seek to the latest desired upload location
|
|
// before proceeding.
|
|
Resume(uuid string) (LayerUpload, error)
|
|
}
|