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 }