@@ -20,6 +20,7 @@ import (
2020 "gopkg.in/resty.v1"
2121
2222 "zotregistry.dev/zot/pkg/api/config"
23+ "zotregistry.dev/zot/pkg/compat"
2324 "zotregistry.dev/zot/pkg/extensions/monitoring"
2425 zlog "zotregistry.dev/zot/pkg/log"
2526 "zotregistry.dev/zot/pkg/meta"
@@ -71,6 +72,7 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
7172 var imgStore storageTypes.ImageStore
7273
7374 var metaDB mTypes.MetaDB
75+ compat := []compat.MediaCompatibility {compat .DockerManifestV2SchemaV2 }
7476
7577 if testcase .storageType == storageConstants .S3StorageDriverName {
7678 tskip .SkipDynamo (t )
@@ -140,13 +142,13 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
140142 panic (err )
141143 }
142144
143- imgStore = s3 .NewImageStore (rootDir , cacheDir , true , false , log , metrics , nil , store , nil , nil , nil )
145+ imgStore = s3 .NewImageStore (rootDir , cacheDir , true , false , log , metrics , nil , store , nil , compat , nil )
144146 } else {
145147 // Create temporary directory
146148 rootDir := t .TempDir ()
147149
148150 // Create ImageStore
149- imgStore = local .NewImageStore (rootDir , false , false , log , metrics , nil , nil , nil , nil )
151+ imgStore = local .NewImageStore (rootDir , false , false , log , metrics , nil , nil , compat , nil )
150152
151153 // init metaDB
152154 params := boltdb.DBParameters {
@@ -243,6 +245,15 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
243245 err = WriteMultiArchImageToFileSystem (gcUntagged4 , "gc-test4" , gcUntagged4 .DigestStr (), storeController )
244246 So (err , ShouldBeNil )
245247
248+ // docker images
249+ gcDocker1 := CreateRandomImage ().AsDockerImage ()
250+ err = WriteImageToFileSystem (gcDocker1 , "gc-docker1" , "0.0.1" , storeController )
251+ So (err , ShouldBeNil )
252+
253+ gcDocker2 := CreateRandomMultiarch ().AsDockerImage ()
254+ err = WriteMultiArchImageToFileSystem (gcDocker2 , "gc-docker2" , "0.0.1" , storeController )
255+ So (err , ShouldBeNil )
256+
246257 // for image retention testing
247258 // old images
248259 gcOld1 := CreateRandomImage ()
@@ -361,6 +372,12 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
361372 err = gc .CleanRepo (ctx , "gc-test4" )
362373 So (err , ShouldBeNil )
363374
375+ err = gc .CleanRepo (ctx , "gc-docker1" )
376+ So (err , ShouldBeNil )
377+
378+ err = gc .CleanRepo (ctx , "gc-docker2" )
379+ So (err , ShouldBeNil )
380+
364381 err = gc .CleanRepo (ctx , "retention" )
365382 So (err , ShouldBeNil )
366383
@@ -412,6 +429,12 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
412429 _ , _ , _ , err = imgStore .GetImageManifest ("gc-test4" , refOfRef4 .DigestStr ())
413430 So (err , ShouldBeNil )
414431
432+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker1" , gcDocker1 .DigestStr ())
433+ So (err , ShouldBeNil )
434+
435+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker2" , gcDocker2 .DigestStr ())
436+ So (err , ShouldBeNil )
437+
415438 _ , _ , _ , err = imgStore .GetImageManifest ("retention" , "0.0.1" )
416439 So (err , ShouldBeNil )
417440
@@ -465,6 +488,12 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
465488 err = gc .CleanRepo (ctx , "gc-test4" )
466489 So (err , ShouldBeNil )
467490
491+ err = gc .CleanRepo (ctx , "gc-docker1" )
492+ So (err , ShouldBeNil )
493+
494+ err = gc .CleanRepo (ctx , "gc-docker2" )
495+ So (err , ShouldBeNil )
496+
468497 err = gc .CleanRepo (ctx , "retention" )
469498 So (err , ShouldBeNil )
470499
@@ -515,6 +544,12 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
515544
516545 _ , _ , _ , err = imgStore .GetImageManifest ("gc-test4" , refOfRef4 .DigestStr ())
517546 So (err , ShouldBeNil )
547+
548+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker1" , gcDocker1 .DigestStr ())
549+ So (err , ShouldBeNil )
550+
551+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker2" , gcDocker2 .DigestStr ())
552+ So (err , ShouldBeNil )
518553 })
519554
520555 Convey ("gc all tags, untagged, and afterwards referrers" , func () {
@@ -560,6 +595,50 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
560595 So (repos , ShouldContain , "gc-test2" )
561596 So (repos , ShouldContain , "gc-test3" )
562597 So (repos , ShouldContain , "gc-test4" )
598+ So (repos , ShouldContain , "gc-docker1" )
599+ So (repos , ShouldContain , "gc-docker2" )
600+ So (repos , ShouldContain , "retention" )
601+ })
602+
603+ Convey ("gc all tags for docker repo" , func () {
604+ gc := gc .NewGarbageCollect (imgStore , metaDB , gc.Options {
605+ Delay : 1 * time .Millisecond ,
606+ ImageRetention : config.ImageRetention {
607+ Delay : 1 * time .Millisecond ,
608+ Policies : []config.RetentionPolicy {
609+ {
610+ Repositories : []string {"gc-docker*" },
611+ DeleteReferrers : true ,
612+ DeleteUntagged : & trueVal ,
613+ KeepTags : []config.KeepTagsPolicy {
614+ {
615+ Patterns : []string {"v1" }, // should not match any tag
616+ },
617+ },
618+ },
619+ },
620+ },
621+ }, audit , log )
622+
623+ err := gc .CleanRepo (ctx , "gc-docker1" )
624+ So (err , ShouldBeNil )
625+ err = gc .CleanRepo (ctx , "gc-docker2" )
626+ So (err , ShouldBeNil )
627+
628+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker1" , gcDocker1 .DigestStr ())
629+ So (err , ShouldNotBeNil )
630+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker2" , gcDocker2 .DigestStr ())
631+ So (err , ShouldNotBeNil )
632+
633+ // now repo should get gc'ed
634+ repos , err := imgStore .GetRepositories ()
635+ So (err , ShouldBeNil )
636+ So (repos , ShouldContain , "gc-test1" )
637+ So (repos , ShouldContain , "gc-test2" )
638+ So (repos , ShouldContain , "gc-test3" )
639+ So (repos , ShouldContain , "gc-test4" )
640+ So (repos , ShouldNotContain , "gc-docker1" )
641+ So (repos , ShouldNotContain , "gc-docker2" )
563642 So (repos , ShouldContain , "retention" )
564643 })
565644
@@ -584,17 +663,17 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
584663 }, audit , log )
585664
586665 processedRepos := make (map [string ]struct {})
587- expectedRepos := []string {"gc-test1" , "gc-test2" , "gc-test3" , "gc-test4" , "retention" }
666+ expectedRepos := []string {"gc-docker1" , "gc-docker2" , "gc- test1" , "gc-test2" , "gc-test3" , "gc-test4" , "retention" }
588667
589- for i := range 10 {
668+ for i := range 2 * len ( expectedRepos ) {
590669 t .Logf ("index %d, processed repos %v" , i , processedRepos )
591670
592671 // we need to check if GetNextRepository returns each repository just once, and empty string afterwards
593672 repo , err := imgStore .GetNextRepository (processedRepos )
594673 t .Logf ("index %d, repo '%s'" , i , repo )
595674 So (err , ShouldBeNil )
596675
597- if i >= 5 {
676+ if i >= len ( expectedRepos ) {
598677 So (repo , ShouldEqual , "" )
599678
600679 continue
@@ -627,6 +706,8 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
627706 So (repos , ShouldContain , "gc-test2" )
628707 So (repos , ShouldNotContain , "gc-test3" )
629708 So (repos , ShouldContain , "gc-test4" )
709+ So (repos , ShouldContain , "gc-docker1" )
710+ So (repos , ShouldContain , "gc-docker2" )
630711 So (repos , ShouldContain , "retention" )
631712 })
632713
@@ -670,6 +751,8 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
670751 So (repos , ShouldContain , "gc-test2" )
671752 So (repos , ShouldContain , "gc-test3" )
672753 So (repos , ShouldContain , "gc-test4" )
754+ So (repos , ShouldContain , "gc-docker1" )
755+ So (repos , ShouldContain , "gc-docker2" )
673756 So (repos , ShouldContain , "retention" )
674757
675758 tags , err := imgStore .GetImageTags ("gc-test1" )
@@ -713,6 +796,12 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
713796 _ , _ , _ , err = imgStore .GetImageManifest ("gc-test3" , "0.0.1" )
714797 So (err , ShouldBeNil )
715798
799+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker1" , "0.0.1" )
800+ So (err , ShouldBeNil )
801+
802+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker2" , "0.0.1" )
803+ So (err , ShouldBeNil )
804+
716805 _ , _ , _ , err = imgStore .GetImageManifest ("retention" , "0.0.1" )
717806 So (err , ShouldBeNil )
718807
@@ -768,6 +857,12 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
768857 _ , _ , _ , err = imgStore .GetImageManifest ("gc-test3" , "0.0.1" )
769858 So (err , ShouldBeNil )
770859
860+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker1" , "0.0.1" )
861+ So (err , ShouldBeNil )
862+
863+ _ , _ , _ , err = imgStore .GetImageManifest ("gc-docker2" , "0.0.1" )
864+ So (err , ShouldBeNil )
865+
771866 _ , _ , _ , err = imgStore .GetImageManifest ("retention" , "0.0.1" )
772867 So (err , ShouldBeNil )
773868
@@ -1026,6 +1121,8 @@ func TestGarbageCollectAndRetentionMetaDB(t *testing.T) {
10261121 So (repos , ShouldContain , "gc-test1" )
10271122 So (repos , ShouldContain , "gc-test2" )
10281123 So (repos , ShouldContain , "gc-test3" )
1124+ So (repos , ShouldContain , "gc-docker1" )
1125+ So (repos , ShouldContain , "gc-docker2" )
10291126 So (repos , ShouldContain , "retention" )
10301127 })
10311128
0 commit comments