VOL-1858 Notify openomci onu device that ports are up

This allows subscribing to port up/down events and reflecting
proper uni link state in the core and onos

Release 2.3.6

Change-Id: If990e7228d2fbab4cbf509f1af5e4a6735b784a6
diff --git a/VERSION b/VERSION
index a2a044c..e75da3e 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.3.6-dev
+2.3.6
diff --git a/pyvoltha/adapters/extensions/omci/onu_device_entry.py b/pyvoltha/adapters/extensions/omci/onu_device_entry.py
index 68a3e04..10d8aac 100644
--- a/pyvoltha/adapters/extensions/omci/onu_device_entry.py
+++ b/pyvoltha/adapters/extensions/omci/onu_device_entry.py
@@ -28,6 +28,7 @@
 from pyvoltha.adapters.extensions.omci.tasks.omci_modify_request import OmciModifyRequest
 from pyvoltha.adapters.extensions.omci.omci_me import OntGFrame
 from pyvoltha.adapters.extensions.omci.state_machines.image_agent import ImageAgent
+from pyvoltha.adapters.extensions.events.device_events.onu.onu_los_event import OnuLosEvent
 
 from twisted.internet import reactor, defer
 from enum import IntEnum
@@ -49,6 +50,7 @@
     MibDatabaseSyncEvent = 1    # MIB database sync changed
     OmciCapabilitiesEvent = 2   # OMCI ME and message type capabilities
     AlarmDatabaseSyncEvent = 3  # Alarm database sync changed
+    PortEvent = 4               # Port link state change
 
     # TODO: Add other events here as needed
 
@@ -641,3 +643,25 @@
     def get_image_download_status(self, image_name):
         return self._image_agent.get_image_status(image_name)
         
+    def raise_onu_event(self, event, active):
+        # Notify any event listeners
+        if isinstance(event, OnuLosEvent):
+            topic = OnuDeviceEntry.event_bus_topic(self.device_id,
+                                                   OnuDeviceEvents.PortEvent)
+            context = event.get_context_data()
+
+            # an active port LOS event (or alarm) means the port is down. using meaningful status for consumers
+            port_status = False
+            if active is False:
+                port_status = True
+
+            msg = {
+                'onu_id': context['onu-id'],
+                'port_number': context['onu-intf-id'],
+                'serial_number': context['onu-serial-number'],
+                'port_status': port_status
+            }
+            self.log.debug('onu-port-event-publish', topic=topic, msg=msg)
+            self.event_bus.publish(topic=topic, msg=msg)
+        else:
+            self.log.warn('unhandled-onu-device-event', classname=event.__class__.__name__)
diff --git a/pyvoltha/adapters/extensions/omci/state_machines/alarm_sync.py b/pyvoltha/adapters/extensions/omci/state_machines/alarm_sync.py
index 364bc58..6efa260 100644
--- a/pyvoltha/adapters/extensions/omci/state_machines/alarm_sync.py
+++ b/pyvoltha/adapters/extensions/omci/state_machines/alarm_sync.py
@@ -533,6 +533,7 @@
             alarm = self.omci_alarm_to_onu_alarm(class_id, entity_id, alarm_number)
             if alarm is not None:
                 alarm.send(True)
+                self._device.raise_onu_event(alarm, active=True)
 
     def clear_alarm(self, class_id, entity_id, alarm_number):
         """
@@ -551,6 +552,7 @@
             alarm = self.omci_alarm_to_onu_alarm(class_id, entity_id, alarm_number)
             if alarm is not None:
                 alarm.send(False)
+                self._device.raise_onu_event(alarm, active=False)
 
     def query_mib(self, class_id=None, instance_id=None):
         """