소스 검색

Merge pull request #45269 from vvoland/c8d-reference-filter

c8d/list: Implement `reference`
Sebastiaan van Stijn 2 년 전
부모
커밋
79bf167c0d
1개의 변경된 파일22개의 추가작업 그리고 8개의 파일을 삭제
  1. 22 8
      daemon/containerd/image_list.go

+ 22 - 8
daemon/containerd/image_list.go

@@ -25,7 +25,7 @@ var acceptedImageFilterTags = map[string]bool{
 	"label":     true,
 	"label":     true,
 	"before":    true,
 	"before":    true,
 	"since":     true,
 	"since":     true,
-	"reference": false, // TODO(thaJeztah): implement "reference" filter: see https://github.com/moby/moby/issues/43847
+	"reference": true,
 }
 }
 
 
 // Images returns a filtered list of images.
 // Images returns a filtered list of images.
@@ -40,12 +40,12 @@ func (i *ImageService) Images(ctx context.Context, opts types.ImageListOptions)
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	filter, err := i.setupFilters(ctx, opts.Filters)
+	listFilters, filter, err := i.setupFilters(ctx, opts.Filters)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	imgs, err := i.client.ImageService().List(ctx)
+	imgs, err := i.client.ImageService().List(ctx, listFilters...)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
@@ -257,7 +257,7 @@ type imageFilterFunc func(image images.Image) bool
 // setupFilters constructs an imageFilterFunc from the given imageFilters.
 // setupFilters constructs an imageFilterFunc from the given imageFilters.
 //
 //
 // TODO(thaJeztah): reimplement filters using containerd filters: see https://github.com/moby/moby/issues/43845
 // TODO(thaJeztah): reimplement filters using containerd filters: see https://github.com/moby/moby/issues/43845
-func (i *ImageService) setupFilters(ctx context.Context, imageFilters filters.Args) (imageFilterFunc, error) {
+func (i *ImageService) setupFilters(ctx context.Context, imageFilters filters.Args) ([]string, imageFilterFunc, error) {
 	var fltrs []imageFilterFunc
 	var fltrs []imageFilterFunc
 	err := imageFilters.WalkValues("before", func(value string) error {
 	err := imageFilters.WalkValues("before", func(value string) error {
 		ref, err := reference.ParseDockerRef(value)
 		ref, err := reference.ParseDockerRef(value)
@@ -275,7 +275,7 @@ func (i *ImageService) setupFilters(ctx context.Context, imageFilters filters.Ar
 		return err
 		return err
 	})
 	})
 	if err != nil {
 	if err != nil {
-		return nil, err
+		return nil, nil, err
 	}
 	}
 
 
 	err = imageFilters.WalkValues("since", func(value string) error {
 	err = imageFilters.WalkValues("since", func(value string) error {
@@ -294,7 +294,7 @@ func (i *ImageService) setupFilters(ctx context.Context, imageFilters filters.Ar
 		return err
 		return err
 	})
 	})
 	if err != nil {
 	if err != nil {
-		return nil, err
+		return nil, nil, err
 	}
 	}
 
 
 	if imageFilters.Contains("label") {
 	if imageFilters.Contains("label") {
@@ -306,14 +306,28 @@ func (i *ImageService) setupFilters(ctx context.Context, imageFilters filters.Ar
 	if imageFilters.Contains("dangling") {
 	if imageFilters.Contains("dangling") {
 		danglingValue, err := imageFilters.GetBoolOrDefault("dangling", false)
 		danglingValue, err := imageFilters.GetBoolOrDefault("dangling", false)
 		if err != nil {
 		if err != nil {
-			return nil, err
+			return nil, nil, err
 		}
 		}
 		fltrs = append(fltrs, func(image images.Image) bool {
 		fltrs = append(fltrs, func(image images.Image) bool {
 			return danglingValue == isDanglingImage(image)
 			return danglingValue == isDanglingImage(image)
 		})
 		})
 	}
 	}
 
 
-	return func(image images.Image) bool {
+	var listFilters []string
+	err = imageFilters.WalkValues("reference", func(value string) error {
+		ref, err := reference.ParseNormalizedNamed(value)
+		if err != nil {
+			return err
+		}
+		ref = reference.TagNameOnly(ref)
+		listFilters = append(listFilters, "name=="+ref.String())
+		return nil
+	})
+	if err != nil {
+		return nil, nil, err
+	}
+
+	return listFilters, func(image images.Image) bool {
 		for _, filter := range fltrs {
 		for _, filter := range fltrs {
 			if !filter(image) {
 			if !filter(image) {
 				return false
 				return false