cloudapi: Add ability to skip uploading and save image locally

During development it can be very useful to store the results locally
instead of uploading to a remote system. This implements a development
only option to help with that.

To use it you need to add OSBUILD_LOCALSAVE to the server's environment.
This can be done by editing /usr/lib/systemd/system/osbuild-composer.service
and adding:

Environment="OSBUILD_LOCALSAVE=1"

You can then use an 'upload_options' object to skip trying to upload to
the default service for the type of image, eg:

    "image_requests": [
    {
      "architecture": "x86_64",
      "image_type": "guest-image",
      "upload_options": {
          "local_save": true
      },
      ...
    }]

The results will be saved to /var/lib/osbuild-composer/artifacts/UUID/
using the default filename for the image type.

If local_save is used without OSBUILD_LOCALSAVE being set it will return
an error with id=36 saying 'local_save is not enabled'.
This commit is contained in:
Brian C. Lane 2023-07-26 16:00:35 -07:00 committed by Tomáš Hozza
parent 98c7a06545
commit 139bf4dec2
4 changed files with 195 additions and 128 deletions

View file

@ -46,6 +46,7 @@ const (
ErrorInvalidImageFromComposeId ServiceErrorCode = 33
ErrorImageNotFound ServiceErrorCode = 34
ErrorInvalidCustomization ServiceErrorCode = 35
ErrorLocalSaveNotEnabled ServiceErrorCode = 36
// Internal errors, these are bugs
ErrorFailedToInitializeBlueprint ServiceErrorCode = 1000
@ -123,6 +124,7 @@ func getServiceErrors() serviceErrors {
serviceError{ErrorInvalidImageFromComposeId, http.StatusBadRequest, "Invalid format for image id"},
serviceError{ErrorImageNotFound, http.StatusBadRequest, "Image with given id not found"},
serviceError{ErrorInvalidCustomization, http.StatusBadRequest, "Invalid image customization"},
serviceError{ErrorLocalSaveNotEnabled, http.StatusBadRequest, "local_save is not enabled"},
serviceError{ErrorFailedToInitializeBlueprint, http.StatusInternalServerError, "Failed to initialize blueprint"},
serviceError{ErrorFailedToGenerateManifestSeed, http.StatusInternalServerError, "Failed to generate manifest seed"},

View file

@ -8,6 +8,7 @@ import (
"math"
"math/big"
"net/http"
"os"
"strconv"
"strings"
@ -106,6 +107,33 @@ 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
arch distro.Arch
@ -196,12 +224,25 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error {
return err
}
// Check to see if local_save is enabled and set
localSave, err := isLocalSave(ir.UploadOptions)
if err != nil {
return err
}
var irTarget *target.Target
if ir.UploadOptions == nil {
// nowhere to put the image, this is a user error
if request.Koji == nil {
return 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/
irTarget = target.NewWorkerServerTarget()
irTarget.ImageName = imageType.Filename()
irTarget.OsbuildArtifact.ExportFilename = imageType.Filename()
irTarget.OsbuildArtifact.ExportName = imageType.Exports()[0]
} else {
// Get the target for the selected image type
irTarget, err = ir.GetTarget(&request, imageType)

View file

@ -510,6 +510,14 @@ type List struct {
Total int `json:"total"`
}
// LocalUploadOptions defines model for LocalUploadOptions.
type LocalUploadOptions struct {
// This is used in combination with the OSBUILD_LOCALSAVE environmental
// variable on the server to enable saving the compose locally. This
// is for development use only, and is not available to users.
LocalSave bool `json:"local_save"`
}
// OSTree defines model for OSTree.
type OSTree struct {
// A URL which, if set, is used for fetching content. Implies that `url` is set as well,
@ -894,134 +902,136 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
"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",
"L47u+Vl/VizenT41l9fIX+416sZd4alt9+rTSv/+YjIk+6jzbC1x76o4d0pPp8e3F4bvzKf8oLnnO1Or",
"RAejKq+8uc+z62L9lA4WD9XyBF7UHvp7l/YzQkPS2C8+0nt7ZJQuvP7eZPxMJ5y1xXPjenT3vPc0O2nc",
"esx8aLLJ2eh8Wj73bi+ai4G94DdNfmSfloak2PUX5QfYOypa5U7t2uiZ5wXjdUKLDcNgk6NHHy8eGK5h",
"/6D36DVeB4Vx/+3S5WbHIo3C6/PFkODGje+M/Xrdf7UfCnNRHgmChXXLXyf2oudPnu6qz6OqPRUnDfvi",
"rvD4WK+WX+1u7WLevG3eNI+GRByfnD4/3M4Mt21dHPdKF/1m49m9n44q53Z30Ct1H4+W8KFkG8Rphu+N",
"s/MZdO8nZqs2GxLDNfbwzfnV0VHvqNVsVk9wu43O9l1mn5zV/Xt+0+31ysWnmvFsk8VT46TpKhlqnc4b",
"J635tDMkR/PO6ckNPW81eevo6KnVnLdbZ1a7dVJtNlvW9GbVe+/yqVmoHz15lrPsN5+fzuzJ8sIeksLe",
"eP/tenw/G52Vi+3XyrRTvzo5uiyS7uPe0V3J9Wf9vdeB3688dNlRxa2c+o7wLm7b5xdd4dbax0NSYqdv",
"j006KC29g6dOo9s8Nnut1tVy0pxw+nDXqD/d+a29wohM2ADdlru3V63x8rpV3384aNTw1f2QuLX+3ojf",
"HM/rrXKXOWazV+0d+3T5XOpjcQqfqxc33XuxN2jDUhXzp/5pa/JG69dPjfvK+dW0VhwS6/XBapQvCyO3",
"3H7r1weNykP7eFRyZpNqx5ktrM7rBbJKpbfHp4XLnvrP5+et8extvOdc9vf9hXU2JJNF4by4dJ7LXTw6",
"Zfunzeby6uDugTWf+/N+r9g2JoPGvN0ii2n/2F++ug/z+9nl0aPf7tw3rlDlaUh6+K40Pr9scLN+7PGT",
"Ra2392iSHrnp752xyeD64rjiPjCnaZL2wDaf7huT56n3YB8veaVwcICuhsSeFlmXLIuTy/kU+uMCvmtc",
"GfuPs9500r3tnVu1u4P7i+W5//Ag3uaPZNK7rD3cnhy9XlT5M3V7vSEZi9HgrLRXW45uHwrNyuxoBBe3",
"D2VRv3u7nBhvaNp/bmPYvTzoFs6M81bntnRz0thvlI/NptM+OTCHZFq2bvBT/6YJ4Xnx/Lz5dja7nd6e",
"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",
}
// GetSwagger returns the content of the embedded swagger specification file

View file

@ -890,12 +890,26 @@ components:
- $ref: '#/components/schemas/GCPUploadOptions'
- $ref: '#/components/schemas/AzureUploadOptions'
- $ref: '#/components/schemas/ContainerUploadOptions'
- $ref: '#/components/schemas/LocalUploadOptions'
description: |
This should really be oneOf but AWSS3UploadOptions is a subset of
AWSEC2UploadOptions. This means that all AWSEC2UploadOptions objects
are also valid AWSS3UploadOptionas objects which violates the oneOf
rules. Therefore, we have to use anyOf here but be aware that it isn't
possible to mix and match more schemas together.
LocalUploadOptions:
type: object
additionalProperties: false
required:
- local_save
properties:
local_save:
type: boolean
default: false
description: |
This is used in combination with the OSBUILD_LOCALSAVE environmental
variable on the server to enable saving the compose locally. This
is for development use only, and is not available to users.
AWSEC2UploadOptions:
type: object
additionalProperties: false