[libvirt] [sVirt] Question about virSecuritySELinuxSetSecurityAllLabel()
by H Changyao
Hi,
I am studying sVirt,i have some questions about
virSecuritySELinuxSetSecurityAllLabel() function (below AllLabel()
instead)in src/security/security_selinux.c.
>From some materials, i have understood how sVirt works.
AllLabel() is responsible to label "object",in most materials,
"object" represents image files, howerver, in AllLabel(),i find there
are some other "object"(Hostdev,TPMFile,Chardev,Smartcard,os.kernel,
os.initrd,os.dtb) to be labeled.
I have question about the scope of "object",besides labeling image
files,is those other object necessary to be labeled to guarantee sVirt
to achieve strong isolation.
10 years, 9 months
[libvirt] [for 1.2.6 PATCH] qemu: snapshot: Save persistent domain config when taking external snapshot
by Peter Krempa
Commit 55bbb011b965c7962933604c70f61cef45e8ec04 introduced a regression
where we forgot to save the persistent domain configuration after a
external snapshot. This would make libvirt forget the snapshots and
effectively revert to the previous state in the following scenario:
1) Start VM
2) Take snapshot
3) Destroy VM
4) Restart libvirtd
Also fix spurious blank line added by patch mentioned above.
---
src/qemu/qemu_driver.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index d34da6f..775f6ab 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13126,8 +13126,10 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver,
int indx = virDomainDiskIndexByName(vm->newDef,
vm->def->disks[i]->dst,
false);
- if (indx >= 0)
+ if (indx >= 0) {
persistDisk = vm->newDef->disks[indx];
+ persist = true;
+ }
}
ret = qemuDomainSnapshotCreateSingleDiskActive(driver, vm,
@@ -13173,7 +13175,6 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver,
persistDisk = vm->newDef->disks[indx];
persist = true;
}
-
}
qemuDomainSnapshotUndoSingleDiskActive(driver, vm,
--
1.9.3
10 years, 9 months
[libvirt] Track an error
by David kiarie
Hi there,
Just a silly question, do we have a simpler way of checking where
exactly a test is failing.The tests are failing after hacking stuff
around.
I have this error
../build-aux/test-driver: line 95: 20128 Segmentation fault "$@"
> $log_file 2>&1
Yes am having a segfault!
I don't know how to track it, well, I could review the whole file but
is there some other method I am missing.Could you help me interpret
the error, what does 20128 stand for?
10 years, 9 months
[libvirt] [PATCH 0/2] memdev device: add share argument for type=file
by Michele Paolino
This patch enables the possibility to run a qemu virtual machine with the
share option for the memory-backend-file. The xml description looks like:
<memdev type='file' share='on'>
<name>ram0</name>
<source mem-path='/hugetlbfs'/>
<capacity unit='MiB'>1024</capacity>
</memdev>
This work is based on the previous work of Chen Fan[1].
We are aware of the existing conflict with the previous numa patches[2].
We are sharing this because it is a dependency for some use cases of the
qemu vhost-user support(e.g. snabbswitch).
[1] http://www.redhat.com/archives/libvir-list/2014-June/msg01195.html
[2] http://www.redhat.com/archives/libvir-list/2014-June/msg00201.html
Michele Paolino (2):
Add share argument to memdev devices(type=file)
Documentation and test for the share argument in memdev device
docs/formatdomain.html.in | 7 +++++++
docs/schemas/domaincommon.rng | 3 +++
src/conf/domain_conf.c | 16 ++++++++++++++++
src/conf/domain_conf.h | 1 +
src/qemu/qemu_command.c | 3 +++
tests/qemuxml2argvdata/qemuxml2argv-cpu-numa4.args | 2 +-
tests/qemuxml2argvdata/qemuxml2argv-cpu-numa4.xml | 2 +-
7 files changed, 32 insertions(+), 2 deletions(-)
--
1.9.3
10 years, 9 months
[libvirt] Entering freeze for libvirt-1.2.6
by Daniel Veillard
As stated yesterday, we just entered freeze for libvirt-1.2.6,
I have pushed a first release candidate tarball and signed rpms
at the usual place:
ftp://libvirt.org/libvirt/
I gave it a try and with my limited testing it looks okay, but
please have a look and test. The goal is to make the release on
Tues 1st if all goes well.
Also of note I will likely move the libvirt.org server Monday
morning (chinese time i.e. sunday for most), it should be quick,
just that if you hit the old IP untim DNS propagates you may
have the old server (I will block ssh access after the move on
the old to avoid split pushes)
Daniel
--
Daniel Veillard | Open Source and Standards, Red Hat
veillard(a)redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | virtualization library http://libvirt.org/
10 years, 9 months
[libvirt] [PATCH] net: merge virNetworkGetDHCPLeases and virNetworkGetDHCPLeasesForMAC
by Peter Krempa
Instead of maintaining two very similar APIs, add the "@mac" parameter
to virNetworkGetDHCPLeases and kill virNetworkGetDHCPLeasesForMAC. Both
of those functions would return data the same way, so making @mac an
optional filter simplifies a lot of stuff.
---
daemon/remote.c | 69 +-----------------------------------------
include/libvirt/libvirt.h.in | 6 +---
src/driver.h | 8 +----
src/libvirt.c | 70 ++++++-------------------------------------
src/libvirt_public.syms | 1 -
src/network/bridge_driver.c | 69 +++++++++++-------------------------------
src/remote/remote_driver.c | 71 ++------------------------------------------
src/remote/remote_protocol.x | 20 ++-----------
src/remote_protocol-structs | 15 +---------
tools/virsh-network.c | 5 +---
10 files changed, 35 insertions(+), 299 deletions(-)
diff --git a/daemon/remote.c b/daemon/remote.c
index 9ffc1cb..ea16789 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -6292,6 +6292,7 @@ remoteDispatchNetworkGetDHCPLeases(virNetServerPtr server ATTRIBUTE_UNUSED,
goto cleanup;
if ((nleases = virNetworkGetDHCPLeases(net,
+ args->mac ? *args->mac : NULL,
args->need_results ? &leases : NULL,
args->flags)) < 0)
goto cleanup;
@@ -6336,74 +6337,6 @@ remoteDispatchNetworkGetDHCPLeases(virNetServerPtr server ATTRIBUTE_UNUSED,
}
-static int
-remoteDispatchNetworkGetDHCPLeasesForMAC(virNetServerPtr server ATTRIBUTE_UNUSED,
- virNetServerClientPtr client,
- virNetMessagePtr msg ATTRIBUTE_UNUSED,
- virNetMessageErrorPtr rerr,
- remote_network_get_dhcp_leases_for_mac_args *args,
- remote_network_get_dhcp_leases_for_mac_ret *ret)
-{
- int rv = -1;
- size_t i;
- struct daemonClientPrivate *priv = virNetServerClientGetPrivateData(client);
- virNetworkDHCPLeasePtr *leases = NULL;
- virNetworkPtr net = NULL;
- int nleases = 0;
-
- if (!priv->conn) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
- goto cleanup;
- }
-
- if (!(net = get_nonnull_network(priv->conn, args->net)))
- goto cleanup;
-
- if ((nleases = virNetworkGetDHCPLeasesForMAC(net, args->mac,
- args->need_results ? &leases : NULL,
- args->flags)) < 0)
- goto cleanup;
-
- if (nleases > REMOTE_NETWORK_DHCP_LEASES_MAX) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Number of leases is %d, which exceeds max limit: %d"),
- nleases, REMOTE_NETWORK_DHCP_LEASES_MAX);
- return -1;
- }
-
- if (leases && nleases) {
- if (VIR_ALLOC_N(ret->leases.leases_val, nleases) < 0)
- goto cleanup;
-
- ret->leases.leases_len = nleases;
-
- for (i = 0; i < nleases; i++) {
- if (remoteSerializeDHCPLease(ret->leases.leases_val + i, leases[i]) < 0)
- goto cleanup;
- }
-
- } else {
- ret->leases.leases_len = 0;
- ret->leases.leases_val = NULL;
- }
-
- ret->ret = nleases;
-
- rv = 0;
-
- cleanup:
- if (rv < 0)
- virNetMessageSaveError(rerr);
- if (leases) {
- for (i = 0; i < nleases; i++)
- virNetworkDHCPLeaseFree(leases[i]);
- VIR_FREE(leases);
- }
- virNetworkFree(net);
- return rv;
-}
-
-
/*----- Helpers. -----*/
/* get_nonnull_domain and get_nonnull_network turn an on-wire
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 594521e..032d6e6 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -5169,14 +5169,10 @@ struct _virNetworkDHCPLease {
void virNetworkDHCPLeaseFree(virNetworkDHCPLeasePtr lease);
int virNetworkGetDHCPLeases(virNetworkPtr network,
+ const char *mac,
virNetworkDHCPLeasePtr **leases,
unsigned int flags);
-int virNetworkGetDHCPLeasesForMAC(virNetworkPtr network,
- const char *mac,
- virNetworkDHCPLeasePtr **leases,
- unsigned int flags);
-
/**
* virConnectNetworkEventGenericCallback:
* @conn: the connection pointer
diff --git a/src/driver.h b/src/driver.h
index 6e72e92..5018068 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -1184,15 +1184,10 @@ typedef int
typedef int
(*virDrvNetworkGetDHCPLeases)(virNetworkPtr network,
+ const char *mac,
virNetworkDHCPLeasePtr **leases,
unsigned int flags);
-typedef int
-(*virDrvNetworkGetDHCPLeasesForMAC)(virNetworkPtr network,
- const char *mac,
- virNetworkDHCPLeasePtr **leases,
- unsigned int flags);
-
typedef struct _virDriver virDriver;
typedef virDriver *virDriverPtr;
@@ -1546,7 +1541,6 @@ struct _virNetworkDriver {
virDrvNetworkIsActive networkIsActive;
virDrvNetworkIsPersistent networkIsPersistent;
virDrvNetworkGetDHCPLeases networkGetDHCPLeases;
- virDrvNetworkGetDHCPLeasesForMAC networkGetDHCPLeasesForMAC;
};
diff --git a/src/libvirt.c b/src/libvirt.c
index 566f984..49c9d16 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -21014,6 +21014,7 @@ virNodeGetFreePages(virConnectPtr conn,
/**
* virNetworkGetDHCPLeases:
* @network: Pointer to network object
+ * @mac: Optional ASCII formatted MAC address of an interface
* @leases: Pointer to a variable to store the array containing details on
* obtained leases, or NULL if the list is not required (just returns
* number of leases).
@@ -21040,6 +21041,11 @@ virNodeGetFreePages(virConnectPtr conn,
* Note: @mac, @iaid, @ipaddr, @clientid are in ASCII form, not raw bytes.
* Note: @expirytime can 0, in case the lease is for infinite time.
*
+ * The API fetches leases info of guests in the specified network. If the
+ * optional parameter @mac is specified, the returned list will contain only
+ * lease info about a specific guest interface with @mac. There can be
+ * multiple leases for a single @mac because this API supports DHCPv6 too.
+ *
* Returns the number of leases found or -1 and sets @leases to NULL in
* case of error. On success, the array stored into @leases is guaranteed to
* have an extra allocated element set to NULL but not included in the return
@@ -21057,7 +21063,7 @@ virNodeGetFreePages(virConnectPtr conn,
* int nleases;
* unsigned int flags = 0;
*
- * nleases = virNetworkGetDHCPLeases(network, &leases, flags);
+ * nleases = virNetworkGetDHCPLeases(network, NULL, &leases, flags);
* if (nleases < 0)
* error();
*
@@ -21079,6 +21085,7 @@ virNodeGetFreePages(virConnectPtr conn,
*/
int
virNetworkGetDHCPLeases(virNetworkPtr network,
+ const char *mac,
virNetworkDHCPLeasePtr **leases,
unsigned int flags)
{
@@ -21097,7 +21104,7 @@ virNetworkGetDHCPLeases(virNetworkPtr network,
if (conn->networkDriver && conn->networkDriver->networkGetDHCPLeases) {
int ret;
- ret = conn->networkDriver->networkGetDHCPLeases(network, leases, flags);
+ ret = conn->networkDriver->networkGetDHCPLeases(network, mac, leases, flags);
if (ret < 0)
goto error;
return ret;
@@ -21110,65 +21117,6 @@ virNetworkGetDHCPLeases(virNetworkPtr network,
return -1;
}
-/**
- * virNetworkGetDHCPLeasesForMAC:
- * @network: Pointer to network object
- * @mac: ASCII formatted MAC address of an interface
- * @leases: Pointer to a variable to store the array containing details on
- * obtained leases, or NULL if the list is not required (just returns
- * number of leases).
- * @flags: extra flags, not used yet, so callers should always pass 0
- *
- * The API fetches leases info of the interface which matches with the
- * given @mac. There can be multiple leases for a single @mac because this
- * API supports DHCPv6 too.
- *
- * Returns the number of leases found or -1 and sets @leases to NULL in case of
- * error. On success, the array stored into @leases is guaranteed to have an
- * extra allocated element set to NULL but not included in the return count,
- * to make iteration easier. The caller is responsible for calling
- * virNetworkDHCPLeaseFree() on each array element, then calling free() on @leases.
- *
- * See virNetworkGetDHCPLeases() for more details on list contents.
- */
-int
-virNetworkGetDHCPLeasesForMAC(virNetworkPtr network,
- const char *mac,
- virNetworkDHCPLeasePtr **leases,
- unsigned int flags)
-{
- virConnectPtr conn;
-
- VIR_DEBUG("network=%p, mac=%s, leases=%p, flags=%x",
- network, mac, leases, flags);
-
- virResetLastError();
-
- if (leases)
- *leases = NULL;
-
- virCheckNonNullArgGoto(mac, error);
-
- virCheckNetworkReturn(network, -1);
-
- conn = network->conn;
-
- if (conn->networkDriver &&
- conn->networkDriver->networkGetDHCPLeasesForMAC) {
- int ret;
- ret = conn->networkDriver->networkGetDHCPLeasesForMAC(network, mac,
- leases, flags);
- if (ret < 0)
- goto error;
- return ret;
- }
-
- virReportUnsupportedError();
-
- error:
- virDispatchError(network->conn);
- return -1;
-}
/**
* virNetworkDHCPLeaseFree:
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index f64462e..65a5b43 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -663,7 +663,6 @@ LIBVIRT_1.2.6 {
virNodeGetFreePages;
virNetworkDHCPLeaseFree;
virNetworkGetDHCPLeases;
- virNetworkGetDHCPLeasesForMAC;
} LIBVIRT_1.2.5;
# .... define new API here using predicted next version number ....
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 1c20b66..0ece432 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -3369,9 +3369,10 @@ static int networkSetAutostart(virNetworkPtr net,
}
static int
-networkGetDHCPLeasesHelper(virNetworkObjPtr obj,
- const char *mac,
- virNetworkDHCPLeasePtr **leases)
+networkGetDHCPLeases(virNetworkPtr network,
+ const char *mac,
+ virNetworkDHCPLeasePtr **leases,
+ unsigned int flags)
{
size_t i, j;
size_t nleases = 0;
@@ -3391,6 +3392,15 @@ networkGetDHCPLeasesHelper(virNetworkObjPtr obj,
virNetworkIpDefPtr ipdef_tmp = NULL;
virNetworkDHCPLeasePtr lease = NULL;
virNetworkDHCPLeasePtr *leases_ret = NULL;
+ virNetworkObjPtr obj;
+
+ virCheckFlags(0, -1);
+
+ if (!(obj = networkObjFromNetwork(network)))
+ return -1;
+
+ if (virNetworkGetDHCPLeasesEnsureACL(network->conn, obj->def) < 0)
+ goto cleanup;
/* Retrieve custom leases file location */
custom_lease_file = networkDnsmasqLeaseFileNameCustom(obj->def->bridge);
@@ -3530,6 +3540,10 @@ networkGetDHCPLeasesHelper(virNetworkObjPtr obj,
VIR_FREE(lease_entries);
VIR_FREE(custom_lease_file);
virJSONValueFree(leases_array);
+
+ if (obj)
+ virNetworkObjUnlock(obj);
+
return rv;
error:
@@ -3541,54 +3555,6 @@ networkGetDHCPLeasesHelper(virNetworkObjPtr obj,
goto cleanup;
}
-static int
-networkGetDHCPLeases(virNetworkPtr network,
- virNetworkDHCPLeasePtr **leases,
- unsigned int flags)
-{
- int rv = -1;
- virNetworkObjPtr obj;
-
- virCheckFlags(0, -1);
-
- if (!(obj = networkObjFromNetwork(network)))
- return rv;
-
- if (virNetworkGetDHCPLeasesEnsureACL(network->conn, obj->def) < 0)
- goto cleanup;
-
- rv = networkGetDHCPLeasesHelper(obj, NULL, leases);
-
- cleanup:
- if (obj)
- virNetworkObjUnlock(obj);
- return rv;
-}
-
-static int
-networkGetDHCPLeasesForMAC(virNetworkPtr network,
- const char *mac,
- virNetworkDHCPLeasePtr **leases,
- unsigned int flags)
-{
- int rv = -1;
- virNetworkObjPtr obj;
-
- virCheckFlags(0, -1);
-
- if (!(obj = networkObjFromNetwork(network)))
- return rv;
-
- if (virNetworkGetDHCPLeasesForMACEnsureACL(network->conn, obj->def) < 0)
- goto cleanup;
-
- rv = networkGetDHCPLeasesHelper(obj, mac, leases);
-
- cleanup:
- if (obj)
- virNetworkObjUnlock(obj);
- return rv;
-}
static virNetworkDriver networkDriver = {
"Network",
@@ -3616,7 +3582,6 @@ static virNetworkDriver networkDriver = {
.networkIsActive = networkIsActive, /* 0.7.3 */
.networkIsPersistent = networkIsPersistent, /* 0.7.3 */
.networkGetDHCPLeases = networkGetDHCPLeases, /* 1.2.6 */
- .networkGetDHCPLeasesForMAC = networkGetDHCPLeasesForMAC, /* 1.2.6 */
};
static virStateDriver networkStateDriver = {
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 76ce4a9..04039ac 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -7601,6 +7601,7 @@ remoteSerializeDHCPLease(virNetworkDHCPLeasePtr lease_dst, remote_network_dhcp_l
static int
remoteNetworkGetDHCPLeases(virNetworkPtr net,
+ const char *mac,
virNetworkDHCPLeasePtr **leases,
unsigned int flags)
{
@@ -7614,6 +7615,7 @@ remoteNetworkGetDHCPLeases(virNetworkPtr net,
remoteDriverLock(priv);
make_nonnull_network(&args.net, net);
+ args.mac = mac == NULL ? NULL : (char **) &mac;
args.flags = flags;
args.need_results = !!leases;
@@ -7665,74 +7667,6 @@ remoteNetworkGetDHCPLeases(virNetworkPtr net,
}
-static int
-remoteNetworkGetDHCPLeasesForMAC(virNetworkPtr net,
- const char *mac,
- virNetworkDHCPLeasePtr **leases,
- unsigned int flags)
-{
- int rv = -1;
- size_t i;
- struct private_data *priv = net->conn->networkPrivateData;
- remote_network_get_dhcp_leases_for_mac_args args;
- remote_network_get_dhcp_leases_for_mac_ret ret;
-
- virNetworkDHCPLeasePtr *leases_ret = NULL;
- remoteDriverLock(priv);
-
- make_nonnull_network(&args.net, net);
- args.mac = (char *) mac;
- args.flags = flags;
- args.need_results = !!leases;
-
- memset(&ret, 0, sizeof(ret));
-
- if (call(net->conn, priv, 0, REMOTE_PROC_NETWORK_GET_DHCP_LEASES_FOR_MAC,
- (xdrproc_t)xdr_remote_network_get_dhcp_leases_for_mac_args, (char *)&args,
- (xdrproc_t)xdr_remote_network_get_dhcp_leases_for_mac_ret, (char *)&ret) == -1)
- goto done;
-
- if (ret.leases.leases_len > REMOTE_NETWORK_DHCP_LEASES_MAX) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Number of leases is %d, which exceeds max limit: %d"),
- ret.leases.leases_len, REMOTE_NETWORK_DHCP_LEASES_MAX);
- goto cleanup;
- }
-
- if (leases) {
- if (ret.leases.leases_len &&
- VIR_ALLOC_N(leases_ret, ret.leases.leases_len + 1) < 0)
- goto cleanup;
-
- for (i = 0; i < ret.leases.leases_len; i++) {
- if (VIR_ALLOC(leases_ret[i]) < 0)
- goto cleanup;
-
- if (remoteSerializeDHCPLease(leases_ret[i], &ret.leases.leases_val[i]) < 0)
- goto cleanup;
- }
-
- *leases = leases_ret;
- leases_ret = NULL;
- }
-
- rv = ret.ret;
-
- cleanup:
- if (leases_ret) {
- for (i = 0; i < ret.leases.leases_len; i++)
- virNetworkDHCPLeaseFree(leases_ret[i]);
- VIR_FREE(leases_ret);
- }
- xdr_free((xdrproc_t)xdr_remote_network_get_dhcp_leases_for_mac_ret,
- (char *) &ret);
-
- done:
- remoteDriverUnlock(priv);
- return rv;
-}
-
-
/* get_nonnull_domain and get_nonnull_network turn an on-wire
* (name, uuid) pair into virDomainPtr or virNetworkPtr object.
* These can return NULL if underlying memory allocations fail,
@@ -8098,7 +8032,6 @@ static virNetworkDriver network_driver = {
.networkIsActive = remoteNetworkIsActive, /* 0.7.3 */
.networkIsPersistent = remoteNetworkIsPersistent, /* 0.7.3 */
.networkGetDHCPLeases = remoteNetworkGetDHCPLeases, /* 1.2.6 */
- .networkGetDHCPLeasesForMAC = remoteNetworkGetDHCPLeasesForMAC, /* 1.2.6 */
};
static virInterfaceDriver interface_driver = {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 4b75bdb..bff2c47 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -3035,6 +3035,7 @@ struct remote_network_dhcp_lease {
struct remote_network_get_dhcp_leases_args {
remote_nonnull_network net;
+ remote_string mac;
int need_results;
unsigned int flags;
};
@@ -3044,18 +3045,6 @@ struct remote_network_get_dhcp_leases_ret {
unsigned int ret;
};
-struct remote_network_get_dhcp_leases_for_mac_args {
- remote_nonnull_network net;
- remote_nonnull_string mac;
- int need_results;
- unsigned int flags;
-};
-
-struct remote_network_get_dhcp_leases_for_mac_ret {
- remote_network_dhcp_lease leases<REMOTE_NETWORK_DHCP_LEASES_MAX>;
- unsigned int ret;
-};
-
/*----- Protocol. -----*/
/* Define the program number, protocol version and procedure numbers here. */
@@ -5413,11 +5402,6 @@ enum remote_procedure {
* @generate: none
* @acl: network:read
*/
- REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341,
+ REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341
- /**
- * @generate: none
- * @acl: network:read
- */
- REMOTE_PROC_NETWORK_GET_DHCP_LEASES_FOR_MAC = 342
};
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index 222f125..a14e1fd 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -2498,6 +2498,7 @@ struct remote_network_dhcp_lease {
};
struct remote_network_get_dhcp_leases_args {
remote_nonnull_network net;
+ remote_string mac;
int need_results;
u_int flags;
};
@@ -2508,19 +2509,6 @@ struct remote_network_get_dhcp_leases_ret {
} leases;
u_int ret;
};
-struct remote_network_get_dhcp_leases_for_mac_args {
- remote_nonnull_network net;
- remote_nonnull_string mac;
- int need_results;
- u_int flags;
-};
-struct remote_network_get_dhcp_leases_for_mac_ret {
- struct {
- u_int leases_len;
- remote_network_dhcp_lease * leases_val;
- } leases;
- u_int ret;
-};
enum remote_procedure {
REMOTE_PROC_CONNECT_OPEN = 1,
REMOTE_PROC_CONNECT_CLOSE = 2,
@@ -2863,5 +2851,4 @@ enum remote_procedure {
REMOTE_PROC_DOMAIN_EVENT_BLOCK_JOB_2 = 339,
REMOTE_PROC_NODE_GET_FREE_PAGES = 340,
REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341,
- REMOTE_PROC_NETWORK_GET_DHCP_LEASES_FOR_MAC = 342,
};
diff --git a/tools/virsh-network.c b/tools/virsh-network.c
index 2d5b9be..e7499fa 100644
--- a/tools/virsh-network.c
+++ b/tools/virsh-network.c
@@ -1348,10 +1348,7 @@ cmdNetworkDHCPLeases(vshControl *ctl, const vshCmd *cmd)
if (!(network = vshCommandOptNetwork(ctl, cmd, &name)))
return false;
- nleases = mac ? virNetworkGetDHCPLeasesForMAC(network, mac, &leases, flags)
- : virNetworkGetDHCPLeases(network, &leases, flags);
-
- if (nleases < 0) {
+ if ((nleases = virNetworkGetDHCPLeases(network, mac, &leases, flags) < 0)) {
vshError(ctl, _("Failed to get leases info for %s"), name);
goto cleanup;
}
--
1.9.3
10 years, 9 months
[libvirt] [libvirt-glib] [PATCHv2 1/2] libvirt-gobject-domain: Add _fetch_snapshots
by Timm Bäder
This function can be used to fetch the snapshots of a domain (according
to the given GVirDomainSnapshotListFlags) and save them in a
domain-internal GHashTable. A function to access them from outside will
be added in a later patch.
---
libvirt-gobject/libvirt-gobject-domain.c | 61 ++++++++++++++++++++++++++++++++
libvirt-gobject/libvirt-gobject-domain.h | 36 +++++++++++++++++++
libvirt-gobject/libvirt-gobject.sym | 2 ++
3 files changed, 99 insertions(+)
diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
index c6e30e5..a527d4e 100644
--- a/libvirt-gobject/libvirt-gobject-domain.c
+++ b/libvirt-gobject/libvirt-gobject-domain.c
@@ -38,6 +38,7 @@ struct _GVirDomainPrivate
{
virDomainPtr handle;
gchar uuid[VIR_UUID_STRING_BUFLEN];
+ GHashTable *snapshots;
};
G_DEFINE_TYPE(GVirDomain, gvir_domain, G_TYPE_OBJECT);
@@ -121,6 +122,10 @@ static void gvir_domain_finalize(GObject *object)
g_debug("Finalize GVirDomain=%p", domain);
+ if (priv->snapshots) {
+ g_hash_table_unref (priv->snapshots);
+ }
+
virDomainFree(priv->handle);
G_OBJECT_CLASS(gvir_domain_parent_class)->finalize(object);
@@ -1514,3 +1519,59 @@ gvir_domain_create_snapshot(GVirDomain *dom,
g_free(custom_xml);
return dom_snapshot;
}
+
+
+
+/**
+ * gvir_domain_fetch_snapshots:
+ * @dom: The domain
+ * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags
+ * @error: (allow-none): Place-holder for error or NULL
+ *
+ * Returns: TRUE on success, FALSE otherwise.
+ */
+gboolean gvir_domain_fetch_snapshots(GVirDomain *dom,
+ guint list_flags,
+ GError **error)
+{
+ GVirDomainPrivate *priv;
+ virDomainSnapshotPtr *snapshots = NULL;
+ GVirDomainSnapshot *snap;
+ int n_snaps = 0;
+ int i;
+
+ g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE);
+ g_return_val_if_fail((error == NULL) || (*error == NULL), FALSE);
+
+ priv = dom->priv;
+
+ if (priv->snapshots != NULL) {
+ g_hash_table_unref (priv->snapshots);
+ }
+
+ priv->snapshots = g_hash_table_new_full(g_str_hash,
+ g_str_equal,
+ NULL,
+ g_object_unref);
+
+
+ n_snaps = virDomainListAllSnapshots(priv->handle, &snapshots, list_flags);
+
+ if (n_snaps < 0) {
+ gvir_set_error(error, GVIR_DOMAIN_ERROR, 0,
+ "Unable to fetch snapshots of %s",
+ gvir_domain_get_name (dom));
+ return FALSE;
+ }
+
+ for (i = 0; i < n_snaps; i ++) {
+ snap = GVIR_DOMAIN_SNAPSHOT(g_object_new(GVIR_TYPE_DOMAIN_SNAPSHOT,
+ "handle", snapshots[i],
+ NULL));
+ g_hash_table_insert(priv->snapshots,
+ (gpointer)gvir_domain_snapshot_get_name(snap),
+ snap);
+ }
+ free(snapshots);
+ return TRUE;
+}
diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h
index 38d3458..fb33e2b 100644
--- a/libvirt-gobject/libvirt-gobject-domain.h
+++ b/libvirt-gobject/libvirt-gobject-domain.h
@@ -183,6 +183,39 @@ typedef enum {
GVIR_DOMAIN_REBOOT_GUEST_AGENT = VIR_DOMAIN_REBOOT_GUEST_AGENT,
} GVirDomainRebootFlags;
+/**
+ * GVirDomainSnapshotListFlags:
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_ALL: List all snapshots
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS: List all descendants, not just
+ * children, when listing a snapshot.
+ * For historical reasons, groups do not use contiguous bits.
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS: Filter by snapshots with no parents, when listing a domain
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_METADATA: Filter by snapshots which have metadata
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_LEAVES: Filter by snapshots with no children
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES: Filter by snapshots that have children
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA: Filter by snapshots with no metadata
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_INACTIVE: Filter by snapshots taken while guest was shut off
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_ACTIVE: Filter by snapshots taken while guest was active, and with memory state
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY: Filter by snapshots taken while guest was active, but without memory state
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_INTERNAL: Filter by snapshots stored internal to disk images
+ * @GVIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL: Filter by snapshots that use files external to disk images
+ */
+typedef enum {
+ GVIR_DOMAIN_SNAPSHOT_LIST_ALL = 0,
+ GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS = VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS,
+ GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS = VIR_DOMAIN_SNAPSHOT_LIST_ROOTS,
+ GVIR_DOMAIN_SNAPSHOT_LIST_METADATA = VIR_DOMAIN_SNAPSHOT_LIST_METADATA,
+ GVIR_DOMAIN_SNAPSHOT_LIST_LEAVES = VIR_DOMAIN_SNAPSHOT_LIST_LEAVES,
+ GVIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES = VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES,
+ GVIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA = VIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA,
+ GVIR_DOMAIN_SNAPSHOT_LIST_INACTIVE = VIR_DOMAIN_SNAPSHOT_LIST_INACTIVE,
+ GVIR_DOMAIN_SNAPSHOT_LIST_ACTIVE = VIR_DOMAIN_SNAPSHOT_LIST_ACTIVE,
+ GVIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY = VIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY,
+ GVIR_DOMAIN_SNAPSHOT_LIST_INTERNAL = VIR_DOMAIN_SNAPSHOT_LIST_INTERNAL,
+ GVIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL = VIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL
+} GVirDomainSnapshotListFlags;
+
+
typedef struct _GVirDomainInfo GVirDomainInfo;
struct _GVirDomainInfo
{
@@ -330,6 +363,9 @@ gvir_domain_create_snapshot(GVirDomain *dom,
guint flags,
GError **err);
+gboolean gvir_domain_fetch_snapshots(GVirDomain *dom,
+ guint flags,
+ GError **error);
G_END_DECLS
#endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */
diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
index b781cc6..781310f 100644
--- a/libvirt-gobject/libvirt-gobject.sym
+++ b/libvirt-gobject/libvirt-gobject.sym
@@ -236,7 +236,9 @@ LIBVIRT_GOBJECT_0.1.5 {
LIBVIRT_GOBJECT_0.1.9 {
global:
+ gvir_domain_fetch_snapshots;
gvir_domain_snapshot_delete;
+ gvir_domain_snapshot_list_flags_get_type;
} LIBVIRT_GOBJECT_0.1.5;
# .... define new API here using predicted next version number ....
--
2.0.0
10 years, 9 months
[libvirt] [PATCH] bhyve: fix build by fixing typo in variable name
by Roman Bogorodskiy
Commit 80d0918b introduced a typo in variable name:
s/failIncomaptible/failIncompatible/
Pushed under the build breaker rule.
---
src/bhyve/bhyve_driver.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index d784ed1..eb5fc95 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -1326,14 +1326,14 @@ bhyveConnectCompareCPU(virConnectPtr conn,
if (virConnectCompareCPUEnsureACL(conn) < 0)
goto cleanup;
- failIncomaptible = !!(flags & VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE);
+ failIncompatible = !!(flags & VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE);
if (!(caps = bhyveDriverGetCapabilities(driver)))
goto cleanup;
if (!caps->host.cpu ||
!caps->host.cpu->model) {
- if (failIncomaptible) {
+ if (failIncompatible) {
virReportError(VIR_ERR_CPU_INCOMPATIBLE, "%s",
_("cannot get host CPU capabilities"));
} else {
@@ -1341,7 +1341,7 @@ bhyveConnectCompareCPU(virConnectPtr conn,
ret = VIR_CPU_COMPARE_INCOMPATIBLE;
}
} else {
- ret = cpuCompareXML(caps->host.cpu, xmlDesc, failIncomaptible);
+ ret = cpuCompareXML(caps->host.cpu, xmlDesc, failIncompatible);
}
cleanup:
--
1.9.0
10 years, 9 months
[libvirt] [PATCH] cpu: Add new Broadwell CPU model
by Jiri Denemark
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
Notes:
The corresponding patch [1] for QEMU is not usptream yet but nobody
seems to be complaining about that model. And chances are the patch gets
in before QEMU enters hard freeze for 2.1. So please review this patch
but I won't push it until the model gets pushed to QEMU.
[1] https://lists.gnu.org/archive/html/qemu-devel/2014-06/msg04025.html
src/cpu/cpu_map.xml | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
index 7d34d40..d704e59 100644
--- a/src/cpu/cpu_map.xml
+++ b/src/cpu/cpu_map.xml
@@ -511,6 +511,14 @@
<feature name='rtm'/>
</model>
+ <model name='Broadwell'>
+ <model name='Haswell'/>
+ <feature name='3dnowprefetch'/>
+ <feature name='rdseed'/>
+ <feature name='adx'/>
+ <feature name='smap'/>
+ </model>
+
<!-- AMD CPUs -->
<model name='athlon'>
<model name='pentiumpro'/>
--
2.0.0
10 years, 9 months
[libvirt] [PATCH RFC 0/4] Expose Expose IOMMU and VFIO host capabilities
by Michal Privoznik
*** NOT FOR UPSTREAM MERGE ***
This is pure RFC, that's why it contains just code without any documentation,
RNG schemas, tests, ..., with sparse commit messages. I just want to make sure
I'm on the right track this time.
BTW: The ACL issue on the command is still not resolved and honestly, I've no
solution. Long story short, with this API I'm introducing users with RO
connection can execute arbitrary files on the host. Isn't that just nice?
So, what you should see after these patches are applied? Something like this:
virsh # domcapabilities /usr/bin/qemu-system-x86_64 kvm
<emulatorCapabilities>
<path>/usr/bin/qemu-system-x86_64</path>
<domain>kvm</domain>
<machine>pc-i440fx-2.1</machine>
<arch>x86_64</arch>
<vcpu>255</vcpu>
<devices>
<disk supported='yes'>
<enum name='diskDevice'>
<value>disk</value>
<value>cdrom</value>
<value>floppy</value>
<value>lun</value>
</enum>
<enum name='bus'>
<value>ide</value>
<value>fdc</value>
<value>scsi</value>
<value>virtio</value>
<value>xen</value>
<value>usb</value>
<value>sd</value>
</enum>
</disk>
<hostdev supported='yes'>
<enum name='mode'/>
<enum name='startupPolicy'>
<value>default</value>
<value>mandatory</value>
<value>requisite</value>
<value>optional</value>
</enum>
<enum name='subsysType'>
<value>usb</value>
<value>pci</value>
<value>scsi</value>
</enum>
<enum name='capsType'/>
<enum name='pciBackend'>
<value>default</value>
<value>kvm</value>
<value>vfio</value>
</enum>
</hostdev>
</devices>
</emulatorCapabilities>
Michal Privoznik (4):
Introduce domain_capabilities
Introduce virConnectGetDomainCapabilities
virsh: expose virConnectGetDomainCapabilities
qemu: Implement virConnectGetDomainCapabilities
include/libvirt/libvirt.h.in | 7 ++
src/Makefile.am | 1 +
src/conf/domain_capabilities.c | 217 +++++++++++++++++++++++++++++++++++++++++
src/conf/domain_capabilities.h | 89 +++++++++++++++++
src/driver.h | 9 ++
src/libvirt.c | 52 ++++++++++
src/libvirt_private.syms | 6 ++
src/libvirt_public.syms | 1 +
src/qemu/qemu_capabilities.c | 82 ++++++++++++++++
src/qemu/qemu_capabilities.h | 4 +
src/qemu/qemu_driver.c | 102 +++++++++++++++++++
src/remote/remote_driver.c | 1 +
src/remote/remote_protocol.x | 20 +++-
src/remote_protocol-structs | 11 +++
tools/virsh-host.c | 84 ++++++++++++++++
15 files changed, 685 insertions(+), 1 deletion(-)
create mode 100644 src/conf/domain_capabilities.c
create mode 100644 src/conf/domain_capabilities.h
--
1.8.5.5
10 years, 9 months