github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/storage/provider/registry/providerregistry.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package registry
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/storage"
    10  	"github.com/juju/juju/storage/provider"
    11  )
    12  
    13  //
    14  // A registry of storage providers.
    15  //
    16  
    17  // providers maps from provider type to storage.Provider for
    18  // each registered provider type.
    19  var providers = make(map[storage.ProviderType]storage.Provider)
    20  
    21  // RegisterProvider registers a new storage provider of the given type.
    22  //
    23  // If the provider is nil, then any previously registered provider with
    24  // the same type will be unregistered; this is purely available for
    25  // testing.
    26  func RegisterProvider(providerType storage.ProviderType, p storage.Provider) {
    27  	if p == nil {
    28  		delete(providers, providerType)
    29  		return
    30  	}
    31  	if providers[providerType] != nil {
    32  		panic(errors.Errorf("juju: duplicate storage provider type %q", providerType))
    33  	}
    34  	providers[providerType] = p
    35  }
    36  
    37  // StorageProvider returns the previously registered provider with the given type.
    38  func StorageProvider(providerType storage.ProviderType) (storage.Provider, error) {
    39  	p, ok := providers[providerType]
    40  	if !ok {
    41  		return nil, errors.NotFoundf("storage provider %q", providerType)
    42  	}
    43  	return p, nil
    44  }
    45  
    46  //
    47  // A registry of storage provider types which are
    48  // valid for a Juju Environ.
    49  //
    50  
    51  // supportedEnvironProviders maps from environment type to a slice of
    52  // supported ProviderType(s).
    53  var supportedEnvironProviders = make(map[string][]storage.ProviderType)
    54  
    55  // RegisterEnvironStorageProviders records which storage provider types
    56  // are valid for an environment.
    57  // This is to be called from the environ provider's init().
    58  // Also registered will be provider types common to all environments.
    59  func RegisterEnvironStorageProviders(envType string, providers ...storage.ProviderType) {
    60  	existing := supportedEnvironProviders[envType]
    61  	for _, p := range providers {
    62  		if IsProviderSupported(envType, p) {
    63  			continue
    64  		}
    65  		existing = append(existing, p)
    66  	}
    67  
    68  	// Add the common providers.
    69  	for p := range provider.CommonProviders() {
    70  		if IsProviderSupported(envType, p) {
    71  			continue
    72  		}
    73  		existing = append(existing, p)
    74  	}
    75  	supportedEnvironProviders[envType] = existing
    76  }
    77  
    78  // Returns true is provider is supported for the environment.
    79  func IsProviderSupported(envType string, providerType storage.ProviderType) bool {
    80  	providerTypes, ok := EnvironStorageProviders(envType)
    81  	if !ok {
    82  		return false
    83  	}
    84  	for _, p := range providerTypes {
    85  		if p == providerType {
    86  			return true
    87  		}
    88  	}
    89  	return false
    90  }
    91  
    92  // EnvironStorageProviders returns storage provider types
    93  // for the specified environment.
    94  func EnvironStorageProviders(envType string) ([]storage.ProviderType, bool) {
    95  	providerTypes, ok := supportedEnvironProviders[envType]
    96  	if !ok {
    97  		return nil, false
    98  	}
    99  	return providerTypes, true
   100  }