[libvirt] Access to the secretDriver in a storage backend?
by Wido den Hollander
Hi,
I'm working on a storage backend for libvirt which needs credentials to
access the storage pool. I want to use the build in secret manager from
libvirt, but it seems I do not have access to the secretDriver in a
storage backend?
static int virStorageBackendRBDRefreshPool(virConnectPtr conn
ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool) {
if (pool->def->source.auth.cephx.secret != NULL) {
virSecretPtr secret;
secret = conn->secretDriver->lookupByUUID(conn,
pool->def->source.auth.cephx.secret);
virSecretFree(secret);
}
return 0;
}
It goes wrong at this point:
conn->secretDriver->lookupByUUID(conn,pool->def->source.auth.cephx.secret);
"error: dereferencing pointer to incomplete type"
Is the secretDriver available in a storage backend? In storage_backend.c
I see that it should be available, correct?
I might be missing something here, so that's why I'm asking it here.
Thank you,
Wido
12 years, 10 months
[libvirt] PATCH: Inform QEMU "prepare" hook of migration in progress
by Adam Tilghman
>From: Eric Blake <eblake redhat com>
>Subject: Re: [libvirt-users] Wanted: method for qemu hook script to know if called for migration
>Date: Mon, 25 Jul 2011 14:17:08 -0600
>
>>As a feature suggestion, it would be nice if that fourth input variable,
>>currently "-", was something like "migrate" in this instance.
>
>Yes, that is probably a bug worth fixing.
I would also find it useful for the QEMU "prepare" hook
to be told whether it's being called in the context of a migration.
(In our case, we use that hook to manage shared DRBD storage, and only permit
Primary/Primary mode in the context of a migration.)
The attached 1-line patch supplies the hook with an additional
argument "migration-target" when appropriate.
Submitted as https://bugzilla.redhat.com/show_bug.cgi?id=768054
---
src/qemu/qemu_process.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 9123f4c..ef9f7eb 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2936,7 +2936,7 @@ int qemuProcessStart(virConnectPtr conn,
int hookret;
hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
- VIR_HOOK_QEMU_OP_PREPARE, VIR_HOOK_SUBOP_BEGIN, NULL, xml);
+ VIR_HOOK_QEMU_OP_PREPARE, VIR_HOOK_SUBOP_BEGIN, migrateFrom ? "migration-target" : NULL, xml);
VIR_FREE(xml);
/*
--
1.7.1
--
Adam Tilghman Systems Support / Academic Computing & Media Services
agt(a)ucsd.edu 858-822-0711 University of California, San Diego
12 years, 10 months
[libvirt] [PATCHv4 0/6] Add new command domiftune
by Hu Tao
This series adds a new command domiftune to get/set parameters of
domain's network interfaces. Supported parameters are bandwidth
settings.
Currently the network interface bandwidth can only be set:
- in domain's xml before the domain is up
- when attaching an interface by attach-interface
With this series, users can change network interface bandwidth
settings using virsh, whether the domain is running or not.
changes:
- fix a bug that previous bandwidth parameters are lost when
setting only inbound or outbound lively
- some minor improvements
- rename virDomainFindNetDef to virDomainNetFind
Hu Tao (6):
Add API virDomain{S,G}etInterfaceParameters
virDomain{S,G}etInterfaceParameters: the main entry points
Add virDomain{S,G}etInterfaceparameters support to the remote driver
Add a function virDomainNetFind
Add virDomain{S,G}etInterfaceParameters support to qemu driver
Enable the virDomain{S,G}etInterfaceParameters in virsh
daemon/remote.c | 64 ++++++++
include/libvirt/libvirt.h.in | 50 ++++++
python/generator.py | 2 +
src/conf/domain_conf.c | 39 +++++
src/conf/domain_conf.h | 3 +
src/driver.h | 12 ++
src/libvirt.c | 130 ++++++++++++++++
src/libvirt_private.syms | 1 +
src/libvirt_public.syms | 2 +
src/qemu/qemu_driver.c | 353 ++++++++++++++++++++++++++++++++++++++++++
src/remote/remote_driver.c | 52 ++++++
src/remote/remote_protocol.x | 28 ++++-
src/remote_protocol-structs | 24 +++
tools/virsh.c | 198 +++++++++++++++++++++++
tools/virsh.pod | 21 +++
15 files changed, 978 insertions(+), 1 deletions(-)
--
1.7.4.4
12 years, 10 months
[libvirt] [PATCH 0/2] qemu: add new disk type='lun' for bus='virtio'
by Laine Stump
These two patches are in response to CVE-2011-4127:
http://seclists.org/oss-sec/2011/q4/536
Once the kernel security fix and corresponding qemu mitigation patch
are in place, access to SG_IO commands from qemu guests will be
disabled by default. This patch series provides a way to explicitly
enable such support when it is required.
In a discussion just before sending this patch series, Paolo Bonzini
wondered if rather than the xml syntax being what's proposed
here:
<disk type='block' device='disk' dev='/dev/sda'> <!-- SG_IO off -->
<disk type='lun' device='disk' dev='/dev/sda'> <!-- SG_IO on -->
maybe it should instead be:
<disk type='block' device='disk' dev='/dev/sda'> <!-- SG_IO off -->
<disk type='block' device='lun' dev='/dev/sda'> <!-- SG_IO on -->
I guess it partly depends on whether we would ever want to turn on
SG_IO for a disk with device='cdrom|floppy' vs. if we would ever want
to turn it on for type='file|dir|network'.
Opinions?
12 years, 10 months
[libvirt] [libvirt-glib] API to set SPICE password
by Zeeshan Ali (Khattak)
From: "Zeeshan Ali (Khattak)" <zeeshanak(a)gnome.org>
---
.../libvirt-gconfig-domain-graphics-spice.c | 10 ++++++++++
.../libvirt-gconfig-domain-graphics-spice.h | 3 +++
libvirt-gconfig/libvirt-gconfig.sym | 1 +
3 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.c b/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.c
index 483f7d7..f7828c1 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.c
@@ -104,3 +104,13 @@ void gvir_config_domain_graphics_spice_set_tls_port(GVirConfigDomainGraphicsSpic
"tlsPort", G_TYPE_INT, port,
NULL);
}
+
+void gvir_config_domain_graphics_spice_set_password(GVirConfigDomainGraphicsSpice *graphics,
+ const char *password)
+{
+ g_return_if_fail(GVIR_IS_CONFIG_DOMAIN_GRAPHICS_SPICE(graphics));
+
+ gvir_config_object_set_attribute(GVIR_CONFIG_OBJECT(graphics),
+ "passwd", password,
+ NULL);
+}
diff --git a/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.h b/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.h
index b1b8361..a4004eb 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.h
+++ b/libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.h
@@ -71,6 +71,9 @@ void gvir_config_domain_graphics_spice_set_port(GVirConfigDomainGraphicsSpice *g
void gvir_config_domain_graphics_spice_set_tls_port(GVirConfigDomainGraphicsSpice *graphics,
int port);
+void gvir_config_domain_graphics_spice_set_password(GVirConfigDomainGraphicsSpice *graphics,
+ const char *password);
+
G_END_DECLS
#endif /* __LIBVIRT_GCONFIG_DOMAIN_GRAPHICS_SPICE_H__ */
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym
index 39f39d4..53f84d4 100644
--- a/libvirt-gconfig/libvirt-gconfig.sym
+++ b/libvirt-gconfig/libvirt-gconfig.sym
@@ -96,6 +96,7 @@ LIBVIRT_GCONFIG_0.0.3 {
gvir_config_domain_graphics_spice_set_autoport;
gvir_config_domain_graphics_spice_set_port;
gvir_config_domain_graphics_spice_set_tls_port;
+ gvir_config_domain_graphics_spice_set_password;
gvir_config_domain_graphics_vnc_get_type;
gvir_config_domain_graphics_vnc_new;
--
1.7.7.4
12 years, 10 months
[libvirt] [PATCH v5] Implement DNS SRV record into the bridge driver
by Michal Novotny
Hi,
this is the fifth version of my SRV record for DNSMasq patch rebased
for the current codebase to the bridge driver and libvirt XML file to
include support for the SRV records in the DNS. The syntax is based on
DNSMasq man page and tests for both xml2xml and xml2argv were added as
well. There are some things written a better way in comparison with
version 4, mainly there's no hack in tests/networkxml2argvtest.c and
also the xPath context is changed to use a simpler query using the
virXPathInt() function relative to the current node.
Also, the patch is also fixing the networkxml2argv test to pass both
checks, i.e. both unit tests and also syntax check.
Please review,
Michal
Signed-off-by: Michal Novotny <minovotn(a)redhat.com>
---
docs/formatnetwork.html.in | 12 ++
docs/schemas/network.rng | 20 ++-
docs/schemas/networkcommon.rng | 17 +++
src/conf/network_conf.c | 134 +++++++++++++++++++-
src/conf/network_conf.h | 16 +++
src/network/bridge_driver.c | 43 +++++++
.../nat-network-dns-srv-record-minimal.argv | 16 +++
.../nat-network-dns-srv-record-minimal.xml | 26 ++++
.../nat-network-dns-srv-record.argv | 16 +++
.../nat-network-dns-srv-record.xml | 26 ++++
tests/networkxml2argvtest.c | 2 +
.../nat-network-dns-srv-record-minimal.xml | 26 ++++
.../nat-network-dns-srv-record.xml | 26 ++++
.../nat-network-dns-srv-record-minimal.xml | 26 ++++
.../nat-network-dns-srv-record.xml | 26 ++++
15 files changed, 423 insertions(+), 9 deletions(-)
create mode 100644 tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
create mode 100644 tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.xml
create mode 100644 tests/networkxml2argvdata/nat-network-dns-srv-record.argv
create mode 100644 tests/networkxml2argvdata/nat-network-dns-srv-record.xml
create mode 100644 tests/networkxml2xmlin/nat-network-dns-srv-record-minimal.xml
create mode 100644 tests/networkxml2xmlin/nat-network-dns-srv-record.xml
create mode 100644 tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml
create mode 100644 tests/networkxml2xmlout/nat-network-dns-srv-record.xml
diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in
index 02302fa..755d510 100644
--- a/docs/formatnetwork.html.in
+++ b/docs/formatnetwork.html.in
@@ -345,6 +345,7 @@
<domain name="example.com"/>
<dns>
<txt name="example" value="example value" />
+ <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10'/>
<host ip='192.168.122.2'>
<hostname>myhost</hostname>
<hostname>myhostalias</hostname>
@@ -396,6 +397,17 @@
<span class="since">Since 0.9.3</span>
</dd>
</dl>
+ <dl>
+ <dt><code>srv</code></dt>
+ <dd>The <code>dns</code> element can have also 0 or more <code>srv</code>
+ record elements. Each <code>srv</code> record element defines a DNS SRV record
+ and has 2 mandatory and 5 optional attributes. The mandatory attributes
+ are service name and protocol (tcp, udp) and the optional attributes are
+ target, port, priority, weight and domain as defined in DNS server SRV
+ RFC (RFC 2782).
+ <span class="since">Since 0.9.9</span>
+ </dd>
+ </dl>
</dd>
<dt><code>ip</code></dt>
<dd>The <code>address</code> attribute defines an IPv4 address in
diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 937e180..5d58fe4 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -138,6 +138,19 @@
</element>
</zeroOrMore>
<zeroOrMore>
+ <element name="srv">
+ <attribute name="service"><text/></attribute>
+ <attribute name="protocol"><ref name="protocol"/></attribute>
+ <optional>
+ <attribute name="domain"><ref name="dnsName"/></attribute>
+ <attribute name="target"><text/></attribute>
+ <attribute name="port"><ref name="unsignedShort"/></attribute>
+ <attribute name="priority"><ref name="unsignedShort"/></attribute>
+ <attribute name="weight"><ref name="unsignedShort"/></attribute>
+ </optional>
+ </element>
+ </zeroOrMore>
+ <zeroOrMore>
<element name="host">
<attribute name="ip"><ref name="ipv4Addr"/></attribute>
<oneOrMore>
@@ -216,11 +229,4 @@
</interleave>
</element>
</define>
-
- <define name='addr-family'>
- <data type='string'>
- <param name="pattern">(ipv4)|(ipv6)</param>
- </data>
- </define>
-
</grammar>
diff --git a/docs/schemas/networkcommon.rng b/docs/schemas/networkcommon.rng
index 3a168c3..2328892 100644
--- a/docs/schemas/networkcommon.rng
+++ b/docs/schemas/networkcommon.rng
@@ -95,4 +95,21 @@
<param name="minInclusive">1</param>
</data>
</define>
+
+ <define name='unsignedShort'>
+ <data type='integer'>
+ <param name="minInclusive">0</param>
+ <param name="maxInclusive">65535</param>
+ </data>
+ </define>
+ <define name='protocol'>
+ <data type='string'>
+ <param name='pattern'>(tcp)|(udp)</param>
+ </data>
+ </define>
+ <define name='addr-family'>
+ <data type='string'>
+ <param name="pattern">(ipv4)|(ipv6)</param>
+ </data>
+ </define>
</grammar>
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 1058b07..3479543 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -138,6 +138,15 @@ static void virNetworkDNSDefFree(virNetworkDNSDefPtr def)
}
}
VIR_FREE(def->hosts);
+ if (def->nsrvrecords) {
+ while (def->nsrvrecords--) {
+ VIR_FREE(def->srvrecords[def->nsrvrecords].domain);
+ VIR_FREE(def->srvrecords[def->nsrvrecords].service);
+ VIR_FREE(def->srvrecords[def->nsrvrecords].protocol);
+ VIR_FREE(def->srvrecords[def->nsrvrecords].target);
+ }
+ }
+ VIR_FREE(def->srvrecords);
VIR_FREE(def);
}
}
@@ -553,8 +562,103 @@ error:
}
static int
+virNetworkDNSSrvDefParseXML(virNetworkDNSDefPtr def,
+ xmlNodePtr cur,
+ xmlXPathContextPtr ctxt)
+{
+ char *domain;
+ char *service;
+ char *protocol;
+ char *target;
+ int port;
+ int priority;
+ int weight;
+ int ret = 0;
+
+ if (!(service = virXMLPropString(cur, "service"))) {
+ virNetworkReportError(VIR_ERR_XML_DETAIL,
+ "%s", _("Missing required service attribute in dns srv record"));
+ goto error;
+ }
+
+ if (strlen(service) > DNS_RECORD_LENGTH_SRV) {
+ char *name = NULL;
+
+ virAsprintf(&name, _("Service name is too long, limit is %d bytes"), DNS_RECORD_LENGTH_SRV);
+ virNetworkReportError(VIR_ERR_XML_DETAIL,
+ "%s", name);
+ free(name);
+ goto error;
+ }
+
+ if (!(protocol = virXMLPropString(cur, "protocol"))) {
+ virNetworkReportError(VIR_ERR_XML_DETAIL,
+ _("Missing required protocol attribute in dns srv record '%s'"), service);
+ goto error;
+ }
+
+ /* Check whether protocol value is the supported one */
+ if (STRNEQ(protocol, "tcp") && (STRNEQ(protocol, "udp"))) {
+ virNetworkReportError(VIR_ERR_XML_DETAIL,
+ _("Invalid protocol attribute value '%s'"), protocol);
+ goto error;
+ }
+
+ if (VIR_REALLOC_N(def->srvrecords, def->nsrvrecords + 1) < 0) {
+ virReportOOMError();
+ goto error;
+ }
+
+ def->srvrecords[def->nsrvrecords].service = service;
+ def->srvrecords[def->nsrvrecords].protocol = protocol;
+ def->srvrecords[def->nsrvrecords].domain = NULL;
+ def->srvrecords[def->nsrvrecords].target = NULL;
+ def->srvrecords[def->nsrvrecords].port = 0;
+ def->srvrecords[def->nsrvrecords].priority = 0;
+ def->srvrecords[def->nsrvrecords].weight = 0;
+
+ /* Following attributes are optional but we had to make sure they're NULL above */
+ if ((target = virXMLPropString(cur, "target")) && (domain = virXMLPropString(cur, "domain"))) {
+ xmlNodePtr save_ctxt = ctxt->node;
+
+ ctxt->node = cur;
+ if (virXPathInt("string(./@port)", ctxt, &port))
+ def->srvrecords[def->nsrvrecords].port = port;
+
+ if (virXPathInt("string(./@priority)", ctxt, &priority))
+ def->srvrecords[def->nsrvrecords].priority = priority;
+
+ if (virXPathInt("string(./@weight)", ctxt, &weight))
+ def->srvrecords[def->nsrvrecords].weight = weight;
+ ctxt->node = save_ctxt;
+
+ def->srvrecords[def->nsrvrecords].domain = domain;
+ def->srvrecords[def->nsrvrecords].target = target;
+ def->srvrecords[def->nsrvrecords].port = port;
+ def->srvrecords[def->nsrvrecords].priority = priority;
+ def->srvrecords[def->nsrvrecords].weight = weight;
+ }
+
+ def->nsrvrecords++;
+
+ goto cleanup;
+
+error:
+ VIR_FREE(domain);
+ VIR_FREE(service);
+ VIR_FREE(protocol);
+ VIR_FREE(target);
+
+ ret = -1;
+
+cleanup:
+ return ret;
+}
+
+static int
virNetworkDNSDefParseXML(virNetworkDNSDefPtr *dnsdef,
- xmlNodePtr node)
+ xmlNodePtr node,
+ xmlXPathContextPtr ctxt)
{
xmlNodePtr cur;
int ret = -1;
@@ -599,6 +703,11 @@ virNetworkDNSDefParseXML(virNetworkDNSDefPtr *dnsdef,
name = NULL;
value = NULL;
} else if (cur->type == XML_ELEMENT_NODE &&
+ xmlStrEqual(cur->name, BAD_CAST "srv")) {
+ ret = virNetworkDNSSrvDefParseXML(def, cur, ctxt);
+ if (ret < 0)
+ goto error;
+ } else if (cur->type == XML_ELEMENT_NODE &&
xmlStrEqual(cur->name, BAD_CAST "host")) {
ret = virNetworkDNSHostsDefParseXML(def, cur);
if (ret < 0)
@@ -887,7 +996,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
dnsNode = virXPathNode("./dns", ctxt);
if (dnsNode != NULL) {
- if (virNetworkDNSDefParseXML(&def->dns, dnsNode) < 0)
+ if (virNetworkDNSDefParseXML(&def->dns, dnsNode, ctxt) < 0)
goto error;
}
@@ -1146,6 +1255,27 @@ virNetworkDNSDefFormat(virBufferPtr buf,
def->txtrecords[i].value);
}
+ for (i = 0 ; i < def->nsrvrecords ; i++) {
+ if (def->srvrecords[i].service && def->srvrecords[i].protocol) {
+ virBufferAsprintf(buf, " <srv service='%s' protocol='%s'",
+ def->srvrecords[i].service,
+ def->srvrecords[i].protocol);
+
+ if (def->srvrecords[i].domain)
+ virBufferAsprintf(buf, " domain='%s'", def->srvrecords[i].domain);
+ if (def->srvrecords[i].target)
+ virBufferAsprintf(buf, " target='%s'", def->srvrecords[i].target);
+ if (def->srvrecords[i].port)
+ virBufferAsprintf(buf, " port='%d'", def->srvrecords[i].port);
+ if (def->srvrecords[i].priority)
+ virBufferAsprintf(buf, " priority='%d'", def->srvrecords[i].priority);
+ if (def->srvrecords[i].weight)
+ virBufferAsprintf(buf, " weight='%d'", def->srvrecords[i].weight);
+
+ virBufferAsprintf(buf, "/>\n");
+ }
+ }
+
if (def->nhosts) {
int ii, j;
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index 1be20f8..5ef4878 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -24,6 +24,8 @@
#ifndef __NETWORK_CONF_H__
# define __NETWORK_CONF_H__
+#define DNS_RECORD_LENGTH_SRV (512 - 30) /* Limit minus overhead as mentioned in RFC-2782 */
+
# include <libxml/parser.h>
# include <libxml/tree.h>
# include <libxml/xpath.h>
@@ -69,6 +71,18 @@ struct _virNetworkDNSTxtRecordsDef {
char *value;
};
+typedef struct _virNetworkDNSSrvRecordsDef virNetworkDNSSrvRecordsDef;
+typedef virNetworkDNSSrvRecordsDef *virNetworkDNSSrvRecordsDefPtr;
+struct _virNetworkDNSSrvRecordsDef {
+ char *domain;
+ char *service;
+ char *protocol;
+ char *target;
+ int port;
+ int priority;
+ int weight;
+};
+
struct _virNetworkDNSHostsDef {
virSocketAddr ip;
int nnames;
@@ -82,6 +96,8 @@ struct _virNetworkDNSDef {
virNetworkDNSTxtRecordsDefPtr txtrecords;
unsigned int nhosts;
virNetworkDNSHostsDefPtr hosts;
+ unsigned int nsrvrecords;
+ virNetworkDNSSrvRecordsDefPtr srvrecords;
};
typedef struct _virNetworkDNSDef *virNetworkDNSDefPtr;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 63338a2..0c0e7a7 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -527,6 +527,49 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
virCommandAddArgPair(cmd, "--txt-record", record);
VIR_FREE(record);
}
+
+ for (i = 0; i < dns->nsrvrecords; i++) {
+ char *record = NULL;
+ char *recordPort = NULL;
+ char *recordPriority = NULL;
+ char *recordWeight = NULL;
+
+ if (dns->srvrecords[i].service && dns->srvrecords[i].protocol) {
+ if (dns->srvrecords[i].port) {
+ if (virAsprintf(&recordPort, "%d", dns->srvrecords[i].port) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ }
+ if (dns->srvrecords[i].priority) {
+ if (virAsprintf(&recordPriority, "%d", dns->srvrecords[i].priority) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ }
+ if (dns->srvrecords[i].weight) {
+ if (virAsprintf(&recordWeight, "%d", dns->srvrecords[i].weight) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ }
+
+ if (virAsprintf(&record, "%s.%s.%s,%s,%s,%s,%s",
+ dns->srvrecords[i].service,
+ dns->srvrecords[i].protocol,
+ dns->srvrecords[i].domain ? dns->srvrecords[i].domain : "",
+ dns->srvrecords[i].target ? dns->srvrecords[i].target : "",
+ recordPort ? recordPort : "",
+ recordPriority ? recordPriority : "",
+ recordWeight ? recordWeight : "") < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ virCommandAddArgPair(cmd, "--srv-host", record);
+ VIR_FREE(record);
+ }
+ }
}
/*
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
new file mode 100644
index 0000000..021e8f0
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
@@ -0,0 +1,16 @@
+/usr/sbin/dnsmasq \
+--strict-order \
+--bind-interfaces \
+--conf-file= \
+--except-interface lo \
+--srv-host=name.tcp.,,,, \
+--listen-address 192.168.122.1 \
+--listen-address 192.168.123.1 \
+--listen-address 2001:db8:ac10:fe01::1 \
+--listen-address 2001:db8:ac10:fd01::1 \
+--listen-address 10.24.10.1 \
+--dhcp-range 192.168.122.2,192.168.122.254 \
+--dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
+--dhcp-lease-max=253 \
+--dhcp-no-override \
+--dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile\
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.xml b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.xml
new file mode 100644
index 0000000..e9b7680
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.xml
@@ -0,0 +1,26 @@
+<network>
+ <name>default</name>
+ <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+ <forward dev='eth1' mode='nat'>
+ <interface dev='eth1'/>
+ </forward>
+ <bridge name='virbr0' stp='on' delay='0' />
+ <dns>
+ <srv service='name' protocol='tcp' />
+ </dns>
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
+ <dhcp>
+ <range start='192.168.122.2' end='192.168.122.254' />
+ <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+ <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+ </dhcp>
+ </ip>
+ <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+ </ip>
+ <ip family='ipv4' address='10.24.10.1'>
+ </ip>
+</network>
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
new file mode 100644
index 0000000..85afbba
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
@@ -0,0 +1,16 @@
+/usr/sbin/dnsmasq \
+--strict-order \
+--bind-interfaces \
+--conf-file= \
+--except-interface lo \
+--srv-host=name.tcp.test-domain-name,.,1024,10,10 \
+--listen-address 192.168.122.1 \
+--listen-address 192.168.123.1 \
+--listen-address 2001:db8:ac10:fe01::1 \
+--listen-address 2001:db8:ac10:fd01::1 \
+--listen-address 10.24.10.1 \
+--dhcp-range 192.168.122.2,192.168.122.254 \
+--dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
+--dhcp-lease-max=253 \
+--dhcp-no-override \
+--dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile\
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record.xml b/tests/networkxml2argvdata/nat-network-dns-srv-record.xml
new file mode 100644
index 0000000..4be85b5
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record.xml
@@ -0,0 +1,26 @@
+<network>
+ <name>default</name>
+ <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+ <forward dev='eth1' mode='nat'>
+ <interface dev='eth1'/>
+ </forward>
+ <bridge name='virbr0' stp='on' delay='0' />
+ <dns>
+ <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10' />
+ </dns>
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
+ <dhcp>
+ <range start='192.168.122.2' end='192.168.122.254' />
+ <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+ <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+ </dhcp>
+ </ip>
+ <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+ </ip>
+ <ip family='ipv4' address='10.24.10.1'>
+ </ip>
+</network>
diff --git a/tests/networkxml2argvtest.c b/tests/networkxml2argvtest.c
index 4a11d6f..2dd9b7f 100644
--- a/tests/networkxml2argvtest.c
+++ b/tests/networkxml2argvtest.c
@@ -120,6 +120,8 @@ mymain(void)
DO_TEST("netboot-network");
DO_TEST("netboot-proxy-network");
DO_TEST("nat-network-dns-txt-record");
+ DO_TEST("nat-network-dns-srv-record");
+ DO_TEST("nat-network-dns-srv-record-minimal");
DO_TEST("nat-network-dns-hosts");
return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
diff --git a/tests/networkxml2xmlin/nat-network-dns-srv-record-minimal.xml b/tests/networkxml2xmlin/nat-network-dns-srv-record-minimal.xml
new file mode 100644
index 0000000..e9b7680
--- /dev/null
+++ b/tests/networkxml2xmlin/nat-network-dns-srv-record-minimal.xml
@@ -0,0 +1,26 @@
+<network>
+ <name>default</name>
+ <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+ <forward dev='eth1' mode='nat'>
+ <interface dev='eth1'/>
+ </forward>
+ <bridge name='virbr0' stp='on' delay='0' />
+ <dns>
+ <srv service='name' protocol='tcp' />
+ </dns>
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
+ <dhcp>
+ <range start='192.168.122.2' end='192.168.122.254' />
+ <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+ <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+ </dhcp>
+ </ip>
+ <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+ </ip>
+ <ip family='ipv4' address='10.24.10.1'>
+ </ip>
+</network>
diff --git a/tests/networkxml2xmlin/nat-network-dns-srv-record.xml b/tests/networkxml2xmlin/nat-network-dns-srv-record.xml
new file mode 100644
index 0000000..4be85b5
--- /dev/null
+++ b/tests/networkxml2xmlin/nat-network-dns-srv-record.xml
@@ -0,0 +1,26 @@
+<network>
+ <name>default</name>
+ <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+ <forward dev='eth1' mode='nat'>
+ <interface dev='eth1'/>
+ </forward>
+ <bridge name='virbr0' stp='on' delay='0' />
+ <dns>
+ <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10' />
+ </dns>
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
+ <dhcp>
+ <range start='192.168.122.2' end='192.168.122.254' />
+ <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+ <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+ </dhcp>
+ </ip>
+ <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+ </ip>
+ <ip family='ipv4' address='10.24.10.1'>
+ </ip>
+</network>
diff --git a/tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml b/tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml
new file mode 100644
index 0000000..e9b7680
--- /dev/null
+++ b/tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml
@@ -0,0 +1,26 @@
+<network>
+ <name>default</name>
+ <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+ <forward dev='eth1' mode='nat'>
+ <interface dev='eth1'/>
+ </forward>
+ <bridge name='virbr0' stp='on' delay='0' />
+ <dns>
+ <srv service='name' protocol='tcp' />
+ </dns>
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
+ <dhcp>
+ <range start='192.168.122.2' end='192.168.122.254' />
+ <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+ <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+ </dhcp>
+ </ip>
+ <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+ </ip>
+ <ip family='ipv4' address='10.24.10.1'>
+ </ip>
+</network>
diff --git a/tests/networkxml2xmlout/nat-network-dns-srv-record.xml b/tests/networkxml2xmlout/nat-network-dns-srv-record.xml
new file mode 100644
index 0000000..4be85b5
--- /dev/null
+++ b/tests/networkxml2xmlout/nat-network-dns-srv-record.xml
@@ -0,0 +1,26 @@
+<network>
+ <name>default</name>
+ <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+ <forward dev='eth1' mode='nat'>
+ <interface dev='eth1'/>
+ </forward>
+ <bridge name='virbr0' stp='on' delay='0' />
+ <dns>
+ <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10' />
+ </dns>
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
+ <dhcp>
+ <range start='192.168.122.2' end='192.168.122.254' />
+ <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+ <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+ </dhcp>
+ </ip>
+ <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+ </ip>
+ <ip family='ipv4' address='10.24.10.1'>
+ </ip>
+</network>
--
1.7.7.3
12 years, 10 months
[libvirt] [PATCH] qemu: Fix memory leaks
by ajia@redhat.com
From: Alex Jia <ajia(a)redhat.com>
Detected by Coverity. Leaks introduced in commit 93ab585 and
commit e8d6b29.
Signed-off-by: Alex Jia <ajia(a)redhat.com>
---
src/qemu/qemu_driver.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index fbaa824..6a1e7cc 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6014,6 +6014,7 @@ static int qemuDomainSetBlkioParameters(virDomainPtr dom,
}
if (j != ndevices) {
ret = -1;
+ VIR_FREE(devices);
continue;
}
if (qemuDomainMergeDeviceWeights(&vm->def->blkio.devices,
@@ -7867,7 +7868,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
virDomainDefPtr persistentDef = NULL;
int ret = -1;
virDomainNetDefPtr net = NULL, persistentNet = NULL;
- virNetDevBandwidthPtr bandwidth = NULL;
+ virNetDevBandwidthPtr bandwidth = NULL, newBandwidth = NULL;
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -7989,8 +7990,6 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- virNetDevBandwidthPtr newBandwidth;
-
if (VIR_ALLOC(newBandwidth) < 0) {
virReportOOMError();
goto cleanup;
@@ -8056,6 +8055,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
ret = 0;
cleanup:
virNetDevBandwidthFree(bandwidth);
+ virNetDevBandwidthFree(newBandwidth);
virCgroupFree(&group);
if (vm)
virDomainObjUnlock(vm);
--
1.7.1
12 years, 10 months
[libvirt] [PATCHv2 0/6] Expose per-disk label overrides.
by Eric Blake
In a system that uses dynamic_ownership=0 and NFS disks, the _only_
path in the virDomainDestroy path where libvirt itself performs a
syscall on the NFS file system was on attempting to relabel a disk
back to its default label. If an NFS server hosting a domain's
disk image hangs, then this renders libvirtd stuck in an lstat()
call, with the driver lock held, effectively blocking out _all_
other attempts to connect to libvirtd for any remaining domains not
tied to the hung NFS server. (Verification that the SELinux relabel
was the only point where libvirtd, rather than not qemu, could hang,
was done by Red Hat VDSM folks in https://bugzilla.redhat.com/746666;
with a hack to avoid the relabel, the destroy no longer hangs.)
But without bleeding edge NFS servers, you can't put a SELinux
label on the file in the first place; libvirt was happily ignoring
the failure to change the label on domain start (thanks to the
selinux virt_use_nfs bool), only to hang on the stuck server on
domain destroy that it would have again ignored had the server not
been stuck. If we allow the users to modify the XML to mark that
a file does not need to be labeled in the first place, then we can
avoid both attempts to label at startup and relabel at destroy, thus
preventing libvirtd from getting stuck on a virDomainDestroy()
called on a guest whose NFS server went down.
This patch series is based on an earlier attempt (the hack which
got tested in the above-mentioned bz 746666), incorporating feedback
from Dan Berrange suggesting that the ability for the user to
override labeling on a per-disk basis is smarter than marking
ignored failure to label in internal XML used only by libvirtd:
v1: https://www.redhat.com/archives/libvir-list/2011-December/msg00246.html
I'm still working on patch 6/6 (actually hooking up the security
manager to honor the relabel='no' request), and hope to post that
tomorrow as part of this thread; that's really the only patch that
resembles anything from v1 (the first 5 patches are basically brand
new to this series), but I'm posting the first 5 patches now to get
review started and make sure the proposed XML makes sense.
I envision that this can be further expanded (sticking <seclabel>
elements on more XML items that get labeled in the host), but for
now I focused just on disk devices, as those are the most likely
to reside over NFS.
Ultimately, this patch series is only a bandaid; the underlying
problem (making a syscall that can block indefinitely on a hung
NFS server while holding the driver lock) is still present, and
triggered if you have dynamic_ownership=1 (where we also attempt
a chown of the disk image, regardless of the SELinux labels).
Later down the road, I also plan to work on Dan's proposal to
break the driver lock into smaller, more manageable sections, so
we can get back to our documented goal of never blocking while
holding lock, but instead using the job condition variables to
detect when a single domain is stuck on a blocked call:
https://www.redhat.com/archives/libvir-list/2011-November/msg00267.html
Eric Blake (5):
schema: rewrite seclabel rng to match code
seclabel: refactor existing domain_conf usage
seclabel: move seclabel stuff earlier
seclabel: extend XML to allow per-disk label overrides
seclabel: allow a seclabel override on a disk src
docs/formatdomain.html.in | 29 ++-
docs/schemas/domaincommon.rng | 115 +++++--
src/conf/domain_conf.c | 414 ++++++++++++--------
src/conf/domain_conf.h | 39 +-
.../qemuxml2argv-seclabel-dynamic-baselabel.args | 4 +
.../qemuxml2argv-seclabel-dynamic-baselabel.xml | 28 ++
.../qemuxml2argv-seclabel-dynamic-override.args | 5 +
.../qemuxml2argv-seclabel-dynamic-override.xml | 40 ++
.../qemuxml2argv-seclabel-dynamic.args | 4 +
.../qemuxml2argv-seclabel-dynamic.xml | 26 ++
.../qemuxml2argv-seclabel-static-relabel.args | 4 +
.../qemuxml2argv-seclabel-static-relabel.xml | 29 ++
.../qemuxml2argv-seclabel-static.args | 4 +
.../qemuxml2argv-seclabel-static.xml | 28 ++
tests/qemuxml2argvtest.c | 6 +
tests/qemuxml2xmltest.c | 4 +
16 files changed, 575 insertions(+), 204 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-baselabel.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-baselabel.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-static-relabel.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-static-relabel.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.xml
--
1.7.7.4
12 years, 10 months
[libvirt] [PATCH 0/3] python: Fix memory leaks
by ajia@redhat.com
From: Alex Jia <ajia(a)redhat.com>
This series patches fix memory leaks issues. Detected by valgrind.
Alex Jia (3):
* python/libvirt-override.c: fix memory leaks on libvirt_virDomainBlockStatsFlags.
* python/libvirt-override.c: fix memory leaks on libvirt_virDomainGetSchedulerParameters
and libvirt_virDomainGetSchedulerParametersFlags.
* python/libvirt-override.c: fix memory leaks on libvirt_virDomainGetMemoryParameters.
Signed-off-by: Alex Jia <ajia(a)redhat.com>
---
python/libvirt-override.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/python/libvirt-override.c b/python/libvirt-override.c
index d2aad0f..a138090 100644
--- a/python/libvirt-override.c
+++ b/python/libvirt-override.c
@@ -176,6 +176,8 @@ libvirt_virDomainBlockStatsFlags(PyObject *self ATTRIBUTE_UNUSED,
key = libvirt_constcharPtrWrap(params[i].field);
PyDict_SetItem(info, key, val);
+ Py_DECREF(key);
+ Py_DECREF(val);
}
free(params);
@@ -369,6 +371,8 @@ libvirt_virDomainGetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED,
key = libvirt_constcharPtrWrap(params[i].field);
PyDict_SetItem(info, key, val);
+ Py_DECREF(key);
+ Py_DECREF(val);
}
free(params);
return(info);
@@ -451,6 +455,8 @@ libvirt_virDomainGetSchedulerParametersFlags(PyObject *self ATTRIBUTE_UNUSED,
key = libvirt_constcharPtrWrap(params[i].field);
PyDict_SetItem(info, key, val);
+ Py_DECREF(key);
+ Py_DECREF(val);
}
free(params);
return(info);
@@ -994,6 +1000,8 @@ libvirt_virDomainGetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
key = libvirt_constcharPtrWrap(params[i].field);
PyDict_SetItem(info, key, val);
+ Py_DECREF(key);
+ Py_DECREF(val);
}
free(params);
return(info);
--
1.7.1
12 years, 10 months
[libvirt] [test-API][PATCH v2] Add and update functions in domainAPI
by Wayne Sun
* add 9 new block related functions
block_pull(self, domname, device, bandwidth = 0, flag = 0)
block_resize(self, domname, device, size, flag = 0)
block_job_abort(self, domname, device, flag = 0)
block_job_set_speed(self, domname, device, bandwidth, flag = 0)
get_block_job_info(self, domname, device, flag = 0)
get_blkio_parameters(self, domname, flag)
get_block_io_tune(self, domname, device, flag)
set_blkio_parameters(self, domname, params, flag)
set_block_io_tune(self, domname, device, params, flag)
2 bugs related to parameters for 4 functions(get_blkio_parameters,
get_block_io_tune, set_blkio_parameters and set_block_io_tune),
it is considered in this patch, it could be updated later anyway.
* Add 2 memory parameters function
get_memory_parameters(self, domname, flag)
set_memory_parameters(self, domname, params, flag)
For set_memory_parameters(), the 'params' arguments should be a
dictionary contains selectable keys: hard_limit, soft_limit,
swap_hard_limit.
e.g.
{'hard_limit':10240, 'soft_limit':100000, 'swap_hard_limit':102400}
* Fix problems of 2 functions
memory_peek(self, domname)
set_sched_params_flags(self, domname, params, flags)
---
lib/domainAPI.py | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 101 insertions(+), 2 deletions(-)
diff --git a/lib/domainAPI.py b/lib/domainAPI.py
index a6efab7..91f2ba3 100644
--- a/lib/domainAPI.py
+++ b/lib/domainAPI.py
@@ -546,7 +546,7 @@ class DomainAPI(object):
def set_sched_params_flags(self, domname, params, flags):
try:
dom_obj = self.get_domain_by_name(domname)
- retval = dom_obj.setSchedulerParameters(params, flags)
+ retval = dom_obj.setSchedulerParametersFlags(params, flags)
return retval
except libvirt.libvirtError, e:
message = e.get_error_message()
@@ -581,6 +581,105 @@ class DomainAPI(object):
code = e.get_error_code()
raise exception.LibvirtAPI(message, code)
+ def block_pull(self, domname, device, bandwidth = 0, flag = 0):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.blockPull(device, bandwidth, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def block_resize(self, domname, device, size, flag = 0):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.blockResize(device, size, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def block_job_abort(self, domname, device, flag = 0):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.blockJobAbort(device, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def block_job_set_speed(self, domname, device, bandwidth, flag = 0):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.blockJobSetSpeed(device, bandwidth, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def get_block_job_info(self, domname, device, flag = 0):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.blockJobInfo(device, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def get_blkio_parameters(self, domname, flag):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.blkioParameters(flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def get_block_io_tune(self, domname, device, flag):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.blockIoTune(device, params, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def set_blkio_parameters(self, domname, params, flag):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.setBlkioParameters(params, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def set_block_io_tune(self, domname, device, params, flag):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.setBlockIoTune(device, params, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def get_memory_parameters(self, domname, flag):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.memoryParameters(flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
+ def set_memory_parameters(self, domname, params, flag):
+ try:
+ dom_obj = self.get_domain_by_name(domname)
+ return dom_obj.setMemoryParameters(params, flag)
+ except libvirt.libvirtError, e:
+ message = e.get_error_message()
+ code = e.get_error_code()
+ raise exception.LibvirtAPI(message, code)
+
def memory_stats(self, domname):
try:
dom_obj = self.get_domain_by_name(domname)
@@ -593,7 +692,7 @@ class DomainAPI(object):
def memory_peek(self, domname, start, size, buffer, flag = 0):
try:
dom_obj = self.get_domain_by_name(domname)
- return dom_obj.blockPeek(start, size, buffer, flag)
+ return dom_obj.memoryPeek(start, size, buffer, flag)
except libvirt.libvirtError, e:
message = e.get_error_message()
code = e.get_error_code()
--
1.7.1
12 years, 10 months