SEBA-207 Generate switch port alarms;
Add kind field to switch port;
Add managementAddress and pull step

Change-Id: I17ec83d3ae9e82c8c3f99151115a35e299ee0d60
diff --git a/xos/synchronizer/event_steps/onos_event.py b/xos/synchronizer/event_steps/onos_event.py
index 27199f2..fcf8e27 100644
--- a/xos/synchronizer/event_steps/onos_event.py
+++ b/xos/synchronizer/event_steps/onos_event.py
@@ -15,9 +15,12 @@
 
 from __future__ import absolute_import
 
+import datetime
 import json
+import time
 from xossynchronizer.event_steps.eventstep import EventStep
 from xosconfig import Config
+from xoskafka import XOSKafkaProducer
 from multistructlog import create_logger
 
 log = create_logger(Config().get('logging'))
@@ -30,6 +33,33 @@
     def __init__(self, *args, **kwargs):
         super(OnosPortEventStep, self).__init__(*args, **kwargs)
 
+    def send_alarm(self, switch, port, value):
+        timestamp = time.mktime(datetime.datetime.strptime(value["timestamp"], "%Y-%m-%dT%H:%M:%S.%fZ").timetuple())
+        state = "RAISED" if port.oper_status == "disabled" else "CLEARED"
+
+        context = {"portId": port.portId,
+                   "portKind": port.kind or "unknown",
+                   "switch.name": switch.name}
+
+        alarm = {"category": "SWITCH",
+                 "reported_ts": time.time(),
+                 "raised_ts": timestamp,
+                 "state": state,
+                 "alarm_type_name": "SWITCH.PORT_LOS",
+                 "severity": "MAJOR",
+                 "resource_id": switch.ofId,
+                 "context": context,
+                 "type": "COMMUNICATION",
+                 "id": "xos.fabricservice.%s.SWITCH_PORT_LOS" % switch.ofId,
+                 "description": "xos.fabricservice.%s - SWITCH PORT LOS Alarm -"
+                                " SWITCH_PORT_LOS - %s" % (switch.ofId, state)}
+
+        topic = "xos.alarms.fabric-service"
+        key = "%s:%s" % (switch.ofId, port.portId)
+        value = json.dumps(alarm, default=lambda o: repr(o))
+
+        XOSKafkaProducer.produce(topic, key, value)
+
     def process_event(self, event):
         value = json.loads(event.value)
 
@@ -58,3 +88,4 @@
         if oper_status != port.oper_status:
             port.oper_status = oper_status
             port.save_changed_fields()
+            self.send_alarm(switch, port, value)