Merge "Release notes for Danube 2.0"
authorJose Lausuch <jose.lausuch@ericsson.com>
Fri, 14 Jul 2017 09:28:43 +0000 (09:28 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Fri, 14 Jul 2017 09:28:43 +0000 (09:28 +0000)
docs/testing/user/configguide/configguide.rst
functest/ci/check_os.sh [deleted file]
functest/ci/prepare_env.py
functest/cli/commands/cli_os.py
functest/opnfv_tests/vnf/ims/clearwater_ims_base.py
functest/opnfv_tests/vnf/ims/cloudify_ims.py
functest/opnfv_tests/vnf/ims/cloudify_ims.yaml
functest/tests/unit/ci/test_prepare_env.py
functest/tests/unit/cli/commands/test_cli_os.py
setup.cfg

index a93ac7d..35548c9 100644 (file)
@@ -362,7 +362,7 @@ follows::
         |-- __init__.py
         |-- ci
         |   |-- __init__.py
-        |   |-- check_os.sh
+        |   |-- check_deployment.py
         |   |-- config_functest.yaml
         |   |-- config_patch.yaml
         |   |-- generate_report.py
diff --git a/functest/ci/check_os.sh b/functest/ci/check_os.sh
deleted file mode 100644 (file)
index 7b66f3d..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/bin/bash
-#
-# Simple script to check the basic OpenStack clients
-#
-# Author:
-#    jose.lausuch@ericsson.com
-#
-
-if [[ ${OS_INSECURE,,} == "true" ]]; then
-    options='--insecure'
-else
-    options=''
-fi
-
-declare -A service_cmd_array
-service_cmd_array['nova']="openstack $options server list"
-service_cmd_array['neutron']="openstack $options network list"
-service_cmd_array['keystone']="openstack $options endpoint list"
-service_cmd_array['cinder']="openstack $options volume list"
-service_cmd_array['glance']="openstack $options image list"
-
-MANDATORY_SERVICES='nova neutron keystone glance'
-OPTIONAL_SERVICES='cinder'
-
-verify_connectivity() {
-    for i in $(seq 0 9); do
-        if echo "test" | nc -v -w 10 $1 $2 &>/dev/null; then
-            return 0
-        fi
-        sleep 1
-    done
-    return 1
-}
-
-verify_SSL_connectivity() {
-    openssl s_client -connect $1:$2 &>/dev/null
-    return $?
-}
-
-check_service() {
-    local service cmd
-    service=$1
-    cmd=${service_cmd_array[$service]}
-    if [ -z "$2" ]; then
-        required='false'
-    else
-        required=$2
-    fi
-    echo ">>Checking ${service} service..."
-    if ! openstack $options service list | grep -i ${service} > /dev/null; then
-        if [ "$required" == 'false' ]; then
-            echo "WARN: Optional Service ${service} is not enabled!"
-            return
-        else
-            echo "ERROR: Required Service ${service} is not enabled!"
-            exit 1
-        fi
-    fi
-    $cmd &>/dev/null
-    result=$?
-    if [ $result -ne 0 ]; then
-        echo "ERROR: Failed execution $cmd. The $service does not seem to be working."
-        exit 1
-    else
-        echo "  ...OK"
-    fi
-}
-
-if [ -z $OS_AUTH_URL ];then
-    echo "ERROR: OS_AUTH_URL environment variable missing... Have you sourced the OpenStack credentials?"
-    exit 1
-fi
-
-
-echo "Checking OpenStack endpoints:"
-publicURL=$(openstack $options catalog show identity |awk '/public/ {print $4}')
-publicIP=$(echo $publicURL|sed 's/^.*http.*\:\/\///'|sed 's/.[^:]*$//')
-publicPort=$(echo $publicURL|grep -Po '(?<=:)\d+')
-https_enabled=$(echo $publicURL | grep 'https')
-if [[ -n $https_enabled ]]; then
-    echo ">>Verifying SSL connectivity to the public endpoint $publicIP:$publicPort..."
-    verify_SSL_connectivity $publicIP $publicPort
-else
-    echo ">>Verifying connectivity to the public endpoint $publicIP:$publicPort..."
-    verify_connectivity $publicIP $publicPort
-fi
-RETVAL=$?
-if [ $RETVAL -ne 0 ]; then
-    echo "ERROR: Cannot talk to the public endpoint $publicIP:$publicPort ."
-    echo "OS_AUTH_URL=$OS_AUTH_URL"
-    exit 1
-fi
-echo "  ...OK"
-
-
-echo "Checking Required OpenStack services:"
-for service in $MANDATORY_SERVICES; do
-    check_service $service "true"
-done
-echo "Required OpenStack services are OK."
-
-echo "Checking Optional OpenStack services:"
-for service in $OPTIONAL_SERVICES; do
-    check_service $service
-done
-
-echo "Checking External network..."
-networks=($(neutron $options net-list -F id | tail -n +4 | head -n -1 | awk '{print $2}'))
-is_external=False
-for net in "${networks[@]}"
-do
-    is_external=$(neutron $options net-show $net|grep "router:external"|awk '{print $4}')
-    if [ $is_external == "True" ]; then
-        echo "External network found: $net"
-        break
-    fi
-done
-if [ $is_external == "False" ]; then
-    echo "ERROR: There are no external networks in the deployment."
-    exit 1
-fi
-
-exit 0
index da3e624..c40e326 100644 (file)
@@ -19,6 +19,7 @@ import fileinput
 
 import yaml
 
+from functest.ci import check_deployment
 import functest.utils.functest_utils as ft_utils
 import functest.utils.openstack_utils as os_utils
 from functest.utils.constants import CONST
@@ -177,26 +178,6 @@ def create_directories():
 def source_rc_file():
     print_separator()
 
-    if CONST.__getattribute__('openstack_creds') is None:
-        logger.warning("The environment variable 'creds' must be set and"
-                       "pointing to the local RC file. Using default: "
-                       "/home/opnfv/functest/conf/openstack.creds ...")
-        os.path.join(
-            CONST.__getattribute__('dir_functest_conf'), 'openstack.creds')
-
-    if not os.path.isfile(CONST.__getattribute__('openstack_creds')):
-        raise Exception(
-            "OpenStack credentials file not provided. "
-            "The OpenStack credentials must be in {}"
-            .format(CONST.__getattribute__('openstack_creds')))
-    else:
-        logger.info("RC file provided in %s."
-                    % CONST.__getattribute__('openstack_creds'))
-        if os.path.getsize(CONST.__getattribute__('openstack_creds')) == 0:
-            raise Exception(
-                "The OpenStack RC file {} is empty."
-                .format(CONST.__getattribute__('openstack_creds')))
-
     logger.info("Sourcing the OpenStack RC file...")
     os_utils.source_credentials(CONST.__getattribute__('openstack_creds'))
     for key, value in os.environ.iteritems():
@@ -250,18 +231,9 @@ def update_db_url():
 
 def verify_deployment():
     print_separator()
-    logger.info("Verifying OpenStack services...")
-    cmd = "check_os.sh"
-
-    logger.debug("Executing command: %s" % cmd)
-    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
-
-    while p.poll() is None:
-        line = p.stdout.readline().rstrip()
-        if "ERROR" in line:
-            logger.error(line)
-            raise Exception("Problem while running '{}'.".format(cmd))
-        logger.info(line)
+    logger.info("Verifying OpenStack deployment...")
+    deployment = check_deployment.CheckDeployment()
+    deployment.check_all()
 
 
 def install_rally():
@@ -364,11 +336,11 @@ def prepare_env(**kwargs):
             return -1
         elif kwargs['action'] == "start":
             logger.info("######### Preparing Functest environment #########\n")
+            verify_deployment()
             check_env_variables()
             create_directories()
             source_rc_file()
             update_config_file()
-            verify_deployment()
             install_rally()
             install_tempest()
             create_flavor()
index 44181d4..f4ec166 100644 (file)
@@ -12,8 +12,8 @@ import os
 
 import click
 
+from functest.ci import check_deployment
 from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
 import functest.utils.openstack_clean as os_clean
 import functest.utils.openstack_snapshot as os_snapshot
 
@@ -49,7 +49,8 @@ class CliOpenStack(object):
 
     def check(self):
         self.ping_endpoint()
-        ft_utils.execute_command("check_os.sh", verbose=False)
+        deployment = check_deployment.CheckDeployment()
+        deployment.check_all()
 
     def snapshot_create(self):
         self.ping_endpoint()
index 25ddca2..5a5c12b 100644 (file)
@@ -43,7 +43,7 @@ class ClearwaterOnBoardingBase(vnf.VnfOnBoarding):
 
     def config_ellis(self, ellis_ip, signup_code='secret', two_numbers=False):
         output_dict = {}
-        self.logger.info('Configure Ellis: %s', ellis_ip)
+        self.logger.debug('Configure Ellis: %s', ellis_ip)
         output_dict['ellis_ip'] = ellis_ip
         account_url = 'http://{0}/accounts'.format(ellis_ip)
         params = {"password": "functest",
@@ -54,7 +54,7 @@ class ClearwaterOnBoardingBase(vnf.VnfOnBoarding):
         output_dict['login'] = params
         if rq.status_code != 201 and rq.status_code != 409:
             raise Exception("Unable to create an account for number provision")
-        self.logger.info('Account is created on Ellis: %s', params)
+        self.logger.debug('Account is created on Ellis: %s', params)
 
         session_url = 'http://{0}/session'.format(ellis_ip)
         session_data = {
@@ -66,13 +66,13 @@ class ClearwaterOnBoardingBase(vnf.VnfOnBoarding):
         if rq.status_code != 201:
             raise Exception('Failed to get cookie for Ellis')
         cookies = rq.cookies
-        self.logger.info('Cookies: %s', cookies)
+        self.logger.debug('Cookies: %s', cookies)
 
         number_url = 'http://{0}/accounts/{1}/numbers'.format(
                      ellis_ip,
                      params['email'])
-        self.logger.info('Create 1st calling number on Ellis')
-        i = 24
+        self.logger.debug('Create 1st calling number on Ellis')
+        i = 30
         while rq.status_code != 200 and i > 0:
             try:
                 number_res = self.create_ellis_number(number_url, cookies)
@@ -86,7 +86,7 @@ class ClearwaterOnBoardingBase(vnf.VnfOnBoarding):
         output_dict['number'] = number_res
 
         if two_numbers:
-            self.logger.info('Create 2nd calling number on Ellis')
+            self.logger.debug('Create 2nd calling number on Ellis')
             number_res = self.create_ellis_number(number_url, cookies)
             output_dict['number2'] = number_res
 
@@ -131,7 +131,7 @@ class ClearwaterOnBoardingBase(vnf.VnfOnBoarding):
             script = '{0}{1}'.format(script, subscript)
         script = ('{0}{1}'.format(script, ' --trace'))
         cmd = "/bin/bash -c '{0}'".format(script)
-        self.logger.info('Live test cmd: %s', cmd)
+        self.logger.debug('Live test cmd: %s', cmd)
         output_file = os.path.join(self.result_dir, "ims_test_output.txt")
         ft_utils.execute_command(cmd,
                                  error_msg='Clearwater live test failed',
index fafc77e..8f6fcec 100644 (file)
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-# Copyright (c) 2016 Orange and others.
+# Copyright (c) 2017 Orange and others.
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Apache License, Version 2.0
@@ -25,16 +25,16 @@ from functest.utils.constants import CONST
 import functest.utils.openstack_utils as os_utils
 
 from snaps.openstack.os_credentials import OSCreds
-from snaps.openstack.create_network import NetworkSettings, SubnetSettings, \
-                                            OpenStackNetwork
-from snaps.openstack.create_security_group import SecurityGroupSettings, \
-                                                    SecurityGroupRuleSettings,\
-                                                    Direction, Protocol, \
-                                                    OpenStackSecurityGroup
+from snaps.openstack.create_network import (NetworkSettings, SubnetSettings,
+                                            OpenStackNetwork)
+from snaps.openstack.create_security_group import (SecurityGroupSettings,
+                                                   SecurityGroupRuleSettings,
+                                                   Direction, Protocol,
+                                                   OpenStackSecurityGroup)
 from snaps.openstack.create_router import RouterSettings, OpenStackRouter
-from snaps.openstack.create_instance import VmInstanceSettings, \
-                                                FloatingIpSettings, \
-                                                OpenStackVmInstance
+from snaps.openstack.create_instance import (VmInstanceSettings,
+                                             FloatingIpSettings,
+                                             OpenStackVmInstance)
 from snaps.openstack.create_flavor import FlavorSettings, OpenStackFlavor
 from snaps.openstack.create_image import ImageSettings, OpenStackImage
 from snaps.openstack.create_keypairs import KeypairSettings, OpenStackKeypair
@@ -239,6 +239,8 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase):
         while str(cfy_status) != 'running' and retry:
             try:
                 cfy_status = cfy_client.manager.get_status()['status']
+                self.__logger.debug("The current manager status is %s",
+                                    cfy_status)
             except Exception:  # pylint: disable=broad-except
                 self.__logger.warning("Cloudify Manager isn't " +
                                       "up and running. Retrying ...")
@@ -263,14 +265,15 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase):
         self.__logger.info("Put private keypair in manager")
         if manager_creator.vm_ssh_active(block=True):
             ssh = manager_creator.ssh_client()
-            scp = SCPClient(ssh.get_transport())
+            scp = SCPClient(ssh.get_transport(), socket_timeout=15.0)
             scp.put(kp_file, '~/')
             cmd = "sudo cp ~/cloudify_ims.pem /etc/cloudify/"
-            ssh.exec_command(cmd)
+            run_blocking_ssh_command(ssh, cmd)
             cmd = "sudo chmod 444 /etc/cloudify/cloudify_ims.pem"
-            ssh.exec_command(cmd)
+            run_blocking_ssh_command(ssh, cmd)
             cmd = "sudo yum install -y gcc python-devel"
-            ssh.exec_command(cmd)
+            run_blocking_ssh_command(ssh, cmd, "Unable to install packages \
+                                                on manager")
 
         self.details['orchestrator'].update(status='PASS', duration=duration)
 
@@ -292,15 +295,17 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase):
                                               descriptor.get('file_name'))
 
         self.__logger.info("Get or create flavor for all clearwater vm")
-        self.exist_obj['flavor2'], flavor_id = os_utils.get_or_create_flavor(
-            self.vnf['requirements']['flavor']['name'],
-            self.vnf['requirements']['flavor']['ram_min'],
-            '30',
-            '1',
-            public=True)
+        flavor_settings = FlavorSettings(
+            name=self.vnf['requirements']['flavor']['name'],
+            ram=self.vnf['requirements']['flavor']['ram_min'],
+            disk=25,
+            vcpus=1)
+        flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings)
+        flavor_creator.create()
+        self.created_object.append(flavor_creator)
 
         self.vnf['inputs'].update(dict(
-            flavor_id=flavor_id,
+            flavor_id=self.vnf['requirements']['flavor']['name'],
         ))
 
         self.__logger.info("Create VNF Instance")
@@ -371,7 +376,7 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase):
                     try:
                         cfy_client.executions.cancel(execution['id'],
                                                      force=True)
-                    except:
+                    except:  # pylint: disable=broad-except
                         self.__logger.warn("Can't cancel the current exec")
 
             execution = cfy_client.executions.start(
@@ -383,7 +388,7 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase):
             wait_for_execution(cfy_client, execution, self.__logger)
             cfy_client.deployments.delete(self.vnf['descriptor'].get('name'))
             cfy_client.blueprints.delete(self.vnf['descriptor'].get('name'))
-        except:
+        except:  # pylint: disable=broad-except
             self.__logger.warn("Some issue during the undeployment ..")
             self.__logger.warn("Tenant clean continue ..")
 
@@ -507,3 +512,10 @@ def sig_test_format(sig_test):
     total_sig_test_result['failures'] = nb_failures
     total_sig_test_result['skipped'] = nb_skipped
     return total_sig_test_result
+
+
+def run_blocking_ssh_command(ssh, cmd, error_msg="Unable to run this command"):
+    """Command to run ssh command with the exit status."""
+    stdin, stdout, stderr = ssh.exec_command(cmd)
+    if stdout.channel.recv_exit_status() != 0:
+        raise Exception(error_msg)
index f1028ce..743c6dd 100644 (file)
@@ -19,7 +19,7 @@ vnf:
         version: '122'
     requirements:
         flavor:
-          name: m1.medium
+          name: m1.small
           ram_min: 2048
     inputs:
         image_id: 'ubuntu_14.04'
index 7d4b5fb..7d5fa56 100644 (file)
@@ -309,22 +309,18 @@ class PrepareEnvTesting(unittest.TestCase):
             prepare_env.update_config_file()
             self.assertTrue(mock_db_url.called)
 
-    @mock.patch('functest.ci.prepare_env.logger.info')
-    def test_verify_deployment_error(self, mock_logger_error):
-        mock_popen = mock.Mock()
-        attrs = {'poll.return_value': None,
-                 'stdout.readline.return_value': 'ERROR'}
-        mock_popen.configure_mock(**attrs)
+    def test_verify_deployment(self):
+        with mock.patch('functest.ci.check_deployment.CheckDeployment') \
+                as mock_check_deployment:
+            prepare_env.verify_deployment()
+            self.assertTrue(mock_check_deployment.called)
 
-        with mock.patch('functest.ci.prepare_env.print_separator') as m, \
-            mock.patch('functest.ci.prepare_env.subprocess.Popen',
-                       return_value=mock_popen), \
-                self.assertRaises(Exception) as context:
+    def test_verify_deployment_error(self):
+        with mock.patch('functest.ci.prepare_env.'
+                        'check_deployment.CheckDeployment',
+                        return_value=('test_', None)), \
+                self.assertRaises(Exception):
             prepare_env.verify_deployment()
-            self.assertTrue(m.called)
-            msg = "Problem while running 'check_os.sh'."
-            mock_logger_error.assert_called_once_with('ERROR')
-            self.assertTrue(msg in context)
 
     def _get_rally_creds(self):
         return {"type": "ExistingCloud",
index a3d930d..806bc93 100644 (file)
@@ -59,12 +59,12 @@ class CliOpenStackTesting(unittest.TestCase):
                                                     self.endpoint_ip)
             mock_exit.assert_called_once_with(0)
 
-    @mock.patch('functest.cli.commands.cli_os.ft_utils.execute_command')
-    def test_check(self, mock_ftutils_execute):
-        with mock.patch.object(self.cli_os, 'ping_endpoint'):
+    def test_check(self):
+        with mock.patch.object(self.cli_os, 'ping_endpoint'), \
+            mock.patch('functest.cli.commands.cli_os.check_deployment.'
+                       'CheckDeployment') as mock_check_deployment:
             self.cli_os.check()
-            mock_ftutils_execute.assert_called_once_with(
-                "check_os.sh", verbose=False)
+            self.assertTrue(mock_check_deployment.called)
 
     @mock.patch('functest.cli.commands.cli_os.os.path.isfile',
                 return_value=False)
index 27cd29c..e29259f 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -10,7 +10,6 @@ scripts =
     docker/add_images.sh
     docker/config_install_env.sh
     functest/ci/download_images.sh
-    functest/ci/check_os.sh
 
 [entry_points]
 console_scripts =