Fix deleting non existent environments

that is an error caused by throwing a panic when an environment is not found and a nonexistent runner manager at the end of the chain is asked for it.
This commit is contained in:
Maximilian Paß
2022-05-29 15:47:04 +02:00
committed by Sebastian Serth
parent 689493047d
commit 795c83f7b2
5 changed files with 49 additions and 15 deletions

View File

@ -113,7 +113,7 @@ func createAWSManager() (runnerManager runner.Manager, environmentManager enviro
// initServer builds the http server and configures it with the chain of responsibility for multiple managers. // initServer builds the http server and configures it with the chain of responsibility for multiple managers.
func initServer(influxClient influxdb2API.WriteAPI) *http.Server { func initServer(influxClient influxdb2API.WriteAPI) *http.Server {
runnerManager, environmentManager := createManagerHandler(createNomadManager, config.Config.Nomad.Enabled, runnerManager, environmentManager := createManagerHandler(createNomadManager, config.Config.Nomad.Enabled,
runner.NewAbstractManager(), &environment.AbstractManager{}) nil, nil)
runnerManager, environmentManager = createManagerHandler(createAWSManager, config.Config.AWS.Enabled, runnerManager, environmentManager = createManagerHandler(createAWSManager, config.Config.AWS.Enabled,
runnerManager, environmentManager) runnerManager, environmentManager)

View File

@ -18,13 +18,17 @@ func (n *AbstractManager) SetNextHandler(next ManagerHandler) {
} }
func (n *AbstractManager) NextHandler() ManagerHandler { func (n *AbstractManager) NextHandler() ManagerHandler {
if n.nextHandler != nil { if n.HasNextHandler() {
return n.nextHandler return n.nextHandler
} else { } else {
return &AbstractManager{} return &AbstractManager{}
} }
} }
func (n *AbstractManager) HasNextHandler() bool {
return n.nextHandler != nil
}
func (n *AbstractManager) List(_ bool) ([]runner.ExecutionEnvironment, error) { func (n *AbstractManager) List(_ bool) ([]runner.ExecutionEnvironment, error) {
return []runner.ExecutionEnvironment{}, nil return []runner.ExecutionEnvironment{}, nil
} }
@ -38,17 +42,17 @@ func (n *AbstractManager) CreateOrUpdate(_ dto.EnvironmentID, _ dto.ExecutionEnv
} }
func (n *AbstractManager) Delete(id dto.EnvironmentID) (bool, error) { func (n *AbstractManager) Delete(id dto.EnvironmentID) (bool, error) {
if n.runnerManager == nil {
return false, nil
}
e, ok := n.runnerManager.GetEnvironment(id) e, ok := n.runnerManager.GetEnvironment(id)
if !ok { if !ok {
if n.nextHandler != nil { isFound, err := n.NextHandler().Delete(id)
isFound, err := n.NextHandler().Delete(id) if err != nil {
if err != nil { return false, fmt.Errorf("abstract wrapped: %w", err)
return false, fmt.Errorf("aws wrapped: %w", err)
}
return isFound, nil
} else {
return false, nil
} }
return isFound, nil
} }
n.runnerManager.DeleteEnvironment(id) n.runnerManager.DeleteEnvironment(id)

View File

@ -11,6 +11,7 @@ type ManagerHandler interface {
Manager Manager
SetNextHandler(next ManagerHandler) SetNextHandler(next ManagerHandler)
NextHandler() ManagerHandler NextHandler() ManagerHandler
HasNextHandler() bool
} }
// Manager encapsulates API calls to the executor API for creation and deletion of execution environments. // Manager encapsulates API calls to the executor API for creation and deletion of execution environments.

View File

@ -1,4 +1,4 @@
// Code generated by mockery v2.9.4. DO NOT EDIT. // Code generated by mockery v2.12.3. DO NOT EDIT.
package environment package environment
@ -79,6 +79,20 @@ func (_m *ManagerHandlerMock) Get(id dto.EnvironmentID, fetch bool) (runner.Exec
return r0, r1 return r0, r1
} }
// HasNextHandler provides a mock function with given fields:
func (_m *ManagerHandlerMock) HasNextHandler() bool {
ret := _m.Called()
var r0 bool
if rf, ok := ret.Get(0).(func() bool); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(bool)
}
return r0
}
// List provides a mock function with given fields: fetch // List provides a mock function with given fields: fetch
func (_m *ManagerHandlerMock) List(fetch bool) ([]runner.ExecutionEnvironment, error) { func (_m *ManagerHandlerMock) List(fetch bool) ([]runner.ExecutionEnvironment, error) {
ret := _m.Called(fetch) ret := _m.Called(fetch)
@ -118,9 +132,9 @@ func (_m *ManagerHandlerMock) NextHandler() ManagerHandler {
return r0 return r0
} }
// SetNextHandler provides a mock function with given fields: m // SetNextHandler provides a mock function with given fields: next
func (_m *ManagerHandlerMock) SetNextHandler(m ManagerHandler) { func (_m *ManagerHandlerMock) SetNextHandler(next ManagerHandler) {
_m.Called(m) _m.Called(next)
} }
// Statistics provides a mock function with given fields: // Statistics provides a mock function with given fields:
@ -138,3 +152,18 @@ func (_m *ManagerHandlerMock) Statistics() map[dto.EnvironmentID]*dto.Statistica
return r0 return r0
} }
type NewManagerHandlerMockT interface {
mock.TestingT
Cleanup(func())
}
// NewManagerHandlerMock creates a new instance of ManagerHandlerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
func NewManagerHandlerMock(t NewManagerHandlerMockT) *ManagerHandlerMock {
mock := &ManagerHandlerMock{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}

View File

@ -30,7 +30,7 @@ func (n *AbstractManager) SetNextHandler(next AccessorHandler) {
} }
func (n *AbstractManager) NextHandler() AccessorHandler { func (n *AbstractManager) NextHandler() AccessorHandler {
if n.nextHandler != nil { if n.HasNextHandler() {
return n.nextHandler return n.nextHandler
} else { } else {
return NewAbstractManager() return NewAbstractManager()