VOL-3735 Retrieve port counters using the GetExtValue(SingleGetValue) rpc from the openolt adapter

Change-Id: I195f7c9fdc4b677c333ae9e4bb3547bb95312fdf
diff --git a/internal/pkg/core/openolt.go b/internal/pkg/core/openolt.go
index 49c5675..eebed78 100644
--- a/internal/pkg/core/openolt.go
+++ b/internal/pkg/core/openolt.go
@@ -29,6 +29,7 @@
 	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
+	"github.com/opencord/voltha-protos/v4/go/extension"
 	ic "github.com/opencord/voltha-protos/v4/go/inter_container"
 	"github.com/opencord/voltha-protos/v4/go/openflow_13"
 	"github.com/opencord/voltha-protos/v4/go/voltha"
@@ -376,3 +377,29 @@
 	}
 	return resp, nil
 }
+
+//Single_get_value_request handles get uni status on ONU and ondemand metric on OLT
+func (oo *OpenOLT) Single_get_value_request(ctx context.Context, request extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
+	logger.Infow(ctx, "Single_get_value_request", log.Fields{"request": request})
+
+	errResp := func(status extension.GetValueResponse_Status,
+		reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
+		return &extension.SingleGetValueResponse{
+			Response: &extension.GetValueResponse{
+				Status:    status,
+				ErrReason: reason,
+			},
+		}
+	}
+	if handler := oo.getDeviceHandler(request.TargetId); handler != nil {
+		switch reqType := request.GetRequest().GetRequest().(type) {
+		case *extension.GetValueRequest_OltPortInfo:
+			return handler.getOltPortCounters(ctx, reqType.OltPortInfo), nil
+		default:
+			return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_UNSUPPORTED), nil
+		}
+	}
+
+	logger.Infow(ctx, "Single_get_value_request failed ", log.Fields{"request": request})
+	return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE_ID), nil
+}