libvirt.git
17 min agonetwork: Fix upgrade from libvirt older than 1.2.4 master
Jiri Denemark [Wed, 26 Nov 2014 15:24:27 +0000]
network: Fix upgrade from libvirt older than 1.2.4

Starting from libvirt-1.2.4, network state XML files moved to another
directory (see commit b9e95491) and libvirt automatically migrates the
network state files to a new location. However, the code used
dirent.d_type which is not supported by all filesystems. Thus, when
libvirt was upgraded on a host which used such filesystem, network state
XMLs were not properly moved and running networks disappeared from
libvirt.

This patch falls back to lstat() whenever dirent.d_type is DT_UNKNOWN to
fix this issue.

https://bugzilla.redhat.com/show_bug.cgi?id=1167145
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

19 hours agoutil: Avoid calling closedir(NULL)
Jiri Denemark [Mon, 24 Nov 2014 16:37:13 +0000]
util: Avoid calling closedir(NULL)

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

41 hours agovirsh: document block.n.allocation stat
Eric Blake [Mon, 24 Nov 2014 20:58:20 +0000]
virsh: document block.n.allocation stat

Commit 7557ddf added some additional block.* stats to
virDomainListGetStats, but failed to document them in 'man
virsh'.  Also, I noticed some inconsistent use of commas.

* tools/virsh.pod (domstats): Tweak commas, add missing stats.

Signed-off-by: Eric Blake <eblake@redhat.com>

41 hours agodbus: fix arrays of bools
Eric Blake [Sat, 22 Nov 2014 00:03:34 +0000]
dbus: fix arrays of bools

Commit 2aa167ca tried to fix the DBus interaction code to allow
callers to use native types instead of 4-byte bools.  But in
fixing the issue, I missed the case of an arrayref; Conrad Meyer
shows the following valid complaint issued by clang:

CC util/libvirt_util_la-virdbus.lo
util/virdbus.c:956:13: error: cast from 'bool *' to 'dbus_bool_t *' (aka 'unsigned int *') increases required alignment from 1 to 4 [-Werror,-Wcast-align]
            GET_NEXT_VAL(dbus_bool_t, bool_val, bool, "%d");
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
util/virdbus.c:858:17: note: expanded from macro 'GET_NEXT_VAL'
            x = (dbustype *)(*xptrptr + (*narrayptr - 1));              \
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated.

But fixing that points out that we have NEVER supported arrayrefs
of sub-int types (byte, i16, u16, and now bool).  Again, while raw
types promote, arrays do not; so the macros HAVE to deal with both
size possibilities rather than assuming that an arrayref uses the
same sizing as the promoted raw type.

Obviously, our testsuite wasn't covering as much as it should have.

* src/util/virdbus.c (GET_NEXT_VAL): Also fix array cases.
(SET_NEXT_VAL): Fix uses of sub-int arrays.
* tests/virdbustest.c (testMessageArray, testMessageArrayRef):
Test it.

Signed-off-by: Eric Blake <eblake@redhat.com>

43 hours agoqemu: add the missing jobinfo type in qemuDomainGetJobInfo
Wang Rui [Tue, 25 Nov 2014 11:51:45 +0000]
qemu: add the missing jobinfo type in qemuDomainGetJobInfo

Commit 6fcddfcd refactored job statistics but missed the jobinfo type updated
in qemuDomainGetJobInfo. After this patch, we can use virDomainGetJobInfo to
get jobinfo type again.

Signed-off-by: Wang Rui <moon.wangrui@huawei.com>
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

45 hours agoResolve build breaker
John Ferlan [Tue, 25 Nov 2014 12:06:46 +0000]
Resolve build breaker

Commit 'c264eeaa' didn't do the prerequisite 'make syntax-check' before
pushing. There was a <tab> in the whitespace for the comment.  Replaced
with spaces and aligned.

pushed as build breaker since Jenkins complained loudly

46 hours agolxc: don't unmount subtree if it contains the source of the mount
Cédric Bosdonnat [Mon, 24 Nov 2014 14:10:19 +0000]
lxc: don't unmount subtree if it contains the source of the mount

The typical case where we had a problem is with such a filesystem
definition as created by virt-sandbox-service:

    <filesystem type='bind' accessmode='passthrough'>
      <source dir='/var/lib/libvirt/filesystems/mysshd/var'/>
      <target dir='/var'/>
    </filesystem>

In this case, we don't want to unmount the /var subtree or we may
loose the access to the source folder.

46 hours agolxc: be more patient while resolving symlinks
Cédric Bosdonnat [Fri, 21 Nov 2014 16:45:55 +0000]
lxc: be more patient while resolving symlinks

Resolving symlinks can fail before mounting any file system if one file
system depends on another being mounted. Symlinks are now resolved in
two passes:

  * Before any file system is mounted, but then we are more gentle if
    the source path can't be accessed
  * Right before mounting a file system, so that we are sure that we
    have the resolved path... but then if it can't be accessed we raise
    an error.

46 hours agoip link needs 'name' in 3.16 to create the veth pair
Cédric Bosdonnat [Thu, 20 Nov 2014 14:26:35 +0000]
ip link needs 'name' in 3.16 to create the veth pair

Due to a change (or bug?) in ip link implementation, the command
    'ip link add vnet0...'
is forced into
    'ip link add name vnet0...'
The changed command also works on older versions of iproute2, just the
'name' parameter has been made mandatory.

46 hours agovirt-aa-helper: /etc/libvirt-sandbox/services isn't restricted
Cédric Bosdonnat [Thu, 20 Nov 2014 10:32:38 +0000]
virt-aa-helper: /etc/libvirt-sandbox/services isn't restricted

To get virt-sandbox-service working with AppArmor, virt-aa-helper
needs not to choke on path in /etc/libvirt-sandbox/services.

46 hours agovirt-aa-helper wasn't running virErrorInitialize
Cédric Bosdonnat [Thu, 20 Nov 2014 10:31:44 +0000]
virt-aa-helper wasn't running virErrorInitialize

This turns out to be working by magic but needs to be fixed.

2 days agoqemu-command: introduce new vgamem attribute for QXL video device
Pavel Hrdina [Thu, 20 Nov 2014 18:52:00 +0000]
qemu-command: introduce new vgamem attribute for QXL video device

Add attribute to set vgamem_mb parameter of QXL device for QEMU. This
value sets the size of VGA framebuffer for QXL device. Default value in
QEMU is 8MB so reuse it also in libvirt to not break things.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1076098

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>

2 days agoqemu-command: use vram attribute for all video devices
Pavel Hrdina [Thu, 20 Nov 2014 18:51:12 +0000]
qemu-command: use vram attribute for all video devices

So far we didn't have any option to set video memory size for qemu video
devices. There was only the vram (ram for QXL) attribute but it was valid
only for the QXL video device.

To provide this feature to users QEMU has a dedicated device attribute
called 'vgamem_mb' to set the video memory size. We will use the 'vram'
attribute for setting video memory size for other QEMU video devices.

For the cirrus device we will ignore the vram value because it has
hardcoded video size in QEMU.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1076098

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>

2 days agocaps: introduce new QEMU capability for vgamem_mb device property
Pavel Hrdina [Wed, 12 Nov 2014 12:58:33 +0000]
caps: introduce new QEMU capability for vgamem_mb device property

Allow setting vgamem size for video devices.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1076098

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>

2 days agoQXL: fix setting ram and vram values for QEMU QXL device
Pavel Hrdina [Tue, 18 Nov 2014 16:21:48 +0000]
QXL: fix setting ram and vram values for QEMU QXL device

QEMU has two different type of QXL display device. The first "qxl-vga"
is for primary video device and second "qxl" is for secondary video
device.

There are also two different ways how to specify those devices on qemu
command line, the first one and obsolete is using "-vga" option and the
current new one is using "-device" option. The "-vga" could be used only
to setup primary video device, so the "-vga qxl" equal to
"-device qxl-vga". Unfortunately the "-vga qxl" doesn't support setting
additional parameters for the device and "-global" option must be used
for this purpose. It's mandatory to use "-global qxl-vga...." to set the
parameters of primary video device previously defined with "-vga qxl".

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1076098

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>

2 days agovideo: cleanup usage of vram attribute and update documentation
Pavel Hrdina [Mon, 24 Nov 2014 10:58:53 +0000]
video: cleanup usage of vram attribute and update documentation

The vram attribute was introduced to set the video memory but it is
usable only for few hypervisors excluding QEMU/KVM and the old XEN
driver. Only in case of QEMU the vram was used for QXL.

This patch updates the documentation to reflect current code in libvirt
and also changes the cases when we will set the default vram attribute.
It also fixes existing strange default value for VGA devices 9MB to 16MB
because the video ram should be rounded to power of two.

The change of default value could affect migrations but I found out that
QEMU always round the video ram to power of two internally so it's safe
to change the default value to the next closest power of two and also
silently correct every domain XML definition. And it's also safe because
we don't pass the value to QEMU.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1076098

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>

2 days agointernal: add macro to round value to the next closest power of 2
Pavel Hrdina [Tue, 18 Nov 2014 16:13:38 +0000]
internal: add macro to round value to the next closest power of 2

There are two special cases, if the input number is 0 or the number is
larger then 2^31 (for 32bit unsigned int). For the special cases the
return value is 0 because they cannot be rounded.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>

2 days agostorage_driver: fix a comment typo
Chen Hanxiao [Mon, 24 Nov 2014 06:13:20 +0000]
storage_driver: fix a comment typo

s/rereshed/refreshed

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>

2 days agovirsh: expose virDomainGetFSInfo
Tomoki Sekiyama [Sat, 22 Nov 2014 01:27:52 +0000]
virsh: expose virDomainGetFSInfo

Add a "domfsinfo" command that shows a list of filesystems info mounted in
the guest. For example:

virsh # domfsinfo vm1
Mountpoint                           Name     Type     Target
-------------------------------------------------------------------
/                                    sda1     ext4     hdc
/opt                                 dm-2     vfat     vda,vdb
/mnt/test                            sdb1     xfs      sda

Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>

2 days agoqemu: add test for qemuAgentGetFSInfo
Tomoki Sekiyama [Sat, 22 Nov 2014 01:27:45 +0000]
qemu: add test for qemuAgentGetFSInfo

Add test cases for qemuAgentGetFSInfo, with a sample agent response for
the qemu-get-fsinfo command and a configuration xml.

Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>

2 days agoqemu: Implement the qemu driver for virDomainGetFSInfo
Tomoki Sekiyama [Sat, 22 Nov 2014 01:27:38 +0000]
qemu: Implement the qemu driver for virDomainGetFSInfo

Get mounted filesystems list, which contains hardware info of disks and its
controllers, from QEMU guest agent 2.2+. Then, convert the hardware info
to corresponding device aliases for the disks.

Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>

2 days agoremote: Implement the remote protocol for virDomainGetFSInfo
Tomoki Sekiyama [Sat, 22 Nov 2014 01:27:31 +0000]
remote: Implement the remote protocol for virDomainGetFSInfo

Add daemon and driver code to (de-)serialize virDomainFSInfo.

Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>

2 days agoImplement public API for virDomainGetFSInfo
Tomoki Sekiyama [Sat, 22 Nov 2014 01:27:25 +0000]
Implement public API for virDomainGetFSInfo

virDomainGetFSInfo returns a list of filesystems information mounted in the
guest, which contains mountpoints, device names, filesystem types, and
device aliases named by libvirt. This will be useful, for example, to
specify mountpoints to fsfreeze when taking snapshot of a part of disks.

Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>

2 days agoqemu: Emit the guest agent lifecycle event
Peter Krempa [Wed, 19 Nov 2014 09:31:21 +0000]
qemu: Emit the guest agent lifecycle event

Add code to emit the event on change of the channel state and reconnect
to the qemu process.

2 days agoexamples: Add support for the guest agent lifecycle event
Peter Krempa [Wed, 19 Nov 2014 09:27:55 +0000]
examples: Add support for the guest agent lifecycle event

Add code to support the event in the object-event example.

2 days agoevent: Add guest agent lifecycle event
Peter Krempa [Wed, 19 Nov 2014 09:32:20 +0000]
event: Add guest agent lifecycle event

As qemu is now able to notify us about change of the channel state used
for communication with the guest agent we now can more precisely track
the state of the guest agent.

To allow notifying management apps this patch implements a new event
that will be triggered on changes of the guest agent state.

3 days agospec: Automatically apply all patches with git
Jiri Denemark [Fri, 21 Nov 2014 17:09:36 +0000]
spec: Automatically apply all patches with git

With this change, any patch declared in libvirt.spec with Patch[0-9]* is
automatically applied in %prep. Unlike with the standard %patch[0-9]*,
patches are applied with "git am" to avoid some unexpected results.
However, as a result of this, all patches must be in the right format
for "git am" to be able to apply them; they should ideally be generated
from git using "git format-patch".

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

3 days agoqemu: process: Refresh virtio channel guest state when connecting to mon
Peter Krempa [Thu, 13 Nov 2014 19:16:46 +0000]
qemu: process: Refresh virtio channel guest state when connecting to mon

Use data provided by "query-chardev" to refresh the guest frontend state
of virtio channels.

3 days agoqemu: chardev: Extract more information about character devices
Peter Krempa [Thu, 13 Nov 2014 18:29:14 +0000]
qemu: chardev: Extract more information about character devices

Improve the monitor function to also retrieve the guest state of
character device (if provided) so that we can refresh the state of
virtio-serial channels and perhaps react to changes in the state in
future patches.

This patch changes the returned data from qemuMonitorGetChardevInfo to
return a structure containing the pty path and the state for all the
character devices.

The change to the testsuite makes sure that the data is parsed
correctly.

5 days agolibxl: destroy domain in migration finish phase on failure
Jim Fehlig [Thu, 13 Nov 2014 00:52:02 +0000]
libxl: destroy domain in migration finish phase on failure

This patch contains three domain cleanup improvements in the migration
finish phase, ensuring a domain is properly disposed when a failure is
detected or the migration is cancelled.

The check for virDomainObjIsActive is moved to libxlDomainMigrationFinish,
where cleanup can occur if migration failed and the domain is inactive.

The 'cleanup' label was missplaced in libxlDomainMigrationFinish, causing
a migrated domain to remain in the event of an error or cancelled migration.

In cleanup, the domain was not removed from the driver's list of domains.

Signed-off-by: Jim Fehlig <jfehlig@suse.com>

5 days agolibxl: start domain paused on migration dst
Jim Fehlig [Thu, 13 Nov 2014 00:15:37 +0000]
libxl: start domain paused on migration dst

During the perform phase of migration, the domain is started on
the dst host in a running state if VIR_MIGRATE_PAUSED flag is not
specified.  In the finish phase, the domain is also unpaused if
VIR_MIGRATE_PAUSED flag is unset.  I've noticed this second unpause
fails if the domain was already unpaused following the perform phase.

This patch changes the perform phase to always start the domain
paused, and defers unpausing, if requested, to the finish phase.
Unpausing should occur in the finish phase anyhow, where the domain
can be properly destroyed if the perform phase fails and migration
is cancelled.

Signed-off-by: Jim Fehlig <jfehlig@suse.com>

5 days agolibxl: acquire job in migration finish phase
Jim Fehlig [Thu, 13 Nov 2014 21:41:56 +0000]
libxl: acquire job in migration finish phase

Moving data reception of the perform phase of migration to a
thread introduces a race with the finish phase, where checking
if the domain is active races with the thread finishing the
perform phase.  The race is easily solved by acquiring a job in
the finish phase, which must wait for the perform phase job to
complete.

While wrapping the finish phase in a job, noticed the virDomainObj
was being unlocked in a callee - libxlDomainMigrationFinish.  Move
the unlocking to libxlDomainMigrateFinish3Params, where the lock
is acquired.

Signed-off-by: Jim Fehlig <jfehlig@suse.com>

5 days agolibxl: Receive migration data in a thread
Jim Fehlig [Wed, 12 Nov 2014 22:32:02 +0000]
libxl: Receive migration data in a thread

The libxl driver receives migration data within an IO callback invoked
by the event loop, effectively disabling the event loop while migration
occurs.

This patch moves receving of the migration data to a thread.  The
incoming connection is still accepted in the IO callback, but control
is immediately returned to the event loop after spawning the thread.

Signed-off-by: Jim Fehlig <jfehlig@suse.com>

5 days agolibxl: Allow libxl to find pygrub binary.
Ian Campbell [Fri, 21 Nov 2014 14:32:53 +0000]
libxl: Allow libxl to find pygrub binary.

Specifying an explicit path to pygrub (e.g. BINDIR "/pygrub") only works if
Xen and libvirt happen to be installed to the same prefix. A more flexible
approach is to simply specify "pygrub" which will cause libxl to use the
correct path which it knows (since it is built with the same prefix as pygrub).

This is particular problematic in the Debian packaging, since the Debian Xen
package relocates pygrub into a libexec dir, however I think this change makes
sense upstream.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Jim Fehlig <jfehlig@suse.com>

5 days agostorage: rbd: Implement support for passing config file option
Peter Krempa [Tue, 11 Nov 2014 16:31:24 +0000]
storage: rbd: Implement support for passing config file option

To be able to express some use cases of the RBD backing with libvirt, we
need to be able to specify a config file for the RBD client to qemu as
that is one of the commonly used options.

5 days agostorage: rbd: qemu: Add support for specifying internal RBD snapshots
Peter Krempa [Tue, 11 Nov 2014 10:35:25 +0000]
storage: rbd: qemu: Add support for specifying internal RBD snapshots

Some storage systems have internal support for snapshots. Libvirt should
be able to select a correct snapshot when starting a VM.

This patch adds a XML element to select a storage source snapshot for
the RBD protocol which supports this feature.

5 days agostorage: Allow parsing of RBD backing strings when building backing chain
Peter Krempa [Tue, 4 Nov 2014 16:35:16 +0000]
storage: Allow parsing of RBD backing strings when building backing chain

As we now have a common function to parse backing store string for RBD
backing store we can reuse it in the backing store walker so that we
don't fail on files backed by RBD storage.

This patch also adds a few tests to verify that the parsing works as
expected.

5 days agoutil: storagefile: Split out parsing of NBD string into a separate func
Peter Krempa [Tue, 4 Nov 2014 13:07:53 +0000]
util: storagefile: Split out parsing of NBD string into a separate func

Split out the code so that the function looks homogenous after adding
more protocol specific parsers.

5 days agoutil: split out qemuParseRBDString into a common helper
Peter Krempa [Fri, 31 Oct 2014 16:49:56 +0000]
util: split out qemuParseRBDString into a common helper

To allow reuse this non-trivial parser code in the backing store parser
this part of the command line parser needs to be split out into a
separate funciton.

5 days agotests: Reflow the expected output from RBD disk test
Peter Krempa [Tue, 11 Nov 2014 09:37:27 +0000]
tests: Reflow the expected output from RBD disk test

Addition of tested cases to the test will be more obvious.

5 days agoqemu: Refactor qemuBuildNetworkDriveURI to take a virStorageSourcePtr
Peter Krempa [Mon, 10 Nov 2014 16:55:26 +0000]
qemu: Refactor qemuBuildNetworkDriveURI to take a virStorageSourcePtr

Instead of splitting out various fields, pass the complete structure and
let the function pick various things of it.

As one of the callers isn't using virStorageSourcePtr to store the data,
this patch adds glue code that fills the data into a dummy
virStorageSourcePtr before calling the func.

This change will help when adding new fields that need output processing
in the future.

5 days agoutil: storage: Copy hosts of a storage file only if they exist
Peter Krempa [Thu, 30 Oct 2014 10:52:17 +0000]
util: storage: Copy hosts of a storage file only if they exist

If there are no hosts for a storage source virStorageSourceCopy and
virStorageSourceNewFromBackingRelative would try to copy them anyways.
As the success of virStorageNetHostDefCopy is determined by returning
a pointer and malloc of 0 elements might return NULL according to the
implementation, the result of the copy function may vary.

Fix this by copying the hosts array only if there are hosts defined.

5 days agoutil: storage: Add notice for extension of struct virStorageSource
Peter Krempa [Thu, 30 Oct 2014 10:42:55 +0000]
util: storage: Add notice for extension of struct virStorageSource

As we now have a deep copy function for struct virStorageSource add a
notice that extensions of the structure require also appropriate changes
to the virStorageSourceCopy func.

5 days agoutil: buffer: Clarify scope of the escape operation in virBufferEscape
Peter Krempa [Tue, 11 Nov 2014 16:23:49 +0000]
util: buffer: Clarify scope of the escape operation in virBufferEscape

The escaping is applied only to the string, not the format argument.
State this fact in the docs.

5 days agotest: virstoragetest: Add testing of network disk details
Peter Krempa [Tue, 4 Nov 2014 13:26:45 +0000]
test: virstoragetest: Add testing of network disk details

To be able to fully test parsing of networked storage strings we need to
add a few fields for: hostname, protocol and auth string.

5 days agodocs: domain: Move docs for storage hosts under the <source> element
Peter Krempa [Wed, 12 Nov 2014 12:54:10 +0000]
docs: domain: Move docs for storage hosts under the <source> element

The docs describing the <host> element that are under the <source>
element in the XML document were incorrectly placed under the <disk>
element. Move them to the correct place.

5 days agovirsh: sync domdisplay help and manual
Martin Kletzander [Fri, 21 Nov 2014 10:10:21 +0000]
virsh: sync domdisplay help and manual

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

5 days agoqemu: Add handling for VSERPORT_CHANGE event
Peter Krempa [Thu, 13 Nov 2014 13:09:39 +0000]
qemu: Add handling for VSERPORT_CHANGE event

New qemu added a new event that is emitted when a virtio serial channel
is opened in the guest OS. This allows us to update the state of the
port in the output-only XML element.

This patch implements the monitor callbacks and necessary handlers to
update the state in the definition.

5 days agoconf: Add channel state for virtio channels to the XML
Peter Krempa [Wed, 29 Oct 2014 15:03:53 +0000]
conf: Add channel state for virtio channels to the XML

To track state of virtio channels this patch adds a new output-only
attribute called 'state' to the <target> element of virtio channels.

This will be later populated with the guest state of the channel.

5 days agoqemu: monitor: Rename and improve qemuMonitorGetPtyPaths
Peter Krempa [Thu, 13 Nov 2014 15:17:21 +0000]
qemu: monitor: Rename and improve qemuMonitorGetPtyPaths

To unify future additions that require information from "query-chardev"
rename qemuMonitorGetPtyPaths and friends to qemuMonitorGetChardevInfo
and move the allocation of the returned hash into the top level
function.

5 days agotest: xml2xml: Print full filenames if xml2xml test fails
Peter Krempa [Wed, 29 Oct 2014 14:53:36 +0000]
test: xml2xml: Print full filenames if xml2xml test fails

To simplify looking for a problem instrument the XML comparator function
with possibility to print the filename of the failed/expected XML
output.

This is necessary as the VIR_TEST_DIFFERENT macro possibly tests two XML
files for the inactive/active state and the resulting error may not be
obvious.

5 days agoconf: Annotate source enums for character device struct members
Peter Krempa [Wed, 29 Oct 2014 12:03:57 +0000]
conf: Annotate source enums for character device struct members

Add a comment to track which values may be present in certain members of
a struct _virDomainChrDef.

5 days agoqemu: process: report useful error if alias formatting fails
Peter Krempa [Thu, 13 Nov 2014 19:10:51 +0000]
qemu: process: report useful error if alias formatting fails

When retrieving the paths for PTY devices the alias gets formatted into
a static string. If it doesn't fit we wouldn't report an error.

6 days agodocs: fix a typo in formatdomain.html
Chen Fan [Fri, 21 Nov 2014 05:39:48 +0000]
docs: fix a typo in formatdomain.html

Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

6 days agostorage: qemu: Fix security labelling of new image chain elements
Peter Krempa [Wed, 19 Nov 2014 17:54:43 +0000]
storage: qemu: Fix security labelling of new image chain elements

When creating a disk image snapshot the libvirt code would blindly copy
the parents label to the newly created image. This runs into problems
when you start a VM from an image hosted on NFS (or other storage system
that doesn't support selinux labels) and the snapshot destination is on
a storage system that does support selinux labels. Libvirt's code in
that case generates a different security label for the image hosted on
NFS. This label is valid only for NFS images and doesn't allow access in
case of a locally stored image.

To fix this issue libvirt needs to refrain from copying security
information in cases where the default domain seclabel is a better
choice.

This patch repurposes the now unused @force argument of
virStorageSourceInitChainElement to denote whether a copy of the
security labelling stuff should be attempted or not. This allows to
fine-control the copy operation for cases where we need to keep the
label of the old disk vs. the cases where we need to keep the label
unset to use the default domain imagelabel.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1151718

6 days agobuild: fix build when not using dbus
Eric Blake [Thu, 20 Nov 2014 15:48:19 +0000]
build: fix build when not using dbus

Commit c0e7022 breaks on a machine that lacks dbus headers:

In file included from util/virdbus.c:24:0:
util/virdbuspriv.h:31:3: error: unknown type name 'dbus_int16_t'

* src/util/virdbuspriv.h (DBusBasicValue): Only provide fallback
when dbus is compiled.

Signed-off-by: Eric Blake <eblake@redhat.com>

6 days agobuild: avoid 32-bit failure on older gcc
Eric Blake [Thu, 20 Nov 2014 15:29:23 +0000]
build: avoid 32-bit failure on older gcc

On 32-bit platforms with old gcc (hello RHEL 5 gcc 4.1.2), the
build fails with:
virsh-domain.c: In function 'cmdBlockCopy':
virsh-domain.c:2172: warning: comparison is always false due to limited range of data type

Adjust the code to silence the warning.

* tools/virsh-domain.c (cmdBlockCopy): Pacify RHEL 5 gcc.

Signed-off-by: Eric Blake <eblake@redhat.com>

6 days agostorage: Add thread to refresh for createVport
John Ferlan [Tue, 18 Nov 2014 19:51:01 +0000]
storage: Add thread to refresh for createVport

https://bugzilla.redhat.com/show_bug.cgi?id=1152382

When libvirt create's the vport (VPORT_CREATE) for the vHBA, there isn't
enough "time" between the creation and the running of the following
backend->refreshPool after a backend->startPool in order to find the LU's.
Population of LU's happens asynchronously when udevEventHandleCallback
discovers the "new" vHBA port.  Creation of the infrastructure by udev
is an iterative process creating and discovering actual storage devices and
adjusting the environment.

Because of the time it takes to discover and set things up, the backend
refreshPool call done after the startPool call will generally fail to
find any devices. This leaves the newly started pool appear empty when
querying via 'vol-list' after startup. The "workaround" has always been
to run pool-refresh after startup (or any time thereafter) in order to
find the LU's. Depending on how quickly run after startup, this too may
not find any LUs in the pool. Eventually though given enough time and
retries it will find something if LU's exist for the vHBA.

This patch adds a thread to be executed after the VPORT_CREATE which will
attempt to find the LU's without requiring the external run of refresh-pool.
It does this by waiting for 5 seconds and searching for the LU's. If any
are found, then the thread completes; otherwise, it will retry once more
in another 5 seconds.  If none are found in that second pass, the thread
gives up.

Things learned while investigating this... No need to try and fill the
pool too quickly or too many times. Over the course of creation, the udev
code may 'add', 'change', and 'delete' the same device. So if the refresh
code runs and finds something, it may display it only to have a subsequent
refresh appear to "lose" the device. The udev processing doesn't seem to
have a way to indicate that it's all done with the creation processing of a
newly found vHBA. Only the Lone Ranger has silver bullets to fix everything.

6 days agostorage: Fix issue finding LU's when block doesn't exist
John Ferlan [Wed, 19 Nov 2014 15:06:22 +0000]
storage: Fix issue finding LU's when block doesn't exist

Fix a problem in the getBlockDevice and processLU where retval initialized
to zero causing some failures to erroneously continue through to the
virStorageBackendSCSINewLun with an attempt to find a path for "/dev/(null)".
This would fail approximately 10 seconds later with debug message:

virStorageBackendSCSINewLun:203 :
     No stable path found for '/dev/(null)' in '/dev/disk/by-path'

The root cause of the issue is for many /sys/bus/scsi/devices/<lun path>
there is no "block*" device found for the vHBA's, where "<lun path>" are
the various paths created for the vHBA, such as "17:0:0:0", "17:0:1:0",
"17:0:2:0", "17:0:3:0", etc.  If the block device isn't found, then the
directory should just be ignored rather than attempting to process it.

The bug was that in getBlockDevice the assumption was "block" would exist
and either getNewStyleBlockDevice or getOldStyleBlockDevice would fill in
@block_device. However, if 'block*' doesn't exist, then the code returned
NULL for block_device *and* a good (zero) retval value.  This caused the
processLU code to attempt the virStorageBackendSCSINewLun which failed
"at some point in time" in the future.

After this change - on test system the refresh-pool didn't have a noticable
pause of about 20 seconds - it completed within a second since no longer
was there an attempt/need to find "/dev/(null)".

Additionally, the virStorageBackendSCSIFindLU's shouldn't be declaring
found unless the processLU actually returns success. This will be
important in the followup patch which relies on whether a LU was found.

6 days agodocs: Remove references to unused libvirt-libvirt.html
Nehal J Wani [Thu, 20 Nov 2014 15:13:11 +0000]
docs: Remove references to unused libvirt-libvirt.html

The libvirt-libvirt.html file is no longer generated so
should not be referenced by the Makefile.am

6 days agobuild: fix build with older dbus headers
Eric Blake [Wed, 19 Nov 2014 21:57:30 +0000]
build: fix build with older dbus headers

Compilation on a RHEL 5 host failed, due to the older dbus headers
present on that machine, and triggered by commit 2aa167ca:

util/virdbus.c: In function 'virDBusMessageIterDecode':
util/virdbus.c:952: error: 'DBusBasicValue' undeclared (first use in this function)

* m4/virt-dbus.m4 (LIBVIRT_CHECK_DBUS): Check for DBusBasicValue.
* src/util/virdbuspriv.h (DBusBasicValue): Provide fallback.

Signed-off-by: Eric Blake <eblake@redhat.com>

6 days agorpc: do not fail if the pid of the connecting process is not set
Giuseppe Scrivano [Wed, 19 Nov 2014 14:54:14 +0000]
rpc: do not fail if the pid of the connecting process is not set

getsockopt(sock->fd, SOL_SOCKET, SO_PEERCRED, ...) sets the pid to 0
when the process that opens the connection is in another container.

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>

6 days agoutil: don't log failure when older iptables lacks -w
Eric Blake [Wed, 19 Nov 2014 23:18:55 +0000]
util: don't log failure when older iptables lacks -w

Commit dc33e6e4 caused older platforms like Fedora 20 to emit
scary log messages at startup:

2014-11-19 23:12:58.800+0000: 28906: error : virCommandWait:2532 : internal error: Child process (/usr/sbin/iptables -w -L -n) unexpected exit status 2: iptables v1.4.19.1: unknown option "-w"
Try `iptables -h' or 'iptables --help' for more information.

Since we are probing and expect to handle the case where -w is not
supported, we should not let virCommand log it as an error.

* src/util/virfirewall.c (virFirewallCheckUpdateLock): Handle
non-zero status ourselves.

Signed-off-by: Eric Blake <eblake@redhat.com>

6 days agoqemu: Really fix crash in tunnelled migration
Jiri Denemark [Thu, 20 Nov 2014 12:44:18 +0000]
qemu: Really fix crash in tunnelled migration

Oops, I forgot to squash one more instance of the same check in the
previous commit (v1.2.10-144-g52691f9).

https://bugzilla.redhat.com/show_bug.cgi?id=1147331
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

6 days agovirsh: Fix msg: blockjob is aborted from another client
Erik Skultety [Thu, 20 Nov 2014 11:52:57 +0000]
virsh: Fix msg: blockjob is aborted from another client

When a block{pull, copy, commit} is aborted via keyboard interrupt,
the job is properly canceled followed by proper error message.
However, when the job receives an abort from another client connected
to the same domain, the error message incorrectly indicates that
a blockjob has been finished successfully, though the abort request
took effect. This patch introduces a new blockjob abort handler, which
is registered when the client calls block{copy,commit,pull} routine,
providing its caller the status of the finished blockjob.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1135442

6 days agoqemu: Fix crash in tunnelled migration
Jiri Denemark [Thu, 20 Nov 2014 12:09:16 +0000]
qemu: Fix crash in tunnelled migration

Any attempt to start a tunnelled migration with libvirtd that supports
RDMA migration (specifically commit v1.2.8-226-ged22a47) crashes
libvirtd on the destination host.

The crash is inevitable because qemuMigrationPrepareAny is always called
with NULL protocol in case of tunnelled migration.

https://bugzilla.redhat.com/show_bug.cgi?id=1147331
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

7 days agomaint: use portable shell
Eric Blake [Wed, 19 Nov 2014 19:13:14 +0000]
maint: use portable shell

Reported in https://bugzilla.redhat.com/show_bug.cgi?id=1165827;
dash complains:

checking for pkcheck... /usr/bin/pkcheck
checking whether pkcheck supports uid value... yes
./configure: 63906: test: xno: unexpected operator
checking for dtrace... no

* configure.ac: Use '=' not '==' in test.

Signed-off-by: Eric Blake <eblake@redhat.com>

7 days agoqemu: Drop OVMF whitelist
Michal Privoznik [Wed, 19 Nov 2014 17:16:12 +0000]
qemu: Drop OVMF whitelist

As discussed on the upstream list, it's better not to make this
kind of predictions in libvirt. It may happen that qemu learns
how to enable OVMF on other architectures too and we shouldn't
try to chase that.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>

7 days agoqemu: Support OVMF on armv7l aarch64 guests
Michal Privoznik [Wed, 19 Nov 2014 15:25:56 +0000]
qemu: Support OVMF on armv7l aarch64 guests

Currently, we are whitelisting architectures, that we know how to run
OVMF on. So far, only x86_64 was enabled. However, looking at qemu
code, the same commandline can be used to enable OVMF for armv7l and
aarch64.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>

7 days agomaint: forbid 'int foo = true'
Eric Blake [Mon, 17 Nov 2014 23:39:48 +0000]
maint: forbid 'int foo = true'

I noticed this while working on qemuDomainGetBlockInfo.  Assigning
a bool value to an int variable compiles fine, but raises red flags
on the maintenance front as it becomes too easy to assign -1 or 2
or any other non-bool value to the same variable.

* cfg.mk (sc_prohibit_int_assign_bool): New rule.
* src/conf/snapshot_conf.c (virDomainSnapshotRedefinePrep): Fix
offenders.
* src/qemu/qemu_driver.c (qemuDomainGetBlockInfo)
(qemuDomainSnapshotCreateXML): Likewise.
* src/test/test_driver.c (testDomainSnapshotAlignDisks):
Likewise.
* src/util/vircgroup.c (virCgroupSupportsCpuBW): Likewise.
* src/util/virpci.c (virPCIDeviceBindToStub): Likewise.
* src/util/virutil.c (virIsCapableVport): Likewise.
* tools/virsh-domain-monitor.c (cmdDomMemStat): Likewise.
* tools/virsh-domain.c (cmdBlockResize, cmdScreenshot)
(cmdInjectNMI, cmdSendKey, cmdSendProcessSignal)
(cmdDetachInterface): Likewise.

Signed-off-by: Eric Blake <eblake@redhat.com>

7 days agovirdbus: don't force users to pass int for bool values
Eric Blake [Tue, 18 Nov 2014 00:18:58 +0000]
virdbus: don't force users to pass int for bool values

Use of an 'int' to represent a 'bool' value is confusing.  Just
because dbus made the mistake of cementing their 4-byte wire
format of dbus_bool_t into their API doesn't mean we have to
repeat the mistake.  With a little bit of finesse, we can
guarantee that we provide a large-enough value to the DBus
code, while still copying only the relevant one-byte bool
to the client code, and isolate the rest of our code base from
the DBus stupidity.

* src/util/virdbus.c (GET_NEXT_VAL): Add parameter.
(virDBusMessageIterDecode): Adjust all clients.
* src/util/virpolkit.c (virPolkitCheckAuth): Use nicer type.
* tests/virdbustest.c (testMessageSimple, testMessageStruct):
Test new behavior.

Signed-off-by: Eric Blake <eblake@redhat.com>

7 days agostorage: wrap storage_driver.c to 80 columns
Chen Hanxiao [Wed, 19 Nov 2014 08:48:09 +0000]
storage: wrap storage_driver.c to 80 columns

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>

7 days agovbox: fix a bug in _machineStateInactive
Yohan BELLEGUIC [Wed, 19 Nov 2014 08:53:15 +0000]
vbox: fix a bug in _machineStateInactive

This function returned non-inactive domains instead of active
domains.  This broke virConnectNumOfDefinedDomains() and
virConnectListDefinedDomains() functions.

7 days agonetwork: Add network bandwidth support to ethernet interfaces
Anirban Chakraborty [Tue, 18 Nov 2014 23:55:48 +0000]
network: Add network bandwidth support to ethernet interfaces

Ethernet interfaces in libvirt currently do not support bandwidth setting.
For example, following xml file for an interface will not apply these
settings to corresponding qdiscs.

    <interface type="ethernet">
      <mac address="02:36:1d:18:2a:e4"/>
      <model type="virtio"/>
      <script path=""/>
      <target dev="tap361d182a-e4"/>
      <bandwidth>
        <inbound average="984" peak="1024" burst="64"/>
        <outbound average="2000" peak="2048" burst="128"/>
      </bandwidth>
    </interface>

Signed-off-by: Anirban Chakraborty <abchak@juniper.net>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>

8 days agodocs: Document NVRAM behavior on transient domains
Michal Privoznik [Tue, 18 Nov 2014 15:58:54 +0000]
docs: Document NVRAM behavior on transient domains

Since 1.2.8 it's possible to use OVMF on domains. Moreover, it's
possible to have libvirt create NVRAM file per domain. Later,
when domain is undefined, the file is removed too. However,
things are a bit complicated when domain's transient. There's no
undefine to transient domains. There are two options: 1) leave
the file behind and let mgmt app remove it. 2) remove it
automatically as domain dies.
But, in some scenarios mgmt app may want to preserve the file,
copy it somewhere safe, and then copy it back when the domain is
starting again. And this wouldn't be possible with case 2). So,
even though case 1) leaves some files behind (possibly undeleted
for a long time), the files themselves are small (128K each). And
data loss is worse than full disk, isn't it?

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>

8 days agoRemove left over debug in hvsupport.pl script
Daniel P. Berrange [Tue, 18 Nov 2014 17:53:51 +0000]
Remove left over debug in hvsupport.pl script

11 days agoqemu: Resolve Coverity UNINIT
John Ferlan [Sat, 15 Nov 2014 13:09:53 +0000]
qemu: Resolve Coverity UNINIT

For some reason, commit id '72b4151f' triggered a Coverity uninitialized
'reply' variable check when referenced within the for loop.

It seems Coverity doesn't know that flags will have to be either AFFECT_LIVE
or AFFECT_CONFIG after the virDomainLiveConfigHelperMethod call.

By adding a "sa_assert()" to confirm that fact, Coverity is happy again.

12 days agoqemu: Fix get blkiodevtune for a disk that has been hot unplugged
Luyao Huang [Fri, 14 Nov 2014 03:21:10 +0000]
qemu: Fix get blkiodevtune for a disk that has been hot unplugged

https://bugzilla.redhat.com/show_bug.cgi?id=1164080

After a disk is hotunplugged a subsequent call to qemuDomainGetBlockIoTune
to get the --config settings of that disk will fail because the disk is no
longer found by qemuDiskPathToAlias causing an unexpected failure.

Since only the --live flag needs to have the disk device pointer, move the
fetch inside the (flags & VIR_DOMAIN_AFFECT_LIVE) condition. This will also
affect the results if no flags are provided or the --current flag is provided.

Signed-off-by: Luyao Huang <lhuang@redhat.com>

12 days agoqemu: Add tests for new blkdeviotune arguments
John Ferlan [Wed, 12 Nov 2014 15:16:52 +0000]
qemu: Add tests for new blkdeviotune arguments

The recent commit to add support for block_set_io_throttle parameters
from version 1.7 of qemu did not add any tests - this adds the tests

Signed-off-by: John Ferlan <jferlan@redhat.com>

12 days agoqemu: Add checks for blkdeviotune 'size_iops_sec' and adjust error
John Ferlan [Wed, 12 Nov 2014 15:16:51 +0000]
qemu: Add checks for blkdeviotune 'size_iops_sec' and adjust error

Seems the 'size_iops_sec' was a late add and the checks for whether
the field was defined, but unsupported and the maximum size of the
field were not being made.

Also, adjust blkdeviotune support error message for grammar, spelling
(paramater), and remove the "(need QEMU 1.7 or superior)".  None of
our other similar error messages list which QEMU version is required.

Signed-off-by: John Ferlan <jferlan@redhat.com>

12 days agobracket-spacing: Add syntax-check for unnecessary curly brackets
Martin Kletzander [Wed, 12 Nov 2014 16:22:27 +0000]
bracket-spacing: Add syntax-check for unnecessary curly brackets

We're looking for three consecutive lines, first one is a if/for/while
with a condition and start of body, second one is a body with one and
only semicolon and third is end of the body by itself.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agobracket-spacing-check: Print out more specific error message
Martin Kletzander [Fri, 14 Nov 2014 14:55:54 +0000]
bracket-spacing-check: Print out more specific error message

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agobracket-spacing: Remove pointless cycles
Martin Kletzander [Thu, 13 Nov 2014 14:09:35 +0000]
bracket-spacing: Remove pointless cycles

Change while () { smth; last; } to if () { smth; } as 'last' in perl is
analogous to 'break' in C.  These are probably copy-paste leftovers from
creating new syntax-check rules.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agobracket-spacing: Don't modify current line
Martin Kletzander [Thu, 13 Nov 2014 14:04:52 +0000]
bracket-spacing: Don't modify current line

In bracket-spacing.pl, the current $line is being modified in $data.
That, however, spoils that $data for another check.  Introduce new
$tmpdata variable that can be used for temporary modifications.  The
difference between $data and $line is that $data are as much cleaned as
possible from non-code blocks and these changes must be kept.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agodocs: Adjust contributor guidelines about curly brackets
Martin Kletzander [Thu, 13 Nov 2014 13:56:53 +0000]
docs: Adjust contributor guidelines about curly brackets

After recent discussion it looks like curly brackets around one-line
bodies are preferred if the preceding condition is, itself, multiline.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in tests/
Martin Kletzander [Thu, 13 Nov 2014 14:20:43 +0000]
Remove unnecessary curly brackets in tests/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in tools/
Martin Kletzander [Thu, 13 Nov 2014 14:20:51 +0000]
Remove unnecessary curly brackets in tools/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in rest of src/
Martin Kletzander [Thu, 13 Nov 2014 14:29:45 +0000]
Remove unnecessary curly brackets in rest of src/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in rest of src/[o-u]*/
Martin Kletzander [Thu, 13 Nov 2014 14:29:21 +0000]
Remove unnecessary curly brackets in rest of src/[o-u]*/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in rest of src/[a-n]*/
Martin Kletzander [Thu, 13 Nov 2014 14:27:11 +0000]
Remove unnecessary curly brackets in rest of src/[a-n]*/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/vbox/
Martin Kletzander [Thu, 13 Nov 2014 14:21:37 +0000]
Remove unnecessary curly brackets in src/vbox/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/util/
Martin Kletzander [Thu, 13 Nov 2014 14:28:18 +0000]
Remove unnecessary curly brackets in src/util/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/test/test_driver.c
Martin Kletzander [Thu, 13 Nov 2014 14:24:39 +0000]
Remove unnecessary curly brackets in src/test/test_driver.c

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/storage/
Martin Kletzander [Thu, 13 Nov 2014 14:25:27 +0000]
Remove unnecessary curly brackets in src/storage/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/qemu/
Martin Kletzander [Thu, 13 Nov 2014 14:25:30 +0000]
Remove unnecessary curly brackets in src/qemu/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/node_device/
Martin Kletzander [Thu, 13 Nov 2014 14:24:17 +0000]
Remove unnecessary curly brackets in src/node_device/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/hyperv/
Martin Kletzander [Thu, 13 Nov 2014 14:23:51 +0000]
Remove unnecessary curly brackets in src/hyperv/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/conf/
Martin Kletzander [Thu, 13 Nov 2014 14:23:27 +0000]
Remove unnecessary curly brackets in src/conf/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in src/vmx/vmx.c
Martin Kletzander [Thu, 13 Nov 2014 14:21:21 +0000]
Remove unnecessary curly brackets in src/vmx/vmx.c

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>

12 days agoRemove unnecessary curly brackets in rest of src/esx/
Martin Kletzander [Thu, 13 Nov 2014 14:22:20 +0000]
Remove unnecessary curly brackets in rest of src/esx/

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>