From f593475a6a03a2e9a1b00710a1485cc0550f58cd Mon Sep 17 00:00:00 2001 From: Dima Kuznetsov Date: Mon, 13 Nov 2017 09:03:31 +0200 Subject: [PATCH] Topology: dispatch ovs port events directly This changes discards dynamic handler retrieval in favor of direct method calls. Old code was doing something along the lines of: handler = getattr(self, '_{port_type}_{action}') if handler: # .... Since there aren't that much cases to cover, and the dynamic resolution makes it a bit hard to navigate around the code, this patch removes it in favor of direct approach. Closes-Bug: #1737339 Change-Id: Icbe50c0c74bcfaa89903e18808c3beca616638f8 --- dragonflow/controller/topology.py | 54 +++++++++++++++++++------------ 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/dragonflow/controller/topology.py b/dragonflow/controller/topology.py index 1aa432d2a..91fccb30e 100644 --- a/dragonflow/controller/topology.py +++ b/dragonflow/controller/topology.py @@ -63,26 +63,38 @@ class Topology(object): @return : None """ LOG.info("Ovs port updated: %s", ovs_port) - if orig_ovs_port is None: - action = "added" - else: - action = 'updated' - port_type = ovs_port.type - if port_type not in _OVS_PORT_TYPES: + if ovs_port.type not in _OVS_PORT_TYPES: LOG.info("Unmanaged port online: %s", ovs_port) return - handler_name = '_' + port_type + '_port_' + action - try: - handler = getattr(self, handler_name, None) - if handler is not None: - handler(ovs_port) + if orig_ovs_port is None: + self._handle_ovs_port_added(ovs_port) + else: + self._handle_ovs_port_updated(ovs_port) except Exception: LOG.exception( "Exception occurred when handling port online event") + def _handle_ovs_port_added(self, ovs_port): + port_type = ovs_port.type + if port_type == constants.OVS_VM_INTERFACE: + self._vm_port_added(ovs_port) + elif port_type == constants.OVS_TUNNEL_INTERFACE: + self._tunnel_port_added(ovs_port) + else: + LOG.warning('Invalid port type on %r', ovs_port) + + def _handle_ovs_port_updated(self, ovs_port): + port_type = ovs_port.type + if port_type == constants.OVS_VM_INTERFACE: + self._vm_port_updated(ovs_port) + elif port_type == constants.OVS_TUNNEL_INTERFACE: + self._tunnel_port_updated(ovs_port) + else: + LOG.warning('Invalid port type on %r', ovs_port) + def ovs_port_deleted(self, ovs_port): """ Changes in ovs port status will be monitored by ovsdb monitor thread @@ -92,23 +104,25 @@ class Topology(object): @param ovs_port: @return : None """ - port_type = ovs_port.type - if port_type not in _OVS_PORT_TYPES: + if ovs_port.type not in _OVS_PORT_TYPES: LOG.info("Unmanaged port offline: %s", ovs_port) return - handler_name = '_' + port_type + '_port_deleted' - try: - handler = getattr(self, handler_name, None) - if handler is not None: - handler(ovs_port) - else: - LOG.info("%s is None.", handler_name) + self._handle_ovs_port_deleted(ovs_port) except Exception: LOG.exception("Exception occurred when handling " "ovs port offline event") + def _handle_ovs_port_deleted(self, ovs_port): + port_type = ovs_port.type + if port_type == constants.OVS_VM_INTERFACE: + self._vm_port_deleted(ovs_port) + elif port_type == constants.OVS_TUNNEL_INTERFACE: + self._tunnel_port_deleted(ovs_port) + else: + LOG.warning('Invalid port type on %r', ovs_port) + def _tunnel_port_added(self, ovs_port): self._tunnel_port_updated(ovs_port)