Switch to Python 3.7 and Alpine 3.10 64/68264/7
authorCédric Ollivier <cedric.ollivier@orange.com>
Fri, 26 Jul 2019 14:59:14 +0000 (16:59 +0200)
committerCédric Ollivier <cedric.ollivier@orange.com>
Sat, 27 Jul 2019 09:21:29 +0000 (11:21 +0200)
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 <cedric.ollivier@orange.com>
34 files changed:
ansible/site.yml
build.sh
docker/benchmarking/Dockerfile
docker/core/Dockerfile
docker/features/Dockerfile
docker/healthcheck/Dockerfile
docker/smoke/Dockerfile
docker/vnf/Dockerfile
functest/core/cloudify.py
functest/core/singlevm.py
functest/core/tenantnetwork.py
functest/opnfv_tests/openstack/rally/rally.py
functest/opnfv_tests/openstack/tempest/tempest.py
functest/opnfv_tests/openstack/vping/vping_userdata.py
functest/opnfv_tests/sdn/odl/odl.py
functest/opnfv_tests/vnf/epc/juju_epc.py
functest/opnfv_tests/vnf/ims/clearwater.py
functest/opnfv_tests/vnf/ims/cloudify_ims.py
functest/opnfv_tests/vnf/ims/heat_ims.py
functest/opnfv_tests/vnf/router/cloudify_vrouter.py
functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py
functest/opnfv_tests/vnf/router/utilvnf.py
functest/opnfv_tests/vnf/router/vnf_controller/checker.py
functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py
functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py
functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py
functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py
functest/opnfv_tests/vnf/router/vrouter_base.py
functest/tests/unit/openstack/rally/test_rally.py
functest/tests/unit/openstack/tempest/test_tempest.py
functest/tests/unit/utils/test_functest_utils.py
functest/utils/config.py
tox.ini
upper-constraints.txt

index 15fae5d..fb02094 100644 (file)
@@ -10,7 +10,7 @@
           - repo: _
             dport:
             container: alpine
-            tag: 3.9
+            tag: 3.10
         steps:
           - name: build opnfv/functest-core
             containers:
index 9fdbc25..ec5f065 100644 (file)
--- 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 $?
index bcf3314..a282886 100644 (file)
@@ -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"]
index ec69df0..7346675 100644 (file)
@@ -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" && \
index f41a0a0..3fc6f1d 100644 (file)
@@ -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"]
index 6afc514..451115c 100644 (file)
@@ -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"]
index 800376e..d7f93cf 100644 (file)
@@ -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"]
index ef1837b..cf67c8a 100644 (file)
@@ -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"]
index 21bfc93..b5bd1b3 100644 (file)
@@ -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)
index 521eb14..dce6d81 100644 (file)
@@ -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
 
index ae739ac..604e49a 100644 (file)
@@ -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
 
index efc2e78..7438d71 100644 (file)
@@ -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))])
index fb0c155..be86cee 100644 (file)
@@ -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:
index a58184c..225c167 100644 (file)
@@ -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:
index 17600a3..b54f0f5 100644 (file)
@@ -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):
index 7c8a925..5a0a86b 100644 (file)
@@ -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)")
index 64f0428..67128b1 100644 (file)
@@ -24,7 +24,7 @@ __author__ = ("Valentin Boucher <valentin.boucher@orange.com>, "
               "Helen Yao <helanyao@gmail.com>")
 
 
-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)
index 0f6adf9..d937cc0 100644 (file)
@@ -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."""
index 9ea9c56..4a57a74 100644 (file)
@@ -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."""
index b449d2d..c793953 100644 (file)
@@ -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)")
index 0b8a69b..0a56913 100644 (file)
@@ -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__)
index a54f6cb..2db3b38 100644 (file)
@@ -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__)
index a7a70f6..d3a216e 100644 (file)
@@ -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__)
index 7d9116b..a86a164 100644 (file)
@@ -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__)
index 6f4a9cf..0969eab 100644 (file)
@@ -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
index a738554..b159ddd 100644 (file)
@@ -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__)
index a5b1ad8..7ed287c 100644 (file)
@@ -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__)
index 8cfab34..932770b 100644 (file)
@@ -24,7 +24,7 @@ from functest.opnfv_tests.vnf.router.test_controller import function_test_exec
 __author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>"
 
 
-class VrouterOnBoardingBase(object):
+class VrouterOnBoardingBase():
     """vrouter testing base class"""
 
     def __init__(self, util, util_info):
index ac52b87..c5cd501 100644 (file)
@@ -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',
index a500a37..87438ae 100644 (file)
@@ -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. \
index 4ec2058..f6a80e2 100644 (file)
@@ -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("")
 
index 61d8401..c2897d3 100644 (file)
@@ -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 9aa2dfc..2350f17 100644 (file)
--- 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 =
index 15d5bbe..d87a1a1 100644 (file)
@@ -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'