VOL-3202: Report UNI port capability as part of port-created RPC

Change-Id: I91a1ac60775fbe0ba1bbab287cb4c8bccc74df2e
diff --git a/python/adapters/brcm_openomci_onu/uni_port.py b/python/adapters/brcm_openomci_onu/uni_port.py
index 7094022..7bab7ca 100644
--- a/python/adapters/brcm_openomci_onu/uni_port.py
+++ b/python/adapters/brcm_openomci_onu/uni_port.py
@@ -16,8 +16,11 @@
 from __future__ import absolute_import
 import structlog
 from enum import Enum
+from pyvoltha.common.utils.nethelpers import mac_str_to_tuple
 from voltha_protos.common_pb2 import OperStatus, AdminState
 from voltha_protos.device_pb2 import Port
+from voltha_protos.openflow_13_pb2 import OFPPF_1GB_FD, OFPPF_FIBER, OFPPS_LINK_DOWN, OFPPS_LIVE, ofp_port
+
 
 class UniType(Enum):
     """
@@ -27,14 +30,17 @@
     VEIP = 'VirtualEthernetInterfacePoint'
     # TODO: Add others as they become supported
 
+
 # ReservedVlan Transparent Vlan (Masked Vlan, VLAN_ANY in ONOS Flows)
 
 RESERVED_TRANSPARENT_VLAN = 4096
 
+
 class UniPort(object):
     """Wraps southbound-port(s) support for ONU"""
 
     def __init__(self, handler, name, uni_id, port_no, ofp_port_no,
+                 parent_port_no, device_serial_number,
                  type=UniType.PPTP):
         self.log = structlog.get_logger(device_id=handler.device_id,
                                         port_no=port_no)
@@ -48,13 +54,15 @@
         self._mac_bridge_port_num = 0
         self._type = type
         self._uni_id = uni_id
+        self._parent_port_no = parent_port_no
+        self._serial_num = device_serial_number
 
         self._admin_state = AdminState.DISABLED
         self._oper_status = OperStatus.DISCOVERED
 
     def __str__(self):
         return "UniPort - name: {}, port_number: {}, admin_state: {}, oper_state: {}, entity_id: {}, " \
-               "mac_bridge_port_num: {}, type: {}, ofp_port: {}"\
+               "mac_bridge_port_num: {}, type: {}, ofp_port: {}" \
             .format(self.name, self.port_number, self.adminstate, self.operstatus, self.entity_id,
                     self._mac_bridge_port_num, self.type, self._ofp_port_no)
 
@@ -62,8 +70,10 @@
         return str(self)
 
     @staticmethod
-    def create(handler, name, uni_id, port_no, ofp_port_no, type):
-        port = UniPort(handler, name, uni_id, port_no, ofp_port_no, type)
+    def create(handler, name, uni_id, port_no, ofp_port_no,
+               parent_port_no, device_serial_number, type):
+        port = UniPort(handler, name, uni_id, port_no, ofp_port_no,
+                       parent_port_no, device_serial_number, type)
         return port
 
     def _start(self):
@@ -124,7 +134,6 @@
         """
         return self._uni_id
 
-
     @property
     def mac_bridge_port_num(self):
         """
@@ -165,18 +174,59 @@
         """
         return self._type
 
+    @property
+    def parent_port_no(self):
+        """
+        Parent port number for this ONU - will be the PON port of the OLT
+        where this ONU is connected
+        """
+        return self._parent_port_no
+
+    @property
+    def serial_number(self):
+        """
+        Serial number of the ONU
+        """
+        return self._serial_num
+
     def get_port(self):
         """
         Get the VOLTHA PORT object for this port
         :return: VOLTHA Port object
         """
+
+        cap = OFPPF_1GB_FD | OFPPF_FIBER
+
+        hw_addr = mac_str_to_tuple('08:%02x:%02x:%02x:%02x:%02x' %
+                                   ((self.parent_port_no >> 8 & 0xff),
+                                    self.parent_port_no & 0xff,
+                                    (self.port_number >> 16) & 0xff,
+                                    (self.port_number >> 8) & 0xff,
+                                    self.port_number & 0xff))
+
+        name = self.serial_number + '-' + str(self.mac_bridge_port_num)
+
+        ofstate = OFPPS_LINK_DOWN
+        if self.operstatus is OperStatus.ACTIVE:
+            ofstate = OFPPS_LIVE
+
         self._port = Port(port_no=self.port_number,
                           label=self.port_id_name(),
                           type=Port.ETHERNET_UNI,
                           admin_state=self._admin_state,
-                          oper_status=self._oper_status)
+                          oper_status=self._oper_status,
+                          ofp_port=ofp_port(
+                              name=name,
+                              hw_addr=hw_addr,
+                              config=0,
+                              state=ofstate,
+                              curr=cap,
+                              advertised=cap,
+                              peer=cap,
+                              curr_speed=OFPPF_1GB_FD,
+                              max_speed=OFPPF_1GB_FD
+                          ))
         return self._port
 
     def port_id_name(self):
         return 'uni-{}'.format(self._port_number)
-