github.com/mika/distribution@v2.2.2-0.20160108133430-a75790e3d8e0+incompatible/registry/storage/driver/factory/factory.go (about)

     1  package factory
     2  
     3  import (
     4  	"fmt"
     5  
     6  	storagedriver "github.com/docker/distribution/registry/storage/driver"
     7  )
     8  
     9  // driverFactories stores an internal mapping between storage driver names and their respective
    10  // factories
    11  var driverFactories = make(map[string]StorageDriverFactory)
    12  
    13  // StorageDriverFactory is a factory interface for creating storagedriver.StorageDriver interfaces
    14  // Storage drivers should call Register() with a factory to make the driver available by name
    15  type StorageDriverFactory interface {
    16  	// Create returns a new storagedriver.StorageDriver with the given parameters
    17  	// Parameters will vary by driver and may be ignored
    18  	// Each parameter key must only consist of lowercase letters and numbers
    19  	Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error)
    20  }
    21  
    22  // Register makes a storage driver available by the provided name.
    23  // If Register is called twice with the same name or if driver factory is nil, it panics.
    24  func Register(name string, factory StorageDriverFactory) {
    25  	if factory == nil {
    26  		panic("Must not provide nil StorageDriverFactory")
    27  	}
    28  	_, registered := driverFactories[name]
    29  	if registered {
    30  		panic(fmt.Sprintf("StorageDriverFactory named %s already registered", name))
    31  	}
    32  
    33  	driverFactories[name] = factory
    34  }
    35  
    36  // Create a new storagedriver.StorageDriver with the given name and
    37  // parameters. To use a driver, the StorageDriverFactory must first be
    38  // registered with the given name. If no drivers are found, an
    39  // InvalidStorageDriverError is returned
    40  func Create(name string, parameters map[string]interface{}) (storagedriver.StorageDriver, error) {
    41  	driverFactory, ok := driverFactories[name]
    42  	if !ok {
    43  		return nil, InvalidStorageDriverError{name}
    44  	}
    45  	return driverFactory.Create(parameters)
    46  }
    47  
    48  // InvalidStorageDriverError records an attempt to construct an unregistered storage driver
    49  type InvalidStorageDriverError struct {
    50  	Name string
    51  }
    52  
    53  func (err InvalidStorageDriverError) Error() string {
    54  	return fmt.Sprintf("StorageDriver not registered: %s", err.Name)
    55  }