diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000000..50c472f66b --- /dev/null +++ b/.pylintrc @@ -0,0 +1,97 @@ +# The format of this file isn't really documented; just use --generate-rcfile +[MASTER] +# Add to the black list. It should be a base name, not a +# path. You may set this option multiple times. +ignore=.git,tests + +[MESSAGES CONTROL] +# NOTE: The options which do not need to be suppressed can be removed. +disable= +# "F" Fatal errors that prevent further processing +# "I" Informational noise + locally-disabled, +# "E" Error for important programming issues (likely bugs) + import-error, + not-callable, + no-member, +# "W" Warnings for stylistic problems or minor programming issues + abstract-method, + anomalous-backslash-in-string, + arguments-differ, + attribute-defined-outside-init, + bad-builtin, + broad-except, + fixme, + global-statement, + no-init, + pointless-string-statement, + protected-access, + redefined-builtin, + redefined-outer-name, + signature-differs, + unidiomatic-typecheck, + unused-argument, + unused-variable, + useless-super-delegation, +# "C" Coding convention violations + bad-continuation, + invalid-name, + line-too-long, + missing-docstring, +# "R" Refactor recommendations + duplicate-code, + interface-not-implemented, + no-self-use, + too-few-public-methods, + too-many-ancestors, + too-many-arguments, + too-many-branches, + too-many-instance-attributes, + too-many-lines, + too-many-locals, + too-many-public-methods, + too-many-return-statements, + too-many-statements + +[BASIC] +# Variable names can be 1 to 31 characters long, with lowercase and underscores +variable-rgx=[a-z_][a-z0-9_]{0,30}$ + +# Argument names can be 2 to 31 characters long, with lowercase and underscores +argument-rgx=[a-z_][a-z0-9_]{1,30}$ + +# Method names should be at least 3 characters long +# and be lowercased with underscores +method-rgx=([a-z_][a-z0-9_]{2,}|setUp|tearDown)$ + +# Module names matching +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Don't require docstrings on tests. +no-docstring-rgx=((__.*__)|([tT]est.*)|setUp|tearDown)$ + +[FORMAT] +# Maximum number of characters on a single line. +max-line-length=79 + +[VARIABLES] +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +[CLASSES] +# List of interface methods to ignore, separated by a comma. +ignore-iface-methods= + +[IMPORTS] +# Deprecated modules which should not be used, separated by a comma +deprecated-modules= + +[TYPECHECK] +# List of module names for which member attributes should not be checked +ignored-modules=six.moves,_MovedItems + +[REPORTS] +# Tells whether to display a full report or only the messages +reports=no + diff --git a/octavia/api/common/types.py b/octavia/api/common/types.py index 3bf131e6a7..77a9c5069c 100644 --- a/octavia/api/common/types.py +++ b/octavia/api/common/types.py @@ -115,6 +115,7 @@ class BaseType(wtypes.Base): # Set project_id equal tenant_id if project_id is unset and tenant_id # is if hasattr(self, 'project_id') and hasattr(self, 'tenant_id'): + # pylint: disable=access-member-before-definition if (isinstance(self.project_id, wtypes.UnsetType) and not isinstance(self.tenant_id, wtypes.UnsetType)): self.project_id = self.tenant_id diff --git a/octavia/api/handlers/controller_simulator/handler.py b/octavia/api/handlers/controller_simulator/handler.py index e8fcfe9c17..b08c2e2ab2 100644 --- a/octavia/api/handlers/controller_simulator/handler.py +++ b/octavia/api/handlers/controller_simulator/handler.py @@ -411,9 +411,9 @@ class MemberHandler(abstract_handler.BaseObjectHandler): "new": new_member_ids}) repo = repos.Repositories() - old_members = [repo.member.get(db_api.get_session(), mid) + old_members = [repo.member.get(db_api.get_session(), id=mid) for mid in old_member_ids] - new_members = [repo.member.get(db_api.get_session(), mid) + new_members = [repo.member.get(db_api.get_session(), id=mid) for mid in new_member_ids] all_members = [] all_members.extend(old_members) diff --git a/octavia/controller/worker/tasks/network_tasks.py b/octavia/controller/worker/tasks/network_tasks.py index f61260bfa0..7df3a00786 100644 --- a/octavia/controller/worker/tasks/network_tasks.py +++ b/octavia/controller/worker/tasks/network_tasks.py @@ -283,6 +283,7 @@ class PlugVIP(BaseNetworkTask): # Make sure we have the current port IDs for cleanup for amp_data in result: for amphora in six.moves.filter( + # pylint: disable=cell-var-from-loop lambda amp: amp.id == amp_data.id, loadbalancer.amphorae): amphora.vrrp_port_id = amp_data.vrrp_port_id diff --git a/test-requirements.txt b/test-requirements.txt index 4e6698551d..443a17fb35 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -9,6 +9,7 @@ mock>=2.0.0 # BSD python-subunit>=0.0.18 # Apache-2.0/BSD os-api-ref>=1.4.0 # Apache-2.0 oslotest>=1.10.0 # Apache-2.0 +pylint==1.4.5 # GPLv2 testrepository>=0.0.18 # Apache-2.0/BSD testtools>=1.4.0 # MIT testresources>=2.0.0 # Apache-2.0/BSD diff --git a/tools/coding-checks.sh b/tools/coding-checks.sh new file mode 100755 index 0000000000..1ff03dc5db --- /dev/null +++ b/tools/coding-checks.sh @@ -0,0 +1,66 @@ +#!/bin/sh +# This script is copied from neutron and adapted for octavia. +set -eu + +usage () { + echo "Usage: $0 [OPTION]..." + echo "Run octavia's coding check(s)" + echo "" + echo " -Y, --pylint [] Run pylint check on the entire octavia module or just files changed in basecommit (e.g. HEAD~1)" + echo " -h, --help Print this usage message" + echo + exit 0 +} + +join_args() { + if [ -z "$scriptargs" ]; then + scriptargs="$opt" + else + scriptargs="$scriptargs $opt" + fi +} + +process_options () { + i=1 + while [ $i -le $# ]; do + eval opt=\$$i + case $opt in + -h|--help) usage;; + -Y|--pylint) pylint=1;; + *) join_args;; + esac + i=$((i+1)) + done +} + +run_pylint () { + local target="${scriptargs:-all}" + + if [ "$target" = "all" ]; then + files="octavia" + 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/tox.ini b/tox.ini index 7d843943a2..84a8398769 100644 --- a/tox.ini +++ b/tox.ini @@ -64,6 +64,7 @@ commands = flake8 find . -type f -name "*.pyc" -delete python -m unittest specs-tests.test_titles sh ./tools/misc-sanity-checks.sh + {toxinidir}/tools/coding-checks.sh --pylint '{posargs}' whitelist_externals = sh find