Browse code

Treat digest only images as dangling

Add test for dangling digest images

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)

Derek McGowan authored on 2016/07/01 01:24:46
Showing 2 changed files
... ...
@@ -167,7 +167,7 @@ func (daemon *Daemon) Images(filterArgs, filter string, all bool) ([]*types.Imag
167 167
 			} else {
168 168
 				continue
169 169
 			}
170
-		} else if danglingOnly {
170
+		} else if danglingOnly && len(newImage.RepoTags) > 0 {
171 171
 			continue
172 172
 		}
173 173
 
... ...
@@ -314,6 +314,79 @@ func (s *DockerRegistrySuite) TestListImagesWithDigests(c *check.C) {
314 314
 	c.Assert(busyboxRe.MatchString(out), checker.True, check.Commentf("expected %q: %s", busyboxRe.String(), out))
315 315
 }
316 316
 
317
+func (s *DockerRegistrySuite) TestListDanglingImagesWithDigests(c *check.C) {
318
+	// setup image1
319
+	digest1, err := setupImageWithTag(c, "dangle1")
320
+	c.Assert(err, checker.IsNil, check.Commentf("error setting up image"))
321
+	imageReference1 := fmt.Sprintf("%s@%s", repoName, digest1)
322
+	c.Logf("imageReference1 = %s", imageReference1)
323
+
324
+	// pull image1 by digest
325
+	dockerCmd(c, "pull", imageReference1)
326
+
327
+	// list images
328
+	out, _ := dockerCmd(c, "images", "--digests")
329
+
330
+	// make sure repo shown, tag=<none>, digest = $digest1
331
+	re1 := regexp.MustCompile(`\s*` + repoName + `\s*<none>\s*` + digest1.String() + `\s`)
332
+	c.Assert(re1.MatchString(out), checker.True, check.Commentf("expected %q: %s", re1.String(), out))
333
+	// setup image2
334
+	digest2, err := setupImageWithTag(c, "dangle2")
335
+	//error setting up image
336
+	c.Assert(err, checker.IsNil)
337
+	imageReference2 := fmt.Sprintf("%s@%s", repoName, digest2)
338
+	c.Logf("imageReference2 = %s", imageReference2)
339
+
340
+	// pull image1 by digest
341
+	dockerCmd(c, "pull", imageReference1)
342
+
343
+	// pull image2 by digest
344
+	dockerCmd(c, "pull", imageReference2)
345
+
346
+	// list images
347
+	out, _ = dockerCmd(c, "images", "--digests", "--filter=\"dangling=true\"")
348
+
349
+	// make sure repo shown, tag=<none>, digest = $digest1
350
+	c.Assert(re1.MatchString(out), checker.True, check.Commentf("expected %q: %s", re1.String(), out))
351
+
352
+	// make sure repo shown, tag=<none>, digest = $digest2
353
+	re2 := regexp.MustCompile(`\s*` + repoName + `\s*<none>\s*` + digest2.String() + `\s`)
354
+	c.Assert(re2.MatchString(out), checker.True, check.Commentf("expected %q: %s", re2.String(), out))
355
+
356
+	// pull dangle1 tag
357
+	dockerCmd(c, "pull", repoName+":dangle1")
358
+
359
+	// list images
360
+	out, _ = dockerCmd(c, "images", "--digests", "--filter=\"dangling=true\"")
361
+
362
+	// make sure image 1 has repo, tag, <none> AND repo, <none>, digest
363
+	reWithDigest1 := regexp.MustCompile(`\s*` + repoName + `\s*dangle1\s*` + digest1.String() + `\s`)
364
+	c.Assert(reWithDigest1.MatchString(out), checker.False, check.Commentf("unexpected %q: %s", reWithDigest1.String(), out))
365
+	// make sure image 2 has repo, <none>, digest
366
+	c.Assert(re2.MatchString(out), checker.True, check.Commentf("expected %q: %s", re2.String(), out))
367
+
368
+	// pull dangle2 tag
369
+	dockerCmd(c, "pull", repoName+":dangle2")
370
+
371
+	// list images, show tagged images
372
+	out, _ = dockerCmd(c, "images", "--digests")
373
+
374
+	// make sure image 1 has repo, tag, digest
375
+	c.Assert(reWithDigest1.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest1.String(), out))
376
+
377
+	// make sure image 2 has repo, tag, digest
378
+	reWithDigest2 := regexp.MustCompile(`\s*` + repoName + `\s*dangle2\s*` + digest2.String() + `\s`)
379
+	c.Assert(reWithDigest2.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest2.String(), out))
380
+
381
+	// list images, no longer dangling, should not match
382
+	out, _ = dockerCmd(c, "images", "--digests", "--filter=\"dangling=true\"")
383
+
384
+	// make sure image 1 has repo, tag, digest
385
+	c.Assert(reWithDigest1.MatchString(out), checker.False, check.Commentf("unexpected %q: %s", reWithDigest1.String(), out))
386
+	// make sure image 2 has repo, tag, digest
387
+	c.Assert(reWithDigest2.MatchString(out), checker.False, check.Commentf("unexpected %q: %s", reWithDigest2.String(), out))
388
+}
389
+
317 390
 func (s *DockerRegistrySuite) TestInspectImageWithDigests(c *check.C) {
318 391
 	digest, err := setupImage(c)
319 392
 	c.Assert(err, check.IsNil, check.Commentf("error setting up image"))