Merge "Added method to return OpenStackVmInstance from Heat."
[snaps.git] / snaps / openstack / utils / nova_utils.py
index 0a259b0..fe53211 100644 (file)
@@ -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()