diff --git a/internal/cloudapi/v2/errors.go b/internal/cloudapi/v2/errors.go index 6bbc6b1c92..46f9895e36 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 9fa40267f6..0a33f71bca 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 aca219658e..bec1bea434 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 469bd349e4..fe89cf09a5 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