Add route to create or update execution environments
This commit is contained in:

committed by
Tobias Kantusch

parent
3d395f0a38
commit
b990df7b9d
@@ -3,6 +3,7 @@ package runner
|
||||
import (
|
||||
"errors"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
"gitlab.hpi.de/codeocean/codemoon/poseidon/nomad"
|
||||
"gitlab.hpi.de/codeocean/codemoon/poseidon/tests"
|
||||
@@ -25,156 +26,172 @@ type ManagerTestSuite struct {
|
||||
exerciseRunner Runner
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) SetupTest() {
|
||||
suite.apiMock = &nomad.ExecutorApiMock{}
|
||||
suite.nomadRunnerManager = NewNomadRunnerManager(suite.apiMock)
|
||||
suite.exerciseRunner = NewRunner(tests.DefaultRunnerId)
|
||||
suite.mockRunnerQueries([]string{})
|
||||
suite.registerDefaultEnvironment()
|
||||
func (s *ManagerTestSuite) SetupTest() {
|
||||
s.apiMock = &nomad.ExecutorApiMock{}
|
||||
s.nomadRunnerManager = NewNomadRunnerManager(s.apiMock)
|
||||
s.exerciseRunner = NewRunner(tests.DefaultRunnerId)
|
||||
s.mockRunnerQueries([]string{})
|
||||
s.registerDefaultEnvironment()
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) mockRunnerQueries(returnedRunnerIds []string) {
|
||||
func (s *ManagerTestSuite) mockRunnerQueries(returnedRunnerIds []string) {
|
||||
// reset expected calls to allow new mocked return values
|
||||
suite.apiMock.ExpectedCalls = []*mock.Call{}
|
||||
suite.apiMock.On("LoadRunners", tests.DefaultJobId).Return(returnedRunnerIds, nil)
|
||||
suite.apiMock.On("JobScale", tests.DefaultJobId).Return(len(returnedRunnerIds), nil)
|
||||
suite.apiMock.On("SetJobScale", tests.DefaultJobId, mock.AnythingOfType("int"), "Runner Requested").Return(nil)
|
||||
s.apiMock.ExpectedCalls = []*mock.Call{}
|
||||
s.apiMock.On("LoadRunners", tests.DefaultJobId).Return(returnedRunnerIds, nil)
|
||||
s.apiMock.On("JobScale", tests.DefaultJobId).Return(len(returnedRunnerIds), nil)
|
||||
s.apiMock.On("SetJobScale", tests.DefaultJobId, mock.AnythingOfType("int"), "Runner Requested").Return(nil)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) registerDefaultEnvironment() {
|
||||
suite.nomadRunnerManager.RegisterEnvironment(defaultEnvironmentId, tests.DefaultJobId, defaultDesiredRunnersCount)
|
||||
func (s *ManagerTestSuite) registerDefaultEnvironment() {
|
||||
s.nomadRunnerManager.RegisterEnvironment(defaultEnvironmentId, tests.DefaultJobId, defaultDesiredRunnersCount)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) AddIdleRunnerForDefaultEnvironment(r Runner) {
|
||||
job, _ := suite.nomadRunnerManager.jobs.Get(defaultEnvironmentId)
|
||||
func (s *ManagerTestSuite) AddIdleRunnerForDefaultEnvironment(r Runner) {
|
||||
job, _ := s.nomadRunnerManager.jobs.Get(defaultEnvironmentId)
|
||||
job.idleRunners.Add(r)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) waitForRunnerRefresh() {
|
||||
func (s *ManagerTestSuite) waitForRunnerRefresh() {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestRegisterEnvironmentAddsNewJob() {
|
||||
suite.nomadRunnerManager.RegisterEnvironment(anotherEnvironmentId, tests.DefaultJobId, defaultDesiredRunnersCount)
|
||||
job, ok := suite.nomadRunnerManager.jobs.Get(defaultEnvironmentId)
|
||||
suite.True(ok)
|
||||
suite.NotNil(job)
|
||||
func (s *ManagerTestSuite) TestRegisterEnvironmentAddsNewJob() {
|
||||
s.nomadRunnerManager.RegisterEnvironment(anotherEnvironmentId, tests.DefaultJobId, defaultDesiredRunnersCount)
|
||||
job, ok := s.nomadRunnerManager.jobs.Get(defaultEnvironmentId)
|
||||
s.True(ok)
|
||||
s.NotNil(job)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestClaimReturnsNotFoundErrorIfEnvironmentNotFound() {
|
||||
runner, err := suite.nomadRunnerManager.Claim(EnvironmentId(42))
|
||||
suite.Nil(runner)
|
||||
suite.Equal(ErrUnknownExecutionEnvironment, err)
|
||||
func (s *ManagerTestSuite) TestClaimReturnsNotFoundErrorIfEnvironmentNotFound() {
|
||||
runner, err := s.nomadRunnerManager.Claim(EnvironmentId(42))
|
||||
s.Nil(runner)
|
||||
s.Equal(ErrUnknownExecutionEnvironment, err)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestClaimReturnsRunnerIfAvailable() {
|
||||
suite.AddIdleRunnerForDefaultEnvironment(suite.exerciseRunner)
|
||||
receivedRunner, err := suite.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
suite.NoError(err)
|
||||
suite.Equal(suite.exerciseRunner, receivedRunner)
|
||||
func (s *ManagerTestSuite) TestClaimReturnsRunnerIfAvailable() {
|
||||
s.AddIdleRunnerForDefaultEnvironment(s.exerciseRunner)
|
||||
receivedRunner, err := s.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
s.NoError(err)
|
||||
s.Equal(s.exerciseRunner, receivedRunner)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestClaimReturnsErrorIfNoRunnerAvailable() {
|
||||
suite.waitForRunnerRefresh()
|
||||
runner, err := suite.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
suite.Nil(runner)
|
||||
suite.Equal(ErrNoRunnersAvailable, err)
|
||||
func (s *ManagerTestSuite) TestClaimReturnsErrorIfNoRunnerAvailable() {
|
||||
s.waitForRunnerRefresh()
|
||||
runner, err := s.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
s.Nil(runner)
|
||||
s.Equal(ErrNoRunnersAvailable, err)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestClaimReturnsNoRunnerOfDifferentEnvironment() {
|
||||
suite.AddIdleRunnerForDefaultEnvironment(suite.exerciseRunner)
|
||||
receivedRunner, err := suite.nomadRunnerManager.Claim(anotherEnvironmentId)
|
||||
suite.Nil(receivedRunner)
|
||||
suite.Error(err)
|
||||
func (s *ManagerTestSuite) TestClaimReturnsNoRunnerOfDifferentEnvironment() {
|
||||
s.AddIdleRunnerForDefaultEnvironment(s.exerciseRunner)
|
||||
receivedRunner, err := s.nomadRunnerManager.Claim(anotherEnvironmentId)
|
||||
s.Nil(receivedRunner)
|
||||
s.Error(err)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestClaimDoesNotReturnTheSameRunnerTwice() {
|
||||
suite.AddIdleRunnerForDefaultEnvironment(suite.exerciseRunner)
|
||||
suite.AddIdleRunnerForDefaultEnvironment(NewRunner(tests.AnotherRunnerId))
|
||||
func (s *ManagerTestSuite) TestClaimDoesNotReturnTheSameRunnerTwice() {
|
||||
s.AddIdleRunnerForDefaultEnvironment(s.exerciseRunner)
|
||||
s.AddIdleRunnerForDefaultEnvironment(NewRunner(tests.AnotherRunnerId))
|
||||
|
||||
firstReceivedRunner, _ := suite.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
secondReceivedRunner, _ := suite.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
suite.NotEqual(firstReceivedRunner, secondReceivedRunner)
|
||||
firstReceivedRunner, _ := s.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
secondReceivedRunner, _ := s.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
s.NotEqual(firstReceivedRunner, secondReceivedRunner)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestClaimThrowsAnErrorIfNoRunnersAvailable() {
|
||||
receivedRunner, err := suite.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
suite.Nil(receivedRunner)
|
||||
suite.Error(err)
|
||||
func (s *ManagerTestSuite) TestClaimThrowsAnErrorIfNoRunnersAvailable() {
|
||||
receivedRunner, err := s.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
s.Nil(receivedRunner)
|
||||
s.Error(err)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestClaimAddsRunnerToUsedRunners() {
|
||||
suite.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
suite.waitForRunnerRefresh()
|
||||
receivedRunner, _ := suite.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
savedRunner, ok := suite.nomadRunnerManager.usedRunners.Get(receivedRunner.Id())
|
||||
suite.True(ok)
|
||||
suite.Equal(savedRunner, receivedRunner)
|
||||
func (s *ManagerTestSuite) TestClaimAddsRunnerToUsedRunners() {
|
||||
s.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
s.waitForRunnerRefresh()
|
||||
receivedRunner, _ := s.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
savedRunner, ok := s.nomadRunnerManager.usedRunners.Get(receivedRunner.Id())
|
||||
s.True(ok)
|
||||
s.Equal(savedRunner, receivedRunner)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestGetReturnsRunnerIfRunnerIsUsed() {
|
||||
suite.nomadRunnerManager.usedRunners.Add(suite.exerciseRunner)
|
||||
savedRunner, err := suite.nomadRunnerManager.Get(suite.exerciseRunner.Id())
|
||||
suite.NoError(err)
|
||||
suite.Equal(savedRunner, suite.exerciseRunner)
|
||||
func (s *ManagerTestSuite) TestGetReturnsRunnerIfRunnerIsUsed() {
|
||||
s.nomadRunnerManager.usedRunners.Add(s.exerciseRunner)
|
||||
savedRunner, err := s.nomadRunnerManager.Get(s.exerciseRunner.Id())
|
||||
s.NoError(err)
|
||||
s.Equal(savedRunner, s.exerciseRunner)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestGetReturnsErrorIfRunnerNotFound() {
|
||||
savedRunner, err := suite.nomadRunnerManager.Get(tests.DefaultRunnerId)
|
||||
suite.Nil(savedRunner)
|
||||
suite.Error(err)
|
||||
func (s *ManagerTestSuite) TestGetReturnsErrorIfRunnerNotFound() {
|
||||
savedRunner, err := s.nomadRunnerManager.Get(tests.DefaultRunnerId)
|
||||
s.Nil(savedRunner)
|
||||
s.Error(err)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestReturnRemovesRunnerFromUsedRunners() {
|
||||
suite.apiMock.On("DeleteRunner", mock.AnythingOfType("string")).Return(nil)
|
||||
suite.nomadRunnerManager.usedRunners.Add(suite.exerciseRunner)
|
||||
err := suite.nomadRunnerManager.Return(suite.exerciseRunner)
|
||||
suite.Nil(err)
|
||||
_, ok := suite.nomadRunnerManager.usedRunners.Get(suite.exerciseRunner.Id())
|
||||
suite.False(ok)
|
||||
func (s *ManagerTestSuite) TestReturnRemovesRunnerFromUsedRunners() {
|
||||
s.apiMock.On("DeleteRunner", mock.AnythingOfType("string")).Return(nil)
|
||||
s.nomadRunnerManager.usedRunners.Add(s.exerciseRunner)
|
||||
err := s.nomadRunnerManager.Return(s.exerciseRunner)
|
||||
s.Nil(err)
|
||||
_, ok := s.nomadRunnerManager.usedRunners.Get(s.exerciseRunner.Id())
|
||||
s.False(ok)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestReturnCallsDeleteRunnerApiMethod() {
|
||||
suite.apiMock.On("DeleteRunner", mock.AnythingOfType("string")).Return(nil)
|
||||
err := suite.nomadRunnerManager.Return(suite.exerciseRunner)
|
||||
suite.Nil(err)
|
||||
suite.apiMock.AssertCalled(suite.T(), "DeleteRunner", suite.exerciseRunner.Id())
|
||||
func (s *ManagerTestSuite) TestReturnCallsDeleteRunnerApiMethod() {
|
||||
s.apiMock.On("DeleteRunner", mock.AnythingOfType("string")).Return(nil)
|
||||
err := s.nomadRunnerManager.Return(s.exerciseRunner)
|
||||
s.Nil(err)
|
||||
s.apiMock.AssertCalled(s.T(), "DeleteRunner", s.exerciseRunner.Id())
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestReturnReturnsErrorWhenApiCallFailed() {
|
||||
suite.apiMock.On("DeleteRunner", mock.AnythingOfType("string")).Return(errors.New("return failed"))
|
||||
err := suite.nomadRunnerManager.Return(suite.exerciseRunner)
|
||||
suite.Error(err)
|
||||
func (s *ManagerTestSuite) TestReturnReturnsErrorWhenApiCallFailed() {
|
||||
s.apiMock.On("DeleteRunner", mock.AnythingOfType("string")).Return(errors.New("return failed"))
|
||||
err := s.nomadRunnerManager.Return(s.exerciseRunner)
|
||||
s.Error(err)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestRefreshFetchesRunners() {
|
||||
suite.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
suite.waitForRunnerRefresh()
|
||||
suite.apiMock.AssertCalled(suite.T(), "LoadRunners", tests.DefaultJobId)
|
||||
func (s *ManagerTestSuite) TestRefreshFetchesRunners() {
|
||||
s.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
s.waitForRunnerRefresh()
|
||||
s.apiMock.AssertCalled(s.T(), "LoadRunners", tests.DefaultJobId)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestNewRunnersFoundInRefreshAreAddedToIdleRunners() {
|
||||
suite.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
suite.waitForRunnerRefresh()
|
||||
job, _ := suite.nomadRunnerManager.jobs.Get(defaultEnvironmentId)
|
||||
func (s *ManagerTestSuite) TestNewRunnersFoundInRefreshAreAddedToIdleRunners() {
|
||||
s.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
s.waitForRunnerRefresh()
|
||||
job, _ := s.nomadRunnerManager.jobs.Get(defaultEnvironmentId)
|
||||
_, ok := job.idleRunners.Get(tests.DefaultRunnerId)
|
||||
suite.True(ok)
|
||||
s.True(ok)
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestRefreshScalesJob() {
|
||||
suite.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
suite.waitForRunnerRefresh()
|
||||
func (s *ManagerTestSuite) TestRefreshScalesJob() {
|
||||
s.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
s.waitForRunnerRefresh()
|
||||
// use one runner to necessitate rescaling
|
||||
_, _ = suite.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
suite.waitForRunnerRefresh()
|
||||
suite.apiMock.AssertCalled(suite.T(), "SetJobScale", tests.DefaultJobId, defaultDesiredRunnersCount+1, "Runner Requested")
|
||||
_, _ = s.nomadRunnerManager.Claim(defaultEnvironmentId)
|
||||
s.waitForRunnerRefresh()
|
||||
s.apiMock.AssertCalled(s.T(), "SetJobScale", tests.DefaultJobId, defaultDesiredRunnersCount+1, "Runner Requested")
|
||||
}
|
||||
|
||||
func (suite *ManagerTestSuite) TestRefreshAddsRunnerToPool() {
|
||||
suite.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
suite.waitForRunnerRefresh()
|
||||
job, _ := suite.nomadRunnerManager.jobs.Get(defaultEnvironmentId)
|
||||
func (s *ManagerTestSuite) TestRefreshAddsRunnerToPool() {
|
||||
s.mockRunnerQueries([]string{tests.DefaultRunnerId})
|
||||
s.waitForRunnerRefresh()
|
||||
job, _ := s.nomadRunnerManager.jobs.Get(defaultEnvironmentId)
|
||||
poolRunner, ok := job.idleRunners.Get(tests.DefaultRunnerId)
|
||||
suite.True(ok)
|
||||
suite.Equal(tests.DefaultRunnerId, poolRunner.Id())
|
||||
s.True(ok)
|
||||
s.Equal(tests.DefaultRunnerId, poolRunner.Id())
|
||||
}
|
||||
|
||||
func (s *ManagerTestSuite) TestWhenEnvironmentDoesNotExistEnvironmentExistsReturnsFalse() {
|
||||
id := anotherEnvironmentId
|
||||
_, ok := s.nomadRunnerManager.jobs.Get(id)
|
||||
require.False(s.T(), ok)
|
||||
|
||||
s.False(s.nomadRunnerManager.EnvironmentExists(id))
|
||||
}
|
||||
|
||||
func (s *ManagerTestSuite) TestWhenEnvironmentExistsEnvironmentExistsReturnsTrue() {
|
||||
id := anotherEnvironmentId
|
||||
s.nomadRunnerManager.jobs.Add(&NomadJob{environmentId: id})
|
||||
|
||||
exists := s.nomadRunnerManager.EnvironmentExists(id)
|
||||
s.True(exists)
|
||||
}
|
||||
|
Reference in New Issue
Block a user