[VOL-1034] This commit consists of:
1) Implement PM collections from the ONU
2) Update the Registration method to include for the adapter type
and its supported device types.

Change-Id: Id984468546328b6ebf2ca47578675c69b2b66f01
diff --git a/adapters/ponsim_olt/main.py b/adapters/ponsim_olt/main.py
index c9ad9d0..569e284 100755
--- a/adapters/ponsim_olt/main.py
+++ b/adapters/ponsim_olt/main.py
@@ -44,7 +44,7 @@
 from adapters.kafka.kafka_proxy import KafkaProxy, get_kafka_proxy
 from adapters.ponsim_olt.ponsim_olt import PonSimOltAdapter
 from adapters.protos import third_party
-from adapters.protos.adapter_pb2 import AdapterConfig, Adapter
+from adapters.protos.adapter_pb2 import AdapterConfig
 
 _ = third_party
 
@@ -284,6 +284,7 @@
         if not args.no_banner:
             print_banner(self.log)
 
+        self.adapter = None
         # Create a unique instance id using the passed-in instance id and
         # UTC timestamp
         current_time = arrow.utcnow().timestamp
@@ -366,10 +367,11 @@
                 core_topic=self.core_topic,
                 my_listening_topic=self.listening_topic)
 
-            ponsim_olt_adapter = PonSimOltAdapter(
-                core_proxy=self.core_proxy, adapter_proxy=self.adapter_proxy, config=config)
-            ponsim_request_handler = AdapterRequestFacade(
-                adapter=ponsim_olt_adapter)
+            self.adapter = PonSimOltAdapter(core_proxy=self.core_proxy,
+                                            adapter_proxy=self.adapter_proxy,
+                                            config=config)
+
+            ponsim_request_handler = AdapterRequestFacade(adapter=self.adapter)
 
             yield registry.register(
                 'kafka_adapter_proxy',
@@ -423,15 +425,14 @@
 
     @inlineCallbacks
     def _register_with_core(self, retries):
-        # Send registration to Core with adapter specs
-        adapter = Adapter()
-        adapter.id =  self.args.name
-        adapter.vendor = self.args.name
-        adapter.version = self.ponsim_olt_adapter_version
         while 1:
             try:
-                resp = yield self.core_proxy.register(adapter)
-                self.log.info('registration-response', response=resp)
+                resp = yield self.core_proxy.register(
+                    self.adapter.adapter_descriptor(),
+                    self.adapter.device_types())
+                if resp:
+                    self.log.info('registered-with-core',
+                                  coreId=resp.instance_id)
                 returnValue(resp)
             except TimeOutError as e:
                 self.log.warn("timeout-when-registering-with-core", e=e)
diff --git a/adapters/ponsim_olt/ponsim_olt.py b/adapters/ponsim_olt/ponsim_olt.py
index 88c6b4d..52fb63b 100644
--- a/adapters/ponsim_olt/ponsim_olt.py
+++ b/adapters/ponsim_olt/ponsim_olt.py
@@ -49,7 +49,7 @@
     OFPC_GROUP_STATS, OFPC_PORT_STATS, OFPC_TABLE_STATS, OFPC_FLOW_STATS, \
     ofp_switch_features, ofp_desc
 from adapters.protos.openflow_13_pb2 import ofp_port
-from adapters.protos.ponsim_pb2 import FlowTable, PonSimFrame
+from adapters.protos.ponsim_pb2 import FlowTable, PonSimFrame, PonSimMetricsRequest
 
 _ = third_party
 log = structlog.get_logger()
@@ -454,7 +454,7 @@
                     res = stub.UpdateFlowTable(f)
                     # Send response back
                     reply = InterAdapterResponseBody()
-                    reply.success = True
+                    reply.status = True
                     self.log.info('sending-response-back', reply=reply)
                     yield self.adapter_proxy.send_inter_adapter_message(
                         msg=reply,
@@ -462,7 +462,27 @@
                         from_adapter=self.adapter.name,
                         to_adapter=request.header.from_topic,
                         to_device_id=request.header.to_device_id,
-                        message_no=request.header.id
+                        message_id=request.header.id
+                    )
+            elif request.header.type == InterAdapterMessageType.METRICS_REQUEST:
+                m = PonSimMetricsRequest()
+                if request.body:
+                    request.body.Unpack(m)
+                    stub = ponsim_pb2.PonSimStub(self.channel)
+                    self.log.info('proxying onu stats request', port=m.port)
+                    res = stub.GetStats(m)
+                    # Send response back
+                    reply = InterAdapterResponseBody()
+                    reply.status = True
+                    reply.body.Pack(res)
+                    self.log.info('sending-response-back', reply=reply)
+                    yield self.adapter_proxy.send_inter_adapter_message(
+                        msg=reply,
+                        type=InterAdapterMessageType.METRICS_RESPONSE,
+                        from_adapter=self.adapter.name,
+                        to_adapter=request.header.from_topic,
+                        to_device_id=request.header.to_device_id,
+                        message_id=request.header.id
                     )
         except Exception as e:
             self.log.exception("error-processing-inter-adapter-message", e=e)
@@ -538,6 +558,8 @@
         self.close_channel()
         self.log.info('disabled-grpc-channel')
 
+        self.stop_kpi_collection()
+
         # TODO:
         # 1) Remove all flows from the device
         # 2) Remove the device from ponsim
@@ -624,7 +646,7 @@
                     }
                 )
 
-                # Step 3: submit directlt to kafka bus
+                # Step 3: submit directly to the kafka bus
                 if kafka_cluster_proxy:
                     if isinstance(kpi_event, Message):
                         kpi_event = dumps(MessageToDict(kpi_event, True, True))