Add example script creating an instance
[functest.git] / testcases / OpenStack / tempest / run_tempest.py
index 93581f0..a16ba26 100644 (file)
 # http://www.apache.org/licenses/LICENSE-2.0
 #
 import argparse
-import json
 import os
 import re
-import requests
 import shutil
 import subprocess
+import sys
 import time
 import yaml
 import ConfigParser
 
 import keystoneclient.v2_0.client as ksclient
+from glanceclient import client as glanceclient
 from neutronclient.v2_0 import client as neutronclient
 
 import functest.utils.functest_logger as ft_logger
@@ -67,6 +67,14 @@ f.close()
 TEST_DB = functest_yaml.get("results").get("test_db_url")
 
 MODE = "smoke"
+GLANCE_IMAGE_NAME = functest_yaml.get("general").get(
+    "openstack").get("image_name")
+GLANCE_IMAGE_FILENAME = functest_yaml.get("general").get(
+    "openstack").get("image_file_name")
+GLANCE_IMAGE_FORMAT = functest_yaml.get("general").get(
+    "openstack").get("image_disk_format")
+GLANCE_IMAGE_PATH = functest_yaml.get("general").get("directories").get(
+    "dir_functest_data") + "/" + GLANCE_IMAGE_FILENAME
 PRIVATE_NET_NAME = functest_yaml.get("tempest").get("private_net_name")
 PRIVATE_SUBNET_NAME = functest_yaml.get("tempest").get("private_subnet_name")
 PRIVATE_SUBNET_CIDR = functest_yaml.get("tempest").get("private_subnet_cidr")
@@ -114,27 +122,6 @@ def get_info(file_result):
     logger.debug("duration:" + duration)
 
 
-def push_results_to_db(case, payload, criteria):
-
-    # TODO move DB creds into config file
-    url = TEST_DB + "/results"
-    installer = ft_utils.get_installer_type(logger)
-    scenario = ft_utils.get_scenario(logger)
-    version = ft_utils.get_version(logger)
-    pod_name = ft_utils.get_pod_name(logger)
-
-    logger.info("Pushing results to DB: '%s'." % url)
-
-    params = {"project_name": "functest", "case_name": case,
-              "pod_name": str(pod_name), 'installer': installer,
-              "version": version, "scenario": scenario, "criteria": criteria,
-              'details': payload}
-    headers = {'Content-Type': 'application/json'}
-
-    r = requests.post(url, data=json.dumps(params), headers=headers)
-    logger.debug(r)
-
-
 def create_tempest_resources():
     ks_creds = os_utils.get_credentials("keystone")
     logger.debug("Creating tenant and user for Tempest suite")
@@ -171,6 +158,27 @@ def create_tempest_resources():
         logger.error("Private network creation failed")
         exit(-1)
 
+    logger.debug("Creating image for Tempest suite")
+    glance_endpoint = keystone.service_catalog.url_for(
+        service_type='image', endpoint_type='publicURL')
+    glance_client = glanceclient.Client(1, glance_endpoint,
+                                        token=keystone.auth_token)
+    # Check if the given image exists
+    image_id = os_utils.get_image_id(glance_client, GLANCE_IMAGE_NAME)
+    if image_id != '':
+        logger.info("Using existing image '%s'..." % GLANCE_IMAGE_NAME)
+    else:
+        logger.info("Creating image '%s' from '%s'..." % (GLANCE_IMAGE_NAME,
+                                                          GLANCE_IMAGE_PATH))
+        image_id = os_utils.create_glance_image(glance_client,
+                                                GLANCE_IMAGE_NAME,
+                                                GLANCE_IMAGE_PATH)
+        if not image_id:
+            logger.error("Failed to create a Glance image...")
+            exit(-1)
+        logger.debug("Image '%s' with ID=%s created successfully."
+                     % (GLANCE_IMAGE_NAME, image_id))
+
 
 def configure_tempest(deployment_dir):
     """
@@ -253,33 +261,31 @@ def run_tempest(OPTION):
     # :return: void
     #
     logger.info("Starting Tempest test suite: '%s'." % OPTION)
+    start_time = time.time()
+    stop_time = start_time
     cmd_line = "rally verify start " + OPTION + " --system-wide"
-    CI_DEBUG = os.environ.get("CI_DEBUG")
 
-    if CI_DEBUG == "true" or CI_DEBUG == "True":
-        ft_utils.execute_command(cmd_line, logger, exit_on_error=True)
-    else:
-        header = ("Tempest environment:\n"
-                  "  Installer: %s\n  Scenario: %s\n  Node: %s\n  Date: %s\n" %
-                  (os.getenv('INSTALLER_TYPE', 'Unknown'),
-                   os.getenv('DEPLOY_SCENARIO', 'Unknown'),
-                   os.getenv('NODE_NAME', 'Unknown'),
-                   time.strftime("%a %b %d %H:%M:%S %Z %Y")))
+    header = ("Tempest environment:\n"
+              "  Installer: %s\n  Scenario: %s\n  Node: %s\n  Date: %s\n" %
+              (os.getenv('INSTALLER_TYPE', 'Unknown'),
+               os.getenv('DEPLOY_SCENARIO', 'Unknown'),
+               os.getenv('NODE_NAME', 'Unknown'),
+               time.strftime("%a %b %d %H:%M:%S %Z %Y")))
 
-        f_stdout = open(TEMPEST_RESULTS_DIR + "/tempest.log", 'w+')
-        f_stderr = open(TEMPEST_RESULTS_DIR + "/tempest-error.log", 'w+')
-        f_env = open(TEMPEST_RESULTS_DIR + "/environment.log", 'w+')
-        f_env.write(header)
+    f_stdout = open(TEMPEST_RESULTS_DIR + "/tempest.log", 'w+')
+    f_stderr = open(TEMPEST_RESULTS_DIR + "/tempest-error.log", 'w+')
+    f_env = open(TEMPEST_RESULTS_DIR + "/environment.log", 'w+')
+    f_env.write(header)
 
-        subprocess.call(cmd_line, shell=True, stdout=f_stdout, stderr=f_stderr)
+    subprocess.call(cmd_line, shell=True, stdout=f_stdout, stderr=f_stderr)
 
-        f_stdout.close()
-        f_stderr.close()
-        f_env.close()
+    f_stdout.close()
+    f_stderr.close()
+    f_env.close()
 
-        cmd_line = "rally verify show"
-        ft_utils.execute_command(cmd_line, logger,
-                                 exit_on_error=True, info=True)
+    cmd_line = "rally verify show"
+    ft_utils.execute_command(cmd_line, logger,
+                             exit_on_error=True, info=True)
 
     cmd_line = "rally verify list"
     logger.debug('Executing command : {}'.format(cmd_line))
@@ -297,11 +303,12 @@ def run_tempest(OPTION):
     dur_sec_float = float(duration.split(':')[2])
     dur_sec_int = int(round(dur_sec_float, 0))
     dur_sec_int = dur_sec_int + 60 * dur_min
-
+    stop_time = time.time()
     # Push results in payload of testcase
     if args.report:
+        logger.debug("Pushing tempest results into DB...")
         # Note criteria hardcoded...TODO move to testcase.yaml
-        status = "failed"
+        status = "FAIL"
         try:
             diff = (int(num_tests) - int(num_failures))
             success_rate = 100 * diff / int(num_tests)
@@ -310,7 +317,7 @@ def run_tempest(OPTION):
 
         # For Tempest we assume that the success rate is above 90%
         if success_rate >= 90:
-            status = "passed"
+            status = "PASS"
 
         # add the test in error in the details sections
         # should be possible to do it during the test
@@ -326,9 +333,23 @@ def run_tempest(OPTION):
                         "tests": int(num_tests), "failures": int(num_failures),
                         "errors": error_logs}
         logger.info("Results: " + str(json_results))
+        # split Tempest smoke and full
+        if "smoke" in args.mode:
+            case_name = "tempest_smoke_serial"
+        else:
+            case_name = "tempest_full_parallel"
 
-        logger.debug("Push result into DB")
-        push_results_to_db("Tempest", json_results, status)
+        try:
+            ft_utils.push_results_to_db("functest",
+                                        case_name,
+                                        None,
+                                        start_time,
+                                        stop_time,
+                                        status,
+                                        json_results)
+        except:
+            logger.error("Error pushing results into Database '%s'"
+                         % sys.exc_info()[0])
 
 
 def main():