diff options
Diffstat (limited to 'functest')
-rw-r--r-- | functest/ci/config_aarch64_patch.yaml | 20 | ||||
-rwxr-xr-x | functest/ci/config_functest.yaml | 1 | ||||
-rwxr-xr-x | functest/ci/prepare_env.py | 99 | ||||
-rw-r--r-- | functest/ci/rally_aarch64_patch.conf | 5 | ||||
-rwxr-xr-x | functest/ci/testcases.yaml | 39 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/cloudify_ims.py | 13 | ||||
-rwxr-xr-x | functest/opnfv_tests/vnf/router/__init__.py | 0 | ||||
-rwxr-xr-x | functest/opnfv_tests/vnf/router/vyos_vrouter.py | 33 | ||||
-rw-r--r-- | functest/tests/unit/opnfv_tests/vnf/__init__.py | 0 | ||||
-rw-r--r-- | functest/tests/unit/opnfv_tests/vnf/ims/__init__.py | 0 | ||||
-rw-r--r-- | functest/tests/unit/opnfv_tests/vnf/ims/test_clearwater.py | 54 | ||||
-rw-r--r-- | functest/tests/unit/opnfv_tests/vnf/ims/test_cloudify_ims.py | 542 | ||||
-rw-r--r-- | functest/tests/unit/opnfv_tests/vnf/ims/test_orchestrator_cloudify.py | 122 |
13 files changed, 873 insertions, 55 deletions
diff --git a/functest/ci/config_aarch64_patch.yaml b/functest/ci/config_aarch64_patch.yaml new file mode 100644 index 00000000..9a345e3f --- /dev/null +++ b/functest/ci/config_aarch64_patch.yaml @@ -0,0 +1,20 @@ +os: + general: + openstack: + image_name: TestVM + image_file_name: cirros-d161201-aarch64-disk.img + image_password: gocubsgo + + snaps_simple_healthcheck: + disk_image: /home/opnfv/functest/data/cirros-d161201-aarch64-disk.img + kernel_image: /home/opnfv/functest/data/cirros-d161201-aarch64-kernel + ramdisk_image: /home/opnfv/functest/data/cirros-d161201-aarch64-initramfs + extra_properties: + os_command_line: root=/dev/vdb1 rw rootwait console=tty0 console=ttyS0 console=ttyAMA0 + hw_video_model: vga + + vping: + image_name: TestVM + + doctor: + image_name: TestVM diff --git a/functest/ci/config_functest.yaml b/functest/ci/config_functest.yaml index 7beb9d4b..489c395f 100755 --- a/functest/ci/config_functest.yaml +++ b/functest/ci/config_functest.yaml @@ -29,6 +29,7 @@ general: repo_domino: /home/opnfv/repos/domino repo_snaps: /home/opnfv/repos/snaps repo_securityscan: /home/opnfv/repos/securityscanning + repo_vrouter: /home/opnfv/repos/vrouter functest: /home/opnfv/functest functest_test: /home/opnfv/repos/functest/functest/opnfv_tests results: /home/opnfv/functest/results diff --git a/functest/ci/prepare_env.py b/functest/ci/prepare_env.py index 5a9f99cb..f5bae6a0 100755 --- a/functest/ci/prepare_env.py +++ b/functest/ci/prepare_env.py @@ -12,6 +12,7 @@ import os import re import subprocess import sys +import fileinput import yaml @@ -27,14 +28,18 @@ actions = ['start', 'check'] """ logging configuration """ logger = ft_logger.Logger("prepare_env").getLogger() - +handler = None +# set the architecture to default +pod_arch = None CONFIG_FUNCTEST_PATH = CONST.CONFIG_FUNCTEST_YAML CONFIG_PATCH_PATH = os.path.join(os.path.dirname( CONFIG_FUNCTEST_PATH), "config_patch.yaml") - -with open(CONFIG_PATCH_PATH) as f: - functest_patch_yaml = yaml.safe_load(f) +CONFIG_AARCH64_PATCH_PATH = os.path.join(os.path.dirname( + CONFIG_FUNCTEST_PATH), "config_aarch64_patch.yaml") +RALLY_CONF_PATH = os.path.join("/etc/rally/rally.conf") +RALLY_AARCH64_PATCH_PATH = os.path.join(os.path.dirname( + CONFIG_FUNCTEST_PATH), "rally_aarch64_patch.conf") class PrepareEnvParser(object): @@ -102,6 +107,34 @@ def check_env_variables(): logger.info(" IS_CI_RUN=%s" % CONST.IS_CI_RUN) +def get_deployment_handler(): + global handler + global pod_arch + + installer_params_yaml = os.path.join(CONST.dir_repo_functest, + 'functest/ci/installer_params.yaml') + if (CONST.INSTALLER_IP and CONST.INSTALLER_TYPE and + CONST.INSTALLER_TYPE in opnfv_constants.INSTALLERS): + installer_params = ft_utils.get_parameter_from_yaml( + CONST.INSTALLER_TYPE, installer_params_yaml) + + user = installer_params.get('user', None) + password = installer_params.get('password', None) + pkey = installer_params.get('pkey', None) + + try: + handler = factory.Factory.get_handler( + installer=CONST.INSTALLER_TYPE, + installer_ip=CONST.INSTALLER_IP, + installer_user=user, + installer_pwd=password, + pkey_file=pkey) + if handler: + pod_arch = handler.get_arch() + except Exception as e: + logger.debug("Cannot get deployment information. %s" % e) + + def create_directories(): print_separator() logger.info("Creating needed directories...") @@ -177,12 +210,18 @@ def source_rc_file(): CONST.OS_PASSWORD = value -def patch_config_file(): +def patch_config_file(patch_file_path, arch_filter=None): + if arch_filter and pod_arch not in arch_filter: + return + + with open(patch_file_path) as f: + patch_file = yaml.safe_load(f) + updated = False - for key in functest_patch_yaml: + for key in patch_file: if key in CONST.DEPLOY_SCENARIO: new_functest_yaml = dict(ft_utils.merge_dicts( - ft_utils.get_functest_yaml(), functest_patch_yaml[key])) + ft_utils.get_functest_yaml(), patch_file[key])) updated = True if updated: @@ -210,6 +249,17 @@ def verify_deployment(): def install_rally(): print_separator() + + if 'aarch64' in pod_arch: + logger.info("Apply aarch64 specific to rally config...") + with open(RALLY_AARCH64_PATCH_PATH, "r") as f: + rally_patch_conf = f.read() + + for line in fileinput.input(RALLY_CONF_PATH, inplace=1): + print line, + if "cirros|testvm" in line: + print rally_patch_conf + logger.info("Creating Rally environment...") cmd = "rally deployment destroy opnfv-rally" @@ -284,34 +334,9 @@ def check_environment(): def print_deployment_info(): - installer_params_yaml = os.path.join(CONST.dir_repo_functest, - 'functest/ci/installer_params.yaml') - if (CONST.INSTALLER_IP and CONST.INSTALLER_TYPE and - CONST.INSTALLER_TYPE in opnfv_constants.INSTALLERS): - try: - installer_params = ft_utils.get_parameter_from_yaml( - CONST.INSTALLER_TYPE, installer_params_yaml) - except ValueError as e: - logger.debug('Printing deployment info is not supported for %s' % - CONST.INSTALLER_TYPE) - logger.debug(e) - else: - user = installer_params.get('user', None) - password = installer_params.get('password', None) - pkey = installer_params.get('pkey', None) - - try: - handler = factory.Factory.get_handler( - installer=CONST.INSTALLER_TYPE, - installer_ip=CONST.INSTALLER_IP, - installer_user=user, - installer_pwd=password, - pkey_file=pkey) - if handler: - logger.info('\n\nDeployment information:\n%s' % - handler.get_deployment_info()) - except Exception as e: - logger.debug("Cannot get deployment information. %s" % e) + if handler: + logger.info('\n\nDeployment information:\n%s' % + handler.get_deployment_info()) def main(**kwargs): @@ -322,9 +347,11 @@ def main(**kwargs): elif kwargs['action'] == "start": logger.info("######### Preparing Functest environment #########\n") check_env_variables() + get_deployment_handler() create_directories() source_rc_file() - patch_config_file() + patch_config_file(CONFIG_PATCH_PATH) + patch_config_file(CONFIG_AARCH64_PATCH_PATH, 'aarch64') verify_deployment() install_rally() install_tempest() diff --git a/functest/ci/rally_aarch64_patch.conf b/functest/ci/rally_aarch64_patch.conf new file mode 100644 index 00000000..a49588bf --- /dev/null +++ b/functest/ci/rally_aarch64_patch.conf @@ -0,0 +1,5 @@ +img_name_regex = ^TestVM$ +img_url = http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-disk.img +flavor_ref_ram = 128 +flavor_ref_alt_ram = 256 +heat_instance_type_ram = 128 diff --git a/functest/ci/testcases.yaml b/functest/ci/testcases.yaml index fd86441b..ed3a0b84 100755 --- a/functest/ci/testcases.yaml +++ b/functest/ci/testcases.yaml @@ -8,26 +8,14 @@ tiers: operations in the VIM. testcases: - - name: healthcheck - criteria: 'status == "PASS"' - blocking: true - description: >- - This test case verifies the basic OpenStack services like - Keystone, Glance, Cinder, Neutron and Nova. - - dependencies: - installer: '' - scenario: '^((?!lxd).)*$' - - name: snaps_health_check criteria: 'status == "PASS"' - blocking: false + blocking: true description: >- This test case creates executes the SimpleHealthCheck Python test class which creates an, image, flavor, network, and Cirros VM instance and observes the console output to validate the single port obtains the correct IP address. - dependencies: installer: '' scenario: '^((?!lxd).)*$' @@ -325,6 +313,18 @@ tiers: module: 'functest.opnfv_tests.vnf.rnc.parser' class: 'Parser' - + name: domino + criteria: 'status == "PASS"' + blocking: false + description: >- + Test suite from Domino project. + dependencies: + installer: '' + scenario: '' + run: + module: 'functest.opnfv_tests.features.domino' + class: 'Domino' + - name: orchestra criteria: 'ret == 0' blocking: false @@ -498,3 +498,16 @@ tiers: run: module: 'functest.opnfv_tests.vnf.ims.opera_ims' class: 'ImsVnf' + + - + name: vyos_vrouter + criteria: 'status == "PASS"' + blocking: false + description: >- + This test case is vRouter testing. + dependencies: + installer: 'fuel' + scenario: 'nosdn-nofeature' + run: + module: 'functest.opnfv_tests.vnf.router.vyos_vrouter' + class: 'VrouterVnf' diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.py b/functest/opnfv_tests/vnf/ims/cloudify_ims.py index 584d780a..c2c251ad 100644 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims.py +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py @@ -195,8 +195,9 @@ class ImsVnf(vnf_base.VnfOnBoardingBase): return {'status': 'PASS', 'result': ''} def deploy_vnf(self): - cw = Clearwater(self.vnf.inputs, self.orchestrator.object, self.logger) - self.vnf.object = cw + cw = Clearwater(self.vnf['inputs'], self.orchestrator['object'], + self.logger) + self.vnf['object'] = cw self.logger.info("Collect flavor id for all clearwater vm") flavor_exist, flavor_id = os_utils.get_or_create_flavor( @@ -215,7 +216,7 @@ class ImsVnf(vnf_base.VnfOnBoardingBase): cw.set_flavor_id(flavor_id) # VMs image - if 'os_image' in self.vnf.requirements.keys(): + if 'os_image' in self.vnf['requirements'].keys(): image_id = os_utils.get_image_id( self.glance_client, self.vnf['requirements']['os_image']) if image_id == '': @@ -256,7 +257,7 @@ class ImsVnf(vnf_base.VnfOnBoardingBase): api_url = "http://" + mgr_ip + "/api/v2" dep_outputs = requests.get(api_url + "/deployments/" + - self.vnf.deployment_name + "/outputs") + self.vnf['deployment_name'] + "/outputs") dns_ip = dep_outputs.json()['outputs']['dns_ip'] ellis_ip = dep_outputs.json()['outputs']['ellis_ip'] @@ -340,8 +341,8 @@ class ImsVnf(vnf_base.VnfOnBoardingBase): return {'status': 'FAIL', 'result': ''} def clean(self): - self.vnf.object.undeploy_vnf() - self.orchestrator.object.undeploy_manager() + self.vnf['object'].undeploy_vnf() + self.orchestrator['object'].undeploy_manager() super(ImsVnf, self).clean() def main(self, **kwargs): diff --git a/functest/opnfv_tests/vnf/router/__init__.py b/functest/opnfv_tests/vnf/router/__init__.py new file mode 100755 index 00000000..e69de29b --- /dev/null +++ b/functest/opnfv_tests/vnf/router/__init__.py diff --git a/functest/opnfv_tests/vnf/router/vyos_vrouter.py b/functest/opnfv_tests/vnf/router/vyos_vrouter.py new file mode 100755 index 00000000..94a3ecfd --- /dev/null +++ b/functest/opnfv_tests/vnf/router/vyos_vrouter.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# +# Copyright 2017 Okinawa Open Laboratory +# +# 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 +import functest.core.feature_base as base +import json +import os + +RESULT_DETAILS_FILE = "test_result.json" + + +class VrouterVnf(base.FeatureBase): + def __init__(self): + super(VrouterVnf, self).__init__(project='vRouter', + case='vyos_vrouter', + repo='dir_repo_vrouter') + self.cmd = 'cd %s && ./run.sh' % self.repo + + def set_result_details(self): + filepath = os.path.join(self.repo, RESULT_DETAILS_FILE) + if os.path.exists(filepath): + f = open(filepath, 'r') + self.details = json.load(f) + f.close() + + def log_results(self): + if self.criteria == 'PASS': + self.set_result_details() + super(VrouterVnf, self).log_results() diff --git a/functest/tests/unit/opnfv_tests/vnf/__init__.py b/functest/tests/unit/opnfv_tests/vnf/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/functest/tests/unit/opnfv_tests/vnf/__init__.py diff --git a/functest/tests/unit/opnfv_tests/vnf/ims/__init__.py b/functest/tests/unit/opnfv_tests/vnf/ims/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/functest/tests/unit/opnfv_tests/vnf/ims/__init__.py diff --git a/functest/tests/unit/opnfv_tests/vnf/ims/test_clearwater.py b/functest/tests/unit/opnfv_tests/vnf/ims/test_clearwater.py new file mode 100644 index 00000000..527f12e5 --- /dev/null +++ b/functest/tests/unit/opnfv_tests/vnf/ims/test_clearwater.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +# 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 + +import logging +import unittest + +import mock + +from functest.opnfv_tests.vnf.ims import clearwater +from functest.opnfv_tests.vnf.ims import orchestrator_cloudify + + +class ClearwaterTesting(unittest.TestCase): + + logging.disable(logging.CRITICAL) + + def setUp(self): + self.clearwater = clearwater.Clearwater() + self.orchestrator = orchestrator_cloudify.Orchestrator('test_dir') + self.clearwater.orchestrator = self.orchestrator + self.clearwater.dep_name = 'test_dep_name' + self.bp = {'file_name': 'test_file', + 'destination_folder': 'test_folder', + 'url': 'test_url', + 'branch': 'test_branch'} + + def test_deploy_vnf_blueprint_download_failed(self): + with mock.patch.object(self.clearwater.orchestrator, + 'download_upload_and_deploy_blueprint', + return_value='error'): + self.assertEqual(self.clearwater.deploy_vnf(self.bp), + 'error') + + def test_deploy_vnf_blueprint_download_passed(self): + with mock.patch.object(self.clearwater.orchestrator, + 'download_upload_and_deploy_blueprint', + return_value=''): + self.clearwater.deploy_vnf(self.bp), + self.assertEqual(self.clearwater.deploy, True) + + def test_undeploy_vnf_deployment_passed(self): + with mock.patch.object(self.clearwater.orchestrator, + 'undeploy_deployment'): + self.clearwater.deploy = True + self.clearwater.undeploy_vnf(), + self.assertEqual(self.clearwater.deploy, False) + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/functest/tests/unit/opnfv_tests/vnf/ims/test_cloudify_ims.py b/functest/tests/unit/opnfv_tests/vnf/ims/test_cloudify_ims.py new file mode 100644 index 00000000..e25816f0 --- /dev/null +++ b/functest/tests/unit/opnfv_tests/vnf/ims/test_cloudify_ims.py @@ -0,0 +1,542 @@ +#!/usr/bin/env python + +# 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 + +import logging +import unittest + +import mock + +from functest.opnfv_tests.vnf.ims import cloudify_ims + + +class ImsVnfTesting(unittest.TestCase): + + logging.disable(logging.CRITICAL) + + def setUp(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.makedirs'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'get_config', return_value='config_value'): + self.ims_vnf = cloudify_ims.ImsVnf() + self.neutron_client = mock.Mock() + self.glance_client = mock.Mock() + self.keystone_client = mock.Mock() + self.nova_client = mock.Mock() + self.orchestrator = {'requirements': {'ram_min': 2, + 'os_image': 'test_os_image'}, + 'blueprint': {'url': 'test_url', + 'branch': 'test_branch'}, + 'inputs': {'public_domain': 'test_domain'}, + 'object': 'test_object', + 'deployment_name': 'test_deployment_name'} + self.ims_vnf.orchestrator = self.orchestrator + self.ims_vnf.images = {'test_image': 'test_url'} + self.ims_vnf.vnf = self.orchestrator + self.ims_vnf.tenant_name = 'test_tenant' + self.ims_vnf.inputs = {'public_domain': 'test_domain'} + self.ims_vnf.glance_client = self.glance_client + self.ims_vnf.neutron_client = self.neutron_client + self.ims_vnf.keystone_client = self.keystone_client + self.ims_vnf.nova_client = self.nova_client + self.ims_vnf.admin_creds = 'test_creds' + + self.mock_post = mock.Mock() + attrs = {'status_code': 201, + 'cookies': ""} + self.mock_post.configure_mock(**attrs) + + self.mock_post_200 = mock.Mock() + attrs = {'status_code': 200, + 'cookies': ""} + self.mock_post_200.configure_mock(**attrs) + + def test_deploy_orchestrator_missing_image(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_neutron_client', + return_value=self.neutron_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_glance_client', + return_value=self.glance_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_keystone_client', + return_value=self.keystone_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_nova_client', + return_value=self.nova_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value=''), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'download_and_add_image_on_glance') as m, \ + self.assertRaises(Exception) as context: + self.ims_vnf.deploy_orchestrator() + self.assertTrue(m.called) + msg = "Failed to find or upload required OS " + msg += "image for this deployment" + self.assertTrue(msg in context.exception) + + def test_deploy_orchestrator_extend_quota_fail(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_neutron_client', + return_value=self.neutron_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_glance_client', + return_value=self.glance_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_keystone_client', + return_value=self.keystone_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_nova_client', + return_value=self.nova_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value='image_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_tenant_id', + return_value='tenant_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.update_sg_quota', + return_value=False), \ + self.assertRaises(Exception) as context: + self.ims_vnf.deploy_orchestrator() + msg = "Failed to update security group quota" + msg += " for tenant test_tenant" + self.assertTrue(msg in context.exception) + + def _get_image_id(self, client, name): + if name == 'test_image': + return 'image_id' + else: + return '' + + def test_deploy_orchestrator_missing_flavor(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_neutron_client', + return_value=self.neutron_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_glance_client', + return_value=self.glance_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_keystone_client', + return_value=self.keystone_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_nova_client', + return_value=self.nova_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + side_effect=self._get_image_id), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_tenant_id', + return_value='tenant_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.update_sg_quota', + return_value=True), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_endpoint', + return_value='public_auth_url'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Orchestrator', return_value=mock.Mock()) as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(False, '')), \ + self.assertRaises(Exception) as context: + self.ims_vnf.deploy_orchestrator() + self.assertTrue(m.set_credentials.called) + msg = "Failed to find required flavorfor this deployment" + self.assertTrue(msg in context.exception) + + def test_deploy_orchestrator_missing_os_image(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_neutron_client', + return_value=self.neutron_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_glance_client', + return_value=self.glance_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_keystone_client', + return_value=self.keystone_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_nova_client', + return_value=self.nova_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + side_effect=self._get_image_id), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_tenant_id', + return_value='tenant_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.update_sg_quota', + return_value=True), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_endpoint', + return_value='public_auth_url'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Orchestrator', return_value=mock.Mock()) as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(True, 'flavor_id')), \ + self.assertRaises(Exception) as context: + self.ims_vnf.deploy_orchestrator() + self.assertTrue(m.set_credentials.called) + self.assertTrue(m.set_flavor_id.called) + msg = "Failed to find required OS image for cloudify manager" + self.assertTrue(msg in context.exception) + + def test_deploy_orchestrator_get_ext_network_fail(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_neutron_client', + return_value=self.neutron_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_glance_client', + return_value=self.glance_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_keystone_client', + return_value=self.keystone_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_nova_client', + return_value=self.nova_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value='image_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_tenant_id', + return_value='tenant_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.update_sg_quota', + return_value=True), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_endpoint', + return_value='public_auth_url'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Orchestrator', return_value=mock.Mock()) as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(True, 'flavor_id')), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_external_net', + return_value=''), \ + self.assertRaises(Exception) as context: + self.ims_vnf.deploy_orchestrator() + self.assertTrue(m.set_credentials.called) + self.assertTrue(m.set_flavor_id.called) + self.assertTrue(m.set_image_id.called) + msg = "Failed to get external network" + self.assertTrue(msg in context.exception) + + def test_deploy_orchestrator_with_error(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_neutron_client', + return_value=self.neutron_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_glance_client', + return_value=self.glance_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_keystone_client', + return_value=self.keystone_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_nova_client', + return_value=self.nova_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value='image_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_tenant_id', + return_value='tenant_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.update_sg_quota', + return_value=True), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_endpoint', + return_value='public_auth_url'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Orchestrator') as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(True, 'flavor_id')), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_external_net', + return_value='ext_net'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'ft_utils.get_resolvconf_ns', + return_value=True), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'ft_utils.execute_command'): + mock_obj = mock.Mock() + attrs = {'deploy_manager.return_value': 'error'} + mock_obj.configure_mock(**attrs) + + m.return_value = mock_obj + + self.assertEqual(self.ims_vnf.deploy_orchestrator(), + {'status': 'FAIL', 'result': 'error'}) + + def test_deploy_orchestrator_default(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_neutron_client', + return_value=self.neutron_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_glance_client', + return_value=self.glance_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_keystone_client', + return_value=self.keystone_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_nova_client', + return_value=self.nova_client), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value='image_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_tenant_id', + return_value='tenant_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.update_sg_quota', + return_value=True), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_endpoint', + return_value='public_auth_url'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Orchestrator') as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(True, 'flavor_id')), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_external_net', + return_value='ext_net'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'ft_utils.get_resolvconf_ns', + return_value=True), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'ft_utils.execute_command'): + mock_obj = mock.Mock() + attrs = {'deploy_manager.return_value': ''} + mock_obj.configure_mock(**attrs) + + m.return_value = mock_obj + + self.assertEqual(self.ims_vnf.deploy_orchestrator(), + {'status': 'PASS', 'result': ''}) + + def test_deploy_vnf_missing_flavor(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Clearwater', return_value=mock.Mock()), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(False, '')), \ + self.assertRaises(Exception) as context: + self.ims_vnf.deploy_vnf() + msg = "Failed to find required flavor for this deployment" + self.assertTrue(msg in context.exception) + + def test_deploy_vnf_missing_os_image(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Clearwater', return_value=mock.Mock()) as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(True, 'test_flavor')), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value=''), \ + self.assertRaises(Exception) as context: + self.ims_vnf.deploy_vnf() + msg = "Failed to find required OS image" + msg += " for clearwater VMs" + self.assertTrue(msg in context.exception) + self.assertTrue(m.set_flavor_id.called) + + def test_deploy_vnf_missing_get_ext_net(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Clearwater', return_value=mock.Mock()) as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(True, 'test_flavor')), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value='image_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_external_net', + return_value=''), \ + self.assertRaises(Exception) as context: + self.ims_vnf.deploy_vnf() + msg = "Failed to get external network" + self.assertTrue(msg in context.exception) + self.assertTrue(m.set_flavor_id.called) + self.assertTrue(m.set_image_id.called) + + def test_deploy_vnf_with_error(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Clearwater') as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(True, 'test_flavor')), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value='image_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_external_net', + return_value='ext_net'): + mock_obj = mock.Mock() + attrs = {'deploy_vnf.return_value': 'error'} + mock_obj.configure_mock(**attrs) + + m.return_value = mock_obj + + self.assertEqual(self.ims_vnf.deploy_vnf(), + {'status': 'FAIL', 'result': 'error'}) + + def test_deploy_vnf_default(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'Clearwater') as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_or_create_flavor', + return_value=(True, 'test_flavor')), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_image_id', + return_value='image_id'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.get_external_net', + return_value='ext_net'): + mock_obj = mock.Mock() + attrs = {'deploy_vnf.return_value': ''} + mock_obj.configure_mock(**attrs) + + m.return_value = mock_obj + + self.assertEqual(self.ims_vnf.deploy_vnf(), + {'status': 'PASS', 'result': ''}) + + def test_test_vnf_ip_retrieval_failure(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.popen', side_effect=Exception), \ + self.assertRaises(Exception) as context: + msg = "Unable to retrieve the IP of the " + msg += "cloudify manager server !" + self.ims_vnf.test_vnf() + self.assertTrue(msg in context.exception) + + def test_test_vnf_create_number_failure(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.popen') as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'requests.get'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'requests.post', + return_value=self.mock_post), \ + self.assertRaises(Exception) as context: + mock_obj = mock.Mock() + attrs = {'read.return_value': 'test_ip\n'} + mock_obj.configure_mock(**attrs) + m.return_value = mock_obj + + self.ims_vnf.test_vnf() + + msg = "Unable to create a number:" + self.assertTrue(msg in context.exception) + + def _get_post_status(self, url, cookies='', data=''): + ellis_url = "http://test_ellis_ip/session" + if url == ellis_url: + return self.mock_post_200 + return self.mock_post + + def test_test_vnf_fail(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.popen') as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'requests.get') as mock_get, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'requests.post', + side_effect=self._get_post_status), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'ft_utils.get_resolvconf_ns'), \ + mock.patch('__builtin__.open', mock.mock_open()), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'subprocess.call'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.remove'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'json.load', return_value=''): + mock_obj = mock.Mock() + attrs = {'read.return_value': 'test_ip\n'} + mock_obj.configure_mock(**attrs) + m.return_value = mock_obj + + mock_obj2 = mock.Mock() + attrs = {'json.return_value': {'outputs': + {'dns_ip': 'test_dns_ip', + 'ellis_ip': 'test_ellis_ip'}}} + mock_obj2.configure_mock(**attrs) + mock_get.return_value = mock_obj2 + + self.assertEqual(self.ims_vnf.test_vnf(), + {'status': 'FAIL', 'result': ''}) + + def test_test_vnf_pass(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.popen') as m, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'requests.get') as mock_get, \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'requests.post', + side_effect=self._get_post_status), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'ft_utils.get_resolvconf_ns'), \ + mock.patch('__builtin__.open', mock.mock_open()), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'subprocess.call'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.remove'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'json.load', return_value='vims_test_result'): + mock_obj = mock.Mock() + attrs = {'read.return_value': 'test_ip\n'} + mock_obj.configure_mock(**attrs) + m.return_value = mock_obj + + mock_obj2 = mock.Mock() + attrs = {'json.return_value': {'outputs': + {'dns_ip': 'test_dns_ip', + 'ellis_ip': 'test_ellis_ip'}}} + mock_obj2.configure_mock(**attrs) + mock_get.return_value = mock_obj2 + + self.assertEqual(self.ims_vnf.test_vnf(), + {'status': 'PASS', 'result': 'vims_test_result'}) + + def test_download_and_add_image_on_glance_incorrect_url(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.makedirs'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'ft_utils.download_url', + return_value=False): + resp = cloudify_ims.download_and_add_image_on_glance(self. + glance_client, + 'image_name', + 'http://url', + 'data_dir') + self.assertEqual(resp, False) + + def test_download_and_add_image_on_glance_image_creation_failure(self): + with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os.makedirs'), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'ft_utils.download_url', + return_value=True), \ + mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' + 'os_utils.create_glance_image', + return_value=''): + resp = cloudify_ims.download_and_add_image_on_glance(self. + glance_client, + 'image_name', + 'http://url', + 'data_dir') + self.assertEqual(resp, False) + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/functest/tests/unit/opnfv_tests/vnf/ims/test_orchestrator_cloudify.py b/functest/tests/unit/opnfv_tests/vnf/ims/test_orchestrator_cloudify.py new file mode 100644 index 00000000..620b0216 --- /dev/null +++ b/functest/tests/unit/opnfv_tests/vnf/ims/test_orchestrator_cloudify.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python + +# 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 + +import logging +import unittest + +import mock + +from functest.opnfv_tests.vnf.ims import orchestrator_cloudify + + +class ImsVnfTesting(unittest.TestCase): + + logging.disable(logging.CRITICAL) + + def setUp(self): + self.orchestrator = orchestrator_cloudify.Orchestrator('test_dir') + self.bp = {'file_name': 'test_file', + 'destination_folder': 'test_folder', + 'url': 'test_url', + 'branch': 'test_branch'} + + def test_download_manager_blueprint_download_blueprint_failed(self): + self.orchestrator.manager_blueprint = False + with mock.patch.object(self.orchestrator, '_download_blueprints', + return_value=False), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'exit') as mock_exit: + self.orchestrator.download_manager_blueprint('test_url', + 'test_branch') + mock_exit.assert_any_call(-1) + + def test_download_manager_blueprint_download_blueprint_passed(self): + self.orchestrator.manager_blueprint = False + with mock.patch.object(self.orchestrator, '_download_blueprints', + return_value=True): + self.orchestrator.download_manager_blueprint('test_url', + 'test_branch') + self.assertEqual(self.orchestrator.manager_blueprint, + True) + + def test_deploy_manager_failed(self): + self.orchestrator.manager_blueprint = True + with mock.patch('__builtin__.open', mock.mock_open()), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'os.remove'), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'execute_command', return_value='error'): + self.assertEqual(self.orchestrator.deploy_manager(), + 'error') + self.assertEqual(self.orchestrator.manager_up, + False) + + def test_deploy_manager_passed(self): + self.orchestrator.manager_blueprint = True + with mock.patch('__builtin__.open', mock.mock_open()), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'os.remove'), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'execute_command', return_value=''): + self.orchestrator.deploy_manager() + self.assertEqual(self.orchestrator.manager_up, + True) + + def test_undeploy_manager_passed(self): + with mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'execute_command', return_value=''): + self.orchestrator.deploy_manager() + self.assertEqual(self.orchestrator.manager_up, + False) + + def test_dwnld_upload_and_depl_blueprint_dwnld_blueprint_failed(self): + with mock.patch.object(self.orchestrator, '_download_blueprints', + return_value=False), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'exit', side_effect=Exception) as mock_exit, \ + self.assertRaises(Exception): + self.orchestrator.download_upload_and_deploy_blueprint(self.bp, + 'cfig', + 'bpn', + 'dpn') + mock_exit.assert_any_call(-1) + + def test_dwnld_upload_and_depl_blueprint_failed(self): + with mock.patch.object(self.orchestrator, '_download_blueprints', + return_value=True), \ + mock.patch('__builtin__.open', mock.mock_open()), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'execute_command', return_value='error'): + r = self.orchestrator.download_upload_and_deploy_blueprint(self.bp, + 'cfig', + 'bpn', + 'dpn') + self.assertEqual(r, 'error') + + def test__download_blueprints_failed(self): + with mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'shutil.rmtree'), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'Repo.clone_from', side_effect=Exception): + self.assertEqual(self.orchestrator._download_blueprints('bp_url', + 'branch', + 'dest'), + False) + + def test__download_blueprints_passed(self): + with mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'shutil.rmtree'), \ + mock.patch('functest.opnfv_tests.vnf.ims.orchestrator_cloudify.' + 'Repo.clone_from'): + self.assertEqual(self.orchestrator._download_blueprints('bp_url', + 'branch', + 'dest'), + True) + + +if __name__ == "__main__": + unittest.main(verbosity=2) |