Introduce a number of new APIs to expose some boolean properties of objects, which cannot otherwise reliably determined, nor are aspects of the XML configuration. * virDomainIsActive: Checking virDomainGetID is not reliable since it is not possible to distinguish between error condition and inactive domain for ID of -1. * virDomainIsPersistent: Check whether a persistent config exists for the domain * virNetworkIsActive: Check whether the network is active * virNetworkIsPersistent: Check whether a persistent config exists for the network * virStoragePoolIsActive: Check whether the storage pool is active * virStoragePoolIsPersistent: Check whether a persistent config exists for the storage pool * virInterfaceIsActive: Check whether the host interface is active * virConnectIsSecure: whether the communication channel to the hypervisor is secure * virConnectIsEncrypted: whether any network based commnunication channels are encrypted NB, a channel can be secure, even if not encrypted, eg if it does not involve the network, like a UNIX socket, or pipe. --- include/libvirt/libvirt.h.in | 16 +++ src/driver.h | 34 +++++ src/esx/esx_driver.c | 4 + src/interface/netcf_driver.c | 1 + src/libvirt.c | 301 ++++++++++++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 13 ++ src/lxc/lxc_driver.c | 4 + src/network/bridge_driver.c | 2 + src/opennebula/one_driver.c | 4 + src/openvz/openvz_driver.c | 4 + src/phyp/phyp_driver.c | 4 + src/qemu/qemu_driver.c | 4 + src/remote/remote_driver.c | 10 ++ src/test/test_driver.c | 10 ++ src/uml/uml_driver.c | 4 + src/vbox/vbox_tmpl.c | 4 + src/xen/xen_driver.c | 4 + 17 files changed, 423 insertions(+), 0 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 6186d4e..05a164b 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -1649,6 +1649,22 @@ int virStreamAbort(virStreamPtr st); int virStreamFree(virStreamPtr st); +int virDomainIsActive(virDomainPtr dom); +int virDomainIsPersistent(virDomainPtr dom); + +int virNetworkIsActive(virNetworkPtr net); +int virNetworkIsPersistent(virNetworkPtr net); + +int virStoragePoolIsActive(virStoragePoolPtr pool); +int virStoragePoolIsPersistent(virStoragePoolPtr pool); + +int virInterfaceIsActive(virInterfacePtr iface); + +int virConnectIsEncrypted(virConnectPtr conn); +int virConnectIsSecure(virConnectPtr conn); + + + #ifdef __cplusplus } #endif diff --git a/src/driver.h b/src/driver.h index 0c8f923..7ab915d 100644 --- a/src/driver.h +++ b/src/driver.h @@ -337,6 +337,15 @@ typedef int unsigned long resource, const char *dom_xml); +typedef int + (*virDrvConnectIsEncrypted)(virConnectPtr conn); +typedef int + (*virDrvConnectIsSecure)(virConnectPtr conn); +typedef int + (*virDrvDomainIsActive)(virDomainPtr dom); +typedef int + (*virDrvDomainIsPersistent)(virDomainPtr dom); + /** * _virDriver: * @@ -418,6 +427,10 @@ struct _virDriver { virDrvNodeDeviceReAttach nodeDeviceReAttach; virDrvNodeDeviceReset nodeDeviceReset; virDrvDomainMigratePrepareTunnel domainMigratePrepareTunnel; + virDrvConnectIsEncrypted isEncrypted; + virDrvConnectIsSecure isSecure; + virDrvDomainIsActive domainIsActive; + virDrvDomainIsPersistent domainIsPersistent; }; typedef int @@ -462,6 +475,12 @@ typedef int (*virDrvNetworkSetAutostart) (virNetworkPtr network, int autostart); +typedef int + (*virDrvNetworkIsActive)(virNetworkPtr net); +typedef int + (*virDrvNetworkIsPersistent)(virNetworkPtr net); + + typedef struct _virNetworkDriver virNetworkDriver; typedef virNetworkDriver *virNetworkDriverPtr; @@ -495,6 +514,8 @@ struct _virNetworkDriver { virDrvNetworkGetBridgeName networkGetBridgeName; virDrvNetworkGetAutostart networkGetAutostart; virDrvNetworkSetAutostart networkSetAutostart; + virDrvNetworkIsActive networkIsActive; + virDrvNetworkIsPersistent networkIsPersistent; }; /*-------*/ @@ -534,6 +555,10 @@ typedef int (*virDrvInterfaceDestroy) (virInterfacePtr iface, unsigned int flags); +typedef int + (*virDrvInterfaceIsActive)(virInterfacePtr iface); + + typedef struct _virInterfaceDriver virInterfaceDriver; typedef virInterfaceDriver *virInterfaceDriverPtr; @@ -562,6 +587,7 @@ struct _virInterfaceDriver { virDrvInterfaceUndefine interfaceUndefine; virDrvInterfaceCreate interfaceCreate; virDrvInterfaceDestroy interfaceDestroy; + virDrvInterfaceIsActive interfaceIsActive; }; @@ -668,6 +694,12 @@ typedef virStorageVolPtr virStorageVolPtr clone, unsigned int flags); +typedef int + (*virDrvStoragePoolIsActive)(virStoragePoolPtr pool); +typedef int + (*virDrvStoragePoolIsPersistent)(virStoragePoolPtr pool); + + typedef struct _virStorageDriver virStorageDriver; typedef virStorageDriver *virStorageDriverPtr; @@ -719,6 +751,8 @@ struct _virStorageDriver { virDrvStorageVolGetInfo volGetInfo; virDrvStorageVolGetXMLDesc volGetXMLDesc; virDrvStorageVolGetPath volGetPath; + virDrvStoragePoolIsPersistent poolIsActive; + virDrvStoragePoolIsPersistent poolIsPersistent; }; #ifdef WITH_LIBVIRTD diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index e063b46..3a57613 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -3275,6 +3275,10 @@ static virDriver esxDriver = { NULL, /* nodeDeviceReAttach */ NULL, /* nodeDeviceReset */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; diff --git a/src/interface/netcf_driver.c b/src/interface/netcf_driver.c index ca14fb0..6742bbb 100644 --- a/src/interface/netcf_driver.c +++ b/src/interface/netcf_driver.c @@ -522,6 +522,7 @@ static virInterfaceDriver interfaceDriver = { interfaceUndefine, /* interfaceUndefine */ interfaceCreate, /* interfaceCreate */ interfaceDestroy, /* interfaceDestroy */ + NULL, /* interfaceIsActive */ }; int interfaceRegister(void) { diff --git a/src/libvirt.c b/src/libvirt.c index 9e87900..3244489 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -10321,3 +10321,304 @@ int virStreamFree(virStreamPtr stream) return (-1); return (0); } + + +/** + * virDomainIsActive: + * + * Determine if the domain is currently running + * + * Returns 1 if running, 0 if inactive, -1 on error + */ +int virDomainIsActive(virDomainPtr dom) +{ + DEBUG("dom=%p", dom); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_DOMAIN(dom)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (dom->conn->driver->domainIsActive) { + int ret; + ret = dom->conn->driver->domainIsActive(dom); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(dom->conn); + return -1; +} + +/** + * virDomainIsPersistent: + * + * Determine if the domain has a persistent configuration + * which means it will still exist after shutting down + * + * Returns 1 if persistent, 0 if transient, -1 on error + */ +int virDomainIsPersistent(virDomainPtr dom) +{ + DEBUG("dom=%p", dom); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_DOMAIN(dom)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (dom->conn->driver->domainIsPersistent) { + int ret; + ret = dom->conn->driver->domainIsPersistent(dom); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(dom->conn); + return -1; +} + +/** + * virNetworkIsActive: + * + * Determine if the network is currently running + * + * Returns 1 if running, 0 if inactive, -1 on error + */ +int virNetworkIsActive(virNetworkPtr net) +{ + DEBUG("net=%p", net); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_NETWORK(net)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (net->conn->networkDriver->networkIsActive) { + int ret; + ret = net->conn->networkDriver->networkIsActive(net); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(net->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(net->conn); + return -1; +} + + +/** + * virNetworkIsPersistent: + * + * Determine if the network has a persistent configuration + * which means it will still exist after shutting down + * + * Returns 1 if persistent, 0 if transient, -1 on error + */ +int virNetworkIsPersistent(virNetworkPtr net) +{ + DEBUG("net=%p", net); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_NETWORK(net)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (net->conn->networkDriver->networkIsPersistent) { + int ret; + ret = net->conn->networkDriver->networkIsPersistent(net); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(net->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(net->conn); + return -1; +} + + +/** + * virStoragePoolIsActive: + * + * Determine if the storage pool is currently running + * + * Returns 1 if running, 0 if inactive, -1 on error + */ +int virStoragePoolIsActive(virStoragePoolPtr pool) +{ + DEBUG("pool=%p", pool); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (pool->conn->storageDriver->poolIsActive) { + int ret; + ret = pool->conn->storageDriver->poolIsActive(pool); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(pool->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(pool->conn); + return -1; +} + + +/** + * virStoragePoolIsPersistent: + * + * Determine if the storagepool has a persistent configuration + * which means it will still exist after shutting down + * + * Returns 1 if persistent, 0 if transient, -1 on error + */ +int virStoragePoolIsPersistent(virStoragePoolPtr pool) +{ + DEBUG("pool=%p", pool); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (pool->conn->storageDriver->poolIsPersistent) { + int ret; + ret = pool->conn->storageDriver->poolIsPersistent(pool); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(pool->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(pool->conn); + return -1; +} + + +/** + * virInterfaceIsActive: + * + * Determine if the interface is currently running + * + * Returns 1 if running, 0 if inactive, -1 on error + */ +int virInterfaceIsActive(virInterfacePtr iface) +{ + DEBUG("iface=%p", iface); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_INTERFACE(iface)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (iface->conn->interfaceDriver->interfaceIsActive) { + int ret; + ret = iface->conn->interfaceDriver->interfaceIsActive(iface); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(iface->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(iface->conn); + return -1; +} + + +/** + * virConnectIsEncrypted: + * + * Determine if the connection to the hypervisor is encrypted + * + * Returns 1 if encrypted, 0 if not encrypted, -1 on error + */ +int virConnectIsEncrypted(virConnectPtr conn) +{ + DEBUG("conn=%p", conn); + + virResetLastError(); + + if (!VIR_IS_CONNECT(conn)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (conn->driver->isEncrypted) { + int ret; + ret = conn->driver->isEncrypted(conn); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(conn); + return -1; +} + +/** + * virConnectIsSecure: + * + * Determine if the connection to the hypervisor is secure + * + * A connection will be classed as secure if it is either + * encrypted, or running over a channel which is not exposed + * to eavesdropping (eg a UNIX domain socket, or pipe) + * + * Returns 1 if secure, 0 if secure, -1 on error + */ +int virConnectIsSecure(virConnectPtr conn) +{ + DEBUG("conn=%p", conn); + + virResetLastError(); + + if (!VIR_IS_CONNECT(conn)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return (-1); + } + if (conn->driver->isSecure) { + int ret; + ret = conn->driver->isSecure(conn); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + /* Copy to connection error object for back compatability */ + virSetConnError(conn); + return -1; +} diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 8921c1a..62fa6cf 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -329,4 +329,17 @@ LIBVIRT_0.7.2 { virDomainMigrateToURI; } LIBVIRT_0.7.1; +LIBVIRT_0.7.4 { + global: + virConnectIsEncrypted; + virConnectIsSecure; + virDomainIsActive; + virDomainIsPersistent; + virNetworkIsActive; + virNetworkIsPersistent; + virStoragePoolIsActive; + virStoragePoolIsPersistent; + virInterfaceIsActive; +} LIBVIRT_0.7.2; + # .... define new API here using predicted next version number .... diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 8224376..92502fe 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2348,6 +2348,10 @@ static virDriver lxcDriver = { NULL, /* nodeDeviceReAttach */ NULL, /* nodeDeviceReset */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; static virStateDriver lxcStateDriver = { diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 3c62636..311838c 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -1497,6 +1497,8 @@ static virNetworkDriver networkDriver = { networkGetBridgeName, /* networkGetBridgeName */ networkGetAutostart, /* networkGetAutostart */ networkSetAutostart, /* networkSetAutostart */ + NULL, /* networkIsActive */ + NULL, /* networkIsEncrypted */ }; static virStateDriver networkStateDriver = { diff --git a/src/opennebula/one_driver.c b/src/opennebula/one_driver.c index 9c6f120..9707bf8 100644 --- a/src/opennebula/one_driver.c +++ b/src/opennebula/one_driver.c @@ -788,6 +788,10 @@ static virDriver oneDriver = { NULL, /* nodeDeviceReAttach; */ NULL, /* nodeDeviceReset; */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; static virStateDriver oneStateDriver = { diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 57482b8..4d7f56c 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -1433,6 +1433,10 @@ static virDriver openvzDriver = { NULL, /* nodeDeviceReAttach */ NULL, /* nodeDeviceReset */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; int openvzRegister(void) { diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index ef465ed..cd0e9a7 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -1378,6 +1378,10 @@ virDriver phypDriver = { NULL, /* nodeDeviceReAttach */ NULL, /* nodeDeviceReset */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; int diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 03e8457..0264797 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7166,6 +7166,10 @@ static virDriver qemuDriver = { qemudNodeDeviceReAttach, /* nodeDeviceReAttach */ qemudNodeDeviceReset, /* nodeDeviceReset */ qemudDomainMigratePrepareTunnel, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index bf001eb..9a265ac 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -8449,6 +8449,10 @@ static virDriver remote_driver = { remoteNodeDeviceReAttach, /* nodeDeviceReAttach */ remoteNodeDeviceReset, /* nodeDeviceReset */ remoteDomainMigratePrepareTunnel, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; static virNetworkDriver network_driver = { @@ -8470,6 +8474,8 @@ static virNetworkDriver network_driver = { .networkGetBridgeName = remoteNetworkGetBridgeName, .networkGetAutostart = remoteNetworkGetAutostart, .networkSetAutostart = remoteNetworkSetAutostart, + .networkIsActive = NULL, + .networkIsPersistent = NULL, }; static virInterfaceDriver interface_driver = { @@ -8487,6 +8493,7 @@ static virInterfaceDriver interface_driver = { .interfaceUndefine = remoteInterfaceUndefine, .interfaceCreate = remoteInterfaceCreate, .interfaceDestroy = remoteInterfaceDestroy, + .interfaceIsActive = NULL, /* interfaceIsActive */ }; static virStorageDriver storage_driver = { @@ -8525,6 +8532,9 @@ static virStorageDriver storage_driver = { .volGetInfo = remoteStorageVolGetInfo, .volGetXMLDesc = remoteStorageVolDumpXML, .volGetPath = remoteStorageVolGetPath, + + .poolIsActive = NULL, /* poolIsActive */ + .poolIsPersistent = NULL, /* poolIsEncrypted */ }; static virSecretDriver secret_driver = { diff --git a/src/test/test_driver.c b/src/test/test_driver.c index b0f91de..88dc6a5 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4558,6 +4558,10 @@ static virDriver testDriver = { NULL, /* nodeDeviceReAttach */ NULL, /* nodeDeviceReset */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; static virNetworkDriver testNetworkDriver = { @@ -4579,6 +4583,8 @@ static virNetworkDriver testNetworkDriver = { testNetworkGetBridgeName, /* networkGetBridgeName */ testNetworkGetAutostart, /* networkGetAutostart */ testNetworkSetAutostart, /* networkSetAutostart */ + NULL, /* networkIsActive */ + NULL, /* networkIsEncrypted */ }; static virInterfaceDriver testInterfaceDriver = { @@ -4596,6 +4602,7 @@ static virInterfaceDriver testInterfaceDriver = { testInterfaceUndefine, /* interfaceUndefine */ testInterfaceCreate, /* interfaceCreate */ testInterfaceDestroy, /* interfaceDestroy */ + NULL, /* interfaceIsActive */ }; @@ -4636,6 +4643,9 @@ static virStorageDriver testStorageDriver = { .volGetInfo = testStorageVolumeGetInfo, .volGetXMLDesc = testStorageVolumeGetXMLDesc, .volGetPath = testStorageVolumeGetPath, + + .poolIsActive = NULL, /* poolIsActive */ + .poolIsPersistent = NULL, /* poolIsEncrypted */ }; static virDeviceMonitor testDevMonitor = { diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 6f60592..9b450d9 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -1862,6 +1862,10 @@ static virDriver umlDriver = { NULL, /* nodeDeviceReAttach */ NULL, /* nodeDeviceReset */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 4f43901..5878154 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -6468,6 +6468,10 @@ virDriver NAME(Driver) = { NULL, /* nodeDeviceReAttach */ NULL, /* nodeDeviceReset */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; virNetworkDriver NAME(NetworkDriver) = { diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 5273a11..da05253 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -1726,6 +1726,10 @@ static virDriver xenUnifiedDriver = { xenUnifiedNodeDeviceReAttach, /* nodeDeviceReAttach */ xenUnifiedNodeDeviceReset, /* nodeDeviceReset */ NULL, /* domainMigratePrepareTunnel */ + NULL, /* isEncrypted */ + NULL, /* isSecure */ + NULL, /* domainIsActive */ + NULL, /* domainIsEncrypted */ }; /** -- 1.6.2.5 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list