From d0877e68dc92319cb11d607b6633ac00c8d0c4c2 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Fri, 15 Sep 2023 15:05:04 -0700 Subject: [PATCH] cloudapi: Add partitioning_mode support to the API This adds a 'partitioning_mode' field that can be set to 'auto-lvm', 'lvm' or 'raw'. It defaults to 'auto-lvm'. --- internal/cloudapi/v2/compose.go | 20 ++ internal/cloudapi/v2/compose_test.go | 16 ++ internal/cloudapi/v2/errors.go | 2 + internal/cloudapi/v2/handler.go | 6 + internal/cloudapi/v2/imagerequest.go | 7 +- internal/cloudapi/v2/openapi.v2.gen.go | 316 +++++++++++++------------ internal/cloudapi/v2/openapi.v2.yml | 12 + 7 files changed, 231 insertions(+), 148 deletions(-) diff --git a/internal/cloudapi/v2/compose.go b/internal/cloudapi/v2/compose.go index c099860a0..26520203b 100644 --- a/internal/cloudapi/v2/compose.go +++ b/internal/cloudapi/v2/compose.go @@ -5,6 +5,7 @@ import ( "fmt" "reflect" + "github.com/osbuild/images/pkg/disk" "github.com/osbuild/images/pkg/subscription" "github.com/osbuild/osbuild-composer/internal/blueprint" ) @@ -424,3 +425,22 @@ func (request *ComposeRequest) GetSubscription() (sub *subscription.ImageOptions return } + +// GetPartitioningMode returns the partitioning mode included in the request +// or defaults to AutoLVMPartitioningMode if not included +func (request *ComposeRequest) GetPartitioningMode() (disk.PartitioningMode, error) { + if request.Customizations == nil || request.Customizations.PartitioningMode == nil { + return disk.AutoLVMPartitioningMode, nil + } + + switch *request.Customizations.PartitioningMode { + case CustomizationsPartitioningModeRaw: + return disk.RawPartitioningMode, nil + case CustomizationsPartitioningModeLvm: + return disk.LVMPartitioningMode, nil + case CustomizationsPartitioningModeAutoLvm: + return disk.AutoLVMPartitioningMode, nil + } + + return disk.AutoLVMPartitioningMode, HTTPError(ErrorInvalidPartitioningMode) +} diff --git a/internal/cloudapi/v2/compose_test.go b/internal/cloudapi/v2/compose_test.go index 7f7bfe1f5..c545027d6 100644 --- a/internal/cloudapi/v2/compose_test.go +++ b/internal/cloudapi/v2/compose_test.go @@ -3,6 +3,7 @@ package v2 import ( "testing" + "github.com/osbuild/images/pkg/disk" "github.com/osbuild/images/pkg/subscription" "github.com/osbuild/osbuild-composer/internal/blueprint" "github.com/osbuild/osbuild-composer/internal/common" @@ -305,3 +306,18 @@ func TestGetSubscriptions(t *testing.T) { assert.Equal(t, expected, sub) } + +func TestGetPartitioningMode(t *testing.T) { + // Empty Partitioning Mode + cr := ComposeRequest{} + _, err := cr.GetPartitioningMode() + assert.NoError(t, err) + + // Populated PartitioningMode + cr = ComposeRequest{Customizations: &Customizations{ + PartitioningMode: common.ToPtr(CustomizationsPartitioningModeAutoLvm), + }} + pm, err := cr.GetPartitioningMode() + assert.NoError(t, err) + assert.Equal(t, disk.AutoLVMPartitioningMode, pm) +} diff --git a/internal/cloudapi/v2/errors.go b/internal/cloudapi/v2/errors.go index 46f9895e3..09ae38b3e 100644 --- a/internal/cloudapi/v2/errors.go +++ b/internal/cloudapi/v2/errors.go @@ -47,6 +47,7 @@ const ( ErrorImageNotFound ServiceErrorCode = 34 ErrorInvalidCustomization ServiceErrorCode = 35 ErrorLocalSaveNotEnabled ServiceErrorCode = 36 + ErrorInvalidPartitioningMode ServiceErrorCode = 37 // Internal errors, these are bugs ErrorFailedToInitializeBlueprint ServiceErrorCode = 1000 @@ -125,6 +126,7 @@ func getServiceErrors() serviceErrors { 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{ErrorInvalidPartitioningMode, http.StatusBadRequest, "Requested partitioning mode is invalid"}, 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 390c828c7..eb368f07e 100644 --- a/internal/cloudapi/v2/handler.go +++ b/internal/cloudapi/v2/handler.go @@ -218,6 +218,12 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error { // Set Subscription from the compose request imageOptions.Subscription = request.GetSubscription() + // Set PartitioningMode from the compose request + imageOptions.PartitioningMode, err = request.GetPartitioningMode() + if err != nil { + return err + } + // Set OSTree options from the image request imageOptions.OSTree, err = ir.GetOSTreeOptions() if err != nil { diff --git a/internal/cloudapi/v2/imagerequest.go b/internal/cloudapi/v2/imagerequest.go index 19527a830..6aaae11d3 100644 --- a/internal/cloudapi/v2/imagerequest.go +++ b/internal/cloudapi/v2/imagerequest.go @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/google/uuid" + "github.com/osbuild/images/pkg/disk" "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/ostree" "github.com/osbuild/osbuild-composer/internal/blueprint" @@ -14,11 +15,13 @@ import ( "github.com/osbuild/osbuild-composer/internal/target" ) -// GetImageOptions returns the initial ImageOptions with Size set +// GetImageOptions returns the initial ImageOptions with Size and PartitioningMode set // The size is set to the largest of: // - Default size for the image type // - Blueprint filesystem customizations // - Requested size +// +// The partitioning mode is set to AutoLVM which will select LVM if there are additional mountpoints func (ir *ImageRequest) GetImageOptions(imageType distro.ImageType, bp blueprint.Blueprint) distro.ImageOptions { // NOTE: The size is in bytes var size uint64 @@ -30,7 +33,7 @@ func (ir *ImageRequest) GetImageOptions(imageType distro.ImageType, bp blueprint } else { size = imageType.Size(*ir.Size) } - return distro.ImageOptions{Size: size} + return distro.ImageOptions{Size: size, PartitioningMode: disk.AutoLVMPartitioningMode} } // GetImageTarget returns the target for the selected image type diff --git a/internal/cloudapi/v2/openapi.v2.gen.go b/internal/cloudapi/v2/openapi.v2.gen.go index 1c339282e..cd30f831e 100644 --- a/internal/cloudapi/v2/openapi.v2.gen.go +++ b/internal/cloudapi/v2/openapi.v2.gen.go @@ -31,6 +31,15 @@ const ( ComposeStatusValueSuccess ComposeStatusValue = "success" ) +// Defines values for CustomizationsPartitioningMode. +const ( + CustomizationsPartitioningModeAutoLvm CustomizationsPartitioningMode = "auto-lvm" + + CustomizationsPartitioningModeLvm CustomizationsPartitioningMode = "lvm" + + CustomizationsPartitioningModeRaw CustomizationsPartitioningMode = "raw" +) + // Defines values for ImageStatusValue. const ( ImageStatusValueBuilding ImageStatusValue = "building" @@ -358,6 +367,12 @@ type Customizations struct { Openscap *OpenSCAP `json:"openscap,omitempty"` Packages *[]string `json:"packages,omitempty"` + // Select how the disk image will be partitioned. 'auto-lvm' will use raw unless + // there are one or more mountpoints in which case it will use LVM. 'lvm' always + // uses LVM, even when there are no extra mountpoints. 'raw' uses raw partitions + // even when there are one or more mountpoints. + PartitioningMode *CustomizationsPartitioningMode `json:"partitioning_mode,omitempty"` + // Extra repositories for packages specified in customizations. These // repositories will only be used to depsolve and retrieve packages // for the OS itself (they will not be available for the build root or @@ -375,6 +390,12 @@ type Customizations struct { Users *[]User `json:"users,omitempty"` } +// Select how the disk image will be partitioned. 'auto-lvm' will use raw unless +// there are one or more mountpoints in which case it will use LVM. 'lvm' always +// uses LVM, even when there are no extra mountpoints. 'raw' uses raw partitions +// even when there are one or more mountpoints. +type CustomizationsPartitioningMode string + // A custom directory to create in the final artifact. type Directory struct { // Ensure that the parent directories exist @@ -1039,152 +1060,155 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "+/7/BwAA//9LlYnqHZIAAA==", } // 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 aff39aae5..504fabf3b 100644 --- a/internal/cloudapi/v2/openapi.v2.yml +++ b/internal/cloudapi/v2/openapi.v2.yml @@ -1171,6 +1171,18 @@ components: $ref: '#/components/schemas/FDO' ignition: $ref: '#/components/schemas/Ignition' + partitioning_mode: + type: string + enum: + - raw + - lvm + - auto-lvm + default: auto-lvm + description: | + Select how the disk image will be partitioned. 'auto-lvm' will use raw unless + there are one or more mountpoints in which case it will use LVM. 'lvm' always + uses LVM, even when there are no extra mountpoints. 'raw' uses raw partitions + even when there are one or more mountpoints. Container: type: object required: