mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
test_driver: provide basic disk hotunplug support
Signed-off-by: John Levon <john.levon@nutanix.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
c530a96151
commit
4be361a385
@ -10755,6 +10755,71 @@ testDomainDetachPrepNet(virDomainObj *vm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
testDomainDetachPrepDisk(virDomainObj *vm,
|
||||||
|
virDomainDiskDef *match,
|
||||||
|
virDomainDiskDef **detach)
|
||||||
|
{
|
||||||
|
virDomainDiskDef *disk;
|
||||||
|
|
||||||
|
if (!(disk = virDomainDiskByTarget(vm->def, match->dst))) {
|
||||||
|
virReportError(VIR_ERR_DEVICE_MISSING,
|
||||||
|
_("disk %1$s not found"), match->dst);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ((virDomainDiskDevice) disk->device) {
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_DISK:
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_LUN:
|
||||||
|
|
||||||
|
switch (disk->bus) {
|
||||||
|
case VIR_DOMAIN_DISK_BUS_VIRTIO:
|
||||||
|
case VIR_DOMAIN_DISK_BUS_USB:
|
||||||
|
case VIR_DOMAIN_DISK_BUS_SCSI:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DISK_BUS_IDE:
|
||||||
|
case VIR_DOMAIN_DISK_BUS_FDC:
|
||||||
|
case VIR_DOMAIN_DISK_BUS_XEN:
|
||||||
|
case VIR_DOMAIN_DISK_BUS_UML:
|
||||||
|
case VIR_DOMAIN_DISK_BUS_SATA:
|
||||||
|
case VIR_DOMAIN_DISK_BUS_SD:
|
||||||
|
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||||
|
_("This type of disk cannot be hot unplugged"));
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DISK_BUS_NONE:
|
||||||
|
case VIR_DOMAIN_DISK_BUS_LAST:
|
||||||
|
default:
|
||||||
|
virReportEnumRangeError(virDomainDiskBus, disk->bus);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_CDROM:
|
||||||
|
if (disk->bus == VIR_DOMAIN_DISK_BUS_USB ||
|
||||||
|
disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
G_GNUC_FALLTHROUGH;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
|
||||||
|
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
||||||
|
_("disk device type '%1$s' cannot be detached"),
|
||||||
|
virDomainDiskDeviceTypeToString(disk->device));
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_LAST:
|
||||||
|
default:
|
||||||
|
virReportEnumRangeError(virDomainDiskDevice, disk->device);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*detach = disk;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
testDomainRemoveHostDevice(testDriver *driver G_GNUC_UNUSED,
|
testDomainRemoveHostDevice(testDriver *driver G_GNUC_UNUSED,
|
||||||
virDomainObj *vm,
|
virDomainObj *vm,
|
||||||
@ -10824,6 +10889,28 @@ testDomainRemoveNetDevice(testDriver *driver G_GNUC_UNUSED,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
testDomainRemoveDiskDevice(testDriver *driver G_GNUC_UNUSED,
|
||||||
|
virDomainObj *vm,
|
||||||
|
virDomainDiskDef *disk)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
VIR_DEBUG("Removing disk %s from domain %p %s",
|
||||||
|
disk->info.alias, vm, vm->def->name);
|
||||||
|
|
||||||
|
for (i = 0; i < vm->def->ndisks; i++) {
|
||||||
|
if (vm->def->disks[i] == disk) {
|
||||||
|
virDomainDiskRemove(vm->def, i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virDomainDiskDefFree(disk);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
testDomainRemoveDevice(testDriver *driver,
|
testDomainRemoveDevice(testDriver *driver,
|
||||||
virDomainObj *vm,
|
virDomainObj *vm,
|
||||||
@ -10849,8 +10936,11 @@ testDomainRemoveDevice(testDriver *driver,
|
|||||||
if (testDomainRemoveHostDevice(driver, vm, dev->data.hostdev) < 0)
|
if (testDomainRemoveHostDevice(driver, vm, dev->data.hostdev) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
case VIR_DOMAIN_DEVICE_NONE:
|
|
||||||
case VIR_DOMAIN_DEVICE_DISK:
|
case VIR_DOMAIN_DEVICE_DISK:
|
||||||
|
if (testDomainRemoveDiskDevice(driver, vm, dev->data.disk) < 0)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_DEVICE_NONE:
|
||||||
case VIR_DOMAIN_DEVICE_LEASE:
|
case VIR_DOMAIN_DEVICE_LEASE:
|
||||||
case VIR_DOMAIN_DEVICE_FS:
|
case VIR_DOMAIN_DEVICE_FS:
|
||||||
case VIR_DOMAIN_DEVICE_INPUT:
|
case VIR_DOMAIN_DEVICE_INPUT:
|
||||||
@ -10914,8 +11004,14 @@ testDomainDetachDeviceLive(testDriver *driver,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DEVICE_NONE:
|
|
||||||
case VIR_DOMAIN_DEVICE_DISK:
|
case VIR_DOMAIN_DEVICE_DISK:
|
||||||
|
if (testDomainDetachPrepDisk(vm, match->data.disk,
|
||||||
|
&detach.data.disk) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DEVICE_NONE:
|
||||||
case VIR_DOMAIN_DEVICE_LEASE:
|
case VIR_DOMAIN_DEVICE_LEASE:
|
||||||
case VIR_DOMAIN_DEVICE_FS:
|
case VIR_DOMAIN_DEVICE_FS:
|
||||||
case VIR_DOMAIN_DEVICE_INPUT:
|
case VIR_DOMAIN_DEVICE_INPUT:
|
||||||
|
Loading…
Reference in New Issue
Block a user