diff --git a/.travis.yml b/.travis.yml index 43ef6320..d3718380 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,6 @@ before_script: - go get github.com/kr/pretty script: - go test -v -race github.com/google/cadvisor/container - - go test -v -race github.com/google/cadvisor/storage - go test -v github.com/google/cadvisor/info - go test -v github.com/google/cadvisor/client - go test -v github.com/google/cadvisor/sampling diff --git a/storage/storage.go b/storage/storage.go index 101a7b87..8ebca965 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -14,66 +14,8 @@ package storage -import ( - "fmt" - "sync" - - "github.com/google/cadvisor/info" -) +import "github.com/google/cadvisor/info" type StorageDriver interface { WriteStats(ref info.ContainerReference, stats *info.ContainerStats) error } - -// Database config which should contain all information used to connect to -// all/most databases -type Config struct { - Engine string `json:"engine,omitempty"` - Host string `json:"host,omitempty"` - Port int `json:"port,omitempty"` - Username string `json:"username,omitempty"` - Password string `json:"password,omitempty"` - Database string `json:"database,omitempty"` - Params map[string]string `json:"parameters,omitempty"` -} - -type StorageFactory interface { - String() string - New(config *Config) (StorageDriver, error) -} - -type containerStatsWriterFactoryManager struct { - lock sync.RWMutex - factories map[string]StorageFactory -} - -func (self *containerStatsWriterFactoryManager) Register(factory StorageFactory) { - self.lock.Lock() - defer self.lock.Unlock() - - if self.factories == nil { - self.factories = make(map[string]StorageFactory, 8) - } - - self.factories[factory.String()] = factory -} - -func (self *containerStatsWriterFactoryManager) New(config *Config) (StorageDriver, error) { - self.lock.RLock() - defer self.lock.RUnlock() - - if factory, ok := self.factories[config.Engine]; ok { - return factory.New(config) - } - return nil, fmt.Errorf("unknown database %v", config.Engine) -} - -var globalContainerStatsWriterFactoryManager containerStatsWriterFactoryManager - -func RegisterStorage(factory StorageFactory) { - globalContainerStatsWriterFactoryManager.Register(factory) -} - -func NewStorage(config *Config) (StorageDriver, error) { - return globalContainerStatsWriterFactoryManager.New(config) -} diff --git a/storage/storage_test.go b/storage/storage_test.go deleted file mode 100644 index d058fbe9..00000000 --- a/storage/storage_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package storage - -import ( - "sync" - "testing" - - "github.com/google/cadvisor/info" - "github.com/stretchr/testify/mock" -) - -type mockStorageDriver struct { - storageName string - mock.Mock -} - -func (self *mockStorageDriver) WriteStats( - ref info.ContainerReference, - stats *info.ContainerStats, -) error { - args := self.Called(ref, stats) - return args.Error(0) -} - -type mockStorageFactory struct { - name string -} - -func (self *mockStorageFactory) String() string { - return self.name -} - -func (self *mockStorageFactory) New( - config *Config, -) (StorageDriver, error) { - mockWriter := &mockStorageDriver{ - storageName: self.name, - } - return mockWriter, nil -} - -func TestContainerStatsWriterFactoryManager(t *testing.T) { - factoryNames := []string{ - "abc", - "bcd", - } - - wg := sync.WaitGroup{} - - for _, name := range factoryNames { - wg.Add(1) - go func(n string) { - defer wg.Done() - factory := &mockStorageFactory{ - name: n, - } - RegisterStorage(factory) - }(name) - } - wg.Wait() - for _, name := range factoryNames { - wg.Add(1) - config := &Config{ - Engine: name, - } - go func(n string) { - defer wg.Done() - writer, err := NewStorage(config) - if err != nil { - t.Error(err) - } - if mw, ok := writer.(*mockStorageDriver); ok { - if mw.storageName != n { - t.Errorf("wrong writer. should be %v, got %v", n, mw.storageName) - } - } else { - t.Errorf("wrong writer: unknown type") - } - }(name) - } - wg.Wait() -}