1 package distribution 2 3 import ( 4 "context" 5 6 "github.com/distribution/reference" 7 ) 8 9 // Scope defines the set of items that match a namespace. 10 type Scope interface { 11 // Contains returns true if the name belongs to the namespace. 12 Contains(name string) bool 13 } 14 15 type fullScope struct{} 16 17 func (f fullScope) Contains(string) bool { 18 return true 19 } 20 21 // GlobalScope represents the full namespace scope which contains 22 // all other scopes. 23 var GlobalScope = Scope(fullScope{}) 24 25 // Namespace represents a collection of repositories, addressable by name. 26 // Generally, a namespace is backed by a set of one or more services, 27 // providing facilities such as registry access, trust, and indexing. 28 type Namespace interface { 29 // Scope describes the names that can be used with this Namespace. The 30 // global namespace will have a scope that matches all names. The scope 31 // effectively provides an identity for the namespace. 32 Scope() Scope 33 34 // Repository should return a reference to the named repository. The 35 // registry may or may not have the repository but should always return a 36 // reference. 37 Repository(ctx context.Context, name reference.Named) (Repository, error) 38 39 // Repositories fills 'repos' with a lexicographically sorted catalog of repositories 40 // up to the size of 'repos' and returns the value 'n' for the number of entries 41 // which were filled. 'last' contains an offset in the catalog, and 'err' will be 42 // set to io.EOF if there are no more entries to obtain. 43 Repositories(ctx context.Context, repos []string, last string) (n int, err error) 44 45 // Blobs returns a blob enumerator to access all blobs 46 Blobs() BlobEnumerator 47 48 // BlobStatter returns a BlobStatter to control 49 BlobStatter() BlobStatter 50 } 51 52 // RepositoryEnumerator describes an operation to enumerate repositories 53 type RepositoryEnumerator interface { 54 Enumerate(ctx context.Context, ingester func(string) error) error 55 } 56 57 // RepositoryRemover removes given repository 58 type RepositoryRemover interface { 59 Remove(ctx context.Context, name reference.Named) error 60 } 61 62 // ManifestServiceOption is a function argument for Manifest Service methods 63 type ManifestServiceOption interface { 64 Apply(ManifestService) error 65 } 66 67 // WithTag allows a tag to be passed into Put 68 func WithTag(tag string) ManifestServiceOption { 69 return WithTagOption{tag} 70 } 71 72 // WithTagOption holds a tag 73 type WithTagOption struct{ Tag string } 74 75 // Apply conforms to the ManifestServiceOption interface 76 func (o WithTagOption) Apply(m ManifestService) error { 77 // no implementation 78 return nil 79 } 80 81 // WithManifestMediaTypes lists the media types the client wishes 82 // the server to provide. 83 func WithManifestMediaTypes(mediaTypes []string) ManifestServiceOption { 84 return WithManifestMediaTypesOption{mediaTypes} 85 } 86 87 // WithManifestMediaTypesOption holds a list of accepted media types 88 type WithManifestMediaTypesOption struct{ MediaTypes []string } 89 90 // Apply conforms to the ManifestServiceOption interface 91 func (o WithManifestMediaTypesOption) Apply(m ManifestService) error { 92 // no implementation 93 return nil 94 } 95 96 // Repository is a named collection of manifests and layers. 97 type Repository interface { 98 // Named returns the name of the repository. 99 Named() reference.Named 100 101 // Manifests returns a reference to this repository's manifest service. 102 // with the supplied options applied. 103 Manifests(ctx context.Context, options ...ManifestServiceOption) (ManifestService, error) 104 105 // Blobs returns a reference to this repository's blob service. 106 Blobs(ctx context.Context) BlobStore 107 108 // TODO(stevvooe): The above BlobStore return can probably be relaxed to 109 // be a BlobService for use with clients. This will allow such 110 // implementations to avoid implementing ServeBlob. 111 112 // Tags returns a reference to this repositories tag service 113 Tags(ctx context.Context) TagService 114 } 115 116 // TODO(stevvooe): Must add close methods to all these. May want to change the 117 // way instances are created to better reflect internal dependency 118 // relationships. 119