From a724fce8aa17213d5392aa979c67fd2fc274fc82 Mon Sep 17 00:00:00 2001 From: Celso Henrique Souza Silva Date: Tue, 30 Sep 2025 18:44:04 -0300 Subject: [PATCH] pkg/api: api list quadlets resource Signed-off-by: Celso Henrique Souza Silva --- pkg/api/handlers/libpod/quadlets.go | 37 +++++++++++++++++++++++++++ pkg/api/handlers/swagger/responses.go | 7 +++++ pkg/api/server/register_quadlets.go | 36 ++++++++++++++++++++++++++ pkg/api/server/server.go | 1 + test/apiv2/36-quadlets.at | 15 +++++++++++ 5 files changed, 96 insertions(+) create mode 100644 pkg/api/handlers/libpod/quadlets.go create mode 100644 pkg/api/server/register_quadlets.go create mode 100644 test/apiv2/36-quadlets.at diff --git a/pkg/api/handlers/libpod/quadlets.go b/pkg/api/handlers/libpod/quadlets.go new file mode 100644 index 0000000000..861e26e297 --- /dev/null +++ b/pkg/api/handlers/libpod/quadlets.go @@ -0,0 +1,37 @@ +//go:build !remote + +package libpod + +import ( + "fmt" + "net/http" + + "github.com/containers/podman/v5/libpod" + "github.com/containers/podman/v5/pkg/api/handlers/utils" + api "github.com/containers/podman/v5/pkg/api/types" + "github.com/containers/podman/v5/pkg/domain/entities" + "github.com/containers/podman/v5/pkg/domain/infra/abi" + "github.com/containers/podman/v5/pkg/util" +) + +func ListQuadlets(w http.ResponseWriter, r *http.Request) { + runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) + filterMap, err := util.FiltersFromRequest(r) + if err != nil { + utils.Error( + w, http.StatusInternalServerError, + fmt.Errorf("failed to parse parameters for %s: %w", r.URL.String(), err), + ) + return + } + + containerEngine := abi.ContainerEngine{Libpod: runtime} + + quadlets, err := containerEngine.QuadletList(r.Context(), entities.QuadletListOptions{Filters: filterMap}) + if err != nil { + utils.InternalServerError(w, err) + return + } + + utils.WriteResponse(w, http.StatusOK, quadlets) +} diff --git a/pkg/api/handlers/swagger/responses.go b/pkg/api/handlers/swagger/responses.go index 7b349f26ad..5ec60bc2dd 100644 --- a/pkg/api/handlers/swagger/responses.go +++ b/pkg/api/handlers/swagger/responses.go @@ -520,3 +520,10 @@ type artifactPushResponse struct { // in:body Body entities.ArtifactPushReport } + +// Quadlet list +// swagger:response +type quadletListResponse struct { + // in:body + Body []entities.ListQuadlet +} diff --git a/pkg/api/server/register_quadlets.go b/pkg/api/server/register_quadlets.go new file mode 100644 index 0000000000..d923fe3544 --- /dev/null +++ b/pkg/api/server/register_quadlets.go @@ -0,0 +1,36 @@ +//go:build !remote + +package server + +import ( + "net/http" + + "github.com/containers/podman/v5/pkg/api/handlers/libpod" + "github.com/gorilla/mux" +) + +func (s *APIServer) registerQuadletHandlers(r *mux.Router) error { + // swagger:operation GET /libpod/quadlets/json libpod QuadletListLibpod + // --- + // tags: + // - quadlets + // summary: List quadlets + // description: Return a list of all quadlets. + // produces: + // - application/json + // parameters: + // - in: query + // name: filters + // type: string + // description: | + // JSON encoded value of the filters (a map[string][]string). + // Supported filters: + // - name= Filter by quadlet name + // responses: + // 200: + // $ref: "#/responses/quadletListResponse" + // 500: + // $ref: "#/responses/internalError" + r.HandleFunc(VersionedPath("/libpod/quadlets/json"), s.APIHandler(libpod.ListQuadlets)).Methods(http.MethodGet) + return nil +} diff --git a/pkg/api/server/server.go b/pkg/api/server/server.go index 8d6bc0b7af..deac77d29e 100644 --- a/pkg/api/server/server.go +++ b/pkg/api/server/server.go @@ -128,6 +128,7 @@ func newServer(runtime *libpod.Runtime, listener net.Listener, opts entities.Ser server.registerKubeHandlers, server.registerPluginsHandlers, server.registerPodsHandlers, + server.registerQuadletHandlers, server.registerSecretHandlers, server.registerSwaggerHandlers, server.registerSwarmHandlers, diff --git a/test/apiv2/36-quadlets.at b/test/apiv2/36-quadlets.at new file mode 100644 index 0000000000..0355975ea7 --- /dev/null +++ b/test/apiv2/36-quadlets.at @@ -0,0 +1,15 @@ +# -*- sh -*- +# +# quadlet-related tests +# + +# NOTE: Once podman-remote quadlet support is added we can enable the podman quadlet tests in +# test/system/253-podman-quadlet.bats which should cover it in more detail then. + +## list volume +t GET libpod/quadlets/json 200 + +# Example with filter applied (uncomment once needed) +# t GET libpod/quadlets/json?filters='{"name":["name.*"]}' 200 + +# vim: filetype=sh