fix tox python3 overrides

We want to default to running all tox environments under python 3, so
set the basepython value in each environment.

We do not want to specify a minor version number, because we do not
want to have to update the file every time we upgrade python.

We do not want to set the override once in testenv, because that
breaks the more specific versions used in default environments like
py35 and py36.

This patch also updates pylint to 1.5.6 which is compatible with
python3.
In updating pylint we have some issues to correct, this patch addresses
those issues so the Octavia code passes pylint 1.5.6.

Change-Id: Iec21f4c803a427059d595612336d67a35ebf9585
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
Doug Hellmann 2018-06-06 16:06:03 -04:00 committed by Jacky Hu
parent 3d545ab1b6
commit 0322cbc5c3
52 changed files with 164 additions and 109 deletions

View File

@ -51,7 +51,11 @@ disable=
too-many-locals,
too-many-public-methods,
too-many-return-statements,
too-many-statements
too-many-statements,
multiple-statements,
duplicate-except,
keyword-arg-before-vararg,
deprecated-method
[BASIC]
# Variable names can be 1 to 31 characters long, with lowercase and underscores
@ -80,8 +84,6 @@ max-line-length=79
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
@ -94,4 +96,3 @@ ignored-modules=six.moves,_MovedItems
[REPORTS]
# Tells whether to display a full report or only the messages
reports=no

View File

@ -4,7 +4,7 @@
# Docs
os-api-ref>=1.4.0 # Apache-2.0
sphinxcontrib-actdiag>=0.8.5 # BSD
sphinxcontrib-apidoc # BSD
sphinxcontrib-apidoc>=0.2.1 # BSD
sphinxcontrib-blockdiag>=1.5.4 # BSD
sphinxcontrib-nwdiag>=0.9.5 # BSD
sphinxcontrib-seqdiag>=0.8.4 # BSD

View File

@ -109,7 +109,7 @@ pycparser==2.18
pyflakes==1.0.0
Pygments==2.2.0
pyinotify==0.9.6
pylint==1.4.5
pylint==1.9.2
PyMySQL==0.7.6
PyNaCl==1.2.1
pyOpenSSL==17.1.0

View File

@ -18,6 +18,7 @@ import gettext
import six
if six.PY2:
gettext.install('octavia', unicode=1)
gettext.install('octavia', # pylint: disable=unexpected-keyword-arg
unicode=1)
else:
gettext.install('octavia')

View File

@ -18,11 +18,11 @@ import re
import socket
import subprocess
import netifaces
import pyroute2
import six
import webob
import netifaces
from octavia.amphorae.backends.agent import api_server
from octavia.amphorae.backends.agent.api_server import util
from octavia.common import constants as consts

View File

@ -480,8 +480,7 @@ class Listener(object):
m = re.search('frontend {}'.format(listener_id), cfg)
if m:
return consts.ACTIVE
else:
return consts.OFFLINE
return consts.OFFLINE
else: # pid file but no process...
return consts.ERROR
else:
@ -539,8 +538,8 @@ class Listener(object):
if action == consts.AMP_ACTION_STOP:
listener_ids.remove(listener_id)
args = []
for listener_id in listener_ids:
args.append(util.haproxy_sock_path(listener_id))
for lid in listener_ids:
args.append(util.haproxy_sock_path(lid))
if not os.path.exists(util.keepalived_dir()):
os.makedirs(util.keepalived_dir())
@ -555,7 +554,4 @@ class Listener(object):
if os.path.exists(
os.path.join('/proc', util.get_haproxy_pid(listener_id))):
return consts.ACTIVE
else: # pid file but no process...
return consts.OFFLINE
else:
return consts.OFFLINE
return consts.OFFLINE

View File

@ -95,14 +95,14 @@ class BaseOS(object):
text = template_vip.render(
interface=primary_interface,
vip=vip,
vip_ipv6=ip.version is 6,
vip_ipv6=ip.version == 6,
prefix=utils.netmask_to_prefix(netmask),
broadcast=broadcast,
netmask=netmask,
gateway=gateway,
mtu=mtu,
vrrp_ip=vrrp_ip,
vrrp_ipv6=vrrp_version is 6,
vrrp_ipv6=vrrp_version == 6,
host_routes=render_host_routes,
)
text_file.write(text)
@ -149,7 +149,7 @@ class BaseOS(object):
cidr if isinstance(
cidr, six.text_type) else six.u(cidr))
broadcast = network.broadcast_address.exploded
netmask = (network.prefixlen if ip.version is 6
netmask = (network.prefixlen if ip.version == 6
else network.netmask.exploded)
host_routes = self.get_host_routes(fixed_ip)
@ -157,7 +157,7 @@ class BaseOS(object):
return webob.Response(
json=dict(message="Invalid network IP"), status=400)
new_text = template_port.render(interface=netns_ip_interface,
ipv6=ip.version is 6,
ipv6=ip.version == 6,
ip_address=ip.exploded,
broadcast=broadcast,
netmask=netmask,

View File

@ -20,7 +20,6 @@ import stat
import subprocess
import jinja2
import netifaces
from oslo_config import cfg
from oslo_log import log as logging
import pyroute2
@ -28,6 +27,7 @@ import six
import webob
from werkzeug import exceptions
import netifaces
from octavia.common import constants as consts
@ -60,7 +60,7 @@ class Plug(object):
else six.u(subnet_cidr))
vip = ip.exploded
broadcast = network.broadcast_address.exploded
netmask = (network.prefixlen if ip.version is 6
netmask = (network.prefixlen if ip.version == 6
else network.netmask.exploded)
vrrp_version = None
if vrrp_ip:

View File

@ -136,8 +136,7 @@ def get_os_init_system():
if os.path.exists(init_path):
args = [init_path, '--version']
init_version = subprocess.check_output(args, shell=False)
if consts.INIT_UPSTART in init_version:
if consts.INIT_UPSTART in str(init_version, 'utf-8'):
return consts.INIT_UPSTART
else:
return consts.INIT_SYSVINIT
return consts.INIT_SYSVINIT
return consts.INIT_UNKOWN

View File

@ -27,9 +27,10 @@ from octavia.amphorae.backends.health_daemon import health_sender
from octavia.amphorae.backends.utils import haproxy_query
if six.PY2:
import Queue as queue
import Queue as queue # pylint: disable=wrong-import-order
else:
import queue
import queue # pylint: disable=wrong-import-order
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
@ -91,10 +92,10 @@ def run_sender(cmd_queue):
try:
cmd = cmd_queue.get_nowait()
if cmd is 'reload':
if cmd == 'reload':
LOG.info('Reloading configuration')
CONF.reload_config_files()
elif cmd is 'shutdown':
elif cmd == 'shutdown':
LOG.info('Health Manager Sender shutting down.')
break
except queue.Empty:

View File

@ -44,7 +44,7 @@ class Details(models.BaseDataModel):
active=None, haproxy_count=None, cpu=None, memory=None,
disk=None, load=None, listeners=None, packages=None):
self.hostname = hostname
self.uuid = uuid,
self.uuid = uuid
self.version = version
self.api_version = api_version
self.network_tx = network_tx

View File

@ -324,6 +324,7 @@ class AmphoraAPIClient(object):
'listeners/{listener_id}'.format(listener_id=listener_id))
if exc.check_exception(r):
return r.json()
return None
def _action(self, action, amp, listener_id):
r = self.put(amp, 'listeners/{listener_id}/{action}'.format(
@ -348,6 +349,7 @@ class AmphoraAPIClient(object):
listener_id=listener_id, filename=pem_filename))
if exc.check_exception(r):
return r.json().get("md5sum")
return None
def delete_listener(self, amp, listener_id):
r = self.delete(
@ -359,16 +361,19 @@ class AmphoraAPIClient(object):
r = self.get(amp, "info")
if exc.check_exception(r):
return r.json()
return None
def get_details(self, amp):
r = self.get(amp, "details")
if exc.check_exception(r):
return r.json()
return None
def get_all_listeners(self, amp):
r = self.get(amp, "listeners")
if exc.check_exception(r):
return r.json()
return None
def delete_cert_pem(self, amp, listener_id, pem_filename):
r = self.delete(
@ -400,3 +405,4 @@ class AmphoraAPIClient(object):
r = self.get(amp, 'interface/{ip_addr}'.format(ip_addr=ip_addr))
if exc.check_exception(r):
return r.json()
return None

View File

@ -67,8 +67,8 @@ def simulate_controller(data_model, delete=False, update=False, create=False,
operating_status=constants.ONLINE)
elif batch_update:
members = member
for member in members:
repo.member.update(db_api.get_session(), member.id,
for m in members:
repo.member.update(db_api.get_session(), m.id,
operating_status=constants.ONLINE)
listeners = []
if db_mem:

View File

@ -169,7 +169,7 @@ class L7PolicyController(base.BaseController):
which controller, if any, should control be passed.
"""
context = pecan.request.context.get('octavia_context')
if l7policy_id and len(remainder) and remainder[0] == 'l7rules':
if l7policy_id and remainder and remainder[0] == 'l7rules':
remainder = remainder[1:]
db_l7policy = self.repositories.l7policy.get(
context.session, id=l7policy_id)
@ -181,3 +181,4 @@ class L7PolicyController(base.BaseController):
load_balancer_id=self.load_balancer_id,
listener_id=self.listener_id,
l7policy_id=db_l7policy.id), remainder
return None

View File

@ -251,9 +251,14 @@ class ListenersController(base.BaseController):
which controller, if any, should control be passed.
"""
context = pecan.request.context.get('octavia_context')
if listener_id and len(remainder) and (remainder[0] == 'pools' or
remainder[0] == 'l7policies' or
remainder[0] == 'stats'):
is_children = (
listener_id and remainder and (
remainder[0] == 'pools' or (
remainder[0] == 'l7policies' or remainder[0] == 'stats'
)
)
)
if is_children:
controller = remainder[0]
remainder = remainder[1:]
db_listener = self.repositories.listener.get(
@ -273,3 +278,4 @@ class ListenersController(base.BaseController):
elif controller == 'stats':
return listener_statistics.ListenerStatisticsController(
listener_id=db_listener.id), remainder
return None

View File

@ -271,7 +271,7 @@ class LoadBalancersController(base.BaseController):
context = pecan.request.context.get('octavia_context')
possible_remainder = ('listeners', 'pools', 'delete_cascade', 'stats')
if lb_id and len(remainder) and (remainder[0] in possible_remainder):
if lb_id and remainder and (remainder[0] in possible_remainder):
controller = remainder[0]
remainder = remainder[1:]
db_lb = self.repositories.load_balancer.get(context.session,
@ -291,6 +291,7 @@ class LoadBalancersController(base.BaseController):
elif controller == 'stats':
return lb_stats.LoadBalancerStatisticsController(
loadbalancer_id=db_lb.id), remainder
return None
class LBCascadeDeleteController(LoadBalancersController):

View File

@ -200,7 +200,7 @@ class PoolsController(base.BaseController):
"""Deletes a pool from a load balancer."""
context = pecan.request.context.get('octavia_context')
db_pool = self._get_db_pool(context.session, id)
if len(db_pool.l7policies) > 0:
if db_pool.l7policies:
raise exceptions.PoolInUseByL7Policy(
id=db_pool.id, l7policy_id=db_pool.l7policies[0].id)
self._test_lb_and_listener_statuses(context.session, pool=db_pool)
@ -228,8 +228,12 @@ class PoolsController(base.BaseController):
which controller, if any, should control be passed.
"""
context = pecan.request.context.get('octavia_context')
if pool_id and len(remainder) and (remainder[0] == 'members' or
remainder[0] == 'healthmonitor'):
is_children = (
pool_id and remainder and (
remainder[0] == 'members' or remainder[0] == 'healthmonitor'
)
)
if is_children:
controller = remainder[0]
remainder = remainder[1:]
db_pool = self.repositories.pool.get(context.session, id=pool_id)
@ -247,3 +251,4 @@ class PoolsController(base.BaseController):
load_balancer_id=self.load_balancer_id,
pool_id=db_pool.id,
listener_id=self.listener_id), remainder
return None

View File

@ -81,8 +81,9 @@ class QuotasController(base.BaseController):
@pecan.expose()
def _lookup(self, project_id, *remainder):
"""Overridden pecan _lookup method for routing default endpoint."""
if project_id and len(remainder) and remainder[0] == 'default':
if project_id and remainder and remainder[0] == 'default':
return QuotasDefaultController(project_id), ''
return None
class QuotasDefaultController(base.BaseController):

View File

@ -79,11 +79,12 @@ class AmphoraController(base.BaseController):
Currently it checks if this was a failover request and routes
the request to the FailoverController.
"""
if amphora_id and len(remainder):
if amphora_id and remainder:
controller = remainder[0]
remainder = remainder[1:]
if controller == 'failover':
return FailoverController(amp_id=amphora_id), remainder
return None
class FailoverController(base.BaseController):

View File

@ -298,7 +298,7 @@ class L7PolicyController(base.BaseController):
which controller, if any, should control be passed.
"""
context = pecan.request.context.get('octavia_context')
if l7policy_id and len(remainder) and remainder[0] == 'rules':
if l7policy_id and remainder and remainder[0] == 'rules':
remainder = remainder[1:]
db_l7policy = self.repositories.l7policy.get(
context.session, id=l7policy_id)
@ -308,3 +308,4 @@ class L7PolicyController(base.BaseController):
resource='L7Policy', id=l7policy_id)
return l7rule.L7RuleController(
l7policy_id=db_l7policy.id), remainder
return None

View File

@ -377,8 +377,9 @@ class ListenersController(base.BaseController):
Currently it checks if this was a stats request and routes
the request to the StatsController.
"""
if id and len(remainder) and remainder[0] == 'stats':
if id and remainder and remainder[0] == 'stats':
return StatisticsController(listener_id=id), remainder[1:]
return None
class StatisticsController(base.BaseController, stats.StatsMixin):

View File

@ -535,10 +535,14 @@ class LoadBalancersController(base.BaseController):
'statuses' is aliased here for backward compatibility with
neutron-lbaas LBaaS v2 API.
"""
if id and len(remainder) and (remainder[0] == 'status' or
remainder[0] == 'statuses' or
remainder[0] == 'stats' or
remainder[0] == 'failover'):
is_children = (
id and remainder and (
remainder[0] == 'status' or remainder[0] == 'statuses' or (
remainder[0] == 'stats' or remainder[0] == 'failover'
)
)
)
if is_children:
controller = remainder[0]
remainder = remainder[1:]
if controller == 'status' or controller == 'statuses':
@ -547,6 +551,7 @@ class LoadBalancersController(base.BaseController):
return StatisticsController(lb_id=id), remainder
elif controller == 'failover':
return FailoverController(lb_id=id), remainder
return None
class StatusController(base.BaseController):

View File

@ -306,7 +306,7 @@ class PoolsController(base.BaseController):
"""Deletes a pool from a load balancer."""
context = pecan.request.context.get('octavia_context')
db_pool = self._get_db_pool(context.session, id, show_deleted=False)
if len(db_pool.l7policies) > 0:
if db_pool.l7policies:
raise exceptions.PoolInUseByL7Policy(
id=db_pool.id, l7policy_id=db_pool.l7policies[0].id)
@ -337,7 +337,7 @@ class PoolsController(base.BaseController):
which controller, if any, should control be passed.
"""
context = pecan.request.context.get('octavia_context')
if pool_id and len(remainder) and remainder[0] == 'members':
if pool_id and remainder and remainder[0] == 'members':
remainder = remainder[1:]
db_pool = self.repositories.pool.get(context.session, id=pool_id)
if not db_pool:
@ -346,5 +346,5 @@ class PoolsController(base.BaseController):
id=pool_id)
if remainder:
return member.MemberController(pool_id=db_pool.id), remainder
else:
return member.MembersController(pool_id=db_pool.id), remainder
return member.MembersController(pool_id=db_pool.id), remainder
return None

View File

@ -93,8 +93,9 @@ class QuotasController(base.BaseController):
@pecan.expose()
def _lookup(self, project_id, *remainder):
"""Overridden pecan _lookup method for routing default endpoint."""
if project_id and len(remainder) and remainder[0] == 'default':
if project_id and remainder and remainder[0] == 'default':
return QuotasDefaultController(project_id), ''
return None
class QuotasDefaultController(base.BaseController):

View File

@ -40,6 +40,7 @@ class BarbicanCert(cert.Cert):
if self._cert_container.certificate:
return encodeutils.to_utf8(
self._cert_container.certificate.payload)
return None
def get_intermediates(self):
if self._cert_container.intermediates:
@ -47,16 +48,19 @@ class BarbicanCert(cert.Cert):
self._cert_container.intermediates.payload)
return [imd for imd in cert_parser.get_intermediates_pems(
intermediates)]
return None
def get_private_key(self):
if self._cert_container.private_key:
return encodeutils.to_utf8(
self._cert_container.private_key.payload)
return None
def get_private_key_passphrase(self):
if self._cert_container.private_key_passphrase:
return encodeutils.to_utf8(
self._cert_container.private_key_passphrase.payload)
return None
@six.add_metaclass(abc.ABCMeta)

View File

@ -43,6 +43,7 @@ class PKCS12Cert(cert.Cert):
for ic in self.intermediates
]
return int_data
return None
def get_private_key(self):
return self.private_key.to_cryptography_key().private_bytes(

View File

@ -38,7 +38,7 @@ def get_status(sock_address):
data += x
s.close()
# if get nothing, means has no response
if len(data) == 0:
if not data:
return 1
return 0

View File

@ -389,7 +389,7 @@ class Listener(BaseDataModel):
if self.default_pool is not None:
l7_pool_ids = [p.redirect_pool_id for p in self.l7policies
if p.redirect_pool_id is not None and
len(p.l7rules) > 0 and p.enabled is True]
p.l7rules and p.enabled is True]
old_pool = self.default_pool
if old_pool.id not in l7_pool_ids:
if old_pool in self.pools:
@ -620,7 +620,7 @@ class L7Policy(BaseDataModel):
listener_l7pools = [
p.redirect_pool for p in self.listener.l7policies
if p.redirect_pool is not None and
len(p.l7rules) > 0 and p.enabled is True and
p.l7rules and p.enabled is True and
p.id != self.id]
if pool not in listener_l7pools:
self.listener.pools.remove(pool)
@ -634,7 +634,7 @@ class L7Policy(BaseDataModel):
self.redirect_url = None
pool = self._find_in_graph('Pool' + value)
self.redirect_pool = pool
if len(self.l7rules) > 0 and (self.enabled is True or (
if self.l7rules and (self.enabled is True or (
'enabled' in update_dict.keys() and
update_dict['enabled'] is True)):
if pool not in self.listener.pools:
@ -658,7 +658,7 @@ class L7Policy(BaseDataModel):
if (value is True and self.action ==
constants.L7POLICY_ACTION_REDIRECT_TO_POOL and
self.redirect_pool is not None and
len(self.l7rules) > 0 and
self.l7rules and
self.redirect_pool not in self.listener.pools):
self.listener.pools.append(self.redirect_pool)
self.redirect_pool.listeners.append(self.listener)

View File

@ -38,7 +38,7 @@ class OctaviaException(Exception):
def __init__(self, *args, **kwargs):
try:
if len(args) > 0:
if args:
self.message = args[0]
self.orig_msg = kwargs.get('orig_msg')
self.orig_code = kwargs.get('orig_code')

View File

@ -14,10 +14,11 @@
from keystoneauth1 import loading as ks_loading
from keystonemiddleware import auth_token
from octavia.common import constants
from oslo_config import cfg
from oslo_log import log as logging
from octavia.common import constants
LOG = logging.getLogger(__name__)
_NOAUTH_PATHS = ['/', '/load-balancer/']

View File

@ -70,8 +70,7 @@ def ip_port_str(ip_address, port):
ip = netaddr.IPAddress(ip_address)
if ip.version == 4:
return "{ip}:{port}".format(ip=ip, port=port)
elif ip.version == 6:
return "[{ip}]:{port}".format(ip=ip, port=port)
return "[{ip}]:{port}".format(ip=ip, port=port)
def netmask_to_prefix(netmask):

View File

@ -52,12 +52,14 @@ def url_path(url_path):
try:
p_url = rfc3986.urlparse(rfc3986.normalize_uri(url_path))
if (
invalid_path = (
p_url.scheme or p_url.userinfo or p_url.host or
p_url.port or
p_url.path is None or
not p_url.path.startswith('/')
):
)
if invalid_path:
raise exceptions.InvalidURLPath(url_path=url_path)
except Exception:
raise exceptions.InvalidURLPath(url_path=url_path)
@ -220,7 +222,7 @@ def sanitize_l7policy_api_args(l7policy, create=False):
raise exceptions.InvalidL7PolicyAction(action='None')
# See if we have anything left after that...
if len(l7policy.keys()) == 0:
if not l7policy.keys():
raise exceptions.InvalidL7PolicyArgs(msg='Invalid update options')
return l7policy

View File

@ -33,7 +33,7 @@ LOG = logging.getLogger(__name__)
def wait_done_or_dead(futs, dead, check_timeout=1):
while True:
_done, not_done = futures.wait(futs, timeout=check_timeout)
if len(not_done) == 0:
if not not_done:
break
if dead.is_set():
for fut in not_done:
@ -68,13 +68,12 @@ class HealthManager(object):
if self.lb_repo.set_status_for_failover(lock_session, lb_id,
constants.PENDING_UPDATE):
return True
else:
db_lb = self.lb_repo.get(lock_session, id=lb_id)
prov_status = db_lb.provisioning_status
LOG.warning("Load balancer %(id)s is in immutable state "
"%(state)s. Skipping failover.",
{"state": prov_status, "id": db_lb.id})
return False
db_lb = self.lb_repo.get(lock_session, id=lb_id)
prov_status = db_lb.provisioning_status
LOG.warning("Load balancer %(id)s is in immutable state "
"%(state)s. Skipping failover.",
{"state": prov_status, "id": db_lb.id})
return False
def health_check(self):
stats = {

View File

@ -144,7 +144,7 @@ class PlugNetworks(BaseNetworkTask):
if not delta:
LOG.debug("No network deltas for amphora id: %s", amphora.id)
return None
return
# add nics
for nic in delta.add_nics:
@ -179,7 +179,7 @@ class UnPlugNetworks(BaseNetworkTask):
LOG.debug("Unplug network for amphora")
if not delta:
LOG.debug("No network deltas for amphora id: %s", amphora.id)
return None
return
for nic in delta.delete_nics:
try:

View File

@ -114,7 +114,7 @@ class BaseRepository(object):
model = model.first()
if not model:
return
return None
return model.to_data_model()
@ -246,7 +246,7 @@ class Repositories(object):
self.session_persistence.create(session, **sp_dict)
# If only the session_persistence is being updated, this will be
# empty
if len(pool_dict.keys()) > 0:
if pool_dict:
self.pool.update(session, pool_id, **pool_dict)
return self.pool.get(session, id=pool_id)
@ -355,8 +355,7 @@ class Repositories(object):
if lb_count <= lb_quota or lb_quota == consts.QUOTA_UNLIMITED:
quotas.in_use_load_balancer = lb_count
return False
else:
return True
return True
elif _class == data_models.Listener:
# Decide which quota to use
if quotas.listener is None:
@ -377,8 +376,7 @@ class Repositories(object):
listener_quota == consts.QUOTA_UNLIMITED):
quotas.in_use_listener = listener_count
return False
else:
return True
return True
elif _class == data_models.Pool:
# Decide which quota to use
if quotas.pool is None:
@ -399,8 +397,7 @@ class Repositories(object):
pool_quota == consts.QUOTA_UNLIMITED):
quotas.in_use_pool = pool_count
return False
else:
return True
return True
elif _class == data_models.HealthMonitor:
# Decide which quota to use
if quotas.health_monitor is None:
@ -421,8 +418,7 @@ class Repositories(object):
hm_quota == consts.QUOTA_UNLIMITED):
quotas.in_use_health_monitor = hm_count
return False
else:
return True
return True
elif _class == data_models.Member:
# Decide which quota to use
if quotas.member is None:
@ -443,8 +439,7 @@ class Repositories(object):
member_quota == consts.QUOTA_UNLIMITED):
quotas.in_use_member = member_count
return False
else:
return True
return True
except db_exception.DBDeadlock:
LOG.warning('Quota project lock timed out for project: %(proj)s',
{'proj': project_id})
@ -742,9 +737,8 @@ class LoadBalancerRepository(BaseRepository):
# If a load balancer was never updated use its creation timestamp
last_update = lb.updated_at or lb.created_at
return last_update < timestamp
else:
# Load balancer was just deleted.
return True
# Load balancer was just deleted.
return True
class VipRepository(BaseRepository):
@ -814,8 +808,7 @@ class ListenerRepository(BaseRepository):
max_peer_port = listener.peer_port
if max_peer_port == 0:
return consts.HAPROXY_BASE_PEER_PORT
else:
return max_peer_port + 1
return max_peer_port + 1
def _pool_check(self, session, pool_id, listener_id=None,
lb_id=None):
@ -965,6 +958,7 @@ class AmphoraRepository(BaseRepository):
).first()
if db_lb:
return db_lb.to_data_model()
return None
def get_all_deleted_expiring_amphora(self, session, exp_age=None):

View File

@ -112,6 +112,7 @@ def no_author_tags(physical_line):
if pos < 0:
pos = physical_line.find('author')
return pos, "O322: Don't use author tags"
return None
def assert_equal_true_or_false(logical_line):

View File

@ -94,6 +94,7 @@ class Port(data_models.BaseDataModel):
for fixed_ip in self.fixed_ips:
if fixed_ip.ip_address == fixed_ip_address:
return fixed_ip.subnet_id
return None
class FixedIP(data_models.BaseDataModel):

View File

@ -82,6 +82,7 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
is_correct_interface = False
if is_correct_interface:
return interface
return None
def _plug_amphora_vip(self, amphora, subnet):
# We need a vip port owned by Octavia for Act/Stby and failover
@ -124,11 +125,12 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
sec_grps = self.neutron_client.list_security_groups(name=sec_grp_name)
if sec_grps and sec_grps.get('security_groups'):
return sec_grps.get('security_groups')[0]
return None
def _get_ethertype_for_ip(self, ip):
address = ipaddress.ip_address(
ip if isinstance(ip, six.text_type) else six.u(ip))
return 'IPv6' if address.version is 6 else 'IPv4'
return 'IPv6' if address.version == 6 else 'IPv4'
def _update_security_group_rules(self, load_balancer, sec_grp_id):
rules = self.neutron_client.list_security_group_rules(
@ -276,8 +278,8 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
LOG.warning('Failed to delete security group on first '
'pass: %s', sec_grp_id)
extra_ports = self._get_ports_by_security_group(sec_grp_id)
for port in extra_ports:
port_id = port.get('id')
for extra_port in extra_ports:
port_id = extra_port.get('id')
try:
LOG.warning('Deleting extra port %s on security '
'group %s...', port_id, sec_grp_id)

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_AMPHORA,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_HEALTHMONITOR,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_L7POLICY,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_L7RULE,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_LISTENER,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_LOADBALANCER,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_MEMBER,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_POOL,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_PROVIDER,

View File

@ -11,9 +11,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from octavia.common import constants
from oslo_policy import policy
from octavia.common import constants
rules = [
policy.DocumentedRuleDefault(
'{rbac_obj}{action}'.format(rbac_obj=constants.RBAC_QUOTA,

View File

@ -39,10 +39,10 @@ taskflow>=2.16.0 # Apache-2.0
diskimage-builder!=1.6.0,!=1.7.0,!=1.7.1,>=1.1.2 # Apache-2.0
futures>=3.0.0;python_version=='2.7' or python_version=='2.6' # BSD
castellan>=0.16.0 # Apache-2.0
tenacity # Apache-2.0
tenacity>=4.9.0 # Apache-2.0
#for the amphora api
Flask!=0.11,<1.0,>=0.10 # BSD
Flask!=0.11,>=0.10 # BSD
netifaces>=0.10.4 # MIT
ipaddress>=1.0.17;python_version<'3.3' # PSF
cryptography>=2.1 # BSD/Apache-2.0

View File

@ -9,7 +9,7 @@ mock>=2.0.0 # BSD
python-subunit>=1.0.0 # Apache-2.0/BSD
oslotest>=3.2.0 # Apache-2.0
oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0
pylint==1.4.5 # GPLv2
pylint==1.9.2 # GPLv2
testrepository>=0.0.18 # Apache-2.0/BSD
testtools>=2.2.0 # MIT
testresources>=2.0.0 # Apache-2.0/BSD

View File

@ -48,7 +48,7 @@ run_pylint () {
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}
pylint --max-nested-blocks 7 --extension-pkg-whitelist netifaces --rcfile=.pylintrc --output-format=colorized ${files}
else
echo "No python changes in this commit, pylint check not required."
exit 0

14
tox.ini
View File

@ -17,6 +17,7 @@ commands =
stestr slowest
[testenv:api-ref]
basepython = python3
# This environment is called from CI scripts to test and publish
# the API Ref to developer.openstack.org.
deps =
@ -29,6 +30,7 @@ commands =
sphinx-build -W -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
[testenv:cover]
basepython = python3
whitelist_externals = sh
setenv =
{[testenv]setenv}
@ -52,6 +54,7 @@ basepython = python3.5
setenv = OS_TEST_PATH={toxinidir}/octavia/tests/functional
[testenv:debug]
basepython = python3
commands = oslo_debug_helper {posargs}
[testenv:debug-py27]
@ -63,6 +66,7 @@ basepython = python3.5
commands = oslo_debug_helper {posargs}
[testenv:pep8]
basepython = python3
commands = flake8
# RST linter
doc8 --ignore-path doc/source/contributor/modules specs \
@ -80,6 +84,7 @@ whitelist_externals =
find
[testenv:docs]
basepython = python3
deps =
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
-r{toxinidir}/requirements.txt
@ -91,9 +96,11 @@ commands =
sphinx-build -W -b html api-ref/source api-ref/build/html
[testenv:venv]
basepython = python3
commands = {posargs}
[testenv:genconfig]
basepython = python3
whitelist_externals = mkdir
commands =
mkdir -p etc/octavia
@ -105,6 +112,7 @@ commands =
--namespace keystonemiddleware.auth_token
[testenv:genpolicy]
basepython = python3
whitelist_externals = mkdir
commands =
mkdir -p etc/octavia
@ -113,6 +121,7 @@ commands =
--output-file etc/octavia/json.policy.sample
[testenv:specs]
basepython = python3
whitelist_externals =
rm
find
@ -122,6 +131,7 @@ commands =
[testenv:bandit]
basepython = python3
commands = bandit -r octavia -ll -ii -x octavia/tests {posargs}
[flake8]
@ -145,6 +155,7 @@ local-check-factory = octavia.hacking.checks.factory
max-line-length = 79
[testenv:releasenotes]
basepython = python3
deps =
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
-r{toxinidir}/requirements.txt
@ -157,6 +168,7 @@ commands =
# If you are running the tests locally you should set the env variable
# TEMPEST_CONFIG_DIR=/opt/stack/tempest/etc
[testenv:apiv1]
basepython = python3
passenv = TEMPEST_CONFIG_DIR
setenv =
OS_TEST_PATH={toxinidir}/octavia/tests/tempest/v1/api
@ -167,6 +179,7 @@ commands =
# If you are running the tests locally you should set the env variable
# TEMPEST_CONFIG_DIR=/opt/stack/tempest/etc
[testenv:scenario]
basepython = python3
passenv = TEMPEST_CONFIG_DIR
setenv =
OS_TEST_PATH={toxinidir}/octavia/tests/tempest/v1/scenario
@ -186,6 +199,7 @@ commands =
sh -c 'OS_TEST_PATH={toxinidir}/octavia/tests/functional stestr run {posargs}'
[testenv:requirements]
basepython = python3
deps =
-egit+https://git.openstack.org/openstack/requirements#egg=openstack-requirements
whitelist_externals = sh