Skip to content

Commit aebbbaf

Browse files
committed
feat: support relative voume size
Include percent-based maxSize, e.g. use 50% of available space. Signed-off-by: Mateusz Urbanek <mateusz.urbanek@siderolabs.com> (cherry picked from commit 83f2bdb)
1 parent 3d997d7 commit aebbbaf

File tree

34 files changed

+489
-123
lines changed

34 files changed

+489
-123
lines changed

api/resource/definitions/block/block.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ message PartitionSpec {
158158
bool grow = 3;
159159
string label = 4;
160160
string type_uuid = 5;
161+
uint64 relative_max_size = 6;
161162
}
162163

163164
// ProvisioningSpec is the spec for volume provisioning.

cmd/talosctl/cmd/mgmt/cluster/create/clusterops/configmaker/internal/makers/qemu.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ func (m *Qemu) initExtraDisks() error {
536536
Match: cel.MustExpression(cel.ParseBooleanExpression(fmt.Sprintf("'%s' in disk.symlinks", m.Provisioner.UserDiskName(diskID+1)), celenv.DiskLocator())),
537537
},
538538
ProvisioningMinSize: block.MustByteSize(volumeSize),
539-
ProvisioningMaxSize: block.MustByteSize(volumeSize),
539+
ProvisioningMaxSize: block.MustSize(volumeSize),
540540
}
541541
userVolume.EncryptionSpec = encryptionSpec
542542

internal/app/machined/pkg/controllers/block/internal/volumes/partition.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func CreatePartition(ctx context.Context, logger *zap.Logger, diskPath string, v
6464
available := pt.LargestContiguousAllocatable()
6565

6666
size := volumeCfg.TypedSpec().Provisioning.PartitionSpec.MinSize
67-
maxSize := volumeCfg.TypedSpec().Provisioning.PartitionSpec.MaxSize
67+
maxSize := volumeCfg.TypedSpec().Provisioning.PartitionSpec.ResolveMaxSize(available)
6868

6969
if available < size {
7070
// should never happen

internal/app/machined/pkg/controllers/block/internal/volumes/volumeconfig/system_volumes.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,12 @@ func GetEphemeralVolumeTransformer(inContainer bool) volumeConfigTransformer {
113113
Match: extraVolumeConfig.Provisioning().DiskSelector().ValueOr(systemDiskMatch()),
114114
},
115115
PartitionSpec: block.PartitionSpec{
116-
MinSize: extraVolumeConfig.Provisioning().MinSize().ValueOr(quirks.New("").PartitionSizes().EphemeralMinSize()),
117-
MaxSize: extraVolumeConfig.Provisioning().MaxSize().ValueOr(0),
118-
Grow: extraVolumeConfig.Provisioning().Grow().ValueOr(true),
119-
Label: constants.EphemeralPartitionLabel,
120-
TypeUUID: partition.LinuxFilesystemData,
116+
MinSize: extraVolumeConfig.Provisioning().MinSize().ValueOr(quirks.New("").PartitionSizes().EphemeralMinSize()),
117+
MaxSize: extraVolumeConfig.Provisioning().MaxSize().ValueOrZero(),
118+
RelativeMaxSize: extraVolumeConfig.Provisioning().RelativeMaxSize().ValueOrZero(),
119+
Grow: extraVolumeConfig.Provisioning().Grow().ValueOr(true),
120+
Label: constants.EphemeralPartitionLabel,
121+
TypeUUID: partition.LinuxFilesystemData,
121122
},
122123
FilesystemSpec: block.FilesystemSpec{
123124
Type: block.FilesystemTypeXFS,

internal/app/machined/pkg/controllers/block/internal/volumes/volumeconfig/system_volumes_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ func TestEphemeralVolumeTransformerWithExtraConfig(t *testing.T) {
422422
ephemeralConfig := blockcfg.NewVolumeConfigV1Alpha1()
423423
ephemeralConfig.MetaName = constants.EphemeralPartitionLabel
424424
ephemeralConfig.ProvisioningSpec.ProvisioningMinSize = blockcfg.MustByteSize("10GiB")
425-
ephemeralConfig.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("100GiB")
425+
ephemeralConfig.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("100GiB")
426426

427427
cfg, err := container.New(
428428
baseCfg.DeepCopy(),

internal/app/machined/pkg/controllers/block/internal/volumes/volumeconfig/user_volumes.go

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,12 @@ func UserVolumeTransformer(c configconfig.Config) ([]VolumeResource, error) {
100100
Match: userVolumeConfig.Provisioning().DiskSelector().ValueOr(noMatch),
101101
},
102102
PartitionSpec: block.PartitionSpec{
103-
MinSize: cmp.Or(userVolumeConfig.Provisioning().MinSize().ValueOrZero(), MinUserVolumeSize),
104-
MaxSize: userVolumeConfig.Provisioning().MaxSize().ValueOrZero(),
105-
Grow: userVolumeConfig.Provisioning().Grow().ValueOrZero(),
106-
Label: volumeID,
107-
TypeUUID: partition.LinuxFilesystemData,
103+
MinSize: cmp.Or(userVolumeConfig.Provisioning().MinSize().ValueOrZero(), MinUserVolumeSize),
104+
MaxSize: userVolumeConfig.Provisioning().MaxSize().ValueOrZero(),
105+
RelativeMaxSize: userVolumeConfig.Provisioning().RelativeMaxSize().ValueOrZero(),
106+
Grow: userVolumeConfig.Provisioning().Grow().ValueOrZero(),
107+
Label: volumeID,
108+
TypeUUID: partition.LinuxFilesystemData,
108109
},
109110
FilesystemSpec: block.FilesystemSpec{
110111
Type: userVolumeConfig.Filesystem().Type(),
@@ -157,11 +158,12 @@ func RawVolumeTransformer(c configconfig.Config) ([]VolumeResource, error) {
157158
Match: rawVolumeConfig.Provisioning().DiskSelector().ValueOr(noMatch),
158159
},
159160
PartitionSpec: block.PartitionSpec{
160-
MinSize: cmp.Or(rawVolumeConfig.Provisioning().MinSize().ValueOrZero(), MinUserVolumeSize),
161-
MaxSize: rawVolumeConfig.Provisioning().MaxSize().ValueOrZero(),
162-
Grow: rawVolumeConfig.Provisioning().Grow().ValueOrZero(),
163-
Label: volumeID,
164-
TypeUUID: partition.LinuxFilesystemData,
161+
MinSize: cmp.Or(rawVolumeConfig.Provisioning().MinSize().ValueOrZero(), MinUserVolumeSize),
162+
MaxSize: rawVolumeConfig.Provisioning().MaxSize().ValueOrZero(),
163+
RelativeMaxSize: rawVolumeConfig.Provisioning().RelativeMaxSize().ValueOrZero(),
164+
Grow: rawVolumeConfig.Provisioning().Grow().ValueOrZero(),
165+
Label: volumeID,
166+
TypeUUID: partition.LinuxFilesystemData,
165167
},
166168
FilesystemSpec: block.FilesystemSpec{
167169
Type: block.FilesystemTypeNone,
@@ -230,10 +232,11 @@ func SwapVolumeTransformer(c configconfig.Config) ([]VolumeResource, error) {
230232
Match: swapVolumeConfig.Provisioning().DiskSelector().ValueOr(noMatch),
231233
},
232234
PartitionSpec: block.PartitionSpec{
233-
MaxSize: cmp.Or(swapVolumeConfig.Provisioning().MaxSize().ValueOrZero(), MinUserVolumeSize),
234-
Grow: swapVolumeConfig.Provisioning().Grow().ValueOrZero(),
235-
Label: volumeID,
236-
TypeUUID: partition.LinkSwap,
235+
MaxSize: cmp.Or(swapVolumeConfig.Provisioning().MaxSize().ValueOrZero(), MinUserVolumeSize),
236+
RelativeMaxSize: swapVolumeConfig.Provisioning().RelativeMaxSize().ValueOrZero(),
237+
Grow: swapVolumeConfig.Provisioning().Grow().ValueOrZero(),
238+
Label: volumeID,
239+
TypeUUID: partition.LinkSwap,
237240
},
238241
FilesystemSpec: block.FilesystemSpec{
239242
Type: block.FilesystemTypeSwap,

internal/app/machined/pkg/controllers/block/volume_config_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ func (suite *VolumeConfigSuite) TestReconcileExtraEPHEMERALConfig() {
301301
Match: cel.MustExpression(cel.ParseBooleanExpression(`disk.transport == "nvme"`, celenv.DiskLocator())),
302302
},
303303
ProvisioningGrow: pointer.To(false),
304-
ProvisioningMaxSize: blockcfg.MustByteSize("2.5TiB"),
304+
ProvisioningMaxSize: blockcfg.MustSize("2.5TiB"),
305305
},
306306
EncryptionSpec: blockcfg.EncryptionSpec{
307307
EncryptionProvider: block.EncryptionProviderLUKS2,
@@ -341,12 +341,12 @@ func (suite *VolumeConfigSuite) TestReconcileUserRawVolumes() {
341341
rv1.MetaName = "data1"
342342
suite.Require().NoError(rv1.ProvisioningSpec.DiskSelectorSpec.Match.UnmarshalText([]byte(`system_disk`)))
343343
rv1.ProvisioningSpec.ProvisioningMinSize = blockcfg.MustByteSize("10GiB")
344-
rv1.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("100GiB")
344+
rv1.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("100GiB")
345345

346346
rv2 := blockcfg.NewRawVolumeConfigV1Alpha1()
347347
rv2.MetaName = "data2"
348348
suite.Require().NoError(rv2.ProvisioningSpec.DiskSelectorSpec.Match.UnmarshalText([]byte(`!system_disk`)))
349-
rv2.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("1TiB")
349+
rv2.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("1TiB")
350350
rv2.EncryptionSpec = blockcfg.EncryptionSpec{
351351
EncryptionProvider: block.EncryptionProviderLUKS2,
352352
EncryptionKeys: []blockcfg.EncryptionKey{
@@ -415,14 +415,14 @@ func (suite *VolumeConfigSuite) TestReconcileUserSwapVolumes() {
415415
uvPart1.MetaName = userVolumeNames[0]
416416
suite.Require().NoError(uvPart1.ProvisioningSpec.DiskSelectorSpec.Match.UnmarshalText([]byte(`system_disk`)))
417417
uvPart1.ProvisioningSpec.ProvisioningMinSize = blockcfg.MustByteSize("10GiB")
418-
uvPart1.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("100GiB")
418+
uvPart1.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("100GiB")
419419
uvPart1.FilesystemSpec.FilesystemType = block.FilesystemTypeXFS
420420

421421
uvPart2 := blockcfg.NewUserVolumeConfigV1Alpha1()
422422
uvPart2.MetaName = userVolumeNames[1]
423423
uvPart2.VolumeType = pointer.To(block.VolumeTypePartition)
424424
suite.Require().NoError(uvPart2.ProvisioningSpec.DiskSelectorSpec.Match.UnmarshalText([]byte(`!system_disk`)))
425-
uvPart2.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("1TiB")
425+
uvPart2.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("1TiB")
426426
uvPart2.EncryptionSpec = blockcfg.EncryptionSpec{
427427
EncryptionProvider: block.EncryptionProviderLUKS2,
428428
EncryptionKeys: []blockcfg.EncryptionKey{
@@ -461,7 +461,7 @@ func (suite *VolumeConfigSuite) TestReconcileUserSwapVolumes() {
461461
sv1 := blockcfg.NewSwapVolumeConfigV1Alpha1()
462462
sv1.MetaName = "swap"
463463
suite.Require().NoError(sv1.ProvisioningSpec.DiskSelectorSpec.Match.UnmarshalText([]byte(`disk.transport == "nvme"`)))
464-
sv1.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("2GiB")
464+
sv1.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("2GiB")
465465

466466
ctr, err := container.New(uvPart1, uvPart2, uvDir1, uvDisk1, sv1)
467467
suite.Require().NoError(err)

internal/app/machined/pkg/controllers/cri/image_cache_config_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ func (suite *ImageCacheConfigSuite) TestReconcileWithImageCacheVolume() {
240240

241241
volumeConfig := blockcfg.NewVolumeConfigV1Alpha1()
242242
volumeConfig.MetaName = constants.ImageCachePartitionLabel
243-
volumeConfig.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("10GiB")
243+
volumeConfig.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("10GiB")
244244

245245
container, err := container.New(v1alpha1Cfg, volumeConfig)
246246
suite.Require().NoError(err)

internal/integration/api/volumes.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -512,18 +512,30 @@ func (suite *VolumesSuite) TestUserVolumesPartition() {
512512

513513
userVolumeIDs := xslices.Map(volumeIDs, func(volumeID string) string { return constants.UserVolumePrefix + volumeID })
514514

515-
configDocs := xslices.Map(volumeIDs, func(volumeID string) any {
515+
configDocs := xslices.Map(volumeIDs[:1], func(volumeID string) any {
516516
doc := blockcfg.NewUserVolumeConfigV1Alpha1()
517517
doc.MetaName = volumeID
518518
doc.ProvisioningSpec.DiskSelectorSpec.Match = cel.MustExpression(
519519
cel.ParseBooleanExpression(fmt.Sprintf("'%s' in disk.symlinks", disk.TypedSpec().Symlinks[0]), celenv.DiskLocator()),
520520
)
521521
doc.ProvisioningSpec.ProvisioningMinSize = blockcfg.MustByteSize("100MiB")
522-
doc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("1GiB")
522+
doc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("1GiB")
523523

524524
return doc
525525
})
526526

527+
configDocs = append(configDocs, xslices.Map(volumeIDs[1:], func(volumeID string) any {
528+
doc := blockcfg.NewUserVolumeConfigV1Alpha1()
529+
doc.MetaName = volumeID
530+
doc.ProvisioningSpec.DiskSelectorSpec.Match = cel.MustExpression(
531+
cel.ParseBooleanExpression(fmt.Sprintf("'%s' in disk.symlinks", disk.TypedSpec().Symlinks[0]), celenv.DiskLocator()),
532+
)
533+
doc.ProvisioningSpec.ProvisioningMinSize = blockcfg.MustByteSize("100MiB")
534+
doc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("20%")
535+
536+
return doc
537+
})...)
538+
527539
// create user volumes
528540
suite.PatchMachineConfig(ctx, configDocs...)
529541

@@ -979,7 +991,7 @@ func (suite *VolumesSuite) TestRawVolumes() {
979991
cel.ParseBooleanExpression(fmt.Sprintf("'%s' in disk.symlinks", disk.TypedSpec().Symlinks[0]), celenv.DiskLocator()),
980992
)
981993
doc.ProvisioningSpec.ProvisioningMinSize = blockcfg.MustByteSize("100MiB")
982-
doc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("500MiB")
994+
doc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("500MiB")
983995

984996
return doc
985997
})
@@ -1104,7 +1116,7 @@ func (suite *VolumesSuite) TestExistingVolumes() {
11041116
cel.ParseBooleanExpression(fmt.Sprintf("'%s' in disk.symlinks", disk.TypedSpec().Symlinks[0]), celenv.DiskLocator()),
11051117
)
11061118
userVolumeDoc.ProvisioningSpec.ProvisioningMinSize = blockcfg.MustByteSize("100MiB")
1107-
userVolumeDoc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("1GiB")
1119+
userVolumeDoc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("1GiB")
11081120

11091121
// create user volumes
11101122
suite.PatchMachineConfig(ctx, userVolumeDoc)
@@ -1299,7 +1311,7 @@ func (suite *VolumesSuite) TestSwapOnOff() {
12991311
},
13001312
}
13011313
doc.ProvisioningSpec.ProvisioningMinSize = blockcfg.MustByteSize("100MiB")
1302-
doc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustByteSize("500MiB")
1314+
doc.ProvisioningSpec.ProvisioningMaxSize = blockcfg.MustSize("500MiB")
13031315

13041316
// create user volumes
13051317
suite.PatchMachineConfig(ctx, doc)

pkg/machinery/api/resource/definitions/block/block.pb.go

Lines changed: 19 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)