From 3312323db10758a3feef847d910450660b825d60 Mon Sep 17 00:00:00 2001 From: Achilleas Koutsou Date: Thu, 10 Feb 2022 20:22:51 +0100 Subject: [PATCH] disk: implement VolumeContainer interface for PartitionTable Co-Authored-By: Christian Kellner --- internal/disk/disk_test.go | 4 ++-- internal/disk/partition_table.go | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/internal/disk/disk_test.go b/internal/disk/disk_test.go index 800ea71c9..63e34d9af 100644 --- a/internal/disk/disk_test.go +++ b/internal/disk/disk_test.go @@ -66,9 +66,9 @@ func TestDisk_DynamicallyResizePartitionTable(t *testing.T) { // math/rand is good enough in this case /* #nosec G404 */ rng := rand.New(rand.NewSource(0)) - pt, err := CreatePartitionTable(mountpoints, 1024, &pt, rng) + newpt, err := NewPartitionTable(&pt, mountpoints, 1024, rng) assert.NoError(t, err) - assert.GreaterOrEqual(t, pt.SectorsToBytes(pt.Size), expectedSize) + assert.GreaterOrEqual(t, newpt.Size, expectedSize) } // common partition table that use used by tests diff --git a/internal/disk/partition_table.go b/internal/disk/partition_table.go index a1181a776..7ee594ec8 100644 --- a/internal/disk/partition_table.go +++ b/internal/disk/partition_table.go @@ -283,6 +283,39 @@ func (pt *PartitionTable) EnsureSize(s uint64) bool { return false } +func (pt *PartitionTable) CreateVolume(mountpoint string, size uint64) (Entity, error) { + filesystem := Filesystem{ + Type: "xfs", + Mountpoint: mountpoint, + FSTabOptions: "defaults", + FSTabFreq: 0, + FSTabPassNo: 0, + } + + partition := Partition{ + Size: size, + Payload: &filesystem, + } + + n := len(pt.Partitions) + var maxNo int + + if pt.Type == "gpt" { + partition.Type = FilesystemDataGUID + maxNo = 128 + } else { + maxNo = 4 + } + + if n == maxNo { + return nil, fmt.Errorf("maximum number of partitions reached (%d)", maxNo) + } + + pt.Partitions = append(pt.Partitions, partition) + + return &pt.Partitions[len(pt.Partitions)-1], nil +} + type EntityCallback func(e Entity, path []Entity) error func forEachEntity(e Entity, path []Entity, cb EntityCallback) error {