github.com/ssube/gitlab-ci-multi-runner@v1.2.1-0.20160607142738-b8d1285632e6/executors/docker/executor_docker_test.go (about)

     1  package docker
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/fsouza/go-dockerclient"
     8  	"github.com/stretchr/testify/assert"
     9  	"gitlab.com/gitlab-org/gitlab-ci-multi-runner/common"
    10  	"gitlab.com/gitlab-org/gitlab-ci-multi-runner/mocks"
    11  )
    12  
    13  func TestParseDeviceStringOne(t *testing.T) {
    14  	e := executor{}
    15  
    16  	device, err := e.parseDeviceString("/dev/kvm")
    17  
    18  	assert.NoError(t, err)
    19  	assert.Equal(t, device.PathOnHost, "/dev/kvm")
    20  	assert.Equal(t, device.PathInContainer, "/dev/kvm")
    21  	assert.Equal(t, device.CgroupPermissions, "rwm")
    22  }
    23  
    24  func TestParseDeviceStringTwo(t *testing.T) {
    25  	e := executor{}
    26  
    27  	device, err := e.parseDeviceString("/dev/kvm:/devices/kvm")
    28  
    29  	assert.NoError(t, err)
    30  	assert.Equal(t, device.PathOnHost, "/dev/kvm")
    31  	assert.Equal(t, device.PathInContainer, "/devices/kvm")
    32  	assert.Equal(t, device.CgroupPermissions, "rwm")
    33  }
    34  
    35  func TestParseDeviceStringThree(t *testing.T) {
    36  	e := executor{}
    37  
    38  	device, err := e.parseDeviceString("/dev/kvm:/devices/kvm:r")
    39  
    40  	assert.NoError(t, err)
    41  	assert.Equal(t, device.PathOnHost, "/dev/kvm")
    42  	assert.Equal(t, device.PathInContainer, "/devices/kvm")
    43  	assert.Equal(t, device.CgroupPermissions, "r")
    44  }
    45  
    46  func TestParseDeviceStringFour(t *testing.T) {
    47  	e := executor{}
    48  
    49  	_, err := e.parseDeviceString("/dev/kvm:/devices/kvm:r:oops")
    50  
    51  	assert.Error(t, err)
    52  }
    53  
    54  func TestSplitService(t *testing.T) {
    55  	e := executor{}
    56  
    57  	tests := []struct {
    58  		description string
    59  		service     string
    60  		version     string
    61  		alias       string
    62  		alternative string
    63  	}{
    64  		{"service", "service", "latest", "service", ""},
    65  		{"service:version", "service", "version", "service", ""},
    66  		{"namespace/service", "namespace/service", "latest", "namespace__service", "namespace-service"},
    67  		{"namespace/service:version", "namespace/service", "version", "namespace__service", "namespace-service"},
    68  	}
    69  
    70  	for _, test := range tests {
    71  		service, version, linkNames := e.splitServiceAndVersion(test.description)
    72  
    73  		assert.Equal(t, test.service, service, "for", test.description)
    74  		assert.Equal(t, test.version, version, "for", test.description)
    75  		assert.Equal(t, test.alias, linkNames[0], "for", test.description)
    76  		if test.alternative != "" {
    77  			assert.Len(t, linkNames, 2, "for", test.description)
    78  			assert.Equal(t, test.alternative, linkNames[1], "for", test.description)
    79  		} else {
    80  			assert.Len(t, linkNames, 1, "for", test.description)
    81  		}
    82  	}
    83  }
    84  
    85  func TestDockerForNamedImage(t *testing.T) {
    86  	var c mocks.Client
    87  	defer c.AssertExpectations(t)
    88  
    89  	e := executor{client: &c}
    90  	ac, _ := e.getAuthConfig("test")
    91  
    92  	c.On("PullImage", docker.PullImageOptions{Repository: "test:latest"}, ac).
    93  		Return(os.ErrNotExist).
    94  		Once()
    95  
    96  	c.On("PullImage", docker.PullImageOptions{Repository: "tagged:tag"}, ac).
    97  		Return(os.ErrNotExist).
    98  		Once()
    99  
   100  	c.On("PullImage", docker.PullImageOptions{Repository: "real@sha"}, ac).
   101  		Return(os.ErrNotExist).
   102  		Once()
   103  
   104  	image, err := e.pullDockerImage("test")
   105  	assert.Error(t, err)
   106  	assert.Nil(t, image)
   107  
   108  	image, err = e.pullDockerImage("tagged:tag")
   109  	assert.Error(t, err)
   110  	assert.Nil(t, image)
   111  
   112  	image, err = e.pullDockerImage("real@sha")
   113  	assert.Error(t, err)
   114  	assert.Nil(t, image)
   115  }
   116  
   117  func TestDockerForExistingImage(t *testing.T) {
   118  	var c mocks.Client
   119  	defer c.AssertExpectations(t)
   120  
   121  	e := executor{client: &c}
   122  	ac, _ := e.getAuthConfig("existing")
   123  
   124  	c.On("PullImage", docker.PullImageOptions{Repository: "existing:latest"}, ac).
   125  		Return(nil).
   126  		Once()
   127  	c.On("InspectImage", "existing").
   128  		Return(&docker.Image{}, nil).
   129  		Once()
   130  
   131  	image, err := e.pullDockerImage("existing")
   132  	assert.NoError(t, err)
   133  	assert.NotNil(t, image)
   134  }
   135  
   136  func (e *executor) setPolicyMode(pullPolicy common.DockerPullPolicy) {
   137  	e.Config = common.RunnerConfig{
   138  		RunnerSettings: common.RunnerSettings{
   139  			Docker: &common.DockerConfig{
   140  				PullPolicy: pullPolicy,
   141  			},
   142  		},
   143  	}
   144  }
   145  
   146  func TestDockerGetImageById(t *testing.T) {
   147  	var c mocks.Client
   148  	defer c.AssertExpectations(t)
   149  
   150  	c.On("InspectImage", "ID").
   151  		Return(&docker.Image{ID: "ID"}, nil).
   152  		Once()
   153  
   154  	// Use default policy
   155  	e := executor{client: &c}
   156  	e.setPolicyMode("")
   157  
   158  	image, err := e.getDockerImage("ID")
   159  	assert.NoError(t, err)
   160  	assert.NotNil(t, image)
   161  	assert.Equal(t, "ID", image.ID)
   162  }
   163  
   164  func TestDockerUnknownPolicyMode(t *testing.T) {
   165  	var c mocks.Client
   166  	defer c.AssertExpectations(t)
   167  
   168  	e := executor{client: &c}
   169  	e.setPolicyMode("unknown")
   170  
   171  	_, err := e.getDockerImage("not-existing")
   172  	assert.Error(t, err)
   173  }
   174  
   175  func TestDockerPolicyModeNever(t *testing.T) {
   176  	var c mocks.Client
   177  	defer c.AssertExpectations(t)
   178  
   179  	c.On("InspectImage", "existing").
   180  		Return(&docker.Image{}, nil).
   181  		Once()
   182  
   183  	c.On("InspectImage", "not-existing").
   184  		Return(nil, os.ErrNotExist).
   185  		Once()
   186  
   187  	e := executor{client: &c}
   188  	e.setPolicyMode(common.DockerPullPolicyNever)
   189  
   190  	image, err := e.getDockerImage("existing")
   191  	assert.NoError(t, err)
   192  	assert.NotNil(t, image)
   193  
   194  	image, err = e.getDockerImage("not-existing")
   195  	assert.Error(t, err)
   196  	assert.Nil(t, image)
   197  }
   198  
   199  func TestDockerPolicyModeIfNotPresentForExistingImage(t *testing.T) {
   200  	var c mocks.Client
   201  	defer c.AssertExpectations(t)
   202  
   203  	e := executor{client: &c}
   204  	e.setPolicyMode(common.DockerPullPolicyIfNotPresent)
   205  
   206  	c.On("InspectImage", "existing").
   207  		Return(&docker.Image{}, nil).
   208  		Once()
   209  
   210  	image, err := e.getDockerImage("existing")
   211  	assert.NoError(t, err)
   212  	assert.NotNil(t, image)
   213  }
   214  
   215  func TestDockerPolicyModeIfNotPresentForNotExistingImage(t *testing.T) {
   216  	var c mocks.Client
   217  	defer c.AssertExpectations(t)
   218  
   219  	e := executor{client: &c}
   220  	e.setPolicyMode(common.DockerPullPolicyIfNotPresent)
   221  
   222  	c.On("InspectImage", "not-existing").
   223  		Return(nil, os.ErrNotExist).
   224  		Once()
   225  
   226  	ac, _ := e.getAuthConfig("not-existing")
   227  	c.On("PullImage", docker.PullImageOptions{Repository: "not-existing:latest"}, ac).
   228  		Return(nil).
   229  		Once()
   230  
   231  	c.On("InspectImage", "not-existing").
   232  		Return(&docker.Image{}, nil).
   233  		Once()
   234  
   235  	image, err := e.getDockerImage("not-existing")
   236  	assert.NoError(t, err)
   237  	assert.NotNil(t, image)
   238  
   239  	c.On("InspectImage", "not-existing").
   240  		Return(&docker.Image{}, nil).
   241  		Once()
   242  
   243  	// It shouldn't execute the pull for second time
   244  	image, err = e.getDockerImage("not-existing")
   245  	assert.NoError(t, err)
   246  	assert.NotNil(t, image)
   247  }
   248  
   249  func TestDockerPolicyModeAlwaysForExistingImage(t *testing.T) {
   250  	var c mocks.Client
   251  	defer c.AssertExpectations(t)
   252  
   253  	e := executor{client: &c}
   254  	e.setPolicyMode(common.DockerPullPolicyAlways)
   255  
   256  	c.On("InspectImage", "existing").
   257  		Return(&docker.Image{}, nil).
   258  		Once()
   259  
   260  	ac, _ := e.getAuthConfig("existing")
   261  	c.On("PullImage", docker.PullImageOptions{Repository: "existing:latest"}, ac).
   262  		Return(nil).
   263  		Once()
   264  
   265  	c.On("InspectImage", "existing").
   266  		Return(&docker.Image{}, nil).
   267  		Once()
   268  
   269  	image, err := e.getDockerImage("existing")
   270  	assert.NoError(t, err)
   271  	assert.NotNil(t, image)
   272  }
   273  
   274  func TestDockerGetExistingDockerImageIfPullFails(t *testing.T) {
   275  	var c mocks.Client
   276  	defer c.AssertExpectations(t)
   277  
   278  	e := executor{client: &c}
   279  	e.setPolicyMode(common.DockerPullPolicyAlways)
   280  
   281  	c.On("InspectImage", "to-pull").
   282  		Return(&docker.Image{}, nil).
   283  		Once()
   284  
   285  	ac, _ := e.getAuthConfig("to-pull")
   286  	c.On("PullImage", docker.PullImageOptions{Repository: "to-pull:latest"}, ac).
   287  		Return(os.ErrNotExist).
   288  		Once()
   289  
   290  	image, err := e.getDockerImage("to-pull")
   291  	assert.NoError(t, err)
   292  	assert.NotNil(t, image, "Returns existing image")
   293  
   294  	c.On("InspectImage", "not-existing").
   295  		Return(nil, os.ErrNotExist).
   296  		Once()
   297  
   298  	c.On("PullImage", docker.PullImageOptions{Repository: "not-existing:latest"}, ac).
   299  		Return(os.ErrNotExist).
   300  		Once()
   301  
   302  	image, err = e.getDockerImage("not-existing")
   303  	assert.Error(t, err)
   304  	assert.Nil(t, image, "No existing image")
   305  }