Images tag (#5957)

* Feat: Add pagination for listing repository tags (#683)

* feat: add pagination for listing repository tags

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

* use ParseQueryParameter

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

---------

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

* feat: add tags total count (#695) (#698)

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

---------

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>
This commit is contained in:
Wenhao Zhou
2023-10-26 17:27:26 +08:00
committed by GitHub
parent 5c685102de
commit b4a9ee425b
4 changed files with 15 additions and 1 deletions

View File

@@ -19,6 +19,7 @@ package v1alpha3
import (
"fmt"
"net/http"
"sort"
"strings"
"github.com/emicklei/go-restful/v3"
@@ -251,6 +252,9 @@ func (h *Handler) handleGetRepositoryTags(request *restful.Request, response *re
secretName := request.QueryParameter("secret")
namespace := request.PathParameter("namespace")
repository := request.QueryParameter("repository")
q := query.ParseQueryParameter(request)
var secret *v1.Secret
if len(repository) == 0 {
@@ -272,6 +276,12 @@ func (h *Handler) handleGetRepositoryTags(request *restful.Request, response *re
return
}
if !q.Ascending {
sort.Sort(sort.Reverse(sort.StringSlice(tags.Tags)))
}
startIndex, endIndex := q.Pagination.GetValidPagination(len(tags.Tags))
tags.Tags = tags.Tags[startIndex:endIndex]
response.WriteHeaderAndJson(http.StatusOK, tags, restful.MIME_JSON)
}

View File

@@ -141,7 +141,9 @@ func AddToContainer(c *restful.Container, informerFactory informers.InformerFact
Param(webservice.PathParameter("namespace", "Namespace of the image repository secret.").Required(true)).
Param(webservice.QueryParameter("repository", "Repository to query, e.g. calico/cni.").Required(true)).
Param(webservice.QueryParameter("secret", "Secret name of the image repository credential, left empty means anonymous fetch.").Required(false)).
Metadata(restfulspec.KeyOpenAPITags, []string{tagNamespacedResource}).
Param(webservice.QueryParameter(query.ParameterPage, "page").Required(false).DataFormat("page=%d").DefaultValue("page=1")).
Param(webservice.QueryParameter(query.ParameterLimit, "limit").Required(false)).
Param(webservice.QueryParameter(query.ParameterAscending, "sort parameters, e.g. reverse=true").Required(false).DefaultValue("ascending=false")).
Doc("List repository tags, this is an experimental API, use it by your own caution.").
Returns(http.StatusOK, ok, v2.RepositoryTags{}))

View File

@@ -52,6 +52,7 @@ func (r *registryer) ListRepositoryTags(src string) (RepositoryTags, error) {
Registry: repo.RegistryStr(),
Repository: repo.RepositoryStr(),
Tags: tags,
Total: len(tags),
}, nil
}

View File

@@ -42,6 +42,7 @@ type RepositoryTags struct {
Registry string `json:"registry"`
Repository string `json:"repository"`
Tags []string `json:"tags"`
Total int `json:"total"`
}
// ImageConfig wraps v1.ConfigFile to avoid direct dependency