Add consistent methods for returning dicts

There are enough places that want dicts that we should just have API
calls for it. Several of the places want to do slightly smarter things
when doing that too.

Co-Authored-By: David Shrewsbury <shrewsbury.dave@gmail.com>

Change-Id: I08245a89e5b497b9fe50af7d3538976b1ac82257
This commit is contained in:
Monty Taylor 2015-01-20 20:15:26 -05:00 committed by David Shrewsbury
parent bea5220e5a
commit 8f1ca24bb8
2 changed files with 49 additions and 22 deletions

View File

@ -402,9 +402,17 @@ class OpenStackCloud(object):
def list_servers(self):
return self.nova_client.servers.list()
def list_server_dicts(self):
return [self.get_openstack_vars(server)
for server in self.list_servers()]
def list_keypairs(self):
return self.nova_client.keypairs.list()
def list_keypair_dicts(self):
return [meta.obj_to_dict(keypair)
for keypair in self.list_keypairs()]
def create_keypair(self, name, public_key):
return self.nova_client.keypairs.create(name, public_key)
@ -464,6 +472,12 @@ class OpenStackCloud(object):
return image
return None
def get_image_dict(self, name_or_id, exclude=None):
image = self.get_image(name_or_id, exclude)
if not image:
return image
return meta.obj_to_dict(image)
def create_image(
self, name, filename, container='images',
md5=None, sha256=None,
@ -575,19 +589,11 @@ class OpenStackCloud(object):
return server.id
return None
def _get_server_ip(self, server, **kwargs):
addrs = meta.find_nova_addresses(server.addresses, *kwargs)
if not addrs:
return None
return addrs[0]
def get_server_private_ip(self, server):
return self._get_server_ip(
server, ext_tag='fixed', key_name='private')
return meta.get_server_private_ip(server)
def get_server_public_ip(self, server):
return self._get_server_ip(
server, ext_tag='floating', key_name='public')
return meta.get_server_public_ip(server)
def get_server(self, name_or_id):
for server in self.list_servers():
@ -595,6 +601,12 @@ class OpenStackCloud(object):
return server
return None
def get_server_dict(self, name_or_id):
server = self.get_server(name_or_id)
if not server:
return server
return self.get_openstack_vars(server)
def get_server_meta(self, server):
server_vars = meta.get_hostvars_from_server(self, server)
groups = meta.get_groups_from_server(self, server, server_vars)
@ -606,6 +618,9 @@ class OpenStackCloud(object):
return secgroup
return None
def get_openstack_vars(self, server):
return meta.get_hostvars_from_server(self, server)
def add_ip_from_pool(self, server, pools):
# instantiate FloatingIPManager object

View File

@ -34,6 +34,21 @@ def find_nova_addresses(addresses, ext_tag=None, key_name=None, version=4):
return ret
def get_server_ip(server, **kwargs):
addrs = find_nova_addresses(server.addresses, **kwargs)
if not addrs:
return None
return addrs[0]
def get_server_private_ip(server):
return get_server_ip(server, ext_tag='fixed', key_name='private')
def get_server_public_ip(server):
return get_server_ip(server, ext_tag='floating', key_name='public')
def get_groups_from_server(cloud, server, server_vars):
groups = []
@ -77,20 +92,17 @@ def get_groups_from_server(cloud, server, server_vars):
def get_hostvars_from_server(cloud, server, mounts=None):
server_vars = dict()
server_vars = obj_to_dict(server)
# Fist, add an IP address
if (cloud.private):
interface_ips = find_nova_addresses(
getattr(server, 'addresses'), 'fixed', 'private')
server_vars['public_v4'] = get_server_public_ip(server)
server_vars['private_v4'] = get_server_private_ip(server)
if cloud.private:
interface_ip = server_vars['private_v4']
else:
interface_ips = find_nova_addresses(
getattr(server, 'addresses'), 'floating', 'public')
if interface_ips:
# TODO(mordred): I want this to be richer, "first" is not best
server_vars['interface_ip'] = interface_ips[0]
server_vars.update(obj_to_dict(server))
interface_ip = server_vars['public_v4']
if interface_ip:
server_vars['interface_ip'] = interface_ip
server_vars['region'] = cloud.region
server_vars['cloud'] = cloud.name