xenconfig: add support for type="pvh"

Handle PVH domain type in both directions (xen-xl->xml, xml->xen-xl).
And add a test for it.

Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Reviewed-by: Jim Fehlig <jfehlig@suse.com>
This commit is contained in:
Marek Marczykowski-Górecki 2018-11-26 20:34:40 +01:00 committed by Jim Fehlig
parent 494fa1fd1b
commit 6262ea7148
6 changed files with 73 additions and 8 deletions

View File

@ -1090,7 +1090,7 @@ xenParseGeneralMeta(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps)
{
virCapsDomainDataPtr capsdata = NULL;
VIR_AUTOFREE(char *) str = NULL;
int hvm = 0, ret = -1;
int ret = -1;
if (xenConfigCopyString(conf, "name", &def->name) < 0)
goto out;
@ -1098,11 +1098,15 @@ xenParseGeneralMeta(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps)
if (xenConfigGetUUID(conf, "uuid", def->uuid) < 0)
goto out;
def->os.type = VIR_DOMAIN_OSTYPE_XEN;
if (xenConfigGetString(conf, "type", &str, NULL) == 0 && str) {
if (STREQ(str, "pv")) {
hvm = 0;
def->os.type = VIR_DOMAIN_OSTYPE_XEN;
} else if (STREQ(str, "pvh")) {
def->os.type = VIR_DOMAIN_OSTYPE_XENPVH;
} else if (STREQ(str, "hvm")) {
hvm = 1;
def->os.type = VIR_DOMAIN_OSTYPE_HVM;
} else {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("type %s is not supported"), str);
@ -1110,12 +1114,11 @@ xenParseGeneralMeta(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps)
}
} else {
if ((xenConfigGetString(conf, "builder", &str, "linux") == 0) &&
STREQ(str, "hvm"))
hvm = 1;
STREQ(str, "hvm")) {
def->os.type = VIR_DOMAIN_OSTYPE_HVM;
}
}
def->os.type = (hvm ? VIR_DOMAIN_OSTYPE_HVM : VIR_DOMAIN_OSTYPE_XEN);
if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
VIR_ARCH_NONE, def->virtType, NULL, NULL)))
goto out;

View File

@ -1287,6 +1287,11 @@ xenFormatXLOS(virConfPtr conf, virDomainDefPtr def)
/* XXX floppy disks */
} else {
if (def->os.type == VIR_DOMAIN_OSTYPE_XENPVH) {
if (xenConfigSetString(conf, "type", "pvh") < 0)
return -1;
}
if (def->os.bootloader &&
xenConfigSetString(conf, "bootloader", def->os.bootloader) < 0)
return -1;

View File

@ -17,7 +17,10 @@ testXLInitCaps(void)
"xenfv"
};
static const char *const xen_machines[] = {
"xenpv"
"xenpv",
};
static const char *const pvh_machines[] = {
"xenpvh",
};
if ((caps = virCapabilitiesNew(virArchFromHost(),
@ -51,6 +54,21 @@ testXLInitCaps(void)
goto cleanup;
machines = NULL;
if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_XEN, NULL,
NULL, 0, NULL) == NULL)
goto cleanup;
nmachines = ARRAY_CARDINALITY(pvh_machines);
if ((machines = virCapabilitiesAllocMachines(pvh_machines, nmachines)) == NULL)
goto cleanup;
if ((guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_XENPVH,
VIR_ARCH_X86_64,
"/usr/lib/xen/bin/qemu-system-i386",
NULL,
nmachines, machines)) == NULL)
goto cleanup;
machines = NULL;
if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_XEN, NULL,
NULL, 0, NULL) == NULL)
goto cleanup;

View File

@ -0,0 +1,13 @@
name = "XenGuest2"
uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809"
maxmem = 579
memory = 394
vcpus = 1
localtime = 0
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
type = "pvh"
kernel = "/tmp/vmlinuz"
ramdisk = "/tmp/initrd"
cmdline = "root=/dev/xvda1 console=hvc0"

View File

@ -0,0 +1,25 @@
<domain type='xen'>
<name>XenGuest2</name>
<uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>592896</memory>
<currentMemory unit='KiB'>403456</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='xenpvh'>xenpvh</type>
<kernel>/tmp/vmlinuz</kernel>
<initrd>/tmp/initrd</initrd>
<cmdline>root=/dev/xvda1 console=hvc0</cmdline>
</os>
<clock offset='utc' adjustment='reset'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<console type='pty'>
<target type='xen' port='0'/>
</console>
<input type='mouse' bus='xen'/>
<input type='keyboard' bus='xen'/>
<memballoon model='xen'/>
</devices>
</domain>

View File

@ -281,6 +281,7 @@ mymain(void)
DO_TEST("rbd-multihost-noauth");
DO_TEST_FORMAT("paravirt-type", false);
DO_TEST_FORMAT("fullvirt-type", false);
DO_TEST("pvh-type");
#ifdef LIBXL_HAVE_DEVICE_CHANNEL
DO_TEST("channel-pty");