Shared IP API

Squashed work from John Perkins <john.perkins@rackspace.com> and Thomas Maddox <thomas.maddox@rackspace.com>

- An API to allow an already shared IP address to be added to or removed from another port.
- An API to allow an IP address to be "shared" instead of "configured" or "owned"
- Filters on db.api.ip_address_find should be updated to allow searching by other attributes, like the port_id. Currently it only supports "ip_shared" (changed ip_shared to address_type=shared') and "device_id"
- Any time we show ports to the caller, we must set the "enabled" flag if the port is the one the IP is currently assigned to. A change already exists in Nova anticipating this change.
- Only New IPs can be marked as "shared" at the time of their creation
- IPs cannot change from shared to not shared, or vice versa, at any time after creation until deallocated.
- Remove device_ids attribute from /ip_addresses
- Change from 'shared' boolean attribute to 'type' string attribute with the following valid values: 'shared', 'fixed', and 'floating'.
- Move address types to constants for consistency
Is this relationship eager loaded? It *should* be but I've seen enough cases where sqlalchemy does so much aliasing of table names that it won't load data it actually has, and contains_eager is a pain to get right. I ask because I want to avoid additional explosions at the query factory: it's really easy to hide horrible performance behind the ORM.