The 'virDrvFeature' has a combination of features which are asserted by
the specific driver and features which are actually global.
In many cases the implementation was cargo-culted into newer drivers
without re-assesing whether it makes sense.
This patch introduces a global function which will specifically handle
these global flags and defer the rest to the driver.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/ch/ch_driver.c | 5 +++++
src/driver.c | 41 +++++++++++++++++++++++++++++++++++++
src/driver.h | 3 +++
src/esx/esx_driver.c | 4 ++++
src/libvirt_private.syms | 1 +
src/libxl/libxl_driver.c | 5 +++++
src/lxc/lxc_driver.c | 5 +++++
src/network/bridge_driver.c | 5 +++++
src/openvz/openvz_driver.c | 5 +++++
src/qemu/qemu_driver.c | 5 +++++
src/test/test_driver.c | 5 +++++
src/vz/vz_driver.c | 5 +++++
12 files changed, 89 insertions(+)
diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
index a0ff687d05..ac9298c0b5 100644
--- a/src/ch/ch_driver.c
+++ b/src/ch/ch_driver.c
@@ -919,9 +919,14 @@ static int
chConnectSupportsFeature(virConnectPtr conn,
int feature)
{
+ int supported;
+
if (virConnectSupportsFeatureEnsureACL(conn) < 0)
return -1;
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
+
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_TYPED_PARAM_STRING:
case VIR_DRV_FEATURE_NETWORK_UPDATE_HAS_CORRECT_ORDER:
diff --git a/src/driver.c b/src/driver.c
index 9ae95cb4c3..8c70662ccb 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -316,3 +316,44 @@ virConnectValidateURIPath(const char *uriPath,
return true;
}
+
+
+/**
+ * virDriverFeatureIsGlobal:
+ * @feat: a VIR_DRV_FEATURE
+ * @supported: If a feature is globally handled
+ *
+ * Certain driver feature flags are really not for individual drivers to decide
+ * whether they implement them or not, but are rather global based on e.g.
+ * whether the RPC protocol supports it.
+ *
+ * This function returns 'true' and fills @supported if a feature is a global
+ * feature and the individual driver implementations don't decide whether
+ * they support it or not.
+ */
+bool
+virDriverFeatureIsGlobal(virDrvFeature feat,
+ int *supported G_GNUC_UNUSED)
+
+{
+ switch (feat) {
+ case VIR_DRV_FEATURE_TYPED_PARAM_STRING:
+ case VIR_DRV_FEATURE_NETWORK_UPDATE_HAS_CORRECT_ORDER:
+ case VIR_DRV_FEATURE_FD_PASSING:
+ case VIR_DRV_FEATURE_MIGRATION_V2:
+ case VIR_DRV_FEATURE_MIGRATION_V3:
+ case VIR_DRV_FEATURE_MIGRATION_P2P:
+ case VIR_DRV_FEATURE_MIGRATE_CHANGE_PROTECTION:
+ case VIR_DRV_FEATURE_XML_MIGRATABLE:
+ case VIR_DRV_FEATURE_MIGRATION_OFFLINE:
+ case VIR_DRV_FEATURE_MIGRATION_PARAMS:
+ case VIR_DRV_FEATURE_MIGRATION_DIRECT:
+ case VIR_DRV_FEATURE_MIGRATION_V1:
+ case VIR_DRV_FEATURE_PROGRAM_KEEPALIVE:
+ case VIR_DRV_FEATURE_REMOTE:
+ case VIR_DRV_FEATURE_REMOTE_CLOSE_CALLBACK:
+ case VIR_DRV_FEATURE_REMOTE_EVENT_CALLBACK:
+ default:
+ return false;
+ }
+}
diff --git a/src/driver.h b/src/driver.h
index 7f45231f24..cd7cd96844 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -131,3 +131,6 @@ int virSetConnectStorage(virConnectPtr conn);
bool virConnectValidateURIPath(const char *uriPath,
const char *entityName,
bool privileged);
+
+bool virDriverFeatureIsGlobal(virDrvFeature feat,
+ int *supported);
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index 467740804a..3149f3e963 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -1018,6 +1018,10 @@ esxConnectSupportsFeature(virConnectPtr conn, int feature)
{
esxPrivate *priv = conn->privateData;
esxVI_Boolean supportsVMotion = esxVI_Boolean_Undefined;
+ int supported;
+
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_MIGRATION_V1:
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 2380f02b88..6f0d72ca38 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1528,6 +1528,7 @@ virStreamClass;
# driver.h
virConnectValidateURIPath;
+virDriverFeatureIsGlobal;
virDriverShouldAutostart;
virGetConnectInterface;
virGetConnectNetwork;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 4c61d330ed..478ab3e941 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -5697,9 +5697,14 @@ libxlConnectListAllDomains(virConnectPtr conn,
static int
libxlConnectSupportsFeature(virConnectPtr conn, int feature)
{
+ int supported;
+
if (virConnectSupportsFeatureEnsureACL(conn) < 0)
return -1;
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
+
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_MIGRATION_V3:
case VIR_DRV_FEATURE_TYPED_PARAM_STRING:
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index ff83557bac..020ec257ae 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -1618,9 +1618,14 @@ static int lxcStateCleanup(void)
static int
lxcConnectSupportsFeature(virConnectPtr conn, int feature)
{
+ int supported;
+
if (virConnectSupportsFeatureEnsureACL(conn) < 0)
return -1;
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
+
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_TYPED_PARAM_STRING:
case VIR_DRV_FEATURE_NETWORK_UPDATE_HAS_CORRECT_ORDER:
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 3750da7962..d6ae05360b 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -857,9 +857,14 @@ static int networkConnectIsAlive(virConnectPtr conn G_GNUC_UNUSED)
static int
networkConnectSupportsFeature(virConnectPtr conn, int feature)
{
+ int supported;
+
if (virConnectSupportsFeatureEnsureACL(conn) < 0)
return -1;
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
+
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_NETWORK_UPDATE_HAS_CORRECT_ORDER:
return 1;
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index b2589059c8..aa1db09540 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -1938,6 +1938,11 @@ openvzNodeGetCPUMap(virConnectPtr conn G_GNUC_UNUSED,
static int
openvzConnectSupportsFeature(virConnectPtr conn G_GNUC_UNUSED, int feature)
{
+ int supported;
+
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
+
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_MIGRATION_PARAMS:
case VIR_DRV_FEATURE_MIGRATION_V3:
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index f2620200f0..f1f708e511 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1173,9 +1173,14 @@ static int qemuConnectClose(virConnectPtr conn)
static int
qemuConnectSupportsFeature(virConnectPtr conn, int feature)
{
+ int supported;
+
if (virConnectSupportsFeatureEnsureACL(conn) < 0)
return -1;
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
+
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_MIGRATION_V2:
case VIR_DRV_FEATURE_MIGRATION_V3:
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 03c41ca192..4eca5c4a65 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1667,6 +1667,11 @@ static int
testConnectSupportsFeature(virConnectPtr conn G_GNUC_UNUSED,
int feature)
{
+ int supported;
+
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
+
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_TYPED_PARAM_STRING:
case VIR_DRV_FEATURE_NETWORK_UPDATE_HAS_CORRECT_ORDER:
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 86bc53d631..fc91b6dddf 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -3006,9 +3006,14 @@ vzDomainMigratePrepare3Params(virConnectPtr conn,
static int
vzConnectSupportsFeature(virConnectPtr conn G_GNUC_UNUSED, int feature)
{
+ int supported;
+
if (virConnectSupportsFeatureEnsureACL(conn) < 0)
return -1;
+ if (virDriverFeatureIsGlobal(feature, &supported))
+ return supported;
+
switch ((virDrvFeature) feature) {
case VIR_DRV_FEATURE_MIGRATION_PARAMS:
case VIR_DRV_FEATURE_MIGRATION_P2P:
--
2.35.1