mirror of
https://github.com/kemko/nomad.git
synced 2026-01-06 18:35:44 +03:00
allocrunner: Basic test alloc runner
This commit is contained in:
@@ -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) {
|
||||
|
||||
81
client/allocrunner/testing.go
Normal file
81
client/allocrunner/testing.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user