From 139bf4dec292bfb2f92ccbffd15272c3591c48ed Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Wed, 26 Jul 2023 16:00:35 -0700 Subject: [PATCH] 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'. --- internal/cloudapi/v2/errors.go | 2 + internal/cloudapi/v2/handler.go | 41 ++++ internal/cloudapi/v2/openapi.v2.gen.go | 266 +++++++++++++------------ internal/cloudapi/v2/openapi.v2.yml | 14 ++ 4 files changed, 195 insertions(+), 128 deletions(-) diff --git a/internal/cloudapi/v2/errors.go b/internal/cloudapi/v2/errors.go index 6bbc6b1c9..46f9895e3 100644 --- a/internal/cloudapi/v2/errors.go +++ b/internal/cloudapi/v2/errors.go @@ -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"}, diff --git a/internal/cloudapi/v2/handler.go b/internal/cloudapi/v2/handler.go index 9fa40267f..0a33f71bc 100644 --- a/internal/cloudapi/v2/handler.go +++ b/internal/cloudapi/v2/handler.go @@ -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) diff --git a/internal/cloudapi/v2/openapi.v2.gen.go b/internal/cloudapi/v2/openapi.v2.gen.go index aca219658..bec1bea43 100644 --- a/internal/cloudapi/v2/openapi.v2.gen.go +++ b/internal/cloudapi/v2/openapi.v2.gen.go @@ -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", + "d7vWRfnp5gmfXd4vy6JyvjwZcwbd2rzferga29eos+weDZ7Ph2TGvEvneoTGfHBQqw/G5aPLjm+9PbNW", + "7X5x3L+YPlu3dun+dNbv3JDW8m16s9xv35Vfrz38UDuQOsq+7jw+swtqXFQuuv2DAn47vxncOmLSa/46", + "JL9ejwf1IVG7S/vy+L2tJzXCrqpZXzh30jfpn6ci0o4Fq1Lh1HII6fAEjYCuJ1buZ8w2gVyaFRxgFd9f", + "ZU1VmfKQ/OJhDzmYoK+pJcsbebPwMBj9ZD34j/U4k04l2OJTpgc9Njyb/lqt7ppbYwg807V5gRGXvMsL", + "GQyJnPwUW04Pcj6nLLWsWdq0L6nG8aZtvAOLYMKxZa/dXbat1owyC5Kggn491FstVsrV9GDBDndq6UAc", + "dMDYgVZYH8NsQ/4Zpg505EuVL4UlLdDhFEBnDpc8iIRx0AlmtMZ72+akQ2mbFI0zTF6yX4ywH9J1zfFL", + "0C27zhMJHGILHFucNI96M4JJljtffbKWEct+2Gf9arWPumyUcH04xuZ9XB912XLS9aNuKfHfb7+nxm2D", + "q4EYgo4+EqIK+8DIF2CTJDrXKdkGCUDHQ5JCaR2MBS6CJAhSQscBKQ2BXmc+JNLFVmyu9djGuDBqG8jE", + "DFN1uFN74xLhIWG+g/SRF4bGlKEsmCNgw1lUiqZ4B6gqKjm7EQJwDsMSVXXZFfkihsSjnOMgNuzihYqR", + "uVAYtg4LBBQGglpK+0oRjDh1WzYilsP9zOU9yUzm7gy8Y4/1UohPsO+OPdLPIqty2s/ncqNs8C7VB7pj", + "UH6w7eaCIFgVrs7va+v4yaww8wnZlvqNo5OW+83zSpR0DVO8qwRqKsSgpPcTOR1VfcO3HFJWH0u7HC/e", + "2OM5t3PILNdqpQPQbDabrcrlG2yVnOfjTuly0K7Jd51LdnrRZr0nvNfr3c39M3jbPHdvu7Tzdjsuvx6X", + "zePaW/FosCjsL947/Loa1eeIfZzC3FI3ozZFw2dYLPuSYzSBjhBkmqoj9ddJuAGePwzCm2jV1qrbRVCl", + "ZaLvo8VkTDet0H5Q/SZoYDqqXJROa+sKEZ5X2W4DBZdxBVfgNj1o2AiUVXZZbd+RoT+fz/NQfVbWddCX", + "F7qdVvuy386V88W8LVxHrSAWimRX/SM1fFCewYAq8wTQw7FY7WGmHB6PlB8OM5V8MV/K6LJ0RaaC4VCC", + "eOEPbH5TfJVWiHyKdN2/FjZVkgwCCQGUqQyeg0R4pl/fdwHDxJ6qWsU8uMwnZupSphJ4q8oadSRC2rtK", + "NpGJzHz8sEjH1KjErwXLJi5U/i39Mr2gvkcjLyiwVCm0uqZYFa9HtxQHN42EHKdNsNWdxT/89q7f1c11", + "6tY2tRjlYjGWZFQawfOcIBBbmARnbVYIvauuY1RS7JykTJwmkkWqP3DooEhoc9AO0UZBmPLFph669NcP", + "3fTViYspUt4U1ojo0St//eh3BPrCpgy/aQ/OQ0zyBoh4W2NS/TswmRI6J2tLUPs7Vv+OoIWH1P2jqvAM", + "UMPwmZS0uApXUhwq799+lzLCfdeFbBmU0ceVkFJeET8pOAVjdWG4R9MuPmnpk1cQEDQPu2aBR+XUsbKc", + "DUp4cN5CHa2dIQZD5a70fXAAQd2MrgvgMQMmkl2CYvoNxXVNuQjvbtRKBnER3gL5YyQ+eX/Zt+T2KZXZ", + "tw19U/rRo3fMtKUPPgIbcrl+TCDzX6Z02Orysp+a56fm2VHzBEojTdP8KOPpE/ZSSMMPDKXEDXo7mUoR", + "4P9jxlKCUikclKTLT4Ppp9r6DzWYtuov7QjGraYU+yV+AfVO+iSmrP6NtMhfYHutX+39d1tfaReBp7CU", + "OtKL5qtTZCOkClL1zYXpek2ghSioCwWS+KT8hM9u2qv6owZIk81viV1bkiVxfvodAXCC6vY/s4uPMcHc", + "jm3i4N09HIvV1q2rmVXI3EUCAkw0D2NKABxRX4S/m+A74r1tXhXn/9zkP9zkg4vDU0VDskB0zF3/vknk", + "IGICCFVpZGz4DmTBuV7wi7Cpb9lBvuO8f3X5Nf9fJ0in6gy3FSbcQy5PE6PEJejvylLUcgdxulW/C8RV", + "fWh0V6lERvnggToj8R+ZyQN1cDtqbFAlWDy6d0MvX3jGDwoQD8cG947qagtIwntIcyG4fO0dUVxdLv9T", + "Hj+UxxWxtghlYrk3BPO/U9aS4rGD0MXq1N+XuejYiBS5DTnTN0ygBTREYiOKfpbLRB4iJl9dBqxkLQr9", + "q8Ox70lGiOdPwfhYMKLfL9giF+FSfkYufjqpP53UfzcndUM3pek7BTxuU2yomNWVcRvKJW1mqyYFdSJz", + "W/1DrJ06svmXiv5qDmncrn8VhY5BQIyfYvavETPN6P95QgYjBoKOA6LiqJCbVmL2cUQbEl30QIzovJbG", + "bHUD12gJ1NaZLqi7x49Q0Py7dv3K37yHb11K9QHE3/2U4p9S/BkpRpscJCU3KvLZvkNeBU2+k+/X6682", + "JhqgonSB9MoliPDSzP9Au+Td6XyLarLTtFgvuEqMmr6h77+L7uFIloBBD+fVLfY2Dn6SE3pY/3RPTkUe", + "EMuF9xgWZmVlrawVpgloYWK9NwAX0ELfOYwiIgmvOouG+QjO79/+fwAAAP//SQ/jhwp/AAA=", } // 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 469bd349e..fe89cf09a 100644 --- a/internal/cloudapi/v2/openapi.v2.yml +++ b/internal/cloudapi/v2/openapi.v2.yml @@ -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