VOL-1153 Remove logical port and port from openolt device on ONU delete

Change-Id: I0a249585099a5564da1cfbd02c264e674b7b14a1
diff --git a/voltha/adapters/openolt/openolt_device.py b/voltha/adapters/openolt/openolt_device.py
index 43bbc75..4af9cc6 100644
--- a/voltha/adapters/openolt/openolt_device.py
+++ b/voltha/adapters/openolt/openolt_device.py
@@ -818,6 +818,29 @@
 
         return port_no, label
 
+    def delete_logical_port(self, child_device_id):
+        logical_ports = self.proxy.get('/logical_devices/{}/ports'.format(
+            self.logical_device_id))
+        for logical_port in logical_ports:
+            if logical_port.device_id == child_device_id:
+                self.log.debug('delete-logical-port',
+                               onu_device_id=child_device_id,
+                               logical_port=logical_port)
+                self.adapter_agent.delete_logical_port(
+                    self.logical_device_id, logical_port)
+                return
+    def delete_port(self, child_serial_number):
+        ports = self.proxy.get('/devices/{}/ports'.format(
+            self.device_id))
+        for port in ports:
+            if port.label == child_serial_number:
+                self.log.debug('delete-port',
+                               onu_serial_number=child_serial_number,
+                               port=port)
+                self.adapter_agent.delete_port(self.device_id, port)
+                return
+
+
     def new_onu_id(self, intf_id):
         onu_id = None
         onu_devices = self.adapter_agent.get_child_devices(self.device_id)
@@ -959,6 +982,19 @@
                        olt_device_id=self.device_id,
                        onu_device=child_device,
                        onu_serial_number=child_device.serial_number)
+        try:
+            self.adapter_agent.delete_child_device(self.device_id,
+                                               child_device.id, child_device)
+        except Exception as e:
+            self.log.error('adapter_agent error', error=e)
+        try:
+            self.delete_logical_port(child_device.id)
+        except Exception as e:
+            self.log.error('logical_port delete error', error=e)
+        try:
+            self.delete_port(child_device.serial_number)
+        except Exception as e:
+            self.log.error('port delete error', error=e)
         vendor_id = child_device.vendor_id.encode('hex')
         vendor_specific = child_device.serial_number.replace(
             child_device.vendor_id, '').encode('hex')
diff --git a/voltha/core/adapter_agent.py b/voltha/core/adapter_agent.py
index e3d05f6..ad38d5a 100644
--- a/voltha/core/adapter_agent.py
+++ b/voltha/core/adapter_agent.py
@@ -409,12 +409,17 @@
     def _del_peer_reference(self, device_id, port):
         me_as_peer = Port.PeerPort(device_id=device_id, port_no=port.port_no)
         for peer in port.peers:
-            peer_port_path = '/devices/{}/ports/{}'.format(
-                peer.device_id, peer.port_no)
-            peer_port = self.root_proxy.get(peer_port_path)
-            if me_as_peer in peer_port.peers:
-                peer_port.peers.remove(me_as_peer)
-            self.root_proxy.update(peer_port_path, peer_port)
+            try:
+                peer_port_path = '/devices/{}/ports/{}'.format(
+                    peer.device_id, peer.port_no)
+                peer_port = self.root_proxy.get(peer_port_path)
+                if me_as_peer in peer_port.peers:
+                    peer_port.peers.remove(me_as_peer)
+                self.root_proxy.update(peer_port_path, peer_port)
+            except Exception:
+                # if the device on the other side was already remove
+                # the key cannot be found under /devices/<device_id>
+                pass
 
     def add_port(self, device_id, port):
         assert isinstance(port, Port)
@@ -820,9 +825,12 @@
             self._make_up_to_date(
                 '/devices', device.id, device)
 
-    def delete_child_device(self, parent_device_id, child_device_id):
-        onu_device = self.root_proxy.get('/devices/{}'.format(child_device_id))
+    def delete_child_device(self, parent_device_id, child_device_id,
+                            onu_device=None):
+        if onu_device is None:
+            onu_device = self.root_proxy.get('/devices/{}'.format(child_device_id))
         if onu_device is not None:
+            assert isinstance(onu_device, Device)
             if onu_device.parent_id == parent_device_id:
                 self.log.debug('deleting-child-device',
                                parent_device_id=parent_device_id,
@@ -831,7 +839,10 @@
                     onu_device.proxy_address)
                 self.event_bus.unsubscribe(self._tx_event_subscriptions[topic])
                 del self._tx_event_subscriptions[topic]
-                self._remove_node('/devices', child_device_id)
+                try:
+                    self._remove_node('/devices', child_device_id)
+                except Exception:
+                    pass
 
     def _gen_rx_proxy_address_topic(self, proxy_address):
         """Generate unique topic name specific to this proxy address for rx"""