From 7bfcac30dda7ab9f1652618a2ae2a871e3580404 Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Wed, 22 Jan 2025 19:23:09 +0100 Subject: [PATCH] cloudapi: support worker server target artifact retrieval In order to get the artifact location from the cloudapi, add a helper function in the worker server. --- internal/cloudapi/v2/handler.go | 16 ++- internal/cloudapi/v2/imagerequest.go | 10 +- internal/cloudapi/v2/openapi.v2.gen.go | 165 ++++++++++++------------ internal/cloudapi/v2/openapi.v2.yml | 8 ++ internal/target/targetresult.go | 2 + internal/target/worker_server_target.go | 10 +- internal/worker/server.go | 21 +++ internal/worker/server_test.go | 10 +- 8 files changed, 147 insertions(+), 95 deletions(-) diff --git a/internal/cloudapi/v2/handler.go b/internal/cloudapi/v2/handler.go index 06502fa81..03789c1c2 100644 --- a/internal/cloudapi/v2/handler.go +++ b/internal/cloudapi/v2/handler.go @@ -246,7 +246,7 @@ func imageTypeFromApiImageType(it ImageTypes, arch distro.Arch) string { return "" } -func targetResultToUploadStatus(t *target.TargetResult) (*UploadStatus, error) { +func (h *apiHandlers) targetResultToUploadStatus(jobId uuid.UUID, t *target.TargetResult) (*UploadStatus, error) { var us *UploadStatus var uploadType UploadTypes var uploadOptions interface{} @@ -299,6 +299,14 @@ func targetResultToUploadStatus(t *target.TargetResult) (*UploadStatus, error) { } case target.TargetNameWorkerServer: uploadType = UploadTypesLocal + workerServerOptions := t.Options.(*target.WorkerServerTargetResultOptions) + absPath, err := h.server.workers.JobArtifactLocation(jobId, workerServerOptions.ArtifactRelPath) + if err != nil { + return nil, fmt.Errorf("unable to find job artefact: %w", err) + } + uploadOptions = LocalUploadStatus{ + ArtifactPath: absPath, + } default: return nil, fmt.Errorf("unknown upload target: %s", t.Name) } @@ -347,7 +355,7 @@ func (h *apiHandlers) getComposeStatusImpl(ctx echo.Context, id string) error { statuses := make([]UploadStatus, len(result.TargetResults)) for idx := range result.TargetResults { tr := result.TargetResults[idx] - us, err := targetResultToUploadStatus(tr) + us, err := h.targetResultToUploadStatus(jobId, tr) if err != nil { return HTTPError(ErrorUnknownUploadTarget) } @@ -412,7 +420,7 @@ func (h *apiHandlers) getComposeStatusImpl(ctx echo.Context, id string) error { for idx := range buildJobResult.TargetResults { tr := buildJobResult.TargetResults[idx] if tr.Name != target.TargetNameKoji { - us, err := targetResultToUploadStatus(tr) + us, err := h.targetResultToUploadStatus(jobId, tr) if err != nil { return HTTPError(ErrorUnknownUploadTarget) } @@ -1173,7 +1181,7 @@ func (h *apiHandlers) postCloneComposeImpl(ctx echo.Context, id string) error { return HTTPError(ErrorSeveralUploadTargets) } var us *UploadStatus - us, err = targetResultToUploadStatus(osbuildResult.TargetResults[0]) + us, err = h.targetResultToUploadStatus(jobId, osbuildResult.TargetResults[0]) if err != nil { return HTTPError(ErrorUnknownUploadTarget) } diff --git a/internal/cloudapi/v2/imagerequest.go b/internal/cloudapi/v2/imagerequest.go index 2cfcc27ef..82bfe4de8 100644 --- a/internal/cloudapi/v2/imagerequest.go +++ b/internal/cloudapi/v2/imagerequest.go @@ -76,7 +76,6 @@ func newAWSTarget(options UploadOptions, imageType distro.ImageType) (*target.Ta } else { t.ImageName = key } - t.OsbuildArtifact.ExportFilename = imageType.Filename() return t, nil } @@ -103,7 +102,6 @@ func newAWSS3Target(options UploadOptions, imageType distro.ImageType) (*target. Public: public, }) t.ImageName = key - t.OsbuildArtifact.ExportFilename = imageType.Filename() return t, nil } @@ -129,8 +127,6 @@ func newContainerTarget(options UploadOptions, request *ComposeRequest, imageTyp t := target.NewContainerTarget(&target.ContainerTargetOptions{}) t.ImageName = fmt.Sprintf("%s:%s", name, tag) - t.OsbuildArtifact.ExportFilename = imageType.Filename() - return t, nil } @@ -171,7 +167,6 @@ func newGCPTarget(options UploadOptions, imageType distro.ImageType) (*target.Ta } else { t.ImageName = imageName } - t.OsbuildArtifact.ExportFilename = imageType.Filename() return t, nil } @@ -210,7 +205,6 @@ func newAzureTarget(options UploadOptions, imageType distro.ImageType) (*target. // if ImageName wasn't given, generate a random one t.ImageName = fmt.Sprintf("composer-api-%s", uuid.New().String()) } - t.OsbuildArtifact.ExportFilename = imageType.Filename() return t, nil } @@ -228,7 +222,6 @@ func newOCITarget(options UploadOptions, imageType distro.ImageType) (*target.Ta key := fmt.Sprintf("composer-api-%s", uuid.New().String()) t := target.NewOCIObjectStorageTarget(&target.OCIObjectStorageTargetOptions{}) t.ImageName = key - t.OsbuildArtifact.ExportFilename = imageType.Filename() return t, nil } @@ -257,7 +250,6 @@ func newPulpOSTreeTarget(options UploadOptions, imageType distro.ImageType) (*ta }) t.ImageName = fmt.Sprintf("composer-api-%s", uuid.New().String()) - t.OsbuildArtifact.ExportFilename = imageType.Filename() return t, nil } @@ -464,12 +456,14 @@ func getTarget(targetType UploadTypes, options UploadOptions, request *ComposeRe case UploadTypesLocal: irTarget = target.NewWorkerServerTarget() + irTarget.ImageName = imageType.Filename() default: return nil, HTTPError(ErrorInvalidUploadTarget) } if err != nil { return nil, err } + irTarget.OsbuildArtifact.ExportFilename = imageType.Filename() irTarget.OsbuildArtifact.ExportName = imageType.Exports()[0] return irTarget, nil diff --git a/internal/cloudapi/v2/openapi.v2.gen.go b/internal/cloudapi/v2/openapi.v2.gen.go index 7103130f4..18e988b9e 100644 --- a/internal/cloudapi/v2/openapi.v2.gen.go +++ b/internal/cloudapi/v2/openapi.v2.gen.go @@ -968,6 +968,11 @@ type LocalUploadOptions struct { LocalSave bool `json:"local_save"` } +// LocalUploadStatus defines model for LocalUploadStatus. +type LocalUploadStatus struct { + ArtifactPath string `json:"artifact_path"` +} + // Locale configuration type Locale struct { // Sets the keyboard layout @@ -1663,86 +1668,86 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/cloudapi/v2/openapi.v2.yml b/internal/cloudapi/v2/openapi.v2.yml index 34ba000e7..dcb6bff1a 100644 --- a/internal/cloudapi/v2/openapi.v2.yml +++ b/internal/cloudapi/v2/openapi.v2.yml @@ -747,6 +747,7 @@ components: - $ref: '#/components/schemas/ContainerUploadStatus' - $ref: '#/components/schemas/OCIUploadStatus' - $ref: '#/components/schemas/PulpOSTreeUploadStatus' + - $ref: '#/components/schemas/LocalUploadStatus' UploadStatusValue: type: string enum: ['success', 'failure', 'pending', 'running'] @@ -836,6 +837,13 @@ components: properties: repo_url: type: string + LocalUploadStatus: + type: object + required: + - artifact_path + properties: + artifact_path: + type: string ComposeMetadata: allOf: - $ref: '#/components/schemas/ObjectReference' diff --git a/internal/target/targetresult.go b/internal/target/targetresult.go index 52759ce87..f8801ea35 100644 --- a/internal/target/targetresult.go +++ b/internal/target/targetresult.go @@ -78,6 +78,8 @@ func UnmarshalTargetResultOptions(trName TargetName, rawOptions json.RawMessage) options = new(ContainerTargetResultOptions) case TargetNamePulpOSTree: options = new(PulpOSTreeTargetResultOptions) + case TargetNameWorkerServer: + options = new(WorkerServerTargetResultOptions) default: return nil, fmt.Errorf("unexpected target result name: %s", trName) } diff --git a/internal/target/worker_server_target.go b/internal/target/worker_server_target.go index e25c5c48e..e4dbf0cf8 100644 --- a/internal/target/worker_server_target.go +++ b/internal/target/worker_server_target.go @@ -10,6 +10,12 @@ func NewWorkerServerTarget() *Target { return newTarget(TargetNameWorkerServer, &WorkerServerTargetOptions{}) } -func NewWorkerServerTargetResult(artifact *OsbuildArtifact) *TargetResult { - return newTargetResult(TargetNameWorkerServer, nil, artifact) +type WorkerServerTargetResultOptions struct { + ArtifactRelPath string `json:"artifact_relative_path"` +} + +func (WorkerServerTargetResultOptions) isTargetResultOptions() {} + +func NewWorkerServerTargetResult(options *WorkerServerTargetResultOptions, artifact *OsbuildArtifact) *TargetResult { + return newTargetResult(TargetNameWorkerServer, options, artifact) } diff --git a/internal/worker/server.go b/internal/worker/server.go index a5e2c8d5e..c8b47c652 100644 --- a/internal/worker/server.go +++ b/internal/worker/server.go @@ -610,6 +610,27 @@ func (s *Server) JobArtifact(id uuid.UUID, name string) (io.Reader, int64, error return f, info.Size(), nil } +func (s *Server) JobArtifactLocation(id uuid.UUID, name string) (string, error) { + if s.config.ArtifactsDir == "" { + return "", errors.New("Artifacts not enabled") + } + + jobInfo, err := s.jobInfo(id, nil) + if err != nil { + return "", err + } + + if jobInfo.JobStatus.Finished.IsZero() { + return "", fmt.Errorf("Cannot access artifacts before job is finished: %s", id) + } + + p := path.Join(s.config.ArtifactsDir, id.String(), name) + if _, err := os.Stat(p); errors.Is(err, os.ErrNotExist) { + return "", fmt.Errorf("Artifact not found: %s", p) + } + return p, nil +} + // Deletes all artifacts for job `id`. func (s *Server) DeleteArtifacts(id uuid.UUID) error { if s.config.ArtifactsDir == "" { diff --git a/internal/worker/server_test.go b/internal/worker/server_test.go index 38d8c3419..20a5b1026 100644 --- a/internal/worker/server_test.go +++ b/internal/worker/server_test.go @@ -314,7 +314,8 @@ func TestUpload(t *testing.T) { if err != nil { t.Fatalf("error creating osbuild manifest: %v", err) } - server := newTestServer(t, t.TempDir(), defaultConfig, true) + storeDir := t.TempDir() + server := newTestServer(t, storeDir, defaultConfig, true) mf, err := manifest.Serialize(nil, nil, nil, nil) if err != nil { t.Fatalf("error creating osbuild manifest: %v", err) @@ -334,6 +335,13 @@ func TestUpload(t *testing.T) { test.TestRoute(t, handler, false, "PUT", fmt.Sprintf("/api/worker/v1/jobs/%s/artifacts/foobar", token), `this is my artifact`, http.StatusOK, `?`) require.Equal(t, float64(0), promtest.ToFloat64(prometheus.PendingJobs)) require.Equal(t, float64(1), promtest.ToFloat64(prometheus.RunningJobs)) + + err = server.FinishJob(token, []byte("{}")) + require.NoError(t, err) + + path, err := server.JobArtifactLocation(jobID, "foobar") + require.NoError(t, err) + require.Equal(t, fmt.Sprintf("%s/artifacts/%s/foobar", storeDir, jobID), path) } func TestUploadNotAcceptingArtifacts(t *testing.T) {