Add support for CloudStack metadata

The required information is available from an API exposed by CloudStack
on the virtual router IP address (DHCP Server).
After obtaining the IP address all the metadata is taken from the API.

Implements-Blueprint: cloudstack-metadata

Change-Id: I428860fe0e9a53649c21fcb23595b304341eb7f1
Add support for yaml user-data

CloudConfigPlugin receives information serialized into YAML format.
The information is deserialized and for each key value pair a
specialized plugin is called for processing this kind of task.

Implements-Blueprint: yaml-userdata

Change-Id: I273bc28415bc7fb37b2ef426868250ad152faec1
Fixes unicode logging decoding issue

Logging fails with an exception when unicode conversion of the message
cannot be performed.

This includes also Exception objects, where the exception message has
an unknown encoding.

The calling code should be responsible for handling the unicode encoding, but
nevertheless, the logging module should handle this scenario and not raise
an exception.

Closes-Bug: #1393870

Change-Id: Ied46e4a8715d11a3cf59d651004e17f6fe4c760b
Merge "Add support for CloudStack metadata"
Merge "Add support for yaml user-data"
Add FreeBSD support to cloudbaseinit

In order to support FreeBSD in cloudbaseinit, the patch changes the
following:

  * implements a specific osutils class for FreeBSD.

  * the osutils dispatching is done using `platform.system`.
    This offers a better granularity level than `sys.platform` or
    `os.name`.

  * certain plugins can work unchanged on both Windows and FreeBSD.
    In order to have a consistent place for such common plugins,
    a new location is added, 'plugins/common'.

  * refactor filexecutils.py and userdatautils.py, by having a common
    command execution interface, in the new 'executil.py'.

This patch is work in progress.