VOL-1079 Alarms treatment structure

Change-Id: I529e8ad57a4ad134d5fff31f78f91ef37709f7ea
diff --git a/voltha/adapters/openolt/openolt_alarms.py b/voltha/adapters/openolt/openolt_alarms.py
new file mode 100644
index 0000000..576065e
--- /dev/null
+++ b/voltha/adapters/openolt/openolt_alarms.py
@@ -0,0 +1,100 @@
+#
+# Copyright 2018 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+
+class OpenOltAlarmMgr(object):
+    def __init__(self, log):
+        self.log = log
+
+    def process_alarms(self, alarm_ind):
+        self.log.debug('alarm indication', alarm=alarm_ind)
+
+        try:
+
+            if alarm_ind.HasField('los_ind'):
+                self.los_indication(alarm_ind.los_ind)
+            elif alarm_ind.HasField('dying_gasp_ind'):
+                self.dying_gasp_indication(alarm_ind.dying_gasp_ind)
+            elif alarm_ind.HasField('onu_alarm_ind'):
+                self.onu_alarm_indication(alarm_ind.onu_alarm_ind)
+            elif alarm_ind.HasField('onu_startup_fail_ind'):
+                self.onu_startup_failure_indication(
+                    alarm_ind.onu_startup_fail_ind)
+            elif alarm_ind.HasField('onu_signal_degrade_ind'):
+                self.onu_signal_degrade_indication(
+                    alarm_ind.onu_signal_degrade_ind)
+            elif alarm_ind.HasField('onu_drift_of_window_ind'):
+                self.onu_drift_of_window_indication(
+                    alarm_ind.onu_drift_of_window_ind)
+            elif alarm_ind.HasField('onu_loss_omci_ind'):
+                self.onu_loss_omci_indication(alarm_ind.onu_loss_omci_ind)
+            elif alarm_ind.HasField('onu_signals_fail_ind'):
+                self.onu_signals_failure_indication(
+                    alarm_ind.onu_signals_fail_ind)
+            elif alarm_ind.HasField('onu_tiwi_ind'):
+                self.onu_transmission_interference_warning(
+                    alarm_ind.onu_tiwi_ind)
+            elif alarm_ind.HasField('onu_activation_fail_ind'):
+                self.onu_activation_failure_indication(
+                    alarm_ind.onu_activation_fail_ind)
+            elif alarm_ind.HasField('onu_processing_error_ind'):
+                self.onu_processing_error_indication(
+                    alarm_ind.onu_processing_error_ind)
+            else:
+                self.log.warn('unknow alarm type', alarm=alarm_ind)
+
+        except Exception as e:
+            self.log.error('sorting of alarm went wrong', error=e,
+                           alarm=alarm_ind)
+
+    def los_indication(self, los_ind):
+        self.log.debug('los indication received', los_ind=los_ind)
+        try:
+            self.log.info('los indication', intf_id=los_ind.intf_id,
+                          status=los_ind.status)
+        except Exception as e:
+            self.log.error('error parsing los indication', error=e)
+
+    def dying_gasp_indication(self, dying_gasp_ind):
+        self.log.info('not implemented yet')
+
+    def onu_alarm_indication(self, onu_alarm_ind):
+        self.log.info('not implemented yet')
+
+    def onu_startup_failure_indication(self, onu_startup_fail_ind):
+        self.log.info('not implemented yet')
+
+    def onu_signal_degrade_indication(self, onu_signal_degrade_ind):
+        self.log.info('not implemented yet')
+
+    def onu_drift_of_window_indication(self, onu_drift_of_window_ind):
+        self.log.info('not implemented yet')
+
+    def onu_loss_omci_indication(self, onu_loss_omci_ind):
+        self.log.info('not implemented yet')
+
+    def onu_signals_failure_indication(self, onu_signals_fail_ind):
+        self.log.info('not implemented yet')
+
+    def onu_transmission_interference_warning(self, onu_tiwi_ind):
+        self.log.info('not implemented yet')
+
+    def onu_activation_failure_indication(self, onu_activation_fail_ind):
+        self.log.info('not implemented yet')
+
+    def onu_processing_error_indication(self, onu_processing_error_ind):
+        self.log.info('not implemented yet')
\ No newline at end of file
diff --git a/voltha/adapters/openolt/openolt_device.py b/voltha/adapters/openolt/openolt_device.py
index 3a6b4d2..23b9503 100644
--- a/voltha/adapters/openolt/openolt_device.py
+++ b/voltha/adapters/openolt/openolt_device.py
@@ -44,6 +44,7 @@
 
 import openolt_platform as platform
 from openolt_flow_mgr import OpenOltFlowMgr, DEFAULT_MGMT_VLAN
+from openolt_alarms import OpenOltAlarmMgr
 
 MAX_HEARTBEAT_MISS = 3
 HEARTBEAT_PERIOD = 1
@@ -132,6 +133,7 @@
         self.stub = openolt_pb2_grpc.OpenoltStub(self.channel)
 
         self.flow_mgr = OpenOltFlowMgr(self.log, self.stub, self.device_id)
+        self.alarm_mgr = OpenOltAlarmMgr(self.log)
 
         # Indications thread plcaholder (started by heartbeat thread)
         self.indications_thread = None
@@ -192,7 +194,8 @@
                     reactor.callFromThread(self.flow_statistics_indication,
                                            ind.flow_stats)
                 elif ind.HasField('alarm_ind'):
-                    self.log.info('alarm indication not handled')
+                    reactor.callFromThread(self.alarm_mgr.process_alarms,
+                                           ind.alarm_ind)
                 else:
                     self.log.warn('unknown indication type')
 
diff --git a/voltha/adapters/openolt/protos/openolt.proto b/voltha/adapters/openolt/protos/openolt.proto
index d5a83f2..56d87f4 100644
--- a/voltha/adapters/openolt/protos/openolt.proto
+++ b/voltha/adapters/openolt/protos/openolt.proto
@@ -83,6 +83,15 @@
     oneof data {
         LosIndication los_ind = 1;
         DyingGaspIndication dying_gasp_ind = 2;
+        OnuAlarmIndication onu_alarm_ind = 3;
+        OnuStartupFailureIndication onu_startup_fail_ind = 4;
+        OnuSignalDegradeIndication onu_signal_degrade_ind = 5;
+        OnuDriftOfWindowIndication onu_drift_of_window_ind = 6;
+        OnuLossOfOmciChannelIndication onu_loss_omci_ind = 7;
+        OnuSignalsFailureIndication onu_signals_fail_ind = 8;
+        OnuTransmissionInterferenceWarning onu_tiwi_ind = 9;
+        OnuActivationFailureIndication onu_activation_fail_ind = 10;
+        OnuProcessingErrorIndication onu_processing_error_ind = 11;
     }
 }
 
@@ -243,4 +252,65 @@
     string status = 3;
 }
 
+message OnuAlarmIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string los_status = 3;
+    string lob_status = 4;
+    string lopc_miss_status = 5;
+    string lopc_mic_error_status = 6;
+}
+
+message OnuStartupFailureIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+}
+
+message OnuSignalDegradeIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+    fixed32 inverse_bit_error_rate = 4;
+}
+
+message OnuDriftOfWindowIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+    fixed32 drift = 4;
+    fixed32 new_eqd = 5;
+}
+
+message OnuLossOfOmciChannelIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+}
+
+message OnuSignalsFailureIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+    fixed32 inverse_bit_error_rate = 4;
+}
+
+message OnuTransmissionInterferenceWarning {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+    string status = 3;
+    fixed32 drift = 4;
+}
+
+message OnuActivationFailureIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+}
+
+message OnuProcessingErrorIndication {
+    fixed32 intf_id = 1;
+    fixed32 onu_id = 2;
+}
+
+
 message Empty {}