debian-forge-composer/internal/osbuild2/device_test.go
Christian Kellner 670b936e6b osbuild2: new GenDeviceFinishStages method
This should be called at the end of the pipeline that creates an
image, to add stages that are needed to finish up the image.
Currently the only stage that will be added is the `lvm2.metadata`
stage in the case the partition layout contains LVM2.

Co-Authored-By: Achilleas Koutsou <achilleas@koutsou.net>
2022-02-22 19:23:41 +00:00

116 lines
3.5 KiB
Go

package osbuild2
import (
"math/rand"
"testing"
"github.com/osbuild/osbuild-composer/internal/blueprint"
"github.com/osbuild/osbuild-composer/internal/disk"
"github.com/stretchr/testify/assert"
)
func TestGenDeviceCreationStages(t *testing.T) {
assert := assert.New(t)
// math/rand is good enough in this case
/* #nosec G404 */
rng := rand.New(rand.NewSource(13))
luks_lvm := testPartitionTables["luks+lvm"]
pt, err := disk.NewPartitionTable(&luks_lvm, []blueprint.FilesystemCustomization{}, 0, rng)
assert.NoError(err)
stages := GenDeviceCreationStages(pt, "image.raw")
// we should have two stages
assert.Equal(len(stages), 2)
// first one should be a "org.osbuild.luks2.format"
luks := stages[0]
assert.Equal(luks.Type, "org.osbuild.luks2.format")
// it needs to have one device
assert.Equal(len(luks.Devices), 1)
// the device should be called `device`
device, ok := luks.Devices["device"]
assert.True(ok, "Need device called `device`")
// device should be a loopback device
assert.Equal(device.Type, "org.osbuild.loopback")
lvm := stages[1]
assert.Equal(lvm.Type, "org.osbuild.lvm2.create")
lvmOptions, ok := lvm.Options.(*LVM2CreateStageOptions)
assert.True(ok, "Need LVM2CreateStageOptions for org.osbuild.lvm2.create")
// LVM should have two volumes
assert.Equal(len(lvmOptions.Volumes), 2)
rootlv := lvmOptions.Volumes[0]
assert.Equal(rootlv.Name, "rootlv")
homelv := lvmOptions.Volumes[1]
assert.Equal(homelv.Name, "homelv")
// it needs to have two(!) devices, the loopback and the luks
assert.Equal(len(lvm.Devices), 2)
// this is the target one, which should be the luks one
device, ok = lvm.Devices["device"]
assert.True(ok, "Need device called `device`")
assert.Equal(device.Type, "org.osbuild.luks2")
assert.NotEmpty(device.Parent, "Need a parent device for LUKS on loopback")
luksOptions, ok := device.Options.(*LUKS2DeviceOptions)
assert.True(ok, "Need LUKS2DeviceOptions for luks device")
assert.Equal(luksOptions.Passphrase, "osbuild")
parent, ok := lvm.Devices[device.Parent]
assert.True(ok, "Need device called `device`")
assert.Equal(parent.Type, "org.osbuild.loopback")
}
func TestGenDeviceFinishStages(t *testing.T) {
assert := assert.New(t)
// math/rand is good enough in this case
/* #nosec G404 */
rng := rand.New(rand.NewSource(13))
luks_lvm := testPartitionTables["luks+lvm"]
pt, err := disk.NewPartitionTable(&luks_lvm, []blueprint.FilesystemCustomization{}, 0, rng)
assert.NoError(err)
stages := GenDeviceFinishStages(pt, "image.raw")
// we should have one stage
assert.Equal(1, len(stages))
// it should be a "org.osbuild.lvm2.metadata"
lvm := stages[0]
assert.Equal("org.osbuild.lvm2.metadata", lvm.Type)
// it should have two devices
assert.Equal(2, len(lvm.Devices))
// this is the target one, which should be the luks one
device, ok := lvm.Devices["device"]
assert.True(ok, "Need device called `device`")
assert.Equal("org.osbuild.luks2", device.Type)
assert.NotEmpty(device.Parent, "Need a parent device for LUKS on loopback")
luksOptions, ok := device.Options.(*LUKS2DeviceOptions)
assert.True(ok, "Need LUKS2DeviceOptions for luks device")
assert.Equal("osbuild", luksOptions.Passphrase)
parent, ok := lvm.Devices[device.Parent]
assert.True(ok, "Need device called `device`")
assert.Equal("org.osbuild.loopback", parent.Type)
opts, ok := lvm.Options.(*LVM2MetadataStageOptions)
assert.True(ok, "Need LVM2MetadataStageOptions for org.osbuild.lvm2.metadata")
assert.Equal("root", opts.VGName)
}