Update to Alpine 3.14 26/72826/5
authorCédric Ollivier <cedric.ollivier@orange.com>
Thu, 12 Aug 2021 14:41:38 +0000 (16:41 +0200)
committerCédric Ollivier <cedric.ollivier@orange.com>
Wed, 18 Aug 2021 07:14:02 +0000 (09:14 +0200)
It also fixes lots of new pylint warnings.

Change-Id: I3376aee5649596c53bc2941ad4d8e0674a2967fe
Signed-off-by: Cédric Ollivier <cedric.ollivier@orange.com>
38 files changed:
.circleci/config.yml
ansible/site.gate.yml
docker/benchmarking-cntt/Dockerfile
docker/benchmarking/Dockerfile
docker/core/Dockerfile
docker/healthcheck/Dockerfile
docker/smoke-cntt/Dockerfile
docker/smoke/Dockerfile
docker/vnf/Dockerfile
functest/core/cloudify.py
functest/core/singlevm.py
functest/core/tenantnetwork.py
functest/opnfv_tests/openstack/api/connection_check.py
functest/opnfv_tests/openstack/barbican/barbican.py
functest/opnfv_tests/openstack/cinder/cinder_test.py
functest/opnfv_tests/openstack/patrole/patrole.py
functest/opnfv_tests/openstack/rally/rally.py
functest/opnfv_tests/openstack/shaker/shaker.py
functest/opnfv_tests/openstack/tempest/tempest.py
functest/opnfv_tests/openstack/vmtp/vmtp.py
functest/opnfv_tests/openstack/vping/vping_ssh.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/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/vm_controller.py
functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py
functest/tests/unit/odl/test_odl.py
functest/tests/unit/openstack/tempest/test_tempest.py
functest/tests/unit/openstack/vmtp/test_vmtp.py
functest/tests/unit/utils/test_functest_utils.py
functest/utils/config.py
functest/utils/functest_utils.py
tox.ini

index f2b3eb7..df2d16c 100644 (file)
@@ -3,7 +3,7 @@ version: 2
 jobs:
   build:
     docker:
-      - image: circleci/python:3.8
+      - image: circleci/python:3.9
     steps:
       - checkout
       - run:
index 0d902dc..7924bd6 100644 (file)
@@ -10,7 +10,7 @@
           - repo: _
             dport:
             container: alpine
-            tag: '3.13'
+            tag: '3.14'
         steps:
           - name: build opnfv/functest-core
             containers:
index 56b69e2..01a430a 100644 (file)
@@ -1,5 +1,5 @@
 FROM opnfv/functest-benchmarking
 
-COPY testcases.yaml /usr/lib/python3.8/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.9/site-packages/xtesting/ci/testcases.yaml
 COPY blacklist.yaml /src/functest/functest/opnfv_tests/openstack/rally/blacklist.yaml
 CMD ["run_tests", "-t", "all"]
index 3108cf4..36594d7 100644 (file)
@@ -26,5 +26,5 @@ RUN apk --no-cache add --update libxml2 libxslt && \
     cp /src/neutron/rally-jobs/task-neutron.yaml /home/opnfv/functest/data/rally/neutron/rally-jobs/ && \
     rm -r /src/vmtp /src/neutron && \
     apk del .build-deps
-COPY testcases.yaml /usr/lib/python3.8/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.9/site-packages/xtesting/ci/testcases.yaml
 CMD ["run_tests", "-t", "all"]
index cb6996f..d955920 100644 (file)
@@ -1,4 +1,4 @@
-FROM alpine:3.13
+FROM alpine:3.14
 
 ARG BRANCH=master
 ARG OPENSTACK_TAG=master
@@ -25,6 +25,7 @@ RUN apk -U upgrade && \
     sed -i -E /^tempest==+.*$/d /src/requirements/upper-constraints.txt && \
     sed -i -E /^six=/d /src/requirements/upper-constraints.txt && \
     sed -i -E /^distlib=/d /src/requirements/upper-constraints.txt && \
+    sed -i -E /^packaging=/d /src/requirements/upper-constraints.txt && \
     case $(uname -m) in aarch*|arm*) sed -i -E /^PyNaCl=/d /src/requirements/upper-constraints.txt && apk add --no-cache py3-pynacl ;; esac && \
     sed -i -E /#egg=functest/d /src/functest/upper-constraints.txt && \
     pip3 install --use-deprecated=legacy-resolver --no-cache-dir --src /src -c/src/functest/upper-constraints.txt -c/src/requirements/upper-constraints.txt \
@@ -44,8 +45,8 @@ RUN apk -U upgrade && \
     rm -r /src/requirements/.git /src/functest/.git \
         /tmp/Switch-to-threading.Thread-for-Rally-tasks.patch \
         /tmp/Create-new-server-in-test_create_backup.patch && \
-    cp /src/functest/functest/ci/logging.ini /usr/lib/python3.8/site-packages/xtesting/ci/ && \
-    cp /src/functest/functest/ci/logging.debug.ini /usr/lib/python3.8/site-packages/xtesting/ci/ && \
+    cp /src/functest/functest/ci/logging.ini /usr/lib/python3.9/site-packages/xtesting/ci/ && \
+    cp /src/functest/functest/ci/logging.debug.ini /usr/lib/python3.9/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 5ec2471..d7ee1e7 100644 (file)
@@ -11,5 +11,5 @@ RUN apk --no-cache add --virtual .build-deps --update \
         git checkout FETCH_HEAD) && \
     rm -r /src/odl_test/.git thirdparty-requirements.txt && \
     apk del .build-deps
-COPY testcases.yaml /usr/lib/python3.8/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.9/site-packages/xtesting/ci/testcases.yaml
 CMD ["run_tests", "-t", "all"]
index 4585edb..7db582b 100644 (file)
@@ -1,5 +1,5 @@
 FROM opnfv/functest-smoke
 
-COPY testcases.yaml /usr/lib/python3.8/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.9/site-packages/xtesting/ci/testcases.yaml
 COPY tempest_conf.yaml /src/functest/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml
 CMD ["run_tests", "-t", "all"]
index 1e083d3..19b2a14 100644 (file)
@@ -90,5 +90,5 @@ RUN apk --no-cache add --update libxml2 libxslt && \
 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.8/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.9/site-packages/xtesting/ci/testcases.yaml
 CMD ["run_tests", "-t", "all"]
index aa98b6c..cf58a7e 100644 (file)
@@ -54,5 +54,5 @@ RUN apk --no-cache add --update \
         /src/vims-test/build-infra/.git /src/opnfv-vnf-vyos-blueprint/.git \
         /tmp/clearwater-heat-singlenet-deps.patch && \
     apk del .build-deps
-COPY testcases.yaml /usr/lib/python3.8/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.9/site-packages/xtesting/ci/testcases.yaml
 CMD ["run_tests", "-t", "all"]
index b5a9594..58e3095 100644 (file)
@@ -46,11 +46,11 @@ class Cloudify(singlevm.SingleVm2):
         """Initialize Cloudify testcase object."""
         if "case_name" not in kwargs:
             kwargs["case_name"] = "cloudify"
-        super(Cloudify, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.cfy_client = None
 
     def prepare(self):
-        super(Cloudify, self).prepare()
+        super().prepare()
         for port in self.ports:
             self.cloud.create_security_group_rule(
                 self.sec.id, port_range_min=port, port_range_max=port,
index 5907111..b2d855b 100644 (file)
@@ -59,7 +59,7 @@ class VmReady1(tenantnetwork.TenantNetwork1):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'vmready1'
-        super(VmReady1, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.image = None
         self.flavor = None
 
@@ -289,7 +289,7 @@ class VmReady1(tenantnetwork.TenantNetwork1):
         status = testcase.TestCase.EX_RUN_ERROR
         try:
             assert self.cloud
-            assert super(VmReady1, self).run(
+            assert super().run(
                 **kwargs) == testcase.TestCase.EX_OK
             self.image = self.publish_image()
             self.flavor = self.create_flavor()
@@ -306,7 +306,7 @@ class VmReady1(tenantnetwork.TenantNetwork1):
         try:
             assert self.orig_cloud
             assert self.cloud
-            super(VmReady1, self).clean()
+            super().clean()
             if self.image:
                 self.cloud.delete_image(self.image.id)
             if self.flavor:
@@ -332,7 +332,7 @@ class VmReady2(VmReady1):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'vmready2'
-        super(VmReady2, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         try:
             assert self.orig_cloud
             self.project = tenantnetwork.NewProject(
@@ -346,7 +346,7 @@ class VmReady2(VmReady1):
 
     def clean(self):
         try:
-            super(VmReady2, self).clean()
+            super().clean()
             assert self.project
             self.project.clean()
         except Exception:  # pylint: disable=broad-except
@@ -375,7 +375,7 @@ class SingleVm1(VmReady1):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'singlevm1'
-        super(SingleVm1, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.sshvm = None
         self.sec = None
         self.fip = None
@@ -480,7 +480,7 @@ class SingleVm1(VmReady1):
         status = testcase.TestCase.EX_RUN_ERROR
         try:
             assert self.cloud
-            assert super(SingleVm1, self).run(
+            assert super().run(
                 **kwargs) == testcase.TestCase.EX_OK
             self.result = 0
             self.prepare()
@@ -511,7 +511,7 @@ class SingleVm1(VmReady1):
                 self.cloud.delete_security_group(self.sec.id)
             if self.keypair:
                 self.cloud.delete_keypair(self.keypair.name)
-            super(SingleVm1, self).clean()
+            super().clean()
         except Exception:  # pylint: disable=broad-except
             self.__logger.exception("Cannot clean all resources")
 
@@ -531,7 +531,7 @@ class SingleVm2(SingleVm1):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'singlevm2'
-        super(SingleVm2, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         try:
             assert self.orig_cloud
             self.project = tenantnetwork.NewProject(
@@ -545,7 +545,7 @@ class SingleVm2(SingleVm1):
 
     def clean(self):
         try:
-            super(SingleVm2, self).clean()
+            super().clean()
             assert self.project
             self.project.clean()
         except Exception:  # pylint: disable=broad-except
index 8b820ce..f8e4ddd 100644 (file)
@@ -150,7 +150,7 @@ class TenantNetwork1(testcase.TestCase):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'tenantnetwork1'
-        super(TenantNetwork1, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.dir_results = os.path.join(getattr(config.CONF, 'dir_results'))
         self.res_dir = os.path.join(self.dir_results, self.case_name)
         self.output_log_name = 'functest.log'
@@ -306,7 +306,7 @@ class TenantNetwork2(TenantNetwork1):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'tenantnetwork2'
-        super(TenantNetwork2, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         try:
             assert self.cloud
             self.project = NewProject(
@@ -320,7 +320,7 @@ class TenantNetwork2(TenantNetwork1):
 
     def clean(self):
         try:
-            super(TenantNetwork2, self).clean()
+            super().clean()
             assert self.project
             self.project.clean()
         except Exception:  # pylint: disable=broad-except
index f3b35e9..eaf9767 100644 (file)
@@ -34,7 +34,7 @@ class ConnectionCheck(testcase.TestCase):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'connection_check'
-        super(ConnectionCheck, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.output_log_name = 'functest.log'
         self.output_debug_log_name = 'functest.debug.log'
         try:
index 7b1bb24..0c2429e 100644 (file)
@@ -9,8 +9,6 @@
 
 # pylint: disable=missing-docstring
 
-import logging
-
 from six.moves import configparser
 
 from functest.opnfv_tests.openstack.tempest import tempest
@@ -18,10 +16,8 @@ from functest.opnfv_tests.openstack.tempest import tempest
 
 class Barbican(tempest.TempestCommon):
 
-    __logger = logging.getLogger(__name__)
-
     def configure(self, **kwargs):
-        super(Barbican, self).configure(**kwargs)
+        super().configure(**kwargs)
         rconfig = configparser.RawConfigParser()
         rconfig.read(self.conf_file)
         if not rconfig.has_section('auth'):
index d81bb10..47bf41b 100644 (file)
@@ -35,7 +35,7 @@ class CinderCheck(singlevm.SingleVm2):
         """Initialize testcase."""
         if "case_name" not in kwargs:
             kwargs["case_name"] = "cinder_test"
-        super(CinderCheck, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.logger = logging.getLogger(__name__)
         self.vm2 = None
         self.fip2 = None
@@ -52,7 +52,7 @@ class CinderCheck(singlevm.SingleVm2):
         return self._write_data() or self._read_data()
 
     def prepare(self):
-        super(CinderCheck, self).prepare()
+        super().prepare()
         self.vm2 = self.boot_vm(
             '{}-vm2_{}'.format(self.case_name, self.guid),
             key_name=self.keypair.id,
@@ -124,4 +124,4 @@ class CinderCheck(singlevm.SingleVm2):
             self.cloud.delete_floating_ip(self.fip2.id)
         if self.volume:
             self.cloud.delete_volume(self.volume.id)
-        super(CinderCheck, self).clean()
+        super().clean()
index 8613d51..bdf18d3 100644 (file)
@@ -9,8 +9,6 @@
 
 # pylint: disable=missing-docstring
 
-import logging
-
 from six.moves import configparser
 
 from functest.opnfv_tests.openstack.tempest import tempest
@@ -18,10 +16,8 @@ from functest.opnfv_tests.openstack.tempest import tempest
 
 class Patrole(tempest.TempestCommon):
 
-    __logger = logging.getLogger(__name__)
-
     def configure(self, **kwargs):
-        super(Patrole, self).configure(**kwargs)
+        super().configure(**kwargs)
         rconfig = configparser.RawConfigParser()
         rconfig.read(self.conf_file)
         if not rconfig.has_section('rbac'):
index 548e774..36f377c 100644 (file)
@@ -74,7 +74,7 @@ class RallyBase(singlevm.VmReady2):
 
     def __init__(self, **kwargs):
         """Initialize RallyBase object."""
-        super(RallyBase, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         assert self.orig_cloud
         assert self.project
         if self.orig_cloud.get_role("admin"):
@@ -174,10 +174,10 @@ class RallyBase(singlevm.VmReady2):
         cmd = ("rally deployment list | awk '/" +
                getattr(config.CONF, 'rally_deployment_name') +
                "/ {print $2}'")
-        proc = subprocess.Popen(cmd, shell=True,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.STDOUT)
-        deployment_uuid = proc.stdout.readline().rstrip()
+        with subprocess.Popen(
+                cmd, shell=True, stdout=subprocess.PIPE,
+                stderr=subprocess.STDOUT) as proc:
+            deployment_uuid = proc.stdout.readline().rstrip()
         return deployment_uuid.decode("utf-8")
 
     @staticmethod
@@ -362,31 +362,25 @@ class RallyBase(singlevm.VmReady2):
     def apply_blacklist(self, case_file_name, result_file_name):
         """Apply blacklist."""
         LOGGER.debug("Applying blacklist...")
-        cases_file = open(case_file_name, 'r')
-        result_file = open(result_file_name, 'w')
-
-        black_tests = list(set(self.excl_func() +
-                               self.excl_scenario()))
-
-        if black_tests:
-            LOGGER.debug("Blacklisted tests: %s", str(black_tests))
-
-        include = True
-        for cases_line in cases_file:
-            if include:
-                for black_tests_line in black_tests:
-                    if re.search(black_tests_line,
-                                 cases_line.strip().rstrip(':')):
-                        include = False
-                        break
+        with open(case_file_name, 'r') as cases_file, open(
+                result_file_name, 'w') as result_file:
+            black_tests = list(set(self.excl_func() + self.excl_scenario()))
+            if black_tests:
+                LOGGER.debug("Blacklisted tests: %s", str(black_tests))
+
+            include = True
+            for cases_line in cases_file:
+                if include:
+                    for black_tests_line in black_tests:
+                        if re.search(black_tests_line,
+                                     cases_line.strip().rstrip(':')):
+                            include = False
+                            break
+                    else:
+                        result_file.write(str(cases_line))
                 else:
-                    result_file.write(str(cases_line))
-            else:
-                if cases_line.isspace():
-                    include = True
-
-        cases_file.close()
-        result_file.close()
+                    if cases_line.isspace():
+                        include = True
 
     @staticmethod
     def file_is_empty(file_name):
@@ -422,7 +416,8 @@ class RallyBase(singlevm.VmReady2):
         output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
         LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
 
-        json_results = open(report_json_dir).read()
+        with open(report_json_dir) as json_file:
+            json_results = json_file.read()
         self._append_summary(json_results, test_name)
 
         # parse JSON operation result
@@ -648,7 +643,7 @@ class RallyBase(singlevm.VmReady2):
         self.clean_rally_logs()
         if self.flavor_alt:
             self.orig_cloud.delete_flavor(self.flavor_alt.id)
-        super(RallyBase, self).clean()
+        super().clean()
 
     def is_successful(self):
         """The overall result of the test."""
@@ -656,7 +651,7 @@ class RallyBase(singlevm.VmReady2):
             if item['task_status'] is False:
                 return testcase.TestCase.EX_TESTCASE_FAILED
 
-        return super(RallyBase, self).is_successful()
+        return super().is_successful()
 
     @staticmethod
     def update_rally_logs(res_dir, rally_conf='/etc/rally/rally.conf'):
@@ -692,7 +687,7 @@ class RallyBase(singlevm.VmReady2):
         """Run testcase."""
         self.start_time = time.time()
         try:
-            assert super(RallyBase, self).run(
+            assert super().run(
                 **kwargs) == testcase.TestCase.EX_OK
             self.update_rally_logs(self.res_dir)
             self.create_rally_deployment(environ=self.project.get_environ())
@@ -720,7 +715,7 @@ class RallySanity(RallyBase):
         """Initialize RallySanity object."""
         if "case_name" not in kwargs:
             kwargs["case_name"] = "rally_sanity"
-        super(RallySanity, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.smoke = True
         self.scenario_dir = os.path.join(self.rally_scenario_dir, 'sanity')
 
@@ -734,7 +729,7 @@ class RallyFull(RallyBase):
         """Initialize RallyFull object."""
         if "case_name" not in kwargs:
             kwargs["case_name"] = "rally_full"
-        super(RallyFull, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.smoke = False
         self.scenario_dir = os.path.join(self.rally_scenario_dir, 'full')
 
@@ -749,13 +744,13 @@ class RallyJobs(RallyBase):
         """Initialize RallyJobs object."""
         if "case_name" not in kwargs:
             kwargs["case_name"] = "rally_jobs"
-        super(RallyJobs, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         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)
+        super().prepare_run(**kwargs)
         with open(os.path.join(self.rally_dir,
                                'rally_jobs.yaml'), 'r') as task_file:
             self.task_yaml = yaml.safe_load(task_file)
index 80d3f45..7d99220 100644 (file)
@@ -47,7 +47,7 @@ class Shaker(singlevm.SingleVm2):
     check_console_loop = 12
 
     def __init__(self, **kwargs):
-        super(Shaker, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.role = None
 
     def check_requirements(self):
@@ -57,7 +57,7 @@ class Shaker(singlevm.SingleVm2):
             self.project.clean()
 
     def prepare(self):
-        super(Shaker, self).prepare()
+        super().prepare()
         self.cloud.create_security_group_rule(
             self.sec.id, port_range_min=self.port, port_range_max=self.port,
             protocol='tcp', direction='ingress')
@@ -142,6 +142,6 @@ class Shaker(singlevm.SingleVm2):
         return stdout.channel.recv_exit_status()
 
     def clean(self):
-        super(Shaker, self).clean()
+        super().clean()
         if self.role:
             self.orig_cloud.delete_role(self.role.id)
index 60c117d..6022401 100644 (file)
@@ -57,7 +57,7 @@ class TempestCommon(singlevm.VmReady2):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'tempest'
-        super(TempestCommon, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         assert self.orig_cloud
         assert self.cloud
         assert self.project
@@ -142,22 +142,22 @@ class TempestCommon(singlevm.VmReady2):
         }
         cmd = ["rally", "verify", "show", "--uuid", verif_id]
         LOGGER.info("Showing result for a verification: '%s'.", cmd)
-        proc = subprocess.Popen(cmd,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.STDOUT)
-        for line in proc.stdout:
-            LOGGER.info(line.decode("utf-8").rstrip())
-            new_line = line.decode("utf-8").replace(' ', '').split('|')
-            if 'Tests' in new_line:
-                break
-            if 'Testscount' in new_line:
-                result['num_tests'] = int(new_line[2])
-            elif 'Success' in new_line:
-                result['num_success'] = int(new_line[2])
-            elif 'Skipped' in new_line:
-                result['num_skipped'] = int(new_line[2])
-            elif 'Failures' in new_line:
-                result['num_failures'] = int(new_line[2])
+        with subprocess.Popen(
+                cmd, stdout=subprocess.PIPE,
+                stderr=subprocess.STDOUT) as proc:
+            for line in proc.stdout:
+                LOGGER.info(line.decode("utf-8").rstrip())
+                new_line = line.decode("utf-8").replace(' ', '').split('|')
+                if 'Tests' in new_line:
+                    break
+                if 'Testscount' in new_line:
+                    result['num_tests'] = int(new_line[2])
+                elif 'Success' in new_line:
+                    result['num_success'] = int(new_line[2])
+                elif 'Skipped' in new_line:
+                    result['num_skipped'] = int(new_line[2])
+                elif 'Failures' in new_line:
+                    result['num_failures'] = int(new_line[2])
         return result
 
     @staticmethod
@@ -199,10 +199,10 @@ class TempestCommon(singlevm.VmReady2):
         cmd = ("rally verify list-verifiers | awk '/" +
                getattr(config.CONF, 'tempest_verifier_name') +
                "/ {print $2}'")
-        proc = subprocess.Popen(cmd, shell=True,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.DEVNULL)
-        verifier_uuid = proc.stdout.readline().rstrip()
+        with subprocess.Popen(
+                cmd, shell=True, stdout=subprocess.PIPE,
+                stderr=subprocess.DEVNULL) as proc:
+            verifier_uuid = proc.stdout.readline().rstrip()
         return verifier_uuid.decode("utf-8")
 
     @staticmethod
@@ -342,32 +342,31 @@ class TempestCommon(singlevm.VmReady2):
             os.remove(self.raw_list)
         os.rename(self.list, self.raw_list)
         cases_file = self.read_file(self.raw_list)
-        result_file = open(self.list, 'w')
-        black_tests = []
-        try:
-            deploy_scenario = env.get('DEPLOY_SCENARIO')
-            if bool(deploy_scenario):
-                # if DEPLOY_SCENARIO is set we read the file
-                black_list_file = open(black_list)
-                black_list_yaml = yaml.safe_load(black_list_file)
-                black_list_file.close()
-                for item in black_list_yaml:
-                    scenarios = item['scenarios']
-                    in_it = rally.RallyBase.in_iterable_re
-                    if in_it(deploy_scenario, scenarios):
-                        tests = item['tests']
-                        black_tests.extend(tests)
-        except Exception:  # pylint: disable=broad-except
+        with open(self.list, 'w') as result_file:
             black_tests = []
-            LOGGER.debug("Tempest blacklist file does not exist.")
+            try:
+                deploy_scenario = env.get('DEPLOY_SCENARIO')
+                if bool(deploy_scenario):
+                    # if DEPLOY_SCENARIO is set we read the file
+                    with open(black_list) as black_list_file:
+                        black_list_yaml = yaml.safe_load(black_list_file)
+                        black_list_file.close()
+                        for item in black_list_yaml:
+                            scenarios = item['scenarios']
+                            in_it = rally.RallyBase.in_iterable_re
+                            if in_it(deploy_scenario, scenarios):
+                                tests = item['tests']
+                                black_tests.extend(tests)
+            except Exception:  # pylint: disable=broad-except
+                black_tests = []
+                LOGGER.debug("Tempest blacklist file does not exist.")
 
-        for cases_line in cases_file:
-            for black_tests_line in black_tests:
-                if re.search(black_tests_line, cases_line):
-                    break
-            else:
-                result_file.write(str(cases_line) + '\n')
-        result_file.close()
+            for cases_line in cases_file:
+                for black_tests_line in black_tests:
+                    if re.search(black_tests_line, cases_line):
+                        break
+                else:
+                    result_file.write(str(cases_line) + '\n')
 
     def run_verifier_tests(self, **kwargs):
         """Execute tempest test cases."""
@@ -376,25 +375,24 @@ class TempestCommon(singlevm.VmReady2):
         cmd.extend(kwargs.get('option', []))
         LOGGER.info("Starting Tempest test suite: '%s'.", cmd)
 
-        f_stdout = open(
-            os.path.join(self.res_dir, "tempest.log"), 'w+')
-
-        proc = subprocess.Popen(
-            cmd,
-            stdout=subprocess.PIPE,
-            stderr=subprocess.STDOUT,
-            bufsize=1)
-
-        with proc.stdout:
-            for line in iter(proc.stdout.readline, b''):
-                if re.search(r"\} tempest\.", line.decode("utf-8")):
-                    LOGGER.info(line.rstrip())
-                elif re.search(r'(?=\(UUID=(.*)\))', line.decode("utf-8")):
-                    self.verification_id = re.search(
-                        r'(?=\(UUID=(.*)\))', line.decode("utf-8")).group(1)
-                f_stdout.write(line.decode("utf-8"))
-        proc.wait()
-        f_stdout.close()
+        with open(
+                os.path.join(self.res_dir, "tempest.log"), 'w+') as f_stdout:
+
+            with subprocess.Popen(
+                    cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+                    bufsize=1) as proc:
+
+                with proc.stdout:
+                    for line in iter(proc.stdout.readline, b''):
+                        if re.search(r"\} tempest\.", line.decode("utf-8")):
+                            LOGGER.info(line.rstrip())
+                        elif re.search(r'(?=\(UUID=(.*)\))',
+                                       line.decode("utf-8")):
+                            self.verification_id = re.search(
+                                r'(?=\(UUID=(.*)\))',
+                                line.decode("utf-8")).group(1)
+                        f_stdout.write(line.decode("utf-8"))
+                    proc.wait()
 
         if self.verification_id is None:
             raise Exception('Verification UUID not found')
@@ -643,7 +641,7 @@ class TempestCommon(singlevm.VmReady2):
     def run(self, **kwargs):
         self.start_time = time.time()
         try:
-            assert super(TempestCommon, self).run(
+            assert super().run(
                 **kwargs) == testcase.TestCase.EX_OK
             if not os.path.exists(self.res_dir):
                 os.makedirs(self.res_dir)
@@ -683,7 +681,7 @@ class TempestCommon(singlevm.VmReady2):
             self.cloud.delete_image(self.image_alt)
         if self.flavor_alt:
             self.orig_cloud.delete_flavor(self.flavor_alt.id)
-        super(TempestCommon, self).clean()
+        super().clean()
 
     def is_successful(self):
         """The overall result of the test."""
@@ -693,7 +691,7 @@ class TempestCommon(singlevm.VmReady2):
         if self.tests_count and (
                 self.details.get("tests_number", 0) != self.tests_count):
             return testcase.TestCase.EX_TESTCASE_FAILED
-        return super(TempestCommon, self).is_successful()
+        return super().is_successful()
 
 
 class TempestHeat(TempestCommon):
@@ -706,7 +704,7 @@ class TempestHeat(TempestCommon):
     flavor_alt_disk = 4
 
     def __init__(self, **kwargs):
-        super(TempestHeat, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.user2 = self.orig_cloud.create_user(
             name='{}-user2_{}'.format(self.case_name, self.project.guid),
             password=self.project.password,
@@ -723,7 +721,7 @@ class TempestHeat(TempestCommon):
 
     def configure(self, **kwargs):
         assert self.user2
-        super(TempestHeat, self).configure(**kwargs)
+        super().configure(**kwargs)
         rconfig = configparser.RawConfigParser()
         rconfig.read(self.conf_file)
         if not rconfig.has_section('heat_plugin'):
@@ -774,6 +772,6 @@ class TempestHeat(TempestCommon):
         """
         Cleanup all OpenStack objects. Should be called on completion.
         """
-        super(TempestHeat, self).clean()
+        super().clean()
         if self.user2:
             self.orig_cloud.delete_user(self.user2.id)
index 1686489..b0e6ff4 100644 (file)
@@ -56,7 +56,7 @@ class Vmtp(singlevm.VmReady2):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = 'vmtp'
-        super(Vmtp, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.config = "{}/vmtp.conf".format(self.res_dir)
         (_, self.privkey_filename) = tempfile.mkstemp()
         (_, self.pubkey_filename) = tempfile.mkstemp()
@@ -173,7 +173,7 @@ class Vmtp(singlevm.VmReady2):
         status = testcase.TestCase.EX_RUN_ERROR
         try:
             assert self.cloud
-            assert super(Vmtp, self).run(**kwargs) == self.EX_OK
+            assert super().run(**kwargs) == self.EX_OK
             status = testcase.TestCase.EX_RUN_ERROR
             if self.orig_cloud.get_role("admin"):
                 role_name = "admin"
@@ -204,7 +204,7 @@ class Vmtp(singlevm.VmReady2):
     def clean(self):
         try:
             assert self.cloud
-            super(Vmtp, self).clean()
+            super().clean()
             os.remove(self.privkey_filename)
             os.remove(self.pubkey_filename)
             self.cloud.delete_network("pns-internal-net_{}".format(self.guid))
index a7bbfc2..2eb040b 100644 (file)
@@ -29,11 +29,11 @@ class VPingSSH(singlevm.SingleVm2):
         """Initialize testcase."""
         if "case_name" not in kwargs:
             kwargs["case_name"] = "vping_ssh"
-        super(VPingSSH, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.vm2 = None
 
     def prepare(self):
-        super(VPingSSH, self).prepare()
+        super().prepare()
         self.vm2 = self.boot_vm(
             '{}-vm2_{}'.format(self.case_name, self.guid),
             security_groups=[self.sec.id])
@@ -60,4 +60,4 @@ class VPingSSH(singlevm.SingleVm2):
             self.cloud.delete_server(
                 self.vm2, wait=True,
                 timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
-        super(VPingSSH, self).clean()
+        super().clean()
index 9010895..5b2308e 100644 (file)
@@ -26,7 +26,7 @@ class VPingUserdata(singlevm.VmReady2):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = "vping_userdata"
-        super(VPingUserdata, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.logger = logging.getLogger(__name__)
         self.vm1 = None
         self.vm2 = None
@@ -39,7 +39,7 @@ class VPingUserdata(singlevm.VmReady2):
         """
         try:
             assert self.cloud
-            assert super(VPingUserdata, self).run(
+            assert super().run(
                 **kwargs) == testcase.TestCase.EX_OK
             self.result = 0
             self.vm1 = self.boot_vm()
@@ -134,4 +134,4 @@ class VPingUserdata(singlevm.VmReady2):
             self.cloud.delete_server(
                 self.vm2, wait=True,
                 timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
-        super(VPingUserdata, self).clean()
+        super().clean()
index b54f0f5..b8c56b1 100644 (file)
@@ -49,7 +49,7 @@ class ODLTests(robotframework.RobotFramework):
     __logger = logging.getLogger(__name__)
 
     def __init__(self, **kwargs):
-        super(ODLTests, self).__init__(**kwargs)
+        super().__init__(**kwargs)
         self.res_dir = os.path.join(
             getattr(config.CONF, 'dir_results'), 'odl')
         self.xml_file = os.path.join(self.res_dir, 'output.xml')
@@ -135,7 +135,7 @@ class ODLTests(robotframework.RobotFramework):
         else:
             if not self.set_robotframework_vars(odlusername, odlpassword):
                 return self.EX_RUN_ERROR
-        return super(ODLTests, self).run(variable=variable, suites=suites)
+        return super().run(variable=variable, suites=suites)
 
     def run(self, **kwargs):
         """Run suites in OPNFV environment
index 5049bd0..f5557f5 100644 (file)
@@ -83,7 +83,7 @@ class JujuEpc(singlevm.SingleVm2):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = "juju_epc"
-        super(JujuEpc, self).__init__(**kwargs)
+        super().__init__(**kwargs)
 
         # Retrieve the configuration
         self.case_dir = pkg_resources.resource_filename(
@@ -91,8 +91,8 @@ class JujuEpc(singlevm.SingleVm2):
         try:
             self.config = getattr(
                 config.CONF, 'vnf_{}_config'.format(self.case_name))
-        except Exception:
-            raise Exception("VNF config file not found")
+        except Exception as exc:
+            raise Exception("VNF config file not found") from exc
         self.config_file = os.path.join(self.case_dir, self.config)
         self.orchestrator = dict(
             requirements=functest_utils.get_parameter_from_yaml(
@@ -212,7 +212,7 @@ class JujuEpc(singlevm.SingleVm2):
         return not stdout.channel.recv_exit_status()
 
     def publish_image_alt(self, name=None):
-        image_alt = super(JujuEpc, self).publish_image_alt(name)
+        image_alt = super().publish_image_alt(name)
         region_name = self.cloud.region_name if self.cloud.region_name else (
             'RegionOne')
         (_, stdout, stderr) = self.ssh.exec_command(
@@ -375,7 +375,7 @@ class JujuEpc(singlevm.SingleVm2):
         except OSError as ex:
             if ex.errno != errno.EEXIST:
                 self.__logger.exception("Cannot create %s", self.res_dir)
-                raise Exception
+                raise Exception from ex
         self.__logger.info("ENV:\n%s", env.string())
         try:
             assert self._install_juju()
@@ -407,7 +407,7 @@ class JujuEpc(singlevm.SingleVm2):
             self.cloud.delete_image(self.image_alt)
         if self.flavor_alt:
             self.orig_cloud.delete_flavor(self.flavor_alt.id)
-        super(JujuEpc, self).clean()
+        super().clean()
 
 
 def sig_test_format(sig_test):
index d937cc0..4428990 100644 (file)
@@ -53,14 +53,14 @@ class CloudifyIms(cloudify.Cloudify):
         """Initialize CloudifyIms testcase object."""
         if "case_name" not in kwargs:
             kwargs["case_name"] = "cloudify_ims"
-        super(CloudifyIms, self).__init__(**kwargs)
+        super().__init__(**kwargs)
 
         # Retrieve the configuration
         try:
             self.config = getattr(
                 config.CONF, 'vnf_{}_config'.format(self.case_name))
-        except Exception:
-            raise Exception("VNF config file not found")
+        except Exception as exc:
+            raise Exception("VNF config file not found") from exc
 
         self.case_dir = pkg_resources.resource_filename(
             'functest', 'opnfv_tests/vnf/ims')
@@ -114,7 +114,7 @@ class CloudifyIms(cloudify.Cloudify):
 
         network, security group, fip, VM creation
         """
-        assert super(CloudifyIms, self).execute() == 0
+        assert super().execute() == 0
         start_time = time.time()
         self.orig_cloud.set_network_quotas(
             self.project.project.name,
@@ -259,4 +259,4 @@ class CloudifyIms(cloudify.Cloudify):
             self.cloud.delete_image(self.image_alt)
         if self.flavor_alt:
             self.orig_cloud.delete_flavor(self.flavor_alt.id)
-        super(CloudifyIms, self).clean()
+        super().clean()
index 4edb2dd..60478ad 100644 (file)
@@ -57,14 +57,14 @@ class HeatIms(singlevm.VmReady2):
         """Initialize HeatIms testcase object."""
         if "case_name" not in kwargs:
             kwargs["case_name"] = "heat_ims"
-        super(HeatIms, self).__init__(**kwargs)
+        super().__init__(**kwargs)
 
         # Retrieve the configuration
         try:
             self.config = getattr(
                 config.CONF, 'vnf_{}_config'.format(self.case_name))
-        except Exception:
-            raise Exception("VNF config file not found")
+        except Exception as exc:
+            raise Exception("VNF config file not found") from exc
 
         self.case_dir = pkg_resources.resource_filename(
             'functest', 'opnfv_tests/vnf/ims')
@@ -137,7 +137,7 @@ class HeatIms(singlevm.VmReady2):
         status = testcase.TestCase.EX_RUN_ERROR
         try:
             assert self.cloud
-            assert super(HeatIms, self).run(
+            assert super().run(
                 **kwargs) == testcase.TestCase.EX_OK
             self.result = 0
             if not self.execute():
@@ -247,6 +247,6 @@ class HeatIms(singlevm.VmReady2):
             pass
         except Exception:  # pylint: disable=broad-except
             self.__logger.exception("Cannot clean stack ressources")
-        super(HeatIms, self).clean()
+        super().clean()
         if self.role:
             self.orig_cloud.delete_role(self.role.id)
index 82f57ca..93779f4 100644 (file)
@@ -51,14 +51,14 @@ class CloudifyVrouter(cloudify.Cloudify):
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
             kwargs["case_name"] = "vyos_vrouter"
-        super(CloudifyVrouter, self).__init__(**kwargs)
+        super().__init__(**kwargs)
 
         # Retrieve the configuration
         try:
             self.config = getattr(
                 config.CONF, 'vnf_{}_config'.format(self.case_name))
-        except Exception:
-            raise Exception("VNF config file not found")
+        except Exception as exc:
+            raise Exception("VNF config file not found") from exc
 
         self.case_dir = pkg_resources.resource_filename(
             'functest', 'opnfv_tests/vnf/router')
@@ -127,7 +127,7 @@ class CloudifyVrouter(cloudify.Cloudify):
         network, security group, fip, VM creation
         """
         # network creation
-        super(CloudifyVrouter, self).execute()
+        super().execute()
         start_time = time.time()
         self.put_private_key()
         self.upload_cfy_plugins(self.cop_yaml, self.cop_wgn)
@@ -231,4 +231,4 @@ class CloudifyVrouter(cloudify.Cloudify):
             self.cloud.delete_image(self.image_alt)
         if self.flavor_alt:
             self.orig_cloud.delete_flavor(self.flavor_alt.id)
-        super(CloudifyVrouter, self).clean()
+        super().clean()
index 0a56913..7c532d9 100644 (file)
@@ -32,13 +32,12 @@ class FunctionTestExec():
         credentials = util_info["credentials"]
         self.vnf_ctrl = VnfController(util_info)
 
-        test_cmd_map_file = open(
-            os.path.join(
-                self.util.vnf_data_dir, self.util.command_template_dir,
-                self.util.test_cmd_map_yaml_file),
-            'r')
-        self.test_cmd_map_yaml = yaml.safe_load(test_cmd_map_file)
-        test_cmd_map_file.close()
+        with open(
+                os.path.join(
+                    self.util.vnf_data_dir, self.util.command_template_dir,
+                    self.util.test_cmd_map_yaml_file),
+                'r') as test_cmd_map_file:
+            self.test_cmd_map_yaml = yaml.safe_load(test_cmd_map_file)
 
         self.util.set_credentials(credentials["cloud"])
 
index 2db3b38..7339573 100644 (file)
@@ -212,24 +212,21 @@ class Utilvnf():  # pylint: disable=too-many-instance-attributes
     def write_result_data(self, result_data):
         test_result = []
         if not os.path.isfile(self.test_result_json_file):
-            file_fd = open(self.test_result_json_file, "w")
-            file_fd.close()
+            with open(self.test_result_json_file, "w") as file_fd:
+                pass
         else:
-            file_fd = open(self.test_result_json_file, "r")
-            test_result = json.load(file_fd)
-            file_fd.close()
+            with open(self.test_result_json_file, "r") as file_fd:
+                test_result = json.load(file_fd)
 
         test_result.append(result_data)
 
-        file_fd = open(self.test_result_json_file, "w")
-        json.dump(test_result, file_fd)
-        file_fd.close()
+        with open(self.test_result_json_file, "w") as file_fd:
+            json.dump(test_result, file_fd)
 
     def output_test_result_json(self):
         if os.path.isfile(self.test_result_json_file):
-            file_fd = open(self.test_result_json_file, "r")
-            test_result = json.load(file_fd)
-            file_fd.close()
+            with open(self.test_result_json_file, "r") as file_fd:
+                test_result = json.load(file_fd)
             output_json_data = json.dumps(test_result,
                                           sort_keys=True,
                                           indent=4)
@@ -239,8 +236,6 @@ class Utilvnf():  # pylint: disable=too-many-instance-attributes
 
     @staticmethod
     def get_test_scenario(file_path):
-        test_scenario_file = open(file_path,
-                                  'r')
-        test_scenario_yaml = yaml.safe_load(test_scenario_file)
-        test_scenario_file.close()
+        with open(file_path, 'r') as test_scenario_file:
+            test_scenario_yaml = yaml.safe_load(test_scenario_file)
         return test_scenario_yaml["test_scenario_list"]
index b159ddd..db276cf 100644 (file)
@@ -101,10 +101,8 @@ class VmController():
 
     def command_create_and_execute(self, ssh, test_cmd_file_path,
                                    cmd_input_param, prompt_file_path):
-        prompt_file = open(prompt_file_path,
-                           'r')
-        prompt = yaml.safe_load(prompt_file)
-        prompt_file.close()
+        with open(prompt_file_path, 'r') as prompt_file:
+            prompt = yaml.safe_load(prompt_file)
         config_mode_prompt = prompt["config_mode"]
 
         commands = self.command_gen_from_template(test_cmd_file_path,
index 7ed287c..4ab3947 100644 (file)
@@ -49,10 +49,8 @@ class VnfController():
     def config_vnf(self, source_vnf, destination_vnf, test_cmd_file_path,
                    parameter_file_path, prompt_file_path):
         # pylint: disable=too-many-arguments
-        parameter_file = open(parameter_file_path,
-                              'r')
-        cmd_input_param = yaml.safe_load(parameter_file)
-        parameter_file.close()
+        with open(parameter_file_path, 'r') as parameter_file:
+            cmd_input_param = yaml.safe_load(parameter_file)
 
         cmd_input_param["macaddress"] = source_vnf["data_plane_network_mac"]
         cmd_input_param["source_ip"] = source_vnf["data_plane_network_ip"]
@@ -71,19 +69,15 @@ class VnfController():
 
         res_dict_data_list = []
 
-        parameter_file = open(parameter_file_path,
-                              'r')
-        cmd_input_param = yaml.safe_load(parameter_file)
-        parameter_file.close()
+        with open(parameter_file_path, 'r') as parameter_file:
+            cmd_input_param = yaml.safe_load(parameter_file)
 
         cmd_input_param["source_ip"] = target_vnf["data_plane_network_ip"]
         cmd_input_param["destination_ip"] = reference_vnf[
             "data_plane_network_ip"]
 
-        prompt_file = open(prompt_file_path,
-                           'r')
-        prompt = yaml.safe_load(prompt_file)
-        prompt_file.close()
+        with open(prompt_file_path, 'r') as prompt_file:
+            prompt = yaml.safe_load(prompt_file)
         terminal_mode_prompt = prompt["terminal_mode"]
 
         ssh = SshClient(target_vnf["floating_ip"],
index 1b2e10b..24ac045 100644 (file)
@@ -541,7 +541,7 @@ class ODLArgParserTesting(ODLTesting):
 
     def setUp(self):
         self.parser = odl.ODLParser()
-        super(ODLArgParserTesting, self).setUp()
+        super().setUp()
 
     def test_default(self):
         self.assertEqual(self.parser.parse_args(), self.defaultargs)
index 6ff404a..e27b52e 100644 (file)
@@ -269,10 +269,9 @@ class OSTempestTesting(unittest.TestCase):
 
         with mock.patch('functest.opnfv_tests.openstack.tempest.'
                         'tempest.subprocess.Popen') as mock_popen:
-            mock_stdout = mock.Mock()
-            attrs = {'stdout.readline.return_value': b'test_deploy_id'}
-            mock_stdout.configure_mock(**attrs)
-            mock_popen.return_value = mock_stdout
+            attrs = {'return_value.__enter__.return_value.'
+                     'stdout.readline.return_value': b'test_deploy_id'}
+            mock_popen.configure_mock(**attrs)
 
             self.assertEqual(self.tempestcommon.get_verifier_id(),
                              'test_deploy_id')
@@ -281,10 +280,9 @@ class OSTempestTesting(unittest.TestCase):
         setattr(config.CONF, 'tempest_verifier_name', 'test_deploy_name')
         with mock.patch('functest.opnfv_tests.openstack.tempest.'
                         'tempest.subprocess.Popen') as mock_popen:
-            mock_stdout = mock.Mock()
-            attrs = {'stdout.readline.return_value': b'test_deploy_id'}
-            mock_stdout.configure_mock(**attrs)
-            mock_popen.return_value = mock_stdout
+            attrs = {'return_value.__enter__.return_value.'
+                     'stdout.readline.return_value': b'test_deploy_id'}
+            mock_popen.configure_mock(**attrs)
 
             self.assertEqual(rally.RallyBase.get_verifier_deployment_id(),
                              'test_deploy_id')
index fcbb0c4..c1ad30a 100644 (file)
@@ -74,7 +74,6 @@ class VmtpTesting(unittest.TestCase):
 
     @mock.patch('six.moves.builtins.open')
     def test_generate_keys2(self, *args):
-        # pylint: disable=bad-continuation
         with mock.patch.object(
                 self.testcase.cloud, "create_keypair",
                 side_effect=shade.OpenStackCloudException(None)) as mock_obj, \
index b22670f..1fab8f1 100644 (file)
@@ -100,10 +100,10 @@ class FunctestUtilsTesting(unittest.TestCase):
                            mock.mock_open()) as mopen:
             stream = six.BytesIO()
             stream.write(self.cmd_readline().encode("utf-8"))
-            mock_obj2 = mock.Mock()
-            attrs = {'stdout': stream, 'wait.return_value': 1}
-            mock_obj2.configure_mock(**attrs)
-            mock_subproc_open.return_value = mock_obj2
+            attrs = {
+                'return_value.__enter__.return_value.stdout': stream,
+                'return_value.__enter__.return_value.wait.return_value': 1}
+            mock_subproc_open.configure_mock(**attrs)
             resp = functest_utils.execute_command(
                 self.cmd, info=True, error_msg=self.error_msg, verbose=True,
                 output_file=self.output_file)
@@ -121,10 +121,10 @@ class FunctestUtilsTesting(unittest.TestCase):
                            mock.mock_open()) as mopen:
             stream = six.BytesIO()
             stream.write(self.cmd_readline().encode("utf-8"))
-            mock_obj2 = mock.Mock()
-            attrs = {'stdout': stream, 'wait.return_value': 0}
-            mock_obj2.configure_mock(**attrs)
-            mock_subproc_open.return_value = mock_obj2
+            attrs = {
+                'return_value.__enter__.return_value.stdout': stream,
+                'return_value.__enter__.return_value.wait.return_value': 0}
+            mock_subproc_open.configure_mock(**attrs)
             resp = functest_utils.execute_command(
                 self.cmd, info=True, error_msg=self.error_msg, verbose=True,
                 output_file=self.output_file)
@@ -140,10 +140,10 @@ class FunctestUtilsTesting(unittest.TestCase):
                 as mock_subproc_open:
             stream = six.BytesIO()
             stream.write(self.cmd_readline().encode("utf-8"))
-            mock_obj2 = mock.Mock()
-            attrs = {'stdout': stream, 'wait.return_value': 0}
-            mock_obj2.configure_mock(**attrs)
-            mock_subproc_open.return_value = mock_obj2
+            attrs = {
+                'return_value.__enter__.return_value.stdout': stream,
+                'return_value.__enter__.return_value.wait.return_value': 0}
+            mock_subproc_open.configure_mock(**attrs)
             resp = functest_utils.execute_command(
                 self.cmd, info=False, error_msg="", verbose=False,
                 output_file=None)
@@ -154,12 +154,13 @@ class FunctestUtilsTesting(unittest.TestCase):
         # pylint: disable=unused-argument
         with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
                 as mock_subproc_open:
+            attrs = {}
             stream = six.BytesIO()
             stream.write(self.cmd_readline().encode("utf-8"))
-            mock_obj2 = mock.Mock()
-            attrs = {'stdout': stream, 'wait.return_value': 1}
-            mock_obj2.configure_mock(**attrs)
-            mock_subproc_open.return_value = mock_obj2
+            attrs = {
+                'return_value.__enter__.return_value.stdout': stream,
+                'return_value.__enter__.return_value.wait.return_value': 1}
+            mock_subproc_open.configure_mock(**attrs)
             resp = functest_utils.execute_command(
                 self.cmd, info=False, error_msg="", verbose=False,
                 output_file=None)
index c2897d3..3226b2d 100644 (file)
@@ -13,12 +13,12 @@ from functest.utils import env
 class Config():
     def __init__(self):
         try:
-            # pylint: disable=bad-continuation
             with open(pkg_resources.resource_filename(
                     'functest', 'ci/config_functest.yaml')) as yfile:
                 self.functest_yaml = yaml.safe_load(yfile)
         except Exception as error:
-            raise Exception('Parse config failed: {}'.format(str(error)))
+            raise Exception(
+                'Parse config failed: {}'.format(str(error))) from error
 
     @staticmethod
     def _merge_dicts(dict1, dict2):
@@ -59,7 +59,8 @@ class Config():
         try:
             self._parse(None, self.functest_yaml)
         except Exception as error:
-            raise Exception('Parse config failed: {}'.format(str(error)))
+            raise Exception(
+                'Parse config failed: {}'.format(str(error))) from error
 
 
 CONF = Config()
index 9a5cd41..31e4535 100644 (file)
@@ -39,21 +39,19 @@ def execute_command(cmd, info=False, error_msg="",
             LOGGER.info(msg_exec)
         else:
             LOGGER.debug(msg_exec)
-    popen = subprocess.Popen(
-        cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    if output_file:
-        ofd = open(output_file, "w")
-    for line in iter(popen.stdout.readline, b''):
+    with subprocess.Popen(
+            cmd, shell=True, stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT) as popen:
         if output_file:
-            ofd.write(line.decode("utf-8"))
-        else:
-            line = line.decode("utf-8").replace('\n', '')
-            print(line)
-            sys.stdout.flush()
-    if output_file:
-        ofd.close()
-    popen.stdout.close()
-    returncode = popen.wait()
+            with open(output_file, "w") as ofd:
+                for line in iter(popen.stdout.readline, b''):
+                    if output_file:
+                        ofd.write(line.decode("utf-8"))
+                    else:
+                        line = line.decode("utf-8").replace('\n', '')
+                        print(line)
+                        sys.stdout.flush()
+        returncode = popen.wait()
     if returncode != 0:
         if verbose:
             LOGGER.error(error_msg)
diff --git a/tox.ini b/tox.ini
index c6d7a4a..c52fad1 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = docs,pep8,pylint,yamllint,ansiblelint,bashate,bandit,py38,cover,perm
+envlist = docs,pep8,pylint,yamllint,ansiblelint,bashate,bandit,py39,cover,perm
 
 [testenv]
 pip_version = pip==20.2.4
@@ -19,7 +19,7 @@ commands = nosetests --with-xunit \
   functest/tests/unit
 
 [testenv:docs]
-basepython = python3.8
+basepython = python3.9
 commands =
   doc8 \
     --ignore-path api/build \
@@ -33,18 +33,18 @@ commands =
   sphinx-build -W -b spelling -Dextensions=sphinxcontrib.spelling docs docs/build/spellcheck
 
 [testenv:pep8]
-basepython = python3.8
+basepython = python3.9
 commands = flake8
 
 [testenv:pylint]
-basepython = python3.8
+basepython = python3.9
 commands =
   pylint \
-    --ignore-imports=y --min-similarity-lines=10 \
+    --ignore-imports=y --min-similarity-lines=15 \
     --disable=locally-disabled functest
 
 [testenv:yamllint]
-basepython = python3.8
+basepython = python3.9
 files =
   .travis.yml
   docker
@@ -58,7 +58,7 @@ commands =
   yamllint -s {[testenv:yamllint]files}
 
 [testenv:ansiblelint]
-basepython = python3.8
+basepython = python3.9
 commands =
   ansible-lint -x303 ansible/site.yml
 
@@ -66,7 +66,7 @@ commands =
 commands = nosetests functest/tests/unit
 
 [testenv:bashate]
-basepython = python3.8
+basepython = python3.9
 files =
   functest/opnfv_tests/openstack/cinder/write_data.sh
   functest/opnfv_tests/openstack/cinder/read_data.sh
@@ -78,11 +78,11 @@ commands = bashate -e E005,E006,E042,E043 {[testenv:bashate]files}
 
 
 [testenv:bandit]
-basepython = python3.8
+basepython = python3.9
 commands = bandit -r functest -x tests -n 5 -ll -s B601,B602
 
 [testenv:cover]
-basepython = python3.8
+basepython = python3.9
 dirs =
   functest/tests/unit/odl
   functest/tests/unit/openstack/vping
@@ -95,7 +95,7 @@ commands = nosetests --with-coverage --cover-tests \
   --cover-min-percentage 100 {[testenv:cover]dirs}
 
 [testenv:perm]
-basepython = python3.8
+basepython = python3.9
 whitelist_externals = bash
 path=. -not -path './.tox/*' -not -path './.git/*' -not -path './docs/com/pres/reveal.js/*'
 commands =