diff --git a/internal/cloudapi/v2/compose.go b/internal/cloudapi/v2/compose.go index a84926731..81e604c36 100644 --- a/internal/cloudapi/v2/compose.go +++ b/internal/cloudapi/v2/compose.go @@ -11,6 +11,7 @@ import ( "github.com/google/uuid" "github.com/osbuild/images/pkg/customizations/subscription" + "github.com/osbuild/images/pkg/datasizes" "github.com/osbuild/images/pkg/disk" "github.com/osbuild/images/pkg/distrofactory" "github.com/osbuild/images/pkg/reporegistry" @@ -190,10 +191,14 @@ func (rbp *Blueprint) GetCustomizationsFromBlueprintRequest() (*blueprint.Custom if rbpc.Filesystem != nil { var fsCustomizations []blueprint.FilesystemCustomization for _, f := range *rbpc.Filesystem { + minSize, err := decodeMinsize(&f.Minsize) + if err != nil { + return nil, err + } fsCustomizations = append(fsCustomizations, blueprint.FilesystemCustomization{ Mountpoint: f.Mountpoint, - MinSize: f.Minsize, + MinSize: minSize, }, ) } @@ -500,6 +505,11 @@ func (rbp *Blueprint) GetCustomizationsFromBlueprintRequest() (*blueprint.Custom return nil, err } c.Disk = disk + bpDisk, err := convertDiskCustomizations(rbpc.Disk) + if err != nil { + return nil, err + } + c.Disk = bpDisk return c, nil } @@ -1294,8 +1304,12 @@ func convertDiskCustomizations(disk *Disk) (*blueprint.DiskCustomization, error) return nil, nil } + diskSize, err := decodeMinsize(disk.Minsize) + if err != nil { + return nil, err + } bpDisk := &blueprint.DiskCustomization{ - MinSize: common.DerefOrDefault(disk.Minsize), + MinSize: diskSize, Type: string(common.DerefOrDefault(disk.Type)), } @@ -1314,10 +1328,14 @@ func convertDiskCustomizations(disk *Disk) (*blueprint.DiskCustomization, error) if err != nil { return nil, fmt.Errorf("failed to deserialize disk customization partition %d with type %q", idx, partType) } + fsSize, err := decodeMinsize(fs.Minsize) + if err != nil { + return nil, err + } bpPartition = blueprint.PartitionCustomization{ Type: string(common.DerefOrDefault(fs.Type)), PartType: common.DerefOrDefault(fs.PartType), - MinSize: common.DerefOrDefault(fs.Minsize), + MinSize: fsSize, FilesystemTypedCustomization: blueprint.FilesystemTypedCustomization{ Mountpoint: fs.Mountpoint, Label: common.DerefOrDefault(fs.Label), @@ -1329,11 +1347,15 @@ func convertDiskCustomizations(disk *Disk) (*blueprint.DiskCustomization, error) if err != nil { return nil, fmt.Errorf("failed to deserialize disk customization partition %d with type %q", idx, partType) } + volSize, err := decodeMinsize(btrfsVol.Minsize) + if err != nil { + return nil, err + } bpPartition = blueprint.PartitionCustomization{ Type: string(common.DerefOrDefault(btrfsVol.Type)), PartType: common.DerefOrDefault(btrfsVol.PartType), - MinSize: common.DerefOrDefault(btrfsVol.Minsize), + MinSize: volSize, } for _, subvol := range btrfsVol.Subvolumes { @@ -1348,19 +1370,27 @@ func convertDiskCustomizations(disk *Disk) (*blueprint.DiskCustomization, error) if err != nil { return nil, fmt.Errorf("failed to deserialize disk customization partition %d with type %q", idx, partType) } + vgSize, err := decodeMinsize(vg.Minsize) + if err != nil { + return nil, err + } bpPartition = blueprint.PartitionCustomization{ Type: string(common.DerefOrDefault(vg.Type)), PartType: common.DerefOrDefault(vg.PartType), - MinSize: common.DerefOrDefault(vg.Minsize), + MinSize: vgSize, VGCustomization: blueprint.VGCustomization{ Name: common.DerefOrDefault(vg.Name), }, } for _, lv := range vg.LogicalVolumes { + lvSize, err := decodeMinsize(lv.Minsize) + if err != nil { + return nil, err + } bpLV := blueprint.LVCustomization{ Name: common.DerefOrDefault(lv.Name), - MinSize: common.DerefOrDefault(lv.Minsize), + MinSize: lvSize, FilesystemTypedCustomization: blueprint.FilesystemTypedCustomization{ Mountpoint: lv.Mountpoint, Label: common.DerefOrDefault(lv.Label), @@ -1378,3 +1408,19 @@ func convertDiskCustomizations(disk *Disk) (*blueprint.DiskCustomization, error) return bpDisk, nil } + +func decodeMinsize(size *Minsize) (uint64, error) { + if size == nil { + return 0, nil + } + + if sizeStr, err := size.AsMinsize1(); err == nil { + return datasizes.Parse(sizeStr) + } + + if sizeUint, err := size.AsMinsize0(); err == nil { + return sizeUint, err + } + + return 0, fmt.Errorf("failed to convert value \"%v\" to number", size) +} diff --git a/internal/cloudapi/v2/compose_test.go b/internal/cloudapi/v2/compose_test.go index 9f9d95da3..719ab3772 100644 --- a/internal/cloudapi/v2/compose_test.go +++ b/internal/cloudapi/v2/compose_test.go @@ -1,6 +1,7 @@ package v2 import ( + "fmt" "io/fs" "testing" @@ -179,7 +180,7 @@ func GetTestBlueprint() blueprint.Blueprint { }, }, Disk: &blueprint.DiskCustomization{ - MinSize: 10, + MinSize: 20 * datasizes.GiB, Partitions: []blueprint.PartitionCustomization{ { Type: "plain", @@ -276,11 +277,14 @@ func TestGetBlueprintFromCustomizations(t *testing.T) { }, )) + var btrfsSize Minsize + require.NoError(t, btrfsSize.FromMinsize0(100*datasizes.MiB)) + var btrfsPart Partition require.NoError(t, btrfsPart.FromBtrfsVolume( BtrfsVolume{ Type: common.ToPtr(Btrfs), - Minsize: common.ToPtr(uint64(100 * datasizes.MiB)), + Minsize: &btrfsSize, Subvolumes: []BtrfsSubvolume{ { Mountpoint: "/data/db1", @@ -294,12 +298,16 @@ func TestGetBlueprintFromCustomizations(t *testing.T) { }, )) + var vgSize, lvSize Minsize + require.NoError(t, vgSize.FromMinsize0(10*datasizes.GiB)) + require.NoError(t, lvSize.FromMinsize0(3*datasizes.GiB)) + var vgPart Partition require.NoError(t, vgPart.FromVolumeGroup( VolumeGroup{ Type: common.ToPtr(Lvm), - Minsize: common.ToPtr(uint64(10 * datasizes.GiB)), Name: common.ToPtr("vg000001"), + Minsize: &vgSize, PartType: common.ToPtr("E6D6D379-F507-44C2-A23C-238F2A3DF928"), LogicalVolumes: []LogicalVolume{ { @@ -312,7 +320,7 @@ func TestGetBlueprintFromCustomizations(t *testing.T) { { FsType: nil, Label: common.ToPtr("home"), - Minsize: common.ToPtr(uint64(3) * datasizes.GiB), + Minsize: &lvSize, Mountpoint: "/home", Name: common.ToPtr("homelv"), }, @@ -320,6 +328,9 @@ func TestGetBlueprintFromCustomizations(t *testing.T) { }, )) + var diskSize Minsize + require.NoError(t, diskSize.FromMinsize1("20 GiB")) + // Construct the compose request with customizations cr = ComposeRequest{Customizations: &Customizations{ Users: &[]User{ @@ -451,7 +462,7 @@ func TestGetBlueprintFromCustomizations(t *testing.T) { }, }, Disk: &Disk{ - Minsize: common.ToPtr(uint64(10)), + Minsize: &diskSize, Partitions: []Partition{ plainPart, btrfsPart, @@ -523,11 +534,14 @@ func TestGetBlueprintFromCompose(t *testing.T) { }, )) + var btrfsSize Minsize + require.NoError(t, btrfsSize.FromMinsize0(100*datasizes.MiB)) + var btrfsPart Partition require.NoError(t, btrfsPart.FromBtrfsVolume( BtrfsVolume{ Type: common.ToPtr(Btrfs), - Minsize: common.ToPtr(uint64(100 * datasizes.MiB)), + Minsize: &btrfsSize, Subvolumes: []BtrfsSubvolume{ { Mountpoint: "/data/db1", @@ -541,11 +555,15 @@ func TestGetBlueprintFromCompose(t *testing.T) { }, )) + var vgSize, lvSize Minsize + require.NoError(t, vgSize.FromMinsize0(10*datasizes.GiB)) + require.NoError(t, lvSize.FromMinsize0(3*datasizes.GiB)) + var vgPart Partition require.NoError(t, vgPart.FromVolumeGroup( VolumeGroup{ Type: common.ToPtr(Lvm), - Minsize: common.ToPtr(uint64(10 * datasizes.GiB)), + Minsize: &vgSize, Name: common.ToPtr("vg000001"), PartType: common.ToPtr("E6D6D379-F507-44C2-A23C-238F2A3DF928"), LogicalVolumes: []LogicalVolume{ @@ -559,7 +577,7 @@ func TestGetBlueprintFromCompose(t *testing.T) { { FsType: nil, Label: common.ToPtr("home"), - Minsize: common.ToPtr(uint64(3) * datasizes.GiB), + Minsize: &lvSize, Mountpoint: "/home", Name: common.ToPtr("homelv"), }, @@ -567,6 +585,12 @@ func TestGetBlueprintFromCompose(t *testing.T) { }, )) + var fsSize Minsize + require.NoError(t, fsSize.FromMinsize0(1099511627776)) + + var diskSize Minsize + require.NoError(t, diskSize.FromMinsize1("20 GiB")) + // Construct the compose request with a blueprint cr = ComposeRequest{Blueprint: &Blueprint{ Name: "empty blueprint", @@ -613,7 +637,7 @@ func TestGetBlueprintFromCompose(t *testing.T) { Filesystem: &[]BlueprintFilesystem{ { Mountpoint: "/var/lib/wopr/", - Minsize: 1099511627776, + Minsize: fsSize, }, }, Services: &Services{ @@ -700,7 +724,7 @@ func TestGetBlueprintFromCompose(t *testing.T) { }, }, Disk: &Disk{ - Minsize: common.ToPtr(uint64(10)), + Minsize: &diskSize, Partitions: []Partition{ plainPart, btrfsPart, @@ -1131,3 +1155,72 @@ func TestOpenSCAPTailoringOptions(t *testing.T) { bp, err = cr.GetBlueprintFromCustomizations() assert.Error(t, err) } + +func TestDecodeMinsize(t *testing.T) { + type testCase struct { + in *Minsize + expOut uint64 + expErrSubstr string + } + + msStr := func(s string) *Minsize { + var ms Minsize + if err := ms.FromMinsize1(s); err != nil { + panic(err) + } + return &ms + } + + msInt := func(i uint64) *Minsize { + var ms Minsize + if err := ms.FromMinsize0(i); err != nil { + panic(err) + } + return &ms + } + + testCases := []testCase{ + { + in: nil, + expOut: 0, + }, + { + in: msInt(10), + expOut: 10, + }, + { + in: msInt(41 * datasizes.MiB), + expOut: 41 * datasizes.MiB, + }, + { + in: msStr("10"), + expOut: 10, + }, + { + in: msStr("32 GiB"), + expOut: 32 * datasizes.GiB, + }, + + { + in: msStr("not a number"), + expErrSubstr: "the size string doesn't contain any number: not a number", + }, + { + in: msStr("10 GiBi"), + expErrSubstr: "unknown data size units in string: 10 GiBi", + }, + } + + for idx, tc := range testCases { + t.Run(fmt.Sprintf("case-%02d", idx), func(t *testing.T) { + assert := assert.New(t) + out, err := decodeMinsize(tc.in) + if tc.expErrSubstr != "" { + assert.ErrorContains(err, tc.expErrSubstr) + } else { + assert.NoError(err) + } + assert.Equal(tc.expOut, out) + }) + } +} diff --git a/internal/cloudapi/v2/openapi.v2.gen.go b/internal/cloudapi/v2/openapi.v2.gen.go index 054c01892..f245907de 100644 --- a/internal/cloudapi/v2/openapi.v2.gen.go +++ b/internal/cloudapi/v2/openapi.v2.gen.go @@ -370,9 +370,8 @@ type BlueprintFile_User struct { // BlueprintFilesystem defines model for BlueprintFilesystem. type BlueprintFilesystem struct { - // Minsize size of the filesystem in bytes - Minsize uint64 `json:"minsize"` - Mountpoint string `json:"mountpoint"` + Minsize Minsize `json:"minsize"` + Mountpoint string `json:"mountpoint"` } // BlueprintFirewall Firewalld configuration @@ -456,8 +455,7 @@ type BtrfsSubvolume struct { // BtrfsVolume defines model for BtrfsVolume. type BtrfsVolume struct { - // Minsize minimum size of the btrfs volume in bytes - Minsize *uint64 `json:"minsize,omitempty"` + Minsize *Minsize `json:"minsize,omitempty"` // PartType The partition type GUID for GPT partitions. For DOS partitions, this field can be used to set the (2 hex digit) partition type. If not set, the type will be automatically set based on the mountpoint or the payload type. PartType *string `json:"part_type,omitempty"` @@ -768,8 +766,7 @@ type Directory_User struct { // Disk defines model for Disk. type Disk struct { - // Minsize size of the filesystem in bytes - Minsize *uint64 `json:"minsize,omitempty"` + Minsize *Minsize `json:"minsize,omitempty"` Partitions []Partition `json:"partitions"` // Type Type of the partition table @@ -870,12 +867,10 @@ type Filesystem struct { // FilesystemTyped defines model for FilesystemTyped. type FilesystemTyped struct { // FsType The filesystem type - FsType *FilesystemTypedFsType `json:"fs_type,omitempty"` - Label *string `json:"label,omitempty"` - - // Minsize minimum size of the filesystem in bytes - Minsize *uint64 `json:"minsize,omitempty"` - Mountpoint string `json:"mountpoint"` + FsType *FilesystemTypedFsType `json:"fs_type,omitempty"` + Label *string `json:"label,omitempty"` + Minsize *Minsize `json:"minsize,omitempty"` + Mountpoint string `json:"mountpoint"` // PartType The partition type GUID for GPT partitions. For DOS partitions, this field can be used to set the (2 hex digit) partition type. If not set, the type will be automatically set based on the mountpoint or the payload type. PartType *string `json:"part_type,omitempty"` @@ -1119,11 +1114,9 @@ type Locale struct { // LogicalVolume defines model for LogicalVolume. type LogicalVolume struct { // FsType The filesystem type for the logical volume - FsType *LogicalVolumeFsType `json:"fs_type,omitempty"` - Label *string `json:"label,omitempty"` - - // Minsize minimum size of the logical volume in bytes - Minsize *uint64 `json:"minsize,omitempty"` + FsType *LogicalVolumeFsType `json:"fs_type,omitempty"` + Label *string `json:"label,omitempty"` + Minsize *Minsize `json:"minsize,omitempty"` // Mountpoint Mountpoint for the logical volume Mountpoint string `json:"mountpoint"` @@ -1459,9 +1452,7 @@ type User struct { // VolumeGroup defines model for VolumeGroup. type VolumeGroup struct { LogicalVolumes []LogicalVolume `json:"logical_volumes"` - - // Minsize minimum size of the volume group in bytes - Minsize *uint64 `json:"minsize,omitempty"` + Minsize *Minsize `json:"minsize,omitempty"` // Name Volume group name (will be automatically generated if omitted) Name *string `json:"name,omitempty"` @@ -1474,6 +1465,17 @@ type VolumeGroup struct { // VolumeGroupType defines model for VolumeGroup.Type. type VolumeGroupType string +// Minsize defines model for minsize. +type Minsize struct { + union json.RawMessage +} + +// Minsize0 size in bytes +type Minsize0 = uint64 + +// Minsize1 size with data units +type Minsize1 = string + // Page defines model for page. type Page = string @@ -2651,6 +2653,68 @@ func (t *UploadStatus_Options) UnmarshalJSON(b []byte) error { return err } +// AsMinsize0 returns the union data inside the Minsize as a Minsize0 +func (t Minsize) AsMinsize0() (Minsize0, error) { + var body Minsize0 + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromMinsize0 overwrites any union data inside the Minsize as the provided Minsize0 +func (t *Minsize) FromMinsize0(v Minsize0) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeMinsize0 performs a merge with any union data inside the Minsize, using the provided Minsize0 +func (t *Minsize) MergeMinsize0(v Minsize0) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsMinsize1 returns the union data inside the Minsize as a Minsize1 +func (t Minsize) AsMinsize1() (Minsize1, error) { + var body Minsize1 + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromMinsize1 overwrites any union data inside the Minsize as the provided Minsize1 +func (t *Minsize) FromMinsize1(v Minsize1) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeMinsize1 performs a merge with any union data inside the Minsize, using the provided Minsize1 +func (t *Minsize) MergeMinsize1(v Minsize1) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t Minsize) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *Minsize) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + // ServerInterface represents all server handlers. type ServerInterface interface { // The status of a cloned compose @@ -3005,12 +3069,12 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+x9eXPjOK74V2H5N1U9/dr3kTip2nrPcS7nTpyjk3VXlpZom7FEqknKjjOvv/uveEiW", - "bPrqY2ZnX/7YnY7FAwQBEAAB8I+MQ/2AEkQEz+z+kQkggz4SiJm/+kj+10XcYTgQmJLMbuYK9hHAxEWv", + "H4sIAAAAAAAC/+x9eXPjOK74V2H5N1U9/dr3kTipmnrPcS7nTpyjk3VXlpZom7FEqknKjjOvv/uveEiW", + "bPrqY3ZnX/7YnY7FAwQBEAAB8M+MQ/2AEkQEz+z+mQkggz4SiJm/+kj+10XcYTgQmJLMbuYK9hHAxEWv", "mWwGvUI/8FCq+Qh6IcrsZkqZb9+yGSz7fA0Rm2SyGQJ9+UW1zGa4M0A+lF3EJJC/c8Ew6atuHL9Z5r4I", "/S5igPYAFsjnABOAoDMAZsAkNNEAMTTF4kJ4VNtl8HyLPqqhGw/tg2a56VGCmhJ9XE0EXRdLMKF3xWiA", - "mMASkB70OMpmgsRPf2QY6qv1zE2UzfABZOh5jMXgGToODc3GmJVldv+ZKZUr1drWdn2nWCpnvmQzChPW", - "scwPkDE4UWtn6GuIGXLlMAaGL3Ez2n1BjpD99PruAo9C91Khnn/3AmPAMyjMjREXuVIm+2cuO5vhBAZ8", + "mMASkB70OMpmgsRPf2YY6qv1zE2UzfABZOh5jMXgGToODc3GmJVldv+RKZUr1drWdn2nWCpnvmQzChPW", + "scwPkDE4UWtn6GuIGXLlMAaGL3Ez2n1BjpD99PruAo9C91Khnn/3AmPAMyjMjREXuVIm+1cuO5vhBAZ8", "QMWz3u0kTP4kF32dh8qOMDusq9DYFlCEmktSiII+TkMEfZwrOvVKcXunsr1dq+3U3GrXhrENUTyzGDlv", "dgUNtCs/QgJB2PWwo1m4B0NPxO3SLN3qAY4EEBSoz+B3MUDAdAGKeT9mAQQeJf0soN1eyB0okAvubs46", "BHPAkAgZQW4etAQH6DXADMqhgY/7AwG6CHBKCWJADCABPcoAFQPEQKjW1iECsj4SPN8hHTKFRbAQyWn5", @@ -3020,200 +3084,200 @@ var swaggerSpec = []string{ "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", } // 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 e30ef5103..5dffd1f5d 100644 --- a/internal/cloudapi/v2/openapi.v2.yml +++ b/internal/cloudapi/v2/openapi.v2.yml @@ -2161,9 +2161,7 @@ components: type: string example: '/var' minsize: - x-go-type: uint64 - example: 2147483648 - description: 'size of the filesystem in bytes' + $ref: '#/components/schemas/minsize' OSTree: type: object properties: @@ -2599,9 +2597,7 @@ components: description: | Type of the partition table minsize: - x-go-type: uint64 - example: 2147483648 - description: 'size of the filesystem in bytes' + $ref: '#/components/schemas/minsize' partitions: type: array items: @@ -2627,9 +2623,7 @@ components: description: | The partition type GUID for GPT partitions. For DOS partitions, this field can be used to set the (2 hex digit) partition type. If not set, the type will be automatically set based on the mountpoint or the payload type. minsize: - x-go-type: uint64 - example: 2147483648 - description: 'minimum size of the filesystem in bytes' + $ref: '#/components/schemas/minsize' mountpoint: type: string label: @@ -2656,9 +2650,7 @@ components: description: | The partition type GUID for GPT partitions. For DOS partitions, this field can be used to set the (2 hex digit) partition type. If not set, the type will be automatically set based on the mountpoint or the payload type. minsize: - x-go-type: uint64 - example: 2147483648 - description: 'minimum size of the btrfs volume in bytes' + $ref: '#/components/schemas/minsize' subvolumes: type: array items: @@ -2695,9 +2687,7 @@ components: description: | Volume group name (will be automatically generated if omitted) minsize: - x-go-type: uint64 - example: 2147483648 - description: 'minimum size of the volume group in bytes' + $ref: '#/components/schemas/minsize' logical_volumes: type: array items: @@ -2710,9 +2700,7 @@ components: name: type: string minsize: - x-go-type: uint64 - example: 2147483648 - description: 'minimum size of the logical volume in bytes' + $ref: '#/components/schemas/minsize' mountpoint: type: string description: | @@ -2727,6 +2715,14 @@ components: - vfat description: | The filesystem type for the logical volume + minsize: + oneOf: + - x-go-type: uint64 + example: 2147483648 + description: 'size in bytes' + - type: string + example: "2 GiB" + description: 'size with data units' parameters: page: