Browse Source

c8d/list: Implement `until` filter

It's not originally supported by image list, but we need it for `prune`
needs it, so `list` gets it for free.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Paweł Gronowski 2 years ago
parent
commit
f846349824
2 changed files with 25 additions and 1 deletions
  1. 24 0
      daemon/containerd/image_list.go
  2. 1 1
      daemon/containerd/image_prune.go

+ 24 - 0
daemon/containerd/image_list.go

@@ -4,6 +4,7 @@ import (
 	"context"
 	"encoding/json"
 	"strings"
+	"time"
 
 	"github.com/containerd/containerd"
 	"github.com/containerd/containerd/content"
@@ -14,6 +15,7 @@ import (
 	"github.com/docker/distribution/reference"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/filters"
+	timetypes "github.com/docker/docker/api/types/time"
 	"github.com/moby/buildkit/util/attestation"
 	"github.com/opencontainers/go-digest"
 	"github.com/opencontainers/image-spec/identity"
@@ -29,6 +31,7 @@ var acceptedImageFilterTags = map[string]bool{
 	"before":    true,
 	"since":     true,
 	"reference": true,
+	"until":     true,
 }
 
 // Images returns a filtered list of images.
@@ -304,6 +307,27 @@ func (i *ImageService) setupFilters(ctx context.Context, imageFilters filters.Ar
 		return nil, nil, err
 	}
 
+	err = imageFilters.WalkValues("until", func(value string) error {
+		ts, err := timetypes.GetTimestamp(value, time.Now())
+		if err != nil {
+			return err
+		}
+		seconds, nanoseconds, err := timetypes.ParseTimestamps(ts, 0)
+		if err != nil {
+			return err
+		}
+		until := time.Unix(seconds, nanoseconds)
+
+		fltrs = append(fltrs, func(image images.Image) bool {
+			created := image.CreatedAt
+			return created.Before(until)
+		})
+		return err
+	})
+	if err != nil {
+		return nil, nil, err
+	}
+
 	labelFn, err := setupLabelFilter(i.client.ContentStore(), imageFilters)
 	if err != nil {
 		return nil, nil, err

+ 1 - 1
daemon/containerd/image_prune.go

@@ -19,7 +19,7 @@ var imagesAcceptedFilters = map[string]bool{
 	"dangling": true,
 	"label":    true,
 	"label!":   true,
-	"until":    false,
+	"until":    true,
 }
 
 // errPruneRunning is returned when a prune request is received while