Add openstack clients and create instance in openstack_utils 85/16285/7
authorjose.lausuch <jose.lausuch@ericsson.com>
Fri, 1 Jul 2016 16:31:44 +0000 (18:31 +0200)
committerjose.lausuch <jose.lausuch@ericsson.com>
Mon, 4 Jul 2016 11:49:01 +0000 (13:49 +0200)
JIRA: FUNCTEST-346

Change-Id: Ie10d55872bc8c5a404b0d0156ee49a9d94482008
Signed-off-by: jose.lausuch <jose.lausuch@ericsson.com>
utils/functest_utils.py
utils/openstack_utils.py

index 285f887..9a19eb4 100644 (file)
@@ -309,13 +309,15 @@ def get_criteria_by_test(testname):
 #               YAML UTILS
 #
 # -----------------------------------------------------------
-def get_parameter_from_yaml(parameter):
+def get_parameter_from_yaml(parameter, file=None):
     """
     Returns the value of a given parameter in config_functest.yaml
     parameter must be given in string format with dots
     Example: general.openstack.image_name
     """
-    with open(os.environ["CONFIG_FUNCTEST_YAML"]) as f:
+    if file is None:
+        file = os.environ["CONFIG_FUNCTEST_YAML"]
+    with open(file) as f:
         functest_yaml = yaml.safe_load(f)
     f.close()
     value = functest_yaml
index 646df7a..9640fb9 100644 (file)
@@ -12,12 +12,12 @@ import os
 import os.path
 import subprocess
 import sys
+import time
 
-# ----------------------------------------------------------
-#
-#               OPENSTACK UTILS
-#
-# -----------------------------------------------------------
+from glanceclient import client as glanceclient
+from keystoneclient.v2_0 import client as keystoneclient
+from neutronclient.v2_0 import client as neutronclient
+from novaclient import client as novaclient
 
 
 # *********************************************
@@ -90,9 +90,36 @@ def source_credentials(rc_file):
     return env
 
 
+# *********************************************
+#   CLIENTS
+# *********************************************
+def get_keystone_client():
+    creds_keystone = get_credentials("keystone")
+    return keystoneclient.Client(**creds_keystone)
+
+
+def get_nova_client():
+    creds_nova = get_credentials("nova")
+    return novaclient.Client('2', **creds_nova)
+
+
+def get_neutron_client():
+    creds_neutron = get_credentials("neutron")
+    return neutronclient.Client(**creds_neutron)
+
+
+def get_glance_client():
+    keystone_client = get_keystone_client()
+    glance_endpoint = keystone_client.service_catalog.url_for(
+        service_type='image', endpoint_type='publicURL')
+    return glanceclient.Client(1, glance_endpoint,
+                               token=keystone_client.auth_token)
+
 # *********************************************
 #   NOVA
 # *********************************************
+
+
 def get_instances(nova_client):
     try:
         instances = nova_client.servers.list(search_opts={'all_tenants': 1})
@@ -161,6 +188,59 @@ def create_flavor(nova_client, flavor_name, ram, disk, vcpus):
     return flavor.id
 
 
+def create_instance(flavor_name,
+                    image_id,
+                    network_id,
+                    instance_name="",
+                    config_drive=False,
+                    userdata=""):
+    nova_client = get_nova_client()
+    try:
+        flavor = nova_client.flavors.find(name=flavor_name)
+    except:
+        print("Error: Flavor '%s' not found. Available flavors are:" %
+              flavor_name)
+        print(nova_client.flavor.list())
+        return -1
+
+    return nova_client.servers.create(
+        name=instance_name,
+        flavor=flavor,
+        image=image_id,
+        config_drive=config_drive,
+        nics=[{"net-id": network_id}]
+    )
+
+
+def create_instance_and_wait_for_active(flavor_name,
+                                        image_id,
+                                        network_id,
+                                        instance_name="",
+                                        config_drive=False,
+                                        userdata=""):
+    SLEEP = 3
+    VM_BOOT_TIMEOUT = 180
+    nova_client = get_nova_client()
+    instance = create_instance(flavor_name,
+                               image_id,
+                               network_id,
+                               instance_name="",
+                               config_drive=False,
+                               userdata="")
+
+    count = VM_BOOT_TIMEOUT / SLEEP
+    for n in range(count, -1, -1):
+        status = get_instance_status(nova_client, instance)
+        if status.lower() == "active":
+            return instance
+        elif status.lower() == "error":
+            print("The instance %s went to ERROR status." % instance_name)
+            return None
+        time.sleep(SLEEP)
+    print("Timeout booting the instance %s." % instance_name)
+    return None
+
+
 def create_floating_ip(neutron_client):
     extnet_id = get_external_net_id(neutron_client)
     props = {'floating_network_id': extnet_id}