Add Python 3.7 support

In order to support Python 3.7, pylint has to be updated to 2.0.0
minimum. Newer versions of Pylint enforce additional checkers which can
be addressed with some code refactoring rather than silently ignoring
them in pylintrc; except useless-object-inheritance which is required to
be silented so that we stay compatible with Python 2.x.

Story: 2004073
Task: 27434

Change-Id: I52301d763797d619f195bd8a1c32bc47f1e68420
changes/36/635236/17
Carlos Goncalves 4 years ago
parent 2c99d0109c
commit c4faac25de

@ -54,7 +54,8 @@ disable=
too-many-statements,
multiple-statements,
duplicate-except,
keyword-arg-before-vararg
keyword-arg-before-vararg,
useless-object-inheritance
[BASIC]
# Variable names can be 1 to 31 characters long, with lowercase and underscores

@ -57,7 +57,6 @@ class UdpListenerApiServerBase(object):
fail to create.
"""
pass
@abc.abstractmethod
def get_udp_listener_config(self, listener_id):
@ -69,7 +68,6 @@ class UdpListenerApiServerBase(object):
:raises Exception: If the listener is failed to find.
"""
pass
@abc.abstractmethod
def manage_udp_listener(self, listener_id, action):
@ -82,7 +80,6 @@ class UdpListenerApiServerBase(object):
:raises Exception: If the listener is failed to find.
"""
pass
@abc.abstractmethod
def get_all_udp_listeners_status(self):
@ -96,7 +93,6 @@ class UdpListenerApiServerBase(object):
:raises Exception: If the listener pid located directory is not exist
"""
pass
@abc.abstractmethod
def get_udp_listener_status(self, listener_id):
@ -108,7 +104,6 @@ class UdpListenerApiServerBase(object):
:raises Exception: If the listener is failed to find.
"""
pass
@abc.abstractmethod
def delete_udp_listener(self, listener_id):
@ -120,4 +115,3 @@ class UdpListenerApiServerBase(object):
:raises Exception: If unsupport initial system of amphora.
"""
pass

@ -37,14 +37,13 @@ def init_path(listener_id, init_system):
if init_system == consts.INIT_SYSTEMD:
return os.path.join(consts.SYSTEMD_DIR,
'haproxy-{0}.service'.format(listener_id))
elif init_system == consts.INIT_UPSTART:
if init_system == consts.INIT_UPSTART:
return os.path.join(consts.UPSTART_DIR,
'haproxy-{0}.conf'.format(listener_id))
elif init_system == consts.INIT_SYSVINIT:
if init_system == consts.INIT_SYSVINIT:
return os.path.join(consts.SYSVINIT_DIR,
'haproxy-{0}'.format(listener_id))
else:
raise UnknownInitError()
raise UnknownInitError()
def keepalived_lvs_dir():
@ -56,16 +55,15 @@ def keepalived_lvs_init_path(init_system, listener_id):
return os.path.join(consts.SYSTEMD_DIR,
consts.KEEPALIVED_SYSTEMD_PREFIX %
str(listener_id))
elif init_system == consts.INIT_UPSTART:
if init_system == consts.INIT_UPSTART:
return os.path.join(consts.UPSTART_DIR,
consts.KEEPALIVED_UPSTART_PREFIX %
str(listener_id))
elif init_system == consts.INIT_SYSVINIT:
if init_system == consts.INIT_SYSVINIT:
return os.path.join(consts.SYSVINIT_DIR,
consts.KEEPALIVED_SYSVINIT_PREFIX %
str(listener_id))
else:
raise UnknownInitError()
raise UnknownInitError()
def keepalived_backend_check_script_dir():
@ -132,12 +130,11 @@ def keepalived_dir():
def keepalived_init_path(init_system):
if init_system == consts.INIT_SYSTEMD:
return os.path.join(consts.SYSTEMD_DIR, consts.KEEPALIVED_SYSTEMD)
elif init_system == consts.INIT_UPSTART:
if init_system == consts.INIT_UPSTART:
return os.path.join(consts.UPSTART_DIR, consts.KEEPALIVED_UPSTART)
elif init_system == consts.INIT_SYSVINIT:
if init_system == consts.INIT_SYSVINIT:
return os.path.join(consts.SYSVINIT_DIR, consts.KEEPALIVED_SYSVINIT)
else:
raise UnknownInitError()
raise UnknownInitError()
def keepalived_pid_path():
@ -266,6 +263,6 @@ def get_listener_protocol(listener_id):
"""
if os.path.exists(config_path(listener_id)):
return consts.PROTOCOL_TCP
elif os.path.exists(keepalived_lvs_cfg_path(listener_id)):
if os.path.exists(keepalived_lvs_cfg_path(listener_id)):
return consts.PROTOCOL_UDP
return None

@ -24,7 +24,7 @@ LOG = logging.getLogger(__name__)
def round_robin_addr(addrinfo_list):
if len(addrinfo_list) <= 0:
if not addrinfo_list:
return None
addrinfo = addrinfo_list.pop(0)
addrinfo_list.append(addrinfo)

@ -198,7 +198,7 @@ def get_udp_listener_pool_status(listener_id):
ns_name) = get_udp_listener_resource_ipports_nsname(listener_id)
if 'Pool' not in resource_ipport_mapping:
return {}
elif 'Members' not in resource_ipport_mapping:
if 'Members' not in resource_ipport_mapping:
return {'lvs': {
'uuid': resource_ipport_mapping['Pool']['id'],
'status': constants.DOWN,

@ -38,7 +38,6 @@ class AmphoraLoadBalancerDriver(object):
Builds a new configuration, pushes it to the amphora, and reloads
the listener on one amphora.
"""
pass
@abc.abstractmethod
def update(self, listener, vip):
@ -54,7 +53,6 @@ class AmphoraLoadBalancerDriver(object):
At this moment, we just build the basic structure for testing, will
add more function along with the development.
"""
pass
@abc.abstractmethod
def stop(self, listener, vip):
@ -70,7 +68,6 @@ class AmphoraLoadBalancerDriver(object):
At this moment, we just build the basic structure for testing, will
add more function along with the development.
"""
pass
@abc.abstractmethod
def start(self, listener, vip, amphora):
@ -88,7 +85,6 @@ class AmphoraLoadBalancerDriver(object):
At this moment, we just build the basic structure for testing, will
add more function along with the development.
"""
pass
@abc.abstractmethod
def delete(self, listener, vip):
@ -104,7 +100,6 @@ class AmphoraLoadBalancerDriver(object):
At this moment, we just build the basic structure for testing, will
add more function along with the development.
"""
pass
@abc.abstractmethod
def get_info(self, amphora):
@ -121,7 +116,6 @@ class AmphoraLoadBalancerDriver(object):
"packages":{"ha proxy":"1.5"}}
some information might come from querying the amphora
"""
pass
@abc.abstractmethod
def get_diagnostics(self, amphora):
@ -138,7 +132,6 @@ class AmphoraLoadBalancerDriver(object):
are healthy the idea is that those tests are triggered more infrequent
than the health gathering.
"""
pass
@abc.abstractmethod
def finalize_amphora(self, amphora):
@ -154,7 +147,6 @@ class AmphoraLoadBalancerDriver(object):
to accept listeners. Please keep in mind that amphora might be kept in
an offline pool after this call.
"""
pass
def post_vip_plug(self, amphora, load_balancer, amphorae_network_config):
"""Called after network driver has allocated and plugged the VIP
@ -171,7 +163,6 @@ class AmphoraLoadBalancerDriver(object):
This is to do any additional work needed on the amphorae to plug
the vip, such as bring up interfaces.
"""
pass
def post_network_plug(self, amphora, port):
"""Called after amphora added to network
@ -186,7 +177,6 @@ class AmphoraLoadBalancerDriver(object):
access said network. Ex: creating an interface on an amphora for a
neutron network to utilize.
"""
pass
def start_health_check(self, health_mixin):
"""Start health checks.
@ -197,7 +187,6 @@ class AmphoraLoadBalancerDriver(object):
Starts listener process and calls HealthMixin to update
databases information.
"""
pass
def stop_health_check(self):
"""Stop health checks.
@ -205,7 +194,6 @@ class AmphoraLoadBalancerDriver(object):
Stops listener process and calls HealthMixin to update
databases information.
"""
pass
def upload_cert_amp(self, amphora, pem_file):
"""Upload cert info to the amphora.
@ -217,7 +205,6 @@ class AmphoraLoadBalancerDriver(object):
Upload cert file to amphora for Controller Communication.
"""
pass
def update_agent_config(self, amphora, agent_config):
"""Upload and update the amphora agent configuration.
@ -227,7 +214,6 @@ class AmphoraLoadBalancerDriver(object):
:param agent_config: The new amphora agent configuration file.
:type agent_config: string
"""
pass
@six.add_metaclass(abc.ABCMeta)
@ -250,7 +236,6 @@ class HealthMixin(object):
only items whose health has changed need to be submitted
awesome update code
"""
pass
@six.add_metaclass(abc.ABCMeta)
@ -272,7 +257,6 @@ class StatsMixin(object):
elements are named to keep it extsnsible for future versions
awesome update code and code to send to ceilometer
"""
pass
@six.add_metaclass(abc.ABCMeta)
@ -289,7 +273,6 @@ class VRRPDriverMixin(object):
:param loadbalancer: loadbalancer object
"""
pass
@abc.abstractmethod
def stop_vrrp_service(self, loadbalancer):
@ -297,7 +280,6 @@ class VRRPDriverMixin(object):
:param loadbalancer: loadbalancer object
"""
pass
@abc.abstractmethod
def start_vrrp_service(self, loadbalancer):
@ -305,7 +287,6 @@ class VRRPDriverMixin(object):
:param loadbalancer: loadbalancer object
"""
pass
@abc.abstractmethod
def reload_vrrp_service(self, loadbalancer):
@ -313,7 +294,6 @@ class VRRPDriverMixin(object):
:param loadbalancer: loadbalancer object
"""
pass
@abc.abstractmethod
def get_vrrp_interface(self, amphora):
@ -321,4 +301,3 @@ class VRRPDriverMixin(object):
:param amphora: amphora object
"""
pass

@ -74,7 +74,7 @@ class KeepalivedJinjaTemplater(object):
vip = loadbalancer.vip.ip_address
vip_addr = ipaddress.ip_address(
vip if isinstance(vip, six.text_type) else six.u(vip))
vip_ipv6 = True if vip_addr.version == 6 else False
vip_ipv6 = vip_addr.version == 6
# Normalize and validate the VIP subnet CIDR
vip_network_cidr = None

@ -330,7 +330,7 @@ class PaginationHelper(object):
default = PaginationHelper._get_default_column_value(
model_attr.property.columns[0].type)
attr = sa_sql.expression.case(
[(model_attr != None, # noqa: E711
[(model_attr != None, # noqa: E711 # pylint: disable=singleton-comparison
model_attr), ], else_=default)
crit_attrs.append((attr == marker_values[j]))
@ -338,7 +338,7 @@ class PaginationHelper(object):
default = PaginationHelper._get_default_column_value(
model_attr.property.columns[0].type)
attr = sa_sql.expression.case(
[(model_attr != None, # noqa: E711
[(model_attr != None, # noqa: E711 # pylint: disable=singleton-comparison
model_attr), ], else_=default)
this_sort_dir = self.sort_keys[i][1]
if this_sort_dir == constants.DESC:

@ -75,7 +75,7 @@ class URLPathType(wtypes.UserType):
class BaseMeta(wtypes.BaseMeta):
def __new__(mcs, name, bases, dct):
def __new__(cls, name, bases, dct):
def get_tenant_id(self):
tenant_id = getattr(self, '_tenant_id', wtypes.Unset)
# If tenant_id was explicitly set to Unset, return that
@ -101,7 +101,7 @@ class BaseMeta(wtypes.BaseMeta):
get_tenant_id, set_tenant_id)
# This will let us know if tenant_id was explicitly set to Unset
dct['_unset_tenant'] = False
return super(BaseMeta, mcs).__new__(mcs, name, bases, dct)
return super(BaseMeta, cls).__new__(cls, name, bases, dct)
@six.add_metaclass(BaseMeta)

@ -154,8 +154,8 @@ class FlavorProfileController(base.BaseController):
try:
flavorprofile_dict = flavorprofile.to_dict(render_unsets=False)
if flavorprofile_dict:
db_flavor_profile = self.repositories.flavor_profile.update(
lock_session, id, **flavorprofile_dict)
self.repositories.flavor_profile.update(lock_session, id,
**flavorprofile_dict)
lock_session.commit()
except Exception:
with excutils.save_and_reraise_exception():

@ -111,8 +111,8 @@ class FlavorsController(base.BaseController):
try:
flavor_dict = flavor.to_dict(render_unsets=False)
if flavor_dict:
db_flavor = self.repositories.flavor.update(lock_session, id,
**flavor_dict)
self.repositories.flavor.update(lock_session, id,
**flavor_dict)
lock_session.commit()
except Exception:
with excutils.save_and_reraise_exception():

@ -184,7 +184,7 @@ class HealthMonitorController(base.BaseController):
udp_connect_min_interval_health_monitor)
if conf_set < 0:
return
elif request.delay < conf_set:
if request.delay < conf_set:
raise exceptions.ValidationException(detail=_(
"The request delay value %(delay)s should be larger than "
"%(conf_set)s for %(type)s health monitor type.") % {

@ -246,8 +246,8 @@ class ListenersController(base.BaseController):
constraint_list = ['uq_listener_load_balancer_id_protocol_port']
if ['id'] == de.columns:
raise exceptions.IDAlreadyExists()
elif (set(column_list) == set(de.columns) or
set(constraint_list) == set(de.columns)):
if (set(column_list) == set(de.columns) or
set(constraint_list) == set(de.columns)):
raise exceptions.DuplicateListenerEntry(
port=listener_dict.get('protocol_port'))
except odb_exceptions.DBError:

@ -644,11 +644,11 @@ class LoadBalancersController(base.BaseController):
if is_children:
controller = remainder[0]
remainder = remainder[1:]
if controller == 'status' or controller == 'statuses':
if controller in ('status', 'statuses'):
return StatusController(lb_id=id), remainder
elif controller == 'stats':
if controller == 'stats':
return StatisticsController(lb_id=id), remainder
elif controller == 'failover':
if controller == 'failover':
return FailoverController(lb_id=id), remainder
return None

@ -123,8 +123,8 @@ class MemberController(base.BaseController):
constraint_list = ['uq_member_pool_id_address_protocol_port']
if ['id'] == de.columns:
raise exceptions.IDAlreadyExists()
elif (set(column_list) == set(de.columns) or
set(constraint_list) == set(de.columns)):
if (set(column_list) == set(de.columns) or
set(constraint_list) == set(de.columns)):
raise exceptions.DuplicateMemberEntry(
ip_address=member_dict.get('ip_address'),
port=member_dict.get('protocol_port'))

@ -163,11 +163,11 @@ class PoolsController(base.BaseController):
"only accepts: type, persistence_timeout, "
"persistence_granularity.") % (
constants.SESSION_PERSISTENCE_SOURCE_IP))
elif request.session_persistence.cookie_name:
if request.session_persistence.cookie_name:
raise exceptions.ValidationException(detail=_(
"Cookie names are not supported for %s pools.") %
constants.PROTOCOL_UDP)
elif request.session_persistence.type in [
if request.session_persistence.type in [
constants.SESSION_PERSISTENCE_HTTP_COOKIE,
constants.SESSION_PERSISTENCE_APP_COOKIE]:
raise exceptions.ValidationException(detail=_(

@ -25,19 +25,15 @@ class Cert(object):
@abc.abstractmethod
def get_certificate(self):
"""Returns the certificate."""
pass
@abc.abstractmethod
def get_intermediates(self):
"""Returns the intermediate certificates as a list."""
pass
@abc.abstractmethod
def get_private_key(self):
"""Returns the private key for the certificate."""
pass
@abc.abstractmethod
def get_private_key_passphrase(self):
"""Returns the passphrase for the private key."""
pass

@ -42,7 +42,6 @@ class CertGenerator(object):
:return: PEM Encoded Signed certificate
:raises Exception: If certificate signing fails
"""
pass
@abc.abstractmethod
def generate_cert_key_pair(self, cn, validity, bit_length, passphrase):
@ -57,4 +56,3 @@ class CertGenerator(object):
certificate data
:raises Exception: If generation fails
"""
pass

@ -39,10 +39,8 @@ class AmphoraAgent(gunicorn.app.base.BaseApplication):
super(AmphoraAgent, self).__init__()
def load_config(self):
config = dict(
[(key, value) for key, value in self.options.items()
if key in self.cfg.settings and value is not None]
)
config = {key: value for key, value in self.options.items()
if key in self.cfg.settings and value is not None}
for key, value in config.items():
self.cfg.set(key.lower(), value)

@ -96,19 +96,18 @@ class BaseDataModel(object):
'Listener', 'Amphora', 'L7Policy',
'L7Rule']:
return obj.__class__.__name__ + obj.id
elif obj.__class__.__name__ in ['SessionPersistence', 'HealthMonitor']:
if obj.__class__.__name__ in ['SessionPersistence', 'HealthMonitor']:
return obj.__class__.__name__ + obj.pool_id
elif obj.__class__.__name__ in ['ListenerStatistics']:
if obj.__class__.__name__ in ['ListenerStatistics']:
return obj.__class__.__name__ + obj.listener_id + obj.amphora_id
elif obj.__class__.__name__ in ['VRRPGroup', 'Vip']:
if obj.__class__.__name__ in ['VRRPGroup', 'Vip']:
return obj.__class__.__name__ + obj.load_balancer_id
elif obj.__class__.__name__ in ['AmphoraHealth']:
if obj.__class__.__name__ in ['AmphoraHealth']:
return obj.__class__.__name__ + obj.amphora_id
elif obj.__class__.__name__ in ['SNI']:
if obj.__class__.__name__ in ['SNI']:
return (obj.__class__.__name__ +
obj.listener_id + obj.tls_container_id)
else:
raise NotImplementedError
raise NotImplementedError
def _find_in_graph(self, key, _visited_nodes=None):
"""Locates an object with the given unique key in the current
@ -120,26 +119,25 @@ class BaseDataModel(object):
if mykey in _visited_nodes:
# Seen this node already, don't traverse further
return None
elif mykey == key:
if mykey == key:
return self
else:
_visited_nodes.append(mykey)
attr_names = [attr_name for attr_name in dir(self)
if not attr_name.startswith('_')]
for attr_name in attr_names:
attr = getattr(self, attr_name)
if isinstance(attr, BaseDataModel):
result = attr._find_in_graph(
key, _visited_nodes=_visited_nodes)
if result is not None:
return result
elif isinstance(attr, (collections.InstrumentedList, list)):
for item in attr:
if isinstance(item, BaseDataModel):
result = item._find_in_graph(
key, _visited_nodes=_visited_nodes)
if result is not None:
return result
_visited_nodes.append(mykey)
attr_names = [attr_name for attr_name in dir(self)
if not attr_name.startswith('_')]
for attr_name in attr_names:
attr = getattr(self, attr_name)
if isinstance(attr, BaseDataModel):
result = attr._find_in_graph(
key, _visited_nodes=_visited_nodes)
if result is not None:
return result
elif isinstance(attr, (collections.InstrumentedList, list)):
for item in attr:
if isinstance(item, BaseDataModel):
result = item._find_in_graph(
key, _visited_nodes=_visited_nodes)
if result is not None:
return result
# If we are here we didn't find it.
return None

@ -50,7 +50,6 @@ class ComputeBase(object):
:raises ComputeBuildException: if compute failed to build amphora
:returns: UUID of amphora
"""
pass
@abc.abstractmethod
def delete(self, compute_id):
@ -58,7 +57,6 @@ class ComputeBase(object):
:param compute_id: The id of the amphora to delete
"""
pass
@abc.abstractmethod
def status(self, compute_id):
@ -67,7 +65,6 @@ class ComputeBase(object):
:param compute_id: the ID of the desired amphora
:returns: The compute "status" response ("ONLINE" or "OFFLINE")
"""
pass
@abc.abstractmethod
def get_amphora(self, compute_id):
@ -77,7 +74,6 @@ class ComputeBase(object):
:returns: the amphora object
:returns: fault message or None
"""
pass
@abc.abstractmethod
def create_server_group(self, name, policy):
@ -87,7 +83,6 @@ class ComputeBase(object):
:param policy: the policy of the server group
:returns: the server group object
"""
pass
@abc.abstractmethod
def delete_server_group(self, server_group_id):
@ -95,7 +90,6 @@ class ComputeBase(object):
:param server_group_id: the uuid of a server group
"""
pass
@abc.abstractmethod
def attach_network_or_port(self, compute_id, network_id=None,
@ -109,7 +103,6 @@ class ComputeBase(object):
:return: nova interface
:raises: Exception
"""
pass
@abc.abstractmethod
def detach_port(self, compute_id, port_id):
@ -120,7 +113,6 @@ class ComputeBase(object):
:return: None
:raises: Exception
"""
pass
@abc.abstractmethod
def validate_flavor(self, flavor_id):
@ -131,4 +123,3 @@ class ComputeBase(object):
:raises: NotFound
:raises: NotImplementedError
"""
pass

@ -313,71 +313,71 @@ class UpdateHealthDb(update_base.HealthUpdateBase):
# finish processing the status updates from all of the listeners.
potential_offline_pools[pool_id] = db_pool_dict['operating_status']
return lb_status
else:
pool = pools[pool_id]
processed_pools.append(pool_id)
pool = pools[pool_id]
processed_pools.append(pool_id)
# UP = HAProxy backend has working or no servers
if pool.get('status') == constants.UP:
pool_status = constants.ONLINE
# DOWN = HAProxy backend has no working servers
elif pool.get('status') == constants.DOWN:
pool_status = constants.ERROR
lb_status = constants.ERROR
# UP = HAProxy backend has working or no servers
if pool.get('status') == constants.UP:
pool_status = constants.ONLINE
# DOWN = HAProxy backend has no working servers
elif pool.get('status') == constants.DOWN:
pool_status = constants.ERROR
lb_status = constants.ERROR
else:
LOG.warning(('Pool %(pool)s reported status of '
'%(status)s'),
{'pool': pool_id,
'status': pool.get('status')})
# Deal with the members that are reporting from
# the Amphora
members = pool['members']
for member_id in db_pool_dict.get('members', {}):
member_status = None
member_db_status = (
db_pool_dict['members'][member_id]['operating_status'])
if member_id not in members:
if member_db_status != constants.NO_MONITOR:
member_status = constants.OFFLINE
else:
LOG.warning(('Pool %(pool)s reported status of '
'%(status)s'),
{'pool': pool_id,
'status': pool.get('status')})
# Deal with the members that are reporting from
# the Amphora
members = pool['members']
for member_id in db_pool_dict.get('members', {}):
member_status = None
member_db_status = (
db_pool_dict['members'][member_id]['operating_status'])
if member_id not in members:
if member_db_status != constants.NO_MONITOR:
member_status = constants.OFFLINE
status = members[member_id]
# Member status can be "UP" or "UP #/#"
# (transitional)
if status.startswith(constants.UP):
member_status = constants.ONLINE
# Member status can be "DOWN" or "DOWN #/#"
# (transitional)
elif status.startswith(constants.DOWN):
member_status = constants.ERROR
if pool_status == constants.ONLINE:
pool_status = constants.DEGRADED
if lb_status == constants.ONLINE:
lb_status = constants.DEGRADED
elif status == constants.DRAIN:
member_status = constants.DRAINING
elif status == constants.MAINT:
member_status = constants.OFFLINE
elif status == constants.NO_CHECK:
member_status = constants.NO_MONITOR
else:
status = members[member_id]
# Member status can be "UP" or "UP #/#"
# (transitional)
if status.startswith(constants.UP):
member_status = constants.ONLINE
# Member status can be "DOWN" or "DOWN #/#"
# (transitional)
elif status.startswith(constants.DOWN):
member_status = constants.ERROR
if pool_status == constants.ONLINE:
pool_status = constants.DEGRADED
if lb_status == constants.ONLINE:
lb_status = constants.DEGRADED
elif status == constants.DRAIN:
member_status = constants.DRAINING
elif status == constants.MAINT:
member_status = constants.OFFLINE
elif status == constants.NO_CHECK:
member_status = constants.NO_MONITOR
else:
LOG.warning('Member %(mem)s reported '
'status of %(status)s',
{'mem': member_id,
'status': status})
LOG.warning('Member %(mem)s reported '
'status of %(status)s',
{'mem': member_id,
'status': status})
try:
if (member_status is not None and
member_status != member_db_status):
self._update_status(
session, self.member_repo, constants.MEMBER,
member_id, member_status, member_db_status)
except sqlalchemy.orm.exc.NoResultFound:
LOG.error("Member %s is not able to update "
"in DB", member_id)
try:
if (member_status is not None and
member_status != member_db_status):
self._update_status(
session, self.member_repo, constants.MEMBER,
member_id, member_status, member_db_status)
except sqlalchemy.orm.exc.NoResultFound:
LOG.error("Member %s is not able to update "
"in DB", member_id)
try:
if (pool_status is not None and

@ -85,8 +85,6 @@ class ListenersUpdate(BaseAmphoraTask):
for listener in loadbalancer.listeners:
self.task_utils.mark_listener_prov_status_error(listener.id)
return None
class ListenerStop(BaseAmphoraTask):
"""Task to stop the listener on the vip."""
@ -103,8 +101,6 @@ class ListenerStop(BaseAmphoraTask):
self.task_utils.mark_listener_prov_status_error(listener.id)
return None
class ListenerStart(BaseAmphoraTask):
"""Task to start the listener on the vip."""
@ -121,8 +117,6 @@ class ListenerStart(BaseAmphoraTask):
self.task_utils.mark_listener_prov_status_error(listener.id)
return None
class ListenersStart(BaseAmphoraTask):
"""Task to start all listeners on the vip."""
@ -140,8 +134,6 @@ class ListenersStart(BaseAmphoraTask):
for listener in listeners:
self.task_utils.mark_listener_prov_status_error(listener.id)
return None
class ListenerDelete(BaseAmphoraTask):
"""Task to delete the listener on the vip."""

@ -202,7 +202,7 @@ class ComputeActiveWait(BaseComputeTask):
if CONF.haproxy_amphora.build_rate_limit != -1:
self.rate_limit.remove_from_build_req_queue(amphora_id)
return amp
elif amp.status == constants.ERROR:
if amp.status == constants.ERROR:
raise exceptions.ComputeBuildException(fault=fault)
time.sleep(CONF.controller_worker.amp_active_wait_sec)

@ -463,7 +463,6 @@ class DeallocateVIP(BaseNetworkTask):
vip = loadbalancer.vip
vip.load_balancer = loadbalancer
self.network_driver.deallocate_vip(vip)
return
class UpdateVIP(BaseNetworkTask):
@ -612,7 +611,6 @@ class ApplyQos(BaseNetworkTask):
self._apply_qos_on_vrrp_ports(loadbalancer, amps_data, orig_qos_id,
is_revert=True,
request_qos_id=request_qos_id)
return
class ApplyQosAmphora(BaseNetworkTask):
@ -627,13 +625,12 @@ class ApplyQosAmphora(BaseNetworkTask):
except Exception:
if not is_revert:
raise
else:
LOG.warning('Failed to undo qos policy %(qos_id)s '
'on vrrp port: %(port)s from '
'amphorae: %(amp)s',
{'qos_id': request_qos_id,
'port': amp_data.vrrp_port_id,
'amp': [amp.id for amp in amp_data]})
LOG.warning('Failed to undo qos policy %(qos_id)s '
'on vrrp port: %(port)s from '
'amphorae: %(amp)s',
{'qos_id': request_qos_id,
'port': amp_data.vrrp_port_id,
'amp': [amp.id for amp in amp_data]})
def execute(self, loadbalancer, amp_data=None, update_dict=None):
"""Apply qos policy on the vrrp ports which are related with vip."""

@ -33,21 +33,20 @@ class OctaviaBase(models.ModelBase):
'Listener', 'Amphora', 'L7Policy',
'L7Rule', 'Flavor', 'FlavorProfile']:
return obj.__class__.__name__ + obj.id
elif obj.__class__.__name__ in ['SessionPersistence', 'HealthMonitor']:
if obj.__class__.__name__ in ['SessionPersistence', 'HealthMonitor']:
return obj.__class__.__name__ + obj.pool_id
elif obj.__class__.__name__ in ['ListenerStatistics']:
if obj.__class__.__name__ in ['ListenerStatistics']:
return obj.__class__.__name__ + obj.listener_id + obj.amphora_id
elif obj.__class__.__name__ in ['VRRPGroup', 'Vip']:
if obj.__class__.__name__ in ['VRRPGroup', 'Vip']:
return obj.__class__.__name__ + obj.load_balancer_id
elif obj.__class__.__name__ in ['AmphoraHealth']:
if obj.__class__.__name__ in ['AmphoraHealth']:
return obj.__class__.__name__ + obj.amphora_id
elif obj.__class__.__name__ in ['SNI']:
if obj.__class__.__name__ in ['SNI']:
return (obj.__class__.__name__ +
obj.listener_id + obj.tls_container_id)
elif obj.__class__.__name__ in ['Quotas']:
if obj.__class__.__name__ in ['Quotas']:
return obj.__class__.__name__ + obj.project_id
else:
raise NotImplementedError
raise NotImplementedError
def to_data_model(self, _graph_nodes=None):
"""Converts to a data model graph.

@ -411,7 +411,7 @@ class Repositories(object):
quotas.in_use_load_balancer = lb_count
return False
return True
elif _class == data_models.Listener:
if _class == data_models.Listener:
# Decide which quota to use
if quotas.listener is None:
listener_quota = CONF.quotas.default_listener_quota
@ -432,7 +432,7 @@ class Repositories(object):
quotas.in_use_listener = listener_count
return False
return True
elif _class == data_models.Pool:
if _class == data_models.Pool:
# Decide which quota to use
if quotas.pool is None:
pool_quota = CONF.quotas.default_pool_quota
@ -453,7 +453,7 @@ class Repositories(object):
quotas.in_use_pool = pool_count
return False
return True
elif _class == data_models.HealthMonitor:
if _class == data_models.HealthMonitor:
# Decide which quota to use
if quotas.health_monitor is None:
hm_quota = CONF.quotas.default_health_monitor_quota
@ -474,7 +474,7 @@ class Repositories(object):
quotas.in_use_health_monitor = hm_count
return False
return True
elif _class == data_models.Member:
if _class == data_models.Member:
# Decide which quota to use
if quotas.member is None:
member_quota = CONF.quotas.default_member_quota

@ -38,7 +38,6 @@ class DistributorDriver(object):
instantiate one.
The flow must store the generated distibutor ID in the flow.
"""
pass
@abc.abstractmethod
def get_delete_distributor_subflow(self):
@ -52,7 +51,6 @@ class DistributorDriver(object):
(if applicable for the driver) and cleans up any associated database
records.
"""
pass
@abc.abstractmethod
def get_add_vip_subflow(self):
@ -72,7 +70,6 @@ class DistributorDriver(object):
distributor by perfoming the necessary steps to plug the VIP and
configure the distributor to start receiving requests on this VIP.
"""
pass
@abc.abstractmethod
def get_remove_vip_subflow(self):
@ -88,7 +85,6 @@ class DistributorDriver(object):
distributor by reconfiguring the distributor and unplugging the
associated port.
"""
pass
@abc.abstractmethod
def get_register_amphorae_subflow(self):
@ -106,7 +102,6 @@ class DistributorDriver(object):
distributor. Amphora should be ready to receive requests prior to
this call being made.
"""
pass
@abc.abstractmethod
def get_drain_amphorae_subflow(self):
@ -124,7 +119,6 @@ class DistributorDriver(object):
list. Existing connections will continue to pass traffic to the
amphorae in this list.
"""
pass
@abc.abstractmethod
def get_unregister_amphorae_subflow(self):
@ -141,4 +135,3 @@ class DistributorDriver(object):
from the distributor. Amphorae in this list will immediately stop
receiving traffic.
"""
pass

@ -98,7 +98,6 @@ class AbstractNetworkDriver(object):
:return: octavia.common.data_models.VIP
:raises: AllocateVIPException, PortNotFound, SubnetNotFound
"""
pass
@abc.abstractmethod
def deallocate_vip(self, vip):
@ -109,7 +108,6 @@ class AbstractNetworkDriver(object):
:raises: DeallocateVIPException, VIPInUseException,
VIPConfiigurationNotFound
"""
pass
@abc.abstractmethod
def plug_vip(self, load_balancer, vip):
@ -125,7 +123,6 @@ class AbstractNetworkDriver(object):
receive traffic to load balance.
:raises: PlugVIPException, PortNotFound
"""
pass
@abc.abstractmethod
def unplug_vip(self, load_balancer, vip):
@ -139,7 +136,6 @@ class AbstractNetworkDriver(object):
:return: octavia.common.data_models.VIP instance
:raises: UnplugVIPException, PluggedVIPNotFound
"""
pass
@abc.abstractmethod
def plug_network(self, compute_id, network_id, ip_address=None):
@ -166,7 +162,6 @@ class AbstractNetworkDriver(object):
:raises: UnplugNetworkException, AmphoraNotFound, NetworkNotFound,
NetworkException
"""
pass
@abc.abstractmethod
def get_plugged_networks(self, compute_id):
@ -189,7 +184,6 @@ class AbstractNetworkDriver(object):
:raises: MissingVIPSecurityGroup
:return: None
"""
pass
@abc.abstractmethod
def get_network(self, network_id):
@ -199,7 +193,6 @@ class AbstractNetworkDriver(object):
:return: octavia.network.data_models.Network
:raises: NetworkException, NetworkNotFound
"""
pass
@abc.abstractmethod
def get_subnet(self, subnet_id):
@ -209,7 +202,6 @@ class AbstractNetworkDriver(object):
:return: octavia.network.data_models.Subnet
:raises: NetworkException, SubnetNotFound
"""
pass
@abc.abstractmethod
def get_port(self, port_id):
@ -219,7 +211,6 @@ class AbstractNetworkDriver(object):
:return: octavia.network.data_models.Port
:raises: NetworkException, PortNotFound
"""
pass
@abc.abstractmethod
def get_network_by_name(self, network_name):
@ -229,7 +220,6 @@ class AbstractNetworkDriver(object):
:return: octavia.network.data_models.Network
:raises: NetworkException, NetworkNotFound
"""
pass
@abc.abstractmethod
def get_subnet_by_name(self, subnet_name):
@ -239,7 +229,6 @@ class AbstractNetworkDriver(object):
:return: octavia.network.data_models.Subnet
:raises: NetworkException, SubnetNotFound
"""
pass
@abc.abstractmethod
def get_port_by_name(self, port_name):
@ -249,7 +238,6 @@ class AbstractNetworkDriver(object):
:return: octavia.network.data_models.Port
:raises: NetworkException, PortNotFound
"""
pass
@abc.abstractmethod
def get_port_by_net_id_device_id(self, network_id, device_id):
@ -260,7 +248,6 @@ class AbstractNetworkDriver(object):
:return: octavia.network.data_models.Port
:raises: NetworkException, PortNotFound
"""
pass
@abc.abstractmethod
def failover_preparation(self, amphora):
@ -270,7 +257,6 @@ class AbstractNetworkDriver(object):
:return: None
:raises: PortNotFound
"""
pass
@abc.abstractmethod
def plug_port(self, amphora, port):
@ -281,7 +267,6 @@ class AbstractNetworkDriver(object):
:return: None
:raises: PlugNetworkException, AmphoraNotFound, NetworkNotFound
"""
pass
@abc.abstractmethod
def get_network_configs(self, load_balancer, amphora=None):
@ -303,7 +288,6 @@ class AbstractNetworkDriver(object):
keyed off of the amphora id the config is associated with.
:raises: NotFound, NetworkNotFound, SubnetNotFound, PortNotFound
"""
pass
@abc.abstractmethod
def wait_for_port_detach(self, amphora):
@ -318,7 +302,6 @@ class AbstractNetworkDriver(object):
:raises TimeoutException: Port did not detach in interval.
:raises PortNotFound: Port was not found by neutron.
"""
pass
@abc.abstractmethod
def update_vip_sg(self, load_balancer, vip):
@ -327,7 +310,6 @@ class AbstractNetworkDriver(object):
:param load_balancer: Load Balancer to rpepare the VIP for
:param vip: The VIP to plug
"""
pass
@abc.abstractmethod
def plug_aap_port(self, load_balancer, vip, amphora, subnet):
@ -338,7 +320,6 @@ class AbstractNetworkDriver(object):
:param amphora: The amphora to plug the VIP into
:param subnet: The subnet to plug the aap into
"""
pass
@abc.abstractmethod
def unplug_aap_port(self, vip, amphora, subnet):
@ -348,7 +329,6 @@ class AbstractNetworkDriver(object):
:param amphora: The amphora to plug the VIP into
:param subnet: The subnet to plug the aap into
"""
pass
@abc.abstractmethod
def qos_enabled(self):

@ -492,10 +492,9 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
except nova_client_exceptions.NotFound as e:
if 'Instance' in str(e):
raise base.AmphoraNotFound(str(e))
elif 'Network' in str(e):
if 'Network' in str(e):
raise base.NetworkNotFound(str(e))
else:
raise base.PlugNetworkException(str(e))
raise base.PlugNetworkException(str(e))
except Exception:
message = _('Error plugging amphora (compute_id: {compute_id}) '
'into network {network_id}.').format(
@ -568,10 +567,9 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
except nova_client_exceptions.NotFound as e:
if 'Instance' in str(e):
raise base.AmphoraNotFound(str(e))
elif 'Network' in str(e):
if 'Network' in str(e):
raise base.NetworkNotFound(str(e))
else:
raise base.PlugNetworkException(str(e))
raise base.PlugNetworkException(str(e))
except nova_client_exceptions.Conflict:
LOG.info('Port %(portid)s is already plugged, '
'skipping', {'portid': port.id})

@ -204,11 +204,11 @@ class BaseNeutronDriver(base.AbstractNetworkDriver):
if not resource['%ss' % resource_type]:
# no items found
raise neutron_client_exceptions.NotFound()
elif unique_item:
if unique_item:
return conversion_function(resource['%ss' % resource_type][0])
else:
return list(map(conversion_function,
resource['%ss' % resource_type]))
return list(map(conversion_function,
resource['%ss' % resource_type]))
except neutron_client_exceptions.NotFound:
message = _('{resource_type} not found '
'({resource_type} Filters: {filters}.').format(

@ -18,6 +18,7 @@ classifier =
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
[files]
packages =

@ -8,7 +8,8 @@ flake8-import-order==0.12 # LGPLv3
mock>=2.0.0 # BSD