@@ -28,25 +28,28 @@ import (
28
28
29
29
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/config"
30
30
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker"
31
+ sErrors "github.com/GoogleContainerTools/skaffold/pkg/skaffold/errors"
31
32
latestV1 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest/v1"
32
33
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/util"
34
+ "github.com/GoogleContainerTools/skaffold/proto/v1"
33
35
"github.com/GoogleContainerTools/skaffold/testutil"
34
36
)
35
37
36
38
func TestDockerCLIBuild (t * testing.T ) {
37
39
tests := []struct {
38
- description string
39
- localBuild latestV1.LocalBuild
40
- mode config.RunMode
41
- extraEnv []string
42
- expectedEnv []string
43
- err error
44
- expectedErr error
40
+ description string
41
+ localBuild latestV1.LocalBuild
42
+ cfg mockConfig
43
+ extraEnv []string
44
+ expectedEnv []string
45
+ err error
46
+ expectedErr error
47
+ expectedErrCode proto.StatusCode
45
48
}{
46
49
{
47
50
description : "docker build" ,
48
51
localBuild : latestV1.LocalBuild {},
49
- mode : config .RunModes .Dev ,
52
+ cfg : mockConfig { runMode : config .RunModes .Dev } ,
50
53
expectedEnv : []string {"KEY=VALUE" },
51
54
},
52
55
{
@@ -77,7 +80,38 @@ func TestDockerCLIBuild(t *testing.T) {
77
80
description : "docker build internal error" ,
78
81
localBuild : latestV1.LocalBuild {UseDockerCLI : true },
79
82
err : errdefs .Cancelled (fmt .Errorf ("cancelled" )),
80
- expectedErr : newBuildError (errdefs .Cancelled (fmt .Errorf ("cancelled" ))),
83
+ expectedErr : newBuildError (errdefs .Cancelled (fmt .Errorf ("cancelled" )), mockConfig {runMode : config .RunModes .Dev }),
84
+ },
85
+ {
86
+ description : "docker build no space left error with prune for dev" ,
87
+ localBuild : latestV1.LocalBuild {UseDockerCLI : true },
88
+ cfg : mockConfig {runMode : config .RunModes .Dev , prune : false },
89
+ err : errdefs .System (fmt .Errorf ("no space left" )),
90
+ expectedErr : fmt .Errorf ("Docker ran out of memory. Please run 'docker system prune' to removed unused docker data or Run skaffold dev with --cleanup=true to clean up images built by skaffold" ),
91
+ expectedErrCode : proto .StatusCode_BUILD_DOCKER_NO_SPACE_ERR ,
92
+ },
93
+ {
94
+ description : "docker build no space left error with prune for build" ,
95
+ localBuild : latestV1.LocalBuild {UseDockerCLI : true },
96
+ cfg : mockConfig {runMode : config .RunModes .Build , prune : false },
97
+ err : errdefs .System (fmt .Errorf ("no space left" )),
98
+ expectedErr : fmt .Errorf ("no space left: Docker ran out of memory. Please run 'docker system prune' to removed unused docker data" ),
99
+ expectedErrCode : proto .StatusCode_BUILD_DOCKER_NO_SPACE_ERR ,
100
+ },
101
+ {
102
+ description : "docker build no space left error with prune true" ,
103
+ localBuild : latestV1.LocalBuild {UseDockerCLI : true },
104
+ cfg : mockConfig {prune : true },
105
+ err : errdefs .System (fmt .Errorf ("no space left" )),
106
+ expectedErr : fmt .Errorf ("no space left: Docker ran out of memory. Please run 'docker system prune' to removed unused docker data" ),
107
+ expectedErrCode : proto .StatusCode_BUILD_DOCKER_NO_SPACE_ERR ,
108
+ },
109
+ {
110
+ description : "docker build system error" ,
111
+ localBuild : latestV1.LocalBuild {UseDockerCLI : true },
112
+ err : errdefs .System (fmt .Errorf ("something else" )),
113
+ expectedErr : fmt .Errorf ("something else" ),
114
+ expectedErrCode : proto .StatusCode_BUILD_DOCKER_SYSTEM_ERR ,
81
115
},
82
116
}
83
117
@@ -92,8 +126,12 @@ func TestDockerCLIBuild(t *testing.T) {
92
126
var mockCmd * testutil.FakeCmd
93
127
94
128
if test .err != nil {
129
+ var pruneFlag string
130
+ if test .cfg .Prune () {
131
+ pruneFlag = " --force-rm"
132
+ }
95
133
mockCmd = testutil .CmdRunErr (
96
- "docker build . --file " + dockerfilePath + " -t tag" ,
134
+ "docker build . --file " + dockerfilePath + " -t tag" + pruneFlag ,
97
135
test .err ,
98
136
)
99
137
t .Override (& util .DefaultExecCommand , mockCmd )
@@ -106,7 +144,7 @@ func TestDockerCLIBuild(t *testing.T) {
106
144
}
107
145
t .Override (& util .OSEnviron , func () []string { return []string {"KEY=VALUE" } })
108
146
109
- builder := NewArtifactBuilder (fakeLocalDaemonWithExtraEnv (test .extraEnv ), test .localBuild .UseDockerCLI , test .localBuild .UseBuildkit , false , false , test . mode , nil , mockArtifactResolver {make (map [string ]string )}, nil )
147
+ builder := NewArtifactBuilder (fakeLocalDaemonWithExtraEnv (test .extraEnv ), test .cfg , test . localBuild .UseDockerCLI , test .localBuild .UseBuildkit , false , mockArtifactResolver {make (map [string ]string )}, nil )
110
148
111
149
artifact := & latestV1.Artifact {
112
150
Workspace : "." ,
@@ -122,6 +160,14 @@ func TestDockerCLIBuild(t *testing.T) {
122
160
if mockCmd != nil {
123
161
t .CheckDeepEqual (1 , mockCmd .TimesCalled ())
124
162
}
163
+ if test .err != nil && test .expectedErrCode != 0 {
164
+ if ae , ok := err .(sErrors.ErrDef ); ok {
165
+ t .CheckDeepEqual (test .expectedErrCode , ae .StatusCode ())
166
+ t .CheckErrorContains (test .expectedErr .Error (), ae )
167
+ } else {
168
+ t .Fatalf ("expected to find an actionable error. not found" )
169
+ }
170
+ }
125
171
})
126
172
}
127
173
}
@@ -150,3 +196,28 @@ func (t stubAuth) GetAuthConfig(string) (types.AuthConfig, error) {
150
196
func (t stubAuth ) GetAllAuthConfigs (context.Context ) (map [string ]types.AuthConfig , error ) {
151
197
return nil , nil
152
198
}
199
+
200
+ type mockConfig struct {
201
+ runMode config.RunMode
202
+ prune bool
203
+ }
204
+
205
+ func (m mockConfig ) GetKubeContext () string {
206
+ return ""
207
+ }
208
+
209
+ func (m mockConfig ) MinikubeProfile () string {
210
+ return ""
211
+ }
212
+
213
+ func (m mockConfig ) GetInsecureRegistries () map [string ]bool {
214
+ return map [string ]bool {}
215
+ }
216
+
217
+ func (m mockConfig ) Mode () config.RunMode {
218
+ return m .runMode
219
+ }
220
+
221
+ func (m mockConfig ) Prune () bool {
222
+ return m .prune
223
+ }
0 commit comments