Fix no IP on interface error

Finding an IPv4 address to advertise fails and crashes if the
interface exists but has no valid IPs.  This can be fixed by
adding KeyError to the exceptions caught.

Change-Id: I60204427ec5201696d02c5c26f4b43a00d794413
Closes-Bug: #1342448
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).

Change-Id: Ia42a8e75d2b8887b2351de97c2137fe21a7f4041
(cherry picked from commit bdbb882037079ceaae1c73f0e1a0bb20c3d49373)
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 132e6ee93d75d0ac4e5ac5a15b11b805390893f3)