Hello community, here is the log from the commit of package libvirt for openSUSE:Factory checked in at Mon Sep 19 21:23:40 CEST 2011.
-------- --- libvirt/libvirt.changes 2011-08-25 04:34:18.000000000 +0200 +++ /mounts/work_src_done/STABLE/libvirt/libvirt.changes 2011-09-16 20:53:55.000000000 +0200 @@ -1,0 +2,62 @@ +Fri Sep 16 12:50:51 MDT 2011 - [email protected] + +- Enable building with libnetcontrol + +------------------------------------------------------------------- +Fri Sep 16 12:02:37 UTC 2011 - [email protected] + +- Select libnl-1_1-devel + +------------------------------------------------------------------- +Wed Sep 14 17:18:36 MDT 2011 - [email protected] + +- Set qemu migration speed unlimited when migrating to file + 7e5f6a51-rpc-generator.patch b12354be-mig-speed-1.patch + 1282bd80-mig-speed-2.patch 6f84e110-mig-speed-3.patch + 829bce17-mig-speed-4.patch 8fc40c51-mig-speed-5.patch + ef1065cf-mig-speed-6.patch 0257ba8f-mig-speed-7.patch + bnc#706436 + +------------------------------------------------------------------- +Wed Sep 14 16:12:49 MDT 2011 - [email protected] + +- Increase max size of buffer used to receive xend response + 57c95175-xend-buff-size.patch +- Don't overwrite useful error messages in legacy xen driver + 32620dab-fix-xen-err-msg.patch + bnc#711096 + +------------------------------------------------------------------- +Wed Sep 14 15:49:37 MDT 2011 - [email protected] + +- Add upstream patches to stop excessive logging + 7f2498ef-no-log-invalid.patch 6ff9fc26-quiet-libxl-logging.patch + +------------------------------------------------------------------- +Wed Sep 14 12:06:36 MDT 2011 - [email protected] + +- Add 'Conflicts: kvm < 0.14.1' to ensure libvirt is using a + kvm package that creates qemu user:group. Remove user:group + creation from libvirt + bnc#694883 +- Add libvirt group at package installation + bnc#694885 + +------------------------------------------------------------------- +Thu Sep 8 11:11:07 MDT 2011 - [email protected] + +- Explicitly add 'BuildRequires: libgcrypt-devel' since it is no + longer required by libgnutls-devel + +------------------------------------------------------------------- +Thu Sep 8 10:21:11 MDT 2011 - [email protected] + +- netcf is buggy and not well maintained in SUSE. Disable it in + libvirt + +------------------------------------------------------------------- +Thu Sep 8 10:15:32 MDT 2011 - [email protected] + +- polkit support was mistakenly disabled, re-enable + +------------------------------------------------------------------- calling whatdependson for head-i586 New: ---- 0257ba8f-mig-speed-7.patch 1282bd80-mig-speed-2.patch 32620dab-fix-xen-err-msg.patch 57c95175-xend-buff-size.patch 6f84e110-mig-speed-3.patch 6ff9fc26-quiet-libxl-logging.patch 7e5f6a51-rpc-generator.patch 7f2498ef-no-log-invalid.patch 829bce17-mig-speed-4.patch 8fc40c51-mig-speed-5.patch b12354be-mig-speed-1.patch ef1065cf-mig-speed-6.patch libvirt-suse-netcontrol.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libvirt.spec ++++++ --- /var/tmp/diff_new_pack.1kgu5u/_old 2011-09-19 21:23:30.000000000 +0200 +++ /var/tmp/diff_new_pack.1kgu5u/_new 2011-09-19 21:23:30.000000000 +0200 @@ -60,10 +60,13 @@ %define with_selinux 0%{!?_without_selinux:%{server_drivers}} %define with_apparmor 0%{!?_without_apparmor:%{server_drivers}} +# Optional bits on by default +%define with_polkit 0%{!?_without_polkit:1} + # A few optional bits off by default, we enable later -%define with_polkit 0%{!?_without_polkit:0} %define with_capng 0%{!?_without_capng:0} %define with_netcf 0%{!?_without_netcf:0} +%define with_netcontrol 0%{!?_without_netcontrol:0} %define with_udev 0%{!?_without_udev:0} %define with_hal 0%{!?_without_hal:0} %define with_yajl 0%{!?_without_yajl:0} @@ -126,17 +129,17 @@ %define with_hal 0%{!?_without_hal:%{server_drivers}} %endif +# netcontrol is used to manage network interfaces on openSUSE >= 12.1 +%if 0%{?suse_version} >= 1210 +%define with_netcontrol 0%{!?_without_netcontrol:%{server_drivers}} +%endif + # libcapng is used to manage capabilities in 11.3 or newer. # It is also used by lxc and needs to be enabled if lxc is enabled. %if 0%{?suse_version} >= 1130 || %{with_lxc} %define with_capng 0%{!?_without_capng:1} %endif -# netcf is used to manage network interfaces in 11.4 or newer -%if 0%{?suse_version} >= 1140 -%define with_netcf 0%{!?_without_netcf:%{server_drivers}} -%endif - # Enable yajl library for JSON mode with QEMU in 11.4 or newer %if 0%{?suse_version} >= 1140 %define with_yajl 0%{!?_without_yajl:%{server_drivers}} @@ -190,7 +193,8 @@ BuildRequires: ncurses-devel BuildRequires: gettext BuildRequires: libtasn1-devel -BuildRequires: gnutls-devel +BuildRequires: libgnutls-devel +BuildRequires: libgcrypt-devel BuildRequires: bridge-utils BuildRequires: fdupes BuildRequires: pkg-config @@ -239,9 +243,6 @@ %if %{with_yajl} BuildRequires: libyajl-devel %endif -%if %{with_macvtap} -BuildRequires: libnl-devel -%endif %if %{with_esx} BuildRequires: libcurl-devel %endif @@ -251,6 +252,9 @@ %if %{with_netcf} BuildRequires: netcf-devel >= 0.1.4 %endif +%if %{with_netcontrol} +BuildRequires: libnetcontrol-devel >= 0.2.0 +%endif %if %{with_network} BuildRequires: dnsmasq >= 2.41 BuildRequires: iptables-devel @@ -263,7 +267,11 @@ BuildRequires: libpcap-devel %endif %if %{with_libnl} +%if 0%{?suse_version} < 1210 BuildRequires: libnl-devel +%else +BuildRequires: libnl-1_1-devel +%endif %endif %if %{with_storage_fs} # For mount/umount in FS driver @@ -297,6 +305,7 @@ Version: 0.9.4 Release: 3 Summary: A C toolkit to interract with the virtualization capabilities of Linux +Conflicts: kvm < 0.14.1 # The client side, i.e. shared libs and virsh are in a subpackage Requires: %{name}-client = %{version}-%{release} @@ -362,6 +371,18 @@ Source99: baselibs.conf # Upstream patches Patch0: 9e093f0b-libvirtd-sighup.patch +Patch1: 32620dab-fix-xen-err-msg.patch +Patch2: 57c95175-xend-buff-size.patch +Patch3: 6ff9fc26-quiet-libxl-logging.patch +Patch4: 7f2498ef-no-log-invalid.patch +Patch5: 7e5f6a51-rpc-generator.patch +Patch6: b12354be-mig-speed-1.patch +Patch7: 1282bd80-mig-speed-2.patch +Patch8: 6f84e110-mig-speed-3.patch +Patch9: 829bce17-mig-speed-4.patch +Patch10: 8fc40c51-mig-speed-5.patch +Patch11: ef1065cf-mig-speed-6.patch +Patch12: 0257ba8f-mig-speed-7.patch # Need to go upstream Patch100: xen-name-for-devid.patch Patch101: clone.patch @@ -373,6 +394,9 @@ %if %{with_apparmor} Patch250: install-apparmor-profiles.patch %endif +%if %{with_netcontrol} +Patch300: libvirt-suse-netcontrol.patch +%endif BuildRoot: %{_tmppath}/%{name}-%{version}-build %description @@ -458,7 +482,6 @@ Karel Zak <[email protected]> %if %{with_python} - %package python License: LGPLv2.1+ Summary: A C toolkit to interract with the virtualization capabilities of Linux @@ -482,6 +505,18 @@ %prep %setup -q %patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 %patch100 -p1 %patch101 %patch102 -p1 @@ -491,6 +526,9 @@ %if %{with_apparmor} %patch250 -p1 %endif +%if %{with_netcontrol} +%patch300 -p1 +%endif %build %if ! %{with_xen} @@ -559,6 +597,9 @@ %if ! %{with_netcf} %define _without_netcf --without-netcf %endif +%if ! %{with_netcontrol} +%define _without_netcontrol --without-netcontrol +%endif %if ! %{with_hal} %define _without_hal --without-hal %endif @@ -615,6 +656,7 @@ %{?_without_apparmor} \ %{?_without_capng} \ %{?_without_netcf} \ + %{?_without_netcontrol} \ %{?_without_hal} \ %{?_without_udev} \ %{?_without_yajl} \ @@ -710,6 +752,10 @@ %clean rm -rf $RPM_BUILD_ROOT +%pre +%{_bindir}/getent group libvirt >/dev/null || \ + %{_sbindir}/groupadd -r libvirt 2>/dev/null + %post /sbin/ldconfig %if %{with_libvirtd} @@ -723,15 +769,6 @@ > %{_sysconfdir}/libvirt/qemu/networks/default.xml fi %endif -# Create qemu user:group if necessary -if test "%{qemu_user}" = "qemu"; then - %{_bindir}/getent group qemu >/dev/null || \ - %{_sbindir}/groupadd -r qemu 2>/dev/null - %{_bindir}/getent group kvm >/dev/null && group_opts="-G kvm" - %{_bindir}/getent passwd qemu >/dev/null || \ - %{_sbindir}/useradd -r -g qemu $group_opts -d / -s /sbin/nologin \ - -c "qemu user" qemu -fi %if 0%{?sles_version} %{fillup_and_insserv -y libvirtd} %else @@ -757,7 +794,6 @@ %postun client -p /sbin/ldconfig %if %{with_libvirtd} - %files %defattr(-, root, root) %{_sbindir}/libvirtd @@ -887,7 +923,6 @@ %doc %{_docdir}/%{name}/html %if %{with_python} - %files python %defattr(-, root, root) %doc %{_docdir}/%{name}-python ++++++ 0257ba8f-mig-speed-7.patch ++++++ commit 0257ba8f9f4bf522a106aa2bbb4756e391a3dd42 Author: Jim Fehlig <[email protected]> Date: Fri Aug 26 12:10:27 2011 -0600 Use max bandwidth from qemuDomainObjPrivate struct when migrating Adjust qemuMigrationRun() to use migMaxBandwidth in qemuDomainObjPrivate structure when setting qemu migration speed. Caller-specified 'resource' parameter overrides migMaxBandwidth. Index: libvirt-0.9.4/src/qemu/qemu_migration.c =================================================================== --- libvirt-0.9.4.orig/src/qemu/qemu_migration.c +++ libvirt-0.9.4/src/qemu/qemu_migration.c @@ -1284,6 +1284,7 @@ static int doNativeMigrate(struct qemud_ qemuDomainObjPrivatePtr priv = vm->privateData; unsigned int background_flags = QEMU_MONITOR_MIGRATE_BACKGROUND; qemuMigrationCookiePtr mig = NULL; + unsigned long migrate_speed = resource ? resource : priv->migMaxBandwidth; VIR_DEBUG("driver=%p, vm=%p, uri=%s, cookiein=%s, cookieinlen=%d, " "cookieout=%p, cookieoutlen=%p, flags=%x, dname=%s, resource=%lu", driver, vm, uri, NULLSTR(cookiein), cookieinlen, @@ -1334,8 +1335,7 @@ static int doNativeMigrate(struct qemud_ QEMU_ASYNC_JOB_MIGRATION_OUT) < 0) goto cleanup; - if (resource > 0 && - qemuMonitorSetMigrationSpeed(priv->mon, resource) < 0) { + if (qemuMonitorSetMigrationSpeed(priv->mon, migrate_speed) < 0) { qemuDomainObjExitMonitorWithDriver(driver, vm); goto cleanup; } @@ -1506,6 +1506,7 @@ static int doTunnelMigrate(struct qemud_ int ret = -1; qemuMigrationCookiePtr mig = NULL; qemuMigrationIOThreadPtr iothread = NULL; + unsigned long migrate_speed = resource ? resource : priv->migMaxBandwidth; VIR_DEBUG("driver=%p, vm=%p, st=%p, cookiein=%s, cookieinlen=%d, " "cookieout=%p, cookieoutlen=%p, flags=%lx, resource=%lu", driver, vm, st, NULLSTR(cookiein), cookieinlen, @@ -1597,8 +1598,7 @@ static int doTunnelMigrate(struct qemud_ QEMU_ASYNC_JOB_MIGRATION_OUT) < 0) goto cleanup; - if (resource > 0 && - qemuMonitorSetMigrationSpeed(priv->mon, resource) < 0) { + if (qemuMonitorSetMigrationSpeed(priv->mon, migrate_speed) < 0) { qemuDomainObjExitMonitorWithDriver(driver, vm); goto cleanup; } ++++++ 1282bd80-mig-speed-2.patch ++++++ commit 1282bd80f752b1b11e031881b7b64dea214a2461 Author: Jim Fehlig <[email protected]> Date: Fri Aug 26 12:10:24 2011 -0600 virsh: Expose virDomainMigrateGetMaxSpeed API Index: libvirt-0.9.4/tools/virsh.c =================================================================== --- libvirt-0.9.4.orig/tools/virsh.c +++ libvirt-0.9.4/tools/virsh.c @@ -5200,6 +5200,45 @@ done: return ret; } +/* + * "migrate-getspeed" command + */ +static const vshCmdInfo info_migrate_getspeed[] = { + {"help", N_("Get the maximum migration bandwidth")}, + {"desc", N_("Get the maximum migration bandwidth (in Mbps) for a domain.")}, + {NULL, NULL} +}; + +static const vshCmdOptDef opts_migrate_getspeed[] = { + {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")}, + {NULL, 0, 0, NULL} +}; + +static bool +cmdMigrateGetMaxSpeed(vshControl *ctl, const vshCmd *cmd) +{ + virDomainPtr dom = NULL; + unsigned long bandwidth; + bool ret = false; + + if (!vshConnectionUsability(ctl, ctl->conn)) + return false; + + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) + return false; + + if (virDomainMigrateGetMaxSpeed(dom, &bandwidth, 0) < 0) + goto done; + + vshPrint(ctl, "%lu\n", bandwidth); + + ret = true; + +done: + virDomainFree(dom); + return ret; +} + typedef enum { VSH_CMD_BLOCK_JOB_ABORT = 0, VSH_CMD_BLOCK_JOB_INFO = 1, @@ -12519,6 +12558,8 @@ static const vshCmdDef domManagementCmds opts_migrate_setmaxdowntime, info_migrate_setmaxdowntime, 0}, {"migrate-setspeed", cmdMigrateSetMaxSpeed, opts_migrate_setspeed, info_migrate_setspeed, 0}, + {"migrate-getspeed", cmdMigrateGetMaxSpeed, + opts_migrate_getspeed, info_migrate_getspeed, 0}, {"reboot", cmdReboot, opts_reboot, info_reboot, 0}, {"restore", cmdRestore, opts_restore, info_restore, 0}, {"resume", cmdResume, opts_resume, info_resume, 0}, Index: libvirt-0.9.4/tools/virsh.pod =================================================================== --- libvirt-0.9.4.orig/tools/virsh.pod +++ libvirt-0.9.4/tools/virsh.pod @@ -619,6 +619,10 @@ to be down at the end of live migration. Set the maximum migration bandwidth (in Mbps) for a domain which is being migrated to another host. +=item B<migrate-getspeed> I<domain-id> + +Get the maximum migration bandwidth (in Mbps) for a domain. + =item B<reboot> I<domain-id> Reboot a domain. This acts just as if the domain had the B<reboot> ++++++ 32620dab-fix-xen-err-msg.patch ++++++ commit 32620dabb12df70e14a645c20797b7658cd89e02 Author: Jim Fehlig <[email protected]> Date: Thu Sep 1 16:22:38 2011 -0600 Don't overwrite errors from xend_{get,req} xenDaemonDomainFetch() was overwriting errors reported by xend_get() and xend_req(). E.g. without patch error: failed Xen syscall xenDaemonDomainFetch failed to find this domain with patch error: internal error Xend returned HTTP Content-Length of 73817, which exceeds maximum of 65536 diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index f44d674..957cd17 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -359,8 +359,10 @@ xend_get(virConnectPtr xend, const char *path, ret = xend_req(s, content); VIR_FORCE_CLOSE(s); - if (((ret < 0) || (ret >= 300)) && - ((ret != 404) || (!STRPREFIX(path, "/xend/domain/")))) { + if (ret < 0) + return ret; + + if ((ret >= 300) && ((ret != 404) || (!STRPREFIX(path, "/xend/domain/")))) { virXendError(VIR_ERR_GET_FAILED, _("%d status from xen daemon: %s:%s"), ret, path, NULLSTR(*content)); @@ -1810,12 +1812,8 @@ xenDaemonDomainFetch(virConnectPtr conn, root = sexpr_get(conn, "/xend/domain/%s?detail=1", name); else root = sexpr_get(conn, "/xend/domain/%d?detail=1", domid); - if (root == NULL) { - virXendError(VIR_ERR_XEN_CALL, - "%s", _("xenDaemonDomainFetch failed to" - " find this domain")); + if (root == NULL) return (NULL); - } priv = (xenUnifiedPrivatePtr) conn->privateData; ++++++ 57c95175-xend-buff-size.patch ++++++ commit 57c95175e271ca63b3f1be44efef8997f20ffe13 Author: Jim Fehlig <[email protected]> Date: Thu Sep 1 16:40:46 2011 -0600 Increase size of buffer for xend response On systems with many pcpus, the sexpr returned by xend can be quite large for dom0 when it is configured to have #vcpus = #pcpus (default). E.g. on a 80 pcpu system, where dom0 had 80 vcpus, the sexpr details for dom0 was 73817 bytes! Increase maximum buffer size to 256k. diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 957cd17..0a7fb48 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -56,7 +56,7 @@ * The number of Xen scheduler parameters */ -#define XEND_RCV_BUF_MAX_LEN 65536 +#define XEND_RCV_BUF_MAX_LEN (256 * 1024) static int virDomainXMLDevID(virDomainPtr domain, ++++++ 6f84e110-mig-speed-3.patch ++++++ commit 6f84e110d61e6e99ee80809f1d3c2c6dde352965 Author: Jim Fehlig <[email protected]> Date: Fri Aug 26 12:10:22 2011 -0600 Store max migration bandwidth in qemuDomainObjPrivate struct The maximum bandwidth that can be consumed when migrating a domain is better classified as an operational vs configuration parameter of the dommain. As such, store this parameter in qemuDomainObjPrivate structure. Index: libvirt-0.9.4/src/qemu/qemu_domain.c =================================================================== --- libvirt-0.9.4.orig/src/qemu/qemu_domain.c +++ libvirt-0.9.4/src/qemu/qemu_domain.c @@ -215,6 +215,8 @@ static void *qemuDomainObjPrivateAlloc(v if (qemuDomainObjInitJob(priv) < 0) VIR_FREE(priv); + priv->migMaxBandwidth = QEMU_DOMAIN_DEFAULT_MIG_BANDWIDTH_MAX; + return priv; } Index: libvirt-0.9.4/src/qemu/qemu_domain.h =================================================================== --- libvirt-0.9.4.orig/src/qemu/qemu_domain.h +++ libvirt-0.9.4/src/qemu/qemu_domain.h @@ -36,6 +36,9 @@ (1 << VIR_DOMAIN_VIRT_KVM) | \ (1 << VIR_DOMAIN_VIRT_XEN)) +# define QEMU_DOMAIN_DEFAULT_MIG_BANDWIDTH_MAX (32 << 20) +# define QEMU_DOMAIN_FILE_MIG_BANDWIDTH_MAX (INT64_MAX / (1024 * 1024)) + # define JOB_MASK(job) (1 << (job - 1)) # define DEFAULT_JOB_MASK \ (JOB_MASK(QEMU_JOB_QUERY) | \ @@ -113,6 +116,8 @@ struct _qemuDomainObjPrivate { char *lockState; bool fakeReboot; + + unsigned long migMaxBandwidth; }; struct qemuDomainWatchdogEvent ++++++ 6ff9fc26-quiet-libxl-logging.patch ++++++ commit 6ff9fc26d3672cd6e822a20a70d9d36ee3e0c173 Author: Daniel P. Berrange <[email protected]> Date: Wed Aug 31 16:53:09 2011 +0100 Stop libxl driver polluting logs on non-Xen hosts If the libxl driver is compiled in, then everytime libvirtd starts up on a non-Xen Dom0 host, it logs a error message. Since this is an expected condition, we should not log at 'error' level, only 'info'. * src/libxl/libxl_driver.c: Lower log level for certain expected errors during driver init diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d6e0c28..91da438 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -963,19 +963,19 @@ libxlStartup(int privileged) { libxl_driver->logger = (xentoollog_logger *)xtl_createlogger_stdiostream(libxl_driver->logger_file, XTL_DEBUG, 0); if (!libxl_driver->logger) { - VIR_ERROR(_("cannot create logger for libxenlight")); + VIR_INFO("cannot create logger for libxenlight, disabling driver"); goto fail; } if (libxl_ctx_init(&libxl_driver->ctx, LIBXL_VERSION, libxl_driver->logger)) { - VIR_ERROR(_("cannot initialize libxenlight context")); + VIR_INFO("cannot initialize libxenlight context, probably not running in a Xen Dom0, disabling driver"); goto fail; } if ((ver_info = libxl_get_version_info(&libxl_driver->ctx)) == NULL) { - VIR_ERROR(_("cannot version information from libxenlight")); + VIR_INFO("cannot version information from libxenlight, disabling driver"); goto fail; } libxl_driver->version = (ver_info->xen_version_major * 1000000) + ++++++ 7e5f6a51-rpc-generator.patch ++++++ commit 7e5f6a516c1b0066206364655be31276056da147 Author: Jim Fehlig <[email protected]> Date: Fri Aug 26 11:46:41 2011 -0600 Fix generator to cope with call-by-ref long types From: Matthias Bolte <[email protected]> Tested-by: Jim Fehlig <[email protected]> Matthias provided this patch to fix an issue I encountered in the generator with APIs containing call-by-ref long type, e.g. int virDomainMigrateGetMaxSpeed(virDomainPtr domain, unsigned long *bandwidth, unsigned int flags); diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl index 0d344e8..f671ff0 100755 --- a/src/rpc/gendispatch.pl +++ b/src/rpc/gendispatch.pl @@ -640,10 +640,11 @@ elsif ($opt_b) { } elsif ($ret_member =~ m/^(?:unsigned )?hyper (\S+)<\S+>;/) { # error out on unannotated arrays die "hyper array without insert@<offset> annotation: $ret_member"; - } elsif ($ret_member =~ m/^(unsigned )?hyper (\S+);/) { + } elsif ($ret_member =~ m/^(unsigned )?hyper (\S+);(?:\s*\/\*\s*insert@(\d+)\s*\*\/)?/) { my $type_name = $1; my $ret_name = $2; my $ret_assign; + my $insert = $3; if (hyper_to_long($call->{ProcName}, "ret", $ret_name)) { my $sign = ""; $sign = "U" if ($1); @@ -657,7 +658,13 @@ elsif ($opt_b) { push(@vars_list, "$type_name $ret_name"); push(@ret_list, $ret_assign); - $single_ret_var = $ret_name; + + if ($insert) { + splice(@args_list, int($insert), 0, "&$ret_name"); + $single_ret_var = undef; + } else { + $single_ret_var = $ret_name; + } if ($call->{ProcName} eq "DomainGetMaxMemory" or $call->{ProcName} eq "NodeGetFreeMemory") { @@ -1285,6 +1292,24 @@ elsif ($opt_k) { $single_ret_var = "int rv = -1"; $single_ret_type = "int"; + } elsif ($ret_member =~ m/^(unsigned )?hyper (\S+);\s*\/\*\s*insert@(\d+)\s*\*\//) { + my $type_name = $1; + my $sign = ""; $sign = "U" if ($1); + my $ret_name = $2; + my $insert = $3; + + if (hyper_to_long($call->{ProcName}, "ret", $ret_name)) { + $type_name .= "long"; + push(@ret_list, "if ($ret_name) HYPER_TO_${sign}LONG(*$ret_name, ret.$ret_name);"); + } else { + $type_name .= "long long"; + push(@ret_list, "if ($ret_name) *$ret_name = ret.$ret_name;"); + } + + splice(@args_list, int($insert), 0, ("$type_name *$ret_name")); + push(@ret_list, "rv = 0;"); + $single_ret_var = "int rv = -1"; + $single_ret_type = "int"; } elsif ($ret_member =~ m/^unsigned hyper (\S+);/) { my $ret_name = $1; ++++++ 7f2498ef-no-log-invalid.patch ++++++ commit 7f2498efe45505135ed75c6548c21a89674cb6ba Author: Daniel Veillard <[email protected]> Date: Tue Sep 13 18:24:13 2011 +0800 Do not log invalid operations in libvirtd logs This is a bit painful for example when starting virt-manager it tends to clutter libvirtd.log with invalid operation on cpu pinning for defined but not running domains. A priori those kind of errors don't indicate an error when executing the command but on a precondition for running the API, and honnestly while the application should report it, logging it as an error in libvirtd.log is not really useful, Related bug: https://bugzilla.redhat.com/show_bug.cgi?id=590807 * daemon/libvirtd.c: extend daemonErrorLogFilter() to filter out errors of type VIR_ERR_OPERATION_INVALID Index: libvirt-0.9.4/daemon/libvirtd.c =================================================================== --- libvirt-0.9.4.orig/daemon/libvirtd.c +++ libvirt-0.9.4/daemon/libvirtd.c @@ -392,6 +392,7 @@ static int daemonErrorLogFilter(virError case VIR_ERR_NO_NWFILTER: case VIR_ERR_NO_SECRET: case VIR_ERR_NO_DOMAIN_SNAPSHOT: + case VIR_ERR_OPERATION_INVALID: return VIR_LOG_DEBUG; } ++++++ 829bce17-mig-speed-4.patch ++++++ commit 829bce174c8a958dee4eb5b1fea63e0f5f914af8 Author: Jim Fehlig <[email protected]> Date: Fri Aug 26 12:10:23 2011 -0600 Impl virDomainMigrateGetMaxSpeed in qemu driver Index: libvirt-0.9.4/src/qemu/qemu_driver.c =================================================================== --- libvirt-0.9.4.orig/src/qemu/qemu_driver.c +++ libvirt-0.9.4/src/qemu/qemu_driver.c @@ -8329,6 +8329,40 @@ static int qemuDomainSnapshotSetCurrentI } +static int +qemuDomainMigrateGetMaxSpeed(virDomainPtr dom, + unsigned long *bandwidth, + unsigned int flags) +{ + struct qemud_driver *driver = dom->conn->privateData; + virDomainObjPtr vm; + qemuDomainObjPrivatePtr priv; + int ret = -1; + + virCheckFlags(0, -1); + + qemuDriverLock(driver); + vm = virDomainFindByUUID(&driver->domains, dom->uuid); + qemuDriverUnlock(driver); + + if (!vm) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(dom->uuid, uuidstr); + qemuReportError(VIR_ERR_NO_DOMAIN, + _("no domain with matching uuid '%s'"), uuidstr); + goto cleanup; + } + + priv = vm->privateData; + *bandwidth = priv->migMaxBandwidth; + ret = 0; + +cleanup: + if (vm) + virDomainObjUnlock(vm); + return ret; +} + static int qemuDomainSnapshotIsAllowed(virDomainObjPtr vm) { int i; @@ -9494,6 +9528,7 @@ static virDriver qemuDriver = { .domainAbortJob = qemuDomainAbortJob, /* 0.7.7 */ .domainMigrateSetMaxDowntime = qemuDomainMigrateSetMaxDowntime, /* 0.8.0 */ .domainMigrateSetMaxSpeed = qemuDomainMigrateSetMaxSpeed, /* 0.9.0 */ + .domainMigrateGetMaxSpeed = qemuDomainMigrateGetMaxSpeed, /* 0.9.5 */ .domainEventRegisterAny = qemuDomainEventRegisterAny, /* 0.8.0 */ .domainEventDeregisterAny = qemuDomainEventDeregisterAny, /* 0.8.0 */ .domainManagedSave = qemuDomainManagedSave, /* 0.8.0 */ ++++++ 8fc40c51-mig-speed-5.patch ++++++ commit 8fc40c511c08143cb64ff0d212942dde8e81c279 Author: Jim Fehlig <[email protected]> Date: Fri Aug 26 12:10:25 2011 -0600 Save migration speed in qemuDomainMigrateSetMaxSpeed Now that migration speed is stored in qemuDomainObjPrivate structure, save the new value when invoking qemuDomainMigrateSetMaxSpeed(). Allow setting migration speed on inactive domain too. Index: libvirt-0.9.4/src/qemu/qemu_driver.c =================================================================== --- libvirt-0.9.4.orig/src/qemu/qemu_driver.c +++ libvirt-0.9.4/src/qemu/qemu_driver.c @@ -8202,32 +8202,26 @@ qemuDomainMigrateSetMaxSpeed(virDomainPt return -1; } - if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MIGRATION_OP) < 0) - goto cleanup; - - if (!virDomainObjIsActive(vm)) { - qemuReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("domain is not running")); - goto endjob; - } - priv = vm->privateData; - - if (priv->job.asyncJob != QEMU_ASYNC_JOB_MIGRATION_OUT) { - qemuReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("domain is not being migrated")); - goto endjob; + if (virDomainObjIsActive(vm)) { + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MIGRATION_OP) < 0) + goto cleanup; + + VIR_DEBUG("Setting migration bandwidth to %luMbs", bandwidth); + qemuDomainObjEnterMonitor(driver, vm); + ret = qemuMonitorSetMigrationSpeed(priv->mon, bandwidth); + qemuDomainObjExitMonitor(driver, vm); + + if (ret == 0) + priv->migMaxBandwidth = bandwidth; + + if (qemuDomainObjEndJob(driver, vm) == 0) + vm = NULL; + } else { + priv->migMaxBandwidth = bandwidth; + ret = 0; } - VIR_DEBUG("Setting migration bandwidth to %luMbs", bandwidth); - qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorSetMigrationSpeed(priv->mon, bandwidth); - qemuDomainObjExitMonitor(driver, vm); - -endjob: - if (qemuDomainObjEndJob(driver, vm) == 0) - vm = NULL; - cleanup: if (vm) virDomainObjUnlock(vm); ++++++ b12354be-mig-speed-1.patch ++++++ commit b12354befee9f8e88d3d5d96390856af8f05eb2f Author: Jim Fehlig <[email protected]> Date: Fri Aug 26 12:10:21 2011 -0600 Add public API for getting migration speed Includes impl of python binding since the generator was not able to cope. Note: Requires gendispatch.pl patch from Matthias Bolte https://www.redhat.com/archives/libvir-list/2011-August/msg01367.html Index: libvirt-0.9.4/docs/apibuild.py =================================================================== --- libvirt-0.9.4.orig/docs/apibuild.py +++ libvirt-0.9.4/docs/apibuild.py @@ -1643,7 +1643,8 @@ class CParser: "virDomainSetMemory" : (False, ("memory")), "virDomainSetMemoryFlags" : (False, ("memory")), "virDomainBlockJobSetSpeed" : (False, ("bandwidth")), - "virDomainBlockPull" : (False, ("bandwidth")) } + "virDomainBlockPull" : (False, ("bandwidth")), + "virDomainMigrateGetMaxSpeed" : (False, ("bandwidth")) } def checkLongLegacyFunction(self, name, return_type, signature): if "long" in return_type and "long long" not in return_type: Index: libvirt-0.9.4/include/libvirt/libvirt.h.in =================================================================== --- libvirt-0.9.4.orig/include/libvirt/libvirt.h.in +++ libvirt-0.9.4/include/libvirt/libvirt.h.in @@ -711,6 +711,10 @@ int virDomainMigrateSetMaxSpeed(virDomai unsigned long bandwidth, unsigned int flags); +int virDomainMigrateGetMaxSpeed(virDomainPtr domain, + unsigned long *bandwidth, + unsigned int flags); + /** * VIR_NODEINFO_MAXCPUS: * @nodeinfo: virNodeInfo instance Index: libvirt-0.9.4/python/generator.py =================================================================== --- libvirt-0.9.4.orig/python/generator.py +++ libvirt-0.9.4/python/generator.py @@ -372,6 +372,7 @@ skip_impl = ( 'virNodeGetCPUStats', 'virNodeGetMemoryStats', 'virDomainGetBlockJobInfo', + 'virDomainMigrateGetMaxSpeed', ) Index: libvirt-0.9.4/python/libvirt-override-api.xml =================================================================== --- libvirt-0.9.4.orig/python/libvirt-override-api.xml +++ libvirt-0.9.4/python/libvirt-override-api.xml @@ -356,5 +356,11 @@ <arg name='flags' type='unsigned int' info='fine-tuning flags, currently unused, pass 0.'/> <return type='virDomainBlockJobInfo' info='A dictionary containing job information.' /> </function> + <function name='virDomainMigrateGetMaxSpeed' file='python'> + <info>Get currently configured maximum migration speed for a domain</info> + <arg name='domain' type='virDomainPtr' info='a domain object'/> + <arg name='flags' type='unsigned int' info='flags, currently unused, pass 0.'/> + <return type='unsigned long' info='current max migration speed, or None in case of error'/> + </function> </symbols> </api> Index: libvirt-0.9.4/python/libvirt-override.c =================================================================== --- libvirt-0.9.4.orig/python/libvirt-override.c +++ libvirt-0.9.4/python/libvirt-override.c @@ -4543,6 +4543,29 @@ libvirt_virDomainSendKey(PyObject *self return py_retval; } +static PyObject * +libvirt_virDomainMigrateGetMaxSpeed(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { + PyObject *py_retval; + int c_retval; + unsigned long bandwidth; + virDomainPtr domain; + PyObject *pyobj_domain; + + if (!PyArg_ParseTuple(args, (char *)"O:virDomainMigrateGetMaxSpeed", &pyobj_domain)) + return(NULL); + + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virDomainMigrateGetMaxSpeed(domain, &bandwidth, 0); + LIBVIRT_END_ALLOW_THREADS; + + if (c_retval < 0) + return VIR_PY_INT_FAIL; + py_retval = libvirt_ulongWrap(bandwidth); + return(py_retval); +} + /************************************************************************ * * * The registration stuff * @@ -4632,6 +4655,7 @@ static PyMethodDef libvirtMethods[] = { {(char *) "virDomainRevertToSnapshot", libvirt_virDomainRevertToSnapshot, METH_VARARGS, NULL}, {(char *) "virDomainGetBlockJobInfo", libvirt_virDomainGetBlockJobInfo, METH_VARARGS, NULL}, {(char *) "virDomainSendKey", libvirt_virDomainSendKey, METH_VARARGS, NULL}, + {(char *) "virDomainMigrateGetMaxSpeed", libvirt_virDomainMigrateGetMaxSpeed, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; Index: libvirt-0.9.4/src/driver.h =================================================================== --- libvirt-0.9.4.orig/src/driver.h +++ libvirt-0.9.4/src/driver.h @@ -531,6 +531,11 @@ typedef int unsigned int flags); typedef int + (*virDrvDomainMigrateGetMaxSpeed)(virDomainPtr domain, + unsigned long *bandwidth, + unsigned int flags); + +typedef int (*virDrvDomainEventRegisterAny)(virConnectPtr conn, virDomainPtr dom, int eventID, @@ -827,6 +832,7 @@ struct _virDriver { virDrvDomainGetJobInfo domainGetJobInfo; virDrvDomainAbortJob domainAbortJob; virDrvDomainMigrateSetMaxDowntime domainMigrateSetMaxDowntime; + virDrvDomainMigrateGetMaxSpeed domainMigrateGetMaxSpeed; virDrvDomainMigrateSetMaxSpeed domainMigrateSetMaxSpeed; virDrvDomainEventRegisterAny domainEventRegisterAny; virDrvDomainEventDeregisterAny domainEventDeregisterAny; Index: libvirt-0.9.4/src/libvirt.c =================================================================== --- libvirt-0.9.4.orig/src/libvirt.c +++ libvirt-0.9.4/src/libvirt.c @@ -15157,6 +15157,57 @@ error: } /** + * virDomainMigrateGetMaxSpeed: + * @domain: a domain object + * @bandwidth: return value of current migration bandwidth limit in Mbps + * @flags: fine-tuning flags, currently unused, use 0 + * + * Get the current maximum bandwidth (in Mbps) that will be used if the + * domain is migrated. Not all hypervisors will support a bandwidth limit. + * + * Returns 0 in case of success, -1 otherwise. + */ +int +virDomainMigrateGetMaxSpeed(virDomainPtr domain, + unsigned long *bandwidth, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(domain, "bandwidth = %p, flags=%x", bandwidth, flags); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_DOMAIN(domain)) { + virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); + virDispatchError(NULL); + return -1; + } + + if (!bandwidth) { + virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__); + goto error; + } + + conn = domain->conn; + if (conn->flags & VIR_CONNECT_RO) { + virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + if (conn->driver->domainMigrateGetMaxSpeed) { + if (conn->driver->domainMigrateGetMaxSpeed(domain, bandwidth, flags) < 0) + goto error; + return 0; + } + + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + virDispatchError(conn); + return -1; +} + +/** * virConnectDomainEventRegisterAny: * @conn: pointer to the connection * @dom: pointer to the domain Index: libvirt-0.9.4/src/libvirt_public.syms =================================================================== --- libvirt-0.9.4.orig/src/libvirt_public.syms +++ libvirt-0.9.4/src/libvirt_public.syms @@ -480,4 +480,9 @@ LIBVIRT_0.9.4 { virDomainBlockPull; } LIBVIRT_0.9.3; +LIBVIRT_0.9.5 { + global: + virDomainMigrateGetMaxSpeed; +} LIBVIRT_0.9.4; + # .... define new API here using predicted next version number .... Index: libvirt-0.9.4/src/remote/remote_driver.c =================================================================== --- libvirt-0.9.4.orig/src/remote/remote_driver.c +++ libvirt-0.9.4/src/remote/remote_driver.c @@ -4327,6 +4327,7 @@ static virDriver remote_driver = { .domainAbortJob = remoteDomainAbortJob, /* 0.7.7 */ .domainMigrateSetMaxDowntime = remoteDomainMigrateSetMaxDowntime, /* 0.8.0 */ .domainMigrateSetMaxSpeed = remoteDomainMigrateSetMaxSpeed, /* 0.9.0 */ + .domainMigrateGetMaxSpeed = remoteDomainMigrateGetMaxSpeed, /* 0.9.5 */ .domainEventRegisterAny = remoteDomainEventRegisterAny, /* 0.8.0 */ .domainEventDeregisterAny = remoteDomainEventDeregisterAny, /* 0.8.0 */ .domainManagedSave = remoteDomainManagedSave, /* 0.8.0 */ Index: libvirt-0.9.4/src/remote/remote_protocol.x =================================================================== --- libvirt-0.9.4.orig/src/remote/remote_protocol.x +++ libvirt-0.9.4/src/remote/remote_protocol.x @@ -1913,6 +1913,16 @@ struct remote_domain_migrate_set_max_spe unsigned int flags; }; +struct remote_domain_migrate_get_max_speed_args { + remote_nonnull_domain dom; + unsigned int flags; +}; + +struct remote_domain_migrate_get_max_speed_ret { + unsigned hyper bandwidth; /* insert@1 */ +}; + + struct remote_domain_events_register_any_args { int eventID; }; @@ -2475,7 +2485,8 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_BLOCK_JOB_SET_SPEED = 239, /* autogen autogen */ REMOTE_PROC_DOMAIN_BLOCK_PULL = 240, /* autogen autogen */ - REMOTE_PROC_DOMAIN_EVENT_BLOCK_JOB = 241 /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_EVENT_BLOCK_JOB = 241, /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_MIGRATE_GET_MAX_SPEED = 242 /* autogen autogen */ /* * Notice how the entries are grouped in sets of 10 ? Index: libvirt-0.9.4/src/remote_protocol-structs =================================================================== --- libvirt-0.9.4.orig/src/remote_protocol-structs +++ libvirt-0.9.4/src/remote_protocol-structs @@ -1429,6 +1429,14 @@ struct remote_domain_migrate_set_max_spe uint64_t bandwidth; u_int flags; }; +struct remote_domain_migrate_get_max_speed_args { + remote_nonnull_domain dom; + u_int flags; +}; +struct remote_domain_migrate_get_max_speed_ret { + uint64_t bandwidth; +}; + struct remote_domain_events_register_any_args { int eventID; }; @@ -1936,4 +1944,5 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_BLOCK_JOB_SET_SPEED = 239, REMOTE_PROC_DOMAIN_BLOCK_PULL = 240, REMOTE_PROC_DOMAIN_EVENT_BLOCK_JOB = 241, + REMOTE_PROC_DOMAIN_MIGRATE_GET_MAX_SPEED = 242, }; Index: libvirt-0.9.4/src/rpc/gendispatch.pl =================================================================== --- libvirt-0.9.4.orig/src/rpc/gendispatch.pl +++ libvirt-0.9.4/src/rpc/gendispatch.pl @@ -222,6 +222,7 @@ my $long_legacy = { NodeGetInfo => { ret => { memory => 1 } }, DomainBlockPull => { arg => { bandwidth => 1 } }, DomainBlockJobSetSpeed => { arg => { bandwidth => 1 } }, + DomainMigrateGetMaxSpeed => { ret => { bandwidth => 1 } }, }; sub hyper_to_long ++++++ ef1065cf-mig-speed-6.patch ++++++ commit ef1065cf5acad13767c054758cbe7f4e8af5d241 Author: Jim Fehlig <[email protected]> Date: Fri Aug 26 12:10:26 2011 -0600 Set qemu migration speed unlimited when migrating to file The qemu migration speed default is 32MiB/s as defined in migration.c /* Migration speed throttling */ static int64_t max_throttle = (32 << 20); There's no need to throttle migration when targeting a file, so set migration speed to unlimited prior to migration, and restore to libvirt default value after migration. Default units is MB for migrate_set_speed monitor command, so (INT64_MAX / (1024 * 1024)) is used for unlimited migration speed. Tested with both json and text monitors. Index: libvirt-0.9.4/src/qemu/qemu_migration.c =================================================================== --- libvirt-0.9.4.orig/src/qemu/qemu_migration.c +++ libvirt-0.9.4/src/qemu/qemu_migration.c @@ -2675,6 +2675,16 @@ qemuMigrationToFile(struct qemud_driver bool restoreLabel = false; virCommandPtr cmd = NULL; int pipeFD[2] = { -1, -1 }; + unsigned long saveMigBandwidth = priv->migMaxBandwidth; + + /* Increase migration bandwidth to unlimited since target is a file. + * Failure to change migration speed is not fatal. */ + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) { + qemuMonitorSetMigrationSpeed(priv->mon, + QEMU_DOMAIN_FILE_MIG_BANDWIDTH_MAX); + priv->migMaxBandwidth = QEMU_DOMAIN_FILE_MIG_BANDWIDTH_MAX; + qemuDomainObjExitMonitorWithDriver(driver, vm); + } if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD) && (!compressor || pipe(pipeFD) == 0)) { @@ -2783,6 +2793,13 @@ qemuMigrationToFile(struct qemud_driver ret = 0; cleanup: + /* Restore max migration bandwidth */ + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) { + qemuMonitorSetMigrationSpeed(priv->mon, saveMigBandwidth); + priv->migMaxBandwidth = saveMigBandwidth; + qemuDomainObjExitMonitorWithDriver(driver, vm); + } + VIR_FORCE_CLOSE(pipeFD[0]); VIR_FORCE_CLOSE(pipeFD[1]); virCommandFree(cmd); ++++++ libvirt-suse-netcontrol.patch ++++++ Index: libvirt-0.9.4/configure.ac =================================================================== --- libvirt-0.9.4.orig/configure.ac +++ libvirt-0.9.4/configure.ac @@ -63,6 +63,7 @@ AVAHI_REQUIRED="0.6.0" POLKIT_REQUIRED="0.6" PARTED_REQUIRED="1.8.0" NETCF_REQUIRED="0.1.4" +NETCONTROL_REQUIRED="0.2.0" UDEV_REQUIRED=145 PCIACCESS_REQUIRED=0.10.0 XMLRPC_REQUIRED=1.14.0 @@ -1591,6 +1592,38 @@ AM_CONDITIONAL([WITH_NETCF], [test "$wit AC_SUBST([NETCF_CFLAGS]) AC_SUBST([NETCF_LIBS]) +AC_ARG_WITH([netcontrol], + AC_HELP_STRING([--with-netcontrol], [SUSE netcontrol support to configure physical host network interfaces @<:@default=check@:>@]), + [], + [test "$with_netcontrol" = "yes" && with_netcontrol=no || with_netcontrol=check]) + +NETCONTROL_CFLAGS= +NETCONTROL_LIBS= +if test "$with_netcf" = "yes"; then + if test "$with_netcontrol" = "yes" || test "$with_netcontrol" = "check"; then + AC_MSG_WARN([netcf and netcontrol cannot be used together, disabling netcontrol]) + with_netcontrol=no + fi +fi + +if test "$with_netcontrol" = "yes" || test "$with_netcontrol" = "check"; then + PKG_CHECK_MODULES(NETCONTROL, netcontrol >= $NETCONTROL_REQUIRED, + [with_netcontrol=yes], [ + if test "$with_netcontrol" = "check" ; then + with_netcontrol=no + else + AC_MSG_ERROR( + [You must install netcontrol >= $NETCONTROL_REQUIRED to compile libvirt]) + fi + ]) + if test "$with_netcontrol" = "yes" ; then + AC_DEFINE_UNQUOTED([WITH_NETCONTROL], 1, + [whether libnetcontrol is available to configure physical host network interfaces]) + fi +fi +AM_CONDITIONAL([WITH_NETCONTROL], [test "$with_netcontrol" = "yes"]) +AC_SUBST([NETCONTROL_CFLAGS]) +AC_SUBST([NETCONTROL_LIBS]) AC_ARG_WITH([secrets], AC_HELP_STRING([--with-secrets], [with local secrets management driver @<:@default=yes@:>@]),[],[with_secrets=yes]) @@ -2460,6 +2493,7 @@ AC_MSG_NOTICE([ Remote: $with_remote]) AC_MSG_NOTICE([ Network: $with_network]) AC_MSG_NOTICE([Libvirtd: $with_libvirtd]) AC_MSG_NOTICE([ netcf: $with_netcf]) +AC_MSG_NOTICE([ netctrl: $with_netcontrol]) AC_MSG_NOTICE([ macvtap: $with_macvtap]) AC_MSG_NOTICE([virtport: $with_virtualport]) AC_MSG_NOTICE([]) @@ -2586,6 +2620,11 @@ AC_MSG_NOTICE([ netcf: $NETCF_CFLAGS $ else AC_MSG_NOTICE([ netcf: no]) fi +if test "$with_netcontrol" = "yes" ; then +AC_MSG_NOTICE([ netctrl: $NETCONTROL_CFLAGS $NETCONTROL_LIBS]) +else +AC_MSG_NOTICE([ netctrl: no]) +fi if test "$with_qemu" = "yes" && test "$LIBPCAP_FOUND" != "no"; then AC_MSG_NOTICE([ pcap: $LIBPCAP_CFLAGS $LIBPCAP_LIBS]) else Index: libvirt-0.9.4/daemon/Makefile.am =================================================================== --- libvirt-0.9.4.orig/daemon/Makefile.am +++ libvirt-0.9.4/daemon/Makefile.am @@ -141,6 +141,10 @@ endif if WITH_NETCF libvirtd_LDADD += ../src/libvirt_driver_interface.la +else +if WITH_NETCONTROL + libvirtd_LDADD += ../src/libvirt_driver_interface.la +endif endif if WITH_NODE_DEVICES Index: libvirt-0.9.4/daemon/libvirtd.c =================================================================== --- libvirt-0.9.4.orig/daemon/libvirtd.c +++ libvirt-0.9.4/daemon/libvirtd.c @@ -74,6 +74,10 @@ # endif # ifdef WITH_NETCF # include "interface/netcf_driver.h" +# else +# ifdef WITH_NETCONTROL +# include "interface/netcf_driver.h" +# endif # endif # ifdef WITH_STORAGE_DIR # include "storage/storage_driver.h" @@ -428,6 +432,10 @@ static void daemonInitialize(void) # endif # ifdef WITH_NETCF interfaceRegister(); +#else +# ifdef WITH_NETCONTROL + interfaceRegister(); +# endif # endif # ifdef WITH_STORAGE_DIR storageRegister(); Index: libvirt-0.9.4/src/Makefile.am =================================================================== --- libvirt-0.9.4.orig/src/Makefile.am +++ libvirt-0.9.4/src/Makefile.am @@ -870,6 +870,24 @@ libvirt_driver_interface_la_LIBADD += .. libvirt_driver_interface_la_LDFLAGS += -module -avoid-version endif libvirt_driver_interface_la_SOURCES = $(INTERFACE_DRIVER_SOURCES) +else +if WITH_NETCONTROL +if WITH_DRIVER_MODULES +mod_LTLIBRARIES += libvirt_driver_interface.la +else +noinst_LTLIBRARIES += libvirt_driver_interface.la +libvirt_la_BUILT_LIBADD += libvirt_driver_interface.la +endif +libvirt_driver_interface_la_CFLAGS = $(NETCONTROL_CFLAGS) \ + -I@top_srcdir@/src/conf $(AM_CFLAGS) +libvirt_driver_interface_la_LDFLAGS = $(AM_LDFLAGS) +libvirt_driver_interface_la_LIBADD = $(NETCONTROL_LIBS) +if WITH_DRIVER_MODULES +libvirt_driver_interface_la_LIBADD += ../gnulib/lib/libgnu.la +libvirt_driver_interface_la_LDFLAGS += -module -avoid-version +endif +libvirt_driver_interface_la_SOURCES = $(INTERFACE_DRIVER_SOURCES) +endif endif if WITH_SECRETS Index: libvirt-0.9.4/src/interface/netcf_driver.c =================================================================== --- libvirt-0.9.4.orig/src/interface/netcf_driver.c +++ libvirt-0.9.4/src/interface/netcf_driver.c @@ -23,7 +23,13 @@ #include <config.h> +#ifdef WITH_NETCONTROL +#include <netcontrol/netcf.h> +#include <netcontrol/logger.h> +#include "logging.h" +#else #include <netcf.h> +#endif #include "virterror_internal.h" #include "datatypes.h" @@ -55,6 +61,39 @@ static void interfaceDriverUnlock(struct virMutexUnlock(&driver->lock); } +#ifdef WITH_NETCONTROL +static void interface_nc_log_driver(const char *category, + int priority, + const char *func, + const char *file ATTRIBUTE_UNUSED, + long long line, + const char *msg, + size_t len ATTRIBUTE_UNUSED) +{ + int vp; + const char *vc; + + switch(priority) { + case NC_LOG_FATAL: + case NC_LOG_ERROR: + vp = VIR_LOG_ERROR; + break; + case NC_LOG_WARN: + vp = VIR_LOG_WARN; + break; + case NC_LOG_INFO: + vp = VIR_LOG_INFO; + break; + case NC_LOG_DEBUG: + default: + vp = VIR_LOG_DEBUG; + break; + } + vc = category ? category : "netcontrol"; + virLogMessage(vc, vp, func, line, 0, "%s", msg); +} +#endif + static int netcf_to_vir_err(int netcf_errcode) { switch (netcf_errcode) @@ -140,6 +179,10 @@ static virDrvOpenStatus interfaceOpenInt goto mutex_error; } +#ifdef WITH_NETCONTROL + nc_logger_redirect_to(interface_nc_log_driver); +#endif + /* open netcf */ if (ncf_init(&driverState->netcf, NULL) != 0) { Index: libvirt-0.9.4/tools/virsh.c =================================================================== --- libvirt-0.9.4.orig/tools/virsh.c +++ libvirt-0.9.4/tools/virsh.c @@ -14904,6 +14904,10 @@ vshShowVersion(vshControl *ctl ATTRIBUTE #endif #ifdef WITH_NETCF vshPrint(ctl, " Netcf"); +#else +#ifdef WITH_NETCONTROL + vshPrint(ctl, " NetControl"); +#endif #endif #ifdef WITH_NWFILTER vshPrint(ctl, " Nwfilter"); ++++++ libvirtd-defaults.patch ++++++ --- /var/tmp/diff_new_pack.1kgu5u/_old 2011-09-19 21:23:30.000000000 +0200 +++ /var/tmp/diff_new_pack.1kgu5u/_new 2011-09-19 21:23:30.000000000 +0200 @@ -32,7 +32,7 @@ =================================================================== --- libvirt-0.9.4.orig/daemon/libvirtd.c +++ libvirt-0.9.4/daemon/libvirtd.c -@@ -880,7 +880,7 @@ daemonConfigNew(bool privileged ATTRIBUT +@@ -881,7 +881,7 @@ daemonConfigNew(bool privileged ATTRIBUT return NULL; } @@ -41,7 +41,7 @@ data->listen_tcp = 0; if (!(data->tls_port = strdup(LIBVIRTD_TLS_PORT))) -@@ -917,7 +917,7 @@ daemonConfigNew(bool privileged ATTRIBUT +@@ -918,7 +918,7 @@ daemonConfigNew(bool privileged ATTRIBUT #endif data->auth_tls = REMOTE_AUTH_NONE; ++++++ xen-name-for-devid.patch ++++++ --- /var/tmp/diff_new_pack.1kgu5u/_old 2011-09-19 21:23:30.000000000 +0200 +++ /var/tmp/diff_new_pack.1kgu5u/_new 2011-09-19 21:23:30.000000000 +0200 @@ -25,7 +25,7 @@ virDomainDeviceDefPtr dev, char *class, char *ref, -@@ -2807,7 +2808,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr +@@ -2805,7 +2806,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr sexpr = virBufferContentAndReset(&buf); @@ -34,7 +34,7 @@ /* device doesn't exist, define it */ ret = xend_op(domain->conn, domain->name, "op", "device_create", "config", sexpr, NULL); -@@ -2928,7 +2929,7 @@ xenDaemonUpdateDeviceFlags(virDomainPtr +@@ -2926,7 +2927,7 @@ xenDaemonUpdateDeviceFlags(virDomainPtr sexpr = virBufferContentAndReset(&buf); @@ -43,7 +43,7 @@ virXendError(VIR_ERR_OPERATION_INVALID, "%s", _("requested device does not exist")); goto cleanup; -@@ -3023,7 +3024,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr +@@ -3021,7 +3022,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr def, xml, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; @@ -52,7 +52,7 @@ goto cleanup; if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) { -@@ -3979,6 +3980,7 @@ struct xenUnifiedDriver xenDaemonDriver +@@ -3977,6 +3978,7 @@ struct xenUnifiedDriver xenDaemonDriver */ static int virDomainXMLDevID(virDomainPtr domain, @@ -60,7 +60,7 @@ virDomainDeviceDefPtr dev, char *class, char *ref, -@@ -3987,8 +3989,12 @@ virDomainXMLDevID(virDomainPtr domain, +@@ -3985,8 +3987,12 @@ virDomainXMLDevID(virDomainPtr domain, xenUnifiedPrivatePtr priv = domain->conn->privateData; char *xref; char *tmp; @@ -73,7 +73,7 @@ if (dev->data.disk->driverName && STREQ(dev->data.disk->driverName, "tap")) strcpy(class, "tap"); -@@ -3998,19 +4004,21 @@ virDomainXMLDevID(virDomainPtr domain, +@@ -3996,19 +4002,21 @@ virDomainXMLDevID(virDomainPtr domain, else strcpy(class, "vbd"); ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
