github.com/lusis/distribution@v2.0.1+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 parameters
    37  // To run in-process, the StorageDriverFactory must first be registered with the given name
    38  // If no in-process drivers are found with the given name, this attempts to create an IPC driver
    39  // If no in-process or external drivers are found, an 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  		// NOTE(stevvooe): We are disabling storagedriver ipc for now, as the
    46  		// server and client need to be updated for the changed API calls and
    47  		// there were some problems libchan hanging. We'll phase this
    48  		// functionality back in over the next few weeks.
    49  
    50  		// No registered StorageDriverFactory found, try ipc
    51  		// driverClient, err := ipc.NewDriverClient(name, parameters)
    52  		// if err != nil {
    53  		// 	return nil, InvalidStorageDriverError{name}
    54  		// }
    55  		// err = driverClient.Start()
    56  		// if err != nil {
    57  		// 	return nil, err
    58  		// }
    59  		// return driverClient, nil
    60  	}
    61  	return driverFactory.Create(parameters)
    62  }
    63  
    64  // InvalidStorageDriverError records an attempt to construct an unregistered storage driver
    65  type InvalidStorageDriverError struct {
    66  	Name string
    67  }
    68  
    69  func (err InvalidStorageDriverError) Error() string {
    70  	return fmt.Sprintf("StorageDriver not registered: %s", err.Name)
    71  }