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
+}