From 347d69b734d6b049a367d4ff0e12a05b2c902259 Mon Sep 17 00:00:00 2001 From: Lars Karlitski Date: Wed, 3 Jun 2020 10:51:39 +0200 Subject: [PATCH] weldr: use compose status for targets as well Workers don't report status for the osbuild run and the upload targets separately. Before the move to the jobqueue, we explicitly set the status of all targets when a compose finished. When I removed that, the image status broke. Set the status from what's returned by api.getComposeStatus() to restore the original behavior. Fixes #702 --- internal/weldr/api.go | 2 +- internal/weldr/api_test.go | 4 ++-- internal/weldr/compose.go | 2 +- internal/weldr/upload.go | 19 +++++++++++++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/internal/weldr/api.go b/internal/weldr/api.go index 8987de517..4517adb74 100644 --- a/internal/weldr/api.go +++ b/internal/weldr/api.go @@ -1967,7 +1967,7 @@ func (api *API) composeInfoHandler(writer http.ResponseWriter, request *http.Req reply.ImageSize = compose.ImageBuild.Size if isRequestVersionAtLeast(params, 1) { - reply.Uploads = targetsToUploadResponses(compose.ImageBuild.Targets) + reply.Uploads = targetsToUploadResponses(compose.ImageBuild.Targets, composeStatus.State) } err = json.NewEncoder(writer).Encode(reply) diff --git a/internal/weldr/api_test.go b/internal/weldr/api_test.go index a31cc5725..835106455 100644 --- a/internal/weldr/api_test.go +++ b/internal/weldr/api_test.go @@ -751,7 +751,7 @@ func TestComposeFinished(t *testing.T) { ExpectedJSON string }{ {rpmmd_mock.BaseFixture, "GET", "/api/v0/compose/finished", ``, http.StatusOK, `{"finished":[{"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/v1/compose/finished", ``, http.StatusOK, `{"finished":[{"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,"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"}}]}]}`}, + {rpmmd_mock.BaseFixture, "GET", "/api/v1/compose/finished", ``, http.StatusOK, `{"finished":[{"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,"uploads":[{"uuid":"10000000-0000-0000-0000-000000000000","status":"FINISHED","provider_name":"aws","image_name":"awsimage","creation_time":1574857140,"settings":{"region":"frankfurt","accessKeyID":"accesskey","secretAccessKey":"secretkey","bucket":"clay","key":"imagekey"}}]}]}`}, {rpmmd_mock.NoComposesFixture, "GET", "/api/v0/compose/finished", ``, http.StatusOK, `{"finished":[]}`}, } @@ -775,7 +775,7 @@ func TestComposeFailed(t *testing.T) { ExpectedJSON string }{ {rpmmd_mock.BaseFixture, "GET", "/api/v0/compose/failed", ``, http.StatusOK, `{"failed":[{"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/failed", ``, http.StatusOK, `{"failed":[{"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,"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"}}]}]}`}, + {rpmmd_mock.BaseFixture, "GET", "/api/v1/compose/failed", ``, http.StatusOK, `{"failed":[{"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,"uploads":[{"uuid":"10000000-0000-0000-0000-000000000000","status":"FAILED","provider_name":"aws","image_name":"awsimage","creation_time":1574857140,"settings":{"region":"frankfurt","accessKeyID":"accesskey","secretAccessKey":"secretkey","bucket":"clay","key":"imagekey"}}]}]}`}, {rpmmd_mock.NoComposesFixture, "GET", "/api/v0/compose/failed", ``, http.StatusOK, `{"failed":[]}`}, } diff --git a/internal/weldr/compose.go b/internal/weldr/compose.go index 58db74bfa..dfc90e714 100644 --- a/internal/weldr/compose.go +++ b/internal/weldr/compose.go @@ -31,7 +31,7 @@ func composeToComposeEntry(id uuid.UUID, compose store.Compose, status *composeS composeEntry.ComposeType = compose.ImageBuild.ImageType.Name() if includeUploads { - composeEntry.Uploads = targetsToUploadResponses(compose.ImageBuild.Targets) + composeEntry.Uploads = targetsToUploadResponses(compose.ImageBuild.Targets, status.State) } switch status.State { diff --git a/internal/weldr/upload.go b/internal/weldr/upload.go index fba7c3aee..0bcb7208e 100644 --- a/internal/weldr/upload.go +++ b/internal/weldr/upload.go @@ -83,16 +83,31 @@ func (u *uploadRequest) UnmarshalJSON(data []byte) error { return err } -func targetsToUploadResponses(targets []*target.Target) []uploadResponse { +// Converts a `Target` to a serializable `uploadResponse`. +// +// This ignore the status in `targets`, because that's never set correctly. +// Instead, it sets each target's status to the ImageBuildState equivalent of +// `state`. +func targetsToUploadResponses(targets []*target.Target, state common.ComposeState) []uploadResponse { var uploads []uploadResponse for _, t := range targets { upload := uploadResponse{ UUID: t.Uuid, - Status: t.Status, ImageName: t.ImageName, CreationTime: float64(t.Created.UnixNano()) / 1000000000, } + switch state { + case common.CWaiting: + upload.Status = common.IBWaiting + case common.CRunning: + upload.Status = common.IBRunning + case common.CFinished: + upload.Status = common.IBFinished + case common.CFailed: + upload.Status = common.IBFailed + } + switch options := t.Options.(type) { case *target.AWSTargetOptions: upload.ProviderName = "aws"