Merge pull request #307 from dmcgowan/namespace-interface
Rename top level registry interface to namespace
This commit is contained in:
commit
18d099be74
7 changed files with 47 additions and 11 deletions
|
@ -283,7 +283,7 @@ For more information about Token based authentication configuration, see the [sp
|
||||||
|
|
||||||
## middleware
|
## middleware
|
||||||
|
|
||||||
The middleware option is **optional** and allows middlewares to be injected at named hook points. A requirement of all middlewares is that they implement the same interface as the object they're wrapping. This means a registry middleware must implement the `distribution.Registry` interface, repository middleware must implement `distribution.Respository`, and storage middleware must implement `driver.StorageDriver`.
|
The middleware option is **optional** and allows middlewares to be injected at named hook points. A requirement of all middlewares is that they implement the same interface as the object they're wrapping. This means a registry middleware must implement the `distribution.Namespace` interface, repository middleware must implement `distribution.Respository`, and storage middleware must implement `driver.StorageDriver`.
|
||||||
|
|
||||||
Currently only one middleware, cloudfront, a storage middleware, is included in the registry.
|
Currently only one middleware, cloudfront, a storage middleware, is included in the registry.
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ see the [glossary in the full documentation set](http://docs.docker.com/referenc
|
||||||
<dd>Describes a collection layers that make up an image.</dd>
|
<dd>Describes a collection layers that make up an image.</dd>
|
||||||
|
|
||||||
<dt>Registry</dt>
|
<dt>Registry</dt>
|
||||||
<dd>A registry is a collection of repositories.</dd>
|
<dd>A registry is a service which serves repositories.</dd>
|
||||||
|
|
||||||
<dt>Repository</dt>
|
<dt>Repository</dt>
|
||||||
<dd>
|
<dd>
|
||||||
|
@ -33,4 +33,11 @@ see the [glossary in the full documentation set](http://docs.docker.com/referenc
|
||||||
|
|
||||||
<dt>Tag</dt>
|
<dt>Tag</dt>
|
||||||
<dd>Tag provides a common name to an image.</dd>
|
<dd>Tag provides a common name to an image.</dd>
|
||||||
|
|
||||||
|
<dt>Namespace</dt>
|
||||||
|
<dd>A namespace is a collection of repositories with a common name prefix. The
|
||||||
|
namespace with an empty common prefix is considered the Global Namespace.</dd>
|
||||||
|
|
||||||
|
<dt>Scope</dt>
|
||||||
|
<dd>A common repository name prefix.</dd>
|
||||||
</dl>
|
</dl>
|
27
registry.go
27
registry.go
|
@ -10,8 +10,31 @@ import (
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Registry represents a collection of repositories, addressable by name.
|
// Scope defines the set of items that match a namespace.
|
||||||
type Registry interface {
|
type Scope interface {
|
||||||
|
// Contains returns true if the name belongs to the namespace.
|
||||||
|
Contains(name string) bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type fullScope struct{}
|
||||||
|
|
||||||
|
func (f fullScope) Contains(string) bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// GlobalScope represents the full namespace scope which contains
|
||||||
|
// all other scopes.
|
||||||
|
var GlobalScope = Scope(fullScope{})
|
||||||
|
|
||||||
|
// Namespace represents a collection of repositories, addressable by name.
|
||||||
|
// Generally, a namespace is backed by a set of one or more services,
|
||||||
|
// providing facilities such as registry access, trust, and indexing.
|
||||||
|
type Namespace interface {
|
||||||
|
// Scope describes the names that can be used with this Namespace. The
|
||||||
|
// global namespace will have a scope that matches all names. The scope
|
||||||
|
// effectively provides an identity for the namespace.
|
||||||
|
Scope() Scope
|
||||||
|
|
||||||
// Repository should return a reference to the named repository. The
|
// Repository should return a reference to the named repository. The
|
||||||
// registry may or may not have the repository but should always return a
|
// registry may or may not have the repository but should always return a
|
||||||
// reference.
|
// reference.
|
||||||
|
|
|
@ -40,7 +40,7 @@ type App struct {
|
||||||
|
|
||||||
router *mux.Router // main application router, configured with dispatchers
|
router *mux.Router // main application router, configured with dispatchers
|
||||||
driver storagedriver.StorageDriver // driver maintains the app global storage driver instance.
|
driver storagedriver.StorageDriver // driver maintains the app global storage driver instance.
|
||||||
registry distribution.Registry // registry is the primary registry backend for the app instance.
|
registry distribution.Namespace // registry is the primary registry backend for the app instance.
|
||||||
accessController auth.AccessController // main access controller for application
|
accessController auth.AccessController // main access controller for application
|
||||||
|
|
||||||
// events contains notification related configuration.
|
// events contains notification related configuration.
|
||||||
|
@ -541,7 +541,7 @@ func appendAccessRecords(records []auth.Access, method string, repo string) []au
|
||||||
}
|
}
|
||||||
|
|
||||||
// applyRegistryMiddleware wraps a registry instance with the configured middlewares
|
// applyRegistryMiddleware wraps a registry instance with the configured middlewares
|
||||||
func applyRegistryMiddleware(registry distribution.Registry, middlewares []configuration.Middleware) (distribution.Registry, error) {
|
func applyRegistryMiddleware(registry distribution.Namespace, middlewares []configuration.Middleware) (distribution.Namespace, error) {
|
||||||
for _, mw := range middlewares {
|
for _, mw := range middlewares {
|
||||||
rmw, err := registrymiddleware.Get(mw.Name, mw.Options, registry)
|
rmw, err := registrymiddleware.Get(mw.Name, mw.Options, registry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
|
|
||||||
// InitFunc is the type of a RegistryMiddleware factory function and is
|
// InitFunc is the type of a RegistryMiddleware factory function and is
|
||||||
// used to register the constructor for different RegistryMiddleware backends.
|
// used to register the constructor for different RegistryMiddleware backends.
|
||||||
type InitFunc func(registry distribution.Registry, options map[string]interface{}) (distribution.Registry, error)
|
type InitFunc func(registry distribution.Namespace, options map[string]interface{}) (distribution.Namespace, error)
|
||||||
|
|
||||||
var middlewares map[string]InitFunc
|
var middlewares map[string]InitFunc
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ func Register(name string, initFunc InitFunc) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get constructs a RegistryMiddleware with the given options using the named backend.
|
// Get constructs a RegistryMiddleware with the given options using the named backend.
|
||||||
func Get(name string, options map[string]interface{}, registry distribution.Registry) (distribution.Registry, error) {
|
func Get(name string, options map[string]interface{}, registry distribution.Namespace) (distribution.Namespace, error) {
|
||||||
if middlewares != nil {
|
if middlewares != nil {
|
||||||
if initFunc, exists := middlewares[name]; exists {
|
if initFunc, exists := middlewares[name]; exists {
|
||||||
return initFunc(registry, options)
|
return initFunc(registry, options)
|
||||||
|
|
|
@ -21,7 +21,7 @@ import (
|
||||||
type manifestStoreTestEnv struct {
|
type manifestStoreTestEnv struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
driver driver.StorageDriver
|
driver driver.StorageDriver
|
||||||
registry distribution.Registry
|
registry distribution.Namespace
|
||||||
repository distribution.Repository
|
repository distribution.Repository
|
||||||
name string
|
name string
|
||||||
tag string
|
tag string
|
||||||
|
|
|
@ -20,7 +20,7 @@ type registry struct {
|
||||||
// NewRegistryWithDriver creates a new registry instance from the provided
|
// NewRegistryWithDriver creates a new registry instance from the provided
|
||||||
// driver. The resulting registry may be shared by multiple goroutines but is
|
// driver. The resulting registry may be shared by multiple goroutines but is
|
||||||
// cheap to allocate.
|
// cheap to allocate.
|
||||||
func NewRegistryWithDriver(driver storagedriver.StorageDriver, layerInfoCache cache.LayerInfoCache) distribution.Registry {
|
func NewRegistryWithDriver(driver storagedriver.StorageDriver, layerInfoCache cache.LayerInfoCache) distribution.Namespace {
|
||||||
bs := &blobStore{
|
bs := &blobStore{
|
||||||
driver: driver,
|
driver: driver,
|
||||||
pm: defaultPathMapper,
|
pm: defaultPathMapper,
|
||||||
|
@ -36,6 +36,12 @@ func NewRegistryWithDriver(driver storagedriver.StorageDriver, layerInfoCache ca
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Scope returns the namespace scope for a registry. The registry
|
||||||
|
// will only serve repositories contained within this scope.
|
||||||
|
func (reg *registry) Scope() distribution.Scope {
|
||||||
|
return distribution.GlobalScope
|
||||||
|
}
|
||||||
|
|
||||||
// Repository returns an instance of the repository tied to the registry.
|
// Repository returns an instance of the repository tied to the registry.
|
||||||
// Instances should not be shared between goroutines but are cheap to
|
// Instances should not be shared between goroutines but are cheap to
|
||||||
// allocate. In general, they should be request scoped.
|
// allocate. In general, they should be request scoped.
|
||||||
|
|
Loading…
Reference in a new issue