VOL-1267 Support for VEIP UNI Type

Supports both PPTP and VEIP UNI types.  Tested with ALPHA all-in-one onu/rg.
Testing likely requires configuration on the ONU/RG device to create the veip "wan" port.
I have screenshots of the steps needed.

Existing PPTP onu still work as-is.

Change-Id: Icbb05dd3da4dd0d3ccb63b5a8a9bed7afb57d29e
diff --git a/voltha/adapters/brcm_openomci_onu/uni_port.py b/voltha/adapters/brcm_openomci_onu/uni_port.py
index cede99d..a887531 100644
--- a/voltha/adapters/brcm_openomci_onu/uni_port.py
+++ b/voltha/adapters/brcm_openomci_onu/uni_port.py
@@ -14,6 +14,7 @@
 # limitations under the License.
 
 import structlog
+from enum import Enum
 from voltha.protos.common_pb2 import OperStatus, AdminState
 from voltha.protos.device_pb2 import Port
 from voltha.protos.openflow_13_pb2 import OFPPF_10GB_FD
@@ -22,90 +23,73 @@
 from voltha.protos.openflow_13_pb2 import OFPPS_LIVE, OFPPF_FIBER, OFPPS_LINK_DOWN
 from voltha.protos.openflow_13_pb2 import ofp_port
 
+class UniType(Enum):
+    """
+    UNI Types Defined in G.988
+    """
+    PPTP = 'PhysicalPathTerminationPointEthernet'
+    VEIP = 'VirtualEthernetInterfacePoint'
+    # TODO: Add others as they become supported
+
 
 class UniPort(object):
     """Wraps southbound-port(s) support for ONU"""
-    DEFAULT_UNTAGGED_VLAN = 4091
 
-    def __init__(self, handler, name, port_no, ofp_port_no, subscriber_vlan=None,
-                 untagged_vlan=None):
+    def __init__(self, handler, name, port_no, ofp_port_no,
+                 type=UniType.PPTP):
         self.log = structlog.get_logger(device_id=handler.device_id,
                                         port_no=port_no)
-        self.log.debug('function-entry')
         self._enabled = False
         self._handler = handler
         self._name = name
         self._port = None
         self._port_number = port_no
-        self._ofp_port_no = ofp_port_no         # Set at by creator (vENET create)
-        self._logical_port_number = None        # Set at time of logical port creation
-        self._subscriber_vlan = subscriber_vlan
-        self._untagged_vlan = untagged_vlan
-        self._entity_id = None                  # TODO: Use port number from UNI-G entity ID
+        self._ofp_port_no = ofp_port_no
+        self._logical_port_number = None
+        self._entity_id = None
         self._mac_bridge_port_num = 0
+        self._type = type
 
         self._admin_state = AdminState.ENABLED
         self._oper_status = OperStatus.ACTIVE
-        # TODO Add state, stats, alarm reference, ...
-        pass
 
     def __str__(self):
         return "UniPort: {}:{}".format(self.name, self.port_number)
 
     @staticmethod
-    def create(handler, name, port_no, ofp_port_no, subscriber_vlan, untagged_vlan):
-        log = structlog.get_logger(device_id=handler.device_id, name=name)
-        log.debug('function-entry')
-        port = UniPort(handler, name, port_no, ofp_port_no, subscriber_vlan, untagged_vlan)
-
+    def create(handler, name, port_no, ofp_port_no, type):
+        port = UniPort(handler, name, port_no, ofp_port_no, type)
         return port
 
     def _start(self):
-        self.log.debug('function-entry')
         self._cancel_deferred()
-
         self._admin_state = AdminState.ENABLED
         self._oper_status = OperStatus.ACTIVE
-
         self._update_adapter_agent()
-        # TODO: start h/w sync
-        # TODO: Enable the actual physical port?
-        pass
 
     def _stop(self):
-        self.log.debug('function-entry')
         self._cancel_deferred()
-
         self._admin_state = AdminState.DISABLED
         self._oper_status = OperStatus.UNKNOWN
-
         self._update_adapter_agent()
-        # TODO: Disable/power-down the actual physical port?
-        pass
 
     def delete(self):
-        self.log.debug('function-entry')
         self.enabled = False
         self._handler = None
-        # TODO: anything else
 
     def _cancel_deferred(self):
-        self.log.debug('function-entry')
         pass
 
     @property
     def name(self):
-        self.log.debug('function-entry')
         return self._name
 
     @property
     def enabled(self):
-        self.log.debug('function-entry')
         return self._enabled
 
     @enabled.setter
     def enabled(self, value):
-        self.log.debug('function-entry')
         if self._enabled != value:
             self._enabled = value
 
@@ -120,12 +104,10 @@
         Port number used when creating MacBridgePortConfigurationDataFrame port number
         :return: (int) port number
         """
-        self.log.debug('function-entry')
         return self._mac_bridge_port_num
 
     @mac_bridge_port_num.setter
     def mac_bridge_port_num(self, value):
-        self.log.debug('function-entry')
         self._mac_bridge_port_num = value
 
     @property
@@ -134,7 +116,6 @@
         Physical device port number
         :return: (int) port number
         """
-        self.log.debug('function-entry')
         return self._port_number
 
     @property
@@ -142,38 +123,33 @@
         """
         OMCI UNI_G entity ID for port
         """
-        self.log.debug('function-entry')
         return self._entity_id
 
     @entity_id.setter
     def entity_id(self, value):
-        self.log.debug('function-entry')
         assert self._entity_id is None, 'Cannot reset the Entity ID'
         self._entity_id = value
 
     @property
-    def subscriber_vlan(self):
-        """
-        Subscriber vlan assigned to this UNI
-        :return: (int) subscriber vlan
-        """
-        self.log.debug('function-entry')
-        return self._subscriber_vlan
-
-    @property
     def logical_port_number(self):
         """
         Logical device port number (used as OpenFlow port for UNI)
         :return: (int) port number
         """
-        self.log.debug('function-entry')
         return self._logical_port_number
 
+    @property
+    def type(self):
+        """
+        UNI Type used in OMCI messaging
+        :return: (UniType) One of the enumerated types
+        """
+        return self._type
+
     def _update_adapter_agent(self):
         """
         Update the port status and state in the core
         """
-        self.log.debug('function-entry')
         self.log.debug('update-adapter-agent', admin_state=self._admin_state,
                        oper_status=self._oper_status)
 
@@ -194,8 +170,6 @@
         Get the VOLTHA PORT object for this port
         :return: VOLTHA Port object
         """
-        self.log.debug('function-entry')
-
         self._port = Port(port_no=self.port_number,
                           label=self.port_id_name(),
                           type=Port.ETHERNET_UNI,
@@ -206,7 +180,7 @@
     def port_id_name(self):
         return 'uni-{}'.format(self._logical_port_number)
 
-    def add_logical_port(self, openflow_port_no, subscriber_vlan=None,
+    def add_logical_port(self, openflow_port_no,
                          capabilities=OFPPF_10GB_FD | OFPPF_FIBER,
                          speed=OFPPF_10GB_FD):
 
@@ -226,18 +200,12 @@
             self._logical_port_number = None
 
         port_no = openflow_port_no or self._ofp_port_no
-        vlan = subscriber_vlan or self._subscriber_vlan
 
         if self._logical_port_number is None and port_no is not None:
             self._logical_port_number = port_no
-            self._subscriber_vlan = vlan
 
             device = self._handler.adapter_agent.get_device(self._handler.device_id)
 
-            if vlan is not None and device.vlan != vlan:
-                device.vlan = vlan
-                self._handler.adapter_agent.update_device(device)
-
             # leave the ports down until omci mib download has finished.  otherwise flows push before time
             openflow_port = ofp_port(
                 port_no=port_no,
@@ -263,4 +231,3 @@
                                                              device_port_no=self._port_number))
 
             self.log.debug('logical-port', openflow_port=openflow_port)
-            # TODO: Should we use the UNI object 'name' as the id for OpenFlow?