ARG BRANCH=stable/iruya
ARG OPENSTACK_TAG=stable/stein
ARG TEMPEST_TAG=21.0.0
-ARG VMTP_TAG=2.5.0
+ARG VMTP_TAG=dc79be8a3b566507e1907a70fc9eaf0f1d6c9e9c
RUN apk --no-cache add --update libxml2 libxslt && \
apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev \
+ python3-dev build-base linux-headers libffi-dev \
openssl-dev libjpeg-turbo-dev libxml2-dev libxslt-dev && \
wget -q -O- https://opendev.org/openstack/requirements/raw/branch/$OPENSTACK_TAG/upper-constraints.txt > upper-constraints.txt && \
sed -i -E s/^tempest==+.*$/-e\ git+https:\\/\\/opendev.org\\/openstack\\/tempest@$TEMPEST_TAG#egg=tempest/ upper-constraints.txt && \
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 && \
- case $(uname -m) in aarch*|arm*) CFLAGS="-O0" pip install --no-cache-dir -cupper-constraints.txt -cupper-constraints.opnfv.txt lxml ;; esac && \
+ case $(uname -m) in aarch*|arm*) CFLAGS="-O0" pip3 install --no-cache-dir -cupper-constraints.txt -cupper-constraints.opnfv.txt lxml ;; esac && \
git init /src/vmtp && \
(cd /src/vmtp && \
git fetch --tags https://opendev.org/x/vmtp.git $VMTP_TAG && \
git checkout FETCH_HEAD) && \
update-requirements -s --source /src/openstack-requirements /src/vmtp/ && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
+ pip3 install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
/src/vmtp && \
mkdir -p /home/opnfv/functest/data/rally/neutron && \
git init /src/neutron && \
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/python2.7/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml
CMD ["run_tests", "-t", "all"]
ARG OPENSTACK_TAG=stable/stein
RUN apk --no-cache add --update \
- python libffi openssl libjpeg-turbo py-pip bash \
+ python3 libffi openssl libjpeg-turbo py3-pip bash \
grep sed wget ca-certificates git openssh-client qemu-img iputils && \
apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev \
+ python3-dev build-base linux-headers libffi-dev \
openssl-dev libjpeg-turbo-dev && \
wget -q -O- https://opendev.org/openstack/requirements/raw/branch/$OPENSTACK_TAG/upper-constraints.txt > upper-constraints.txt && \
- case $(uname -m) in aarch*|arm*) sed -i -E /^PyNaCl=/d upper-constraints.txt && apk add --no-cache py-pynacl ;; esac && \
+ case $(uname -m) in aarch*|arm*) sed -i -E /^PyNaCl=/d upper-constraints.txt && apk add --no-cache py3-pynacl ;; 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 && \
- pip install --no-cache-dir --src /src -cupper-constraints.opnfv.txt -cupper-constraints.txt \
+ pip3 install --no-cache-dir --src /src -cupper-constraints.opnfv.txt -cupper-constraints.txt \
-e git+https://opendev.org/openstack/requirements@$OPENSTACK_TAG#egg=openstack_requirements && \
git init /src/functest && \
(cd /src/functest && \
git fetch --tags https://gerrit.opnfv.org/gerrit/functest $BRANCH && \
git checkout FETCH_HEAD) && \
update-requirements -s --source /src/openstack-requirements /src/functest && \
- pip install --no-cache-dir --src /src -cupper-constraints.opnfv.txt -cupper-constraints.txt \
+ 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/python2.7/site-packages/functest/ci/logging.ini /usr/lib/python2.7/site-packages/xtesting/ci/ && \
- cp /usr/lib/python2.7/site-packages/functest/ci/logging.debug.ini /usr/lib/python2.7/site-packages/xtesting/ci/ && \
+ 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/ && \
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" && \
+ ln -s /usr/bin/python3 /usr/bin/python && \
apk del .build-deps
COPY thirdparty-requirements.txt thirdparty-requirements.txt
RUN apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev openssl-dev && \
+ python3-dev build-base linux-headers libffi-dev openssl-dev && \
wget -q -O- https://opendev.org/openstack/requirements/raw/branch/$OPENSTACK_TAG/upper-constraints.txt > upper-constraints.txt && \
sed -i -E s/^tempest==+.*$/-e\ git+https:\\/\\/opendev.org\\/openstack\\/tempest@$TEMPEST_TAG#egg=tempest/ upper-constraints.txt && \
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 && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
+ pip3 install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
-rthirdparty-requirements.txt && \
git init /src/odl_test && \
(cd /src/odl_test && \
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/python2.7/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml
CMD ["run_tests", "-t", "all"]
ARG BARBICAN_TAG=0.1.0
RUN apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev \
+ python3-dev build-base linux-headers libffi-dev \
openssl-dev libjpeg-turbo-dev libxml2-dev libxslt-dev && \
wget -q -O- https://opendev.org/openstack/requirements/raw/branch/$OPENSTACK_TAG/upper-constraints.txt > upper-constraints.txt && \
sed -i -E s/^tempest==+.*$/-e\ git+https:\\/\\/opendev.org\\/openstack\\/tempest@$TEMPEST_TAG#egg=tempest/ upper-constraints.txt && \
git fetch --tags https://opendev.org/openstack/barbican-tempest-plugin.git $BARBICAN_TAG && \
git checkout FETCH_HEAD) && \
update-requirements -s --source /src/openstack-requirements /src/barbican-tempest-plugin/ && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
+ pip3 install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
/src/patrole /src/barbican-tempest-plugin /src/neutron-tempest-plugin \
networking-bgpvpn networking-sfc && \
mkdir -p /home/opnfv/functest/data/refstack && \
mkdir -p /etc/neutron /etc/cinder /etc/glance /etc/keystone /etc/nova && \
wget -q -O /etc/glance/policy.json https://opendev.org/openstack/glance/raw/branch/$OPENSTACK_TAG/etc/policy.json && \
virtualenv --no-pip --no-setuptools --no-wheel oslo && . oslo/bin/activate && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
+ pip3 install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
oslo.policy neutron && \
oslopolicy-sample-generator --format json --output-file /etc/neutron/policy.json --namespace neutron && \
deactivate && \
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/python2.7/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml
CMD ["run_tests", "-t", "all"]
ARG UJSON_TAG=d25e024f481c5571d15f3c0c406a498ca0467cfd
RUN apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev \
+ python3-dev build-base linux-headers libffi-dev \
openssl-dev libjpeg-turbo-dev && \
wget -q -O- https://opendev.org/openstack/requirements/raw/branch/$OPENSTACK_TAG/upper-constraints.txt > upper-constraints.txt && \
sed -i -E s/^tempest==+.*$/-e\ git+https:\\/\\/opendev.org\\/openstack\\/tempest@$TEMPEST_TAG#egg=tempest/ upper-constraints.txt && \
(git clone https://opendev.org/openstack/rally-openstack.git /src/rally-openstack && \
cd /src/rally-openstack && git checkout $RALLY_OPENSTACK_TAG) && \
update-requirements -s --source /src/openstack-requirements /src/rally-openstack && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
+ pip3 install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
tempest /src/rally-openstack && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
+ pip3 install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
/src/rally && \
rm -r upper-constraints.txt upper-constraints.opnfv.txt /src/rally /src/rally-openstack && \
mkdir -p /etc/rally && \
COPY clearwater-heat-singlenet-deps.patch /tmp/clearwater-heat-singlenet-deps.patch
RUN apk --no-cache add --update \
ruby ruby-bundler ruby-irb ruby-rdoc \
- procps libxslt libxml2 zlib libffi python3 go musl-dev && \
+ procps libxslt libxml2 zlib libffi go musl-dev && \
apk --no-cache add --virtual .build-deps --update \
ruby-dev g++ make libxslt-dev libxml2-dev zlib-dev libffi-dev g++ make && \
wget -q -O- https://opendev.org/openstack/requirements/raw/branch/$OPENSTACK_TAG/upper-constraints.txt > upper-constraints.txt && \
(cd /src/epc-requirements/abot_charm && \
git fetch --tags https://github.com/RebacaInc/abot_charm.git $ABOT_CHARM && \
git checkout FETCH_HEAD) && \
- python3 -m pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
+ pip3 install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \
juju-wait==$JUJU_WAIT_TAG && \
go get -d github.com/rogpeppe/godeps && \
(cd $GOPATH/src/github.com/rogpeppe/godeps && git checkout $GODEPS_TAG && go install -v github.com/rogpeppe/godeps) && \
/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/python2.7/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.6/site-packages/xtesting/ci/testcases.yaml
CMD ["run_tests", "-t", "all"]
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)
'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)
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
from functest.utils import env
-class NewProject(object):
+class NewProject():
"""Ease creating new projects/users"""
# pylint: disable=too-many-instance-attributes
import subprocess
import time
-from threading import Timer
import pkg_resources
import prettytable
from ruamel.yaml import YAML
self.run_cmd = ''
self.network_extensions = []
self.services = []
- self.task_aborted = False
def build_task_args(self, test_name):
"""Build arguments for the Rally task."""
else:
LOGGER.info('Test scenario: "%s" Failed.', test_name)
- def kill_task(self, proc):
- """ Kill a task."""
- proc.kill()
- self.task_aborted = True
-
def run_task(self, test_name):
"""Run a task."""
LOGGER.info('Starting test scenario "%s" ...', test_name)
LOGGER.debug('running command: %s', self.run_cmd)
proc = subprocess.Popen(self.run_cmd, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
- self.task_aborted = False
- timer = Timer(self.task_timeout, self.kill_task, [proc])
- timer.start()
- output = proc.communicate()[0]
- if self.task_aborted:
- LOGGER.error("Failed to complete task")
- raise Exception("Failed to complete task")
- timer.cancel()
+ try:
+ output = proc.communicate(timeout=self.task_timeout)[0]
+ except subprocess.TimeoutExpired:
+ proc.kill()
+ proc.communicate()
+ LOGGER.error("Failed to complete run task")
+ raise Exception("Failed to complete run task")
task_id = self.get_task_id(output)
LOGGER.debug('task_id : %s', task_id)
if task_id is None:
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:
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):
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)")
"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):
'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)
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)
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)
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)")
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."""
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."""
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)")
VnfController)
-class FunctionTestExec(object):
+class FunctionTestExec():
"""vrouter function test execution class"""
logger = logging.getLogger(__name__)
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__)
from jinja2 import Environment, FileSystemLoader
-class Checker(object):
+class Checker():
"""vrouter test result check class"""
logger = logging.getLogger(__name__)
from jinja2 import Environment, FileSystemLoader
-class CommandGenerator(object):
+class CommandGenerator():
"""command generator class for vrouter testing"""
logger = logging.getLogger(__name__)
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__)
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
SshClient)
-class VmController(object):
+class VmController():
"""vm controll class"""
logger = logging.getLogger(__name__)
VmController)
-class VnfController(object):
+class VnfController():
"""vrouter controll class"""
logger = logging.getLogger(__name__)
__author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>"
-class VrouterOnBoardingBase(object):
+class VrouterOnBoardingBase():
"""vrouter testing base class"""
def __init__(self, util, util_info):
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
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("")
from functest.utils import env
-class Config(object):
+class Config():
def __init__(self):
try:
# pylint: disable=bad-continuation
functest/tests/unit
[testenv:docs]
-basepython = python2.7
+basepython = python3.6
commands =
doc8 \
--ignore-path api/build \
sphinx-build -W -n -b html -c docs/lfreleng docs docs/_build/html
[testenv:pep8]
-basepython = python2.7
+basepython = python3.6
commands = flake8
[testenv:pylint]
-basepython = python2.7
+basepython = python3.6
commands =
pylint \
--ignore-imports=y --min-similarity-lines=10 \
--disable=locally-disabled functest
[testenv:yamllint]
-basepython = python2.7
+basepython = python3.6
files =
.travis.yml
docker
yamllint -s {[testenv:yamllint]files}
[testenv:ansiblelint]
-basepython = python2.7
+basepython = python3.6
commands =
ansible-lint ansible/site.yml
commands = nosetests functest/tests/unit
[testenv:bashate]
-basepython = python2.7
+basepython = python3.6
files =
functest/opnfv_tests/openstack/cinder/write_data.sh
functest/opnfv_tests/openstack/cinder/read_data.sh
[testenv:bandit]
-basepython = python2.7
+basepython = python3.6
commands = bandit -r functest -x tests -n 5 -ll -s B601,B602
[testenv:cover]
-basepython = python2.7
+basepython = python3.6
dirs =
functest/tests/unit/odl
functest/tests/unit/openstack/vping
--cover-min-percentage 100 {[testenv:cover]dirs}
[testenv:perm]
-basepython = python2.7
+basepython = python3.6
whitelist_externals = bash
path=. -not -path './.tox/*' -not -path './.git/*' -not -path './docs/com/pres/reveal.js/*'
commands =
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.0.2
robotframework-httplibrary===0.4.2
robotframework-requests===0.4.7