diff --git a/.pylintrc b/.pylintrc index d343d72a64..83ffcfc21a 100644 --- a/.pylintrc +++ b/.pylintrc @@ -19,19 +19,11 @@ disable= locally-disabled, # "E" Error for important programming issues (likely bugs) access-member-before-definition, - bad-super-call, - maybe-no-member, no-member, no-method-argument, no-self-argument, - not-callable, - no-value-for-parameter, - super-on-old-class, - too-few-format-args, # "W" Warnings for stylistic problems or minor programming issues abstract-method, - anomalous-backslash-in-string, - anomalous-unicode-escape-in-string, arguments-differ, attribute-defined-outside-init, bad-builtin, @@ -39,33 +31,29 @@ disable= broad-except, dangerous-default-value, deprecated-lambda, - duplicate-key, expression-not-assigned, fixme, global-statement, - global-variable-not-assigned, - logging-not-lazy, no-init, non-parent-init-called, + not-callable, protected-access, redefined-builtin, redefined-outer-name, - redefine-in-handler, signature-differs, star-args, super-init-not-called, - unnecessary-lambda, - unnecessary-pass, + super-on-old-class, unpacking-non-sequence, - unreachable, unused-argument, unused-import, unused-variable, +# TODO(dougwig) - disable nonstandard-exception while we have neutron_lib shims + nonstandard-exception, # "C" Coding convention violations bad-continuation, invalid-name, missing-docstring, - old-style-class, superfluous-parens, # "R" Refactor recommendations abstract-class-little-used, @@ -82,7 +70,10 @@ disable= too-many-locals, too-many-public-methods, too-many-return-statements, - too-many-statements + too-many-statements, + cyclic-import, + no-name-in-module, + bad-super-call [BASIC] # Variable names can be 1 to 31 characters long, with lowercase and underscores diff --git a/run_tests.sh b/run_tests.sh index b14b82be7b..67f3414715 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -eu diff --git a/test-requirements.txt b/test-requirements.txt index b6247ef429..7d7d7834fc 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -21,3 +21,5 @@ WebTest>=2.0 # MIT tempest-lib>=0.14.0 # Apache-2.0 reno>=1.8.0 # Apache2 bandit>=1.0.1 # Apache-2.0 +tempest>=12.1.0 # Apache-2.0 +pylint==1.4.5 # GPLv2 diff --git a/tools/check_bash.sh b/tools/check_bash.sh deleted file mode 100644 index 6fa95188ec..0000000000 --- a/tools/check_bash.sh +++ /dev/null @@ -1,31 +0,0 @@ -#! /bin/sh - -# Copyright (C) 2014 VA Linux Systems Japan K.K. -# Copyright (C) 2014 YAMAMOTO Takashi -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# The purpose of this script is to avoid casual introduction of more -# bash dependency. Please consider alternatives before committing code -# which uses bash specific features. - -# Ignore comments, but include shebangs -OBSERVED=$(grep -E '^([^#]|#!).*bash' tox.ini tools/* | wc -l) -EXPECTED=5 -if [ ${EXPECTED} -ne ${OBSERVED} ]; then - echo Unexpected number of bash usages are detected. - echo Please read the comment in $0 - exit 1 -fi -exit 0 diff --git a/tools/coding-checks.sh b/tools/coding-checks.sh new file mode 100755 index 0000000000..d212ad54aa --- /dev/null +++ b/tools/coding-checks.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +set -eu + +usage () { + echo "Usage: $0 [OPTION]..." + echo "Run vmware-nsx's coding check(s)" + echo "" + echo " -Y, --pylint [] Run pylint check on the entire vmware-nsx module or just files changed in basecommit (e.g. HEAD~1)" + echo " -h, --help Print this usage message" + echo + exit 0 +} + +process_options () { + i=1 + while [ $i -le $# ]; do + eval opt=\$$i + case $opt in + -h|--help) usage;; + -Y|--pylint) pylint=1;; + *) scriptargs="$scriptargs $opt" + esac + i=$((i+1)) + done +} + +run_pylint () { + local target="${scriptargs:-all}" + + if [ "$target" = "all" ]; then + files="vmware_nsx" + else + case "$target" in + *HEAD~[0-9]*) files=$(git diff --diff-filter=AM --name-only $target -- "*.py");; + *) echo "$target is an unrecognized basecommit"; exit 1;; + esac + fi + + echo "Running pylint..." + echo "You can speed this up by running it on 'HEAD~[0-9]' (e.g. HEAD~1, this change only)..." + if [ -n "${files}" ]; then + pylint --rcfile=.pylintrc --output-format=colorized ${files} + else + echo "No python changes in this commit, pylint check not required." + exit 0 + fi +} + +scriptargs= +pylint=1 + +process_options $@ + +if [ $pylint -eq 1 ]; then + run_pylint + exit 0 +fi diff --git a/tools/install_venv.py b/tools/install_venv.py index f8fb8fa291..a33664930e 100644 --- a/tools/install_venv.py +++ b/tools/install_venv.py @@ -52,8 +52,15 @@ def print_help(): def main(argv): - root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) - venv = os.path.join(root, '.venv') + if 'tools_path' in os.environ: + root = os.environ['tools_path'] + else: + root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + if 'venv' in os.environ: + venv = os.environ['venv'] + else: + venv = os.path.join(root, '.venv') + pip_requires = os.path.join(root, 'requirements.txt') test_requires = os.path.join(root, 'test-requirements.txt') py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) diff --git a/tools/misc-sanity-checks.sh b/tools/misc-sanity-checks.sh new file mode 100755 index 0000000000..ecf35e8686 --- /dev/null +++ b/tools/misc-sanity-checks.sh @@ -0,0 +1,83 @@ +#! /bin/sh + +# Copyright (C) 2014 VA Linux Systems Japan K.K. +# Copyright (C) 2014 YAMAMOTO Takashi +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +TMPDIR=`mktemp -d /tmp/${0##*/}.XXXXXX` || exit 1 +export TMPDIR +trap "rm -rf $TMPDIR" EXIT + +FAILURES=$TMPDIR/failures + + +check_no_symlinks_allowed () { + # Symlinks break the package build process, so ensure that they + # do not slip in, except hidden symlinks. + if [ $(find . -type l ! -path '*/.*' | wc -l) -ge 1 ]; then + echo "Symlinks are not allowed!" >>$FAILURES + fi +} + + +check_pot_files_errors () { + # The job vmware-nsx-propose-translation-update does not update from + # transifex since our po files contain duplicate entries where + # obsolete entries duplicate normal entries. Prevent obsolete + # entries to slip in + if [ $(find vmware_nsx -type f -regex '.*\.pot?' | wc -l) -ge 1 ]; then + find vmware_nsx -type f -regex '.*\.pot?' \ + -print0|xargs -0 -n 1 msgfmt --check-format \ + -o /dev/null + if [ "$?" -ne 0 ]; then + echo "PO files syntax is not correct!" >>$FAILURES + fi + fi +} + + +check_identical_policy_files () { + # For unit tests, we maintain their own policy.json file to make test suite + # independent of whether it's executed from the vmware-nsx source tree or from + # site-packages installation path. We don't want two copies of the same + # file to diverge, so checking that they are identical + diff etc/policy.json vmware-nsx/tests/etc/policy.json 2>&1 > /dev/null + if [ "$?" -ne 0 ]; then + echo "policy.json files must be identical!" >>$FAILURES + fi +} + +check_no_duplicate_api_test_idempotent_ids() { + # For API tests, an idempotent ID is assigned to each single API test, + # those IDs should be unique + output=$(check-uuid --package vmware_nsx_tempest) + if [ "$?" -ne 0 ]; then + echo "There are duplicate idempotent ids in the API tests" >>$FAILURES + echo "please, assign unique uuids to each API test:" >>$FAILURES + echo "$output" >>$FAILURES + fi +} + +# Add your checks here... +check_no_symlinks_allowed +check_pot_files_errors +#check_identical_policy_files +check_no_duplicate_api_test_idempotent_ids + +# Fail, if there are emitted failures +if [ -f $FAILURES ]; then + cat $FAILURES + exit 1 +fi diff --git a/tools/ostestr_compat_shim.sh b/tools/ostestr_compat_shim.sh new file mode 100755 index 0000000000..a483ed1a1e --- /dev/null +++ b/tools/ostestr_compat_shim.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# preserve old behavior of using an arg as a regex when '--' is not present +case $@ in + (*--*) ostestr $@;; + ('') ostestr;; + (*) ostestr --regex "$@" +esac diff --git a/tools/pretty_tox.sh b/tools/pretty_tox.sh deleted file mode 100755 index 0fc360530d..0000000000 --- a/tools/pretty_tox.sh +++ /dev/null @@ -1,6 +0,0 @@ -#! /bin/sh - -TESTRARGS=$1 - -exec 3>&1 -status=$(exec 4>&1 >&3; ( python setup.py testr --slowest --testr-args="--subunit $TESTRARGS"; echo $? >&4 ) | subunit-trace -f) && exit $status diff --git a/tools/tox_install.sh b/tools/tox_install.sh deleted file mode 100755 index 7ad1a7fa3f..0000000000 --- a/tools/tox_install.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/sh - -# Many of neutron's repos suffer from the problem of depending on neutron, -# but it not existing on pypi. - -# This wrapper for tox's package installer will use the existing package -# if it exists, else use zuul-cloner if that program exists, else grab it -# from neutron master via a hard-coded URL. That last case should only -# happen with devs running unit tests locally. - -# From the tox.ini config page: -# install_command=ARGV -# default: -# pip install {opts} {packages} - -ZUUL_CLONER=/usr/zuul-env/bin/zuul-cloner -BRANCH_NAME=master -neutron_installed=$(echo "import neutron" | python 2>/dev/null ; echo $?) -networking_l2gw_installed=$(echo "import networking_l2gw" | python 2>/dev/null ; echo $?) -neutron_lbaas_installed=$(echo "import neutron_lbaas" | python 2>/dev/null ; echo $?) - -set -ex - -cwd=$(/bin/pwd) -> /tmp/tox_install.txt - -zuul_cloner () { - echo "ZUUL CLONER" >> /tmp/tox_install.txt - cd /tmp - $ZUUL_CLONER --cache-dir \ - /opt/git \ - --branch $BRANCH_NAME \ - git://git.openstack.org $1 - cd $1 - pip install -e . - cd "$cwd" -} - -pip_hardcode () { - echo "PIP HARDCODE: $1" >> /tmp/tox_install.txt - pip install -U -egit+https://git.openstack.org/openstack/$1@$BRANCH_NAME#egg=$1 -} - -if [ $neutron_installed -eq 0 ]; then - echo "NEUTRON ALREADY INSTALLED" >> /tmp/tox_install.txt - echo "Neutron already installed; using existing package" -elif [ -x "$ZUUL_CLONER" ]; then - zuul_cloner openstack/neutron -else - pip_hardcode neutron -fi - -if [ $networking_l2gw_installed -eq 0 ]; then - echo "NETWORKING_L2GW ALREADY INSTALLED" >> /tmp/tox_install.txt - echo "Networking-l2gw already installed; using existing package" -elif [ -x "$ZUUL_CLONER" ]; then - zuul_cloner openstack/networking-l2gw -else - pip_hardcode networking-l2gw -fi - -if [ $neutron_lbaas_installed -eq 0 ]; then - echo "NEUTRON_LBAAS ALREADY INSTALLED" >> /tmp/tox_install.txt - echo "Neutron_lbaas already installed; using existing package" -elif [ -x "$ZUUL_CLONER" ]; then - zuul_cloner openstack/neutron-lbaas -else - pip_hardcode neutron-lbaas -fi - -pip install -U $* -exit $? diff --git a/tools/with_venv.sh b/tools/with_venv.sh index dea5c5fc2b..cf980dd0b9 100755 --- a/tools/with_venv.sh +++ b/tools/with_venv.sh @@ -14,6 +14,9 @@ # License for the specific language governing permissions and limitations # under the License. -TOOLS=`dirname $0` -VENV=$TOOLS/../.venv +tools_path=${tools_path:-$(dirname $0)} +venv_path=${venv_path:-${tools_path}} +venv_dir=${venv_name:-/../.venv} +TOOLS=${tools_path} +VENV=${venv:-${venv_path}/${venv_dir}} source $VENV/bin/activate && "$@" diff --git a/tox.ini b/tox.ini index 9762af248e..e8d0ae61c3 100644 --- a/tox.ini +++ b/tox.ini @@ -1,73 +1,97 @@ [tox] -envlist = py35,py34,py27,pep8 +envlist = py35,py34,py27,pep8,docs minversion = 1.6 skipsdist = True [testenv] -# Note the hash seed is set to 0 until neutron can be tested with a -# random hash seed successfully. setenv = VIRTUAL_ENV={envdir} - PYTHONHASHSEED=0 +passenv = TRACE_FAILONLY GENERATE_HASHES http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY usedevelop = True -install_command = {toxinidir}/tools/tox_install.sh {opts} {packages} +install_command = + pip install -U -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages} deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt + # TODO(boden): pulling the egg from git is fine for master, but + # should be replaced with a package version in requirements for + # release (branch) tags + git+https://git.openstack.org/openstack/neutron.git@master#egg=neutron + git+https://git.openstack.org/openstack/networking-l2gw.git@master#egg=networking-l2gw + git+https://git.openstack.org/openstack/neutron-lbaas.git@master#egg=neutron-lbaas whitelist_externals = sh commands = - sh tools/pretty_tox.sh '{posargs}' -# there is also secret magic in pretty_tox.sh which lets you run in a fail only + {toxinidir}/tools/ostestr_compat_shim.sh {posargs} +# there is also secret magic in ostestr which lets you run in a fail only # mode. To do this define the TRACE_FAILONLY environmental variable. -[testenv:hashtest] -# This is the same as default environment, but with a random PYTHONHASHSEED. -# You can also specify a specific hashseed (for test repeatability) as follows: -# tox --hashseed 1235130571 -e hashtest -setenv = VIRTUAL_ENV={envdir} +[testenv:common] +# Fake job to define environment variables shared between dsvm/non-dsvm jobs +setenv = OS_TEST_TIMEOUT=180 +commands = false [testenv:functional] -setenv = OS_TEST_TIMEOUT=90 +basepython = python2.7 +setenv = {[testenv]setenv} + {[testenv:common]setenv} + OS_TEST_PATH=./vmware_nsx/tests/functional + OS_LOG_PATH={env:OS_LOG_PATH:/opt/stack/logs} deps = {[testenv]deps} -r{toxinidir}/vmware_nsx/tests/functional/requirements.txt [testenv:dsvm-functional] +basepython = python2.7 setenv = OS_SUDO_TESTING=1 OS_FAIL_ON_MISSING_DEPS=1 - OS_TEST_TIMEOUT=90 + OS_TEST_TIMEOUT=180 sitepackages=True deps = {[testenv:functional]deps} +commands = + {toxinidir}/tools/ostestr_compat_shim.sh {posargs} [tox:jenkins] sitepackages = True [testenv:releasenotes] +# TODO(ihrachys): remove once infra supports constraints for this target +install_command = pip install -U {opts} {packages} commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html [testenv:pep8] +basepython = python2.7 deps = {[testenv]deps} commands = - sh ./tools/check_bash.sh + # If it is easier to add a check via a shell script, consider adding it in this file + sh ./tools/misc-sanity-checks.sh + # Checks for coding and style guidelines flake8 + sh ./tools/coding-checks.sh --pylint '{posargs}' neutron-db-manage --subproject vmware-nsx check_migration {[testenv:genconfig]commands} -whitelist_externals = sh +whitelist_externals = + sh + bash [testenv:bandit] deps = -r{toxinidir}/test-requirements.txt commands = bandit -r vmware_nsx -n 5 -ll [testenv:cover] +# TODO(boden): remove once infra supports constraints for this target +install_command = pip install -U {opts} {packages} +basepython = python2.7 commands = python setup.py testr --coverage --testr-args='{posargs}' coverage report [testenv:venv] +# TODO(boden): remove once infra supports constraints for this target +install_command = pip install -U {opts} {packages} commands = {posargs} [testenv:docs] -commands = python setup.py build_sphinx +commands = sphinx-build -W -b html doc/source doc/build/html [flake8] # E125 continuation line does not distinguish itself from next logical line @@ -88,13 +112,6 @@ show-source = true builtins = _ exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,.ropeproject -[testenv:pylint] -deps = - {[testenv]deps} - pylint -commands = - pylint --rcfile=.pylintrc --output-format=colorized {posargs:vmware_nsx/neutron} - [hacking] import_exceptions = vmware_nsx._i18n, vmware_nsx_tempest._i18n @@ -102,3 +119,7 @@ local-check-factory = neutron_lib.hacking.checks.factory [testenv:genconfig] commands = {toxinidir}/tools/generate_config_file_samples.sh + +[testenv:uuidgen] +commands = + check-uuid --fix diff --git a/vmware_nsx/api_client/exception.py b/vmware_nsx/api_client/exception.py index 6e62a7804e..c6f8e333ad 100644 --- a/vmware_nsx/api_client/exception.py +++ b/vmware_nsx/api_client/exception.py @@ -118,6 +118,5 @@ ERROR_MAPPINGS = { 301: zero, 307: zero, 500: zero, - 501: zero, - 503: zero + 501: zero } diff --git a/vmware_nsx/api_replay/client.py b/vmware_nsx/api_replay/client.py index dbf3e17920..b042b1a560 100644 --- a/vmware_nsx/api_replay/client.py +++ b/vmware_nsx/api_replay/client.py @@ -229,7 +229,6 @@ class ApiReplayClient(object): # multiple times as we don't currently # perserve the subnet_id. Also, 409 would be a better # response code for this in neutron :( - pass # create the ports on the network ports = self.get_ports_on_network(network['id'], source_ports) diff --git a/vmware_nsx/common/config.py b/vmware_nsx/common/config.py index 9bad3b2f5d..7ef5689845 100644 --- a/vmware_nsx/common/config.py +++ b/vmware_nsx/common/config.py @@ -24,18 +24,18 @@ from vmware_nsx.extensions import routersize LOG = logging.getLogger(__name__) -class AgentModes: +class AgentModes(object): AGENT = 'agent' AGENTLESS = 'agentless' COMBINED = 'combined' -class MetadataModes: +class MetadataModes(object): DIRECT = 'access_network' INDIRECT = 'dhcp_host_route' -class ReplicationModes: +class ReplicationModes(object): SERVICE = 'service' SOURCE = 'source' diff --git a/vmware_nsx/common/locking.py b/vmware_nsx/common/locking.py index c6a63711c8..a221dead3e 100644 --- a/vmware_nsx/common/locking.py +++ b/vmware_nsx/common/locking.py @@ -23,7 +23,7 @@ from tooz import coordination LOG = log.getLogger(__name__) -class LockManager: +class LockManager(object): _coordinator = None _coordinator_pid = None _connect_string = cfg.CONF.locking_coordinator_url diff --git a/vmware_nsx/common/sync.py b/vmware_nsx/common/sync.py index 61c1b9e6f2..b704bd3aa6 100644 --- a/vmware_nsx/common/sync.py +++ b/vmware_nsx/common/sync.py @@ -171,7 +171,7 @@ class NsxCache(object): self._get_resource_ids(self._lswitchports, changed_only=True)) -class SyncParameters(): +class SyncParameters(object): """Defines attributes used by the synchronization procedure. chunk_size: Actual chunk size @@ -211,7 +211,7 @@ def _start_loopingcall(min_chunk_size, state_sync_interval, func, return state_synchronizer -class NsxSynchronizer(): +class NsxSynchronizer(object): LS_URI = nsxlib._build_uri_path( switchlib.LSWITCH_RESOURCE, fields='uuid,tags,fabric_status', diff --git a/vmware_nsx/common/utils.py b/vmware_nsx/common/utils.py index a408a2f324..63e1a01e60 100644 --- a/vmware_nsx/common/utils.py +++ b/vmware_nsx/common/utils.py @@ -41,7 +41,7 @@ NSXV3_VERSION_1_1_0 = '1.1.0' # Allowed network types for the NSX Plugin -class NetworkTypes: +class NetworkTypes(object): """Allowed provider network types for the NSX Plugin.""" L3_EXT = 'l3_ext' STT = 'stt' @@ -53,7 +53,7 @@ class NetworkTypes: # Allowed network types for the NSX-v Plugin -class NsxVNetworkTypes: +class NsxVNetworkTypes(object): """Allowed provider network types for the NSX-v Plugin.""" FLAT = 'flat' VLAN = 'vlan' @@ -62,7 +62,7 @@ class NsxVNetworkTypes: # Allowed network types for the NSXv3 Plugin -class NsxV3NetworkTypes: +class NsxV3NetworkTypes(object): """Allowed provider network types for the NSXv3 Plugin.""" FLAT = 'flat' VLAN = 'vlan' diff --git a/vmware_nsx/db/nsxv_db.py b/vmware_nsx/db/nsxv_db.py index 1ff9d53bf7..06754ebf9a 100644 --- a/vmware_nsx/db/nsxv_db.py +++ b/vmware_nsx/db/nsxv_db.py @@ -74,7 +74,7 @@ def warn_on_binding_status_error(f, *args, **kwargs): if result is None: return # we support functions that return a single entry or a list - if type(result) == list: + if isinstance(result, list): bindings = result else: bindings = [result] diff --git a/vmware_nsx/nsxlib/v3/client.py b/vmware_nsx/nsxlib/v3/client.py index 4389d042e2..9f1eb47c34 100644 --- a/vmware_nsx/nsxlib/v3/client.py +++ b/vmware_nsx/nsxlib/v3/client.py @@ -94,7 +94,7 @@ class RESTClient(object): manager_error = ERRORS.get( result.status_code, nsx_exc.ManagerError) - if type(result_msg) is dict: + if isinstance(result_msg, dict): result_msg = result_msg.get('error_message', result_msg) raise manager_error( manager=_get_nsx_managers_from_conf(), diff --git a/vmware_nsx/nsxlib/v3/resources.py b/vmware_nsx/nsxlib/v3/resources.py index aaaf13e6de..0372ca0629 100644 --- a/vmware_nsx/nsxlib/v3/resources.py +++ b/vmware_nsx/nsxlib/v3/resources.py @@ -170,7 +170,7 @@ class SwitchingProfile(AbstractRESTResource): def build_switch_profile_ids(cls, client, *profiles): ids = [] for profile in profiles: - if type(profile) is str: + if isinstance(profile, str): profile = client.get(profile) if not isinstance(profile, SwitchingProfileTypeId): profile = SwitchingProfileTypeId( diff --git a/vmware_nsx/plugins/nsx_v/md_proxy.py b/vmware_nsx/plugins/nsx_v/md_proxy.py index 649d45a5a0..ee3c7fea9c 100644 --- a/vmware_nsx/plugins/nsx_v/md_proxy.py +++ b/vmware_nsx/plugins/nsx_v/md_proxy.py @@ -101,7 +101,7 @@ def get_db_internal_edge_ips(context): return ip_list -class NsxVMetadataProxyHandler: +class NsxVMetadataProxyHandler(object): def __init__(self, nsxv_plugin): self.nsxv_plugin = nsxv_plugin diff --git a/vmware_nsx/plugins/nsx_v/plugin.py b/vmware_nsx/plugins/nsx_v/plugin.py index 3e03307961..192a0a36d5 100644 --- a/vmware_nsx/plugins/nsx_v/plugin.py +++ b/vmware_nsx/plugins/nsx_v/plugin.py @@ -2332,7 +2332,6 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin, is_routes_update=is_routes_update) except n_exc.IpAddressGenerationFailure: del info['external_fixed_ips'] - pass LOG.warning(_LW("Cannot get one subnet with gateway " "to allocate one available gw ip")) router_driver._update_router_gw_info( diff --git a/vmware_nsx/plugins/nsx_v/vshield/edge_ipsecvpn_driver.py b/vmware_nsx/plugins/nsx_v/vshield/edge_ipsecvpn_driver.py index 7079b5c224..19316f1f8f 100644 --- a/vmware_nsx/plugins/nsx_v/vshield/edge_ipsecvpn_driver.py +++ b/vmware_nsx/plugins/nsx_v/vshield/edge_ipsecvpn_driver.py @@ -36,7 +36,7 @@ TRANSFORM_PROTOCOL_ALLOWED = ('esp',) ENCAPSULATION_MODE_ALLOWED = ('tunnel',) -class EdgeIPsecVpnDriver(): +class EdgeIPsecVpnDriver(object): """Driver APIs for Edge IPsec VPN bulk configuration.""" diff --git a/vmware_nsx/plugins/nsx_v/vshield/tasks/tasks.py b/vmware_nsx/plugins/nsx_v/vshield/tasks/tasks.py index 1720b96414..00a3bed403 100644 --- a/vmware_nsx/plugins/nsx_v/vshield/tasks/tasks.py +++ b/vmware_nsx/plugins/nsx_v/vshield/tasks/tasks.py @@ -53,7 +53,7 @@ class TaskStateSkipped(TaskException): message = _("State %(state)d skipped. Current state %(current)d") -class Task(): +class Task(object): def __init__(self, name, resource_id, execute_callback, status_callback=nop, result_callback=nop, userdata=None): self.name = name @@ -151,7 +151,7 @@ class Task(): self.id) -class TaskManager(): +class TaskManager(object): _instance = None _default_interval = DEFAULT_INTERVAL diff --git a/vmware_nsx/plugins/nsx_v3/plugin.py b/vmware_nsx/plugins/nsx_v3/plugin.py index 1ae44baab2..807b944cd1 100644 --- a/vmware_nsx/plugins/nsx_v3/plugin.py +++ b/vmware_nsx/plugins/nsx_v3/plugin.py @@ -2604,7 +2604,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, # NOTE(arosen): if in replay mode we need stub out this validator to # all default security groups to be created via the api if cfg.CONF.api_replay_mode: - def _pass(data, foo=None): + def _pass(data, _dummy=None): pass ext_sg.validators.validators['type:name_not_default'] = _pass diff --git a/vmware_nsx/services/lbaas/nsx_v/v2/listener_mgr.py b/vmware_nsx/services/lbaas/nsx_v/v2/listener_mgr.py index 7d198c8c08..7a2d7a9a9c 100644 --- a/vmware_nsx/services/lbaas/nsx_v/v2/listener_mgr.py +++ b/vmware_nsx/services/lbaas/nsx_v/v2/listener_mgr.py @@ -183,7 +183,7 @@ class EdgeListenerManager(base_mgr.EdgeLoadbalancerBaseManager): default_pool = None if new_listener.default_pool and new_listener.default_pool.id: pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding( - context.session, new_listener.default_pool.id) + context.session, new_listener.default_pool.id, None, None) if pool_binding: default_pool = pool_binding['edge_pool_id'] diff --git a/vmware_nsx/shell/admin/plugins/nsxv/resources/backup_edges.py b/vmware_nsx/shell/admin/plugins/nsxv/resources/backup_edges.py index 6884e31b23..6e7bec809c 100644 --- a/vmware_nsx/shell/admin/plugins/nsxv/resources/backup_edges.py +++ b/vmware_nsx/shell/admin/plugins/nsxv/resources/backup_edges.py @@ -75,8 +75,8 @@ def nsx_clean_backup_edge(resource, event, trigger, **kwargs): return try: edge = nsxv.get_edge(edge_id) - except exceptions.NeutronException as e: - LOG.error(_LE("%s"), str(e)) + except exceptions.NeutronException as x: + LOG.error(_LE("%s"), str(x)) else: # edge[0] is response status code # edge[1] is response body @@ -102,8 +102,8 @@ def nsx_clean_backup_edge(resource, event, trigger, **kwargs): edgeapi.context.session, edge[1]['name']) nsxv_db.clean_edge_vnic_binding(edgeapi.context.session, edge_id) - except Exception as e: - LOG.error(_LE("%s"), str(e)) + except Exception as expt: + LOG.error(_LE("%s"), str(expt)) @admin_utils.output_header diff --git a/vmware_nsx/tests/unit/nsxlib/mh/test_router.py b/vmware_nsx/tests/unit/nsxlib/mh/test_router.py index f3de9e3d8e..3160309e66 100644 --- a/vmware_nsx/tests/unit/nsxlib/mh/test_router.py +++ b/vmware_nsx/tests/unit/nsxlib/mh/test_router.py @@ -619,8 +619,8 @@ class TestLogicalRouters(base.NsxlibTestCase): self.fake_cluster, lrouter['uuid']) self.assertEqual(len(ports), 1) res_port = ports[0] - self.assertEqual(['10.10.10.254', '192.168.0.1'], - res_port['ip_addresses']) + self.assertEqual(sorted(['10.10.10.254', '192.168.0.1']), + sorted(res_port['ip_addresses'])) def test_update_lrouter_port_ips_remove_only(self): lrouter = routerlib.create_lrouter(self.fake_cluster, diff --git a/vmware_nsx_tempest/tests/api/test_qos.py b/vmware_nsx_tempest/tests/api/test_qos.py index f8840f1130..3fa921d4e0 100644 --- a/vmware_nsx_tempest/tests/api/test_qos.py +++ b/vmware_nsx_tempest/tests/api/test_qos.py @@ -627,7 +627,7 @@ class QosDscpMarkingRuleTest(BaseQosTest): VALID_DSCP_MARK1 = 56 VALID_DSCP_MARK2 = 48 - @test.idempotent_id('8a59b00b-3e9c-4787-92f8-93a5cdf5e378') + @test.idempotent_id('8a59b40b-3e9c-4787-92f8-93a5cdf5e378') def test_rule_create(self): """qos-dscp-marking-rule-create POLICY_ID.""" qos_client = self.adm_qos_client @@ -657,7 +657,7 @@ class QosDscpMarkingRuleTest(BaseQosTest): policy_rules[0]['type']) @test.attr(type='negative') - @test.idempotent_id('8a59b00b-ab01-4787-92f8-93a5cdf5e378') + @test.idempotent_id('8b59b10b-ab01-4787-92f8-93a5cdf5e378') def test_rule_create_fail_for_the_same_type(self): """One dscp marking rule per policy.""" policy = self.create_qos_policy(name='test-policy', @@ -671,7 +671,7 @@ class QosDscpMarkingRuleTest(BaseQosTest): policy_id=policy['id'], dscp_mark=self.VALID_DSCP_MARK2) - @test.idempotent_id('149a6988-2568-47d2-931e-2dbc858943b3') + @test.idempotent_id('249a6988-2568-47d2-931e-2dbc858943b3') def test_rule_update(self): """qos-dscp-marking-rule-create POLICY_ID.""" qos_client = self.adm_qos_client @@ -688,7 +688,7 @@ class QosDscpMarkingRuleTest(BaseQosTest): rule['id'], policy['id']) self.assertEqual(self.VALID_DSCP_MARK2, retrieved_rule['dscp_mark']) - @test.idempotent_id('67ee6efd-7b33-4a68-927d-275b4f8ba958') + @test.idempotent_id('67ed6efd-7b33-4a68-927d-275b4f8ba958') def test_rule_delete(self): """qos-dscp-marking-rule-delete POLICY_ID.""" qos_client = self.adm_qos_client @@ -708,7 +708,7 @@ class QosDscpMarkingRuleTest(BaseQosTest): rule['id'], policy['id']) @test.attr(type='negative') - @test.idempotent_id('f211222c-5808-46cb-a961-983bbab6b852') + @test.idempotent_id('f215222c-5808-46cb-a961-983bbab6b852') def test_rule_create_rule_nonexistent_policy(self): """can not create dscp marking rule with nonexist policy.""" self.assertRaises( @@ -717,7 +717,7 @@ class QosDscpMarkingRuleTest(BaseQosTest): 'policy', self.VALID_DSCP_MARK1) @test.attr(type='negative') - @test.idempotent_id('a4a2e7ad-786f-4927-a85a-e545a93bd274') + @test.idempotent_id('a4a2e3ad-786f-4927-a85a-e545a93bd274') def test_rule_create_forbidden_for_regular_tenants(self): """project/tenant can not create dscp marking rule.""" self.assertRaises( @@ -727,7 +727,7 @@ class QosDscpMarkingRuleTest(BaseQosTest): qos_client=self.pri_qos_client) @test.attr(type='negative') - @test.idempotent_id('33646b08-4f05-4493-a48a-bde768a18533') + @test.idempotent_id('32646b08-4f05-4493-a48a-bde768a18533') def test_invalid_rule_create(self): """Can not create rule with invalid dscp_mark value.""" policy = self.create_qos_policy(name='test-policy', @@ -738,7 +738,7 @@ class QosDscpMarkingRuleTest(BaseQosTest): self.create_qos_dscp_marking_rule, policy['id'], 58) - @test.idempotent_id('ce0bd0c2-54d9-4e29-85f1-cfb36ac3ebe2') + @test.idempotent_id('cf0bd0c2-54d9-4e29-85f1-cfb36ac3ebe2') def test_get_rules_by_policy(self): """qos-dscp-marking-rule-list POLICY_ID.""" policy1 = self.create_qos_policy(name='test-policy1', diff --git a/vmware_nsx_tempest/tests/nsxv/api/test_subnets.py b/vmware_nsx_tempest/tests/nsxv/api/test_subnets.py index e6f10c3aa8..ed29d46557 100644 --- a/vmware_nsx_tempest/tests/nsxv/api/test_subnets.py +++ b/vmware_nsx_tempest/tests/nsxv/api/test_subnets.py @@ -371,6 +371,7 @@ class SubnetTestJSON(base.BaseAdminNetworkTest): ['gateway', 'allocation_pools'])) @decorators.skip_because(bug="1501827") + @test.idempotent_id('3c4c36a1-684b-4e89-8e71-d528f19322a0') def test_create_delete_subnet_with_host_routes_and_dns_nameservers(self): self._create_verify_delete_subnet( **self.subnet_dict(['host_routes', 'dns_nameservers'])) @@ -385,6 +386,7 @@ class SubnetTestJSON(base.BaseAdminNetworkTest): self._create_verify_delete_subnet(enable_dhcp=True) @decorators.skip_because(bug="1501827") + @test.idempotent_id('3c4c36a1-684a-4e89-8e71-d528f19324a0') def test_update_subnet_gw_dns_host_routes_dhcp(self): network = self._create_network(_auto_clean_up=True) subnet_attrs = ['gateway', 'host_routes', @@ -443,6 +445,7 @@ class SubnetTestJSON(base.BaseAdminNetworkTest): self._delete_network(network['id']) @decorators.skip_because(bug="1501827") + @test.idempotent_id('a5caa7d5-ab71-4278-a57c-d6631b7474f8') def test_create_delete_subnet_all_attributes(self): self._create_verify_delete_subnet( enable_dhcp=True, @@ -451,13 +454,14 @@ class SubnetTestJSON(base.BaseAdminNetworkTest): 'dns_nameservers'])) @test.idempotent_id('969f20b2-7eb5-44f5-98cd-381545b7c7e7') + @test.idempotent_id('a5caa7d9-ab71-4278-a57c-d6631b7474c8') def test_create_delete_subnet_with_gw_dns(self): self._create_verify_delete_subnet( enable_dhcp=True, **self.subnet_dict(['gateway', 'dns_nameservers'])) - @test.idempotent_id('3c4c36a1-684b-4e89-8e71-d528f19324a0') + @test.idempotent_id('3c4c36a1-684b-4e89-8e71-d518f19324a0') def test_add_upd_del_multiple_overlapping_networks_subnet(self): r0, R1 = 0, 3 # (todo) get from CONF return self._add_upd_del_multiple_networks_subnet( diff --git a/vmware_nsx_tempest/tests/nsxv/scenario/test_lbaas_round_robin_ops.py b/vmware_nsx_tempest/tests/nsxv/scenario/test_lbaas_round_robin_ops.py index 9ea7322a18..cf74e2552e 100644 --- a/vmware_nsx_tempest/tests/nsxv/scenario/test_lbaas_round_robin_ops.py +++ b/vmware_nsx_tempest/tests/nsxv/scenario/test_lbaas_round_robin_ops.py @@ -26,8 +26,8 @@ from vmware_nsx_tempest.services.lbaas import members_client from vmware_nsx_tempest.services.lbaas import pools_client from vmware_nsx_tempest.tests.nsxv.scenario import ( manager_topo_deployment as dmgr) -from vmware_nsx_tempest.tests.nsxv.scenario.test_v1_lbaas_basic_ops import ( - copy_file_to_host as copy_file_to_host) +from vmware_nsx_tempest.tests.nsxv.scenario import test_v1_lbaas_basic_ops + CONF = config.CONF LOG = dmgr.manager.log.getLogger(__name__) @@ -248,9 +248,10 @@ class TestLBaasRoundRobinOps(dmgr.TopoDeployScenarioManager): with tempfile.NamedTemporaryFile() as key: key.write(private_key) key.flush() - copy_file_to_host(script.name, - "/tmp/script", - server_fip, username, key.name) + test_v1_lbaas_basic_ops.copy_file_to_host( + script.name, + "/tmp/script", + server_fip, username, key.name) # Start netcat start_server = ('while true; do ' diff --git a/vmware_nsx_tempest/tests/nsxv3/api/test_l2_gateway.py b/vmware_nsx_tempest/tests/nsxv3/api/test_l2_gateway.py index 15fad17719..3f7f1202b8 100644 --- a/vmware_nsx_tempest/tests/nsxv3/api/test_l2_gateway.py +++ b/vmware_nsx_tempest/tests/nsxv3/api/test_l2_gateway.py @@ -133,7 +133,7 @@ class L2GatewayTest(base_l2gw.BaseL2GatewayTest): self.resource_cleanup() @test.attr(type="nsxv3") - @test.idempotent_id("670cacb5-134e-467d-ba41-0d7cdbcf3903") + @test.idempotent_id("670cbcb5-134e-467d-ba41-0d7cdbcf3903") def test_l2_gateway_delete(self): """ Delete l2gw will create l2gw and delete recently created l2gw. To diff --git a/vmware_nsx_tempest/tests/nsxv3/api/test_l2_gateway_connection.py b/vmware_nsx_tempest/tests/nsxv3/api/test_l2_gateway_connection.py index a08d7212ce..121921bbda 100644 --- a/vmware_nsx_tempest/tests/nsxv3/api/test_l2_gateway_connection.py +++ b/vmware_nsx_tempest/tests/nsxv3/api/test_l2_gateway_connection.py @@ -348,7 +348,7 @@ class L2GatewayConnectionTest(base_l2gw.BaseL2GatewayTest): self.addCleanup(self.l2gw_cleanup) @test.attr(type="nsxv3") - @test.idempotent_id("670cacb5-134e-467d-ba41-0d7cdbcf3903") + @test.idempotent_id("671cacb5-134e-467d-ba41-0d7cdbcf3903") def test_l2_gateway_connection_delete(self): """ Delete l2gw will create l2gw and delete recently created l2gw. To diff --git a/vmware_nsx_tempest/tests/test_vmware_nsx_tempest.py b/vmware_nsx_tempest/tests/test_vmware_nsx_tempest.py index 51f2ca5e09..422d243af0 100644 --- a/vmware_nsx_tempest/tests/test_vmware_nsx_tempest.py +++ b/vmware_nsx_tempest/tests/test_vmware_nsx_tempest.py @@ -19,10 +19,12 @@ test_vmware_nsx_tempest Tests for `vmware_nsx_tempest` module. """ +from tempest import test from vmware_nsx_tempest.tests import base class TestVmware_nsx_tempest(base.TestCase): + @test.idempotent_id('3c4c36a1-684b-4e89-8e71-a328f19324a0') def test_something(self): pass