From fa8f32f2d4919ac83a00ea8012a7f0de0de9241c Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=A9dric=20Ollivier?= Date: Fri, 26 Jul 2019 16:59:14 +0200 Subject: [PATCH] Switch to Python 3.7 and Alpine 3.10 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It also allows building docs as doc8 is broken due to latest OpenStack's upper-constraints. pylint is updated to 2.3.1 (lastest py3.7 version) It disables perm as umask is currently false on lf-virtual1. Change-Id: If09d4796d48b7d0591e7926621d3bbf5ca1b6c24 Signed-off-by: Cédric Ollivier --- ansible/site.yml | 2 +- build.sh | 10 +-- docker/benchmarking/Dockerfile | 2 +- docker/core/Dockerfile | 6 +- docker/features/Dockerfile | 2 +- docker/healthcheck/Dockerfile | 2 +- docker/smoke/Dockerfile | 2 +- docker/vnf/Dockerfile | 7 +- functest/core/cloudify.py | 7 +- functest/core/singlevm.py | 9 +- functest/core/tenantnetwork.py | 2 +- functest/opnfv_tests/openstack/rally/rally.py | 99 +++++++++++----------- functest/opnfv_tests/openstack/tempest/tempest.py | 20 ++--- .../opnfv_tests/openstack/vping/vping_userdata.py | 2 +- functest/opnfv_tests/sdn/odl/odl.py | 2 +- functest/opnfv_tests/vnf/epc/juju_epc.py | 4 +- functest/opnfv_tests/vnf/ims/clearwater.py | 19 ++--- functest/opnfv_tests/vnf/ims/cloudify_ims.py | 4 +- functest/opnfv_tests/vnf/ims/heat_ims.py | 2 +- .../opnfv_tests/vnf/router/cloudify_vrouter.py | 2 +- .../router/test_controller/function_test_exec.py | 2 +- functest/opnfv_tests/vnf/router/utilvnf.py | 2 +- .../vnf/router/vnf_controller/checker.py | 2 +- .../vnf/router/vnf_controller/command_generator.py | 2 +- .../vnf/router/vnf_controller/ssh_client.py | 4 +- .../vnf/router/vnf_controller/vm_controller.py | 2 +- .../vnf/router/vnf_controller/vnf_controller.py | 2 +- functest/opnfv_tests/vnf/router/vrouter_base.py | 2 +- functest/tests/unit/openstack/rally/test_rally.py | 6 +- .../tests/unit/openstack/tempest/test_tempest.py | 8 +- functest/tests/unit/utils/test_functest_utils.py | 4 +- functest/utils/config.py | 2 +- tox.ini | 20 ++--- upper-constraints.txt | 4 +- 34 files changed, 131 insertions(+), 136 deletions(-) diff --git a/ansible/site.yml b/ansible/site.yml index 15fae5dd7..fb02094dc 100644 --- a/ansible/site.yml +++ b/ansible/site.yml @@ -10,7 +10,7 @@ - repo: _ dport: container: alpine - tag: 3.9 + tag: 3.10 steps: - name: build opnfv/functest-core containers: diff --git a/build.sh b/build.sh index 9fdbc2516..ec5f06544 100644 --- a/build.sh +++ b/build.sh @@ -34,11 +34,11 @@ for dir in ${amd64_dirs}; do (docker rmi "${repo}/functest-${dir##**/}:amd64-latest" || true) done [ -n "${amd64_dirs}" ] && - (docker rmi "${repo}/functest-core:amd64-latest" alpine:3.9 || true) + (docker rmi "${repo}/functest-core:amd64-latest" alpine:3.10 || true) find . -name Dockerfile -exec git checkout {} + find . -name Dockerfile -exec sed -i \ - -e "s|alpine:3.9|multiarch/alpine:arm64-v3.9|g" {} + + -e "s|alpine:3.10|multiarch/alpine:arm64-v3.10|g" {} + find . -name Dockerfile -exec sed -i \ -e "s|opnfv/functest-core|${repo}/functest-core:arm64-latest|g" {} + find . -name Dockerfile -exec sed -i \ @@ -52,11 +52,11 @@ for dir in ${arm64_dirs}; do done [ -n "${arm64_dirs}" ] && (docker rmi "${repo}/functest-core:arm64-latest" \ - multiarch/alpine:arm64-v3.9 || true) + multiarch/alpine:arm64-v3.10 || true) find . -name Dockerfile -exec git checkout {} + find . -name Dockerfile -exec sed -i \ - -e "s|alpine:3.9|multiarch/alpine:armhf-v3.9|g" {} + + -e "s|alpine:3.10|multiarch/alpine:armhf-v3.10|g" {} + find . -name Dockerfile -exec sed -i \ -e "s|opnfv/functest-core|${repo}/functest-core:arm-latest|g" {} + find . -name Dockerfile -exec sed -i \ @@ -70,7 +70,7 @@ for dir in ${arm_dirs}; do done [ -n "${arm_dirs}" ] && (docker rmi "${repo}/functest-core:arm-latest" \ - multiarch/alpine:armhf-v3.9 || true) + multiarch/alpine:armhf-v3.10 || true) find . -name Dockerfile -exec git checkout {} + exit $? diff --git a/docker/benchmarking/Dockerfile b/docker/benchmarking/Dockerfile index bcf331483..a282886f2 100644 --- a/docker/benchmarking/Dockerfile +++ b/docker/benchmarking/Dockerfile @@ -30,5 +30,5 @@ RUN apk --no-cache add --update libxml2 libxslt && \ cp -r /src/neutron/rally-jobs /home/opnfv/functest/data/rally/neutron/rally-jobs && \ rm -r upper-constraints.txt upper-constraints.opnfv.txt /src/vmtp /src/neutron && \ apk del .build-deps -COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml +COPY testcases.yaml /usr/lib/python3.7/site-packages/xtesting/ci/testcases.yaml CMD ["run_tests", "-t", "all"] diff --git a/docker/core/Dockerfile b/docker/core/Dockerfile index ec69df03a..734667530 100644 --- a/docker/core/Dockerfile +++ b/docker/core/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.9 +FROM alpine:3.10 ARG BRANCH=master ARG OPENSTACK_TAG=master @@ -25,8 +25,8 @@ RUN apk --no-cache add --update \ pip3 install --no-cache-dir --src /src -cupper-constraints.opnfv.txt -cupper-constraints.txt \ /src/functest && \ rm -r upper-constraints.txt upper-constraints.opnfv.txt /src/functest && \ - cp /usr/lib/python3.6/site-packages/functest/ci/logging.ini /usr/lib/python3.6/site-packages/xtesting/ci/ && \ - cp /usr/lib/python3.6/site-packages/functest/ci/logging.debug.ini /usr/lib/python3.6/site-packages/xtesting/ci/ && \ + cp /usr/lib/python3.7/site-packages/functest/ci/logging.ini /usr/lib/python3.7/site-packages/xtesting/ci/ && \ + cp /usr/lib/python3.7/site-packages/functest/ci/logging.debug.ini /usr/lib/python3.7/site-packages/xtesting/ci/ && \ bash -c "mkdir -p /var/lib/xtesting /home/opnfv" && \ ln -s /var/lib/xtesting /home/opnfv/functest && \ bash -c "mkdir -p /home/opnfv/functest{/conf,/data,/images,/results} /home/opnfv/repos/vnfs" && \ diff --git a/docker/features/Dockerfile b/docker/features/Dockerfile index f41a0a000..3fc6f1d7e 100644 --- a/docker/features/Dockerfile +++ b/docker/features/Dockerfile @@ -18,5 +18,5 @@ RUN apk --no-cache add --update sshpass && \ -rthirdparty-requirements.txt && \ rm -r upper-constraints.txt upper-constraints.opnfv.txt thirdparty-requirements.txt && \ apk del .build-deps -COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml +COPY testcases.yaml /usr/lib/python3.7/site-packages/xtesting/ci/testcases.yaml CMD ["run_tests", "-t", "all"] diff --git a/docker/healthcheck/Dockerfile b/docker/healthcheck/Dockerfile index 6afc5143c..451115cad 100644 --- a/docker/healthcheck/Dockerfile +++ b/docker/healthcheck/Dockerfile @@ -21,5 +21,5 @@ RUN apk --no-cache add --virtual .build-deps --update \ rm -r /src/odl_test/.git thirdparty-requirements.txt upper-constraints.txt \ upper-constraints.opnfv.txt && \ apk del .build-deps -COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml +COPY testcases.yaml /usr/lib/python3.7/site-packages/xtesting/ci/testcases.yaml CMD ["run_tests", "-t", "all"] diff --git a/docker/smoke/Dockerfile b/docker/smoke/Dockerfile index 800376e53..d7f93cf71 100644 --- a/docker/smoke/Dockerfile +++ b/docker/smoke/Dockerfile @@ -47,5 +47,5 @@ RUN apk --no-cache add --virtual .build-deps --update \ COPY compute.txt /home/opnfv/functest/data/refstack/compute.txt COPY object.txt /home/opnfv/functest/data/refstack/object.txt COPY platform.txt /home/opnfv/functest/data/refstack/platform.txt -COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml +COPY testcases.yaml /usr/lib/python3.7/site-packages/xtesting/ci/testcases.yaml CMD ["run_tests", "-t", "all"] diff --git a/docker/vnf/Dockerfile b/docker/vnf/Dockerfile index ef1837ba6..cf67c8a77 100644 --- a/docker/vnf/Dockerfile +++ b/docker/vnf/Dockerfile @@ -18,7 +18,6 @@ ENV GOBIN /src/epc-requirements/go/bin ENV PATH $GOBIN:$PATH COPY clearwater-heat-singlenet-deps.patch /tmp/clearwater-heat-singlenet-deps.patch -COPY cloudify-rest-client-py3.patch /tmp/cloudify-rest-client-py3.patch RUN apk --no-cache add --update \ ruby ruby-bundler ruby-irb ruby-rdoc \ procps libxslt libxml2 zlib libffi go musl-dev && \ @@ -29,8 +28,6 @@ RUN apk --no-cache add --update \ case $(uname -m) in aarch*|arm*) sed -i -E /^PyNaCl=/d upper-constraints.txt ;; esac && \ wget -q -O- https://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH > upper-constraints.opnfv.txt && \ sed -i -E /#egg=functest/d upper-constraints.opnfv.txt && \ - (cd /usr/lib/python3.6/site-packages/cloudify_rest_client && \ - patch -p2 < /tmp/cloudify-rest-client-py3.patch) && \ git clone --depth 1 -b $VIMS_TEST_TAG https://github.com/Metaswitch/clearwater-live-test /src/vims-test && \ sed -i s/unf_ext\ \(.*\)/unf_ext\ \(0.0.7.4\)/g /src/vims-test/Gemfile.lock && \ git init /src/vims-test/quaff && \ @@ -78,7 +75,7 @@ RUN apk --no-cache add --update \ (cd /src/vims-test && bundle config build.nokogiri --use-system-libraries && bundle install --system && bundle update rest-client) && \ rm -r upper-constraints.txt upper-constraints.opnfv.txt /src/vims-test/.git /src/cloudify_vims/.git /src/heat_vims/.git /src/vims-test/quaff/.git \ /src/vims-test/build-infra/.git /src/opnfv-vnf-vyos-blueprint/.git \ - /tmp/clearwater-heat-singlenet-deps.patch /tmp/cloudify-rest-client-py3.patch && \ + /tmp/clearwater-heat-singlenet-deps.patch && \ apk del .build-deps -COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml +COPY testcases.yaml /usr/lib/python3.7/site-packages/xtesting/ci/testcases.yaml CMD ["run_tests", "-t", "all"] diff --git a/functest/core/cloudify.py b/functest/core/cloudify.py index 21bfc937e..b5bd1b3c2 100644 --- a/functest/core/cloudify.py +++ b/functest/core/cloudify.py @@ -147,7 +147,7 @@ class Cloudify(singlevm.SingleVm2): self.cfy_client.executions.cancel( execution['id'], force=True) except Exception: # pylint: disable=broad-except - self.__logger.warn("Can't cancel the current exec") + self.__logger.warning("Can't cancel the current exec") execution = self.cfy_client.executions.start( dep_name, 'uninstall', parameters=dict(ignore_failure=True)) wait_for_execution(self.cfy_client, execution, self.__logger) @@ -191,9 +191,8 @@ def wait_for_execution(client, execution, logger, timeout=3600, ): 'execution of operation {0} for deployment {1} ' 'timed out'.format(execution.workflow_id, execution.deployment_id)) - else: - # update the remaining timeout - timeout = deadline - time.time() + # update the remaining timeout + timeout = deadline - time.time() if not execution_ended: execution = client.executions.get(execution.id) diff --git a/functest/core/singlevm.py b/functest/core/singlevm.py index 521eb1484..dce6d819b 100644 --- a/functest/core/singlevm.py +++ b/functest/core/singlevm.py @@ -230,11 +230,10 @@ class VmReady1(tenantnetwork.TenantNetwork1): self.__logger.debug( "regex found: '%s' in console\n%s", regex, console) return True - else: - self.__logger.debug( - "try %s: cannot find regex '%s' in console\n%s", - iloop + 1, regex, console) - time.sleep(10) + self.__logger.debug( + "try %s: cannot find regex '%s' in console\n%s", + iloop + 1, regex, console) + time.sleep(10) self.__logger.error("cannot find regex '%s' in console", regex) return False diff --git a/functest/core/tenantnetwork.py b/functest/core/tenantnetwork.py index ae739ac36..604e49ae5 100644 --- a/functest/core/tenantnetwork.py +++ b/functest/core/tenantnetwork.py @@ -33,7 +33,7 @@ from functest.utils import config from functest.utils import env -class NewProject(object): +class NewProject(): """Ease creating new projects/users""" # pylint: disable=too-many-instance-attributes diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py index efc2e784f..7438d7155 100644 --- a/functest/opnfv_tests/openstack/rally/rally.py +++ b/functest/opnfv_tests/openstack/rally/rally.py @@ -40,29 +40,29 @@ class RallyBase(singlevm.VmReady2): """Base class form Rally testcases implementation.""" # pylint: disable=too-many-instance-attributes, too-many-public-methods - TESTS = ['authenticate', 'glance', 'cinder', 'gnocchi', 'heat', - 'keystone', 'neutron', 'nova', 'quotas', 'swift', 'barbican'] + stests = ['authenticate', 'glance', 'cinder', 'gnocchi', 'heat', + 'keystone', 'neutron', 'nova', 'quotas', 'swift', 'barbican'] - RALLY_CONF_PATH = "/etc/rally/rally.conf" - RALLY_AARCH64_PATCH_PATH = pkg_resources.resource_filename( + rally_conf_path = "/etc/rally/rally.conf" + rally_aar4_patch_path = pkg_resources.resource_filename( 'functest', 'ci/rally_aarch64_patch.conf') - RALLY_DIR = pkg_resources.resource_filename( + rally_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/rally') - RALLY_SCENARIO_DIR = pkg_resources.resource_filename( + rally_scenario_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/rally/scenario') - TEMPLATE_DIR = pkg_resources.resource_filename( + template_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/rally/scenario/templates') - SUPPORT_DIR = pkg_resources.resource_filename( + support_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/rally/scenario/support') - USERS_AMOUNT = 2 - TENANTS_AMOUNT = 3 - ITERATIONS_AMOUNT = 10 - CONCURRENCY = 4 - VOLUME_VERSION = 3 - VOLUME_SERVICE_TYPE = "volumev3" - BLACKLIST_FILE = os.path.join(RALLY_DIR, "blacklist.yaml") - TASK_DIR = os.path.join(getattr(config.CONF, 'dir_rally_data'), 'task') - TEMP_DIR = os.path.join(TASK_DIR, 'var') + users_amount = 2 + tenants_amount = 3 + iterations_amount = 10 + concurrency = 4 + volume_version = 3 + volume_service_type = "volumev3" + blacklist_file = os.path.join(rally_dir, "blacklist.yaml") + task_dir = os.path.join(getattr(config.CONF, 'dir_rally_data'), 'task') + temp_dir = os.path.join(task_dir, 'var') visibility = 'public' shared_network = True @@ -108,16 +108,16 @@ class RallyBase(singlevm.VmReady2): task_args['flavor_alt_name'] = str(self.flavor_alt.name) task_args['glance_image_location'] = str(self.filename) task_args['glance_image_format'] = str(self.image_format) - task_args['tmpl_dir'] = str(self.TEMPLATE_DIR) - task_args['sup_dir'] = str(self.SUPPORT_DIR) - task_args['users_amount'] = self.USERS_AMOUNT - task_args['tenants_amount'] = self.TENANTS_AMOUNT + task_args['tmpl_dir'] = str(self.template_dir) + task_args['sup_dir'] = str(self.support_dir) + task_args['users_amount'] = self.users_amount + task_args['tenants_amount'] = self.tenants_amount task_args['use_existing_users'] = False - task_args['iterations'] = self.ITERATIONS_AMOUNT - task_args['concurrency'] = self.CONCURRENCY + task_args['iterations'] = self.iterations_amount + task_args['concurrency'] = self.concurrency task_args['smoke'] = self.smoke - task_args['volume_version'] = self.VOLUME_VERSION - task_args['volume_service_type'] = self.VOLUME_SERVICE_TYPE + task_args['volume_version'] = self.volume_version + task_args['volume_service_type'] = self.volume_service_type task_args['block_migration'] = env.get("BLOCK_MIGRATION").lower() if self.ext_net: @@ -135,7 +135,7 @@ class RallyBase(singlevm.VmReady2): def _prepare_test_list(self, test_name): """Build the list of test cases to be executed.""" test_yaml_file_name = 'opnfv-{}.yaml'.format(test_name) - scenario_file_name = os.path.join(self.RALLY_SCENARIO_DIR, + scenario_file_name = os.path.join(self.rally_scenario_dir, test_yaml_file_name) if not os.path.exists(scenario_file_name): @@ -147,10 +147,10 @@ class RallyBase(singlevm.VmReady2): % scenario_file_name) LOGGER.debug('Scenario fetched from : %s', scenario_file_name) - test_file_name = os.path.join(self.TEMP_DIR, test_yaml_file_name) + test_file_name = os.path.join(self.temp_dir, test_yaml_file_name) - if not os.path.exists(self.TEMP_DIR): - os.makedirs(self.TEMP_DIR) + if not os.path.exists(self.temp_dir): + os.makedirs(self.temp_dir) self.apply_blacklist(scenario_file_name, test_file_name) return test_file_name @@ -178,10 +178,10 @@ class RallyBase(singlevm.VmReady2): if pod_arch and pod_arch in arch_filter: LOGGER.info("Apply aarch64 specific to rally config...") - with open(RallyBase.RALLY_AARCH64_PATCH_PATH, "r") as pfile: + with open(RallyBase.rally_aar4_patch_path, "r") as pfile: rally_patch_conf = pfile.read() - for line in fileinput.input(RallyBase.RALLY_CONF_PATH): + for line in fileinput.input(RallyBase.rally_conf_path): print(line, end=' ') if "cirros|testvm" in line: print(rally_patch_conf) @@ -282,7 +282,7 @@ class RallyBase(singlevm.VmReady2): """Exclude scenario.""" black_tests = [] try: - with open(RallyBase.BLACKLIST_FILE, 'r') as black_list_file: + with open(RallyBase.blacklist_file, 'r') as black_list_file: black_list_yaml = yaml.safe_load(black_list_file) deploy_scenario = env.get('DEPLOY_SCENARIO') @@ -326,7 +326,7 @@ class RallyBase(singlevm.VmReady2): func_list = [] try: - with open(RallyBase.BLACKLIST_FILE, 'r') as black_list_file: + with open(RallyBase.blacklist_file, 'r') as black_list_file: black_list_yaml = yaml.safe_load(black_list_file) if env.get('BLOCK_MIGRATION').lower() == 'true': @@ -439,6 +439,7 @@ class RallyBase(singlevm.VmReady2): self._save_results(test_name, task_id) def _append_summary(self, json_raw, test_name): + # pylint: disable=too-many-locals """Update statistics summary info.""" nb_tests = 0 nb_success = 0 @@ -481,29 +482,29 @@ class RallyBase(singlevm.VmReady2): """Prepare resources needed by test scenarios.""" assert self.cloud LOGGER.debug('Validating run tests...') - for test in kwargs.get('tests', self.TESTS): - if test in self.TESTS: + for test in kwargs.get('tests', self.stests): + if test in self.stests: self.tests.append(test) else: raise Exception("Test name '%s' is invalid" % test) - if not os.path.exists(self.TASK_DIR): - os.makedirs(self.TASK_DIR) + if not os.path.exists(self.task_dir): + os.makedirs(self.task_dir) - task = os.path.join(self.RALLY_DIR, 'task.yaml') + task = os.path.join(self.rally_dir, 'task.yaml') if not os.path.exists(task): LOGGER.error("Task file '%s' does not exist.", task) raise Exception("Task file '{}' does not exist.". format(task)) - self.task_file = os.path.join(self.TASK_DIR, 'task.yaml') + self.task_file = os.path.join(self.task_dir, 'task.yaml') shutil.copyfile(task, self.task_file) - task_macro = os.path.join(self.RALLY_DIR, 'macro') + task_macro = os.path.join(self.rally_dir, 'macro') if not os.path.exists(task_macro): LOGGER.error("Task macro dir '%s' does not exist.", task_macro) raise Exception("Task macro dir '{}' does not exist.". format(task_macro)) - macro_dir = os.path.join(self.TASK_DIR, 'macro') + macro_dir = os.path.join(self.task_dir, 'macro') if os.path.exists(macro_dir): shutil.rmtree(macro_dir) shutil.copytree(task_macro, macro_dir) @@ -709,7 +710,7 @@ class RallySanity(RallyBase): kwargs["case_name"] = "rally_sanity" super(RallySanity, self).__init__(**kwargs) self.smoke = True - self.scenario_dir = os.path.join(self.RALLY_SCENARIO_DIR, 'sanity') + self.scenario_dir = os.path.join(self.rally_scenario_dir, 'sanity') class RallyFull(RallyBase): @@ -721,26 +722,26 @@ class RallyFull(RallyBase): kwargs["case_name"] = "rally_full" super(RallyFull, self).__init__(**kwargs) self.smoke = False - self.scenario_dir = os.path.join(self.RALLY_SCENARIO_DIR, 'full') + self.scenario_dir = os.path.join(self.rally_scenario_dir, 'full') class RallyJobs(RallyBase): """Rally OpenStack CI testcase implementation.""" - TESTS = ["neutron"] + stests = ["neutron"] def __init__(self, **kwargs): """Initialize RallyJobs object.""" if "case_name" not in kwargs: kwargs["case_name"] = "rally_jobs" super(RallyJobs, self).__init__(**kwargs) - self.task_file = os.path.join(self.RALLY_DIR, 'rally_jobs.yaml') + self.task_file = os.path.join(self.rally_dir, 'rally_jobs.yaml') self.task_yaml = None def prepare_run(self, **kwargs): """Create resources needed by test scenarios.""" super(RallyJobs, self).prepare_run(**kwargs) - with open(os.path.join(self.RALLY_DIR, + with open(os.path.join(self.rally_dir, 'rally_jobs.yaml'), 'r') as task_file: self.task_yaml = yaml.safe_load(task_file) @@ -829,9 +830,9 @@ class RallyJobs(RallyBase): raise Exception("The scenario '%s' does not exist." % task) LOGGER.debug('Scenario fetched from : %s', task) - if not os.path.exists(self.TEMP_DIR): - os.makedirs(self.TEMP_DIR) - task_file_name = os.path.join(self.TEMP_DIR, task_name) + if not os.path.exists(self.temp_dir): + os.makedirs(self.temp_dir) + task_file_name = os.path.join(self.temp_dir, task_name) self.apply_blacklist(task, task_file_name) self.run_cmd = (["rally", "task", "start", "--task", task_file_name, "--task-args", str(self.build_task_args(test_name))]) diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py index fb0c15512..be86cee86 100644 --- a/functest/opnfv_tests/openstack/tempest/tempest.py +++ b/functest/opnfv_tests/openstack/tempest/tempest.py @@ -41,13 +41,13 @@ class TempestCommon(singlevm.VmReady2): visibility = 'public' filename_alt = '/home/opnfv/functest/images/cirros-0.4.0-x86_64-disk.img' shared_network = True - TEMPEST_CONF_YAML = pkg_resources.resource_filename( + tempest_conf_yaml = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml') - TEMPEST_CUSTOM = pkg_resources.resource_filename( + tempest_custom = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/tempest/custom_tests/test_list.txt') - TEMPEST_BLACKLIST = pkg_resources.resource_filename( + tempest_blacklist = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml') @@ -224,7 +224,7 @@ class TempestCommon(singlevm.VmReady2): @staticmethod def update_tempest_conf_file(conf_file, rconfig): """Update defined paramters into tempest config file""" - with open(TempestCommon.TEMPEST_CONF_YAML) as yfile: + with open(TempestCommon.tempest_conf_yaml) as yfile: conf_yaml = yaml.safe_load(yfile) if conf_yaml: sections = rconfig.sections() @@ -244,8 +244,8 @@ class TempestCommon(singlevm.VmReady2): compute_cnt=1, image_alt_id=None, flavor_alt_id=None, admin_role_name='admin', cidr='192.168.120.0/24', domain_id='default'): - # pylint: disable=too-many-branches,too-many-arguments, - # too-many-statements + # pylint: disable=too-many-branches,too-many-arguments + # pylint: disable=too-many-statements,too-many-locals """ Add/update needed parameters into tempest.conf file """ @@ -335,12 +335,12 @@ class TempestCommon(singlevm.VmReady2): LOGGER.debug("Generating test case list...") self.backup_tempest_config(self.conf_file, '/etc') if kwargs.get('mode') == 'custom': - if os.path.isfile(self.TEMPEST_CUSTOM): + if os.path.isfile(self.tempest_custom): shutil.copyfile( - self.TEMPEST_CUSTOM, self.list) + self.tempest_custom, self.list) else: raise Exception("Tempest test list file %s NOT found." - % self.TEMPEST_CUSTOM) + % self.tempest_custom) else: testr_mode = kwargs.get( 'mode', r'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$') @@ -363,7 +363,7 @@ class TempestCommon(singlevm.VmReady2): deploy_scenario = env.get('DEPLOY_SCENARIO') if bool(deploy_scenario): # if DEPLOY_SCENARIO is set we read the file - black_list_file = open(self.TEMPEST_BLACKLIST) + black_list_file = open(self.tempest_blacklist) black_list_yaml = yaml.safe_load(black_list_file) black_list_file.close() for item in black_list_yaml: diff --git a/functest/opnfv_tests/openstack/vping/vping_userdata.py b/functest/opnfv_tests/openstack/vping/vping_userdata.py index a58184c59..225c167d5 100644 --- a/functest/opnfv_tests/openstack/vping/vping_userdata.py +++ b/functest/opnfv_tests/openstack/vping/vping_userdata.py @@ -88,7 +88,7 @@ class VPingUserdata(singlevm.VmReady2): elif sec % 10 == 0: if "request failed" in p_console: self.logger.debug( - "It seems userdata is not supported in nova boot. " + + "It seems userdata is not supported in nova boot. " "Waiting a bit...") tries += 1 else: diff --git a/functest/opnfv_tests/sdn/odl/odl.py b/functest/opnfv_tests/sdn/odl/odl.py index 17600a316..b54f0f54b 100644 --- a/functest/opnfv_tests/sdn/odl/odl.py +++ b/functest/opnfv_tests/sdn/odl/odl.py @@ -189,7 +189,7 @@ class ODLTests(robotframework.RobotFramework): return self.run_suites(suites, **kwargs) -class ODLParser(object): # pylint: disable=too-few-public-methods +class ODLParser(): # pylint: disable=too-few-public-methods """Parser to run ODL test suites.""" def __init__(self): diff --git a/functest/opnfv_tests/vnf/epc/juju_epc.py b/functest/opnfv_tests/vnf/epc/juju_epc.py index 7c8a925bb..5a0a86b0c 100644 --- a/functest/opnfv_tests/vnf/epc/juju_epc.py +++ b/functest/opnfv_tests/vnf/epc/juju_epc.py @@ -148,13 +148,13 @@ class JujuEpc(singlevm.VmReady2): def check_requirements(self): if not os.path.exists("/src/epc-requirements/go/bin/juju"): - self.__logger.warn( + self.__logger.warning( "Juju cannot be cross-compiled (arm and arm64) from the time " "being") self.is_skipped = True self.project.clean() if env.get('NEW_USER_ROLE').lower() == "admin": - self.__logger.warn( + self.__logger.warning( "Defining NEW_USER_ROLE=admin will easily break the testcase " "because Juju doesn't manage tenancy (e.g. subnet " "overlapping)") diff --git a/functest/opnfv_tests/vnf/ims/clearwater.py b/functest/opnfv_tests/vnf/ims/clearwater.py index 64f0428b3..67128b11c 100644 --- a/functest/opnfv_tests/vnf/ims/clearwater.py +++ b/functest/opnfv_tests/vnf/ims/clearwater.py @@ -24,7 +24,7 @@ __author__ = ("Valentin Boucher , " "Helen Yao ") -class ClearwaterTesting(object): +class ClearwaterTesting(): """vIMS clearwater base usable by several orchestrators""" def __init__(self, case_name, bono_ip, ellis_ip): @@ -91,8 +91,7 @@ class ClearwaterTesting(object): 'Account %s is created on Ellis\n%s', params.get('full_name'), account_res) return account_res - else: - raise Exception("Cannot create ellis account") + raise Exception("Cannot create ellis account") except Exception: # pylint: disable=broad-except self.logger.info( "try %s: cannot create ellis account", iloop + 1) @@ -110,8 +109,7 @@ class ClearwaterTesting(object): cookies = req.cookies self.logger.debug('cookies: %s', cookies) return cookies - else: - raise Exception('Failed to get cookies for Ellis') + raise Exception('Failed to get cookies for Ellis') except Exception: # pylint: disable=broad-except self.logger.info( "try %s: cannot get cookies for Ellis", iloop + 1) @@ -128,13 +126,12 @@ class ClearwaterTesting(object): self.logger.info( 'Calling number is created: %s', number_res) return number_res + if req and req.json(): + reason = req.json()['reason'] else: - if req and req.json(): - reason = req.json()['reason'] - else: - reason = req - self.logger.info("cannot create a number: %s", reason) - raise Exception('Failed to create a number') + reason = req + self.logger.info("cannot create a number: %s", reason) + raise Exception('Failed to create a number') except Exception: # pylint: disable=broad-except self.logger.info( "try %s: cannot create a number", iloop + 1) diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.py b/functest/opnfv_tests/vnf/ims/cloudify_ims.py index 0f6adf96a..d937cc052 100644 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims.py +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py @@ -103,7 +103,7 @@ class CloudifyIms(cloudify.Cloudify): def check_requirements(self): if env.get('NEW_USER_ROLE').lower() == "admin": - self.__logger.warn( + self.__logger.warning( "Defining NEW_USER_ROLE=admin will easily break the testcase " "because Cloudify doesn't manage tenancy (e.g. subnet " "overlapping)") @@ -250,7 +250,7 @@ class CloudifyIms(cloudify.Cloudify): self.result += vnf_test_rate / 3 * 100 if vnf_test_rate == 0: self.details['test_vnf'].update(status='FAIL') - return True if vnf_test_rate > 0 else False + return bool(vnf_test_rate > 0) def clean(self): """Clean created objects/functions.""" diff --git a/functest/opnfv_tests/vnf/ims/heat_ims.py b/functest/opnfv_tests/vnf/ims/heat_ims.py index 9ea9c5627..4a57a7445 100644 --- a/functest/opnfv_tests/vnf/ims/heat_ims.py +++ b/functest/opnfv_tests/vnf/ims/heat_ims.py @@ -234,7 +234,7 @@ class HeatIms(singlevm.VmReady2): if vnf_test_rate == 0: self.details['test_vnf'].update(status='FAIL') self._monit() - return True if vnf_test_rate > 0 else False + return bool(vnf_test_rate > 0) def clean(self): """Clean created objects/functions.""" diff --git a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py index b449d2d81..c793953d3 100644 --- a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py +++ b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py @@ -113,7 +113,7 @@ class CloudifyVrouter(cloudify.Cloudify): def check_requirements(self): if env.get('NEW_USER_ROLE').lower() == "admin": - self.__logger.warn( + self.__logger.warning( "Defining NEW_USER_ROLE=admin will easily break the testcase " "because Cloudify doesn't manage tenancy (e.g. subnet " "overlapping)") diff --git a/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py b/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py index 0b8a69b73..0a56913b7 100644 --- a/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py +++ b/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py @@ -21,7 +21,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller import ( VnfController) -class FunctionTestExec(object): +class FunctionTestExec(): """vrouter function test execution class""" logger = logging.getLogger(__name__) diff --git a/functest/opnfv_tests/vnf/router/utilvnf.py b/functest/opnfv_tests/vnf/router/utilvnf.py index a54f6cb0b..2db3b38e5 100644 --- a/functest/opnfv_tests/vnf/router/utilvnf.py +++ b/functest/opnfv_tests/vnf/router/utilvnf.py @@ -43,7 +43,7 @@ NUMBER_OF_DIGITS_FOR_AVG_JITTER = 3 NUMBER_OF_DIGITS_FOR_AVG_PKT_LOSS = 1 -class Utilvnf(object): # pylint: disable=too-many-instance-attributes +class Utilvnf(): # pylint: disable=too-many-instance-attributes """ Utility class of vrouter testcase """ logger = logging.getLogger(__name__) diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/checker.py b/functest/opnfv_tests/vnf/router/vnf_controller/checker.py index a7a70f6d7..d3a216ed0 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/checker.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/checker.py @@ -18,7 +18,7 @@ import re from jinja2 import Environment, FileSystemLoader -class Checker(object): +class Checker(): """vrouter test result check class""" logger = logging.getLogger(__name__) diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py b/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py index 7d9116bcc..a86a16485 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py @@ -15,7 +15,7 @@ import logging from jinja2 import Environment, FileSystemLoader -class CommandGenerator(object): +class CommandGenerator(): """command generator class for vrouter testing""" logger = logging.getLogger(__name__) diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py b/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py index 6f4a9cf7f..0969eab3b 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py @@ -24,7 +24,7 @@ DEFAULT_CONNECT_RETRY_COUNT = 10 DEFAULT_SEND_TIMEOUT = 10 -class SshClient(object): # pylint: disable=too-many-instance-attributes +class SshClient(): # pylint: disable=too-many-instance-attributes """ssh client class for vrouter testing""" logger = logging.getLogger(__name__) @@ -80,7 +80,7 @@ class SshClient(object): # pylint: disable=too-many-instance-attributes retrycount -= 1 if retrycount == 0: - self.logger.warn( + self.logger.warning( "Cannot establish connection to IP '%s'", self.ip_address) self.connected = False return self.connected diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py b/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py index a73855421..b159ddda4 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py @@ -23,7 +23,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.ssh_client import ( SshClient) -class VmController(object): +class VmController(): """vm controll class""" logger = logging.getLogger(__name__) diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py b/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py index a5b1ad856..7ed287c6e 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py @@ -26,7 +26,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.vm_controller import ( VmController) -class VnfController(object): +class VnfController(): """vrouter controll class""" logger = logging.getLogger(__name__) diff --git a/functest/opnfv_tests/vnf/router/vrouter_base.py b/functest/opnfv_tests/vnf/router/vrouter_base.py index 8cfab341e..932770b9c 100644 --- a/functest/opnfv_tests/vnf/router/vrouter_base.py +++ b/functest/opnfv_tests/vnf/router/vrouter_base.py @@ -24,7 +24,7 @@ from functest.opnfv_tests.vnf.router.test_controller import function_test_exec __author__ = "Shuya Nakama " -class VrouterOnBoardingBase(object): +class VrouterOnBoardingBase(): """vrouter testing base class""" def __init__(self, util, util_info): diff --git a/functest/tests/unit/openstack/rally/test_rally.py b/functest/tests/unit/openstack/rally/test_rally.py index ac52b87eb..c5cd5019e 100644 --- a/functest/tests/unit/openstack/rally/test_rally.py +++ b/functest/tests/unit/openstack/rally/test_rally.py @@ -96,7 +96,7 @@ class OSRallyTesting(unittest.TestCase): mock_path_exists.side_effect = self.check_temp_dir yaml_file = 'opnfv-{}.yaml'.format('test_file_name') - ret_val = os.path.join(self.rally_base.TEMP_DIR, yaml_file) + ret_val = os.path.join(self.rally_base.temp_dir, yaml_file) self.assertEqual(self.rally_base._prepare_test_list('test_file_name'), ret_val) mock_path_exists.assert_called() @@ -280,7 +280,7 @@ class OSRallyTesting(unittest.TestCase): mock_summary.assert_called() def test_prepare_run_testname_invalid(self): - self.rally_base.TESTS = ['test1', 'test2'] + self.rally_base.stests = ['test1', 'test2'] with self.assertRaises(Exception): self.rally_base.prepare_run(tests=['test']) @@ -290,7 +290,7 @@ class OSRallyTesting(unittest.TestCase): @mock.patch('functest.opnfv_tests.openstack.rally.rally.shutil.rmtree') def test_prepare_run_flavor_alt_creation_failed(self, *args): # pylint: disable=unused-argument - self.rally_base.TESTS = ['test1', 'test2'] + self.rally_base.stests = ['test1', 'test2'] with mock.patch.object(self.rally_base.cloud, 'list_hypervisors') as mock_list_hyperv, \ mock.patch.object(self.rally_base, 'create_flavor_alt', diff --git a/functest/tests/unit/openstack/tempest/test_tempest.py b/functest/tests/unit/openstack/tempest/test_tempest.py index a500a37e1..87438ae7c 100644 --- a/functest/tests/unit/openstack/tempest/test_tempest.py +++ b/functest/tests/unit/openstack/tempest/test_tempest.py @@ -57,7 +57,7 @@ class OSTempestTesting(unittest.TestCase): msg = "Tempest test list file %s NOT found." self.tempestcommon.generate_test_list() self.assertTrue( - (msg % self.tempestcommon.TEMPEST_CUSTOM) in context.exception) + (msg % self.tempestcommon.tempest_custom) in context.exception) @mock.patch('subprocess.check_output') @mock.patch('os.remove') @@ -123,7 +123,7 @@ class OSTempestTesting(unittest.TestCase): mock.mock_open()) as mock_open, \ mock.patch.object(self.tempestcommon, 'read_file', return_value=['test1', 'test2']): - self.tempestcommon.TEMPEST_BLACKLIST = Exception + self.tempestcommon.tempest_blacklist = Exception os.environ['DEPLOY_SCENARIO'] = 'deploy_scenario' self.tempestcommon.apply_tempest_blacklist() obj = mock_open() @@ -163,9 +163,9 @@ class OSTempestTesting(unittest.TestCase): return_value=[r'\} tempest\.']), \ mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'subprocess.Popen'): - self.tempestcommon.TEMPEST_LIST = 'test_tempest_list' + self.tempestcommon.tempest_list = 'test_tempest_list' cmd = ["rally", "verify", "start", "--load-list", - self.tempestcommon.TEMPEST_LIST] + self.tempestcommon.tempest_list] with self.assertRaises(Exception): self.tempestcommon.run_verifier_tests() mock_logger_info. \ diff --git a/functest/tests/unit/utils/test_functest_utils.py b/functest/tests/unit/utils/test_functest_utils.py index 4ec205894..f6a80e264 100644 --- a/functest/tests/unit/utils/test_functest_utils.py +++ b/functest/tests/unit/utils/test_functest_utils.py @@ -82,7 +82,7 @@ class FunctestUtilsTesting(unittest.TestCase): def _get_environ(self, var, *args): # pylint: disable=unused-argument if var == 'INSTALLER_TYPE': return self.installer - elif var == 'DEPLOY_SCENARIO': + if var == 'DEPLOY_SCENARIO': return self.scenario return var @@ -322,7 +322,7 @@ class FunctestUtilsTesting(unittest.TestCase): self.assertEqual( functest_utils.convert_dict_to_ini({"a": "b"}), "a:b") value = functest_utils.convert_dict_to_ini({"a": "b", "c": "d"}) - self.assertTrue(value == "a:b,c:d" or value == "c:d,a:b") + self.assertTrue(value in ('a:b,c:d', 'c:d,a:b')) with self.assertRaises(AssertionError): functest_utils.convert_list_to_ini("") diff --git a/functest/utils/config.py b/functest/utils/config.py index 61d8401c5..c2897d361 100644 --- a/functest/utils/config.py +++ b/functest/utils/config.py @@ -10,7 +10,7 @@ import six from functest.utils import env -class Config(object): +class Config(): def __init__(self): try: # pylint: disable=bad-continuation diff --git a/tox.ini b/tox.ini index 9aa2dfc10..2350f172c 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = docs,pep8,pylint,yamllint,ansiblelint,bashate,bandit,py27,perm,cover +envlist = docs,pep8,pylint,yamllint,ansiblelint,bashate,bandit,py27,py37,cover [testenv] usedevelop = True @@ -18,7 +18,7 @@ commands = nosetests --with-xunit \ functest/tests/unit [testenv:docs] -basepython = python2.7 +basepython = python3.7 commands = doc8 \ --ignore-path api/build \ @@ -32,18 +32,18 @@ commands = sphinx-build -W -n -b html -c docs/lfreleng docs docs/_build/html [testenv:pep8] -basepython = python2.7 +basepython = python3.7 commands = flake8 [testenv:pylint] -basepython = python2.7 +basepython = python3.7 commands = pylint \ --ignore-imports=y --min-similarity-lines=10 \ --disable=locally-disabled functest [testenv:yamllint] -basepython = python2.7 +basepython = python3.7 files = .travis.yml docker @@ -57,7 +57,7 @@ commands = yamllint -s {[testenv:yamllint]files} [testenv:ansiblelint] -basepython = python2.7 +basepython = python3.7 commands = ansible-lint ansible/site.yml @@ -65,7 +65,7 @@ commands = commands = nosetests functest/tests/unit [testenv:bashate] -basepython = python2.7 +basepython = python3.7 files = functest/opnfv_tests/openstack/cinder/write_data.sh functest/opnfv_tests/openstack/cinder/read_data.sh @@ -77,11 +77,11 @@ commands = bashate -e E005,E006,E042,E043 {[testenv:bashate]files} [testenv:bandit] -basepython = python2.7 +basepython = python3.7 commands = bandit -r functest -x tests -n 5 -ll -s B601,B602 [testenv:cover] -basepython = python2.7 +basepython = python3.7 dirs = functest/tests/unit/odl functest/tests/unit/openstack/vping @@ -94,7 +94,7 @@ commands = nosetests --with-coverage --cover-tests \ --cover-min-percentage 100 {[testenv:cover]dirs} [testenv:perm] -basepython = python2.7 +basepython = python3.7 whitelist_externals = bash path=. -not -path './.tox/*' -not -path './.git/*' -not -path './docs/com/pres/reveal.js/*' commands = diff --git a/upper-constraints.txt b/upper-constraints.txt index 15d5bbef6..d87a1a1a8 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -9,7 +9,7 @@ git+https://gerrit.opnfv.org/gerrit/clover#egg=clover git+https://gerrit.opnfv.org/gerrit/parser#egg=nfv-heattranslator&subdirectory=tosca2heat/heat-translator git+https://gerrit.opnfv.org/gerrit/parser#egg=nfv-toscaparser&subdirectory=tosca2heat/tosca-parser -e git+https://gerrit.opnfv.org/gerrit/parser#egg=nfv-parser -cloudify-rest-client===4.3.3 +git+https://github.com/collivier/cloudify-rest-client.git@4.3.3-py3#egg=cloudify-rest-client robotframework===3.1.1 robotframework-httplibrary===0.4.2 robotframework-requests===0.5.0 @@ -23,3 +23,5 @@ git+https://opendev.org/openstack/rally.git#egg=rally git+https://opendev.org/openstack/rally-openstack.git#egg=rally-openstack git+https://github.com/xrally/xrally-kubernetes.git#egg=xrally-kubernetes git+https://github.com/esnme/ultrajson@d25e024f481c5571d15f3c0c406a498ca0467cfd#egg=ujson +pylint===1.9.5;python_version=='2.7' +pylint===2.3.1;python_version=='3.7' -- 2.16.6