summaryrefslogtreecommitdiffstats
path: root/snaps/openstack/utils/nova_utils.py
diff options
context:
space:
mode:
authorspisarski <s.pisarski@cablelabs.com>2017-08-17 15:21:37 -0600
committerSteven Pisarski <s.pisarski@cablelabs.com>2017-08-24 21:12:02 +0000
commit1342eb17df248ec75cc57e9c380a7753fc432194 (patch)
tree72a3b065394b7bcaaddb801e3321edc1ba4b8818 /snaps/openstack/utils/nova_utils.py
parent49aaa5d61e87e11c5d5b9ce7dd2fa598f16b82a7 (diff)
Added method to return OpenStackVmInstance from Heat.
OpenStackHeatStack now can introspect the VMs that the template was responsible for deploying and return an instanitated instance of OpenStackVmInstance for each VM deployed. When the VM has a Floating IP, these instances have the ability to connect via SSH just like one created from scratch. JIRA: SNAPS-172 Change-Id: I5a7ed3a09bb871afc55c718aa80a9069b1eb4da7 Signed-off-by: spisarski <s.pisarski@cablelabs.com>
Diffstat (limited to 'snaps/openstack/utils/nova_utils.py')
-rw-r--r--snaps/openstack/utils/nova_utils.py140
1 files changed, 72 insertions, 68 deletions
diff --git a/snaps/openstack/utils/nova_utils.py b/snaps/openstack/utils/nova_utils.py
index 0a259b0..fe53211 100644
--- a/snaps/openstack/utils/nova_utils.py
+++ b/snaps/openstack/utils/nova_utils.py
@@ -99,8 +99,8 @@ def create_server(nova, neutron, glance, instance_settings, image_settings,
args['availability_zone'] = instance_settings.availability_zone
server = nova.servers.create(**args)
- return VmInst(name=server.name, inst_id=server.id,
- networks=server.networks)
+
+ return __map_os_server_obj_to_vm_inst(server)
else:
raise NovaException(
'Cannot create instance, image cannot be located with name %s',
@@ -125,8 +125,27 @@ def get_server(nova, vm_inst_settings=None, server_name=None):
servers = nova.servers.list(search_opts=search_opts)
for server in servers:
- return VmInst(name=server.name, inst_id=server.id,
- networks=server.networks)
+ return __map_os_server_obj_to_vm_inst(server)
+
+
+def __map_os_server_obj_to_vm_inst(os_server):
+ """
+ Returns a VmInst object for an OpenStack Server object
+ :param os_server: the OpenStack server object
+ :return: an equivalent SNAPS-OO VmInst domain object
+ """
+ sec_grp_names = list()
+ # VM must be active for 'security_groups' attr to be initialized
+ if hasattr(os_server, 'security_groups'):
+ for sec_group in os_server.security_groups:
+ if sec_group.get('name'):
+ sec_grp_names.append(sec_group.get('name'))
+
+ return VmInst(
+ name=os_server.name, inst_id=os_server.id,
+ image_id=os_server.image['id'], flavor_id=os_server.flavor['id'],
+ networks=os_server.networks, keypair_name=os_server.key_name,
+ sec_grp_names=sec_grp_names)
def __get_latest_server_os_object(nova, server):
@@ -136,7 +155,17 @@ def __get_latest_server_os_object(nova, server):
:param server: the domain VmInst object
:return: the list of servers or None if not found
"""
- return nova.servers.get(server.id)
+ return __get_latest_server_os_object_by_id(nova, server.id)
+
+
+def __get_latest_server_os_object_by_id(nova, server_id):
+ """
+ Returns a server with a given id
+ :param nova: the Nova client
+ :param server_id: the server's ID
+ :return: the list of servers or None if not found
+ """
+ return nova.servers.get(server_id)
def get_server_status(nova, server):
@@ -173,8 +202,18 @@ def get_latest_server_object(nova, server):
:return: the list of servers or None if not found
"""
server = __get_latest_server_os_object(nova, server)
- return VmInst(name=server.name, inst_id=server.id,
- networks=server.networks)
+ return __map_os_server_obj_to_vm_inst(server)
+
+
+def get_server_object_by_id(nova, server_id):
+ """
+ Returns a server with a given id
+ :param nova: the Nova client
+ :param server_id: the server's id
+ :return: an SNAPS-OO VmInst object or None if not found
+ """
+ server = __get_latest_server_os_object_by_id(nova, server_id)
+ return __map_os_server_obj_to_vm_inst(server)
def get_server_security_group_names(nova, server):
@@ -225,58 +264,6 @@ def public_key_openssh(keys):
serialization.PublicFormat.OpenSSH)
-def save_keys_to_files(keys=None, pub_file_path=None, priv_file_path=None):
- """
- Saves the generated RSA generated keys to the filesystem
- :param keys: the keys to save generated by cryptography
- :param pub_file_path: the path to the public keys
- :param priv_file_path: the path to the private keys
- """
- if keys:
- if pub_file_path:
- # To support '~'
- pub_expand_file = os.path.expanduser(pub_file_path)
- pub_dir = os.path.dirname(pub_expand_file)
-
- if not os.path.isdir(pub_dir):
- os.mkdir(pub_dir)
-
- public_handle = None
- try:
- public_handle = open(pub_expand_file, 'wb')
- public_bytes = keys.public_key().public_bytes(
- serialization.Encoding.OpenSSH,
- serialization.PublicFormat.OpenSSH)
- public_handle.write(public_bytes)
- finally:
- if public_handle:
- public_handle.close()
-
- os.chmod(pub_expand_file, 0o400)
- logger.info("Saved public key to - " + pub_expand_file)
- if priv_file_path:
- # To support '~'
- priv_expand_file = os.path.expanduser(priv_file_path)
- priv_dir = os.path.dirname(priv_expand_file)
- if not os.path.isdir(priv_dir):
- os.mkdir(priv_dir)
-
- private_handle = None
- try:
- private_handle = open(priv_expand_file, 'wb')
- private_handle.write(
- keys.private_bytes(
- encoding=serialization.Encoding.PEM,
- format=serialization.PrivateFormat.TraditionalOpenSSL,
- encryption_algorithm=serialization.NoEncryption()))
- finally:
- if private_handle:
- private_handle.close()
-
- os.chmod(priv_expand_file, 0o400)
- logger.info("Saved private key to - " + priv_expand_file)
-
-
def upload_keypair_file(nova, name, file_path):
"""
Uploads a public key from a file
@@ -305,7 +292,8 @@ def upload_keypair(nova, name, key):
"""
logger.info('Creating keypair with name - ' + name)
os_kp = nova.keypairs.create(name=name, public_key=key.decode('utf-8'))
- return Keypair(name=os_kp.name, id=os_kp.id, public_key=os_kp.public_key)
+ return Keypair(name=os_kp.name, kp_id=os_kp.id,
+ public_key=os_kp.public_key, fingerprint=os_kp.fingerprint)
def keypair_exists(nova, keypair_obj):
@@ -317,7 +305,7 @@ def keypair_exists(nova, keypair_obj):
"""
try:
os_kp = nova.keypairs.get(keypair_obj)
- return Keypair(name=os_kp.name, id=os_kp.id,
+ return Keypair(name=os_kp.name, kp_id=os_kp.id,
public_key=os_kp.public_key)
except:
return None
@@ -334,7 +322,7 @@ def get_keypair_by_name(nova, name):
for keypair in keypairs:
if keypair.name == name:
- return Keypair(name=keypair.name, id=keypair.id,
+ return Keypair(name=keypair.name, kp_id=keypair.id,
public_key=keypair.public_key)
return None
@@ -377,15 +365,15 @@ def delete_vm_instance(nova, vm_inst):
nova.servers.delete(vm_inst.id)
-def __get_os_flavor(nova, flavor):
+def __get_os_flavor(nova, flavor_id):
"""
Returns to OpenStack flavor object by name
:param nova: the Nova client
- :param flavor: the SNAPS flavor domain object
+ :param flavor_id: the flavor's ID value
:return: the OpenStack Flavor object
"""
try:
- return nova.flavors.get(flavor.id)
+ return nova.flavors.get(flavor_id)
except NotFound:
return None
@@ -397,7 +385,7 @@ def get_flavor(nova, flavor):
:param flavor: the SNAPS flavor domain object
:return: the SNAPS Flavor domain object
"""
- os_flavor = __get_os_flavor(nova, flavor)
+ os_flavor = __get_os_flavor(nova, flavor.id)
if os_flavor:
return Flavor(
name=os_flavor.name, id=os_flavor.id, ram=os_flavor.ram,
@@ -410,6 +398,22 @@ def get_flavor(nova, flavor):
return None
+def get_flavor_by_id(nova, flavor_id):
+ """
+ Returns to OpenStack flavor object by name
+ :param nova: the Nova client
+ :param flavor_id: the flavor ID value
+ :return: the SNAPS Flavor domain object
+ """
+ os_flavor = __get_os_flavor(nova, flavor_id)
+ if os_flavor:
+ return Flavor(
+ name=os_flavor.name, id=os_flavor.id, ram=os_flavor.ram,
+ disk=os_flavor.disk, vcpus=os_flavor.vcpus,
+ ephemeral=os_flavor.ephemeral, swap=os_flavor.swap,
+ rxtx_factor=os_flavor.rxtx_factor, is_public=os_flavor.is_public)
+
+
def __get_os_flavor_by_name(nova, name):
"""
Returns to OpenStack flavor object by name
@@ -475,7 +479,7 @@ def set_flavor_keys(nova, flavor, metadata):
:param flavor: the SNAPS flavor domain object
:param metadata: the metadata to set
"""
- os_flavor = __get_os_flavor(nova, flavor)
+ os_flavor = __get_os_flavor(nova, flavor.id)
if os_flavor:
os_flavor.set_keys(metadata)
@@ -486,7 +490,7 @@ def get_flavor_keys(nova, flavor):
:param nova: the Nova client
:param flavor: the SNAPS flavor domain object
"""
- os_flavor = __get_os_flavor(nova, flavor)
+ os_flavor = __get_os_flavor(nova, flavor.id)
if os_flavor:
return os_flavor.get_keys()