Skip to content
Snippets Groups Projects
Unverified Commit 32e1cc85 authored by Tomasz Maczukin's avatar Tomasz Maczukin
Browse files

Fix regression in handling Docker Machine credentials with docker+machine executor

parent 7d0faa6b
No related branches found
No related tags found
No related merge requests found
......@@ -18,7 +18,7 @@ const (
)
type machineExecutor struct {
provider *machineProvider
provider ProviderInterface
executor common.Executor
build *common.Build
data common.ExecutorData
......@@ -65,6 +65,7 @@ func (e *machineExecutor) Prepare(options common.ExecutorPrepareOptions) (err er
if err != nil {
return err
}
options.Config.Docker.DockerCredentials = e.config.Docker.DockerCredentials
// TODO: Currently the docker-machine doesn't support multiple builds
e.build.ProjectRunnerID = 0
......@@ -77,10 +78,11 @@ func (e *machineExecutor) Prepare(options common.ExecutorPrepareOptions) (err er
e.log().Infoln("Starting docker-machine build...")
// Create original executor
e.executor = e.provider.provider.Create()
e.executor = e.provider.CreateInternalExecutor()
if e.executor == nil {
return errors.New("failed to create an executor")
}
return e.executor.Prepare(options)
}
......
package machine
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"gitlab.com/gitlab-org/gitlab-ci-multi-runner/common"
"gitlab.com/gitlab-org/gitlab-ci-multi-runner/helpers/docker"
)
func getRunnerConfig() *common.RunnerConfig {
return &common.RunnerConfig{
Name: "runner",
RunnerSettings: common.RunnerSettings{
Executor: "docker+machine",
Docker: &common.DockerConfig{
DockerCredentials: docker_helpers.DockerCredentials{},
Image: "alpine",
},
},
}
}
type machineCredentialsUsageFakeExecutor struct {
t *testing.T
machineCredentials docker_helpers.DockerCredentials
}
func (e *machineCredentialsUsageFakeExecutor) assertRunnerConfiguration(runnerConfig *common.RunnerConfig) {
expectedRunnerConfig := getRunnerConfig()
assert.Equal(e.t, expectedRunnerConfig.Name, runnerConfig.Name)
assert.Equal(e.t, expectedRunnerConfig.RunnerSettings.Executor, runnerConfig.RunnerSettings.Executor)
assert.Equal(e.t, expectedRunnerConfig.Docker.Image, runnerConfig.Docker.Image)
assert.Equal(e.t, e.machineCredentials, runnerConfig.Docker.DockerCredentials, "DockerCredentials should be filled with machine's credentials")
}
func (e *machineCredentialsUsageFakeExecutor) Prepare(options common.ExecutorPrepareOptions) error {
e.assertRunnerConfiguration(options.Config)
e.assertRunnerConfiguration(options.Build.Runner)
return nil
}
func (e *machineCredentialsUsageFakeExecutor) Shell() *common.ShellScriptInfo { return nil }
func (e *machineCredentialsUsageFakeExecutor) Run(cmd common.ExecutorCommand) error { return nil }
func (e *machineCredentialsUsageFakeExecutor) Finish(err error) {}
func (e *machineCredentialsUsageFakeExecutor) Cleanup() {}
func (e *machineCredentialsUsageFakeExecutor) SetCurrentStage(stage common.ExecutorStage) {}
func (e *machineCredentialsUsageFakeExecutor) GetCurrentStage() common.ExecutorStage {
return common.ExecutorStageCreated
}
func TestMachineCredentialsUsage(t *testing.T) {
machineCredentials := docker_helpers.DockerCredentials{
Host: "tcp://expected-host:1234",
}
runnerConfig := getRunnerConfig()
options := common.ExecutorPrepareOptions{
Config: runnerConfig,
Build: &common.Build{
Runner: runnerConfig,
},
}
machineRunnerConfig := getRunnerConfig()
machineRunnerConfig.Docker.DockerCredentials = machineCredentials
fakeExecutor := &machineCredentialsUsageFakeExecutor{t, machineCredentials}
machineProvider := &MockProviderInterface{}
defer machineProvider.AssertExpectations(t)
machineProvider.On("Use", options.Config, options.Build.ExecutorData).
Return(*machineRunnerConfig, mock.Anything, nil).Once()
machineProvider.On("CreateInternalExecutor").
Return(fakeExecutor).Once()
e := &machineExecutor{
provider: machineProvider,
}
err := e.Prepare(options)
assert.NoError(t, err)
}
package machine
import common "gitlab.com/gitlab-org/gitlab-ci-multi-runner/common"
import mock "github.com/stretchr/testify/mock"
// MockProviderInterface is an autogenerated mock type for the ProviderInterface type
type MockProviderInterface struct {
mock.Mock
}
// CreateInternalExecutor provides a mock function with given fields:
func (_m *MockProviderInterface) CreateInternalExecutor() common.Executor {
ret := _m.Called()
var r0 common.Executor
if rf, ok := ret.Get(0).(func() common.Executor); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(common.Executor)
}
}
return r0
}
// Release provides a mock function with given fields: config, data
func (_m *MockProviderInterface) Release(config *common.RunnerConfig, data common.ExecutorData) error {
ret := _m.Called(config, data)
var r0 error
if rf, ok := ret.Get(0).(func(*common.RunnerConfig, common.ExecutorData) error); ok {
r0 = rf(config, data)
} else {
r0 = ret.Error(0)
}
return r0
}
// Use provides a mock function with given fields: config, data
func (_m *MockProviderInterface) Use(config *common.RunnerConfig, data common.ExecutorData) (common.RunnerConfig, common.ExecutorData, error) {
ret := _m.Called(config, data)
var r0 common.RunnerConfig
if rf, ok := ret.Get(0).(func(*common.RunnerConfig, common.ExecutorData) common.RunnerConfig); ok {
r0 = rf(config, data)
} else {
r0 = ret.Get(0).(common.RunnerConfig)
}
var r1 common.ExecutorData
if rf, ok := ret.Get(1).(func(*common.RunnerConfig, common.ExecutorData) common.ExecutorData); ok {
r1 = rf(config, data)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(common.ExecutorData)
}
}
var r2 error
if rf, ok := ret.Get(2).(func(*common.RunnerConfig, common.ExecutorData) error); ok {
r2 = rf(config, data)
} else {
r2 = ret.Error(2)
}
return r0, r1, r2
}
var _ ProviderInterface = (*MockProviderInterface)(nil)
......@@ -13,6 +13,12 @@ import (
"gitlab.com/gitlab-org/gitlab-ci-multi-runner/helpers/docker"
)
type ProviderInterface interface {
CreateInternalExecutor() common.Executor
Release(config *common.RunnerConfig, data common.ExecutorData) error
Use(config *common.RunnerConfig, data common.ExecutorData) (newConfig common.RunnerConfig, newData common.ExecutorData, err error)
}
type machineProvider struct {
name string
machine docker_helpers.Machine
......@@ -392,6 +398,10 @@ func (m *machineProvider) GetFeatures(features *common.FeaturesInfo) {
m.provider.GetFeatures(features)
}
func (m *machineProvider) CreateInternalExecutor() common.Executor {
return m.provider.Create()
}
func (m *machineProvider) Create() common.Executor {
return &machineExecutor{
provider: m,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment