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