From 238d2b562efedc71c1e056d66763ab56196af0e1 Mon Sep 17 00:00:00 2001 From: Jacob Kozol Date: Tue, 11 Feb 2020 19:15:46 +0100 Subject: [PATCH] weldr: add filtering to compose route When requesting the compose status, a user may want to filter the list of composes by blueprint name, compose status, and/or compose type. These filters can now be set in the /compose/status route's url as the queries blueprint, status, and type. --- internal/weldr/api.go | 29 +++++++++++++++++++++++++++++ internal/weldr/api_test.go | 3 +++ 2 files changed, 32 insertions(+) diff --git a/internal/weldr/api.go b/internal/weldr/api.go index 6fdbf02ef..c7c8d9f84 100644 --- a/internal/weldr/api.go +++ b/internal/weldr/api.go @@ -1436,6 +1436,35 @@ func (api *API) composeStatusHandler(writer http.ResponseWriter, request *http.R } } composes := api.store.GetAllComposes() + + q, err := url.ParseQuery(request.URL.RawQuery) + if err != nil { + errors := responseError{ + ID: "InvalidChars", + Msg: fmt.Sprintf("invalid query string: %v", err), + } + statusResponseError(writer, http.StatusBadRequest, errors) + return + } + + filterBlueprint := q.Get("blueprint") + filterStatus := q.Get("status") + filterImageType := q.Get("type") + + if filterBlueprint != "" || filterStatus != "" || filterImageType != "" { + for uuid, compose := range composes { + filterImageType, found := common.ImageTypeFromCompatString(filterImageType) + + if filterBlueprint != "" && compose.Blueprint.Name != filterBlueprint { + delete(composes, uuid) + } else if filterStatus != "" && compose.ImageBuilds[0].QueueStatus.ToString() != filterStatus { + delete(composes, uuid) + } else if found && compose.ImageBuilds[0].ImageType != filterImageType { + delete(composes, uuid) + } + } + } + reply.UUIDs = composesToComposeEntries(composes, uuids, isRequestVersionAtLeast(params, 1)) json.NewEncoder(writer).Encode(reply) diff --git a/internal/weldr/api_test.go b/internal/weldr/api_test.go index e01569b80..0ac8fd9e7 100644 --- a/internal/weldr/api_test.go +++ b/internal/weldr/api_test.go @@ -436,6 +436,9 @@ func TestComposeStatus(t *testing.T) { }{ {rpmmd_mock.BaseFixture, "GET", "/api/v0/compose/status/30000000-0000-0000-0000-000000000000,30000000-0000-0000-0000-000000000002", ``, http.StatusOK, `{"uuids":[{"id":"30000000-0000-0000-0000-000000000000","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"WAITING","job_created":1574857140},{"id":"30000000-0000-0000-0000-000000000002","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"FINISHED","job_created":1574857140,"job_started":1574857140,"job_finished":1574857140}]}`}, {rpmmd_mock.BaseFixture, "GET", "/api/v0/compose/status/*", ``, http.StatusOK, `{"uuids":[{"id":"30000000-0000-0000-0000-000000000000","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"WAITING","job_created":1574857140},{"id":"30000000-0000-0000-0000-000000000001","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"RUNNING","job_created":1574857140,"job_started":1574857140},{"id":"30000000-0000-0000-0000-000000000002","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"FINISHED","job_created":1574857140,"job_started":1574857140,"job_finished":1574857140},{"id":"30000000-0000-0000-0000-000000000003","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"FAILED","job_created":1574857140,"job_started":1574857140,"job_finished":1574857140}]}`}, + {rpmmd_mock.BaseFixture, "GET", "/api/v0/compose/status/*?name=test", ``, http.StatusOK, `{"uuids":[{"id":"30000000-0000-0000-0000-000000000000","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"WAITING","job_created":1574857140},{"id":"30000000-0000-0000-0000-000000000001","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"RUNNING","job_created":1574857140,"job_started":1574857140},{"id":"30000000-0000-0000-0000-000000000002","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"FINISHED","job_created":1574857140,"job_started":1574857140,"job_finished":1574857140},{"id":"30000000-0000-0000-0000-000000000003","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"FAILED","job_created":1574857140,"job_started":1574857140,"job_finished":1574857140}]}`}, + {rpmmd_mock.BaseFixture, "GET", "/api/v0/compose/status/*?status=FINISHED", ``, http.StatusOK, `{"uuids":[{"id":"30000000-0000-0000-0000-000000000002","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"FINISHED","job_created":1574857140,"job_started":1574857140,"job_finished":1574857140}]}`}, + {rpmmd_mock.BaseFixture, "GET", "/api/v0/compose/status/*?type=qcow2", ``, http.StatusOK, `{"uuids":[{"id":"30000000-0000-0000-0000-000000000000","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"WAITING","job_created":1574857140},{"id":"30000000-0000-0000-0000-000000000001","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"RUNNING","job_created":1574857140,"job_started":1574857140},{"id":"30000000-0000-0000-0000-000000000002","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"FINISHED","job_created":1574857140,"job_started":1574857140,"job_finished":1574857140},{"id":"30000000-0000-0000-0000-000000000003","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"FAILED","job_created":1574857140,"job_started":1574857140,"job_finished":1574857140}]}`}, {rpmmd_mock.BaseFixture, "GET", "/api/v1/compose/status/30000000-0000-0000-0000-000000000000", ``, http.StatusOK, `{"uuids":[{"id":"30000000-0000-0000-0000-000000000000","blueprint":"test","version":"0.0.0","compose_type":"qcow2","image_size":0,"queue_status":"WAITING","job_created":1574857140,"uploads":[{"uuid":"10000000-0000-0000-0000-000000000000","status":"WAITING","provider_name":"aws","image_name":"awsimage","creation_time":1574857140,"settings":{"region":"frankfurt","accessKeyID":"accesskey","secretAccessKey":"secretkey","bucket":"clay","key":"imagekey"}}]}]}`}, }