cloudapi/v2: minsize can be a string or integer

Define a reusable minsize property in the cloud API schema.
The minsize type is either a uint64 or a string with data units.

Internally, this creates a union (json.RawMessage) type called Minsize
and optional uses of the property are of type *Minsize.  We define an
internal decodeMinsize() function to convert *Minsize to uint64.  This
is similar to the decodeSize() function in the blueprint, but made
specifically to handle *Minsize.
This commit is contained in:
Achilleas Koutsou 2025-03-18 15:53:04 +01:00 committed by Sanne Raymaekers
parent 82ac185e7c
commit ad0cb80bed
4 changed files with 452 additions and 253 deletions

View file

@ -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)
}

View file

@ -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)
})
}
}

View file

@ -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

View file

@ -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: