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"""