VOL-2948: Added PON and NNI information to metrics

Change-Id: I8928dc6a2bb2920d79596fdde0c916817ab27b59
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index 51c2548..878c6db 100644
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -309,6 +309,19 @@
 			"device-id": dh.device.Id,
 			"port-type": portType}, err)
 	}
+	go dh.updateLocalDevice()
+	return nil
+}
+
+func (dh *DeviceHandler) updateLocalDevice() error {
+	dh.lockDevice.Lock()
+	defer dh.lockDevice.Unlock()
+	device, err := dh.coreProxy.GetDevice(context.TODO(), dh.device.Id, dh.device.Id)
+	if err != nil || device == nil {
+		logger.Errorf("device", log.Fields{"device-id": dh.device.Id}, err)
+		return olterrors.NewErrNotFound("device", log.Fields{"device-id": dh.device.Id}, err)
+	}
+	dh.device = device
 	return nil
 }
 
@@ -689,6 +702,7 @@
 			olterrors.NewErrAdapter("read-indications-failure", log.Fields{"device-id": dh.device.Id}, err).Log()
 		}
 	}()
+	go dh.updateLocalDevice()
 	return nil
 }
 
@@ -765,29 +779,36 @@
 func startCollector(dh *DeviceHandler) {
 	logger.Debugf("starting-collector")
 	context := make(map[string]string)
+	freq := dh.metrics.ToPmConfigs().DefaultFreq
 	for {
 		select {
 		case <-dh.stopCollector:
 			logger.Debugw("stopping-collector-for-olt", log.Fields{"deviceID:": dh.deviceID})
 			return
-		default:
-			freq := dh.metrics.ToPmConfigs().DefaultFreq
-			time.Sleep(time.Duration(freq) * time.Second)
+		case <-time.After(time.Duration(freq) * time.Second):
 			context["oltid"] = dh.deviceID
 			context["devicetype"] = dh.deviceType
-			// NNI Stats
-			cmnni := dh.portStats.collectNNIMetrics(uint32(0))
-			logger.Debugf("Collect-NNI-Metrics %v", cmnni)
-			go dh.portStats.publishMetrics("NNIStats", cmnni, uint32(0), context, dh.deviceID)
-			logger.Debugf("publish-nni-metrics")
-			// PON Stats
-			NumPonPORTS := dh.resourceMgr.DevInfo.GetPonPorts()
-			for i := uint32(0); i < NumPonPORTS; i++ {
-				if val, ok := dh.activePorts.Load(i); ok && val == true {
-					cmpon := dh.portStats.collectPONMetrics(i)
-					logger.Debugf("Collect-PON-Metrics %v", cmpon)
-					go dh.portStats.publishMetrics("PONStats", cmpon, i, context, dh.deviceID)
-					logger.Debugf("publish-pon-metrics")
+			ports := make([]*voltha.Port, len(dh.device.Ports))
+			copy(ports, dh.device.Ports)
+
+			for _, port := range ports {
+				// NNI Stats
+				if port.Type == voltha.Port_ETHERNET_NNI {
+					intfID := PortNoToIntfID(port.PortNo, voltha.Port_ETHERNET_NNI)
+					cmnni := dh.portStats.collectNNIMetrics(intfID)
+					logger.Debugw("collect-nni-metrics", log.Fields{"metrics": cmnni})
+					go dh.portStats.publishMetrics(cmnni, port, context, dh.deviceID)
+					logger.Debugw("publish-nni-metrics", log.Fields{"nni-port": port.Label})
+				}
+				// PON Stats
+				if port.Type == voltha.Port_PON_OLT {
+					intfID := PortNoToIntfID(port.PortNo, voltha.Port_PON_OLT)
+					if val, ok := dh.activePorts.Load(intfID); ok && val == true {
+						cmpon := dh.portStats.collectPONMetrics(intfID)
+						logger.Debugw("collect-pon-metrics", log.Fields{"metrics": cmpon})
+						go dh.portStats.publishMetrics(cmpon, port, context, dh.deviceID)
+					}
+					logger.Debugw("publish-pon-metrics", log.Fields{"pon-port": port.Label})
 				}
 			}
 		}