VOL-3851 Migrate bbsim to v0.11.0 of the DMI interface

Change-Id: I0a09be6ba11a264a49d9809f4960856409b9d8ed
diff --git a/internal/bbsim/dmiserver/dmi_api_server.go b/internal/bbsim/dmiserver/dmi_api_server.go
index 272f3c9..fea52a8 100755
--- a/internal/bbsim/dmiserver/dmi_api_server.go
+++ b/internal/bbsim/dmiserver/dmi_api_server.go
@@ -45,6 +45,8 @@
 	metricChannel           chan interface{}
 	eventChannel            chan interface{}
 	kafkaEndpoint           string
+	loggingEndpoint         string
+	loggingProtocol         string
 	mPublisherCancelFunc    context.CancelFunc
 }
 
diff --git a/internal/bbsim/dmiserver/dmi_event_generator.go b/internal/bbsim/dmiserver/dmi_event_generator.go
index b25cb59..6baf0d8 100644
--- a/internal/bbsim/dmiserver/dmi_event_generator.go
+++ b/internal/bbsim/dmiserver/dmi_event_generator.go
@@ -212,7 +212,7 @@
 }
 
 // CreateEvent creates and the passed event if it's valid and sends it to the msg bus
-func (das *DmiAPIServer) CreateEvent(ctx context.Context, evt *bbsim.DmiEvent) (*bbsim.DmiCreateEventResponse, error) {
+func (dms *DmiAPIServer) CreateEvent(ctx context.Context, evt *bbsim.DmiEvent) (*bbsim.DmiCreateEventResponse, error) {
 	retFunc := func(code codes.Code, msg string) (*bbsim.DmiCreateEventResponse, error) {
 		res := &bbsim.DmiCreateEventResponse{}
 		res.StatusCode = int32(code)
diff --git a/internal/bbsim/dmiserver/dmi_events_mgmt.go b/internal/bbsim/dmiserver/dmi_events_mgmt.go
index da1e8ae..03bfd19 100755
--- a/internal/bbsim/dmiserver/dmi_events_mgmt.go
+++ b/internal/bbsim/dmiserver/dmi_events_mgmt.go
@@ -46,7 +46,7 @@
 			Status: dmi.Status_ERROR_STATUS,
 			//TODO reason must be INVALID_PARAMS, currently this is not available in Device Management interface (DMI),
 			// change below reason with type INVALID_PARAMS once DMI is updated
-			Reason: dmi.Reason_UNDEFINED_REASON,
+			Reason: dmi.EventsConfigurationResponse_UNDEFINED_REASON,
 		}, status.Errorf(codes.FailedPrecondition, "request is nil")
 	}
 
diff --git a/internal/bbsim/dmiserver/dmi_hw_mgmt.go b/internal/bbsim/dmiserver/dmi_hw_mgmt.go
index cd0b0e9..5fd068c 100755
--- a/internal/bbsim/dmiserver/dmi_hw_mgmt.go
+++ b/internal/bbsim/dmiserver/dmi_hw_mgmt.go
@@ -279,11 +279,11 @@
 func (dms *DmiAPIServer) StopManagingDevice(ctx context.Context, req *dmi.StopManagingDeviceRequest) (*dmi.StopManagingDeviceResponse, error) {
 	logger.Debugf("StopManagingDevice API invoked")
 	if req == nil {
-		return &dmi.StopManagingDeviceResponse{Status: dmi.Status_ERROR_STATUS, Reason: dmi.Reason_UNKNOWN_DEVICE}, status.Errorf(codes.FailedPrecondition, "request is empty")
+		return &dmi.StopManagingDeviceResponse{Status: dmi.Status_ERROR_STATUS, Reason: dmi.StopManagingDeviceResponse_UNDEFINED_REASON}, status.Errorf(codes.FailedPrecondition, "request is empty")
 	}
 
 	if req.Name == "" {
-		return &dmi.StopManagingDeviceResponse{Status: dmi.Status_ERROR_STATUS, Reason: dmi.Reason_UNKNOWN_DEVICE},
+		return &dmi.StopManagingDeviceResponse{Status: dmi.Status_ERROR_STATUS, Reason: dmi.StopManagingDeviceResponse_UNKNOWN_DEVICE},
 			status.Errorf(codes.InvalidArgument, "'Name' can not be empty in the request")
 	}
 
@@ -329,7 +329,7 @@
 		// Wrong uuid, return error
 		errResponse := &dmi.PhysicalInventoryResponse{
 			Status:    dmi.Status_ERROR_STATUS,
-			Reason:    dmi.Reason_UNKNOWN_DEVICE,
+			Reason:    dmi.PhysicalInventoryResponse_UNKNOWN_DEVICE,
 			Inventory: &dmi.Hardware{},
 		}
 
@@ -397,11 +397,11 @@
 
 func sendGetHWComponentResponse(c *dmi.Component, stream dmi.NativeHWManagementService_GetHWComponentInfoServer) error {
 	apiStatus := dmi.Status_OK_STATUS
-	reason := dmi.Reason_UNDEFINED_REASON
+	reason := dmi.HWComponentInfoGetResponse_UNDEFINED_REASON
 
 	if c == nil {
 		apiStatus = dmi.Status_ERROR_STATUS
-		reason = dmi.Reason_UNKNOWN_DEVICE
+		reason = dmi.HWComponentInfoGetResponse_UNKNOWN_DEVICE
 	}
 
 	response := &dmi.HWComponentInfoGetResponse{
@@ -447,20 +447,65 @@
 }
 
 //SetLoggingEndpoint sets the location to which logs need to be shipped
-func (dms *DmiAPIServer) SetLoggingEndpoint(context.Context, *dmi.SetLoggingEndpointRequest) (*dmi.SetRemoteEndpointResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "rpc SetLoggingEndpoint not implemented")
+func (dms *DmiAPIServer) SetLoggingEndpoint(_ context.Context, request *dmi.SetLoggingEndpointRequest) (*dmi.SetRemoteEndpointResponse, error) {
+	logger.Debugf("SetLoggingEndpoint called with request %+v", request)
+	errRetFunc := func(stat dmi.Status, reason dmi.SetRemoteEndpointResponse_Reason) (*dmi.SetRemoteEndpointResponse, error) {
+		return &dmi.SetRemoteEndpointResponse{
+			Status: stat,
+			Reason: reason,
+		}, status.Errorf(codes.InvalidArgument, "invalid request")
+	}
+
+	//check the validity of the request
+	if request == nil {
+		return errRetFunc(dmi.Status_ERROR_STATUS, dmi.SetRemoteEndpointResponse_UNKNOWN_DEVICE)
+	}
+	if request.LoggingEndpoint == "" {
+		return errRetFunc(dmi.Status_ERROR_STATUS, dmi.SetRemoteEndpointResponse_LOGGING_ENDPOINT_ERROR)
+	}
+	if request.LoggingProtocol == "" {
+		return errRetFunc(dmi.Status_ERROR_STATUS, dmi.SetRemoteEndpointResponse_LOGGING_ENDPOINT_PROTOCOL_ERROR)
+	}
+	if request.DeviceUuid == nil || request.DeviceUuid.Uuid != dms.uuid {
+		return errRetFunc(dmi.Status_ERROR_STATUS, dmi.SetRemoteEndpointResponse_UNKNOWN_DEVICE)
+	}
+
+	dms.loggingEndpoint = request.LoggingEndpoint
+	dms.loggingProtocol = request.LoggingProtocol
+
+	return &dmi.SetRemoteEndpointResponse{
+		Status: dmi.Status_OK_STATUS,
+	}, nil
 }
 
 //GetLoggingEndpoint gets the configured location to which the logs are being shipped
-func (dms *DmiAPIServer) GetLoggingEndpoint(context.Context, *dmi.HardwareID) (*dmi.GetLoggingEndpointResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "rpc GetLoggingEndpoint not implemented")
+func (dms *DmiAPIServer) GetLoggingEndpoint(_ context.Context, request *dmi.HardwareID) (*dmi.GetLoggingEndpointResponse, error) {
+	logger.Debugf("GetLoggingEndpoint called with request %+v", request)
+	if request == nil || request.Uuid == nil || request.Uuid.Uuid == "" {
+		return &dmi.GetLoggingEndpointResponse{
+			Status: dmi.Status_ERROR_STATUS,
+			Reason: dmi.GetLoggingEndpointResponse_UNKNOWN_DEVICE,
+		}, status.Errorf(codes.InvalidArgument, "invalid request")
+	}
+	if request.Uuid.Uuid != dms.uuid {
+		return &dmi.GetLoggingEndpointResponse{
+			Status: dmi.Status_ERROR_STATUS,
+			Reason: dmi.GetLoggingEndpointResponse_UNKNOWN_DEVICE,
+		}, nil
+	}
+
+	return &dmi.GetLoggingEndpointResponse{
+		Status:          dmi.Status_OK_STATUS,
+		LoggingEndpoint: dms.loggingEndpoint,
+		LoggingProtocol: dms.loggingProtocol,
+	}, nil
 }
 
 //SetMsgBusEndpoint sets the location of the Message Bus to which events and metrics are shipped
 func (dms *DmiAPIServer) SetMsgBusEndpoint(ctx context.Context, request *dmi.SetMsgBusEndpointRequest) (*dmi.SetRemoteEndpointResponse, error) {
 	logger.Debugf("SetMsgBusEndpoint() invoked with request: %+v and context: %v", request, ctx)
 	if request == nil || request.MsgbusEndpoint == "" {
-		return &dmi.SetRemoteEndpointResponse{Status: dmi.Status_ERROR_STATUS, Reason: dmi.Reason_KAFKA_ENDPOINT_ERROR},
+		return &dmi.SetRemoteEndpointResponse{Status: dmi.Status_ERROR_STATUS, Reason: dmi.SetRemoteEndpointResponse_MSGBUS_ENDPOINT_ERROR},
 			status.Errorf(codes.FailedPrecondition, "request is nil")
 	}
 	olt := devices.GetOLT()
@@ -482,10 +527,10 @@
 		go DMKafkaPublisher(nCtx, dms.eventChannel, "dm.events")
 	} else {
 		logger.Errorf("Failed to start metric kafka publisher: %v", err)
-		return &dmi.SetRemoteEndpointResponse{Status: dmi.Status_ERROR_STATUS, Reason: dmi.Reason_KAFKA_ENDPOINT_ERROR}, err
+		return &dmi.SetRemoteEndpointResponse{Status: dmi.Status_ERROR_STATUS, Reason: dmi.SetRemoteEndpointResponse_MSGBUS_ENDPOINT_ERROR}, err
 	}
 
-	return &dmi.SetRemoteEndpointResponse{Status: dmi.Status_OK_STATUS, Reason: dmi.Reason_UNDEFINED_REASON}, nil
+	return &dmi.SetRemoteEndpointResponse{Status: dmi.Status_OK_STATUS, Reason: dmi.SetRemoteEndpointResponse_UNDEFINED_REASON}, nil
 }
 
 //GetMsgBusEndpoint gets the configured location to which the events and metrics are being shipped
@@ -494,13 +539,13 @@
 	if dms.kafkaEndpoint != "" {
 		return &dmi.GetMsgBusEndpointResponse{
 			Status:         dmi.Status_OK_STATUS,
-			Reason:         dmi.Reason_UNDEFINED_REASON,
+			Reason:         dmi.GetMsgBusEndpointResponse_UNDEFINED_REASON,
 			MsgbusEndpoint: dms.kafkaEndpoint,
 		}, nil
 	}
 	return &dmi.GetMsgBusEndpointResponse{
 		Status:         dmi.Status_ERROR_STATUS,
-		Reason:         dmi.Reason_KAFKA_ENDPOINT_ERROR,
+		Reason:         dmi.GetMsgBusEndpointResponse_INTERNAL_ERROR,
 		MsgbusEndpoint: "",
 	}, nil
 }
diff --git a/internal/bbsim/dmiserver/dmi_metrics_generator.go b/internal/bbsim/dmiserver/dmi_metrics_generator.go
index 09deace..fd17ea8 100755
--- a/internal/bbsim/dmiserver/dmi_metrics_generator.go
+++ b/internal/bbsim/dmiserver/dmi_metrics_generator.go
@@ -251,8 +251,8 @@
 	met = *updateMetricIDAndMetaData(dmi.MetricNames_METRIC_CPU_USAGE_PERCENTAGE, cpu, apiSrv, &met)
 	met.Value = &dmi.ComponentSensorData{
 		Value:     generateRand(1, 20),
-		Type:      dmi.SensorValueType_SENSOR_VALUE_TYPE_OTHER,
-		Scale:     dmi.SensorValueScale_SENSOR_VALUE_SCALE_UNITS,
+		Type:      dmi.DataValueType_VALUE_TYPE_OTHER,
+		Scale:     dmi.ValueScale_VALUE_SCALE_UNITS,
 		Timestamp: ptypes.TimestampNow(),
 	}
 	return &met
@@ -263,8 +263,8 @@
 	met = *updateMetricIDAndMetaData(dmi.MetricNames_METRIC_FAN_SPEED, fan, apiSrv, &met)
 	met.Value = &dmi.ComponentSensorData{
 		Value:     generateRand(3000, 4000),
-		Type:      dmi.SensorValueType_SENSOR_VALUE_TYPE_RPM,
-		Scale:     dmi.SensorValueScale_SENSOR_VALUE_SCALE_UNITS,
+		Type:      dmi.DataValueType_VALUE_TYPE_RPM,
+		Scale:     dmi.ValueScale_VALUE_SCALE_UNITS,
 		Timestamp: ptypes.TimestampNow(),
 	}
 	return &met
@@ -299,8 +299,8 @@
 	met = *updateMetricIDAndMetaData(dmi.MetricNames_METRIC_RAM_USAGE_PERCENTAGE, ram, apiSrv, &met)
 	met.Value = &dmi.ComponentSensorData{
 		Value:     generateRand(1, 8),
-		Type:      dmi.SensorValueType_SENSOR_VALUE_TYPE_OTHER,
-		Scale:     dmi.SensorValueScale_SENSOR_VALUE_SCALE_GIGA,
+		Type:      dmi.DataValueType_VALUE_TYPE_OTHER,
+		Scale:     dmi.ValueScale_VALUE_SCALE_GIGA,
 		Timestamp: ptypes.TimestampNow(),
 	}
 	return &met
@@ -311,8 +311,8 @@
 	met = *updateMetricIDAndMetaData(dmi.MetricNames_METRIC_DISK_USAGE_PERCENTAGE, disk, apiSrv, &met)
 	met.Value = &dmi.ComponentSensorData{
 		Value:     generateRand(50, 500),
-		Type:      dmi.SensorValueType_SENSOR_VALUE_TYPE_OTHER,
-		Scale:     dmi.SensorValueScale_SENSOR_VALUE_SCALE_GIGA,
+		Type:      dmi.DataValueType_VALUE_TYPE_OTHER,
+		Scale:     dmi.ValueScale_VALUE_SCALE_GIGA,
 		Timestamp: ptypes.TimestampNow(),
 	}
 	return &met
@@ -323,8 +323,8 @@
 	met = *updateMetricIDAndMetaData(dmi.MetricNames_METRIC_INNER_SURROUNDING_TEMP, istemp, apiSrv, &met)
 	met.Value = &dmi.ComponentSensorData{
 		Value:     generateRand(30, 40),
-		Type:      dmi.SensorValueType_SENSOR_VALUE_TYPE_CELSIUS,
-		Scale:     dmi.SensorValueScale_SENSOR_VALUE_SCALE_UNITS,
+		Type:      dmi.DataValueType_VALUE_TYPE_CELSIUS,
+		Scale:     dmi.ValueScale_VALUE_SCALE_UNITS,
 		Timestamp: ptypes.TimestampNow(),
 	}
 	return &met
diff --git a/internal/bbsim/dmiserver/dmi_metrics_mgmt.go b/internal/bbsim/dmiserver/dmi_metrics_mgmt.go
index e23786f..ea7c33e 100755
--- a/internal/bbsim/dmiserver/dmi_metrics_mgmt.go
+++ b/internal/bbsim/dmiserver/dmi_metrics_mgmt.go
@@ -48,7 +48,7 @@
 			Status: dmi.Status_ERROR_STATUS,
 			//TODO reason must be INVALID_PARAMS, currently this is available in Device Management interface (DMI),
 			// change below reason with type INVALID_PARAMS once DMI is updated
-			Reason: dmi.Reason_UNDEFINED_REASON,
+			Reason: dmi.MetricsConfigurationResponse_INVALID_METRIC,
 		}, status.Errorf(codes.FailedPrecondition, "request is nil")
 	}
 
@@ -81,7 +81,7 @@
 			Status: dmi.Status_ERROR_STATUS,
 			//TODO reason must be INVALID_PARAMS, currently this is not available in Device Management interface (DMI),
 			// change below reason with type INVALID_PARAMS once DMI is updated
-			Reason: dmi.Reason_UNDEFINED_REASON,
+			Reason: dmi.GetMetricResponse_INVALID_METRIC,
 			Metric: &dmi.Metric{},
 		}, status.Errorf(codes.FailedPrecondition, "request is nil")
 	}
@@ -89,7 +89,7 @@
 	if dms.root == nil {
 		return &dmi.GetMetricResponse{
 			Status: dmi.Status_ERROR_STATUS,
-			Reason: dmi.Reason_INTERNAL_ERROR,
+			Reason: dmi.GetMetricResponse_INTERNAL_ERROR,
 			Metric: &dmi.Metric{},
 		}, status.Errorf(codes.FailedPrecondition, "Device is not managed, please start managing device to get the metric")
 	}
@@ -97,7 +97,7 @@
 	metric := getMetric(comp, req.GetMetricId())
 	return &dmi.GetMetricResponse{
 		Status: dmi.Status_OK_STATUS,
-		Reason: dmi.Reason_UNDEFINED_REASON,
+		Reason: dmi.GetMetricResponse_UNDEFINED_REASON,
 		Metric: metric,
 	}, nil
 }
diff --git a/internal/bbsim/dmiserver/dmi_sw_mgmt.go b/internal/bbsim/dmiserver/dmi_sw_mgmt.go
index a1186d3..0c89d42 100755
--- a/internal/bbsim/dmiserver/dmi_sw_mgmt.go
+++ b/internal/bbsim/dmiserver/dmi_sw_mgmt.go
@@ -20,6 +20,8 @@
 	"context"
 
 	dmi "github.com/opencord/device-management-interface/go/dmi"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
 )
 
 //GetSoftwareVersion gets the software version information of the Active and Standby images
@@ -28,7 +30,7 @@
 	logger.Debugf("GetSoftwareVersion invoked with for device %+v", req)
 	return &dmi.GetSoftwareVersionInformationResponse{
 		Status: dmi.Status_OK_STATUS,
-		Reason: dmi.Reason_UNDEFINED_REASON,
+		Reason: dmi.GetSoftwareVersionInformationResponse_UNDEFINED_REASON,
 		Info: &dmi.SoftwareVersionInformation{
 			ActiveVersions: []*dmi.ImageVersion{{
 				ImageName: "BBSIM-DUMMY-IMAGE-1",
@@ -89,7 +91,53 @@
 }
 
 // UpdateStartupConfiguration API can be used to let the devices pickup their properitary configuration which they need at startup.
-func (dms *DmiAPIServer) UpdateStartupConfiguration(*dmi.ConfigRequest, dmi.NativeSoftwareManagementService_UpdateStartupConfigurationServer) error {
-	logger.Debugf("UpdateStartupConfiguration invoked")
+func (dms *DmiAPIServer) UpdateStartupConfiguration(request *dmi.ConfigRequest, stream dmi.NativeSoftwareManagementService_UpdateStartupConfigurationServer) error {
+	logger.Debugf("UpdateStartupConfiguration invoked with request %+v", request)
+
+	if request == nil {
+		return status.Errorf(codes.InvalidArgument, "ConfigRequest is nil")
+	}
+
+	if request.DeviceUuid == nil || request.DeviceUuid.Uuid != dms.uuid {
+		if err := stream.Send(&dmi.ConfigResponse{
+			Status: dmi.Status_ERROR_STATUS,
+			Reason: dmi.ConfigResponse_UNKNOWN_DEVICE,
+		}); err != nil {
+			return status.Errorf(codes.Internal, "error sending response to client")
+		}
+		return nil
+	}
+
+	if err := stream.Send(&dmi.ConfigResponse{
+		Status: dmi.Status_OK_STATUS,
+	}); err != nil {
+		return status.Errorf(codes.Internal, "error sending response to client")
+	}
+
 	return nil
 }
+
+// GetStartupConfigurationInfo API is used to return the 'StartUp' config present on the device
+func (dms *DmiAPIServer) GetStartupConfigurationInfo(ctx context.Context, request *dmi.StartupConfigInfoRequest) (*dmi.StartupConfigInfoResponse, error) {
+	logger.Debugf("GetStartupConfigurationInfo invoked for device %s", request.DeviceUuid.String())
+
+	if request == nil {
+		return nil, status.Errorf(codes.InvalidArgument, "ConfigRequest is nil")
+	}
+
+	if request.DeviceUuid == nil {
+		return nil, status.Errorf(codes.InvalidArgument, "DeviceUuid is nil")
+	}
+
+	if request.DeviceUuid.Uuid != dms.uuid {
+		return &dmi.StartupConfigInfoResponse{
+			Status: dmi.Status_ERROR_STATUS,
+			Reason: dmi.StartupConfigInfoResponse_UNKNOWN_DEVICE,
+		}, status.Errorf(codes.InvalidArgument, "device-uuid %s not found", request.DeviceUuid.Uuid)
+	}
+
+	return &dmi.StartupConfigInfoResponse{
+		Status:  dmi.Status_OK_STATUS,
+		Version: "BBSIM-STARTUP-CONFIG-DUMMY-VERSION",
+	}, nil
+}