From a12827865d237915f6a3d82d7a04a08346d22d64 Mon Sep 17 00:00:00 2001 From: Tomas Hozza Date: Wed, 29 Jun 2022 15:44:29 +0200 Subject: [PATCH] target: add explicit target for uploading back to worker server The uploading of artifacts back to the worker server for the on-premise (Weldr) use case was signaled to the worker by setting the `ImageName` in the `OSBuildJob` definition. The code also relies on the osbuild exports being specified in the `OSBuildJob`, instead of in the target (this is not implemented yet). Prepare the ground for moving osbuild export definition from `OSBuildJob` to `Target` by introducing an explicit `Worker Server" upload target. This target will signal to the worker that it should upload the image back to the worker server. The new target is not yet used by any API implementation. Extend the worker osbuild job implementation to handle the new upload target. --- cmd/osbuild-worker/jobimpl-osbuild.go | 16 ++++++++++++++++ internal/target/target.go | 8 ++++++++ internal/target/worker_server_target.go | 15 +++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 internal/target/worker_server_target.go diff --git a/cmd/osbuild-worker/jobimpl-osbuild.go b/cmd/osbuild-worker/jobimpl-osbuild.go index be048edee..9c6f06f1d 100644 --- a/cmd/osbuild-worker/jobimpl-osbuild.go +++ b/cmd/osbuild-worker/jobimpl-osbuild.go @@ -362,6 +362,22 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { for _, jobTarget := range jobArgs.Targets { var targetResult *target.TargetResult switch targetOptions := jobTarget.Options.(type) { + case *target.WorkerServerTargetOptions: + targetResult = target.NewWorkerServerTargetResult() + var f *os.File + imagePath := path.Join(outputDirectory, exportPath, jobTarget.OsbuildArtifact.ExportFilename) + f, err = os.Open(imagePath) + if err != nil { + targetResult.TargetError = clienterrors.WorkerClientError(clienterrors.ErrorInvalidTargetConfig, err.Error()) + break + } + defer f.Close() + err = job.UploadArtifact(jobTarget.ImageName, f) + if err != nil { + targetResult.TargetError = clienterrors.WorkerClientError(clienterrors.ErrorUploadingImage, err.Error()) + break + } + case *target.VMWareTargetOptions: targetResult = target.NewVMWareTargetResult() credentials := vmware.Credentials{ diff --git a/internal/target/target.go b/internal/target/target.go index e9bf1ed13..b93310fb0 100644 --- a/internal/target/target.go +++ b/internal/target/target.go @@ -87,6 +87,8 @@ func (target *Target) UnmarshalJSON(data []byte) error { options = new(OCITargetOptions) case TargetNameContainer: options = new(ContainerTargetOptions) + case TargetNameWorkerServer: + options = new(WorkerServerTargetOptions) default: return fmt.Errorf("unexpected target name: %s", rawTarget.Name) } @@ -254,6 +256,12 @@ func (target Target) MarshalJSON() ([]byte, error) { } rawOptions, err = json.Marshal(compat) + case *WorkerServerTargetOptions: + // WorkerServer target does not handle the backward compatibility + // for the Filename in target options, because it was added after + // the incompatible change. + rawOptions, err = json.Marshal(target.Options) + default: return nil, fmt.Errorf("unexpected target options type: %t", t) } diff --git a/internal/target/worker_server_target.go b/internal/target/worker_server_target.go new file mode 100644 index 000000000..880aea414 --- /dev/null +++ b/internal/target/worker_server_target.go @@ -0,0 +1,15 @@ +package target + +const TargetNameWorkerServer TargetName = "org.osbuild.worker.server" + +type WorkerServerTargetOptions struct{} + +func (WorkerServerTargetOptions) isTargetOptions() {} + +func NewWorkerServerTarget() *Target { + return newTarget(TargetNameWorkerServer, &WorkerServerTargetOptions{}) +} + +func NewWorkerServerTargetResult() *TargetResult { + return newTargetResult(TargetNameWorkerServer, nil) +}