Update gate logic

As bug 1568706 uncovered, we were using zuul-cloner
in our gate jobs; this was preventing our translation from
syncing.

After digging into this issue a number of changes in this
associated logic were found to not be in sync with neutron.
This patch updates out tox/tools logic to follow that of neutron.
In addition this patch fixes any pylint checks that were failing to
make pep8 pass.

IMPORTANT:
Please review closely, not only to the tools/tox updates but also
to the ignored pylint checks in the code. We only want to disable
checks where appropriate.

Change-Id: I6c5fee3ca3073ad079eac1636cc3b9ec45926a68
Closes-Bug: #1568706
This commit is contained in:
Boden R 2016-06-29 14:22:49 -06:00
parent 7fd495e730
commit 28c14f567e
35 changed files with 267 additions and 199 deletions

View File

@ -19,19 +19,11 @@ disable=
locally-disabled, locally-disabled,
# "E" Error for important programming issues (likely bugs) # "E" Error for important programming issues (likely bugs)
access-member-before-definition, access-member-before-definition,
bad-super-call,
maybe-no-member,
no-member, no-member,
no-method-argument, no-method-argument,
no-self-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 # "W" Warnings for stylistic problems or minor programming issues
abstract-method, abstract-method,
anomalous-backslash-in-string,
anomalous-unicode-escape-in-string,
arguments-differ, arguments-differ,
attribute-defined-outside-init, attribute-defined-outside-init,
bad-builtin, bad-builtin,
@ -39,33 +31,29 @@ disable=
broad-except, broad-except,
dangerous-default-value, dangerous-default-value,
deprecated-lambda, deprecated-lambda,
duplicate-key,
expression-not-assigned, expression-not-assigned,
fixme, fixme,
global-statement, global-statement,
global-variable-not-assigned,
logging-not-lazy,
no-init, no-init,
non-parent-init-called, non-parent-init-called,
not-callable,
protected-access, protected-access,
redefined-builtin, redefined-builtin,
redefined-outer-name, redefined-outer-name,
redefine-in-handler,
signature-differs, signature-differs,
star-args, star-args,
super-init-not-called, super-init-not-called,
unnecessary-lambda, super-on-old-class,
unnecessary-pass,
unpacking-non-sequence, unpacking-non-sequence,
unreachable,
unused-argument, unused-argument,
unused-import, unused-import,
unused-variable, unused-variable,
# TODO(dougwig) - disable nonstandard-exception while we have neutron_lib shims
nonstandard-exception,
# "C" Coding convention violations # "C" Coding convention violations
bad-continuation, bad-continuation,
invalid-name, invalid-name,
missing-docstring, missing-docstring,
old-style-class,
superfluous-parens, superfluous-parens,
# "R" Refactor recommendations # "R" Refactor recommendations
abstract-class-little-used, abstract-class-little-used,
@ -82,7 +70,10 @@ disable=
too-many-locals, too-many-locals,
too-many-public-methods, too-many-public-methods,
too-many-return-statements, too-many-return-statements,
too-many-statements too-many-statements,
cyclic-import,
no-name-in-module,
bad-super-call
[BASIC] [BASIC]
# Variable names can be 1 to 31 characters long, with lowercase and underscores # Variable names can be 1 to 31 characters long, with lowercase and underscores

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
set -eu set -eu

View File

@ -21,3 +21,5 @@ WebTest>=2.0 # MIT
tempest-lib>=0.14.0 # Apache-2.0 tempest-lib>=0.14.0 # Apache-2.0
reno>=1.8.0 # Apache2 reno>=1.8.0 # Apache2
bandit>=1.0.1 # Apache-2.0 bandit>=1.0.1 # Apache-2.0
tempest>=12.1.0 # Apache-2.0
pylint==1.4.5 # GPLv2

View File

@ -1,31 +0,0 @@
#! /bin/sh
# Copyright (C) 2014 VA Linux Systems Japan K.K.
# Copyright (C) 2014 YAMAMOTO Takashi <yamamoto at valinux co jp>
# 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

58
tools/coding-checks.sh Executable file
View File

@ -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 [<basecommit>] 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

View File

@ -52,8 +52,15 @@ def print_help():
def main(argv): def main(argv):
if 'tools_path' in os.environ:
root = os.environ['tools_path']
else:
root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) 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') venv = os.path.join(root, '.venv')
pip_requires = os.path.join(root, 'requirements.txt') pip_requires = os.path.join(root, 'requirements.txt')
test_requires = os.path.join(root, 'test-requirements.txt') test_requires = os.path.join(root, 'test-requirements.txt')
py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1])

83
tools/misc-sanity-checks.sh Executable file
View File

@ -0,0 +1,83 @@
#! /bin/sh
# Copyright (C) 2014 VA Linux Systems Japan K.K.
# Copyright (C) 2014 YAMAMOTO Takashi <yamamoto at valinux co jp>
# 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

8
tools/ostestr_compat_shim.sh Executable file
View File

@ -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

View File

@ -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

View File

@ -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 $?

View File

@ -14,6 +14,9 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
TOOLS=`dirname $0` tools_path=${tools_path:-$(dirname $0)}
VENV=$TOOLS/../.venv venv_path=${venv_path:-${tools_path}}
venv_dir=${venv_name:-/../.venv}
TOOLS=${tools_path}
VENV=${venv:-${venv_path}/${venv_dir}}
source $VENV/bin/activate && "$@" source $VENV/bin/activate && "$@"

69
tox.ini
View File

@ -1,73 +1,97 @@
[tox] [tox]
envlist = py35,py34,py27,pep8 envlist = py35,py34,py27,pep8,docs
minversion = 1.6 minversion = 1.6
skipsdist = True skipsdist = True
[testenv] [testenv]
# Note the hash seed is set to 0 until neutron can be tested with a
# random hash seed successfully.
setenv = VIRTUAL_ENV={envdir} 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 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 deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-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 whitelist_externals = sh
commands = commands =
sh tools/pretty_tox.sh '{posargs}' {toxinidir}/tools/ostestr_compat_shim.sh {posargs}
# there is also secret magic in pretty_tox.sh which lets you run in a fail only # 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. # mode. To do this define the TRACE_FAILONLY environmental variable.
[testenv:hashtest] [testenv:common]
# This is the same as default environment, but with a random PYTHONHASHSEED. # Fake job to define environment variables shared between dsvm/non-dsvm jobs
# You can also specify a specific hashseed (for test repeatability) as follows: setenv = OS_TEST_TIMEOUT=180
# tox --hashseed 1235130571 -e hashtest commands = false
setenv = VIRTUAL_ENV={envdir}
[testenv:functional] [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 = deps =
{[testenv]deps} {[testenv]deps}
-r{toxinidir}/vmware_nsx/tests/functional/requirements.txt -r{toxinidir}/vmware_nsx/tests/functional/requirements.txt
[testenv:dsvm-functional] [testenv:dsvm-functional]
basepython = python2.7
setenv = OS_SUDO_TESTING=1 setenv = OS_SUDO_TESTING=1
OS_FAIL_ON_MISSING_DEPS=1 OS_FAIL_ON_MISSING_DEPS=1
OS_TEST_TIMEOUT=90 OS_TEST_TIMEOUT=180
sitepackages=True sitepackages=True
deps = deps =
{[testenv:functional]deps} {[testenv:functional]deps}
commands =
{toxinidir}/tools/ostestr_compat_shim.sh {posargs}
[tox:jenkins] [tox:jenkins]
sitepackages = True sitepackages = True
[testenv:releasenotes] [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 commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html
[testenv:pep8] [testenv:pep8]
basepython = python2.7
deps = deps =
{[testenv]deps} {[testenv]deps}
commands = 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 flake8
sh ./tools/coding-checks.sh --pylint '{posargs}'
neutron-db-manage --subproject vmware-nsx check_migration neutron-db-manage --subproject vmware-nsx check_migration
{[testenv:genconfig]commands} {[testenv:genconfig]commands}
whitelist_externals = sh whitelist_externals =
sh
bash
[testenv:bandit] [testenv:bandit]
deps = -r{toxinidir}/test-requirements.txt deps = -r{toxinidir}/test-requirements.txt
commands = bandit -r vmware_nsx -n 5 -ll commands = bandit -r vmware_nsx -n 5 -ll
[testenv:cover] [testenv:cover]
# TODO(boden): remove once infra supports constraints for this target
install_command = pip install -U {opts} {packages}
basepython = python2.7
commands = commands =
python setup.py testr --coverage --testr-args='{posargs}' python setup.py testr --coverage --testr-args='{posargs}'
coverage report coverage report
[testenv:venv] [testenv:venv]
# TODO(boden): remove once infra supports constraints for this target
install_command = pip install -U {opts} {packages}
commands = {posargs} commands = {posargs}
[testenv:docs] [testenv:docs]
commands = python setup.py build_sphinx commands = sphinx-build -W -b html doc/source doc/build/html
[flake8] [flake8]
# E125 continuation line does not distinguish itself from next logical line # E125 continuation line does not distinguish itself from next logical line
@ -88,13 +112,6 @@ show-source = true
builtins = _ builtins = _
exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,.ropeproject 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] [hacking]
import_exceptions = vmware_nsx._i18n, import_exceptions = vmware_nsx._i18n,
vmware_nsx_tempest._i18n vmware_nsx_tempest._i18n
@ -102,3 +119,7 @@ local-check-factory = neutron_lib.hacking.checks.factory
[testenv:genconfig] [testenv:genconfig]
commands = {toxinidir}/tools/generate_config_file_samples.sh commands = {toxinidir}/tools/generate_config_file_samples.sh
[testenv:uuidgen]
commands =
check-uuid --fix

View File

@ -118,6 +118,5 @@ ERROR_MAPPINGS = {
301: zero, 301: zero,
307: zero, 307: zero,
500: zero, 500: zero,
501: zero, 501: zero
503: zero
} }

View File

@ -229,7 +229,6 @@ class ApiReplayClient(object):
# multiple times as we don't currently # multiple times as we don't currently
# perserve the subnet_id. Also, 409 would be a better # perserve the subnet_id. Also, 409 would be a better
# response code for this in neutron :( # response code for this in neutron :(
pass
# create the ports on the network # create the ports on the network
ports = self.get_ports_on_network(network['id'], source_ports) ports = self.get_ports_on_network(network['id'], source_ports)

View File

@ -24,18 +24,18 @@ from vmware_nsx.extensions import routersize
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
class AgentModes: class AgentModes(object):
AGENT = 'agent' AGENT = 'agent'
AGENTLESS = 'agentless' AGENTLESS = 'agentless'
COMBINED = 'combined' COMBINED = 'combined'
class MetadataModes: class MetadataModes(object):
DIRECT = 'access_network' DIRECT = 'access_network'
INDIRECT = 'dhcp_host_route' INDIRECT = 'dhcp_host_route'
class ReplicationModes: class ReplicationModes(object):
SERVICE = 'service' SERVICE = 'service'
SOURCE = 'source' SOURCE = 'source'

View File

@ -23,7 +23,7 @@ from tooz import coordination
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
class LockManager: class LockManager(object):
_coordinator = None _coordinator = None
_coordinator_pid = None _coordinator_pid = None
_connect_string = cfg.CONF.locking_coordinator_url _connect_string = cfg.CONF.locking_coordinator_url

View File

@ -171,7 +171,7 @@ class NsxCache(object):
self._get_resource_ids(self._lswitchports, changed_only=True)) self._get_resource_ids(self._lswitchports, changed_only=True))
class SyncParameters(): class SyncParameters(object):
"""Defines attributes used by the synchronization procedure. """Defines attributes used by the synchronization procedure.
chunk_size: Actual chunk size chunk_size: Actual chunk size
@ -211,7 +211,7 @@ def _start_loopingcall(min_chunk_size, state_sync_interval, func,
return state_synchronizer return state_synchronizer
class NsxSynchronizer(): class NsxSynchronizer(object):
LS_URI = nsxlib._build_uri_path( LS_URI = nsxlib._build_uri_path(
switchlib.LSWITCH_RESOURCE, fields='uuid,tags,fabric_status', switchlib.LSWITCH_RESOURCE, fields='uuid,tags,fabric_status',

View File

@ -41,7 +41,7 @@ NSXV3_VERSION_1_1_0 = '1.1.0'
# Allowed network types for the NSX Plugin # Allowed network types for the NSX Plugin
class NetworkTypes: class NetworkTypes(object):
"""Allowed provider network types for the NSX Plugin.""" """Allowed provider network types for the NSX Plugin."""
L3_EXT = 'l3_ext' L3_EXT = 'l3_ext'
STT = 'stt' STT = 'stt'
@ -53,7 +53,7 @@ class NetworkTypes:
# Allowed network types for the NSX-v Plugin # Allowed network types for the NSX-v Plugin
class NsxVNetworkTypes: class NsxVNetworkTypes(object):
"""Allowed provider network types for the NSX-v Plugin.""" """Allowed provider network types for the NSX-v Plugin."""
FLAT = 'flat' FLAT = 'flat'
VLAN = 'vlan' VLAN = 'vlan'
@ -62,7 +62,7 @@ class NsxVNetworkTypes:
# Allowed network types for the NSXv3 Plugin # Allowed network types for the NSXv3 Plugin
class NsxV3NetworkTypes: class NsxV3NetworkTypes(object):
"""Allowed provider network types for the NSXv3 Plugin.""" """Allowed provider network types for the NSXv3 Plugin."""
FLAT = 'flat' FLAT = 'flat'
VLAN = 'vlan' VLAN = 'vlan'

View File

@ -74,7 +74,7 @@ def warn_on_binding_status_error(f, *args, **kwargs):
if result is None: if result is None:
return return
# we support functions that return a single entry or a list # we support functions that return a single entry or a list
if type(result) == list: if isinstance(result, list):
bindings = result bindings = result
else: else:
bindings = [result] bindings = [result]

View File

@ -94,7 +94,7 @@ class RESTClient(object):
manager_error = ERRORS.get( manager_error = ERRORS.get(
result.status_code, nsx_exc.ManagerError) 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) result_msg = result_msg.get('error_message', result_msg)
raise manager_error( raise manager_error(
manager=_get_nsx_managers_from_conf(), manager=_get_nsx_managers_from_conf(),

View File

@ -170,7 +170,7 @@ class SwitchingProfile(AbstractRESTResource):
def build_switch_profile_ids(cls, client, *profiles): def build_switch_profile_ids(cls, client, *profiles):
ids = [] ids = []
for profile in profiles: for profile in profiles:
if type(profile) is str: if isinstance(profile, str):
profile = client.get(profile) profile = client.get(profile)
if not isinstance(profile, SwitchingProfileTypeId): if not isinstance(profile, SwitchingProfileTypeId):
profile = SwitchingProfileTypeId( profile = SwitchingProfileTypeId(

View File

@ -101,7 +101,7 @@ def get_db_internal_edge_ips(context):
return ip_list return ip_list
class NsxVMetadataProxyHandler: class NsxVMetadataProxyHandler(object):
def __init__(self, nsxv_plugin): def __init__(self, nsxv_plugin):
self.nsxv_plugin = nsxv_plugin self.nsxv_plugin = nsxv_plugin

View File

@ -2332,7 +2332,6 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
is_routes_update=is_routes_update) is_routes_update=is_routes_update)
except n_exc.IpAddressGenerationFailure: except n_exc.IpAddressGenerationFailure:
del info['external_fixed_ips'] del info['external_fixed_ips']
pass
LOG.warning(_LW("Cannot get one subnet with gateway " LOG.warning(_LW("Cannot get one subnet with gateway "
"to allocate one available gw ip")) "to allocate one available gw ip"))
router_driver._update_router_gw_info( router_driver._update_router_gw_info(

View File

@ -36,7 +36,7 @@ TRANSFORM_PROTOCOL_ALLOWED = ('esp',)
ENCAPSULATION_MODE_ALLOWED = ('tunnel',) ENCAPSULATION_MODE_ALLOWED = ('tunnel',)
class EdgeIPsecVpnDriver(): class EdgeIPsecVpnDriver(object):
"""Driver APIs for Edge IPsec VPN bulk configuration.""" """Driver APIs for Edge IPsec VPN bulk configuration."""

View File

@ -53,7 +53,7 @@ class TaskStateSkipped(TaskException):
message = _("State %(state)d skipped. Current state %(current)d") message = _("State %(state)d skipped. Current state %(current)d")
class Task(): class Task(object):
def __init__(self, name, resource_id, execute_callback, def __init__(self, name, resource_id, execute_callback,
status_callback=nop, result_callback=nop, userdata=None): status_callback=nop, result_callback=nop, userdata=None):
self.name = name self.name = name
@ -151,7 +151,7 @@ class Task():
self.id) self.id)
class TaskManager(): class TaskManager(object):
_instance = None _instance = None
_default_interval = DEFAULT_INTERVAL _default_interval = DEFAULT_INTERVAL

View File

@ -2604,7 +2604,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
# NOTE(arosen): if in replay mode we need stub out this validator to # NOTE(arosen): if in replay mode we need stub out this validator to
# all default security groups to be created via the api # all default security groups to be created via the api
if cfg.CONF.api_replay_mode: if cfg.CONF.api_replay_mode:
def _pass(data, foo=None): def _pass(data, _dummy=None):
pass pass
ext_sg.validators.validators['type:name_not_default'] = _pass ext_sg.validators.validators['type:name_not_default'] = _pass

View File

@ -183,7 +183,7 @@ class EdgeListenerManager(base_mgr.EdgeLoadbalancerBaseManager):
default_pool = None default_pool = None
if new_listener.default_pool and new_listener.default_pool.id: if new_listener.default_pool and new_listener.default_pool.id:
pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding( 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: if pool_binding:
default_pool = pool_binding['edge_pool_id'] default_pool = pool_binding['edge_pool_id']

View File

@ -75,8 +75,8 @@ def nsx_clean_backup_edge(resource, event, trigger, **kwargs):
return return
try: try:
edge = nsxv.get_edge(edge_id) edge = nsxv.get_edge(edge_id)
except exceptions.NeutronException as e: except exceptions.NeutronException as x:
LOG.error(_LE("%s"), str(e)) LOG.error(_LE("%s"), str(x))
else: else:
# edge[0] is response status code # edge[0] is response status code
# edge[1] is response body # edge[1] is response body
@ -102,8 +102,8 @@ def nsx_clean_backup_edge(resource, event, trigger, **kwargs):
edgeapi.context.session, edge[1]['name']) edgeapi.context.session, edge[1]['name'])
nsxv_db.clean_edge_vnic_binding(edgeapi.context.session, nsxv_db.clean_edge_vnic_binding(edgeapi.context.session,
edge_id) edge_id)
except Exception as e: except Exception as expt:
LOG.error(_LE("%s"), str(e)) LOG.error(_LE("%s"), str(expt))
@admin_utils.output_header @admin_utils.output_header

View File

@ -619,8 +619,8 @@ class TestLogicalRouters(base.NsxlibTestCase):
self.fake_cluster, lrouter['uuid']) self.fake_cluster, lrouter['uuid'])
self.assertEqual(len(ports), 1) self.assertEqual(len(ports), 1)
res_port = ports[0] res_port = ports[0]
self.assertEqual(['10.10.10.254', '192.168.0.1'], self.assertEqual(sorted(['10.10.10.254', '192.168.0.1']),
res_port['ip_addresses']) sorted(res_port['ip_addresses']))
def test_update_lrouter_port_ips_remove_only(self): def test_update_lrouter_port_ips_remove_only(self):
lrouter = routerlib.create_lrouter(self.fake_cluster, lrouter = routerlib.create_lrouter(self.fake_cluster,

View File

@ -627,7 +627,7 @@ class QosDscpMarkingRuleTest(BaseQosTest):
VALID_DSCP_MARK1 = 56 VALID_DSCP_MARK1 = 56
VALID_DSCP_MARK2 = 48 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): def test_rule_create(self):
"""qos-dscp-marking-rule-create POLICY_ID.""" """qos-dscp-marking-rule-create POLICY_ID."""
qos_client = self.adm_qos_client qos_client = self.adm_qos_client
@ -657,7 +657,7 @@ class QosDscpMarkingRuleTest(BaseQosTest):
policy_rules[0]['type']) policy_rules[0]['type'])
@test.attr(type='negative') @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): def test_rule_create_fail_for_the_same_type(self):
"""One dscp marking rule per policy.""" """One dscp marking rule per policy."""
policy = self.create_qos_policy(name='test-policy', policy = self.create_qos_policy(name='test-policy',
@ -671,7 +671,7 @@ class QosDscpMarkingRuleTest(BaseQosTest):
policy_id=policy['id'], policy_id=policy['id'],
dscp_mark=self.VALID_DSCP_MARK2) 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): def test_rule_update(self):
"""qos-dscp-marking-rule-create POLICY_ID.""" """qos-dscp-marking-rule-create POLICY_ID."""
qos_client = self.adm_qos_client qos_client = self.adm_qos_client
@ -688,7 +688,7 @@ class QosDscpMarkingRuleTest(BaseQosTest):
rule['id'], policy['id']) rule['id'], policy['id'])
self.assertEqual(self.VALID_DSCP_MARK2, retrieved_rule['dscp_mark']) 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): def test_rule_delete(self):
"""qos-dscp-marking-rule-delete POLICY_ID.""" """qos-dscp-marking-rule-delete POLICY_ID."""
qos_client = self.adm_qos_client qos_client = self.adm_qos_client
@ -708,7 +708,7 @@ class QosDscpMarkingRuleTest(BaseQosTest):
rule['id'], policy['id']) rule['id'], policy['id'])
@test.attr(type='negative') @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): def test_rule_create_rule_nonexistent_policy(self):
"""can not create dscp marking rule with nonexist policy.""" """can not create dscp marking rule with nonexist policy."""
self.assertRaises( self.assertRaises(
@ -717,7 +717,7 @@ class QosDscpMarkingRuleTest(BaseQosTest):
'policy', self.VALID_DSCP_MARK1) 'policy', self.VALID_DSCP_MARK1)
@test.attr(type='negative') @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): def test_rule_create_forbidden_for_regular_tenants(self):
"""project/tenant can not create dscp marking rule.""" """project/tenant can not create dscp marking rule."""
self.assertRaises( self.assertRaises(
@ -727,7 +727,7 @@ class QosDscpMarkingRuleTest(BaseQosTest):
qos_client=self.pri_qos_client) qos_client=self.pri_qos_client)
@test.attr(type='negative') @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): def test_invalid_rule_create(self):
"""Can not create rule with invalid dscp_mark value.""" """Can not create rule with invalid dscp_mark value."""
policy = self.create_qos_policy(name='test-policy', policy = self.create_qos_policy(name='test-policy',
@ -738,7 +738,7 @@ class QosDscpMarkingRuleTest(BaseQosTest):
self.create_qos_dscp_marking_rule, self.create_qos_dscp_marking_rule,
policy['id'], 58) 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): def test_get_rules_by_policy(self):
"""qos-dscp-marking-rule-list POLICY_ID.""" """qos-dscp-marking-rule-list POLICY_ID."""
policy1 = self.create_qos_policy(name='test-policy1', policy1 = self.create_qos_policy(name='test-policy1',

View File

@ -371,6 +371,7 @@ class SubnetTestJSON(base.BaseAdminNetworkTest):
['gateway', 'allocation_pools'])) ['gateway', 'allocation_pools']))
@decorators.skip_because(bug="1501827") @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): def test_create_delete_subnet_with_host_routes_and_dns_nameservers(self):
self._create_verify_delete_subnet( self._create_verify_delete_subnet(
**self.subnet_dict(['host_routes', 'dns_nameservers'])) **self.subnet_dict(['host_routes', 'dns_nameservers']))
@ -385,6 +386,7 @@ class SubnetTestJSON(base.BaseAdminNetworkTest):
self._create_verify_delete_subnet(enable_dhcp=True) self._create_verify_delete_subnet(enable_dhcp=True)
@decorators.skip_because(bug="1501827") @decorators.skip_because(bug="1501827")
@test.idempotent_id('3c4c36a1-684a-4e89-8e71-d528f19324a0')
def test_update_subnet_gw_dns_host_routes_dhcp(self): def test_update_subnet_gw_dns_host_routes_dhcp(self):
network = self._create_network(_auto_clean_up=True) network = self._create_network(_auto_clean_up=True)
subnet_attrs = ['gateway', 'host_routes', subnet_attrs = ['gateway', 'host_routes',
@ -443,6 +445,7 @@ class SubnetTestJSON(base.BaseAdminNetworkTest):
self._delete_network(network['id']) self._delete_network(network['id'])
@decorators.skip_because(bug="1501827") @decorators.skip_because(bug="1501827")
@test.idempotent_id('a5caa7d5-ab71-4278-a57c-d6631b7474f8')
def test_create_delete_subnet_all_attributes(self): def test_create_delete_subnet_all_attributes(self):
self._create_verify_delete_subnet( self._create_verify_delete_subnet(
enable_dhcp=True, enable_dhcp=True,
@ -451,13 +454,14 @@ class SubnetTestJSON(base.BaseAdminNetworkTest):
'dns_nameservers'])) 'dns_nameservers']))
@test.idempotent_id('969f20b2-7eb5-44f5-98cd-381545b7c7e7') @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): def test_create_delete_subnet_with_gw_dns(self):
self._create_verify_delete_subnet( self._create_verify_delete_subnet(
enable_dhcp=True, enable_dhcp=True,
**self.subnet_dict(['gateway', **self.subnet_dict(['gateway',
'dns_nameservers'])) '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): def test_add_upd_del_multiple_overlapping_networks_subnet(self):
r0, R1 = 0, 3 # (todo) get from CONF r0, R1 = 0, 3 # (todo) get from CONF
return self._add_upd_del_multiple_networks_subnet( return self._add_upd_del_multiple_networks_subnet(

View File

@ -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.services.lbaas import pools_client
from vmware_nsx_tempest.tests.nsxv.scenario import ( from vmware_nsx_tempest.tests.nsxv.scenario import (
manager_topo_deployment as dmgr) manager_topo_deployment as dmgr)
from vmware_nsx_tempest.tests.nsxv.scenario.test_v1_lbaas_basic_ops import ( from vmware_nsx_tempest.tests.nsxv.scenario import test_v1_lbaas_basic_ops
copy_file_to_host as copy_file_to_host)
CONF = config.CONF CONF = config.CONF
LOG = dmgr.manager.log.getLogger(__name__) LOG = dmgr.manager.log.getLogger(__name__)
@ -248,7 +248,8 @@ class TestLBaasRoundRobinOps(dmgr.TopoDeployScenarioManager):
with tempfile.NamedTemporaryFile() as key: with tempfile.NamedTemporaryFile() as key:
key.write(private_key) key.write(private_key)
key.flush() key.flush()
copy_file_to_host(script.name, test_v1_lbaas_basic_ops.copy_file_to_host(
script.name,
"/tmp/script", "/tmp/script",
server_fip, username, key.name) server_fip, username, key.name)

View File

@ -133,7 +133,7 @@ class L2GatewayTest(base_l2gw.BaseL2GatewayTest):
self.resource_cleanup() self.resource_cleanup()
@test.attr(type="nsxv3") @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): def test_l2_gateway_delete(self):
""" """
Delete l2gw will create l2gw and delete recently created l2gw. To Delete l2gw will create l2gw and delete recently created l2gw. To

View File

@ -348,7 +348,7 @@ class L2GatewayConnectionTest(base_l2gw.BaseL2GatewayTest):
self.addCleanup(self.l2gw_cleanup) self.addCleanup(self.l2gw_cleanup)
@test.attr(type="nsxv3") @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): def test_l2_gateway_connection_delete(self):
""" """
Delete l2gw will create l2gw and delete recently created l2gw. To Delete l2gw will create l2gw and delete recently created l2gw. To

View File

@ -19,10 +19,12 @@ test_vmware_nsx_tempest
Tests for `vmware_nsx_tempest` module. Tests for `vmware_nsx_tempest` module.
""" """
from tempest import test
from vmware_nsx_tempest.tests import base from vmware_nsx_tempest.tests import base
class TestVmware_nsx_tempest(base.TestCase): class TestVmware_nsx_tempest(base.TestCase):
@test.idempotent_id('3c4c36a1-684b-4e89-8e71-a328f19324a0')
def test_something(self): def test_something(self):
pass pass