Add support for Promise test cases
authorjose.lausuch <jose.lausuch@ericsson.com>
Thu, 21 Jan 2016 12:58:48 +0000 (13:58 +0100)
committerjose.lausuch <jose.lausuch@ericsson.com>
Fri, 22 Jan 2016 10:25:12 +0000 (11:25 +0100)
JIRA: FUNCTEST-68

Change-Id: I80f8e587e53c7242f8bfa666f2ac450e73c8294f
Signed-off-by: jose.lausuch <jose.lausuch@ericsson.com>
docker/Dockerfile
docker/run_tests.sh
testcases/config_functest.py
testcases/config_functest.yaml
testcases/features/promise.py [new file with mode: 0644]
testcases/functest_utils.py

index 3c5a2a6..45aa05c 100644 (file)
@@ -54,6 +54,8 @@ libxml2-dev \
 libffi-dev \
 crudini \
 ruby1.9.1-dev \
+npm \
+nodejs \
 --no-install-recommends
 
 
index 6ae12b9..bae75e9 100755 (executable)
@@ -137,7 +137,8 @@ function run_test(){
       ;;
         "promise")
             info "Running PROMISE test case..."
-            # TODO
+            python ${FUNCTEST_REPO_DIR}/testcases/features/promise.py --debug all ${report}
+            clean_openstack
         ;;
         "doctor")
             info "Running Doctor test..."
index 70a7d6c..12ae647 100755 (executable)
@@ -124,11 +124,21 @@ def action_start():
         script += 'rvm use 1.9.3;'
         script += 'bundle install'
 
+        logger_debug = None
+        CI_DEBUG = os.environ.get("CI_DEBUG")
+        if CI_DEBUG == "true" or CI_DEBUG == "True":
+            logger_debug = logger
+
         cmd = "/bin/bash -c '" + script + "'"
-        if os.environ.get("CI_DEBUG") == "false":
-            functest_utils.execute_command(cmd)
-        else:
-            functest_utils.execute_command(cmd,logger)
+        functest_utils.execute_command(cmd, logger = logger_debug, exit_on_error=False)
+
+
+        logger.info("Installing dependencies for Promise testcase...")
+        cmd = 'npm install -g yangforge'
+        functest_utils.execute_command(cmd,logger = logger_debug, exit_on_error=False)
+
+        cmd = 'npm install'
+        functest_utils.execute_command(cmd,logger = logger_debug, exit_on_error=False)
 
         # Create result folder under functest if necessary
         if not os.path.exists(RALLY_RESULT_DIR):
index 229cb9b..ccf0797 100644 (file)
@@ -150,6 +150,19 @@ ONOS:
         installer_master: '10.20.0.2'
         installer_master_username: 'root'
         installer_master_password: 'r00tme'
+
+promise:
+    general:
+        tenant_name: promise
+        tenant_description: promise Functionality Testing
+        user_name: promiser
+        user_pwd: test
+        image_name: promise-img
+        flavor_name: promise-flavor
+        flavor_vcpus: 1
+        flavor_ram: 512
+        flavor_disk: 0
+
 results:
     test_db_url: http://213.77.62.197
 
@@ -170,7 +183,7 @@ test_exec_priority:
     #11: openstack-neutron-bgpvpn-api-extension-tests
     12: vims
     13: rally
+
 
 ########################################################################
 # This part lists the dependencies of the tests
diff --git a/testcases/features/promise.py b/testcases/features/promise.py
new file mode 100644 (file)
index 0000000..cc7cf0a
--- /dev/null
@@ -0,0 +1,212 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2015 All rights reserved
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Maintainer : jose.lausuch@ericsson.com
+#
+import argparse
+import logging
+import os
+import time
+import sys
+import yaml
+import keystoneclient.v2_0.client as ksclient
+import glanceclient.client as glclient
+import novaclient.client as nvclient
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument("-d", "--debug", help="Debug mode", action="store_true")
+parser.add_argument("-r", "--report",
+                    help="Create json result file",
+                    action="store_true")
+args = parser.parse_args()
+
+with open('/home/opnfv/functest/conf/config_functest.yaml') as f:
+    functest_yaml = yaml.safe_load(f)
+
+dirs = functest_yaml.get('general').get('directories')
+FUNCTEST_REPO = dirs.get('dir_repo_functest')
+PROMISE_REPO = dirs.get('dir_repo_promise')
+TEST_DB_URL = functest_yaml.get('results').get('test_db_url')
+
+TENANT_NAME = functest_yaml.get('promise').get('general').get('tenant_name')
+TENANT_DESCRIPTION = functest_yaml.get('promise').get(
+    'general').get('tenant_description')
+USER_NAME = functest_yaml.get('promise').get('general').get('user_name')
+USER_PWD = functest_yaml.get('promise').get('general').get('user_pwd')
+IMAGE_NAME = functest_yaml.get('promise').get('general').get('image_name')
+FLAVOR_NAME = functest_yaml.get('promise').get('general').get('flavor_name')
+FLAVOR_VCPUS = functest_yaml.get('promise').get('general').get('flavor_vcpus')
+FLAVOR_RAM = functest_yaml.get('promise').get('general').get('flavor_ram')
+FLAVOR_DISK = functest_yaml.get('promise').get('general').get('flavor_disk')
+
+
+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
+
+sys.path.append('%s/testcases' % FUNCTEST_REPO)
+import functest_utils
+
+""" logging configuration """
+logger = logging.getLogger('Promise')
+logger.setLevel(logging.DEBUG)
+
+ch = logging.StreamHandler()
+
+if args.debug:
+    ch.setLevel(logging.DEBUG)
+else:
+    ch.setLevel(logging.INFO)
+
+formatter = logging.Formatter('%(asctime)s - %(name)s'
+                              '- %(levelname)s - %(message)s')
+
+ch.setFormatter(formatter)
+logger.addHandler(ch)
+
+
+
+def create_image(glance_client, name):
+
+    return image_id
+
+
+def main():
+    ks_creds = functest_utils.get_credentials("keystone")
+    nv_creds = functest_utils.get_credentials("nova")
+    nt_creds = functest_utils.get_credentials("neutron")
+
+    keystone = ksclient.Client(**ks_creds)
+
+    user_id = functest_utils.get_user_id(keystone, ks_creds['username'])
+    if user_id == '':
+        logger.error("Error : Failed to get id of %s user" %
+                     ks_creds['username'])
+        exit(-1)
+
+    logger.info("Creating tenant '%s'..." % TENANT_NAME)
+    tenant_id = functest_utils.create_tenant(
+        keystone, TENANT_NAME, TENANT_DESCRIPTION)
+    if tenant_id == '':
+        logger.error("Error : Failed to create %s tenant" % TENANT_NAME)
+        exit(-1)
+    logger.debug("Tenant '%s' created successfully." % TENANT_NAME)
+
+    roles_name = ["admin", "Admin"]
+    role_id = ''
+    for role_name in roles_name:
+        if role_id == '':
+            role_id = functest_utils.get_role_id(keystone, role_name)
+
+    if role_id == '':
+        logger.error("Error : Failed to get id for %s role" % role_name)
+        exit(-1)
+
+    logger.info("Adding role '%s' to tenant '%s'..." % (role_id,TENANT_NAME))
+    if not functest_utils.add_role_user(keystone, user_id, role_id, tenant_id):
+        logger.error("Error : Failed to add %s on tenant %s" %
+                     (ks_creds['username'],TENANT_NAME))
+        exit(-1)
+    logger.debug("Role added successfully.")
+
+    logger.info("Creating user '%s'..." % USER_NAME)
+    user_id = functest_utils.create_user(
+        keystone, USER_NAME, USER_PWD, None, tenant_id)
+
+    if user_id == '':
+        logger.error("Error : Failed to create %s user" % USER_NAME)
+        exit(-1)
+    logger.debug("User '%s' created successfully." % USER_NAME)
+
+    logger.info("Updating OpenStack credentials...")
+    ks_creds.update({
+        "username": TENANT_NAME,
+        "password": TENANT_NAME,
+        "tenant_name": TENANT_NAME,
+    })
+
+    nt_creds.update({
+        "tenant_name": TENANT_NAME,
+    })
+
+    nv_creds.update({
+        "project_id": TENANT_NAME,
+    })
+
+    glance_endpoint = keystone.service_catalog.url_for(service_type='image',
+                                                       endpoint_type='publicURL')
+    glance = glclient.Client(1, glance_endpoint, token=keystone.auth_token)
+    nova = nvclient.Client("2", **nv_creds)
+
+
+    logger.info("Creating image '%s' from '%s'..." % (IMAGE_NAME,
+                                                       GLANCE_IMAGE_PATH))
+    image_id = functest_utils.create_glance_image(glance,
+                                                  IMAGE_NAME,
+                                                  GLANCE_IMAGE_PATH)
+    if not image_id:
+        logger.error("Failed to create the Glance image...")
+        exit(-1)
+    logger.debug("Image '%s' with ID '%s' created successfully." % (IMAGE_NAME,
+                                                                    image_id))
+
+    flavor_id = functest_utils.create_flavor(nova,
+                                             FLAVOR_NAME,
+                                             FLAVOR_RAM,
+                                             FLAVOR_DISK,
+                                             FLAVOR_VCPUS)
+    if not flavor_id:
+        logger.error("Failed to create the Flavor...")
+        exit(-1)
+    logger.debug("Flavor '%s' with ID '%s' created successfully." % (FLAVOR_NAME,
+                                                                    flavor_id))
+
+    logger.info("Exporting environment variables...")
+    os.environ["NODE_ENV"] = "functest"
+    os.environ["OS_TENANT_NAME"] = TENANT_NAME
+    os.environ["OS_USERNAME"] = USER_NAME
+    os.environ["OS_PASSWORD"] = USER_PWD
+    os.environ["OS_TEST_IMAGE"] = image_id
+    os.environ["OS_TEST_FLAVOR"] = flavor_id
+
+    cmd = 'DEBUG=1 npm run -s test'
+    start_time_ts = time.time()
+
+    logger.info("Running command: %s" % cmd)
+    os.chdir(PROMISE_REPO)
+    ret = functest_utils.execute_command(cmd, exit_on_error=False)
+
+    end_time_ts = time.time()
+    duration = round(end_time_ts - start_time_ts, 1)
+    test_status = 'Failed'
+    if ret:
+        test_status = 'OK'
+
+    logger.info("Test status: %s" % test_status)
+    details = {
+        'timestart': start_time_ts,
+        'duration': duration,
+        'status': test_status,
+    }
+    pod_name = functest_utils.get_pod_name()
+    git_version = functest_utils.get_git_branch(PROMISE_REPO)
+    #functest_utils.push_results_to_db(TEST_DB_URL,
+    #                                  'promise',
+    #                                  None,
+    #                                  pod_name,
+    #                                  git_version,
+    #                                  details)
+    #
+
+if __name__ == '__main__':
+    main()
index e76ef99..9c618f7 100644 (file)
@@ -88,6 +88,12 @@ def get_instance_by_name(nova_client, instance_name):
     except:
         return None
 
+def create_flavor(nova_client, flavor_name, ram, disk, vcpus):
+    try:
+        flavor = nova_client.flavors.create(flavor_name,ram,vcpus,disk)
+    except:
+        return None
+    return flavor.id
 
 def get_flavor_id(nova_client, flavor_name):
     flavors = nova_client.flavors.list(detailed=True)