conf: capabilities: Refactor API for setting guest capability features

Remove the need to pass around strings and switch to the enum values
instead.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2019-11-12 13:57:23 +01:00
parent 7a6e7bad1c
commit 9a2ca9c947
7 changed files with 77 additions and 97 deletions

View File

@ -557,49 +557,55 @@ static const struct virCapsGuestFeatureInfo virCapsGuestFeatureInfos[VIR_CAPS_GU
}; };
static void
virCapabilitiesAddGuestFeatureInternal(virCapsGuestPtr guest,
virCapsGuestFeatureType feature,
bool defaultOn,
bool toggle)
{
guest->features[feature].present = true;
if (virCapsGuestFeatureInfos[feature].togglesRequired) {
guest->features[feature].defaultOn = virTristateSwitchFromBool(defaultOn);
guest->features[feature].toggle = virTristateBoolFromBool(toggle);
}
}
/** /**
* virCapabilitiesAddGuestFeature: * virCapabilitiesAddGuestFeature:
* @guest: guest to associate feature with * @guest: guest to associate feature with
* @name: name of feature ('pae', 'acpi', 'apic') * @feature: feature to add
* @defaultOn: true if it defaults to on
* @toggle: true if its state can be toggled
* *
* Registers a feature for a guest domain. * Registers a feature for a guest domain.
*/ */
virCapsGuestFeaturePtr void
virCapabilitiesAddGuestFeature(virCapsGuestPtr guest, virCapabilitiesAddGuestFeature(virCapsGuestPtr guest,
const char *name, virCapsGuestFeatureType feature)
bool defaultOn,
bool toggle)
{ {
virCapsGuestFeaturePtr feature = NULL; virCapabilitiesAddGuestFeatureInternal(guest, feature, false, false);
bool togglesRequired = false;
size_t i;
for (i = 0; i < VIR_CAPS_GUEST_FEATURE_TYPE_LAST; i++) {
if (STRNEQ(name, virCapsGuestFeatureInfos[i].name))
continue;
feature = guest->features + i;
togglesRequired = virCapsGuestFeatureInfos[i].togglesRequired;
}
if (!feature) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("invalid feature '%s'"), name);
return NULL;
}
feature->present = true;
if (togglesRequired) {
feature->defaultOn = virTristateSwitchFromBool(defaultOn);
feature->toggle = virTristateBoolFromBool(toggle);
}
return feature;
} }
/**
* virCapabilitiesAddGuestFeatureWithToggle:
* @guest: guest to associate feature with
* @feature: feature to add
* @defaultOn: true if it defaults to on
* @toggle: true if its state can be toggled
*
* Registers a feature with toggles for a guest domain.
*/
void
virCapabilitiesAddGuestFeatureWithToggle(virCapsGuestPtr guest,
virCapsGuestFeatureType feature,
bool defaultOn,
bool toggle)
{
virCapabilitiesAddGuestFeatureInternal(guest, feature, defaultOn, toggle);
}
/** /**
* virCapabilitiesHostSecModelAddBaseLabel * virCapabilitiesHostSecModelAddBaseLabel
* @secmodel: Security model to add a base label for * @secmodel: Security model to add a base label for

View File

@ -283,11 +283,14 @@ virCapabilitiesAddGuestDomain(virCapsGuestPtr guest,
int nmachines, int nmachines,
virCapsGuestMachinePtr *machines); virCapsGuestMachinePtr *machines);
virCapsGuestFeaturePtr void
virCapabilitiesAddGuestFeature(virCapsGuestPtr guest, virCapabilitiesAddGuestFeature(virCapsGuestPtr guest,
const char *name, virCapsGuestFeatureType feature);
bool defaultOn, void
bool toggle); virCapabilitiesAddGuestFeatureWithToggle(virCapsGuestPtr guest,
virCapsGuestFeatureType feature,
bool defaultOn,
bool toggle);
int int
virCapabilitiesAddStoragePool(virCapsPtr caps, virCapabilitiesAddStoragePool(virCapsPtr caps,

View File

@ -46,6 +46,7 @@ virAccessPermStorageVolTypeToString;
virCapabilitiesAddGuest; virCapabilitiesAddGuest;
virCapabilitiesAddGuestDomain; virCapabilitiesAddGuestDomain;
virCapabilitiesAddGuestFeature; virCapabilitiesAddGuestFeature;
virCapabilitiesAddGuestFeatureWithToggle;
virCapabilitiesAddHostFeature; virCapabilitiesAddHostFeature;
virCapabilitiesAddHostMigrateTransport; virCapabilitiesAddHostMigrateTransport;
virCapabilitiesAddHostNUMACell; virCapabilitiesAddHostNUMACell;

View File

@ -547,46 +547,26 @@ libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps)
NULL) == NULL) NULL) == NULL)
return -1; return -1;
if (guest_archs[i].pae && if (guest_archs[i].pae)
virCapabilitiesAddGuestFeature(guest, virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_PAE);
"pae",
1,
0) == NULL)
return -1;
if (guest_archs[i].nonpae && if (guest_archs[i].nonpae)
virCapabilitiesAddGuestFeature(guest, virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_NONPAE);
"nonpae",
1,
0) == NULL)
return -1;
if (guest_archs[i].ia64_be && if (guest_archs[i].ia64_be)
virCapabilitiesAddGuestFeature(guest, virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_IA64_BE);
"ia64_be",
1,
0) == NULL)
return -1;
if (guest_archs[i].hvm) { if (guest_archs[i].hvm) {
if (virCapabilitiesAddGuestFeature(guest, virCapabilitiesAddGuestFeatureWithToggle(guest, VIR_CAPS_GUEST_FEATURE_TYPE_ACPI,
"acpi", true, true);
1,
1) == NULL)
return -1;
if (virCapabilitiesAddGuestFeature(guest, "apic", virCapabilitiesAddGuestFeatureWithToggle(guest, VIR_CAPS_GUEST_FEATURE_TYPE_APIC,
1, true, false);
0) == NULL)
return -1;
} }
if (guest_archs[i].hvm || guest_archs[i].pvh) { if (guest_archs[i].hvm || guest_archs[i].pvh) {
if (virCapabilitiesAddGuestFeature(guest, virCapabilitiesAddGuestFeatureWithToggle(guest, VIR_CAPS_GUEST_FEATURE_TYPE_HAP,
"hap", true, true);
1,
1) == NULL)
return -1;
} }
} }

View File

@ -849,14 +849,10 @@ virQEMUCapsInitGuestFromBinary(virCapsPtr caps,
/* CPU selection is always available, because all QEMU versions /* CPU selection is always available, because all QEMU versions
* we support can use at least '-cpu host' */ * we support can use at least '-cpu host' */
if (!virCapabilitiesAddGuestFeature(guest, "cpuselection", true, false)) virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_CPUSELECTION);
goto cleanup; virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_DEVICEBOOT);
virCapabilitiesAddGuestFeatureWithToggle(guest, VIR_CAPS_GUEST_FEATURE_TYPE_DISKSNAPSHOT,
if (!virCapabilitiesAddGuestFeature(guest, "deviceboot", true, false)) true, false);
goto cleanup;
if (!virCapabilitiesAddGuestFeature(guest, "disksnapshot", true, false))
goto cleanup;
if (virCapabilitiesAddGuestDomain(guest, if (virCapabilitiesAddGuestDomain(guest,
VIR_DOMAIN_VIRT_QEMU, VIR_DOMAIN_VIRT_QEMU,
@ -877,20 +873,18 @@ virQEMUCapsInitGuestFromBinary(virCapsPtr caps,
} }
} }
if ((ARCH_IS_X86(guestarch) || guestarch == VIR_ARCH_AARCH64) && if ((ARCH_IS_X86(guestarch) || guestarch == VIR_ARCH_AARCH64))
virCapabilitiesAddGuestFeature(guest, "acpi", true, true) == NULL) { virCapabilitiesAddGuestFeatureWithToggle(guest, VIR_CAPS_GUEST_FEATURE_TYPE_ACPI,
goto cleanup; true, true);
}
if (ARCH_IS_X86(guestarch) && if (ARCH_IS_X86(guestarch))
virCapabilitiesAddGuestFeature(guest, "apic", true, false) == NULL) { virCapabilitiesAddGuestFeatureWithToggle(guest, VIR_CAPS_GUEST_FEATURE_TYPE_APIC,
goto cleanup; true, false);
}
if ((guestarch == VIR_ARCH_I686) && if (guestarch == VIR_ARCH_I686) {
(virCapabilitiesAddGuestFeature(guest, "pae", true, false) == NULL || virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_PAE);
virCapabilitiesAddGuestFeature(guest, "nonpae", true, false) == NULL)) virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_NONPAE);
goto cleanup; }
ret = 0; ret = 0;

View File

@ -350,10 +350,8 @@ testBuildCapabilities(virConnectPtr conn)
NULL) == NULL) NULL) == NULL)
goto error; goto error;
if (virCapabilitiesAddGuestFeature(guest, "pae", true, true) == NULL) virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_PAE);
goto error; virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_NONPAE);
if (virCapabilitiesAddGuestFeature(guest, "nonpae", true, true) == NULL)
goto error;
} }
caps->host.nsecModels = 1; caps->host.nsecModels = 1;

View File

@ -110,8 +110,7 @@ testQemuAddI686Guest(virCapsPtr caps)
machines))) machines)))
goto error; goto error;
if (!virCapabilitiesAddGuestFeature(guest, "cpuselection", true, false)) virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_CPUSELECTION);
goto error;
machines = NULL; machines = NULL;
@ -161,8 +160,7 @@ testQemuAddX86_64Guest(virCapsPtr caps)
machines))) machines)))
goto error; goto error;
if (!virCapabilitiesAddGuestFeature(guest, "cpuselection", true, false)) virCapabilitiesAddGuestFeature(guest, VIR_CAPS_GUEST_FEATURE_TYPE_CPUSELECTION);
goto error;
machines = NULL; machines = NULL;