Remove __init__ method from TunnelCallback mixin

Removed an __init__ method from a mixin class that
made mixing with other classes fragile and inflexible.
This replaces it with an explicit setup method.

This allows the ML2 RPCCallbacks class to correctly
inherit the common RpcCallback class.

Closes-Bug: #1332041
Change-Id: I36cb7dcf57147468f252d61f846b2b28dd77c8ff
This commit is contained in:
Kevin Benton 2014-06-19 00:19:28 -07:00
parent f1f841d772
commit 14ed601ec0
2 changed files with 10 additions and 18 deletions

View File

@ -87,9 +87,9 @@ class TunnelTypeDriver(api.TypeDriver):
class TunnelRpcCallbackMixin(object): class TunnelRpcCallbackMixin(object):
def __init__(self, notifier, type_manager): def setup_tunnel_callback_mixin(self, notifier, type_manager):
self.notifier = notifier self._notifier = notifier
self.type_manager = type_manager self._type_manager = type_manager
def tunnel_sync(self, rpc_context, **kwargs): def tunnel_sync(self, rpc_context, **kwargs):
"""Update new tunnel. """Update new tunnel.
@ -102,14 +102,14 @@ class TunnelRpcCallbackMixin(object):
if not tunnel_type: if not tunnel_type:
msg = _("Network_type value needed by the ML2 plugin") msg = _("Network_type value needed by the ML2 plugin")
raise exc.InvalidInput(error_message=msg) raise exc.InvalidInput(error_message=msg)
driver = self.type_manager.drivers.get(tunnel_type) driver = self._type_manager.drivers.get(tunnel_type)
if driver: if driver:
tunnel = driver.obj.add_endpoint(tunnel_ip) tunnel = driver.obj.add_endpoint(tunnel_ip)
tunnels = driver.obj.get_endpoints() tunnels = driver.obj.get_endpoints()
entry = {'tunnels': tunnels} entry = {'tunnels': tunnels}
# Notify all other listening agents # Notify all other listening agents
self.notifier.tunnel_update(rpc_context, tunnel.ip_address, self._notifier.tunnel_update(rpc_context, tunnel.ip_address,
tunnel_type) tunnel_type)
# Return the list of tunnels IP's to the agent # Return the list of tunnels IP's to the agent
return entry return entry
else: else:

View File

@ -13,8 +13,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from oslo import messaging
from neutron.agent import securitygroups_rpc as sg_rpc from neutron.agent import securitygroups_rpc as sg_rpc
from neutron.common import constants as q_const from neutron.common import constants as q_const
from neutron.common import rpc as n_rpc from neutron.common import rpc as n_rpc
@ -37,7 +35,8 @@ TAP_DEVICE_PREFIX = 'tap'
TAP_DEVICE_PREFIX_LENGTH = 3 TAP_DEVICE_PREFIX_LENGTH = 3
class RpcCallbacks(dhcp_rpc_base.DhcpRpcCallbackMixin, class RpcCallbacks(n_rpc.RpcCallback,
dhcp_rpc_base.DhcpRpcCallbackMixin,
sg_db_rpc.SecurityGroupServerRpcCallbackMixin, sg_db_rpc.SecurityGroupServerRpcCallbackMixin,
type_tunnel.TunnelRpcCallbackMixin): type_tunnel.TunnelRpcCallbackMixin):
@ -46,16 +45,9 @@ class RpcCallbacks(dhcp_rpc_base.DhcpRpcCallbackMixin,
# 1.0 Initial version (from openvswitch/linuxbridge) # 1.0 Initial version (from openvswitch/linuxbridge)
# 1.1 Support Security Group RPC # 1.1 Support Security Group RPC
# FIXME(ihrachys): we can't use n_rpc.RpcCallback here due to
# inheritance problems
target = messaging.Target(version=RPC_API_VERSION)
def __init__(self, notifier, type_manager): def __init__(self, notifier, type_manager):
# REVISIT(kmestery): This depends on the first three super classes self.setup_tunnel_callback_mixin(notifier, type_manager)
# not having their own __init__ functions. If an __init__() is added super(RpcCallbacks, self).__init__()
# to one, this could break. Fix this and add a unit test to cover this
# test in H3.
super(RpcCallbacks, self).__init__(notifier, type_manager)
@classmethod @classmethod
def _device_to_port_id(cls, device): def _device_to_port_id(cls, device):