Write image directly to disk

Write image directly to disk by telling qemu-img that the output
file is the disk. Still uses O_DIRECT directly within qemu-img.

This avoids the need to have a huge amount of system memory to be
able to deploy an image that contains a huge disk.

The only feature left behind by that commit is the 64K block size.

Change-Id: If60bcd82581b2ea76c4acbc3eaa3f317d2ee6590
Improve docstrings for cmd/agent.py

Added missing docstrings and improved existing docstrings for every
method in cmd/agent.py

Change-Id: Ib8dbbf70bca139a43d75d59fb09dce899466e888
Partial-bug: 1367915
Use LLDP to get switch port mapping

Provides a function to listen for LLDP packets on the network.
Listens on one or all of the network interfaces, and then parses the found
packets.

Change-Id: I1545a41f46cd0916aab9c43ce036865454fa66e0
Co-Authored-By: Josh Gachnang <josh@pcsforeducation.com>
(cherry picked from commit 69904ed077c9ad4cd60469f96f26b63565e45f9e)
Adding support for decommissioning

The pluggable hardware manager should be able be used for decommissioning,
such as erasing disks, updating firmwares, changing BIOS settings, and
anything else specific hardware needs. This works with the agent driver
to store state in Ironic and request out of band reboots (which may be
required to make BIOS/firmware updates work). Also allows the agent to do
some basic verification of the node's properties, to ensure they haven't
changed, such as a stick of memory dying.

Change-Id: Ia42a8e75d2b8887b2351de97c2137fe21a7f4041
(cherry picked from commit aa27598f2b56614d76214805b0d2a8dde99e1aae)
Add versioning to Agent decommission

As the agent will likely be rebooting while decommissioning (to apply BIOS/
firmware upgrades), it is possible the version of the agent will change
between boots. Including a version string in the Hardware Manager allows
the Hardware Manager builder to bump versions for any breaking changes.
I recommend that the entire decommission process be restarted if there
is a version mismatch, but that will be up to individual drivers to
implement.

This change also adds a new return value for Agent REST commands called
'DECOM_VERSION_MISMATCH' that will signal no command was run, and
Ironic should update its stored value. A 'hardware_manager_version'
will be returned with AsyncCommandResult, and should be set in the
Ironic driver_info field and sent with any decommission command.

Change-Id: I2ae0e93573e0348f023aa124a07bb16921b5c53e
(cherry picked from commit 05059e14d665ace405c4766cc2f089dfe8d2eb12)
Add command metrics to IPA API

This will allow the agent to report timing and counter data for commands
that are run on the agent (starting with Standby commands). It will allow a
properly configured agent to send metrics to a remote or locally packaged
statsd. It is also extensible, so other metrics systems can easily be used.

Change-Id: Ic08d4ff78b6fb614b474b956a32eac352a14262a
(cherry picked from commit b4f69805a5f89bb9069c0ad287680cf6f6212665)