Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cloudapi: support worker server target result options #4574

Merged
merged 3 commits into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion cmd/osbuild-worker/jobimpl-osbuild.go
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,9 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error {
artifact := jobTarget.OsbuildArtifact
switch targetOptions := jobTarget.Options.(type) {
case *target.WorkerServerTargetOptions:
targetResult = target.NewWorkerServerTargetResult(&artifact)
targetResult = target.NewWorkerServerTargetResult(&target.WorkerServerTargetResultOptions{
ArtifactRelPath: path.Join(jobTarget.OsbuildArtifact.ExportFilename),
}, &artifact)
var f *os.File
imagePath := path.Join(outputDirectory, jobTarget.OsbuildArtifact.ExportName, jobTarget.OsbuildArtifact.ExportFilename)
f, err = os.Open(imagePath)
Expand Down
14 changes: 0 additions & 14 deletions internal/cloudapi/v2/compose.go
Original file line number Diff line number Diff line change
Expand Up @@ -1215,26 +1215,12 @@ func (request *ComposeRequest) GetImageRequests(distroFactory *distrofactory.Fac
return nil, err
}

// Check to see if local_save is enabled and set
localSave, err := isLocalSave(ir.UploadOptions)
if err != nil {
return nil, err
}

var irTargets []*target.Target
if ir.UploadOptions == nil && (ir.UploadTargets == nil || len(*ir.UploadTargets) == 0) {
// nowhere to put the image, this is a user error
if request.Koji == nil {
return nil, HTTPError(ErrorJSONUnMarshallingError)
}
} else if localSave {
// Override the image type upload selection and save it locally
// Final image is in /var/lib/osbuild-composer/artifacts/UUID/
srvTarget := target.NewWorkerServerTarget()
srvTarget.ImageName = imageType.Filename()
srvTarget.OsbuildArtifact.ExportFilename = imageType.Filename()
srvTarget.OsbuildArtifact.ExportName = imageType.Exports()[0]
irTargets = []*target.Target{srvTarget}
} else {
// Get the target for the selected image type
irTargets, err = ir.GetTargets(request, imageType)
Expand Down
44 changes: 12 additions & 32 deletions internal/cloudapi/v2/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"encoding/json"
"fmt"
"net/http"
"os"
"slices"
"sort"
"strconv"
Expand Down Expand Up @@ -107,33 +106,6 @@ func splitExtension(filename string) string {
return "." + strings.Join(filenameParts[1:], ".")
}

// isLocalSave checks the environment to see if a local save has been enabled
// and tests the UploadOptions to see if it has been selected
func isLocalSave(options *UploadOptions) (bool, error) {
if options == nil {
return false, nil
}

var local LocalUploadOptions
// This is a terrible way to do this, but it is imposed by the OpenAPI code generator so...
j, err := json.Marshal(*options)
if err != nil {
return false, nil
}
err = json.Unmarshal(j, &local)
if err != nil {
return false, nil
}

// Return an error if local_save is set but not enabled
_, enabled := os.LookupEnv("OSBUILD_LOCALSAVE")
if !enabled && local.LocalSave {
return false, HTTPError(ErrorLocalSaveNotEnabled)
}

return enabled && local.LocalSave, nil
}

type imageRequest struct {
imageType distro.ImageType
repositories []rpmmd.RepoConfig
Expand Down Expand Up @@ -246,7 +218,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{}
Expand Down Expand Up @@ -299,6 +271,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)
}
Expand Down Expand Up @@ -347,7 +327,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)
}
Expand Down Expand Up @@ -412,7 +392,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)
}
Expand Down Expand Up @@ -1173,7 +1153,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)
}
Expand Down
10 changes: 2 additions & 8 deletions internal/cloudapi/v2/imagerequest.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -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
}

Expand All @@ -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
}

Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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
}

Expand All @@ -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
}

Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand Down
Loading
Loading