Adds support for BBF WT-385 xPON model:

VOL-151: Framework for OLT PON Configuration Parameters
VOL-152: Framework for ONU Configuration Parameters
VOL-220: Support configuration(Create/Read/Delete) of Channel-Group,
         Channel-Partition, Channel-Pair & Channel-Termination Objects
         for XGS-PON

Change-Id: I992a4e03e6e7b021d7aa9a49a5f8466876c8f07c
diff --git a/ponsim/grpc_server.py b/ponsim/grpc_server.py
index cea0cc4..7ed70d5 100644
--- a/ponsim/grpc_server.py
+++ b/ponsim/grpc_server.py
@@ -23,6 +23,8 @@
     add_PonSimServicer_to_server, PonSimDeviceInfo
 from google.protobuf.empty_pb2 import Empty
 
+from voltha.protos.ponsim_pb2 import XPonSimServicer, add_XPonSimServicer_to_server
+
 _ = third_party
 
 log = structlog.get_logger()
@@ -56,19 +58,39 @@
     def GetStats(self, request, context):
         return self.ponsim.get_stats()
 
+class XPonHandler(XPonSimServicer):
+
+    def __init__(self, thread_pool, x_pon_sim):
+        self.thread_pool = thread_pool
+        self.x_pon_sim = x_pon_sim
+
+    def CreateInterface(self, request, context):
+        self.x_pon_sim.CreateInterface(request)
+        return Empty()
+
+    def UpdateInterface(self, request, context):
+        self.x_pon_sim.UpdateInterface(request)
+        return Empty()
+
+    def RemoveInterface(self, request, context):
+        self.x_pon_sim.RemoveInterface(request)
+        return Empty()
 
 class GrpcServer(object):
 
-    def __init__(self, port, ponsim):
+    def __init__(self, port, ponsim, x_pon_sim):
         self.port = port
         self.thread_pool = futures.ThreadPoolExecutor(max_workers=10)
         self.server = grpc.server(self.thread_pool)
         self.ponsim = ponsim
+        self.x_pon_sim = x_pon_sim
 
     def start(self):
         log.debug('starting')
         handler = FlowUpdateHandler(self.thread_pool, self.ponsim)
         add_PonSimServicer_to_server(handler, self.server)
+        x_pon_handler = XPonHandler(self.thread_pool, self.x_pon_sim)
+        add_XPonSimServicer_to_server(x_pon_handler, self.server)
         self.server.add_insecure_port('[::]:%s' % self.port)
         self.server.start()
         log.info('started')
diff --git a/ponsim/main.py b/ponsim/main.py
index 1b11407..3140afd 100755
--- a/ponsim/main.py
+++ b/ponsim/main.py
@@ -31,6 +31,8 @@
 from ponsim import PonSim
 from realio import RealIo
 
+from ponsim import XPonSim
+
 defs = dict(
     config=os.environ.get('CONFIG', './ponsim.yml'),
     grpc_port=int(os.environ.get('GRPC_PORT', 50060)),
@@ -157,6 +159,7 @@
         # components
         self.io = None
         self.ponsim = None
+        self.x_pon_sim = None
         self.grpc_server = None
 
         self.alarm_config = dict()
@@ -182,7 +185,9 @@
             self.ponsim = PonSim(self.args.onus, self.io.egress, self.alarm_config)
             self.io.register_ponsim(self.ponsim)
 
-            self.grpc_server = GrpcServer(self.args.grpc_port, self.ponsim)
+            self.x_pon_sim = XPonSim()
+
+            self.grpc_server = GrpcServer(self.args.grpc_port, self.ponsim, self.x_pon_sim)
             yield self.grpc_server.start()
 
             self.log.info('started-internal-services')
diff --git a/ponsim/ponsim.py b/ponsim/ponsim.py
index 3adcd4e..619beb1 100644
--- a/ponsim/ponsim.py
+++ b/ponsim/ponsim.py
@@ -471,3 +471,19 @@
         if not isinstance(frame, Packet):
             frame = Ether(frame)
         self.devices[port].ingress(2, frame)
+
+class XPonSim(object):
+    def __init__(self):
+        self.log = structlog.get_logger()
+
+    def CreateInterface(self, request):
+        self.log.info("create-interface-request", interface_type = request.WhichOneof("interface_type"), data = request)
+        return
+
+    def UpdateInterface(self, request):
+        self.log.info("update-interface-request", interface_type = request.WhichOneof("interface_type"), data = request)
+        return
+
+    def RemoveInterface(self, request):
+        self.log.info("remove-interface-request", interface_type = request.WhichOneof("interface_type"), data = request)
+        return