[VOL:3643] support of some OLT device metrics over the Device Management Interface
1. Following metrices are supported :
   METRIC_FAN_SPEED
   METRIC_CPU_USAGE_PERCENTAGE
   METRIC_RAM_USAGE_PERCENTAGE
   METRIC_DISK_USAGE_PERCENTAGE
   METRIC_INNER_SURROUNDING_TEMP
2. Following DMI APIs are implemented:
   ListMetrics
   UpdateMetricsConfiguration
   GetMetric
   SetMsgBusEndpoint
   GetMsgBusEndpoint
3. Updated docs/source/DMI_Server_README.md

Change-Id: I11f988ff972b8a8682012c7aeea88ba61afb82ba
diff --git a/internal/bbsim/dmiserver/dmi_metrics_mgmt.go b/internal/bbsim/dmiserver/dmi_metrics_mgmt.go
old mode 100644
new mode 100755
index 51b5dcc..3f33941
--- a/internal/bbsim/dmiserver/dmi_metrics_mgmt.go
+++ b/internal/bbsim/dmiserver/dmi_metrics_mgmt.go
@@ -19,16 +19,19 @@
 import (
 	"context"
 
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+
 	dmi "github.com/opencord/device-management-interface/go/dmi"
 )
 
 //ListMetrics lists the supported metrics for the passed device.
 func (dms *DmiAPIServer) ListMetrics(ctx context.Context, req *dmi.HardwareID) (*dmi.ListMetricsResponse, error) {
 	logger.Debugf("ListMetrics invoked with request %+v", req)
-	//return empty list of metrics for now
-	metrics := []*dmi.MetricConfig{{}}
+	metrics := getMetricsList()
+
 	return &dmi.ListMetricsResponse{
-		Status: dmi.Status_OK,
+		Status: dmi.Status_OK_STATUS,
 		Reason: 0,
 		Metrics: &dmi.MetricsConfig{
 			Metrics: metrics,
@@ -39,18 +42,50 @@
 //UpdateMetricsConfiguration updates the configuration of the list of metrics in the request
 func (dms *DmiAPIServer) UpdateMetricsConfiguration(ctx context.Context, req *dmi.MetricsConfigurationRequest) (*dmi.MetricsConfigurationResponse, error) {
 	logger.Debugf("UpdateMetricConfiguration invoked with request %+v", req)
+
+	if req == nil || req.Operation == nil {
+		return &dmi.MetricsConfigurationResponse{
+			Status: dmi.Status_UNDEFINED_STATUS,
+			Reason: dmi.Reason_UNDEFINED_REASON,
+		}, status.Errorf(codes.FailedPrecondition, "request is nil")
+	}
+
+	switch x := req.Operation.(type) {
+	case *dmi.MetricsConfigurationRequest_Changes:
+		for _, chMetric := range x.Changes.Metrics {
+			UpdateMetricConfig(chMetric)
+		}
+	case *dmi.MetricsConfigurationRequest_ResetToDefault:
+		logger.Debugf("To be implemented later")
+	case nil:
+		// The field is not set.
+		logger.Debugf("Update request operation type is nil")
+		return &dmi.MetricsConfigurationResponse{
+			Status: dmi.Status_UNDEFINED_STATUS,
+		}, nil
+	}
+
 	return &dmi.MetricsConfigurationResponse{
-		Status: dmi.Status_OK,
+		Status: dmi.Status_OK_STATUS,
 	}, nil
 }
 
 //GetMetric gets the instantenous value of a metric
 func (dms *DmiAPIServer) GetMetric(ctx context.Context, req *dmi.GetMetricRequest) (*dmi.GetMetricResponse, error) {
 	logger.Debugf("GetMetric invoked with request %+v", req)
-	return &dmi.GetMetricResponse{
-		Status: dmi.Status_OK,
-		Reason: dmi.Reason_UNDEFINED_REASON,
-		Metric: &dmi.Metric{},
-	}, nil
 
+	if req == nil || req.GetMetricId() < 0 {
+		return &dmi.GetMetricResponse{
+			Status: dmi.Status_ERROR_STATUS,
+			Reason: dmi.Reason_UNDEFINED_REASON,
+			Metric: &dmi.Metric{},
+		}, status.Errorf(codes.FailedPrecondition, "request is nil")
+	}
+	comp := findComponent(dms.root.Children, req.MetaData.ComponentUuid.Uuid)
+	metric := getMetric(comp, req.GetMetricId())
+	return &dmi.GetMetricResponse{
+		Status: dmi.Status_OK_STATUS,
+		Reason: dmi.Reason_UNDEFINED_REASON,
+		Metric: metric,
+	}, nil
 }