qemu: Detect and fail a bad machine type earlier

Currently, newQemuArch() doesn't return an error.  So, if passed an invalid
machine type, it will return a technically valid, but unusable qemuArch
object, which will probably fail with other errors shortly down the track.

Change this, to more cleanly fail the newQemuArch itself, letting us
detect a bad machine type earlier.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
David Gibson
2020-06-23 00:38:10 +10:00
parent d6e7a58ac9
commit 97a02131c6
9 changed files with 82 additions and 41 deletions

View File

@@ -22,35 +22,36 @@ func qemuConfig(machineType string) HypervisorConfig {
}
}
func newTestQemu(machineType string) qemuArch {
func newTestQemu(assert *assert.Assertions, machineType string) qemuArch {
config := qemuConfig(machineType)
return newQemuArch(config)
arch, err := newQemuArch(config)
assert.NoError(err)
return arch
}
func TestQemuAmd64BadMachineType(t *testing.T) {
assert := assert.New(t)
amd64 := newTestQemu("no-such-machine-type")
amd64.bridges(5)
bridges := amd64.getBridges()
assert.Nil(bridges)
config := qemuConfig("no-such-machine-type")
_, err := newQemuArch(config)
assert.Error(err)
}
func TestQemuAmd64Capabilities(t *testing.T) {
assert := assert.New(t)
amd64 := newTestQemu(QemuPC)
amd64 := newTestQemu(assert, QemuPC)
caps := amd64.capabilities()
assert.True(caps.IsBlockDeviceHotplugSupported())
amd64 = newTestQemu(QemuQ35)
amd64 = newTestQemu(assert, QemuQ35)
caps = amd64.capabilities()
assert.True(caps.IsBlockDeviceHotplugSupported())
}
func TestQemuAmd64Bridges(t *testing.T) {
assert := assert.New(t)
amd64 := newTestQemu(QemuPC)
amd64 := newTestQemu(assert, QemuPC)
len := 5
amd64.bridges(uint32(len))
@@ -64,7 +65,7 @@ func TestQemuAmd64Bridges(t *testing.T) {
assert.NotNil(b.Devices)
}
amd64 = newTestQemu(QemuQ35)
amd64 = newTestQemu(assert, QemuQ35)
amd64.bridges(uint32(len))
bridges = amd64.getBridges()
assert.Len(bridges, len)
@@ -79,7 +80,7 @@ func TestQemuAmd64Bridges(t *testing.T) {
func TestQemuAmd64CPUModel(t *testing.T) {
assert := assert.New(t)
amd64 := newTestQemu(QemuPC)
amd64 := newTestQemu(assert, QemuPC)
expectedOut := defaultCPUModel
model := amd64.cpuModel()
@@ -101,7 +102,7 @@ func TestQemuAmd64CPUModel(t *testing.T) {
func TestQemuAmd64MemoryTopology(t *testing.T) {
assert := assert.New(t)
amd64 := newTestQemu(QemuPC)
amd64 := newTestQemu(assert, QemuPC)
memoryOffset := 1024
hostMem := uint64(100)
@@ -135,7 +136,8 @@ func TestQemuAmd64AppendImage(t *testing.T) {
cfg := qemuConfig(QemuPC)
cfg.ImagePath = f.Name()
cfg.DisableImageNvdimm = false
amd64 := newQemuArch(cfg)
amd64, err := newQemuArch(cfg)
assert.NoError(err)
for _, m := range amd64.(*qemuAmd64).supportedQemuMachines {
assert.Contains(m.Options, qemuNvdimmOption)
}
@@ -159,7 +161,8 @@ func TestQemuAmd64AppendImage(t *testing.T) {
assert.Equal(len(supportedQemuMachines), copy(supportedQemuMachines, machinesCopy))
cfg.DisableImageNvdimm = true
amd64 = newQemuArch(cfg)
amd64, err = newQemuArch(cfg)
assert.NoError(err)
for _, m := range amd64.(*qemuAmd64).supportedQemuMachines {
assert.NotContains(m.Options, qemuNvdimmOption)
}
@@ -185,7 +188,7 @@ func TestQemuAmd64AppendBridges(t *testing.T) {
assert := assert.New(t)
// check PC
amd64 := newTestQemu(QemuPC)
amd64 := newTestQemu(assert, QemuPC)
amd64.bridges(1)
bridges := amd64.getBridges()
@@ -208,7 +211,7 @@ func TestQemuAmd64AppendBridges(t *testing.T) {
assert.Equal(expectedOut, devices)
// Check Q35
amd64 = newTestQemu(QemuQ35)
amd64 = newTestQemu(assert, QemuQ35)
amd64.bridges(1)
bridges = amd64.getBridges()
@@ -237,7 +240,8 @@ func TestQemuAmd64WithInitrd(t *testing.T) {
cfg := qemuConfig(QemuPC)
cfg.InitrdPath = "dummy-initrd"
amd64 := newQemuArch(cfg)
amd64, err := newQemuArch(cfg)
assert.NoError(err)
for _, m := range amd64.(*qemuAmd64).supportedQemuMachines {
assert.NotContains(m.Options, qemuNvdimmOption)
@@ -249,7 +253,8 @@ func TestQemuAmd64Iommu(t *testing.T) {
config := qemuConfig(QemuQ35)
config.IOMMU = true
qemu := newQemuArch(config)
qemu, err := newQemuArch(config)
assert.NoError(err)
p := qemu.kernelParameters(false)
assert.Contains(p, Param{"intel_iommu", "on"})