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 }