github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/e2e/images_test.go (about) 1 package e2e 2 3 import ( 4 "bufio" 5 "fmt" 6 "io/ioutil" 7 "path/filepath" 8 "regexp" 9 "strings" 10 "testing" 11 12 "github.com/opencontainers/go-digest" 13 14 "gotest.tools/fs" 15 16 "gotest.tools/assert" 17 "gotest.tools/icmd" 18 ) 19 20 func insertBundles(t *testing.T, cmd icmd.Cmd) { 21 // Push an application so that we can later pull it by digest 22 cmd.Command = dockerCli.Command("app", "build", "--no-resolve-image", "--tag", "my.registry:5000/c-myapp", filepath.Join("testdata", "push-pull")) 23 icmd.RunCmd(cmd).Assert(t, icmd.Success) 24 cmd.Command = dockerCli.Command("app", "build", "--no-resolve-image", "--tag", "b-simple-app", filepath.Join("testdata", "simple")) 25 icmd.RunCmd(cmd).Assert(t, icmd.Success) 26 cmd.Command = dockerCli.Command("app", "build", "--no-resolve-image", "--tag", "a-simple-app", filepath.Join("testdata", "simple")) 27 icmd.RunCmd(cmd).Assert(t, icmd.Success) 28 } 29 30 func assertImageListOutput(t *testing.T, cmd icmd.Cmd, expected string) { 31 result := icmd.RunCmd(cmd).Assert(t, icmd.Success) 32 stdout := result.Stdout() 33 match, err := regexp.MatchString(expected, stdout) 34 assert.NilError(t, err) 35 assert.Assert(t, match, expected, stdout) 36 } 37 38 func expectImageListOutput(t *testing.T, cmd icmd.Cmd, output string) { 39 cmd.Command = dockerCli.Command("app", "image", "ls") 40 assertImageListOutput(t, cmd, output) 41 } 42 43 func expectImageListDigestsOutput(t *testing.T, cmd icmd.Cmd, output string) { 44 cmd.Command = dockerCli.Command("app", "image", "ls", "--digests") 45 assertImageListOutput(t, cmd, output) 46 } 47 48 func verifyImageIDListOutput(t *testing.T, cmd icmd.Cmd, expectedCount int) { 49 cmd.Command = dockerCli.Command("app", "image", "ls", "-q") 50 result := icmd.RunCmd(cmd).Assert(t, icmd.Success) 51 scanner := bufio.NewScanner(strings.NewReader(result.Stdout())) 52 count := 0 53 for scanner.Scan() { 54 count++ 55 } 56 if err := scanner.Err(); err != nil { 57 assert.Error(t, err, "Verification failed") 58 } 59 assert.Equal(t, expectedCount, count) 60 } 61 62 func TestImageList(t *testing.T) { 63 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 64 cmd := info.configuredCmd 65 66 insertBundles(t, cmd) 67 68 expected := `REPOSITORY TAG APP IMAGE ID APP NAME 69 a-simple-app latest [a-f0-9]{12} simple 70 b-simple-app latest [a-f0-9]{12} simple 71 my.registry:5000/c-myapp latest [a-f0-9]{12} push-pull 72 ` 73 74 expectImageListOutput(t, cmd, expected) 75 }) 76 } 77 78 func TestImageListQuiet(t *testing.T) { 79 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 80 cmd := info.configuredCmd 81 insertBundles(t, cmd) 82 verifyImageIDListOutput(t, cmd, 3) 83 }) 84 } 85 86 func TestImageListDigests(t *testing.T) { 87 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 88 cmd := info.configuredCmd 89 insertBundles(t, cmd) 90 expected := `REPOSITORY TAG DIGEST APP IMAGE ID APP NAME 91 a-simple-app latest <none> [a-f0-9]{12} simple 92 b-simple-app latest <none> [a-f0-9]{12} simple 93 my.registry:5000/c-myapp latest <none> [a-f0-9]{12} push-pull 94 ` 95 expectImageListDigestsOutput(t, cmd, expected) 96 }) 97 } 98 99 func TestImageRmForce(t *testing.T) { 100 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 101 cmd := info.configuredCmd 102 iidfile := fs.NewFile(t, "iid").Path() 103 104 cmd.Command = dockerCli.Command("app", "build", "--no-resolve-image", "--tag", "a-simple-app", "--iidfile", iidfile, filepath.Join("testdata", "simple")) 105 icmd.RunCmd(cmd).Assert(t, icmd.Success) 106 cmd.Command = dockerCli.Command("app", "image", "tag", "a-simple-app", "b-simple-app") 107 icmd.RunCmd(cmd).Assert(t, icmd.Success) 108 cmd.Command = dockerCli.Command("app", "image", "tag", "a-simple-app", "c-simple-app") 109 icmd.RunCmd(cmd).Assert(t, icmd.Success) 110 111 bytes, err := ioutil.ReadFile(iidfile) 112 assert.NilError(t, err) 113 114 imageID := digest.Digest(bytes).Encoded() 115 cmd.Command = dockerCli.Command("app", "image", "rm", imageID) 116 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 117 ExitCode: 1, 118 Err: fmt.Sprintf("Error: unable to delete %q - App is referenced in multiple repositories", imageID), 119 }) 120 121 cmd.Command = dockerCli.Command("app", "image", "rm", "--force", imageID) 122 icmd.RunCmd(cmd).Assert(t, icmd.Success) 123 124 expectedOutput := "REPOSITORY TAG APP IMAGE ID APP NAME \n" 125 expectImageListOutput(t, cmd, expectedOutput) 126 }) 127 } 128 129 func TestImageRm(t *testing.T) { 130 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 131 cmd := info.configuredCmd 132 133 insertBundles(t, cmd) 134 135 cmd.Command = dockerCli.Command("app", "image", "rm", "my.registry:5000/c-myapp:latest") 136 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 137 ExitCode: 0, 138 Out: "Deleted: my.registry:5000/c-myapp:latest", 139 }) 140 141 cmd.Command = dockerCli.Command("app", "image", "rm", "a-simple-app", "b-simple-app:latest") 142 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 143 ExitCode: 0, 144 Out: `Deleted: a-simple-app:latest 145 Deleted: b-simple-app:latest`, 146 }) 147 148 cmd.Command = dockerCli.Command("app", "image", "rm", "b-simple-app") 149 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 150 ExitCode: 1, 151 Err: `b-simple-app: reference not found`, 152 }) 153 154 expectedOutput := "REPOSITORY TAG APP IMAGE ID APP NAME \n" 155 expectImageListOutput(t, cmd, expectedOutput) 156 }) 157 } 158 159 func TestImageTag(t *testing.T) { 160 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 161 cmd := info.configuredCmd 162 163 dockerAppImageTag := func(args ...string) { 164 cmdArgs := append([]string{"app", "image", "tag"}, args...) 165 cmd.Command = dockerCli.Command(cmdArgs...) 166 } 167 168 // given a first available image 169 cmd.Command = dockerCli.Command("app", "build", "--tag", "a-simple-app", filepath.Join("testdata", "simple")) 170 icmd.RunCmd(cmd).Assert(t, icmd.Success) 171 172 singleImageExpectation := `REPOSITORY TAG APP IMAGE ID APP NAME 173 a-simple-app latest [a-f0-9]{12} simple 174 ` 175 expectImageListOutput(t, cmd, singleImageExpectation) 176 177 // with no argument 178 dockerAppImageTag() 179 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 180 ExitCode: 1, 181 Err: `"docker app image tag" requires exactly 2 arguments.`, 182 }) 183 184 // with one argument 185 dockerAppImageTag("a-simple-app") 186 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 187 ExitCode: 1, 188 Err: `"docker app image tag" requires exactly 2 arguments.`, 189 }) 190 191 // with invalid src reference 192 dockerAppImageTag("a-simple-app$2", "b-simple-app") 193 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 194 ExitCode: 1, 195 Err: `could not parse "a-simple-app$2" as a valid reference`, 196 }) 197 198 // with invalid target reference 199 dockerAppImageTag("a-simple-app", "b@simple-app") 200 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 201 ExitCode: 1, 202 Err: `could not parse "b@simple-app" as a valid reference`, 203 }) 204 205 // with unexisting source image 206 dockerAppImageTag("b-simple-app", "target") 207 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 208 ExitCode: 1, 209 Err: `could not tag "b-simple-app": no such App image`, 210 }) 211 212 // with unexisting source tag 213 dockerAppImageTag("a-simple-app:not-a-tag", "target") 214 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 215 ExitCode: 1, 216 Err: `could not tag "a-simple-app:not-a-tag": no such App image`, 217 }) 218 219 // tag image with only names 220 dockerAppImageTag("a-simple-app", "b-simple-app") 221 icmd.RunCmd(cmd).Assert(t, icmd.Success) 222 expectImageListOutput(t, cmd, `REPOSITORY TAG APP IMAGE ID APP NAME 223 a-simple-app latest [a-f0-9]{12} simple 224 b-simple-app latest [a-f0-9]{12} simple 225 `) 226 227 // target tag 228 dockerAppImageTag("a-simple-app", "a-simple-app:0.1") 229 icmd.RunCmd(cmd).Assert(t, icmd.Success) 230 expectImageListOutput(t, cmd, `REPOSITORY TAG APP IMAGE ID APP NAME 231 a-simple-app 0.1 [a-f0-9]{12} simple 232 a-simple-app latest [a-f0-9]{12} simple 233 b-simple-app latest [a-f0-9]{12} simple 234 `) 235 236 // source tag 237 dockerAppImageTag("a-simple-app:0.1", "c-simple-app") 238 icmd.RunCmd(cmd).Assert(t, icmd.Success) 239 expectImageListOutput(t, cmd, `REPOSITORY TAG APP IMAGE ID APP NAME 240 a-simple-app 0.1 [a-f0-9]{12} simple 241 a-simple-app latest [a-f0-9]{12} simple 242 b-simple-app latest [a-f0-9]{12} simple 243 c-simple-app latest [a-f0-9]{12} simple 244 `) 245 246 // source and target tags 247 dockerAppImageTag("a-simple-app:0.1", "b-simple-app:0.2") 248 icmd.RunCmd(cmd).Assert(t, icmd.Success) 249 expectImageListOutput(t, cmd, `REPOSITORY TAG APP IMAGE ID APP NAME 250 a-simple-app 0.1 [a-f0-9]{12} simple 251 a-simple-app latest [a-f0-9]{12} simple 252 b-simple-app 0.2 [a-f0-9]{12} simple 253 b-simple-app latest [a-f0-9]{12} simple 254 c-simple-app latest [a-f0-9]{12} simple 255 `) 256 257 // given a new application 258 cmd.Command = dockerCli.Command("app", "build", "--tag", "push-pull", filepath.Join("testdata", "push-pull")) 259 icmd.RunCmd(cmd).Assert(t, icmd.Success) 260 expectImageListOutput(t, cmd, `REPOSITORY TAG APP IMAGE ID APP NAME 261 a-simple-app 0.1 [a-f0-9]{12} simple 262 a-simple-app latest [a-f0-9]{12} simple 263 b-simple-app 0.2 [a-f0-9]{12} simple 264 b-simple-app latest [a-f0-9]{12} simple 265 c-simple-app latest [a-f0-9]{12} simple 266 push-pull latest [a-f0-9]{12} push-pull 267 `) 268 269 // can be tagged to an existing tag 270 dockerAppImageTag("push-pull", "b-simple-app:0.2") 271 icmd.RunCmd(cmd).Assert(t, icmd.Success) 272 expectImageListOutput(t, cmd, `REPOSITORY TAG APP IMAGE ID APP NAME 273 a-simple-app 0.1 [a-f0-9]{12} simple 274 a-simple-app latest [a-f0-9]{12} simple 275 b-simple-app 0.2 [a-f0-9]{12} push-pull 276 b-simple-app latest [a-f0-9]{12} simple 277 c-simple-app latest [a-f0-9]{12} simple 278 push-pull latest [a-f0-9]{12} push-pull 279 `) 280 }) 281 }