From 62ac40ab099bee69f3208dc9f74088aae5196604 Mon Sep 17 00:00:00 2001 From: Danielle Tomlinson Date: Tue, 4 Dec 2018 18:16:39 +0100 Subject: [PATCH] allocrunner: Basic test alloc runner --- client/allocrunner/alloc_runner_test.go | 63 ------------------- client/allocrunner/testing.go | 81 +++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 63 deletions(-) create mode 100644 client/allocrunner/testing.go diff --git a/client/allocrunner/alloc_runner_test.go b/client/allocrunner/alloc_runner_test.go index 0f1c6897c..3c1464560 100644 --- a/client/allocrunner/alloc_runner_test.go +++ b/client/allocrunner/alloc_runner_test.go @@ -2,79 +2,16 @@ package allocrunner import ( "fmt" - "sync" "testing" "time" - "github.com/hashicorp/nomad/client/allocwatcher" - "github.com/hashicorp/nomad/client/config" - consulapi "github.com/hashicorp/nomad/client/consul" - "github.com/hashicorp/nomad/client/devicemanager" "github.com/hashicorp/nomad/client/state" - "github.com/hashicorp/nomad/client/vaultclient" "github.com/hashicorp/nomad/nomad/mock" "github.com/hashicorp/nomad/nomad/structs" - "github.com/hashicorp/nomad/plugins/shared/catalog" - "github.com/hashicorp/nomad/plugins/shared/singleton" "github.com/hashicorp/nomad/testutil" "github.com/stretchr/testify/require" ) -// MockStateUpdater implements the AllocStateHandler interface and records -// alloc updates. -type MockStateUpdater struct { - Updates []*structs.Allocation - mu sync.Mutex -} - -// AllocStateUpdated implements the AllocStateHandler interface and records an -// alloc update. -func (m *MockStateUpdater) AllocStateUpdated(alloc *structs.Allocation) { - m.mu.Lock() - m.Updates = append(m.Updates, alloc) - m.mu.Unlock() -} - -// Last returns a copy of the last alloc (or nil) update. Safe for concurrent -// access with updates. -func (m *MockStateUpdater) Last() *structs.Allocation { - m.mu.Lock() - defer m.mu.Unlock() - n := len(m.Updates) - if n == 0 { - return nil - } - return m.Updates[n-1].Copy() -} - -// Reset resets the recorded alloc updates. -func (m *MockStateUpdater) Reset() { - m.mu.Lock() - m.Updates = nil - m.mu.Unlock() -} - -// testAllocRunnerConfig returns a new allocrunner.Config with mocks and noop -// versions of dependencies along with a cleanup func. -func testAllocRunnerConfig(t *testing.T, alloc *structs.Allocation) (*Config, func()) { - pluginLoader := catalog.TestPluginLoader(t) - clientConf, cleanup := config.TestClientConfig(t) - conf := &Config{ - // Copy the alloc in case the caller edits and reuses it - Alloc: alloc.Copy(), - Logger: clientConf.Logger, - ClientConfig: clientConf, - StateDB: state.NoopDB{}, - Consul: consulapi.NewMockConsulServiceClient(t, clientConf.Logger), - Vault: vaultclient.NewMockVaultClient(), - StateUpdater: &MockStateUpdater{}, - PrevAllocWatcher: allocwatcher.NoopPrevAlloc{}, - PluginSingletonLoader: singleton.NewSingletonLoader(clientConf.Logger, pluginLoader), - DeviceManager: devicemanager.NoopMockManager(), - } - return conf, cleanup -} - // TestAllocRunner_AllocState_Initialized asserts that getting TaskStates via // AllocState() are initialized even before the AllocRunner has run. func TestAllocRunner_AllocState_Initialized(t *testing.T) { diff --git a/client/allocrunner/testing.go b/client/allocrunner/testing.go new file mode 100644 index 000000000..3e18379dc --- /dev/null +++ b/client/allocrunner/testing.go @@ -0,0 +1,81 @@ +package allocrunner + +import ( + "sync" + "testing" + + "github.com/hashicorp/nomad/client/allocwatcher" + clientconfig "github.com/hashicorp/nomad/client/config" + "github.com/hashicorp/nomad/client/consul" + "github.com/hashicorp/nomad/client/devicemanager" + "github.com/hashicorp/nomad/client/state" + "github.com/hashicorp/nomad/client/vaultclient" + "github.com/hashicorp/nomad/nomad/structs" + "github.com/hashicorp/nomad/plugins/shared/catalog" + "github.com/hashicorp/nomad/plugins/shared/singleton" + "github.com/stretchr/testify/require" +) + +// MockStateUpdater implements the AllocStateHandler interface and records +// alloc updates. +type MockStateUpdater struct { + Updates []*structs.Allocation + mu sync.Mutex +} + +// AllocStateUpdated implements the AllocStateHandler interface and records an +// alloc update. +func (m *MockStateUpdater) AllocStateUpdated(alloc *structs.Allocation) { + m.mu.Lock() + m.Updates = append(m.Updates, alloc) + m.mu.Unlock() +} + +// Last returns a copy of the last alloc (or nil) update. Safe for concurrent +// access with updates. +func (m *MockStateUpdater) Last() *structs.Allocation { + m.mu.Lock() + defer m.mu.Unlock() + n := len(m.Updates) + if n == 0 { + return nil + } + return m.Updates[n-1].Copy() +} + +// Reset resets the recorded alloc updates. +func (m *MockStateUpdater) Reset() { + m.mu.Lock() + m.Updates = nil + m.mu.Unlock() +} + +func testAllocRunnerConfig(t *testing.T, alloc *structs.Allocation) (*Config, func()) { + pluginLoader := catalog.TestPluginLoader(t) + clientConf, cleanup := clientconfig.TestClientConfig(t) + conf := &Config{ + // Copy the alloc in case the caller edits and reuses it + Alloc: alloc.Copy(), + Logger: clientConf.Logger, + ClientConfig: clientConf, + StateDB: state.NoopDB{}, + Consul: consul.NewMockConsulServiceClient(t, clientConf.Logger), + Vault: vaultclient.NewMockVaultClient(), + StateUpdater: &MockStateUpdater{}, + PrevAllocWatcher: allocwatcher.NoopPrevAlloc{}, + PluginSingletonLoader: singleton.NewSingletonLoader(clientConf.Logger, pluginLoader), + DeviceManager: devicemanager.NoopMockManager(), + } + return conf, cleanup +} + +func TestAllocRunnerFromAlloc(t *testing.T, alloc *structs.Allocation) (*allocRunner, func()) { + t.Helper() + cfg, cleanup := testAllocRunnerConfig(t, alloc) + ar, err := NewAllocRunner(cfg) + if err != nil { + require.NoError(t, err, "Failed to setup AllocRunner") + } + + return ar, cleanup +}