github.com/nilium/gitlab-runner@v12.5.0+incompatible/cache/adapter.go (about) 1 package cache 2 3 import ( 4 "fmt" 5 "net/url" 6 "sync" 7 "time" 8 9 "gitlab.com/gitlab-org/gitlab-runner/common" 10 ) 11 12 type Adapter interface { 13 GetDownloadURL() *url.URL 14 GetUploadURL() *url.URL 15 } 16 17 type Factory func(config *common.CacheConfig, timeout time.Duration, objectName string) (Adapter, error) 18 19 type FactoriesMap struct { 20 internal map[string]Factory 21 lock sync.RWMutex 22 } 23 24 func (m *FactoriesMap) Register(typeName string, factory Factory) error { 25 m.lock.Lock() 26 defer m.lock.Unlock() 27 28 if len(m.internal) == 0 { 29 m.internal = make(map[string]Factory) 30 } 31 32 _, ok := m.internal[typeName] 33 if ok { 34 return fmt.Errorf("adapter %q already registered", typeName) 35 } 36 37 m.internal[typeName] = factory 38 39 return nil 40 } 41 42 func (m *FactoriesMap) Find(typeName string) (Factory, error) { 43 m.lock.RLock() 44 defer m.lock.RUnlock() 45 46 factory := m.internal[typeName] 47 if factory == nil { 48 return nil, fmt.Errorf("factory for cache adapter %q was not registered", typeName) 49 } 50 51 return factory, nil 52 } 53 54 var factories = &FactoriesMap{} 55 56 func Factories() *FactoriesMap { 57 return factories 58 } 59 60 func CreateAdapter(cacheConfig *common.CacheConfig, timeout time.Duration, objectName string) (Adapter, error) { 61 create, err := Factories().Find(cacheConfig.Type) 62 if err != nil { 63 return nil, fmt.Errorf("cache factory not found: %v", err) 64 } 65 66 adapter, err := create(cacheConfig, timeout, objectName) 67 if err != nil { 68 return nil, fmt.Errorf("cache adapter could not be initialized: %v", err) 69 } 70 71 return adapter, nil 72 }