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  }