diff --git a/vendor/github.com/opencord/device-management-interface/go/dmi/commons.pb.go b/vendor/github.com/opencord/device-management-interface/go/dmi/commons.pb.go
new file mode 100644
index 0000000..2f90bd5
--- /dev/null
+++ b/vendor/github.com/opencord/device-management-interface/go/dmi/commons.pb.go
@@ -0,0 +1,122 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/commons.proto
+
+package dmi
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type Status int32
+
+const (
+	Status_UNDEFINED_STATUS Status = 0
+	Status_OK               Status = 1
+	Status_ERROR            Status = 2
+)
+
+var Status_name = map[int32]string{
+	0: "UNDEFINED_STATUS",
+	1: "OK",
+	2: "ERROR",
+}
+
+var Status_value = map[string]int32{
+	"UNDEFINED_STATUS": 0,
+	"OK":               1,
+	"ERROR":            2,
+}
+
+func (x Status) String() string {
+	return proto.EnumName(Status_name, int32(x))
+}
+
+func (Status) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_74aedf0dda1205d8, []int{0}
+}
+
+// Reason for the failure of request
+type Reason int32
+
+const (
+	Reason_UNDEFINED_REASON                Reason = 0
+	Reason_UNKNOWN_DEVICE                  Reason = 1
+	Reason_INTERNAL_ERROR                  Reason = 2
+	Reason_WRONG_METRIC                    Reason = 3
+	Reason_WRONG_EVENT                     Reason = 4
+	Reason_LOGGING_ENDPOINT_ERROR          Reason = 5
+	Reason_LOGGING_ENDPOINT_PROTOCOL_ERROR Reason = 6
+	Reason_KAFKA_ENDPOINT_ERROR            Reason = 7
+)
+
+var Reason_name = map[int32]string{
+	0: "UNDEFINED_REASON",
+	1: "UNKNOWN_DEVICE",
+	2: "INTERNAL_ERROR",
+	3: "WRONG_METRIC",
+	4: "WRONG_EVENT",
+	5: "LOGGING_ENDPOINT_ERROR",
+	6: "LOGGING_ENDPOINT_PROTOCOL_ERROR",
+	7: "KAFKA_ENDPOINT_ERROR",
+}
+
+var Reason_value = map[string]int32{
+	"UNDEFINED_REASON":                0,
+	"UNKNOWN_DEVICE":                  1,
+	"INTERNAL_ERROR":                  2,
+	"WRONG_METRIC":                    3,
+	"WRONG_EVENT":                     4,
+	"LOGGING_ENDPOINT_ERROR":          5,
+	"LOGGING_ENDPOINT_PROTOCOL_ERROR": 6,
+	"KAFKA_ENDPOINT_ERROR":            7,
+}
+
+func (x Reason) String() string {
+	return proto.EnumName(Reason_name, int32(x))
+}
+
+func (Reason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_74aedf0dda1205d8, []int{1}
+}
+
+func init() {
+	proto.RegisterEnum("dmi.Status", Status_name, Status_value)
+	proto.RegisterEnum("dmi.Reason", Reason_name, Reason_value)
+}
+
+func init() { proto.RegisterFile("dmi/commons.proto", fileDescriptor_74aedf0dda1205d8) }
+
+var fileDescriptor_74aedf0dda1205d8 = []byte{
+	// 285 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xcd, 0x4e, 0xf2, 0x40,
+	0x18, 0x85, 0xf9, 0xf9, 0xe8, 0x17, 0x5f, 0x8d, 0x8e, 0x13, 0x62, 0x8c, 0x1b, 0x17, 0xee, 0x48,
+	0xa0, 0x31, 0xac, 0x8c, 0xab, 0x4a, 0x07, 0xd2, 0x14, 0xdf, 0x21, 0xd3, 0x01, 0x12, 0x37, 0x4d,
+	0x69, 0x47, 0x9c, 0xc5, 0xcc, 0x10, 0x3a, 0x70, 0x85, 0x5e, 0x98, 0x41, 0x71, 0xa1, 0x6e, 0x9f,
+	0x93, 0xe7, 0x9c, 0xe4, 0xc0, 0x65, 0x65, 0x74, 0x58, 0x3a, 0x63, 0x9c, 0xad, 0x07, 0x9b, 0xad,
+	0xf3, 0x8e, 0xb6, 0x2b, 0xa3, 0x7b, 0xf7, 0x10, 0x64, 0xbe, 0xf0, 0xbb, 0x9a, 0x76, 0x81, 0xcc,
+	0x31, 0x66, 0xe3, 0x04, 0x59, 0x9c, 0x67, 0x32, 0x92, 0xf3, 0x8c, 0x34, 0x68, 0x00, 0x2d, 0x9e,
+	0x92, 0x26, 0x3d, 0x81, 0x0e, 0x13, 0x82, 0x0b, 0xd2, 0xea, 0xbd, 0x37, 0x21, 0x10, 0xaa, 0xa8,
+	0x9d, 0xfd, 0xe9, 0x08, 0x16, 0x65, 0x1c, 0x49, 0x83, 0x52, 0x38, 0x9f, 0x63, 0x8a, 0x7c, 0x89,
+	0x79, 0xcc, 0x16, 0xc9, 0x88, 0x91, 0xe6, 0x81, 0x25, 0x28, 0x99, 0xc0, 0x68, 0x9a, 0x1f, 0x8b,
+	0x28, 0x81, 0xb3, 0xa5, 0xe0, 0x38, 0xc9, 0x9f, 0x99, 0x14, 0xc9, 0x88, 0xb4, 0xe9, 0x05, 0x9c,
+	0x7e, 0x11, 0xb6, 0x60, 0x28, 0xc9, 0x3f, 0x7a, 0x03, 0x57, 0x53, 0x3e, 0x99, 0x24, 0x07, 0x84,
+	0xf1, 0x8c, 0x27, 0x28, 0x8f, 0x7a, 0x87, 0xde, 0xc1, 0xed, 0x9f, 0x6c, 0x26, 0xb8, 0xe4, 0x23,
+	0xfe, 0xbd, 0x11, 0xd0, 0x6b, 0xe8, 0xa6, 0xd1, 0x38, 0x8d, 0x7e, 0xeb, 0xff, 0x9f, 0x1e, 0x5f,
+	0x1e, 0xd6, 0xda, 0xbf, 0xed, 0x56, 0x83, 0xd2, 0x99, 0xd0, 0x6d, 0x94, 0x2d, 0xdd, 0xb6, 0x0a,
+	0x2b, 0xb5, 0xd7, 0xa5, 0xea, 0x9b, 0xc2, 0x16, 0x6b, 0x65, 0x94, 0xf5, 0x7d, 0x6d, 0xbd, 0xda,
+	0xbe, 0x16, 0xa5, 0x0a, 0xf7, 0xc3, 0x70, 0xed, 0xc2, 0xca, 0xe8, 0x55, 0xf0, 0x79, 0xe1, 0xf0,
+	0x23, 0x00, 0x00, 0xff, 0xff, 0x0a, 0x8a, 0xc7, 0x97, 0x57, 0x01, 0x00, 0x00,
+}
diff --git a/vendor/github.com/opencord/device-management-interface/go/dmi/hw.pb.go b/vendor/github.com/opencord/device-management-interface/go/dmi/hw.pb.go
new file mode 100644
index 0000000..9433fdf
--- /dev/null
+++ b/vendor/github.com/opencord/device-management-interface/go/dmi/hw.pb.go
@@ -0,0 +1,1211 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/hw.proto
+
+package dmi
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type ComponentType int32
+
+const (
+	ComponentType_COMPONENT_TYPE_UNDEFINED           ComponentType = 0
+	ComponentType_COMPONENT_TYPE_UNKNOWN             ComponentType = 1
+	ComponentType_COMPONENT_TYPE_CHASSIS             ComponentType = 2
+	ComponentType_COMPONENT_TYPE_BACKPLANE           ComponentType = 3
+	ComponentType_COMPONENT_TYPE_CONTAINER           ComponentType = 4
+	ComponentType_COMPONENT_TYPE_POWER_SUPPLY        ComponentType = 5
+	ComponentType_COMPONENT_TYPE_FAN                 ComponentType = 6
+	ComponentType_COMPONENT_TYPE_SENSOR              ComponentType = 7
+	ComponentType_COMPONENT_TYPE_MODULE              ComponentType = 8
+	ComponentType_COMPONENT_TYPE_PORT                ComponentType = 9
+	ComponentType_COMPONENT_TYPE_CPU                 ComponentType = 10
+	ComponentType_COMPONENT_TYPE_BATTERY             ComponentType = 11
+	ComponentType_COMPONENT_TYPE_STORAGE             ComponentType = 12
+	ComponentType_COMPONENT_TYPE_MEMORY              ComponentType = 13
+	ComponentType_COMPONENT_TYPE_TRANSCEIVER         ComponentType = 14
+	ComponentType_COMPONENT_TYPE_GPON_TRANSCEIVER    ComponentType = 15
+	ComponentType_COMPONENT_TYPE_XGS_PON_TRANSCEIVER ComponentType = 16
+)
+
+var ComponentType_name = map[int32]string{
+	0:  "COMPONENT_TYPE_UNDEFINED",
+	1:  "COMPONENT_TYPE_UNKNOWN",
+	2:  "COMPONENT_TYPE_CHASSIS",
+	3:  "COMPONENT_TYPE_BACKPLANE",
+	4:  "COMPONENT_TYPE_CONTAINER",
+	5:  "COMPONENT_TYPE_POWER_SUPPLY",
+	6:  "COMPONENT_TYPE_FAN",
+	7:  "COMPONENT_TYPE_SENSOR",
+	8:  "COMPONENT_TYPE_MODULE",
+	9:  "COMPONENT_TYPE_PORT",
+	10: "COMPONENT_TYPE_CPU",
+	11: "COMPONENT_TYPE_BATTERY",
+	12: "COMPONENT_TYPE_STORAGE",
+	13: "COMPONENT_TYPE_MEMORY",
+	14: "COMPONENT_TYPE_TRANSCEIVER",
+	15: "COMPONENT_TYPE_GPON_TRANSCEIVER",
+	16: "COMPONENT_TYPE_XGS_PON_TRANSCEIVER",
+}
+
+var ComponentType_value = map[string]int32{
+	"COMPONENT_TYPE_UNDEFINED":           0,
+	"COMPONENT_TYPE_UNKNOWN":             1,
+	"COMPONENT_TYPE_CHASSIS":             2,
+	"COMPONENT_TYPE_BACKPLANE":           3,
+	"COMPONENT_TYPE_CONTAINER":           4,
+	"COMPONENT_TYPE_POWER_SUPPLY":        5,
+	"COMPONENT_TYPE_FAN":                 6,
+	"COMPONENT_TYPE_SENSOR":              7,
+	"COMPONENT_TYPE_MODULE":              8,
+	"COMPONENT_TYPE_PORT":                9,
+	"COMPONENT_TYPE_CPU":                 10,
+	"COMPONENT_TYPE_BATTERY":             11,
+	"COMPONENT_TYPE_STORAGE":             12,
+	"COMPONENT_TYPE_MEMORY":              13,
+	"COMPONENT_TYPE_TRANSCEIVER":         14,
+	"COMPONENT_TYPE_GPON_TRANSCEIVER":    15,
+	"COMPONENT_TYPE_XGS_PON_TRANSCEIVER": 16,
+}
+
+func (x ComponentType) String() string {
+	return proto.EnumName(ComponentType_name, int32(x))
+}
+
+func (ComponentType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{0}
+}
+
+type ComponentAdminState int32
+
+const (
+	ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED     ComponentAdminState = 0
+	ComponentAdminState_COMP_ADMIN_STATE_UNKNOWN       ComponentAdminState = 1
+	ComponentAdminState_COMP_ADMIN_STATE_LOCKED        ComponentAdminState = 2
+	ComponentAdminState_COMP_ADMIN_STATE_SHUTTING_DOWN ComponentAdminState = 3
+	ComponentAdminState_COMP_ADMIN_STATE_UNLOCKED      ComponentAdminState = 4
+)
+
+var ComponentAdminState_name = map[int32]string{
+	0: "COMP_ADMIN_STATE_UNDEFINED",
+	1: "COMP_ADMIN_STATE_UNKNOWN",
+	2: "COMP_ADMIN_STATE_LOCKED",
+	3: "COMP_ADMIN_STATE_SHUTTING_DOWN",
+	4: "COMP_ADMIN_STATE_UNLOCKED",
+}
+
+var ComponentAdminState_value = map[string]int32{
+	"COMP_ADMIN_STATE_UNDEFINED":     0,
+	"COMP_ADMIN_STATE_UNKNOWN":       1,
+	"COMP_ADMIN_STATE_LOCKED":        2,
+	"COMP_ADMIN_STATE_SHUTTING_DOWN": 3,
+	"COMP_ADMIN_STATE_UNLOCKED":      4,
+}
+
+func (x ComponentAdminState) String() string {
+	return proto.EnumName(ComponentAdminState_name, int32(x))
+}
+
+func (ComponentAdminState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{1}
+}
+
+type ComponentOperState int32
+
+const (
+	ComponentOperState_COMP_OPER_STATE_UNDEFINED ComponentOperState = 0
+	ComponentOperState_COMP_OPER_STATE_UNKNOWN   ComponentOperState = 1
+	ComponentOperState_COMP_OPER_STATE_DISABLED  ComponentOperState = 2
+	ComponentOperState_COMP_OPER_STATE_ENABLED   ComponentOperState = 3
+	ComponentOperState_COMP_OPER_STATE_TESTING   ComponentOperState = 4
+)
+
+var ComponentOperState_name = map[int32]string{
+	0: "COMP_OPER_STATE_UNDEFINED",
+	1: "COMP_OPER_STATE_UNKNOWN",
+	2: "COMP_OPER_STATE_DISABLED",
+	3: "COMP_OPER_STATE_ENABLED",
+	4: "COMP_OPER_STATE_TESTING",
+}
+
+var ComponentOperState_value = map[string]int32{
+	"COMP_OPER_STATE_UNDEFINED": 0,
+	"COMP_OPER_STATE_UNKNOWN":   1,
+	"COMP_OPER_STATE_DISABLED":  2,
+	"COMP_OPER_STATE_ENABLED":   3,
+	"COMP_OPER_STATE_TESTING":   4,
+}
+
+func (x ComponentOperState) String() string {
+	return proto.EnumName(ComponentOperState_name, int32(x))
+}
+
+func (ComponentOperState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{2}
+}
+
+type ComponentUsageState int32
+
+const (
+	ComponentUsageState_COMP_USAGE_STATE_UNDEFINED ComponentUsageState = 0
+	ComponentUsageState_COMP_USAGE_STATE_UNKNOWN   ComponentUsageState = 1
+	ComponentUsageState_COMP_USAGE_STATE_IDLE      ComponentUsageState = 2
+	ComponentUsageState_COMP_USAGE_STATE_ACTIVE    ComponentUsageState = 3
+	ComponentUsageState_COMP_USAGE_STATE_BUSY      ComponentUsageState = 4
+)
+
+var ComponentUsageState_name = map[int32]string{
+	0: "COMP_USAGE_STATE_UNDEFINED",
+	1: "COMP_USAGE_STATE_UNKNOWN",
+	2: "COMP_USAGE_STATE_IDLE",
+	3: "COMP_USAGE_STATE_ACTIVE",
+	4: "COMP_USAGE_STATE_BUSY",
+}
+
+var ComponentUsageState_value = map[string]int32{
+	"COMP_USAGE_STATE_UNDEFINED": 0,
+	"COMP_USAGE_STATE_UNKNOWN":   1,
+	"COMP_USAGE_STATE_IDLE":      2,
+	"COMP_USAGE_STATE_ACTIVE":    3,
+	"COMP_USAGE_STATE_BUSY":      4,
+}
+
+func (x ComponentUsageState) String() string {
+	return proto.EnumName(ComponentUsageState_name, int32(x))
+}
+
+func (ComponentUsageState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{3}
+}
+
+type ComponentAlarmState int32
+
+const (
+	ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED    ComponentAlarmState = 0
+	ComponentAlarmState_COMP_ALARM_STATE_UNKNOWN      ComponentAlarmState = 1
+	ComponentAlarmState_COMP_ALARM_STATE_UNDER_REPAIR ComponentAlarmState = 2
+	ComponentAlarmState_COMP_ALARM_STATE_CRITICAL     ComponentAlarmState = 3
+	ComponentAlarmState_COMP_ALARM_STATE_MAJOR        ComponentAlarmState = 4
+	ComponentAlarmState_COMP_ALARM_STATE_MINOR        ComponentAlarmState = 5
+	ComponentAlarmState_COMP_ALARM_STATE_WARNING      ComponentAlarmState = 6
+	ComponentAlarmState_COMP_ALARM_STATE_INTERMEDIATE ComponentAlarmState = 7
+)
+
+var ComponentAlarmState_name = map[int32]string{
+	0: "COMP_ALARM_STATE_UNDEFINED",
+	1: "COMP_ALARM_STATE_UNKNOWN",
+	2: "COMP_ALARM_STATE_UNDER_REPAIR",
+	3: "COMP_ALARM_STATE_CRITICAL",
+	4: "COMP_ALARM_STATE_MAJOR",
+	5: "COMP_ALARM_STATE_MINOR",
+	6: "COMP_ALARM_STATE_WARNING",
+	7: "COMP_ALARM_STATE_INTERMEDIATE",
+}
+
+var ComponentAlarmState_value = map[string]int32{
+	"COMP_ALARM_STATE_UNDEFINED":    0,
+	"COMP_ALARM_STATE_UNKNOWN":      1,
+	"COMP_ALARM_STATE_UNDER_REPAIR": 2,
+	"COMP_ALARM_STATE_CRITICAL":     3,
+	"COMP_ALARM_STATE_MAJOR":        4,
+	"COMP_ALARM_STATE_MINOR":        5,
+	"COMP_ALARM_STATE_WARNING":      6,
+	"COMP_ALARM_STATE_INTERMEDIATE": 7,
+}
+
+func (x ComponentAlarmState) String() string {
+	return proto.EnumName(ComponentAlarmState_name, int32(x))
+}
+
+func (ComponentAlarmState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{4}
+}
+
+type ComponentStandbyState int32
+
+const (
+	ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED         ComponentStandbyState = 0
+	ComponentStandbyState_COMP_STANDBY_STATE_UNKNOWN           ComponentStandbyState = 1
+	ComponentStandbyState_COMP_STANDBY_STATE_HOT               ComponentStandbyState = 2
+	ComponentStandbyState_COMP_STANDBY_STATE_COLD              ComponentStandbyState = 3
+	ComponentStandbyState_COMP_STANDBY_STATE_PROVIDING_SERVICE ComponentStandbyState = 4
+)
+
+var ComponentStandbyState_name = map[int32]string{
+	0: "COMP_STANDBY_STATE_UNDEFINED",
+	1: "COMP_STANDBY_STATE_UNKNOWN",
+	2: "COMP_STANDBY_STATE_HOT",
+	3: "COMP_STANDBY_STATE_COLD",
+	4: "COMP_STANDBY_STATE_PROVIDING_SERVICE",
+}
+
+var ComponentStandbyState_value = map[string]int32{
+	"COMP_STANDBY_STATE_UNDEFINED":         0,
+	"COMP_STANDBY_STATE_UNKNOWN":           1,
+	"COMP_STANDBY_STATE_HOT":               2,
+	"COMP_STANDBY_STATE_COLD":              3,
+	"COMP_STANDBY_STATE_PROVIDING_SERVICE": 4,
+}
+
+func (x ComponentStandbyState) String() string {
+	return proto.EnumName(ComponentStandbyState_name, int32(x))
+}
+
+func (ComponentStandbyState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{5}
+}
+
+type SensorValueType int32
+
+const (
+	SensorValueType_SENSOR_VALUE_TYPE_UNDEFINED   SensorValueType = 0
+	SensorValueType_SENSOR_VALUE_TYPE_OTHER       SensorValueType = 1
+	SensorValueType_SENSOR_VALUE_TYPE_UNKNOWN     SensorValueType = 2
+	SensorValueType_SENSOR_VALUE_TYPE_VOLTS_AC    SensorValueType = 3
+	SensorValueType_SENSOR_VALUE_TYPE_VOLTS_DC    SensorValueType = 4
+	SensorValueType_SENSOR_VALUE_TYPE_AMPERES     SensorValueType = 5
+	SensorValueType_SENSOR_VALUE_TYPE_WATTS       SensorValueType = 6
+	SensorValueType_SENSOR_VALUE_TYPE_HERTZ       SensorValueType = 7
+	SensorValueType_SENSOR_VALUE_TYPE_CELSIUS     SensorValueType = 8
+	SensorValueType_SENSOR_VALUE_TYPE_PERCENT_RH  SensorValueType = 9
+	SensorValueType_SENSOR_VALUE_TYPE_RPM         SensorValueType = 10
+	SensorValueType_SENSOR_VALUE_TYPE_CMM         SensorValueType = 11
+	SensorValueType_SENSOR_VALUE_TYPE_TRUTH_VALUE SensorValueType = 12
+)
+
+var SensorValueType_name = map[int32]string{
+	0:  "SENSOR_VALUE_TYPE_UNDEFINED",
+	1:  "SENSOR_VALUE_TYPE_OTHER",
+	2:  "SENSOR_VALUE_TYPE_UNKNOWN",
+	3:  "SENSOR_VALUE_TYPE_VOLTS_AC",
+	4:  "SENSOR_VALUE_TYPE_VOLTS_DC",
+	5:  "SENSOR_VALUE_TYPE_AMPERES",
+	6:  "SENSOR_VALUE_TYPE_WATTS",
+	7:  "SENSOR_VALUE_TYPE_HERTZ",
+	8:  "SENSOR_VALUE_TYPE_CELSIUS",
+	9:  "SENSOR_VALUE_TYPE_PERCENT_RH",
+	10: "SENSOR_VALUE_TYPE_RPM",
+	11: "SENSOR_VALUE_TYPE_CMM",
+	12: "SENSOR_VALUE_TYPE_TRUTH_VALUE",
+}
+
+var SensorValueType_value = map[string]int32{
+	"SENSOR_VALUE_TYPE_UNDEFINED":   0,
+	"SENSOR_VALUE_TYPE_OTHER":       1,
+	"SENSOR_VALUE_TYPE_UNKNOWN":     2,
+	"SENSOR_VALUE_TYPE_VOLTS_AC":    3,
+	"SENSOR_VALUE_TYPE_VOLTS_DC":    4,
+	"SENSOR_VALUE_TYPE_AMPERES":     5,
+	"SENSOR_VALUE_TYPE_WATTS":       6,
+	"SENSOR_VALUE_TYPE_HERTZ":       7,
+	"SENSOR_VALUE_TYPE_CELSIUS":     8,
+	"SENSOR_VALUE_TYPE_PERCENT_RH":  9,
+	"SENSOR_VALUE_TYPE_RPM":         10,
+	"SENSOR_VALUE_TYPE_CMM":         11,
+	"SENSOR_VALUE_TYPE_TRUTH_VALUE": 12,
+}
+
+func (x SensorValueType) String() string {
+	return proto.EnumName(SensorValueType_name, int32(x))
+}
+
+func (SensorValueType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{6}
+}
+
+type SensorValueScale int32
+
+const (
+	SensorValueScale_SENSOR_VALUE_SCALE_UNDEFINED SensorValueScale = 0
+	SensorValueScale_SENSOR_VALUE_SCALE_YOCTO     SensorValueScale = 1
+	SensorValueScale_SENSOR_VALUE_SCALE_ZEPTO     SensorValueScale = 2
+	SensorValueScale_SENSOR_VALUE_SCALE_ATTO      SensorValueScale = 3
+	SensorValueScale_SENSOR_VALUE_SCALE_FEMTO     SensorValueScale = 4
+	SensorValueScale_SENSOR_VALUE_SCALE_PICO      SensorValueScale = 5
+	SensorValueScale_SENSOR_VALUE_SCALE_NANO      SensorValueScale = 6
+	SensorValueScale_SENSOR_VALUE_SCALE_MICRO     SensorValueScale = 7
+	SensorValueScale_SENSOR_VALUE_SCALE_MILLI     SensorValueScale = 8
+	SensorValueScale_SENSOR_VALUE_SCALE_UNITS     SensorValueScale = 9
+	SensorValueScale_SENSOR_VALUE_SCALE_KILO      SensorValueScale = 10
+	SensorValueScale_SENSOR_VALUE_SCALE_MEGA      SensorValueScale = 11
+	SensorValueScale_SENSOR_VALUE_SCALE_GIGA      SensorValueScale = 12
+	SensorValueScale_SENSOR_VALUE_SCALE_TERA      SensorValueScale = 13
+	SensorValueScale_SENSOR_VALUE_SCALE_PETA      SensorValueScale = 14
+	SensorValueScale_SENSOR_VALUE_SCALE_EXA       SensorValueScale = 15
+	SensorValueScale_SENSOR_VALUE_SCALE_ZETTA     SensorValueScale = 16
+	SensorValueScale_SENSOR_VALUE_SCALE_YOTTA     SensorValueScale = 17
+)
+
+var SensorValueScale_name = map[int32]string{
+	0:  "SENSOR_VALUE_SCALE_UNDEFINED",
+	1:  "SENSOR_VALUE_SCALE_YOCTO",
+	2:  "SENSOR_VALUE_SCALE_ZEPTO",
+	3:  "SENSOR_VALUE_SCALE_ATTO",
+	4:  "SENSOR_VALUE_SCALE_FEMTO",
+	5:  "SENSOR_VALUE_SCALE_PICO",
+	6:  "SENSOR_VALUE_SCALE_NANO",
+	7:  "SENSOR_VALUE_SCALE_MICRO",
+	8:  "SENSOR_VALUE_SCALE_MILLI",
+	9:  "SENSOR_VALUE_SCALE_UNITS",
+	10: "SENSOR_VALUE_SCALE_KILO",
+	11: "SENSOR_VALUE_SCALE_MEGA",
+	12: "SENSOR_VALUE_SCALE_GIGA",
+	13: "SENSOR_VALUE_SCALE_TERA",
+	14: "SENSOR_VALUE_SCALE_PETA",
+	15: "SENSOR_VALUE_SCALE_EXA",
+	16: "SENSOR_VALUE_SCALE_ZETTA",
+	17: "SENSOR_VALUE_SCALE_YOTTA",
+}
+
+var SensorValueScale_value = map[string]int32{
+	"SENSOR_VALUE_SCALE_UNDEFINED": 0,
+	"SENSOR_VALUE_SCALE_YOCTO":     1,
+	"SENSOR_VALUE_SCALE_ZEPTO":     2,
+	"SENSOR_VALUE_SCALE_ATTO":      3,
+	"SENSOR_VALUE_SCALE_FEMTO":     4,
+	"SENSOR_VALUE_SCALE_PICO":      5,
+	"SENSOR_VALUE_SCALE_NANO":      6,
+	"SENSOR_VALUE_SCALE_MICRO":     7,
+	"SENSOR_VALUE_SCALE_MILLI":     8,
+	"SENSOR_VALUE_SCALE_UNITS":     9,
+	"SENSOR_VALUE_SCALE_KILO":      10,
+	"SENSOR_VALUE_SCALE_MEGA":      11,
+	"SENSOR_VALUE_SCALE_GIGA":      12,
+	"SENSOR_VALUE_SCALE_TERA":      13,
+	"SENSOR_VALUE_SCALE_PETA":      14,
+	"SENSOR_VALUE_SCALE_EXA":       15,
+	"SENSOR_VALUE_SCALE_ZETTA":     16,
+	"SENSOR_VALUE_SCALE_YOTTA":     17,
+}
+
+func (x SensorValueScale) String() string {
+	return proto.EnumName(SensorValueScale_name, int32(x))
+}
+
+func (SensorValueScale) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{7}
+}
+
+type SensorStatus int32
+
+const (
+	SensorStatus_SENSOR_STATUS_UNDEFINED      SensorStatus = 0
+	SensorStatus_SENSOR_STATUS_OK             SensorStatus = 1
+	SensorStatus_SENSOR_STATUS_UNAVAILABLE    SensorStatus = 2
+	SensorStatus_SENSOR_STATUS_NONOPERATIONAL SensorStatus = 3
+)
+
+var SensorStatus_name = map[int32]string{
+	0: "SENSOR_STATUS_UNDEFINED",
+	1: "SENSOR_STATUS_OK",
+	2: "SENSOR_STATUS_UNAVAILABLE",
+	3: "SENSOR_STATUS_NONOPERATIONAL",
+}
+
+var SensorStatus_value = map[string]int32{
+	"SENSOR_STATUS_UNDEFINED":      0,
+	"SENSOR_STATUS_OK":             1,
+	"SENSOR_STATUS_UNAVAILABLE":    2,
+	"SENSOR_STATUS_NONOPERATIONAL": 3,
+}
+
+func (x SensorStatus) String() string {
+	return proto.EnumName(SensorStatus_name, int32(x))
+}
+
+func (SensorStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{8}
+}
+
+type Uuid struct {
+	Uuid                 string   `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Uuid) Reset()         { *m = Uuid{} }
+func (m *Uuid) String() string { return proto.CompactTextString(m) }
+func (*Uuid) ProtoMessage()    {}
+func (*Uuid) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{0}
+}
+
+func (m *Uuid) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Uuid.Unmarshal(m, b)
+}
+func (m *Uuid) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Uuid.Marshal(b, m, deterministic)
+}
+func (m *Uuid) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Uuid.Merge(m, src)
+}
+func (m *Uuid) XXX_Size() int {
+	return xxx_messageInfo_Uuid.Size(m)
+}
+func (m *Uuid) XXX_DiscardUnknown() {
+	xxx_messageInfo_Uuid.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Uuid proto.InternalMessageInfo
+
+func (m *Uuid) GetUuid() string {
+	if m != nil {
+		return m.Uuid
+	}
+	return ""
+}
+
+type HardwareID struct {
+	Uuid                 *Uuid    `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HardwareID) Reset()         { *m = HardwareID{} }
+func (m *HardwareID) String() string { return proto.CompactTextString(m) }
+func (*HardwareID) ProtoMessage()    {}
+func (*HardwareID) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{1}
+}
+
+func (m *HardwareID) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HardwareID.Unmarshal(m, b)
+}
+func (m *HardwareID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HardwareID.Marshal(b, m, deterministic)
+}
+func (m *HardwareID) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HardwareID.Merge(m, src)
+}
+func (m *HardwareID) XXX_Size() int {
+	return xxx_messageInfo_HardwareID.Size(m)
+}
+func (m *HardwareID) XXX_DiscardUnknown() {
+	xxx_messageInfo_HardwareID.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HardwareID proto.InternalMessageInfo
+
+func (m *HardwareID) GetUuid() *Uuid {
+	if m != nil {
+		return m.Uuid
+	}
+	return nil
+}
+
+type Uri struct {
+	Uri                  string   `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Uri) Reset()         { *m = Uri{} }
+func (m *Uri) String() string { return proto.CompactTextString(m) }
+func (*Uri) ProtoMessage()    {}
+func (*Uri) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{2}
+}
+
+func (m *Uri) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Uri.Unmarshal(m, b)
+}
+func (m *Uri) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Uri.Marshal(b, m, deterministic)
+}
+func (m *Uri) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Uri.Merge(m, src)
+}
+func (m *Uri) XXX_Size() int {
+	return xxx_messageInfo_Uri.Size(m)
+}
+func (m *Uri) XXX_DiscardUnknown() {
+	xxx_messageInfo_Uri.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Uri proto.InternalMessageInfo
+
+func (m *Uri) GetUri() string {
+	if m != nil {
+		return m.Uri
+	}
+	return ""
+}
+
+type ComponentState struct {
+	StateLastChanged     *timestamp.Timestamp  `protobuf:"bytes,1,opt,name=state_last_changed,json=stateLastChanged,proto3" json:"state_last_changed,omitempty"`
+	AdminState           ComponentAdminState   `protobuf:"varint,2,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
+	OperState            ComponentOperState    `protobuf:"varint,3,opt,name=oper_state,json=operState,proto3,enum=dmi.ComponentOperState" json:"oper_state,omitempty"`
+	UsageState           ComponentUsageState   `protobuf:"varint,4,opt,name=usage_state,json=usageState,proto3,enum=dmi.ComponentUsageState" json:"usage_state,omitempty"`
+	AlarmState           ComponentAlarmState   `protobuf:"varint,5,opt,name=alarm_state,json=alarmState,proto3,enum=dmi.ComponentAlarmState" json:"alarm_state,omitempty"`
+	StandbyState         ComponentStandbyState `protobuf:"varint,6,opt,name=standby_state,json=standbyState,proto3,enum=dmi.ComponentStandbyState" json:"standby_state,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ComponentState) Reset()         { *m = ComponentState{} }
+func (m *ComponentState) String() string { return proto.CompactTextString(m) }
+func (*ComponentState) ProtoMessage()    {}
+func (*ComponentState) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{3}
+}
+
+func (m *ComponentState) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ComponentState.Unmarshal(m, b)
+}
+func (m *ComponentState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ComponentState.Marshal(b, m, deterministic)
+}
+func (m *ComponentState) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ComponentState.Merge(m, src)
+}
+func (m *ComponentState) XXX_Size() int {
+	return xxx_messageInfo_ComponentState.Size(m)
+}
+func (m *ComponentState) XXX_DiscardUnknown() {
+	xxx_messageInfo_ComponentState.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ComponentState proto.InternalMessageInfo
+
+func (m *ComponentState) GetStateLastChanged() *timestamp.Timestamp {
+	if m != nil {
+		return m.StateLastChanged
+	}
+	return nil
+}
+
+func (m *ComponentState) GetAdminState() ComponentAdminState {
+	if m != nil {
+		return m.AdminState
+	}
+	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
+}
+
+func (m *ComponentState) GetOperState() ComponentOperState {
+	if m != nil {
+		return m.OperState
+	}
+	return ComponentOperState_COMP_OPER_STATE_UNDEFINED
+}
+
+func (m *ComponentState) GetUsageState() ComponentUsageState {
+	if m != nil {
+		return m.UsageState
+	}
+	return ComponentUsageState_COMP_USAGE_STATE_UNDEFINED
+}
+
+func (m *ComponentState) GetAlarmState() ComponentAlarmState {
+	if m != nil {
+		return m.AlarmState
+	}
+	return ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED
+}
+
+func (m *ComponentState) GetStandbyState() ComponentStandbyState {
+	if m != nil {
+		return m.StandbyState
+	}
+	return ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED
+}
+
+type ComponentSensorData struct {
+	Value           int32                `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+	Type            SensorValueType      `protobuf:"varint,2,opt,name=type,proto3,enum=dmi.SensorValueType" json:"type,omitempty"`
+	Scale           SensorValueScale     `protobuf:"varint,3,opt,name=scale,proto3,enum=dmi.SensorValueScale" json:"scale,omitempty"`
+	Precision       int32                `protobuf:"varint,4,opt,name=precision,proto3" json:"precision,omitempty"`
+	Status          SensorStatus         `protobuf:"varint,5,opt,name=status,proto3,enum=dmi.SensorStatus" json:"status,omitempty"`
+	UnitsDisplay    string               `protobuf:"bytes,6,opt,name=units_display,json=unitsDisplay,proto3" json:"units_display,omitempty"`
+	Timestamp       *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	ValueUpdateRate uint32               `protobuf:"varint,8,opt,name=value_update_rate,json=valueUpdateRate,proto3" json:"value_update_rate,omitempty"`
+	// data_type can be of the string representation of MetricNames or something else as well
+	DataType             string   `protobuf:"bytes,9,opt,name=data_type,json=dataType,proto3" json:"data_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ComponentSensorData) Reset()         { *m = ComponentSensorData{} }
+func (m *ComponentSensorData) String() string { return proto.CompactTextString(m) }
+func (*ComponentSensorData) ProtoMessage()    {}
+func (*ComponentSensorData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{4}
+}
+
+func (m *ComponentSensorData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ComponentSensorData.Unmarshal(m, b)
+}
+func (m *ComponentSensorData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ComponentSensorData.Marshal(b, m, deterministic)
+}
+func (m *ComponentSensorData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ComponentSensorData.Merge(m, src)
+}
+func (m *ComponentSensorData) XXX_Size() int {
+	return xxx_messageInfo_ComponentSensorData.Size(m)
+}
+func (m *ComponentSensorData) XXX_DiscardUnknown() {
+	xxx_messageInfo_ComponentSensorData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ComponentSensorData proto.InternalMessageInfo
+
+func (m *ComponentSensorData) GetValue() int32 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+func (m *ComponentSensorData) GetType() SensorValueType {
+	if m != nil {
+		return m.Type
+	}
+	return SensorValueType_SENSOR_VALUE_TYPE_UNDEFINED
+}
+
+func (m *ComponentSensorData) GetScale() SensorValueScale {
+	if m != nil {
+		return m.Scale
+	}
+	return SensorValueScale_SENSOR_VALUE_SCALE_UNDEFINED
+}
+
+func (m *ComponentSensorData) GetPrecision() int32 {
+	if m != nil {
+		return m.Precision
+	}
+	return 0
+}
+
+func (m *ComponentSensorData) GetStatus() SensorStatus {
+	if m != nil {
+		return m.Status
+	}
+	return SensorStatus_SENSOR_STATUS_UNDEFINED
+}
+
+func (m *ComponentSensorData) GetUnitsDisplay() string {
+	if m != nil {
+		return m.UnitsDisplay
+	}
+	return ""
+}
+
+func (m *ComponentSensorData) GetTimestamp() *timestamp.Timestamp {
+	if m != nil {
+		return m.Timestamp
+	}
+	return nil
+}
+
+func (m *ComponentSensorData) GetValueUpdateRate() uint32 {
+	if m != nil {
+		return m.ValueUpdateRate
+	}
+	return 0
+}
+
+func (m *ComponentSensorData) GetDataType() string {
+	if m != nil {
+		return m.DataType
+	}
+	return ""
+}
+
+type Component struct {
+	// The name of a component uniquely identifies an component within the Hardware
+	Name        string        `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Class       ComponentType `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
+	Description string        `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+	// The name of the parent of this component, empty "" in case of the root component
+	Parent       string               `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"`
+	ParentRelPos int32                `protobuf:"varint,5,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
+	Children     []*Component         `protobuf:"bytes,6,rep,name=children,proto3" json:"children,omitempty"`
+	HardwareRev  string               `protobuf:"bytes,7,opt,name=hardware_rev,json=hardwareRev,proto3" json:"hardware_rev,omitempty"`
+	FirmwareRev  string               `protobuf:"bytes,8,opt,name=firmware_rev,json=firmwareRev,proto3" json:"firmware_rev,omitempty"`
+	SoftwareRev  string               `protobuf:"bytes,9,opt,name=software_rev,json=softwareRev,proto3" json:"software_rev,omitempty"`
+	SerialNum    string               `protobuf:"bytes,10,opt,name=serial_num,json=serialNum,proto3" json:"serial_num,omitempty"`
+	MfgName      string               `protobuf:"bytes,11,opt,name=mfg_name,json=mfgName,proto3" json:"mfg_name,omitempty"`
+	ModelName    string               `protobuf:"bytes,12,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
+	Alias        string               `protobuf:"bytes,13,opt,name=alias,proto3" json:"alias,omitempty"`
+	AssetId      string               `protobuf:"bytes,14,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
+	IsFru        bool                 `protobuf:"varint,15,opt,name=is_fru,json=isFru,proto3" json:"is_fru,omitempty"`
+	MfgDate      *timestamp.Timestamp `protobuf:"bytes,16,opt,name=mfg_date,json=mfgDate,proto3" json:"mfg_date,omitempty"`
+	Uri          *Uri                 `protobuf:"bytes,17,opt,name=uri,proto3" json:"uri,omitempty"`
+	// The uuid of the component uniquely identifies the component across the entire system
+	Uuid                 *Uuid                  `protobuf:"bytes,18,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	State                *ComponentState        `protobuf:"bytes,19,opt,name=state,proto3" json:"state,omitempty"`
+	SensorData           []*ComponentSensorData `protobuf:"bytes,20,rep,name=sensor_data,json=sensorData,proto3" json:"sensor_data,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *Component) Reset()         { *m = Component{} }
+func (m *Component) String() string { return proto.CompactTextString(m) }
+func (*Component) ProtoMessage()    {}
+func (*Component) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{5}
+}
+
+func (m *Component) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component.Unmarshal(m, b)
+}
+func (m *Component) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component.Marshal(b, m, deterministic)
+}
+func (m *Component) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component.Merge(m, src)
+}
+func (m *Component) XXX_Size() int {
+	return xxx_messageInfo_Component.Size(m)
+}
+func (m *Component) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component proto.InternalMessageInfo
+
+func (m *Component) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Component) GetClass() ComponentType {
+	if m != nil {
+		return m.Class
+	}
+	return ComponentType_COMPONENT_TYPE_UNDEFINED
+}
+
+func (m *Component) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func (m *Component) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *Component) GetParentRelPos() int32 {
+	if m != nil {
+		return m.ParentRelPos
+	}
+	return 0
+}
+
+func (m *Component) GetChildren() []*Component {
+	if m != nil {
+		return m.Children
+	}
+	return nil
+}
+
+func (m *Component) GetHardwareRev() string {
+	if m != nil {
+		return m.HardwareRev
+	}
+	return ""
+}
+
+func (m *Component) GetFirmwareRev() string {
+	if m != nil {
+		return m.FirmwareRev
+	}
+	return ""
+}
+
+func (m *Component) GetSoftwareRev() string {
+	if m != nil {
+		return m.SoftwareRev
+	}
+	return ""
+}
+
+func (m *Component) GetSerialNum() string {
+	if m != nil {
+		return m.SerialNum
+	}
+	return ""
+}
+
+func (m *Component) GetMfgName() string {
+	if m != nil {
+		return m.MfgName
+	}
+	return ""
+}
+
+func (m *Component) GetModelName() string {
+	if m != nil {
+		return m.ModelName
+	}
+	return ""
+}
+
+func (m *Component) GetAlias() string {
+	if m != nil {
+		return m.Alias
+	}
+	return ""
+}
+
+func (m *Component) GetAssetId() string {
+	if m != nil {
+		return m.AssetId
+	}
+	return ""
+}
+
+func (m *Component) GetIsFru() bool {
+	if m != nil {
+		return m.IsFru
+	}
+	return false
+}
+
+func (m *Component) GetMfgDate() *timestamp.Timestamp {
+	if m != nil {
+		return m.MfgDate
+	}
+	return nil
+}
+
+func (m *Component) GetUri() *Uri {
+	if m != nil {
+		return m.Uri
+	}
+	return nil
+}
+
+func (m *Component) GetUuid() *Uuid {
+	if m != nil {
+		return m.Uuid
+	}
+	return nil
+}
+
+func (m *Component) GetState() *ComponentState {
+	if m != nil {
+		return m.State
+	}
+	return nil
+}
+
+func (m *Component) GetSensorData() []*ComponentSensorData {
+	if m != nil {
+		return m.SensorData
+	}
+	return nil
+}
+
+type Hardware struct {
+	LastChange *timestamp.Timestamp `protobuf:"bytes,1,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
+	// Each HW has one parent/root and all other components are children of this
+	// The class of the root component would be set as UNDEFINED
+	Root                 *Component `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *Hardware) Reset()         { *m = Hardware{} }
+func (m *Hardware) String() string { return proto.CompactTextString(m) }
+func (*Hardware) ProtoMessage()    {}
+func (*Hardware) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{6}
+}
+
+func (m *Hardware) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Hardware.Unmarshal(m, b)
+}
+func (m *Hardware) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Hardware.Marshal(b, m, deterministic)
+}
+func (m *Hardware) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Hardware.Merge(m, src)
+}
+func (m *Hardware) XXX_Size() int {
+	return xxx_messageInfo_Hardware.Size(m)
+}
+func (m *Hardware) XXX_DiscardUnknown() {
+	xxx_messageInfo_Hardware.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Hardware proto.InternalMessageInfo
+
+func (m *Hardware) GetLastChange() *timestamp.Timestamp {
+	if m != nil {
+		return m.LastChange
+	}
+	return nil
+}
+
+func (m *Hardware) GetRoot() *Component {
+	if m != nil {
+		return m.Root
+	}
+	return nil
+}
+
+// The attributes of a component which are modifiable from the client side
+type ModifiableComponent struct {
+	// The name has to be unique for each component within the hardware and implementations need to
+	// ascertain this when modifying the name
+	Name                 string              `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Class                ComponentType       `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
+	Parent               *Component          `protobuf:"bytes,3,opt,name=parent,proto3" json:"parent,omitempty"`
+	ParentRelPos         int32               `protobuf:"varint,4,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
+	Alias                string              `protobuf:"bytes,5,opt,name=alias,proto3" json:"alias,omitempty"`
+	AssetId              string              `protobuf:"bytes,6,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
+	Uri                  *Uri                `protobuf:"bytes,7,opt,name=uri,proto3" json:"uri,omitempty"`
+	AdminState           ComponentAdminState `protobuf:"varint,8,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *ModifiableComponent) Reset()         { *m = ModifiableComponent{} }
+func (m *ModifiableComponent) String() string { return proto.CompactTextString(m) }
+func (*ModifiableComponent) ProtoMessage()    {}
+func (*ModifiableComponent) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{7}
+}
+
+func (m *ModifiableComponent) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ModifiableComponent.Unmarshal(m, b)
+}
+func (m *ModifiableComponent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ModifiableComponent.Marshal(b, m, deterministic)
+}
+func (m *ModifiableComponent) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ModifiableComponent.Merge(m, src)
+}
+func (m *ModifiableComponent) XXX_Size() int {
+	return xxx_messageInfo_ModifiableComponent.Size(m)
+}
+func (m *ModifiableComponent) XXX_DiscardUnknown() {
+	xxx_messageInfo_ModifiableComponent.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ModifiableComponent proto.InternalMessageInfo
+
+func (m *ModifiableComponent) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *ModifiableComponent) GetClass() ComponentType {
+	if m != nil {
+		return m.Class
+	}
+	return ComponentType_COMPONENT_TYPE_UNDEFINED
+}
+
+func (m *ModifiableComponent) GetParent() *Component {
+	if m != nil {
+		return m.Parent
+	}
+	return nil
+}
+
+func (m *ModifiableComponent) GetParentRelPos() int32 {
+	if m != nil {
+		return m.ParentRelPos
+	}
+	return 0
+}
+
+func (m *ModifiableComponent) GetAlias() string {
+	if m != nil {
+		return m.Alias
+	}
+	return ""
+}
+
+func (m *ModifiableComponent) GetAssetId() string {
+	if m != nil {
+		return m.AssetId
+	}
+	return ""
+}
+
+func (m *ModifiableComponent) GetUri() *Uri {
+	if m != nil {
+		return m.Uri
+	}
+	return nil
+}
+
+func (m *ModifiableComponent) GetAdminState() ComponentAdminState {
+	if m != nil {
+		return m.AdminState
+	}
+	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
+}
+
+func init() {
+	proto.RegisterEnum("dmi.ComponentType", ComponentType_name, ComponentType_value)
+	proto.RegisterEnum("dmi.ComponentAdminState", ComponentAdminState_name, ComponentAdminState_value)
+	proto.RegisterEnum("dmi.ComponentOperState", ComponentOperState_name, ComponentOperState_value)
+	proto.RegisterEnum("dmi.ComponentUsageState", ComponentUsageState_name, ComponentUsageState_value)
+	proto.RegisterEnum("dmi.ComponentAlarmState", ComponentAlarmState_name, ComponentAlarmState_value)
+	proto.RegisterEnum("dmi.ComponentStandbyState", ComponentStandbyState_name, ComponentStandbyState_value)
+	proto.RegisterEnum("dmi.SensorValueType", SensorValueType_name, SensorValueType_value)
+	proto.RegisterEnum("dmi.SensorValueScale", SensorValueScale_name, SensorValueScale_value)
+	proto.RegisterEnum("dmi.SensorStatus", SensorStatus_name, SensorStatus_value)
+	proto.RegisterType((*Uuid)(nil), "dmi.Uuid")
+	proto.RegisterType((*HardwareID)(nil), "dmi.HardwareID")
+	proto.RegisterType((*Uri)(nil), "dmi.Uri")
+	proto.RegisterType((*ComponentState)(nil), "dmi.ComponentState")
+	proto.RegisterType((*ComponentSensorData)(nil), "dmi.ComponentSensorData")
+	proto.RegisterType((*Component)(nil), "dmi.Component")
+	proto.RegisterType((*Hardware)(nil), "dmi.Hardware")
+	proto.RegisterType((*ModifiableComponent)(nil), "dmi.ModifiableComponent")
+}
+
+func init() { proto.RegisterFile("dmi/hw.proto", fileDescriptor_d7c33d745c4ab367) }
+
+var fileDescriptor_d7c33d745c4ab367 = []byte{
+	// 1762 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x97, 0xcf, 0x6f, 0xe3, 0xc6,
+	0x15, 0xc7, 0x2b, 0xeb, 0x87, 0xa5, 0x27, 0xd9, 0x9e, 0x1d, 0x7b, 0xd7, 0x5a, 0xef, 0x3a, 0xeb,
+	0x28, 0x41, 0xe0, 0x28, 0x88, 0x0d, 0x6c, 0xd0, 0xa2, 0x41, 0x0e, 0xc5, 0x98, 0x9a, 0xb5, 0x59,
+	0x4b, 0xa4, 0x30, 0x1c, 0x79, 0xe3, 0xbd, 0x10, 0xb4, 0x48, 0xdb, 0x44, 0x45, 0x51, 0x20, 0x29,
+	0x07, 0x7b, 0x6c, 0xd1, 0x73, 0xff, 0x87, 0x5e, 0x8a, 0xf4, 0xdc, 0x43, 0x2f, 0xfd, 0xaf, 0xfa,
+	0x0f, 0x14, 0x33, 0x24, 0xf5, 0x73, 0xb4, 0xc9, 0xa1, 0xb7, 0xd1, 0xfb, 0x7c, 0xdf, 0xcc, 0xe3,
+	0x9b, 0xf7, 0x1e, 0x29, 0x68, 0xb8, 0x81, 0x7f, 0xfe, 0xf8, 0xd3, 0xd9, 0x24, 0x0a, 0x93, 0x10,
+	0x17, 0xdd, 0xc0, 0x3f, 0x7a, 0xf3, 0x10, 0x86, 0x0f, 0x23, 0xef, 0x5c, 0x9a, 0xee, 0xa6, 0xf7,
+	0xe7, 0x89, 0x1f, 0x78, 0x71, 0xe2, 0x04, 0x93, 0x54, 0xd5, 0x3a, 0x82, 0xd2, 0x60, 0xea, 0xbb,
+	0x18, 0x43, 0x69, 0x3a, 0xf5, 0xdd, 0x66, 0xe1, 0xa4, 0x70, 0x5a, 0x63, 0x72, 0xdd, 0xfa, 0x06,
+	0xe0, 0xca, 0x89, 0xdc, 0x9f, 0x9c, 0xc8, 0xd3, 0x3b, 0xf8, 0x78, 0x41, 0x51, 0x7f, 0x5b, 0x3b,
+	0x73, 0x03, 0xff, 0x4c, 0xb8, 0x66, 0xe2, 0x43, 0x28, 0x0e, 0x22, 0x1f, 0x23, 0x28, 0x4e, 0x23,
+	0x3f, 0xdb, 0x46, 0x2c, 0x5b, 0x7f, 0x2d, 0xc2, 0xae, 0x16, 0x06, 0x93, 0x70, 0xec, 0x8d, 0x13,
+	0x2b, 0x71, 0x12, 0x0f, 0x5f, 0x01, 0x8e, 0xc5, 0xc2, 0x1e, 0x39, 0x71, 0x62, 0x0f, 0x1f, 0x9d,
+	0xf1, 0x83, 0x97, 0x6f, 0x7c, 0x74, 0x96, 0x86, 0x7c, 0x96, 0x87, 0x7c, 0xc6, 0xf3, 0x90, 0x19,
+	0x92, 0x5e, 0x5d, 0x27, 0x4e, 0xb4, 0xd4, 0x07, 0x7f, 0x0f, 0x75, 0xc7, 0x0d, 0xfc, 0xb1, 0x2d,
+	0x49, 0x73, 0xeb, 0xa4, 0x70, 0xba, 0xfb, 0xb6, 0x29, 0x63, 0x9b, 0x9d, 0x49, 0x84, 0x40, 0x1e,
+	0xcc, 0xc0, 0x99, 0xad, 0xf1, 0xef, 0x00, 0xc2, 0x89, 0x17, 0x65, 0x9e, 0x45, 0xe9, 0x79, 0xb8,
+	0xec, 0x69, 0x4e, 0xbc, 0x28, 0x75, 0xac, 0x85, 0xf9, 0x52, 0x1c, 0x39, 0x8d, 0x9d, 0x07, 0x2f,
+	0x73, 0x2c, 0xa9, 0x8e, 0x1c, 0x08, 0x41, 0x76, 0xe4, 0x74, 0xb6, 0x96, 0xd1, 0x8e, 0x9c, 0x28,
+	0xc8, 0x5c, 0xcb, 0xca, 0x68, 0x85, 0x20, 0x8f, 0x76, 0xb6, 0xc6, 0x7f, 0x80, 0x9d, 0x38, 0x71,
+	0xc6, 0xee, 0xdd, 0xc7, 0xcc, 0xb9, 0x22, 0x9d, 0x8f, 0x96, 0x9d, 0xad, 0x54, 0x92, 0xba, 0x37,
+	0xe2, 0x85, 0x5f, 0xad, 0xff, 0x6e, 0xc1, 0xfe, 0x5c, 0xe7, 0x8d, 0xe3, 0x30, 0xea, 0x38, 0x89,
+	0x83, 0x0f, 0xa0, 0xfc, 0xe4, 0x8c, 0xa6, 0x9e, 0x4c, 0x7f, 0x99, 0xa5, 0x3f, 0xf0, 0x29, 0x94,
+	0x92, 0x8f, 0x93, 0x3c, 0xa1, 0x07, 0xf2, 0x94, 0xd4, 0xe9, 0x46, 0x70, 0xfe, 0x71, 0xe2, 0x31,
+	0xa9, 0xc0, 0xdf, 0x40, 0x39, 0x1e, 0x3a, 0xa3, 0x3c, 0x83, 0xcf, 0x57, 0xa5, 0x96, 0x80, 0x2c,
+	0xd5, 0xe0, 0xd7, 0x50, 0x9b, 0x44, 0xde, 0xd0, 0x8f, 0xfd, 0x70, 0x2c, 0x33, 0x57, 0x66, 0x73,
+	0x03, 0xfe, 0x1a, 0x2a, 0xe2, 0xd9, 0xa6, 0x71, 0x96, 0x99, 0x67, 0x0b, 0x7b, 0x59, 0x12, 0xb0,
+	0x4c, 0x80, 0xbf, 0x80, 0x9d, 0xe9, 0xd8, 0x4f, 0x62, 0xdb, 0xf5, 0xe3, 0xc9, 0xc8, 0xf9, 0x28,
+	0xd3, 0x51, 0x63, 0x0d, 0x69, 0xec, 0xa4, 0x36, 0xfc, 0x7b, 0xa8, 0xcd, 0xca, 0xbd, 0xb9, 0xfd,
+	0x8b, 0xd5, 0x35, 0x17, 0xe3, 0x36, 0x3c, 0x93, 0x79, 0xb0, 0xa7, 0x13, 0x57, 0xd4, 0x69, 0x24,
+	0x32, 0x5e, 0x3d, 0x29, 0x9c, 0xee, 0xb0, 0x3d, 0x09, 0x06, 0xd2, 0xce, 0xc4, 0xcd, 0xbc, 0x82,
+	0x9a, 0xeb, 0x24, 0x8e, 0x2d, 0xf3, 0x55, 0x93, 0x61, 0x54, 0x85, 0x41, 0xe4, 0xa8, 0xf5, 0xef,
+	0x32, 0xd4, 0x66, 0x59, 0x17, 0x4d, 0x36, 0x76, 0x02, 0x2f, 0x6f, 0x32, 0xb1, 0xc6, 0xa7, 0x50,
+	0x1e, 0x8e, 0x9c, 0x38, 0xce, 0x52, 0x8d, 0x97, 0x2f, 0x54, 0x26, 0x3a, 0x15, 0xe0, 0x13, 0xa8,
+	0xbb, 0x5e, 0x3c, 0x8c, 0xfc, 0x49, 0x22, 0xd2, 0x57, 0x94, 0x9b, 0x2c, 0x9a, 0xf0, 0x0b, 0xa8,
+	0x4c, 0x9c, 0xc8, 0x1b, 0x27, 0x32, 0xb7, 0x35, 0x96, 0xfd, 0xc2, 0x5f, 0xc2, 0x6e, 0xba, 0xb2,
+	0x23, 0x6f, 0x64, 0x4f, 0xc2, 0x34, 0xc1, 0x65, 0xd6, 0x48, 0xad, 0xcc, 0x1b, 0xf5, 0xc3, 0x18,
+	0xb7, 0xa1, 0x3a, 0x7c, 0xf4, 0x47, 0x6e, 0xe4, 0x8d, 0x9b, 0x95, 0x93, 0xe2, 0x69, 0xfd, 0xed,
+	0xee, 0x72, 0x30, 0x6c, 0xc6, 0xf1, 0xe7, 0xd0, 0x78, 0xcc, 0x46, 0x83, 0x1d, 0x79, 0x4f, 0x32,
+	0xbb, 0x35, 0x56, 0xcf, 0x6d, 0xcc, 0x7b, 0x12, 0x92, 0x7b, 0x3f, 0x0a, 0x66, 0x92, 0x6a, 0x2a,
+	0xc9, 0x6d, 0x99, 0x24, 0x0e, 0xef, 0x93, 0x99, 0x24, 0xcd, 0x5e, 0x3d, 0xb7, 0x09, 0xc9, 0x31,
+	0x40, 0xec, 0x45, 0xbe, 0x33, 0xb2, 0xc7, 0xd3, 0xa0, 0x09, 0x52, 0x50, 0x4b, 0x2d, 0xc6, 0x34,
+	0xc0, 0x2f, 0xa1, 0x1a, 0xdc, 0x3f, 0xd8, 0x32, 0xab, 0x75, 0x09, 0xb7, 0x83, 0xfb, 0x07, 0x43,
+	0x24, 0xf6, 0x18, 0x20, 0x08, 0x5d, 0x6f, 0x94, 0xc2, 0x46, 0xea, 0x29, 0x2d, 0x12, 0x1f, 0x40,
+	0xd9, 0x19, 0xf9, 0x4e, 0xdc, 0xdc, 0x91, 0x24, 0xfd, 0x21, 0xf6, 0x73, 0xe2, 0xd8, 0x4b, 0x6c,
+	0xdf, 0x6d, 0xee, 0xa6, 0xfb, 0xc9, 0xdf, 0xba, 0x8b, 0x9f, 0x43, 0xc5, 0x8f, 0xed, 0xfb, 0x68,
+	0xda, 0xdc, 0x3b, 0x29, 0x9c, 0x56, 0x59, 0xd9, 0x8f, 0xdf, 0x45, 0x53, 0xfc, 0xdb, 0x34, 0x02,
+	0x51, 0x0e, 0x4d, 0xf4, 0x8b, 0x35, 0x26, 0xa2, 0xeb, 0x88, 0xaa, 0x39, 0x4a, 0xe7, 0xe4, 0x33,
+	0xe9, 0x51, 0x4d, 0x87, 0x69, 0xe4, 0xcb, 0x89, 0x39, 0x9b, 0xb4, 0x58, 0x39, 0x69, 0xf1, 0xd7,
+	0x50, 0x4e, 0x47, 0xc0, 0xbe, 0xe4, 0xfb, 0x6b, 0x23, 0x20, 0x11, 0xfd, 0x96, 0x0f, 0x9c, 0x58,
+	0xb6, 0x8f, 0x88, 0xcf, 0x69, 0x1e, 0xc8, 0x5b, 0x5d, 0x19, 0x38, 0xf3, 0x59, 0xc0, 0x20, 0x9e,
+	0xad, 0x5b, 0x7f, 0x82, 0x6a, 0x3e, 0xfc, 0xf1, 0x0f, 0x50, 0x5f, 0x98, 0xd4, 0xbf, 0x62, 0x50,
+	0xc3, 0x68, 0x36, 0xa3, 0x71, 0x0b, 0x4a, 0x51, 0x18, 0x26, 0xb2, 0xbe, 0xd7, 0x4b, 0x4a, 0xb2,
+	0xd6, 0x3f, 0xb7, 0x60, 0xbf, 0x17, 0xba, 0xfe, 0xbd, 0xef, 0xdc, 0x8d, 0xbc, 0xff, 0x57, 0xc3,
+	0x7c, 0x35, 0x6b, 0x87, 0xa2, 0xf2, 0xec, 0xcd, 0xed, 0x51, 0x52, 0xb4, 0xc7, 0xac, 0x60, 0xca,
+	0x9b, 0x0a, 0xa6, 0xb2, 0x5c, 0x30, 0xd9, 0x15, 0x6f, 0xab, 0xae, 0x78, 0xe5, 0xbd, 0x55, 0xfd,
+	0xf5, 0xef, 0xad, 0xf6, 0x9f, 0x4b, 0xb0, 0xb3, 0xf4, 0xb8, 0xf8, 0x35, 0x34, 0x35, 0xb3, 0xd7,
+	0x37, 0x0d, 0x6a, 0x70, 0x9b, 0xdf, 0xf6, 0xa9, 0x3d, 0x30, 0x3a, 0xf4, 0x9d, 0x6e, 0xd0, 0x0e,
+	0xfa, 0x0d, 0x3e, 0x82, 0x17, 0x6b, 0xf4, 0xda, 0x30, 0xdf, 0x1b, 0xa8, 0xa0, 0x60, 0xda, 0x15,
+	0xb1, 0x2c, 0xdd, 0x42, 0x5b, 0x8a, 0x5d, 0x2f, 0x88, 0x76, 0xdd, 0xef, 0x12, 0x83, 0xa2, 0xa2,
+	0x82, 0x6a, 0xa6, 0xc1, 0x89, 0x6e, 0x50, 0x86, 0x4a, 0xf8, 0x0d, 0xbc, 0x5a, 0xa1, 0x7d, 0xf3,
+	0x3d, 0x65, 0xb6, 0x35, 0xe8, 0xf7, 0xbb, 0xb7, 0xa8, 0x8c, 0x5f, 0x00, 0x5e, 0x11, 0xbc, 0x23,
+	0x06, 0xaa, 0xe0, 0x97, 0xf0, 0x7c, 0xc5, 0x6e, 0x51, 0xc3, 0x32, 0x19, 0xda, 0x56, 0xa0, 0x9e,
+	0xd9, 0x19, 0x74, 0x29, 0xaa, 0xe2, 0x43, 0xd8, 0x5f, 0x3b, 0x8e, 0x71, 0x54, 0x53, 0x1c, 0xa3,
+	0xf5, 0x07, 0x08, 0x14, 0xcf, 0x7d, 0x41, 0x38, 0xa7, 0xec, 0x16, 0xd5, 0x15, 0xcc, 0xe2, 0x26,
+	0x23, 0x97, 0x14, 0x35, 0x54, 0x31, 0xd0, 0x9e, 0xc9, 0x6e, 0xd1, 0x0e, 0xfe, 0x0c, 0x8e, 0x56,
+	0x10, 0x67, 0xc4, 0xb0, 0x34, 0xaa, 0xdf, 0x50, 0x86, 0x76, 0xf1, 0x17, 0xf0, 0x66, 0x85, 0x5f,
+	0xf6, 0x4d, 0x63, 0x49, 0xb4, 0x87, 0xbf, 0x82, 0xd6, 0x8a, 0xe8, 0xc7, 0x4b, 0xcb, 0x5e, 0xd5,
+	0xa1, 0xf6, 0xbf, 0x0a, 0x0b, 0x2f, 0xf3, 0x79, 0x9d, 0xe4, 0x41, 0xd8, 0xa4, 0xd3, 0xd3, 0x0d,
+	0xdb, 0xe2, 0x84, 0x2f, 0xd7, 0x42, 0x76, 0x6b, 0x2b, 0x3c, 0xaf, 0x86, 0x57, 0x70, 0xb8, 0x46,
+	0xbb, 0xa6, 0x76, 0x4d, 0x3b, 0x68, 0x0b, 0xb7, 0xe0, 0xb3, 0x35, 0x68, 0x5d, 0x0d, 0x38, 0xd7,
+	0x8d, 0x4b, 0xbb, 0x23, 0x36, 0x28, 0xe2, 0x63, 0x78, 0xa9, 0xd8, 0x3e, 0xdb, 0xa2, 0xd4, 0xfe,
+	0xb9, 0x00, 0x78, 0xfd, 0xdb, 0x6a, 0xe6, 0x65, 0xf6, 0x45, 0x85, 0xac, 0xc5, 0x9c, 0x47, 0xb5,
+	0x84, 0xf3, 0x90, 0xf3, 0x07, 0x5a, 0x80, 0x1d, 0xdd, 0x22, 0x17, 0x5d, 0x19, 0xb3, 0xc2, 0x95,
+	0x1a, 0x29, 0x2c, 0xaa, 0x20, 0xa7, 0x96, 0x78, 0x1c, 0x54, 0x6a, 0xff, 0x63, 0x31, 0xc1, 0xf3,
+	0xaf, 0xb9, 0x59, 0x82, 0x07, 0x16, 0xb9, 0xa4, 0x9f, 0x48, 0xf0, 0x32, 0xcf, 0xa3, 0xcd, 0xca,
+	0x67, 0x89, 0xea, 0x9d, 0x2e, 0x5d, 0x08, 0x75, 0x11, 0x11, 0x8d, 0xeb, 0x37, 0xa2, 0xd9, 0x54,
+	0x7e, 0x17, 0x03, 0xeb, 0x16, 0x95, 0xda, 0x7f, 0x5b, 0xfc, 0xac, 0x9b, 0x7f, 0x3b, 0xce, 0x2b,
+	0xa1, 0x4b, 0x58, 0xef, 0x53, 0x95, 0xb0, 0xc4, 0xf3, 0x40, 0x3f, 0x87, 0x63, 0xa5, 0x37, 0xb3,
+	0x19, 0xed, 0x13, 0x9d, 0xa1, 0xad, 0xf9, 0x5d, 0x2f, 0x48, 0x34, 0xa6, 0x73, 0x5d, 0x23, 0x5d,
+	0x54, 0xcc, 0xbb, 0x68, 0x09, 0xf7, 0xc8, 0x1f, 0x4d, 0x31, 0x1d, 0x94, 0x4c, 0x37, 0x4c, 0x86,
+	0xca, 0xca, 0xb8, 0xde, 0x13, 0x66, 0x88, 0x6b, 0xa9, 0x28, 0xe3, 0xd2, 0x0d, 0x4e, 0x59, 0x8f,
+	0x76, 0x74, 0xc2, 0x29, 0xda, 0x6e, 0xff, 0xa7, 0x00, 0xcf, 0x95, 0xdf, 0xc3, 0xf8, 0x04, 0x5e,
+	0x4b, 0x67, 0x8b, 0x13, 0xa3, 0x73, 0x71, 0xab, 0x48, 0x4a, 0x9e, 0xb4, 0x55, 0xc5, 0xca, 0xb8,
+	0x5c, 0xe1, 0x57, 0x26, 0x5f, 0xb8, 0xc0, 0x65, 0xa6, 0x99, 0x5d, 0x51, 0x6b, 0xa7, 0xf0, 0xa5,
+	0x02, 0xf6, 0x99, 0x79, 0xa3, 0x77, 0x44, 0xff, 0x58, 0x94, 0xdd, 0xe8, 0x1a, 0x45, 0xa5, 0xf6,
+	0xdf, 0x8b, 0xb0, 0xb7, 0xf2, 0xa1, 0x2d, 0xa6, 0x69, 0x3a, 0x05, 0xed, 0x1b, 0xd2, 0x1d, 0xd0,
+	0xf5, 0x11, 0xff, 0x0a, 0x0e, 0xd7, 0x05, 0x26, 0xbf, 0xa2, 0x0c, 0x15, 0xc4, 0x45, 0xa9, 0xbc,
+	0xd3, 0x67, 0xda, 0x12, 0xcf, 0xbc, 0x8e, 0x6f, 0xcc, 0x2e, 0xb7, 0x6c, 0xa2, 0xa1, 0xe2, 0xa7,
+	0x78, 0x47, 0x43, 0x25, 0xf5, 0xf6, 0xa4, 0xd7, 0xa7, 0x8c, 0x5a, 0xa8, 0xac, 0x0e, 0xed, 0x3d,
+	0xe1, 0xdc, 0x42, 0x15, 0x35, 0xbc, 0xa2, 0x8c, 0x7f, 0x40, 0xdb, 0xea, 0x8d, 0x35, 0xda, 0xb5,
+	0xf4, 0x81, 0x85, 0xaa, 0xe2, 0x36, 0xd7, 0x71, 0x9f, 0x32, 0x4d, 0x8c, 0x4e, 0x76, 0x85, 0x6a,
+	0xa2, 0x6b, 0xd6, 0x15, 0xac, 0xdf, 0x43, 0xa0, 0x46, 0x5a, 0xaf, 0x87, 0xea, 0xa2, 0xc4, 0xd6,
+	0x11, 0x67, 0x03, 0x7e, 0x95, 0x1a, 0x50, 0xa3, 0xfd, 0x73, 0x09, 0xd0, 0xea, 0x3f, 0x9c, 0xb5,
+	0x78, 0x2c, 0x8d, 0x74, 0xd7, 0x5a, 0x4e, 0xa1, 0xb8, 0x35, 0x35, 0x6e, 0xa6, 0x93, 0x4c, 0x41,
+	0x3f, 0xd0, 0x3e, 0x37, 0xd3, 0xea, 0x52, 0x50, 0xc2, 0xb9, 0x99, 0xbe, 0x8b, 0x15, 0xf0, 0x1d,
+	0xed, 0x71, 0x13, 0x95, 0x36, 0xb8, 0xf6, 0x75, 0xcd, 0x54, 0x5c, 0x4f, 0x0a, 0x0d, 0x62, 0x98,
+	0xa8, 0xb2, 0x61, 0xdf, 0x9e, 0xae, 0x31, 0x13, 0x6d, 0x6f, 0xa4, 0xdd, 0xae, 0x8e, 0xaa, 0x1b,
+	0xe8, 0xc0, 0xd0, 0xb9, 0x85, 0x6a, 0x1b, 0x8e, 0xbd, 0xd6, 0xbb, 0x26, 0x82, 0x0d, 0xb0, 0x47,
+	0x2f, 0x09, 0xaa, 0x6f, 0x80, 0x97, 0xfa, 0x25, 0x41, 0x8d, 0x0d, 0x90, 0x53, 0x46, 0xd0, 0xce,
+	0xa6, 0x3c, 0x50, 0x4e, 0xd0, 0xae, 0xe8, 0x6c, 0x05, 0xa4, 0x3f, 0x12, 0xb4, 0xb7, 0xf1, 0x66,
+	0x38, 0x27, 0x08, 0x6d, 0xbc, 0x55, 0x41, 0x9f, 0xb5, 0xff, 0x52, 0x80, 0xc6, 0xe2, 0x1f, 0xd8,
+	0x85, 0x28, 0xc4, 0x0c, 0x18, 0x58, 0x4b, 0x15, 0x72, 0x00, 0x68, 0x19, 0x9a, 0xd7, 0x4b, 0x0d,
+	0x3c, 0x73, 0x21, 0x37, 0x44, 0xef, 0x8a, 0x17, 0x19, 0xda, 0x5a, 0x28, 0xbc, 0x0c, 0x1b, 0xa6,
+	0x21, 0xde, 0x69, 0x84, 0xeb, 0xa6, 0x21, 0x66, 0xf1, 0xc5, 0x0f, 0x1f, 0xbe, 0x7f, 0xf0, 0x93,
+	0xc7, 0xe9, 0xdd, 0xd9, 0x30, 0x0c, 0xce, 0xc3, 0x89, 0x37, 0x1e, 0x86, 0x91, 0x7b, 0xee, 0x7a,
+	0x4f, 0xfe, 0xd0, 0xfb, 0x36, 0x70, 0xc6, 0xce, 0x83, 0x17, 0x78, 0xe3, 0xe4, 0x5b, 0x7f, 0x9c,
+	0x78, 0xd1, 0xbd, 0x33, 0xf4, 0xce, 0x9f, 0xbe, 0x3b, 0x7f, 0x08, 0xcf, 0xdd, 0xc0, 0xbf, 0xab,
+	0xc8, 0xcf, 0xfb, 0xef, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, 0xcf, 0xe7, 0x9a, 0xfa, 0x5d, 0x12,
+	0x00, 0x00,
+}
diff --git a/vendor/github.com/opencord/device-management-interface/go/dmi/hw_events_mgmt_service.pb.go b/vendor/github.com/opencord/device-management-interface/go/dmi/hw_events_mgmt_service.pb.go
new file mode 100644
index 0000000..f102422
--- /dev/null
+++ b/vendor/github.com/opencord/device-management-interface/go/dmi/hw_events_mgmt_service.pb.go
@@ -0,0 +1,1074 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/hw_events_mgmt_service.proto
+
+package dmi
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	grpc "google.golang.org/grpc"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type EventIds int32
+
+const (
+	EventIds_EVENT_NAME_UNDEFINED EventIds = 0
+	// Events from the Transceivers
+	EventIds_EVENT_TRANSCEIVER_PLUG_OUT                              EventIds = 100
+	EventIds_EVENT_TRANSCEIVER_PLUG_IN                               EventIds = 101
+	EventIds_EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD               EventIds = 102
+	EventIds_EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD               EventIds = 103
+	EventIds_EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD           EventIds = 104
+	EventIds_EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD           EventIds = 105
+	EventIds_EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD               EventIds = 106
+	EventIds_EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD               EventIds = 107
+	EventIds_EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD              EventIds = 108
+	EventIds_EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD              EventIds = 109
+	EventIds_EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD              EventIds = 110
+	EventIds_EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD              EventIds = 111
+	EventIds_EVENT_TRANSCEIVER_FAILURE                               EventIds = 112
+	EventIds_EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD_RECOVERED     EventIds = 113
+	EventIds_EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD_RECOVERED     EventIds = 114
+	EventIds_EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD_RECOVERED EventIds = 115
+	EventIds_EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD_RECOVERED EventIds = 116
+	EventIds_EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD_RECOVERED     EventIds = 117
+	EventIds_EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD_RECOVERED     EventIds = 118
+	EventIds_EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECOVERED    EventIds = 119
+	EventIds_EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD_RECOVERED    EventIds = 120
+	EventIds_EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_RECOVERED    EventIds = 121
+	EventIds_EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD_RECOVERED    EventIds = 122
+	EventIds_EVENT_TRANSCEIVER_FAILURE_RECOVERED                     EventIds = 123
+	// Events from the PSU
+	EventIds_EVENT_PSU_PLUG_OUT          EventIds = 200
+	EventIds_EVENT_PSU_PLUG_IN           EventIds = 201
+	EventIds_EVENT_PSU_FAILURE           EventIds = 202
+	EventIds_EVENT_PSU_FAILURE_RECOVERED EventIds = 203
+	// Events for the Fans
+	EventIds_EVENT_FAN_FAILURE           EventIds = 300
+	EventIds_EVENT_FAN_PLUG_OUT          EventIds = 301
+	EventIds_EVENT_FAN_PLUG_IN           EventIds = 302
+	EventIds_EVENT_FAN_FAILURE_RECOVERED EventIds = 303
+	// Events for the CPUs
+	EventIds_EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL           EventIds = 400
+	EventIds_EVENT_CPU_TEMPERATURE_ABOVE_FATAL              EventIds = 401
+	EventIds_EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_RECOVERED EventIds = 402
+	EventIds_EVENT_CPU_TEMPERATURE_ABOVE_FATAL_RECOVERED    EventIds = 403
+	// Events for the complete HW Device
+	EventIds_EVENT_HW_DEVICE_RESET                                EventIds = 500
+	EventIds_EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL           EventIds = 501
+	EventIds_EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL              EventIds = 502
+	EventIds_EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED EventIds = 503
+	EventIds_EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL_RECOVERED    EventIds = 504
+)
+
+var EventIds_name = map[int32]string{
+	0:   "EVENT_NAME_UNDEFINED",
+	100: "EVENT_TRANSCEIVER_PLUG_OUT",
+	101: "EVENT_TRANSCEIVER_PLUG_IN",
+	102: "EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD",
+	103: "EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD",
+	104: "EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD",
+	105: "EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD",
+	106: "EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD",
+	107: "EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD",
+	108: "EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD",
+	109: "EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD",
+	110: "EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD",
+	111: "EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD",
+	112: "EVENT_TRANSCEIVER_FAILURE",
+	113: "EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD_RECOVERED",
+	114: "EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD_RECOVERED",
+	115: "EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD_RECOVERED",
+	116: "EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD_RECOVERED",
+	117: "EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD_RECOVERED",
+	118: "EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD_RECOVERED",
+	119: "EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECOVERED",
+	120: "EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD_RECOVERED",
+	121: "EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_RECOVERED",
+	122: "EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD_RECOVERED",
+	123: "EVENT_TRANSCEIVER_FAILURE_RECOVERED",
+	200: "EVENT_PSU_PLUG_OUT",
+	201: "EVENT_PSU_PLUG_IN",
+	202: "EVENT_PSU_FAILURE",
+	203: "EVENT_PSU_FAILURE_RECOVERED",
+	300: "EVENT_FAN_FAILURE",
+	301: "EVENT_FAN_PLUG_OUT",
+	302: "EVENT_FAN_PLUG_IN",
+	303: "EVENT_FAN_FAILURE_RECOVERED",
+	400: "EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL",
+	401: "EVENT_CPU_TEMPERATURE_ABOVE_FATAL",
+	402: "EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_RECOVERED",
+	403: "EVENT_CPU_TEMPERATURE_ABOVE_FATAL_RECOVERED",
+	500: "EVENT_HW_DEVICE_RESET",
+	501: "EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL",
+	502: "EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL",
+	503: "EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED",
+	504: "EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL_RECOVERED",
+}
+
+var EventIds_value = map[string]int32{
+	"EVENT_NAME_UNDEFINED":                                    0,
+	"EVENT_TRANSCEIVER_PLUG_OUT":                              100,
+	"EVENT_TRANSCEIVER_PLUG_IN":                               101,
+	"EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD":               102,
+	"EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD":               103,
+	"EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD":           104,
+	"EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD":           105,
+	"EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD":               106,
+	"EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD":               107,
+	"EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD":              108,
+	"EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD":              109,
+	"EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD":              110,
+	"EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD":              111,
+	"EVENT_TRANSCEIVER_FAILURE":                               112,
+	"EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD_RECOVERED":     113,
+	"EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD_RECOVERED":     114,
+	"EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD_RECOVERED": 115,
+	"EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD_RECOVERED": 116,
+	"EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD_RECOVERED":     117,
+	"EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD_RECOVERED":     118,
+	"EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECOVERED":    119,
+	"EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD_RECOVERED":    120,
+	"EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_RECOVERED":    121,
+	"EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD_RECOVERED":    122,
+	"EVENT_TRANSCEIVER_FAILURE_RECOVERED":                     123,
+	"EVENT_PSU_PLUG_OUT":                                      200,
+	"EVENT_PSU_PLUG_IN":                                       201,
+	"EVENT_PSU_FAILURE":                                       202,
+	"EVENT_PSU_FAILURE_RECOVERED":                             203,
+	"EVENT_FAN_FAILURE":                                       300,
+	"EVENT_FAN_PLUG_OUT":                                      301,
+	"EVENT_FAN_PLUG_IN":                                       302,
+	"EVENT_FAN_FAILURE_RECOVERED":                             303,
+	"EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL":                    400,
+	"EVENT_CPU_TEMPERATURE_ABOVE_FATAL":                       401,
+	"EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_RECOVERED":          402,
+	"EVENT_CPU_TEMPERATURE_ABOVE_FATAL_RECOVERED":             403,
+	"EVENT_HW_DEVICE_RESET":                                   500,
+	"EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL":              501,
+	"EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL":                 502,
+	"EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED":    503,
+	"EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL_RECOVERED":       504,
+}
+
+func (x EventIds) String() string {
+	return proto.EnumName(EventIds_name, int32(x))
+}
+
+func (EventIds) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{0}
+}
+
+type ValueType struct {
+	// Types that are valid to be assigned to Val:
+	//	*ValueType_IntVal
+	//	*ValueType_UintVal
+	//	*ValueType_FloatVal
+	Val                  isValueType_Val `protobuf_oneof:"val"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *ValueType) Reset()         { *m = ValueType{} }
+func (m *ValueType) String() string { return proto.CompactTextString(m) }
+func (*ValueType) ProtoMessage()    {}
+func (*ValueType) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{0}
+}
+
+func (m *ValueType) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ValueType.Unmarshal(m, b)
+}
+func (m *ValueType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ValueType.Marshal(b, m, deterministic)
+}
+func (m *ValueType) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ValueType.Merge(m, src)
+}
+func (m *ValueType) XXX_Size() int {
+	return xxx_messageInfo_ValueType.Size(m)
+}
+func (m *ValueType) XXX_DiscardUnknown() {
+	xxx_messageInfo_ValueType.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ValueType proto.InternalMessageInfo
+
+type isValueType_Val interface {
+	isValueType_Val()
+}
+
+type ValueType_IntVal struct {
+	IntVal int64 `protobuf:"varint,1,opt,name=int_val,json=intVal,proto3,oneof"`
+}
+
+type ValueType_UintVal struct {
+	UintVal uint64 `protobuf:"varint,2,opt,name=uint_val,json=uintVal,proto3,oneof"`
+}
+
+type ValueType_FloatVal struct {
+	FloatVal float32 `protobuf:"fixed32,3,opt,name=float_val,json=floatVal,proto3,oneof"`
+}
+
+func (*ValueType_IntVal) isValueType_Val() {}
+
+func (*ValueType_UintVal) isValueType_Val() {}
+
+func (*ValueType_FloatVal) isValueType_Val() {}
+
+func (m *ValueType) GetVal() isValueType_Val {
+	if m != nil {
+		return m.Val
+	}
+	return nil
+}
+
+func (m *ValueType) GetIntVal() int64 {
+	if x, ok := m.GetVal().(*ValueType_IntVal); ok {
+		return x.IntVal
+	}
+	return 0
+}
+
+func (m *ValueType) GetUintVal() uint64 {
+	if x, ok := m.GetVal().(*ValueType_UintVal); ok {
+		return x.UintVal
+	}
+	return 0
+}
+
+func (m *ValueType) GetFloatVal() float32 {
+	if x, ok := m.GetVal().(*ValueType_FloatVal); ok {
+		return x.FloatVal
+	}
+	return 0
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ValueType) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ValueType_IntVal)(nil),
+		(*ValueType_UintVal)(nil),
+		(*ValueType_FloatVal)(nil),
+	}
+}
+
+type WaterMarks struct {
+	High                 *ValueType `protobuf:"bytes,1,opt,name=high,proto3" json:"high,omitempty"`
+	Low                  *ValueType `protobuf:"bytes,2,opt,name=low,proto3" json:"low,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *WaterMarks) Reset()         { *m = WaterMarks{} }
+func (m *WaterMarks) String() string { return proto.CompactTextString(m) }
+func (*WaterMarks) ProtoMessage()    {}
+func (*WaterMarks) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{1}
+}
+
+func (m *WaterMarks) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WaterMarks.Unmarshal(m, b)
+}
+func (m *WaterMarks) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WaterMarks.Marshal(b, m, deterministic)
+}
+func (m *WaterMarks) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WaterMarks.Merge(m, src)
+}
+func (m *WaterMarks) XXX_Size() int {
+	return xxx_messageInfo_WaterMarks.Size(m)
+}
+func (m *WaterMarks) XXX_DiscardUnknown() {
+	xxx_messageInfo_WaterMarks.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WaterMarks proto.InternalMessageInfo
+
+func (m *WaterMarks) GetHigh() *ValueType {
+	if m != nil {
+		return m.High
+	}
+	return nil
+}
+
+func (m *WaterMarks) GetLow() *ValueType {
+	if m != nil {
+		return m.Low
+	}
+	return nil
+}
+
+type Thresholds struct {
+	// Types that are valid to be assigned to Threshold:
+	//	*Thresholds_Upper
+	//	*Thresholds_Lower
+	Threshold            isThresholds_Threshold `protobuf_oneof:"threshold"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *Thresholds) Reset()         { *m = Thresholds{} }
+func (m *Thresholds) String() string { return proto.CompactTextString(m) }
+func (*Thresholds) ProtoMessage()    {}
+func (*Thresholds) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{2}
+}
+
+func (m *Thresholds) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Thresholds.Unmarshal(m, b)
+}
+func (m *Thresholds) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Thresholds.Marshal(b, m, deterministic)
+}
+func (m *Thresholds) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Thresholds.Merge(m, src)
+}
+func (m *Thresholds) XXX_Size() int {
+	return xxx_messageInfo_Thresholds.Size(m)
+}
+func (m *Thresholds) XXX_DiscardUnknown() {
+	xxx_messageInfo_Thresholds.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Thresholds proto.InternalMessageInfo
+
+type isThresholds_Threshold interface {
+	isThresholds_Threshold()
+}
+
+type Thresholds_Upper struct {
+	Upper *WaterMarks `protobuf:"bytes,1,opt,name=upper,proto3,oneof"`
+}
+
+type Thresholds_Lower struct {
+	Lower *WaterMarks `protobuf:"bytes,2,opt,name=lower,proto3,oneof"`
+}
+
+func (*Thresholds_Upper) isThresholds_Threshold() {}
+
+func (*Thresholds_Lower) isThresholds_Threshold() {}
+
+func (m *Thresholds) GetThreshold() isThresholds_Threshold {
+	if m != nil {
+		return m.Threshold
+	}
+	return nil
+}
+
+func (m *Thresholds) GetUpper() *WaterMarks {
+	if x, ok := m.GetThreshold().(*Thresholds_Upper); ok {
+		return x.Upper
+	}
+	return nil
+}
+
+func (m *Thresholds) GetLower() *WaterMarks {
+	if x, ok := m.GetThreshold().(*Thresholds_Lower); ok {
+		return x.Lower
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Thresholds) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Thresholds_Upper)(nil),
+		(*Thresholds_Lower)(nil),
+	}
+}
+
+type ThresholdInformation struct {
+	ObservedValue        *ValueType  `protobuf:"bytes,1,opt,name=observed_value,json=observedValue,proto3" json:"observed_value,omitempty"`
+	Thresholds           *Thresholds `protobuf:"bytes,2,opt,name=thresholds,proto3" json:"thresholds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *ThresholdInformation) Reset()         { *m = ThresholdInformation{} }
+func (m *ThresholdInformation) String() string { return proto.CompactTextString(m) }
+func (*ThresholdInformation) ProtoMessage()    {}
+func (*ThresholdInformation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{3}
+}
+
+func (m *ThresholdInformation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ThresholdInformation.Unmarshal(m, b)
+}
+func (m *ThresholdInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ThresholdInformation.Marshal(b, m, deterministic)
+}
+func (m *ThresholdInformation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ThresholdInformation.Merge(m, src)
+}
+func (m *ThresholdInformation) XXX_Size() int {
+	return xxx_messageInfo_ThresholdInformation.Size(m)
+}
+func (m *ThresholdInformation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ThresholdInformation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ThresholdInformation proto.InternalMessageInfo
+
+func (m *ThresholdInformation) GetObservedValue() *ValueType {
+	if m != nil {
+		return m.ObservedValue
+	}
+	return nil
+}
+
+func (m *ThresholdInformation) GetThresholds() *Thresholds {
+	if m != nil {
+		return m.Thresholds
+	}
+	return nil
+}
+
+type EventCfg struct {
+	EventId      EventIds `protobuf:"varint,1,opt,name=event_id,json=eventId,proto3,enum=dmi.EventIds" json:"event_id,omitempty"`
+	IsConfigured bool     `protobuf:"varint,2,opt,name=is_configured,json=isConfigured,proto3" json:"is_configured,omitempty"`
+	// Optional threshold values, applicable only for some specific events
+	Thresholds           *Thresholds `protobuf:"bytes,3,opt,name=thresholds,proto3" json:"thresholds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *EventCfg) Reset()         { *m = EventCfg{} }
+func (m *EventCfg) String() string { return proto.CompactTextString(m) }
+func (*EventCfg) ProtoMessage()    {}
+func (*EventCfg) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{4}
+}
+
+func (m *EventCfg) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventCfg.Unmarshal(m, b)
+}
+func (m *EventCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventCfg.Marshal(b, m, deterministic)
+}
+func (m *EventCfg) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventCfg.Merge(m, src)
+}
+func (m *EventCfg) XXX_Size() int {
+	return xxx_messageInfo_EventCfg.Size(m)
+}
+func (m *EventCfg) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventCfg.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventCfg proto.InternalMessageInfo
+
+func (m *EventCfg) GetEventId() EventIds {
+	if m != nil {
+		return m.EventId
+	}
+	return EventIds_EVENT_NAME_UNDEFINED
+}
+
+func (m *EventCfg) GetIsConfigured() bool {
+	if m != nil {
+		return m.IsConfigured
+	}
+	return false
+}
+
+func (m *EventCfg) GetThresholds() *Thresholds {
+	if m != nil {
+		return m.Thresholds
+	}
+	return nil
+}
+
+type EventsCfg struct {
+	Items                []*EventCfg `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *EventsCfg) Reset()         { *m = EventsCfg{} }
+func (m *EventsCfg) String() string { return proto.CompactTextString(m) }
+func (*EventsCfg) ProtoMessage()    {}
+func (*EventsCfg) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{5}
+}
+
+func (m *EventsCfg) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventsCfg.Unmarshal(m, b)
+}
+func (m *EventsCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventsCfg.Marshal(b, m, deterministic)
+}
+func (m *EventsCfg) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventsCfg.Merge(m, src)
+}
+func (m *EventsCfg) XXX_Size() int {
+	return xxx_messageInfo_EventsCfg.Size(m)
+}
+func (m *EventsCfg) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventsCfg.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventsCfg proto.InternalMessageInfo
+
+func (m *EventsCfg) GetItems() []*EventCfg {
+	if m != nil {
+		return m.Items
+	}
+	return nil
+}
+
+type ListEventsResponse struct {
+	Status               Status     `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason     `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	Events               *EventsCfg `protobuf:"bytes,3,opt,name=events,proto3" json:"events,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *ListEventsResponse) Reset()         { *m = ListEventsResponse{} }
+func (m *ListEventsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListEventsResponse) ProtoMessage()    {}
+func (*ListEventsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{6}
+}
+
+func (m *ListEventsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListEventsResponse.Unmarshal(m, b)
+}
+func (m *ListEventsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListEventsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListEventsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListEventsResponse.Merge(m, src)
+}
+func (m *ListEventsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListEventsResponse.Size(m)
+}
+func (m *ListEventsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListEventsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListEventsResponse proto.InternalMessageInfo
+
+func (m *ListEventsResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *ListEventsResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *ListEventsResponse) GetEvents() *EventsCfg {
+	if m != nil {
+		return m.Events
+	}
+	return nil
+}
+
+type EventsConfigurationRequest struct {
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// Types that are valid to be assigned to Operation:
+	//	*EventsConfigurationRequest_Changes
+	//	*EventsConfigurationRequest_ResetToDefault
+	Operation            isEventsConfigurationRequest_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *EventsConfigurationRequest) Reset()         { *m = EventsConfigurationRequest{} }
+func (m *EventsConfigurationRequest) String() string { return proto.CompactTextString(m) }
+func (*EventsConfigurationRequest) ProtoMessage()    {}
+func (*EventsConfigurationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{7}
+}
+
+func (m *EventsConfigurationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventsConfigurationRequest.Unmarshal(m, b)
+}
+func (m *EventsConfigurationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventsConfigurationRequest.Marshal(b, m, deterministic)
+}
+func (m *EventsConfigurationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventsConfigurationRequest.Merge(m, src)
+}
+func (m *EventsConfigurationRequest) XXX_Size() int {
+	return xxx_messageInfo_EventsConfigurationRequest.Size(m)
+}
+func (m *EventsConfigurationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventsConfigurationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventsConfigurationRequest proto.InternalMessageInfo
+
+func (m *EventsConfigurationRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+type isEventsConfigurationRequest_Operation interface {
+	isEventsConfigurationRequest_Operation()
+}
+
+type EventsConfigurationRequest_Changes struct {
+	Changes *EventsCfg `protobuf:"bytes,2,opt,name=changes,proto3,oneof"`
+}
+
+type EventsConfigurationRequest_ResetToDefault struct {
+	ResetToDefault bool `protobuf:"varint,3,opt,name=reset_to_default,json=resetToDefault,proto3,oneof"`
+}
+
+func (*EventsConfigurationRequest_Changes) isEventsConfigurationRequest_Operation() {}
+
+func (*EventsConfigurationRequest_ResetToDefault) isEventsConfigurationRequest_Operation() {}
+
+func (m *EventsConfigurationRequest) GetOperation() isEventsConfigurationRequest_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *EventsConfigurationRequest) GetChanges() *EventsCfg {
+	if x, ok := m.GetOperation().(*EventsConfigurationRequest_Changes); ok {
+		return x.Changes
+	}
+	return nil
+}
+
+func (m *EventsConfigurationRequest) GetResetToDefault() bool {
+	if x, ok := m.GetOperation().(*EventsConfigurationRequest_ResetToDefault); ok {
+		return x.ResetToDefault
+	}
+	return false
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*EventsConfigurationRequest) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*EventsConfigurationRequest_Changes)(nil),
+		(*EventsConfigurationRequest_ResetToDefault)(nil),
+	}
+}
+
+type EventsConfigurationResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EventsConfigurationResponse) Reset()         { *m = EventsConfigurationResponse{} }
+func (m *EventsConfigurationResponse) String() string { return proto.CompactTextString(m) }
+func (*EventsConfigurationResponse) ProtoMessage()    {}
+func (*EventsConfigurationResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{8}
+}
+
+func (m *EventsConfigurationResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventsConfigurationResponse.Unmarshal(m, b)
+}
+func (m *EventsConfigurationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventsConfigurationResponse.Marshal(b, m, deterministic)
+}
+func (m *EventsConfigurationResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventsConfigurationResponse.Merge(m, src)
+}
+func (m *EventsConfigurationResponse) XXX_Size() int {
+	return xxx_messageInfo_EventsConfigurationResponse.Size(m)
+}
+func (m *EventsConfigurationResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventsConfigurationResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventsConfigurationResponse proto.InternalMessageInfo
+
+func (m *EventsConfigurationResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *EventsConfigurationResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+type EventMetaData struct {
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// uuid of the component
+	ComponentUuid        *Uuid    `protobuf:"bytes,2,opt,name=component_uuid,json=componentUuid,proto3" json:"component_uuid,omitempty"`
+	ComponentName        string   `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EventMetaData) Reset()         { *m = EventMetaData{} }
+func (m *EventMetaData) String() string { return proto.CompactTextString(m) }
+func (*EventMetaData) ProtoMessage()    {}
+func (*EventMetaData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{9}
+}
+
+func (m *EventMetaData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventMetaData.Unmarshal(m, b)
+}
+func (m *EventMetaData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventMetaData.Marshal(b, m, deterministic)
+}
+func (m *EventMetaData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventMetaData.Merge(m, src)
+}
+func (m *EventMetaData) XXX_Size() int {
+	return xxx_messageInfo_EventMetaData.Size(m)
+}
+func (m *EventMetaData) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventMetaData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventMetaData proto.InternalMessageInfo
+
+func (m *EventMetaData) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *EventMetaData) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *EventMetaData) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+type Event struct {
+	EventMetadata *EventMetaData       `protobuf:"bytes,1,opt,name=event_metadata,json=eventMetadata,proto3" json:"event_metadata,omitempty"`
+	EventId       EventIds             `protobuf:"varint,2,opt,name=event_id,json=eventId,proto3,enum=dmi.EventIds" json:"event_id,omitempty"`
+	RaisedTs      *timestamp.Timestamp `protobuf:"bytes,3,opt,name=raised_ts,json=raisedTs,proto3" json:"raised_ts,omitempty"`
+	// Optional threshold information for an event
+	ThresholdInfo *ThresholdInformation `protobuf:"bytes,4,opt,name=threshold_info,json=thresholdInfo,proto3" json:"threshold_info,omitempty"`
+	// Any additional info regarding the event
+	AddInfo              string   `protobuf:"bytes,5,opt,name=add_info,json=addInfo,proto3" json:"add_info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Event) Reset()         { *m = Event{} }
+func (m *Event) String() string { return proto.CompactTextString(m) }
+func (*Event) ProtoMessage()    {}
+func (*Event) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{10}
+}
+
+func (m *Event) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Event.Unmarshal(m, b)
+}
+func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Event.Marshal(b, m, deterministic)
+}
+func (m *Event) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Event.Merge(m, src)
+}
+func (m *Event) XXX_Size() int {
+	return xxx_messageInfo_Event.Size(m)
+}
+func (m *Event) XXX_DiscardUnknown() {
+	xxx_messageInfo_Event.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Event proto.InternalMessageInfo
+
+func (m *Event) GetEventMetadata() *EventMetaData {
+	if m != nil {
+		return m.EventMetadata
+	}
+	return nil
+}
+
+func (m *Event) GetEventId() EventIds {
+	if m != nil {
+		return m.EventId
+	}
+	return EventIds_EVENT_NAME_UNDEFINED
+}
+
+func (m *Event) GetRaisedTs() *timestamp.Timestamp {
+	if m != nil {
+		return m.RaisedTs
+	}
+	return nil
+}
+
+func (m *Event) GetThresholdInfo() *ThresholdInformation {
+	if m != nil {
+		return m.ThresholdInfo
+	}
+	return nil
+}
+
+func (m *Event) GetAddInfo() string {
+	if m != nil {
+		return m.AddInfo
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterEnum("dmi.EventIds", EventIds_name, EventIds_value)
+	proto.RegisterType((*ValueType)(nil), "dmi.ValueType")
+	proto.RegisterType((*WaterMarks)(nil), "dmi.WaterMarks")
+	proto.RegisterType((*Thresholds)(nil), "dmi.Thresholds")
+	proto.RegisterType((*ThresholdInformation)(nil), "dmi.ThresholdInformation")
+	proto.RegisterType((*EventCfg)(nil), "dmi.EventCfg")
+	proto.RegisterType((*EventsCfg)(nil), "dmi.EventsCfg")
+	proto.RegisterType((*ListEventsResponse)(nil), "dmi.ListEventsResponse")
+	proto.RegisterType((*EventsConfigurationRequest)(nil), "dmi.EventsConfigurationRequest")
+	proto.RegisterType((*EventsConfigurationResponse)(nil), "dmi.EventsConfigurationResponse")
+	proto.RegisterType((*EventMetaData)(nil), "dmi.EventMetaData")
+	proto.RegisterType((*Event)(nil), "dmi.Event")
+}
+
+func init() { proto.RegisterFile("dmi/hw_events_mgmt_service.proto", fileDescriptor_8962d785556e9979) }
+
+var fileDescriptor_8962d785556e9979 = []byte{
+	// 1313 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4b, 0x73, 0x1a, 0x47,
+	0x17, 0x15, 0x8c, 0x25, 0xc1, 0x95, 0xe1, 0xc3, 0x5d, 0xfe, 0x62, 0x09, 0x97, 0x63, 0x82, 0x12,
+	0x5b, 0x56, 0x22, 0xb0, 0xa5, 0xc4, 0x8e, 0xcb, 0x9b, 0x20, 0x18, 0x19, 0xaa, 0x10, 0xa8, 0x5a,
+	0x03, 0x4a, 0x65, 0x91, 0xa9, 0x16, 0xd3, 0x0c, 0x13, 0x31, 0xd3, 0x78, 0xa6, 0x07, 0xc5, 0x49,
+	0x55, 0x16, 0x59, 0x64, 0x91, 0x55, 0x5e, 0x3f, 0x23, 0x4e, 0x96, 0xf9, 0x0b, 0x79, 0xac, 0xf2,
+	0x5f, 0xf2, 0x5a, 0xa6, 0xa6, 0x67, 0x80, 0x11, 0x4f, 0xb9, 0x2a, 0x3b, 0xcd, 0x3d, 0xe7, 0xdc,
+	0x73, 0xba, 0xb9, 0xdd, 0xd5, 0x82, 0x8c, 0x66, 0x1a, 0xf9, 0xce, 0xb9, 0x4a, 0xfb, 0xd4, 0xe2,
+	0x8e, 0x6a, 0xea, 0x26, 0x57, 0x1d, 0x6a, 0xf7, 0x8d, 0x16, 0xcd, 0xf5, 0x6c, 0xc6, 0x19, 0x92,
+	0x34, 0xd3, 0x48, 0x5f, 0xf3, 0x68, 0x2d, 0x66, 0x9a, 0xcc, 0x72, 0xfc, 0x7a, 0xfa, 0xaa, 0xaf,
+	0x0c, 0xbe, 0x6e, 0xeb, 0x8c, 0xe9, 0x5d, 0x9a, 0x17, 0x5f, 0xa7, 0x6e, 0x3b, 0xcf, 0x0d, 0x93,
+	0x3a, 0x9c, 0x98, 0x3d, 0x9f, 0x90, 0x35, 0x20, 0xde, 0x24, 0x5d, 0x97, 0x2a, 0xcf, 0x7b, 0x14,
+	0x6d, 0xc0, 0xaa, 0x61, 0x71, 0xb5, 0x4f, 0xba, 0xeb, 0x91, 0x4c, 0x64, 0x4b, 0x2a, 0x2f, 0xe1,
+	0x15, 0xc3, 0xe2, 0x4d, 0xd2, 0x45, 0x37, 0x21, 0xe6, 0x0e, 0xb0, 0x68, 0x26, 0xb2, 0x75, 0xa5,
+	0xbc, 0x84, 0x57, 0xdd, 0x00, 0xbc, 0x05, 0xf1, 0x76, 0x97, 0x11, 0x1f, 0x95, 0x32, 0x91, 0xad,
+	0x68, 0x79, 0x09, 0xc7, 0x44, 0xa9, 0x49, 0xba, 0xfb, 0xcb, 0x20, 0xf5, 0x49, 0x37, 0x8b, 0x01,
+	0x4e, 0x08, 0xa7, 0xf6, 0x21, 0xb1, 0xcf, 0x1c, 0x94, 0x85, 0x2b, 0x1d, 0x43, 0xef, 0x08, 0xa3,
+	0xb5, 0xdd, 0x64, 0x4e, 0x33, 0x8d, 0xdc, 0x30, 0x09, 0x16, 0x18, 0xca, 0x80, 0xd4, 0x65, 0xe7,
+	0xc2, 0x6f, 0x92, 0xe2, 0x41, 0xd9, 0x33, 0x00, 0xa5, 0x63, 0x53, 0xa7, 0xc3, 0xba, 0x9a, 0x83,
+	0xee, 0xc2, 0xb2, 0xdb, 0xeb, 0x51, 0x3b, 0x68, 0xfa, 0x3f, 0xa1, 0x18, 0x79, 0x96, 0x97, 0xb0,
+	0x8f, 0x7b, 0xc4, 0x2e, 0x3b, 0xa7, 0x76, 0xd0, 0x7a, 0x1a, 0x51, 0xe0, 0xfb, 0x6b, 0x10, 0xe7,
+	0x83, 0xfe, 0xd9, 0xcf, 0xe0, 0xfa, 0xd0, 0xac, 0x62, 0xb5, 0x99, 0x6d, 0x12, 0x6e, 0x30, 0x0b,
+	0xbd, 0x03, 0x49, 0x76, 0xea, 0xfd, 0x3a, 0x54, 0xf3, 0x76, 0xc0, 0xa5, 0x33, 0x16, 0x95, 0x18,
+	0xb0, 0x44, 0x09, 0xe5, 0x01, 0x86, 0xbd, 0x9d, 0x0b, 0x49, 0x46, 0x4b, 0xc2, 0x21, 0x4a, 0xf6,
+	0xcb, 0x08, 0xc4, 0x64, 0x6f, 0x20, 0x8a, 0x6d, 0x1d, 0x6d, 0x41, 0x4c, 0x0c, 0x87, 0x6a, 0x68,
+	0xc2, 0x2e, 0xb9, 0x9b, 0x10, 0x5a, 0x41, 0xa8, 0x68, 0x0e, 0x5e, 0xa5, 0xfe, 0x5f, 0x68, 0x13,
+	0x12, 0x86, 0xa3, 0xb6, 0x98, 0xd5, 0x36, 0x74, 0xd7, 0xa6, 0x9a, 0xb0, 0x8a, 0xe1, 0xab, 0x86,
+	0x53, 0x1c, 0xd6, 0xc6, 0xc2, 0x48, 0x8b, 0xc3, 0xdc, 0x87, 0xb8, 0xb0, 0x72, 0xbc, 0x30, 0x9b,
+	0xb0, 0x6c, 0x70, 0x6a, 0x3a, 0xeb, 0x91, 0x8c, 0xb4, 0xb5, 0x16, 0x4e, 0x52, 0x6c, 0xeb, 0xd8,
+	0xc7, 0xb2, 0x5f, 0x44, 0x00, 0x55, 0x0d, 0x87, 0xfb, 0x32, 0x4c, 0x9d, 0x1e, 0xb3, 0x1c, 0x8a,
+	0x36, 0x61, 0xc5, 0xe1, 0x84, 0xbb, 0x4e, 0xb0, 0x8c, 0x35, 0x21, 0x3e, 0x16, 0x25, 0x1c, 0x40,
+	0x1e, 0xc9, 0xa6, 0xc4, 0x61, 0x96, 0x08, 0x3f, 0x20, 0x61, 0x51, 0xc2, 0x01, 0x84, 0xee, 0xc0,
+	0x8a, 0x7f, 0x5e, 0x82, 0xfc, 0xc9, 0x51, 0x0c, 0x2f, 0x25, 0x0e, 0xd0, 0xec, 0x8b, 0x08, 0xa4,
+	0x83, 0x6a, 0xb0, 0x01, 0xe2, 0x77, 0xc4, 0xf4, 0x99, 0x4b, 0x1d, 0x8e, 0xb6, 0x61, 0x4d, 0xa3,
+	0xde, 0x49, 0x53, 0x5d, 0x37, 0xd8, 0xdc, 0xb5, 0xdd, 0xb8, 0xe8, 0xd5, 0x70, 0x0d, 0x0d, 0x83,
+	0x8f, 0x7a, 0x7f, 0xa3, 0x6d, 0x58, 0x6d, 0x75, 0x88, 0xa5, 0x53, 0xe7, 0xc2, 0x94, 0x0e, 0x3d,
+	0xbd, 0x53, 0x12, 0x10, 0xd0, 0x36, 0xa4, 0x6c, 0xea, 0x50, 0xae, 0x72, 0xa6, 0x6a, 0xb4, 0x4d,
+	0xdc, 0x2e, 0x17, 0x41, 0x63, 0xe5, 0x25, 0x9c, 0x14, 0x88, 0xc2, 0x4a, 0x7e, 0xdd, 0x9b, 0x3b,
+	0xd6, 0xa3, 0x7e, 0xae, 0xac, 0x0e, 0x37, 0xa7, 0xc6, 0xfd, 0xaf, 0x37, 0x30, 0xfb, 0x5d, 0x04,
+	0x12, 0xc2, 0xe9, 0x90, 0x72, 0x52, 0x22, 0x9c, 0xbc, 0xd4, 0x5e, 0xdc, 0x87, 0x64, 0x8b, 0x99,
+	0x3d, 0x66, 0x79, 0x53, 0x29, 0xe8, 0xd1, 0x71, 0x7a, 0x62, 0x48, 0x10, 0x8a, 0x37, 0xc2, 0x0a,
+	0x8b, 0x98, 0x54, 0xec, 0x47, 0x3c, 0x44, 0xab, 0x11, 0x93, 0x66, 0x3f, 0x8f, 0xc2, 0xb2, 0x88,
+	0x85, 0x1e, 0x43, 0xd2, 0x1f, 0x7a, 0x93, 0x72, 0xa2, 0x11, 0x4e, 0x82, 0x44, 0x68, 0xb4, 0xeb,
+	0x83, 0xe8, 0x38, 0x41, 0x07, 0x9f, 0x1e, 0xf1, 0xc2, 0x79, 0x89, 0xce, 0x3d, 0x2f, 0x8f, 0x20,
+	0x6e, 0x13, 0xc3, 0xa1, 0x9a, 0x3a, 0x9c, 0xa4, 0x74, 0xce, 0xbf, 0x47, 0x73, 0x83, 0x7b, 0x34,
+	0xa7, 0x0c, 0xee, 0x51, 0x1c, 0xf3, 0xc9, 0x8a, 0x83, 0xde, 0x83, 0xe4, 0xf0, 0x80, 0xa8, 0x86,
+	0xd5, 0x66, 0xeb, 0x57, 0x84, 0x7a, 0xe3, 0xe2, 0x39, 0x0a, 0x5d, 0x1d, 0x38, 0xc1, 0xc3, 0x55,
+	0xb4, 0x01, 0x31, 0xa2, 0x05, 0xda, 0x65, 0xb1, 0x15, 0xab, 0x44, 0x13, 0xd0, 0xf6, 0xef, 0xc9,
+	0xe0, 0xf0, 0x57, 0x34, 0x07, 0xad, 0xc3, 0x75, 0xb9, 0x29, 0xd7, 0x14, 0xb5, 0x56, 0x38, 0x94,
+	0xd5, 0x46, 0xad, 0x24, 0x1f, 0x54, 0x6a, 0x72, 0x29, 0xb5, 0x84, 0x5e, 0x85, 0xb4, 0x8f, 0x28,
+	0xb8, 0x50, 0x3b, 0x2e, 0xca, 0x95, 0xa6, 0x8c, 0xd5, 0xa3, 0x6a, 0xe3, 0xa9, 0x5a, 0x6f, 0x28,
+	0x29, 0x0d, 0xdd, 0x82, 0x8d, 0x19, 0x78, 0xa5, 0x96, 0xa2, 0x68, 0x07, 0xee, 0x4d, 0xc2, 0xcd,
+	0x7a, 0x55, 0x29, 0x3c, 0x95, 0xd5, 0xc2, 0x7e, 0xbd, 0x29, 0xab, 0x4a, 0x19, 0xcb, 0xc7, 0xe5,
+	0x7a, 0xb5, 0x94, 0x6a, 0xcf, 0xa7, 0xef, 0xcb, 0xd5, 0xfa, 0x49, 0x88, 0xae, 0xa3, 0x07, 0xb0,
+	0x33, 0x49, 0x57, 0xe4, 0xc3, 0x23, 0x19, 0x17, 0x94, 0x06, 0x9e, 0x74, 0xe8, 0x2c, 0x96, 0x8c,
+	0xbb, 0x18, 0xd3, 0x43, 0x15, 0x1b, 0x18, 0x7b, 0xb5, 0x71, 0x87, 0x8f, 0xe6, 0xd3, 0xc7, 0xbb,
+	0x9f, 0xa1, 0x1c, 0x6c, 0x4f, 0xd2, 0xf1, 0xfb, 0xea, 0x51, 0xfd, 0x44, 0xc6, 0x13, 0xed, 0xbb,
+	0x0b, 0xf8, 0xe3, 0xfd, 0xcd, 0xe9, 0x7c, 0x65, 0x56, 0x7f, 0x6b, 0x01, 0x7f, 0xbc, 0x3f, 0x9b,
+	0x3e, 0x00, 0x07, 0x85, 0x4a, 0xb5, 0x81, 0xe5, 0x54, 0x0f, 0x3d, 0x82, 0xbd, 0x4b, 0x0f, 0x80,
+	0x8a, 0xe5, 0x62, 0xbd, 0x29, 0x63, 0xb9, 0x94, 0x7a, 0x36, 0x5f, 0x38, 0x16, 0x23, 0x24, 0xb4,
+	0xd1, 0x13, 0x78, 0xf4, 0x52, 0x43, 0x11, 0x12, 0x3b, 0x8b, 0xc5, 0xb3, 0x9d, 0xf9, 0xf4, 0xc8,
+	0x33, 0x06, 0x25, 0x24, 0x74, 0xe7, 0x0b, 0x67, 0x3b, 0xf6, 0xd1, 0xbb, 0xf0, 0xf6, 0xe5, 0x87,
+	0x27, 0xa4, 0x3c, 0x5f, 0xa0, 0x9c, 0xed, 0xf9, 0xf1, 0x74, 0xa5, 0xb2, 0xd8, 0xf3, 0xf9, 0x02,
+	0xe5, 0x6c, 0xcf, 0x4f, 0xd0, 0x5d, 0xd8, 0x9c, 0x39, 0x64, 0x21, 0xe2, 0xa7, 0xe8, 0x06, 0x20,
+	0x9f, 0x78, 0x74, 0xdc, 0x18, 0x5d, 0x53, 0x3f, 0x47, 0xd0, 0x2b, 0x70, 0x6d, 0x0c, 0xa8, 0xd4,
+	0x52, 0xbf, 0x8c, 0xd5, 0x07, 0x63, 0xfb, 0x6b, 0x04, 0x65, 0xe0, 0xe6, 0x44, 0x3d, 0xe4, 0xf4,
+	0x5b, 0x48, 0x79, 0x50, 0xa8, 0x0d, 0x95, 0xdf, 0x47, 0x47, 0x11, 0xbc, 0xfa, 0x30, 0xc2, 0x8b,
+	0xe8, 0x45, 0xc1, 0x20, 0xc2, 0x0f, 0xd1, 0x91, 0x55, 0xa8, 0x51, 0xc8, 0xea, 0xc7, 0x28, 0xba,
+	0x07, 0xaf, 0xfb, 0x8c, 0xe2, 0x51, 0x63, 0xca, 0x28, 0x17, 0x71, 0x45, 0xa9, 0x14, 0x0b, 0xd5,
+	0xd4, 0x57, 0x12, 0xba, 0x03, 0xaf, 0xcd, 0xa3, 0x1e, 0x14, 0x94, 0x42, 0x35, 0xf5, 0xb5, 0x84,
+	0xf6, 0x20, 0x77, 0x99, 0x96, 0xa1, 0x1c, 0xdf, 0x48, 0xe8, 0x3e, 0xbc, 0xb9, 0xb0, 0x79, 0x48,
+	0xf1, 0xad, 0x84, 0xd2, 0xf0, 0x7f, 0x5f, 0x51, 0x3e, 0x51, 0x4b, 0x72, 0xb3, 0x52, 0xf4, 0x56,
+	0x76, 0x2c, 0x2b, 0xa9, 0x3f, 0x24, 0x94, 0x1f, 0xdc, 0x34, 0x23, 0x6c, 0xce, 0xda, 0xfe, 0x94,
+	0xd0, 0x5b, 0x70, 0x77, 0xb1, 0xc0, 0x5f, 0xe1, 0x5f, 0x12, 0x7a, 0x3c, 0x98, 0xb6, 0xcb, 0xb4,
+	0x0f, 0xa5, 0xfe, 0x5b, 0x42, 0x0f, 0xe1, 0xc1, 0x25, 0x8d, 0x42, 0xba, 0x7f, 0xa4, 0xdd, 0x9f,
+	0x22, 0x70, 0xab, 0x46, 0xb8, 0xd1, 0xa7, 0xfe, 0xfb, 0xea, 0x90, 0x58, 0x44, 0xa7, 0x26, 0xb5,
+	0xf8, 0xb1, 0xff, 0xbf, 0x16, 0x7a, 0x08, 0x30, 0x7a, 0xb2, 0x22, 0xff, 0x41, 0x5c, 0x26, 0xb6,
+	0x76, 0x4e, 0x6c, 0x5a, 0x29, 0xa5, 0x6f, 0x88, 0xc2, 0x94, 0x47, 0xed, 0x87, 0xb0, 0xd1, 0xe8,
+	0x69, 0x84, 0xd3, 0x29, 0x0f, 0x37, 0x74, 0x3b, 0xfc, 0x46, 0x9c, 0xf2, 0x02, 0x4d, 0x67, 0x66,
+	0x13, 0xfc, 0xfe, 0xfb, 0x4f, 0x3e, 0x78, 0xac, 0x1b, 0xbc, 0xe3, 0x9e, 0xe6, 0x5a, 0xcc, 0xcc,
+	0xb3, 0x1e, 0xb5, 0x5a, 0xcc, 0xd6, 0xf2, 0xfe, 0x6b, 0x6c, 0xc7, 0x1c, 0xae, 0x63, 0xc7, 0xb0,
+	0x38, 0xb5, 0xdb, 0xa4, 0x45, 0xf3, 0xfd, 0xbd, 0xbc, 0xce, 0xf2, 0x9a, 0x69, 0x9c, 0xae, 0x88,
+	0x57, 0xcc, 0xde, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x86, 0xc2, 0xf7, 0x19, 0x65, 0x0e, 0x00,
+	0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// NativeEventsManagementServiceClient is the client API for NativeEventsManagementService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NativeEventsManagementServiceClient interface {
+	// List the supported events for the passed device
+	ListEvents(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*ListEventsResponse, error)
+	// Updates the configuration of the list of events in the request
+	// The default behavior of the device is to report all the supported events
+	// This configuration is persisted across reboots of the device or the device manager
+	UpdateEventsConfiguration(ctx context.Context, in *EventsConfigurationRequest, opts ...grpc.CallOption) (*EventsConfigurationResponse, error)
+}
+
+type nativeEventsManagementServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewNativeEventsManagementServiceClient(cc *grpc.ClientConn) NativeEventsManagementServiceClient {
+	return &nativeEventsManagementServiceClient{cc}
+}
+
+func (c *nativeEventsManagementServiceClient) ListEvents(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*ListEventsResponse, error) {
+	out := new(ListEventsResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeEventsManagementService/ListEvents", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeEventsManagementServiceClient) UpdateEventsConfiguration(ctx context.Context, in *EventsConfigurationRequest, opts ...grpc.CallOption) (*EventsConfigurationResponse, error) {
+	out := new(EventsConfigurationResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeEventsManagementService/UpdateEventsConfiguration", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// NativeEventsManagementServiceServer is the server API for NativeEventsManagementService service.
+type NativeEventsManagementServiceServer interface {
+	// List the supported events for the passed device
+	ListEvents(context.Context, *HardwareID) (*ListEventsResponse, error)
+	// Updates the configuration of the list of events in the request
+	// The default behavior of the device is to report all the supported events
+	// This configuration is persisted across reboots of the device or the device manager
+	UpdateEventsConfiguration(context.Context, *EventsConfigurationRequest) (*EventsConfigurationResponse, error)
+}
+
+func RegisterNativeEventsManagementServiceServer(s *grpc.Server, srv NativeEventsManagementServiceServer) {
+	s.RegisterService(&_NativeEventsManagementService_serviceDesc, srv)
+}
+
+func _NativeEventsManagementService_ListEvents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(HardwareID)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeEventsManagementServiceServer).ListEvents(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeEventsManagementService/ListEvents",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeEventsManagementServiceServer).ListEvents(ctx, req.(*HardwareID))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeEventsManagementService_UpdateEventsConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EventsConfigurationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeEventsManagementServiceServer).UpdateEventsConfiguration(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeEventsManagementService/UpdateEventsConfiguration",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeEventsManagementServiceServer).UpdateEventsConfiguration(ctx, req.(*EventsConfigurationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _NativeEventsManagementService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "dmi.NativeEventsManagementService",
+	HandlerType: (*NativeEventsManagementServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListEvents",
+			Handler:    _NativeEventsManagementService_ListEvents_Handler,
+		},
+		{
+			MethodName: "UpdateEventsConfiguration",
+			Handler:    _NativeEventsManagementService_UpdateEventsConfiguration_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "dmi/hw_events_mgmt_service.proto",
+}
diff --git a/vendor/github.com/opencord/device-management-interface/go/dmi/hw_management_service.pb.go b/vendor/github.com/opencord/device-management-interface/go/dmi/hw_management_service.pb.go
new file mode 100644
index 0000000..b50ff9b
--- /dev/null
+++ b/vendor/github.com/opencord/device-management-interface/go/dmi/hw_management_service.pb.go
@@ -0,0 +1,1338 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/hw_management_service.proto
+
+package dmi
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	empty "github.com/golang/protobuf/ptypes/empty"
+	grpc "google.golang.org/grpc"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type PhysicalInventoryRequest struct {
+	DeviceUuid           *Uuid    `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PhysicalInventoryRequest) Reset()         { *m = PhysicalInventoryRequest{} }
+func (m *PhysicalInventoryRequest) String() string { return proto.CompactTextString(m) }
+func (*PhysicalInventoryRequest) ProtoMessage()    {}
+func (*PhysicalInventoryRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{0}
+}
+
+func (m *PhysicalInventoryRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PhysicalInventoryRequest.Unmarshal(m, b)
+}
+func (m *PhysicalInventoryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PhysicalInventoryRequest.Marshal(b, m, deterministic)
+}
+func (m *PhysicalInventoryRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PhysicalInventoryRequest.Merge(m, src)
+}
+func (m *PhysicalInventoryRequest) XXX_Size() int {
+	return xxx_messageInfo_PhysicalInventoryRequest.Size(m)
+}
+func (m *PhysicalInventoryRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_PhysicalInventoryRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PhysicalInventoryRequest proto.InternalMessageInfo
+
+func (m *PhysicalInventoryRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+type PhysicalInventoryResponse struct {
+	Status               Status    `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason    `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	Inventory            *Hardware `protobuf:"bytes,3,opt,name=inventory,proto3" json:"inventory,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
+	XXX_unrecognized     []byte    `json:"-"`
+	XXX_sizecache        int32     `json:"-"`
+}
+
+func (m *PhysicalInventoryResponse) Reset()         { *m = PhysicalInventoryResponse{} }
+func (m *PhysicalInventoryResponse) String() string { return proto.CompactTextString(m) }
+func (*PhysicalInventoryResponse) ProtoMessage()    {}
+func (*PhysicalInventoryResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{1}
+}
+
+func (m *PhysicalInventoryResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PhysicalInventoryResponse.Unmarshal(m, b)
+}
+func (m *PhysicalInventoryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PhysicalInventoryResponse.Marshal(b, m, deterministic)
+}
+func (m *PhysicalInventoryResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PhysicalInventoryResponse.Merge(m, src)
+}
+func (m *PhysicalInventoryResponse) XXX_Size() int {
+	return xxx_messageInfo_PhysicalInventoryResponse.Size(m)
+}
+func (m *PhysicalInventoryResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_PhysicalInventoryResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PhysicalInventoryResponse proto.InternalMessageInfo
+
+func (m *PhysicalInventoryResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *PhysicalInventoryResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *PhysicalInventoryResponse) GetInventory() *Hardware {
+	if m != nil {
+		return m.Inventory
+	}
+	return nil
+}
+
+type HWComponentInfoGetRequest struct {
+	DeviceUuid           *Uuid    `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	ComponentUuid        *Uuid    `protobuf:"bytes,2,opt,name=component_uuid,json=componentUuid,proto3" json:"component_uuid,omitempty"`
+	ComponentName        string   `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HWComponentInfoGetRequest) Reset()         { *m = HWComponentInfoGetRequest{} }
+func (m *HWComponentInfoGetRequest) String() string { return proto.CompactTextString(m) }
+func (*HWComponentInfoGetRequest) ProtoMessage()    {}
+func (*HWComponentInfoGetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{2}
+}
+
+func (m *HWComponentInfoGetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HWComponentInfoGetRequest.Unmarshal(m, b)
+}
+func (m *HWComponentInfoGetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HWComponentInfoGetRequest.Marshal(b, m, deterministic)
+}
+func (m *HWComponentInfoGetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HWComponentInfoGetRequest.Merge(m, src)
+}
+func (m *HWComponentInfoGetRequest) XXX_Size() int {
+	return xxx_messageInfo_HWComponentInfoGetRequest.Size(m)
+}
+func (m *HWComponentInfoGetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_HWComponentInfoGetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HWComponentInfoGetRequest proto.InternalMessageInfo
+
+func (m *HWComponentInfoGetRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *HWComponentInfoGetRequest) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *HWComponentInfoGetRequest) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+type HWComponentInfoGetResponse struct {
+	Status               Status     `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason     `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	Component            *Component `protobuf:"bytes,3,opt,name=component,proto3" json:"component,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *HWComponentInfoGetResponse) Reset()         { *m = HWComponentInfoGetResponse{} }
+func (m *HWComponentInfoGetResponse) String() string { return proto.CompactTextString(m) }
+func (*HWComponentInfoGetResponse) ProtoMessage()    {}
+func (*HWComponentInfoGetResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{3}
+}
+
+func (m *HWComponentInfoGetResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HWComponentInfoGetResponse.Unmarshal(m, b)
+}
+func (m *HWComponentInfoGetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HWComponentInfoGetResponse.Marshal(b, m, deterministic)
+}
+func (m *HWComponentInfoGetResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HWComponentInfoGetResponse.Merge(m, src)
+}
+func (m *HWComponentInfoGetResponse) XXX_Size() int {
+	return xxx_messageInfo_HWComponentInfoGetResponse.Size(m)
+}
+func (m *HWComponentInfoGetResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_HWComponentInfoGetResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HWComponentInfoGetResponse proto.InternalMessageInfo
+
+func (m *HWComponentInfoGetResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *HWComponentInfoGetResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *HWComponentInfoGetResponse) GetComponent() *Component {
+	if m != nil {
+		return m.Component
+	}
+	return nil
+}
+
+type HWComponentInfoSetRequest struct {
+	DeviceUuid           *Uuid                `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	ComponentUuid        *Uuid                `protobuf:"bytes,2,opt,name=component_uuid,json=componentUuid,proto3" json:"component_uuid,omitempty"`
+	ComponentName        string               `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	Changes              *ModifiableComponent `protobuf:"bytes,4,opt,name=changes,proto3" json:"changes,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *HWComponentInfoSetRequest) Reset()         { *m = HWComponentInfoSetRequest{} }
+func (m *HWComponentInfoSetRequest) String() string { return proto.CompactTextString(m) }
+func (*HWComponentInfoSetRequest) ProtoMessage()    {}
+func (*HWComponentInfoSetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{4}
+}
+
+func (m *HWComponentInfoSetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HWComponentInfoSetRequest.Unmarshal(m, b)
+}
+func (m *HWComponentInfoSetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HWComponentInfoSetRequest.Marshal(b, m, deterministic)
+}
+func (m *HWComponentInfoSetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HWComponentInfoSetRequest.Merge(m, src)
+}
+func (m *HWComponentInfoSetRequest) XXX_Size() int {
+	return xxx_messageInfo_HWComponentInfoSetRequest.Size(m)
+}
+func (m *HWComponentInfoSetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_HWComponentInfoSetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HWComponentInfoSetRequest proto.InternalMessageInfo
+
+func (m *HWComponentInfoSetRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *HWComponentInfoSetRequest) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *HWComponentInfoSetRequest) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+func (m *HWComponentInfoSetRequest) GetChanges() *ModifiableComponent {
+	if m != nil {
+		return m.Changes
+	}
+	return nil
+}
+
+type HWComponentInfoSetResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HWComponentInfoSetResponse) Reset()         { *m = HWComponentInfoSetResponse{} }
+func (m *HWComponentInfoSetResponse) String() string { return proto.CompactTextString(m) }
+func (*HWComponentInfoSetResponse) ProtoMessage()    {}
+func (*HWComponentInfoSetResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{5}
+}
+
+func (m *HWComponentInfoSetResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HWComponentInfoSetResponse.Unmarshal(m, b)
+}
+func (m *HWComponentInfoSetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HWComponentInfoSetResponse.Marshal(b, m, deterministic)
+}
+func (m *HWComponentInfoSetResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HWComponentInfoSetResponse.Merge(m, src)
+}
+func (m *HWComponentInfoSetResponse) XXX_Size() int {
+	return xxx_messageInfo_HWComponentInfoSetResponse.Size(m)
+}
+func (m *HWComponentInfoSetResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_HWComponentInfoSetResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HWComponentInfoSetResponse proto.InternalMessageInfo
+
+func (m *HWComponentInfoSetResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *HWComponentInfoSetResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+type StartManagingDeviceResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	DeviceUuid           *Uuid    `protobuf:"bytes,3,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StartManagingDeviceResponse) Reset()         { *m = StartManagingDeviceResponse{} }
+func (m *StartManagingDeviceResponse) String() string { return proto.CompactTextString(m) }
+func (*StartManagingDeviceResponse) ProtoMessage()    {}
+func (*StartManagingDeviceResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{6}
+}
+
+func (m *StartManagingDeviceResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StartManagingDeviceResponse.Unmarshal(m, b)
+}
+func (m *StartManagingDeviceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StartManagingDeviceResponse.Marshal(b, m, deterministic)
+}
+func (m *StartManagingDeviceResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StartManagingDeviceResponse.Merge(m, src)
+}
+func (m *StartManagingDeviceResponse) XXX_Size() int {
+	return xxx_messageInfo_StartManagingDeviceResponse.Size(m)
+}
+func (m *StartManagingDeviceResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_StartManagingDeviceResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StartManagingDeviceResponse proto.InternalMessageInfo
+
+func (m *StartManagingDeviceResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *StartManagingDeviceResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *StartManagingDeviceResponse) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+type StopManagingDeviceRequest struct {
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StopManagingDeviceRequest) Reset()         { *m = StopManagingDeviceRequest{} }
+func (m *StopManagingDeviceRequest) String() string { return proto.CompactTextString(m) }
+func (*StopManagingDeviceRequest) ProtoMessage()    {}
+func (*StopManagingDeviceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{7}
+}
+
+func (m *StopManagingDeviceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StopManagingDeviceRequest.Unmarshal(m, b)
+}
+func (m *StopManagingDeviceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StopManagingDeviceRequest.Marshal(b, m, deterministic)
+}
+func (m *StopManagingDeviceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StopManagingDeviceRequest.Merge(m, src)
+}
+func (m *StopManagingDeviceRequest) XXX_Size() int {
+	return xxx_messageInfo_StopManagingDeviceRequest.Size(m)
+}
+func (m *StopManagingDeviceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_StopManagingDeviceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StopManagingDeviceRequest proto.InternalMessageInfo
+
+func (m *StopManagingDeviceRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type StopManagingDeviceResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StopManagingDeviceResponse) Reset()         { *m = StopManagingDeviceResponse{} }
+func (m *StopManagingDeviceResponse) String() string { return proto.CompactTextString(m) }
+func (*StopManagingDeviceResponse) ProtoMessage()    {}
+func (*StopManagingDeviceResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{8}
+}
+
+func (m *StopManagingDeviceResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StopManagingDeviceResponse.Unmarshal(m, b)
+}
+func (m *StopManagingDeviceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StopManagingDeviceResponse.Marshal(b, m, deterministic)
+}
+func (m *StopManagingDeviceResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StopManagingDeviceResponse.Merge(m, src)
+}
+func (m *StopManagingDeviceResponse) XXX_Size() int {
+	return xxx_messageInfo_StopManagingDeviceResponse.Size(m)
+}
+func (m *StopManagingDeviceResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_StopManagingDeviceResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StopManagingDeviceResponse proto.InternalMessageInfo
+
+func (m *StopManagingDeviceResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *StopManagingDeviceResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+type ManagedDevicesResponse struct {
+	Devices              []*ModifiableComponent `protobuf:"bytes,1,rep,name=devices,proto3" json:"devices,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *ManagedDevicesResponse) Reset()         { *m = ManagedDevicesResponse{} }
+func (m *ManagedDevicesResponse) String() string { return proto.CompactTextString(m) }
+func (*ManagedDevicesResponse) ProtoMessage()    {}
+func (*ManagedDevicesResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{9}
+}
+
+func (m *ManagedDevicesResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ManagedDevicesResponse.Unmarshal(m, b)
+}
+func (m *ManagedDevicesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ManagedDevicesResponse.Marshal(b, m, deterministic)
+}
+func (m *ManagedDevicesResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ManagedDevicesResponse.Merge(m, src)
+}
+func (m *ManagedDevicesResponse) XXX_Size() int {
+	return xxx_messageInfo_ManagedDevicesResponse.Size(m)
+}
+func (m *ManagedDevicesResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ManagedDevicesResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ManagedDevicesResponse proto.InternalMessageInfo
+
+func (m *ManagedDevicesResponse) GetDevices() []*ModifiableComponent {
+	if m != nil {
+		return m.Devices
+	}
+	return nil
+}
+
+type SetLoggingEndpointRequest struct {
+	DeviceUuid           *Uuid    `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	LoggingEndpoint      string   `protobuf:"bytes,2,opt,name=logging_endpoint,json=loggingEndpoint,proto3" json:"logging_endpoint,omitempty"`
+	LoggingProtocol      string   `protobuf:"bytes,3,opt,name=logging_protocol,json=loggingProtocol,proto3" json:"logging_protocol,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SetLoggingEndpointRequest) Reset()         { *m = SetLoggingEndpointRequest{} }
+func (m *SetLoggingEndpointRequest) String() string { return proto.CompactTextString(m) }
+func (*SetLoggingEndpointRequest) ProtoMessage()    {}
+func (*SetLoggingEndpointRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{10}
+}
+
+func (m *SetLoggingEndpointRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SetLoggingEndpointRequest.Unmarshal(m, b)
+}
+func (m *SetLoggingEndpointRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SetLoggingEndpointRequest.Marshal(b, m, deterministic)
+}
+func (m *SetLoggingEndpointRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetLoggingEndpointRequest.Merge(m, src)
+}
+func (m *SetLoggingEndpointRequest) XXX_Size() int {
+	return xxx_messageInfo_SetLoggingEndpointRequest.Size(m)
+}
+func (m *SetLoggingEndpointRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SetLoggingEndpointRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SetLoggingEndpointRequest proto.InternalMessageInfo
+
+func (m *SetLoggingEndpointRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *SetLoggingEndpointRequest) GetLoggingEndpoint() string {
+	if m != nil {
+		return m.LoggingEndpoint
+	}
+	return ""
+}
+
+func (m *SetLoggingEndpointRequest) GetLoggingProtocol() string {
+	if m != nil {
+		return m.LoggingProtocol
+	}
+	return ""
+}
+
+type SetRemoteEndpointResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SetRemoteEndpointResponse) Reset()         { *m = SetRemoteEndpointResponse{} }
+func (m *SetRemoteEndpointResponse) String() string { return proto.CompactTextString(m) }
+func (*SetRemoteEndpointResponse) ProtoMessage()    {}
+func (*SetRemoteEndpointResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{11}
+}
+
+func (m *SetRemoteEndpointResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SetRemoteEndpointResponse.Unmarshal(m, b)
+}
+func (m *SetRemoteEndpointResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SetRemoteEndpointResponse.Marshal(b, m, deterministic)
+}
+func (m *SetRemoteEndpointResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetRemoteEndpointResponse.Merge(m, src)
+}
+func (m *SetRemoteEndpointResponse) XXX_Size() int {
+	return xxx_messageInfo_SetRemoteEndpointResponse.Size(m)
+}
+func (m *SetRemoteEndpointResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_SetRemoteEndpointResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SetRemoteEndpointResponse proto.InternalMessageInfo
+
+func (m *SetRemoteEndpointResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *SetRemoteEndpointResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+type GetLoggingEndpointResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	LoggingEndpoint      string   `protobuf:"bytes,3,opt,name=logging_endpoint,json=loggingEndpoint,proto3" json:"logging_endpoint,omitempty"`
+	LoggingProtocol      string   `protobuf:"bytes,4,opt,name=logging_protocol,json=loggingProtocol,proto3" json:"logging_protocol,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetLoggingEndpointResponse) Reset()         { *m = GetLoggingEndpointResponse{} }
+func (m *GetLoggingEndpointResponse) String() string { return proto.CompactTextString(m) }
+func (*GetLoggingEndpointResponse) ProtoMessage()    {}
+func (*GetLoggingEndpointResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{12}
+}
+
+func (m *GetLoggingEndpointResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetLoggingEndpointResponse.Unmarshal(m, b)
+}
+func (m *GetLoggingEndpointResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetLoggingEndpointResponse.Marshal(b, m, deterministic)
+}
+func (m *GetLoggingEndpointResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetLoggingEndpointResponse.Merge(m, src)
+}
+func (m *GetLoggingEndpointResponse) XXX_Size() int {
+	return xxx_messageInfo_GetLoggingEndpointResponse.Size(m)
+}
+func (m *GetLoggingEndpointResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetLoggingEndpointResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetLoggingEndpointResponse proto.InternalMessageInfo
+
+func (m *GetLoggingEndpointResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *GetLoggingEndpointResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *GetLoggingEndpointResponse) GetLoggingEndpoint() string {
+	if m != nil {
+		return m.LoggingEndpoint
+	}
+	return ""
+}
+
+func (m *GetLoggingEndpointResponse) GetLoggingProtocol() string {
+	if m != nil {
+		return m.LoggingProtocol
+	}
+	return ""
+}
+
+type SetMsgBusEndpointRequest struct {
+	MsgbusEndpoint       string   `protobuf:"bytes,1,opt,name=msgbus_endpoint,json=msgbusEndpoint,proto3" json:"msgbus_endpoint,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SetMsgBusEndpointRequest) Reset()         { *m = SetMsgBusEndpointRequest{} }
+func (m *SetMsgBusEndpointRequest) String() string { return proto.CompactTextString(m) }
+func (*SetMsgBusEndpointRequest) ProtoMessage()    {}
+func (*SetMsgBusEndpointRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{13}
+}
+
+func (m *SetMsgBusEndpointRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SetMsgBusEndpointRequest.Unmarshal(m, b)
+}
+func (m *SetMsgBusEndpointRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SetMsgBusEndpointRequest.Marshal(b, m, deterministic)
+}
+func (m *SetMsgBusEndpointRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetMsgBusEndpointRequest.Merge(m, src)
+}
+func (m *SetMsgBusEndpointRequest) XXX_Size() int {
+	return xxx_messageInfo_SetMsgBusEndpointRequest.Size(m)
+}
+func (m *SetMsgBusEndpointRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SetMsgBusEndpointRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SetMsgBusEndpointRequest proto.InternalMessageInfo
+
+func (m *SetMsgBusEndpointRequest) GetMsgbusEndpoint() string {
+	if m != nil {
+		return m.MsgbusEndpoint
+	}
+	return ""
+}
+
+type GetMsgBusEndpointResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	MsgbusEndpoint       string   `protobuf:"bytes,3,opt,name=msgbus_endpoint,json=msgbusEndpoint,proto3" json:"msgbus_endpoint,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetMsgBusEndpointResponse) Reset()         { *m = GetMsgBusEndpointResponse{} }
+func (m *GetMsgBusEndpointResponse) String() string { return proto.CompactTextString(m) }
+func (*GetMsgBusEndpointResponse) ProtoMessage()    {}
+func (*GetMsgBusEndpointResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{14}
+}
+
+func (m *GetMsgBusEndpointResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMsgBusEndpointResponse.Unmarshal(m, b)
+}
+func (m *GetMsgBusEndpointResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMsgBusEndpointResponse.Marshal(b, m, deterministic)
+}
+func (m *GetMsgBusEndpointResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMsgBusEndpointResponse.Merge(m, src)
+}
+func (m *GetMsgBusEndpointResponse) XXX_Size() int {
+	return xxx_messageInfo_GetMsgBusEndpointResponse.Size(m)
+}
+func (m *GetMsgBusEndpointResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMsgBusEndpointResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMsgBusEndpointResponse proto.InternalMessageInfo
+
+func (m *GetMsgBusEndpointResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *GetMsgBusEndpointResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *GetMsgBusEndpointResponse) GetMsgbusEndpoint() string {
+	if m != nil {
+		return m.MsgbusEndpoint
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*PhysicalInventoryRequest)(nil), "dmi.PhysicalInventoryRequest")
+	proto.RegisterType((*PhysicalInventoryResponse)(nil), "dmi.PhysicalInventoryResponse")
+	proto.RegisterType((*HWComponentInfoGetRequest)(nil), "dmi.HWComponentInfoGetRequest")
+	proto.RegisterType((*HWComponentInfoGetResponse)(nil), "dmi.HWComponentInfoGetResponse")
+	proto.RegisterType((*HWComponentInfoSetRequest)(nil), "dmi.HWComponentInfoSetRequest")
+	proto.RegisterType((*HWComponentInfoSetResponse)(nil), "dmi.HWComponentInfoSetResponse")
+	proto.RegisterType((*StartManagingDeviceResponse)(nil), "dmi.StartManagingDeviceResponse")
+	proto.RegisterType((*StopManagingDeviceRequest)(nil), "dmi.StopManagingDeviceRequest")
+	proto.RegisterType((*StopManagingDeviceResponse)(nil), "dmi.StopManagingDeviceResponse")
+	proto.RegisterType((*ManagedDevicesResponse)(nil), "dmi.ManagedDevicesResponse")
+	proto.RegisterType((*SetLoggingEndpointRequest)(nil), "dmi.SetLoggingEndpointRequest")
+	proto.RegisterType((*SetRemoteEndpointResponse)(nil), "dmi.SetRemoteEndpointResponse")
+	proto.RegisterType((*GetLoggingEndpointResponse)(nil), "dmi.GetLoggingEndpointResponse")
+	proto.RegisterType((*SetMsgBusEndpointRequest)(nil), "dmi.SetMsgBusEndpointRequest")
+	proto.RegisterType((*GetMsgBusEndpointResponse)(nil), "dmi.GetMsgBusEndpointResponse")
+}
+
+func init() { proto.RegisterFile("dmi/hw_management_service.proto", fileDescriptor_eae902e73066286d) }
+
+var fileDescriptor_eae902e73066286d = []byte{
+	// 797 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcf, 0x4e, 0xdb, 0x4e,
+	0x10, 0x96, 0x09, 0x02, 0x65, 0xf8, 0x11, 0x7e, 0xb8, 0x15, 0x4a, 0x8c, 0x0a, 0xc8, 0x55, 0xd5,
+	0xbf, 0xc4, 0x28, 0x9c, 0xaa, 0x5e, 0x2a, 0x28, 0x4d, 0x50, 0x09, 0x42, 0x76, 0x51, 0xa4, 0x5e,
+	0x22, 0xc7, 0x9e, 0x38, 0x2b, 0xc5, 0xbb, 0xa9, 0xbd, 0x0e, 0xe2, 0x25, 0x7a, 0x68, 0x7b, 0xad,
+	0xd4, 0x07, 0xe9, 0x5b, 0xb4, 0x0f, 0x54, 0x79, 0xd7, 0x4e, 0x42, 0x62, 0x03, 0x42, 0x41, 0xea,
+	0xcd, 0xde, 0xf9, 0xf6, 0x9b, 0x99, 0x6f, 0x77, 0x66, 0x07, 0xb6, 0x5d, 0x9f, 0x18, 0xbd, 0x8b,
+	0xb6, 0x6f, 0x53, 0xdb, 0x43, 0x1f, 0x29, 0x6f, 0x87, 0x18, 0x0c, 0x89, 0x83, 0xd5, 0x41, 0xc0,
+	0x38, 0x53, 0x0b, 0xae, 0x4f, 0xb4, 0xf5, 0x18, 0xe5, 0x30, 0xdf, 0x67, 0x34, 0x94, 0xeb, 0xda,
+	0x7f, 0x72, 0x63, 0xf2, 0xb7, 0xe9, 0x31, 0xe6, 0xf5, 0xd1, 0x10, 0x7f, 0x9d, 0xa8, 0x6b, 0xa0,
+	0x3f, 0xe0, 0x97, 0xd2, 0xa8, 0xbf, 0x87, 0xf2, 0x59, 0xef, 0x32, 0x24, 0x8e, 0xdd, 0x3f, 0xa6,
+	0x43, 0xa4, 0x9c, 0x05, 0x97, 0x26, 0x7e, 0x8e, 0x30, 0xe4, 0xea, 0x0b, 0x58, 0x71, 0x31, 0x76,
+	0xd7, 0x8e, 0x22, 0xe2, 0x96, 0x95, 0x1d, 0xe5, 0xd9, 0x4a, 0xad, 0x58, 0x75, 0x7d, 0x52, 0x3d,
+	0x8f, 0x88, 0x6b, 0x82, 0xb4, 0xc6, 0xdf, 0xfa, 0x57, 0x05, 0x2a, 0x19, 0x44, 0xe1, 0x80, 0xd1,
+	0x10, 0xd5, 0xc7, 0xb0, 0x14, 0x72, 0x9b, 0x47, 0xa1, 0x20, 0x29, 0xd5, 0x56, 0x04, 0x89, 0x25,
+	0x96, 0xcc, 0xc4, 0x14, 0x83, 0x02, 0xb4, 0x43, 0x46, 0xcb, 0x0b, 0x13, 0x20, 0x53, 0x2c, 0x99,
+	0x89, 0x49, 0x7d, 0x09, 0x45, 0x92, 0xd2, 0x97, 0x0b, 0x22, 0xa2, 0x55, 0x81, 0x6b, 0xd8, 0x81,
+	0x7b, 0x61, 0x07, 0x68, 0x8e, 0xed, 0xfa, 0x4f, 0x05, 0x2a, 0x8d, 0xd6, 0x21, 0xf3, 0x07, 0x8c,
+	0x22, 0xe5, 0xc7, 0xb4, 0xcb, 0xea, 0xc8, 0xef, 0x90, 0x9e, 0xba, 0x07, 0x25, 0x27, 0xa5, 0x91,
+	0xf0, 0x85, 0x69, 0xf8, 0xea, 0x08, 0x20, 0x76, 0x3c, 0x99, 0xdc, 0x41, 0x6d, 0x1f, 0x45, 0xb4,
+	0xc5, 0x09, 0xd8, 0xa9, 0xed, 0xa3, 0xfe, 0x5d, 0x01, 0x2d, 0x2b, 0xc4, 0xb9, 0x0b, 0xf7, 0x0a,
+	0x8a, 0x23, 0xcf, 0x89, 0x70, 0x25, 0x81, 0x1b, 0xf9, 0x36, 0xc7, 0x00, 0xfd, 0xcf, 0xac, 0x72,
+	0xd6, 0xbf, 0xa5, 0x9c, 0x5a, 0x83, 0x65, 0xa7, 0x67, 0x53, 0x0f, 0xc3, 0xf2, 0xa2, 0x60, 0x2c,
+	0x0b, 0xc6, 0x26, 0x73, 0x49, 0x97, 0xd8, 0x9d, 0x3e, 0x8e, 0x13, 0x4b, 0x81, 0x7a, 0x77, 0x46,
+	0x6c, 0xeb, 0x3e, 0xc4, 0xd6, 0xbf, 0x29, 0xb0, 0x69, 0x71, 0x3b, 0xe0, 0xcd, 0xb8, 0x74, 0x09,
+	0xf5, 0xde, 0x09, 0x41, 0xee, 0xe1, 0x58, 0xa7, 0x8e, 0xa2, 0x70, 0x5d, 0x8d, 0x1a, 0x50, 0xb1,
+	0x38, 0x1b, 0x4c, 0xc7, 0x24, 0xcf, 0x54, 0x85, 0x45, 0xa1, 0xb5, 0x22, 0xb4, 0x16, 0xdf, 0xb1,
+	0x5c, 0x59, 0x1b, 0xe6, 0x2e, 0xd7, 0x09, 0x6c, 0x08, 0x1f, 0xe8, 0x4a, 0x17, 0xe1, 0xc8, 0x47,
+	0x0d, 0x96, 0x65, 0x02, 0xb1, 0x93, 0xc2, 0xf5, 0x87, 0x9c, 0x00, 0xf5, 0x1f, 0x0a, 0x54, 0x2c,
+	0xe4, 0x27, 0xcc, 0x8b, 0x83, 0x3e, 0xa2, 0xee, 0x80, 0x11, 0x7a, 0xa7, 0xbb, 0xfb, 0x1c, 0xfe,
+	0xef, 0x4b, 0x96, 0x36, 0x26, 0x34, 0x22, 0x8d, 0xa2, 0xb9, 0xd6, 0xbf, 0xca, 0x3e, 0x09, 0x15,
+	0x8d, 0xd5, 0x61, 0xfd, 0xe4, 0xda, 0xa6, 0xd0, 0xb3, 0x64, 0x59, 0x47, 0x11, 0x9e, 0x89, 0x3e,
+	0xe3, 0x38, 0x8e, 0x6e, 0xee, 0xa2, 0xfe, 0x52, 0x40, 0xab, 0x67, 0xc8, 0x30, 0xf7, 0x2b, 0x98,
+	0xa5, 0x52, 0xe1, 0xf6, 0x2a, 0x2d, 0x66, 0xab, 0x74, 0x08, 0x65, 0x0b, 0x79, 0x33, 0xf4, 0x0e,
+	0xa2, 0x70, 0xfa, 0x0c, 0x9f, 0xc2, 0x9a, 0x1f, 0x7a, 0x9d, 0x28, 0x1c, 0x3b, 0x94, 0xd7, 0xb6,
+	0x24, 0x97, 0x53, 0xbc, 0xfe, 0x45, 0x81, 0x4a, 0x7d, 0x96, 0x65, 0xee, 0x12, 0x64, 0x04, 0x54,
+	0xc8, 0x0a, 0xa8, 0xf6, 0x7b, 0x09, 0x2a, 0xa7, 0x36, 0x27, 0x43, 0x6c, 0xb4, 0x9a, 0xa3, 0x67,
+	0xdd, 0x92, 0xaf, 0xba, 0x6a, 0xc1, 0x83, 0x8c, 0xae, 0xa1, 0xe6, 0xde, 0x79, 0x6d, 0x27, 0x8d,
+	0x38, 0xaf, 0xd3, 0xec, 0x29, 0xea, 0x39, 0xa8, 0xb3, 0x45, 0xac, 0x6e, 0x25, 0x3b, 0x73, 0xda,
+	0x81, 0xb6, 0x9d, 0x6b, 0x4f, 0xc4, 0x6b, 0xc0, 0x7a, 0xac, 0xec, 0x95, 0xb2, 0x55, 0x37, 0xaa,
+	0x72, 0xd6, 0xa8, 0xa6, 0xb3, 0x46, 0xf5, 0x28, 0x9e, 0x35, 0xb4, 0x4d, 0x99, 0x41, 0x76, 0x8d,
+	0xb7, 0xe0, 0x61, 0x1d, 0xf9, 0xcc, 0xf0, 0xa0, 0x3e, 0x12, 0x9b, 0xf2, 0xa6, 0x13, 0x6d, 0x2b,
+	0xcf, 0x3c, 0xca, 0xbc, 0x05, 0x6a, 0x1d, 0xf9, 0x54, 0xc3, 0x4f, 0x32, 0xcf, 0x1d, 0x0b, 0x92,
+	0xcc, 0xf3, 0xdf, 0xe4, 0x44, 0xd2, 0x5b, 0x12, 0x5b, 0x37, 0x10, 0x4f, 0xbe, 0x3f, 0x1f, 0x05,
+	0xed, 0x54, 0xc1, 0xa6, 0x27, 0x95, 0xd7, 0xd0, 0xb4, 0x91, 0x3d, 0xa7, 0xa3, 0xbc, 0x15, 0x2a,
+	0x4c, 0xb3, 0x8e, 0x3b, 0x5e, 0x12, 0xd7, 0x35, 0xad, 0xc2, 0x84, 0xf5, 0x99, 0x52, 0x4c, 0x4e,
+	0x27, 0xaf, 0x44, 0x6f, 0x8c, 0xea, 0x83, 0xbc, 0x3e, 0x57, 0x39, 0xf3, 0xae, 0xcf, 0x56, 0x1a,
+	0x61, 0x76, 0x21, 0x1f, 0xbc, 0xf9, 0xf4, 0xda, 0x23, 0xbc, 0x17, 0x75, 0xaa, 0x0e, 0xf3, 0x0d,
+	0x36, 0x40, 0xea, 0xb0, 0xc0, 0x35, 0x64, 0x27, 0xdf, 0x1d, 0x8f, 0xcf, 0xbb, 0x84, 0x72, 0x0c,
+	0xba, 0xb6, 0x83, 0xc6, 0x70, 0xdf, 0xf0, 0x98, 0xe1, 0xfa, 0xa4, 0xb3, 0x24, 0x9c, 0xed, 0xff,
+	0x0d, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x43, 0x0d, 0x3e, 0x6e, 0x0b, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// NativeHWManagementServiceClient is the client API for NativeHWManagementService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NativeHWManagementServiceClient interface {
+	// Initializes context for a device and sets up required states
+	// In the call to StartManagingDevice, the fields of ModifiableComponent which are relevant
+	// and their meanings in this context is mentioned below:
+	// name = The unique name that needs to be assigned to this hardware;
+	// class = COMPONENT_TYPE_UNDEFINED;
+	// parent = nil;
+	// alias = Optional;
+	// asset_id = Optional;
+	// uri = IP Address of the Hardware;
+	StartManagingDevice(ctx context.Context, in *ModifiableComponent, opts ...grpc.CallOption) (NativeHWManagementService_StartManagingDeviceClient, error)
+	// Stop management of a device and clean up any context and caches for that device
+	StopManagingDevice(ctx context.Context, in *StopManagingDeviceRequest, opts ...grpc.CallOption) (*StopManagingDeviceResponse, error)
+	// Returns an object containing a list of devices managed by this entity
+	GetManagedDevices(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ManagedDevicesResponse, error)
+	// Get the HW inventory details of the Device
+	GetPhysicalInventory(ctx context.Context, in *PhysicalInventoryRequest, opts ...grpc.CallOption) (NativeHWManagementService_GetPhysicalInventoryClient, error)
+	// Get the details of a particular HW component
+	GetHWComponentInfo(ctx context.Context, in *HWComponentInfoGetRequest, opts ...grpc.CallOption) (NativeHWManagementService_GetHWComponentInfoClient, error)
+	// Sets the permissible attributes of a HW component
+	SetHWComponentInfo(ctx context.Context, in *HWComponentInfoSetRequest, opts ...grpc.CallOption) (*HWComponentInfoSetResponse, error)
+	// Sets the location to which logs need to be shipped
+	SetLoggingEndpoint(ctx context.Context, in *SetLoggingEndpointRequest, opts ...grpc.CallOption) (*SetRemoteEndpointResponse, error)
+	// Gets the configured location to which the logs are being shipped
+	GetLoggingEndpoint(ctx context.Context, in *Uuid, opts ...grpc.CallOption) (*GetLoggingEndpointResponse, error)
+	// Sets the location of the Message Bus to which events and metrics are shipped
+	SetMsgBusEndpoint(ctx context.Context, in *SetMsgBusEndpointRequest, opts ...grpc.CallOption) (*SetRemoteEndpointResponse, error)
+	// Gets the configured location to which the events and metrics are being shipped
+	GetMsgBusEndpoint(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*GetMsgBusEndpointResponse, error)
+}
+
+type nativeHWManagementServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewNativeHWManagementServiceClient(cc *grpc.ClientConn) NativeHWManagementServiceClient {
+	return &nativeHWManagementServiceClient{cc}
+}
+
+func (c *nativeHWManagementServiceClient) StartManagingDevice(ctx context.Context, in *ModifiableComponent, opts ...grpc.CallOption) (NativeHWManagementService_StartManagingDeviceClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeHWManagementService_serviceDesc.Streams[0], "/dmi.NativeHWManagementService/StartManagingDevice", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeHWManagementServiceStartManagingDeviceClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeHWManagementService_StartManagingDeviceClient interface {
+	Recv() (*StartManagingDeviceResponse, error)
+	grpc.ClientStream
+}
+
+type nativeHWManagementServiceStartManagingDeviceClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeHWManagementServiceStartManagingDeviceClient) Recv() (*StartManagingDeviceResponse, error) {
+	m := new(StartManagingDeviceResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeHWManagementServiceClient) StopManagingDevice(ctx context.Context, in *StopManagingDeviceRequest, opts ...grpc.CallOption) (*StopManagingDeviceResponse, error) {
+	out := new(StopManagingDeviceResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/StopManagingDevice", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeHWManagementServiceClient) GetManagedDevices(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ManagedDevicesResponse, error) {
+	out := new(ManagedDevicesResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/GetManagedDevices", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeHWManagementServiceClient) GetPhysicalInventory(ctx context.Context, in *PhysicalInventoryRequest, opts ...grpc.CallOption) (NativeHWManagementService_GetPhysicalInventoryClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeHWManagementService_serviceDesc.Streams[1], "/dmi.NativeHWManagementService/GetPhysicalInventory", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeHWManagementServiceGetPhysicalInventoryClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeHWManagementService_GetPhysicalInventoryClient interface {
+	Recv() (*PhysicalInventoryResponse, error)
+	grpc.ClientStream
+}
+
+type nativeHWManagementServiceGetPhysicalInventoryClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeHWManagementServiceGetPhysicalInventoryClient) Recv() (*PhysicalInventoryResponse, error) {
+	m := new(PhysicalInventoryResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeHWManagementServiceClient) GetHWComponentInfo(ctx context.Context, in *HWComponentInfoGetRequest, opts ...grpc.CallOption) (NativeHWManagementService_GetHWComponentInfoClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeHWManagementService_serviceDesc.Streams[2], "/dmi.NativeHWManagementService/GetHWComponentInfo", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeHWManagementServiceGetHWComponentInfoClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeHWManagementService_GetHWComponentInfoClient interface {
+	Recv() (*HWComponentInfoGetResponse, error)
+	grpc.ClientStream
+}
+
+type nativeHWManagementServiceGetHWComponentInfoClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeHWManagementServiceGetHWComponentInfoClient) Recv() (*HWComponentInfoGetResponse, error) {
+	m := new(HWComponentInfoGetResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeHWManagementServiceClient) SetHWComponentInfo(ctx context.Context, in *HWComponentInfoSetRequest, opts ...grpc.CallOption) (*HWComponentInfoSetResponse, error) {
+	out := new(HWComponentInfoSetResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/SetHWComponentInfo", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeHWManagementServiceClient) SetLoggingEndpoint(ctx context.Context, in *SetLoggingEndpointRequest, opts ...grpc.CallOption) (*SetRemoteEndpointResponse, error) {
+	out := new(SetRemoteEndpointResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/SetLoggingEndpoint", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeHWManagementServiceClient) GetLoggingEndpoint(ctx context.Context, in *Uuid, opts ...grpc.CallOption) (*GetLoggingEndpointResponse, error) {
+	out := new(GetLoggingEndpointResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/GetLoggingEndpoint", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeHWManagementServiceClient) SetMsgBusEndpoint(ctx context.Context, in *SetMsgBusEndpointRequest, opts ...grpc.CallOption) (*SetRemoteEndpointResponse, error) {
+	out := new(SetRemoteEndpointResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/SetMsgBusEndpoint", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeHWManagementServiceClient) GetMsgBusEndpoint(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*GetMsgBusEndpointResponse, error) {
+	out := new(GetMsgBusEndpointResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/GetMsgBusEndpoint", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// NativeHWManagementServiceServer is the server API for NativeHWManagementService service.
+type NativeHWManagementServiceServer interface {
+	// Initializes context for a device and sets up required states
+	// In the call to StartManagingDevice, the fields of ModifiableComponent which are relevant
+	// and their meanings in this context is mentioned below:
+	// name = The unique name that needs to be assigned to this hardware;
+	// class = COMPONENT_TYPE_UNDEFINED;
+	// parent = nil;
+	// alias = Optional;
+	// asset_id = Optional;
+	// uri = IP Address of the Hardware;
+	StartManagingDevice(*ModifiableComponent, NativeHWManagementService_StartManagingDeviceServer) error
+	// Stop management of a device and clean up any context and caches for that device
+	StopManagingDevice(context.Context, *StopManagingDeviceRequest) (*StopManagingDeviceResponse, error)
+	// Returns an object containing a list of devices managed by this entity
+	GetManagedDevices(context.Context, *empty.Empty) (*ManagedDevicesResponse, error)
+	// Get the HW inventory details of the Device
+	GetPhysicalInventory(*PhysicalInventoryRequest, NativeHWManagementService_GetPhysicalInventoryServer) error
+	// Get the details of a particular HW component
+	GetHWComponentInfo(*HWComponentInfoGetRequest, NativeHWManagementService_GetHWComponentInfoServer) error
+	// Sets the permissible attributes of a HW component
+	SetHWComponentInfo(context.Context, *HWComponentInfoSetRequest) (*HWComponentInfoSetResponse, error)
+	// Sets the location to which logs need to be shipped
+	SetLoggingEndpoint(context.Context, *SetLoggingEndpointRequest) (*SetRemoteEndpointResponse, error)
+	// Gets the configured location to which the logs are being shipped
+	GetLoggingEndpoint(context.Context, *Uuid) (*GetLoggingEndpointResponse, error)
+	// Sets the location of the Message Bus to which events and metrics are shipped
+	SetMsgBusEndpoint(context.Context, *SetMsgBusEndpointRequest) (*SetRemoteEndpointResponse, error)
+	// Gets the configured location to which the events and metrics are being shipped
+	GetMsgBusEndpoint(context.Context, *empty.Empty) (*GetMsgBusEndpointResponse, error)
+}
+
+func RegisterNativeHWManagementServiceServer(s *grpc.Server, srv NativeHWManagementServiceServer) {
+	s.RegisterService(&_NativeHWManagementService_serviceDesc, srv)
+}
+
+func _NativeHWManagementService_StartManagingDevice_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(ModifiableComponent)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeHWManagementServiceServer).StartManagingDevice(m, &nativeHWManagementServiceStartManagingDeviceServer{stream})
+}
+
+type NativeHWManagementService_StartManagingDeviceServer interface {
+	Send(*StartManagingDeviceResponse) error
+	grpc.ServerStream
+}
+
+type nativeHWManagementServiceStartManagingDeviceServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeHWManagementServiceStartManagingDeviceServer) Send(m *StartManagingDeviceResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeHWManagementService_StopManagingDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(StopManagingDeviceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).StopManagingDevice(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/StopManagingDevice",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).StopManagingDevice(ctx, req.(*StopManagingDeviceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeHWManagementService_GetManagedDevices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(empty.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).GetManagedDevices(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/GetManagedDevices",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).GetManagedDevices(ctx, req.(*empty.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeHWManagementService_GetPhysicalInventory_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(PhysicalInventoryRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeHWManagementServiceServer).GetPhysicalInventory(m, &nativeHWManagementServiceGetPhysicalInventoryServer{stream})
+}
+
+type NativeHWManagementService_GetPhysicalInventoryServer interface {
+	Send(*PhysicalInventoryResponse) error
+	grpc.ServerStream
+}
+
+type nativeHWManagementServiceGetPhysicalInventoryServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeHWManagementServiceGetPhysicalInventoryServer) Send(m *PhysicalInventoryResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeHWManagementService_GetHWComponentInfo_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(HWComponentInfoGetRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeHWManagementServiceServer).GetHWComponentInfo(m, &nativeHWManagementServiceGetHWComponentInfoServer{stream})
+}
+
+type NativeHWManagementService_GetHWComponentInfoServer interface {
+	Send(*HWComponentInfoGetResponse) error
+	grpc.ServerStream
+}
+
+type nativeHWManagementServiceGetHWComponentInfoServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeHWManagementServiceGetHWComponentInfoServer) Send(m *HWComponentInfoGetResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeHWManagementService_SetHWComponentInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(HWComponentInfoSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).SetHWComponentInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/SetHWComponentInfo",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).SetHWComponentInfo(ctx, req.(*HWComponentInfoSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeHWManagementService_SetLoggingEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetLoggingEndpointRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).SetLoggingEndpoint(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/SetLoggingEndpoint",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).SetLoggingEndpoint(ctx, req.(*SetLoggingEndpointRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeHWManagementService_GetLoggingEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Uuid)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).GetLoggingEndpoint(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/GetLoggingEndpoint",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).GetLoggingEndpoint(ctx, req.(*Uuid))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeHWManagementService_SetMsgBusEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetMsgBusEndpointRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).SetMsgBusEndpoint(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/SetMsgBusEndpoint",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).SetMsgBusEndpoint(ctx, req.(*SetMsgBusEndpointRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeHWManagementService_GetMsgBusEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(empty.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).GetMsgBusEndpoint(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/GetMsgBusEndpoint",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).GetMsgBusEndpoint(ctx, req.(*empty.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _NativeHWManagementService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "dmi.NativeHWManagementService",
+	HandlerType: (*NativeHWManagementServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "StopManagingDevice",
+			Handler:    _NativeHWManagementService_StopManagingDevice_Handler,
+		},
+		{
+			MethodName: "GetManagedDevices",
+			Handler:    _NativeHWManagementService_GetManagedDevices_Handler,
+		},
+		{
+			MethodName: "SetHWComponentInfo",
+			Handler:    _NativeHWManagementService_SetHWComponentInfo_Handler,
+		},
+		{
+			MethodName: "SetLoggingEndpoint",
+			Handler:    _NativeHWManagementService_SetLoggingEndpoint_Handler,
+		},
+		{
+			MethodName: "GetLoggingEndpoint",
+			Handler:    _NativeHWManagementService_GetLoggingEndpoint_Handler,
+		},
+		{
+			MethodName: "SetMsgBusEndpoint",
+			Handler:    _NativeHWManagementService_SetMsgBusEndpoint_Handler,
+		},
+		{
+			MethodName: "GetMsgBusEndpoint",
+			Handler:    _NativeHWManagementService_GetMsgBusEndpoint_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "StartManagingDevice",
+			Handler:       _NativeHWManagementService_StartManagingDevice_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "GetPhysicalInventory",
+			Handler:       _NativeHWManagementService_GetPhysicalInventory_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "GetHWComponentInfo",
+			Handler:       _NativeHWManagementService_GetHWComponentInfo_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "dmi/hw_management_service.proto",
+}
diff --git a/vendor/github.com/opencord/device-management-interface/go/dmi/hw_metrics_mgmt_service.pb.go b/vendor/github.com/opencord/device-management-interface/go/dmi/hw_metrics_mgmt_service.pb.go
new file mode 100644
index 0000000..5d41dc2
--- /dev/null
+++ b/vendor/github.com/opencord/device-management-interface/go/dmi/hw_metrics_mgmt_service.pb.go
@@ -0,0 +1,863 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/hw_metrics_mgmt_service.proto
+
+package dmi
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type MetricNames int32
+
+const (
+	MetricNames_METRIC_NAME_UNDEFINED MetricNames = 0
+	// FAN related metrics
+	MetricNames_METRIC_FAN_SPEED MetricNames = 1
+	// CPU related metrics
+	MetricNames_METRIC_CPU_TEMP             MetricNames = 100
+	MetricNames_METRIC_CPU_USAGE_PERCENTAGE MetricNames = 101
+	// Transceiver related metrics
+	MetricNames_METRIC_TRANSCEIVER_TEMP       MetricNames = 200
+	MetricNames_METRIC_TRANSCEIVER_VOLTAGE    MetricNames = 201
+	MetricNames_METRIC_TRANSCEIVER_BIAS       MetricNames = 202
+	MetricNames_METRIC_TRANSCEIVER_RX_POWER   MetricNames = 203
+	MetricNames_METRIC_TRANSCEIVER_TX_POWER   MetricNames = 204
+	MetricNames_METRIC_TRANSCEIVER_WAVELENGTH MetricNames = 205
+	// Disk related metrics
+	MetricNames_METRIC_DISK_TEMP                    MetricNames = 300
+	MetricNames_METRIC_DISK_CAPACITY                MetricNames = 301
+	MetricNames_METRIC_DISK_USAGE                   MetricNames = 302
+	MetricNames_METRIC_DISK_USAGE_PERCENTAGE        MetricNames = 303
+	MetricNames_METRIC_DISK_READ_WRITE_PERCENTAGE   MetricNames = 304
+	MetricNames_METRIC_DISK_FAULTY_CELLS_PERCENTAGE MetricNames = 305
+	// RAM related metrics
+	MetricNames_METRIC_RAM_TEMP             MetricNames = 400
+	MetricNames_METRIC_RAM_CAPACITY         MetricNames = 401
+	MetricNames_METRIC_RAM_USAGE            MetricNames = 402
+	MetricNames_METRIC_RAM_USAGE_PERCENTAGE MetricNames = 403
+	// Power related metrics
+	MetricNames_METRIC_POWER_MAX              MetricNames = 500
+	MetricNames_METRIC_POWER_USAGE            MetricNames = 501
+	MetricNames_METRIC_POWER_USAGE_PERCENTAGE MetricNames = 502
+	// Chassis related metrics
+	MetricNames_METRIC_INNER_SURROUNDING_TEMP MetricNames = 600
+)
+
+var MetricNames_name = map[int32]string{
+	0:   "METRIC_NAME_UNDEFINED",
+	1:   "METRIC_FAN_SPEED",
+	100: "METRIC_CPU_TEMP",
+	101: "METRIC_CPU_USAGE_PERCENTAGE",
+	200: "METRIC_TRANSCEIVER_TEMP",
+	201: "METRIC_TRANSCEIVER_VOLTAGE",
+	202: "METRIC_TRANSCEIVER_BIAS",
+	203: "METRIC_TRANSCEIVER_RX_POWER",
+	204: "METRIC_TRANSCEIVER_TX_POWER",
+	205: "METRIC_TRANSCEIVER_WAVELENGTH",
+	300: "METRIC_DISK_TEMP",
+	301: "METRIC_DISK_CAPACITY",
+	302: "METRIC_DISK_USAGE",
+	303: "METRIC_DISK_USAGE_PERCENTAGE",
+	304: "METRIC_DISK_READ_WRITE_PERCENTAGE",
+	305: "METRIC_DISK_FAULTY_CELLS_PERCENTAGE",
+	400: "METRIC_RAM_TEMP",
+	401: "METRIC_RAM_CAPACITY",
+	402: "METRIC_RAM_USAGE",
+	403: "METRIC_RAM_USAGE_PERCENTAGE",
+	500: "METRIC_POWER_MAX",
+	501: "METRIC_POWER_USAGE",
+	502: "METRIC_POWER_USAGE_PERCENTAGE",
+	600: "METRIC_INNER_SURROUNDING_TEMP",
+}
+
+var MetricNames_value = map[string]int32{
+	"METRIC_NAME_UNDEFINED":               0,
+	"METRIC_FAN_SPEED":                    1,
+	"METRIC_CPU_TEMP":                     100,
+	"METRIC_CPU_USAGE_PERCENTAGE":         101,
+	"METRIC_TRANSCEIVER_TEMP":             200,
+	"METRIC_TRANSCEIVER_VOLTAGE":          201,
+	"METRIC_TRANSCEIVER_BIAS":             202,
+	"METRIC_TRANSCEIVER_RX_POWER":         203,
+	"METRIC_TRANSCEIVER_TX_POWER":         204,
+	"METRIC_TRANSCEIVER_WAVELENGTH":       205,
+	"METRIC_DISK_TEMP":                    300,
+	"METRIC_DISK_CAPACITY":                301,
+	"METRIC_DISK_USAGE":                   302,
+	"METRIC_DISK_USAGE_PERCENTAGE":        303,
+	"METRIC_DISK_READ_WRITE_PERCENTAGE":   304,
+	"METRIC_DISK_FAULTY_CELLS_PERCENTAGE": 305,
+	"METRIC_RAM_TEMP":                     400,
+	"METRIC_RAM_CAPACITY":                 401,
+	"METRIC_RAM_USAGE":                    402,
+	"METRIC_RAM_USAGE_PERCENTAGE":         403,
+	"METRIC_POWER_MAX":                    500,
+	"METRIC_POWER_USAGE":                  501,
+	"METRIC_POWER_USAGE_PERCENTAGE":       502,
+	"METRIC_INNER_SURROUNDING_TEMP":       600,
+}
+
+func (x MetricNames) String() string {
+	return proto.EnumName(MetricNames_name, int32(x))
+}
+
+func (MetricNames) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{0}
+}
+
+type MetricConfig struct {
+	MetricId MetricNames `protobuf:"varint,1,opt,name=metric_id,json=metricId,proto3,enum=dmi.MetricNames" json:"metric_id,omitempty"`
+	// Whether the device manager is collecting and reporting this metric or not
+	IsConfigured bool `protobuf:"varint,2,opt,name=is_configured,json=isConfigured,proto3" json:"is_configured,omitempty"`
+	// Number of seconds between two consecutive polls of the particular metric
+	// Each device manager implemenation could have it's per metric default poll frequency which
+	// can be requested to be changed using this value
+	PollInterval         uint32   `protobuf:"varint,3,opt,name=poll_interval,json=pollInterval,proto3" json:"poll_interval,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MetricConfig) Reset()         { *m = MetricConfig{} }
+func (m *MetricConfig) String() string { return proto.CompactTextString(m) }
+func (*MetricConfig) ProtoMessage()    {}
+func (*MetricConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{0}
+}
+
+func (m *MetricConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricConfig.Unmarshal(m, b)
+}
+func (m *MetricConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricConfig.Marshal(b, m, deterministic)
+}
+func (m *MetricConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricConfig.Merge(m, src)
+}
+func (m *MetricConfig) XXX_Size() int {
+	return xxx_messageInfo_MetricConfig.Size(m)
+}
+func (m *MetricConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricConfig proto.InternalMessageInfo
+
+func (m *MetricConfig) GetMetricId() MetricNames {
+	if m != nil {
+		return m.MetricId
+	}
+	return MetricNames_METRIC_NAME_UNDEFINED
+}
+
+func (m *MetricConfig) GetIsConfigured() bool {
+	if m != nil {
+		return m.IsConfigured
+	}
+	return false
+}
+
+func (m *MetricConfig) GetPollInterval() uint32 {
+	if m != nil {
+		return m.PollInterval
+	}
+	return 0
+}
+
+type MetricsConfig struct {
+	Metrics              []*MetricConfig `protobuf:"bytes,1,rep,name=metrics,proto3" json:"metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *MetricsConfig) Reset()         { *m = MetricsConfig{} }
+func (m *MetricsConfig) String() string { return proto.CompactTextString(m) }
+func (*MetricsConfig) ProtoMessage()    {}
+func (*MetricsConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{1}
+}
+
+func (m *MetricsConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricsConfig.Unmarshal(m, b)
+}
+func (m *MetricsConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricsConfig.Marshal(b, m, deterministic)
+}
+func (m *MetricsConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricsConfig.Merge(m, src)
+}
+func (m *MetricsConfig) XXX_Size() int {
+	return xxx_messageInfo_MetricsConfig.Size(m)
+}
+func (m *MetricsConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricsConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricsConfig proto.InternalMessageInfo
+
+func (m *MetricsConfig) GetMetrics() []*MetricConfig {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+type ListMetricsResponse struct {
+	Status               Status         `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason         `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	Metrics              *MetricsConfig `protobuf:"bytes,3,opt,name=metrics,proto3" json:"metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *ListMetricsResponse) Reset()         { *m = ListMetricsResponse{} }
+func (m *ListMetricsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListMetricsResponse) ProtoMessage()    {}
+func (*ListMetricsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{2}
+}
+
+func (m *ListMetricsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListMetricsResponse.Unmarshal(m, b)
+}
+func (m *ListMetricsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListMetricsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListMetricsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListMetricsResponse.Merge(m, src)
+}
+func (m *ListMetricsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListMetricsResponse.Size(m)
+}
+func (m *ListMetricsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListMetricsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListMetricsResponse proto.InternalMessageInfo
+
+func (m *ListMetricsResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *ListMetricsResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *ListMetricsResponse) GetMetrics() *MetricsConfig {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+type MetricsConfigurationRequest struct {
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// Types that are valid to be assigned to Operation:
+	//	*MetricsConfigurationRequest_Changes
+	//	*MetricsConfigurationRequest_ResetToDefault
+	Operation            isMetricsConfigurationRequest_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *MetricsConfigurationRequest) Reset()         { *m = MetricsConfigurationRequest{} }
+func (m *MetricsConfigurationRequest) String() string { return proto.CompactTextString(m) }
+func (*MetricsConfigurationRequest) ProtoMessage()    {}
+func (*MetricsConfigurationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{3}
+}
+
+func (m *MetricsConfigurationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricsConfigurationRequest.Unmarshal(m, b)
+}
+func (m *MetricsConfigurationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricsConfigurationRequest.Marshal(b, m, deterministic)
+}
+func (m *MetricsConfigurationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricsConfigurationRequest.Merge(m, src)
+}
+func (m *MetricsConfigurationRequest) XXX_Size() int {
+	return xxx_messageInfo_MetricsConfigurationRequest.Size(m)
+}
+func (m *MetricsConfigurationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricsConfigurationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricsConfigurationRequest proto.InternalMessageInfo
+
+func (m *MetricsConfigurationRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+type isMetricsConfigurationRequest_Operation interface {
+	isMetricsConfigurationRequest_Operation()
+}
+
+type MetricsConfigurationRequest_Changes struct {
+	Changes *MetricsConfig `protobuf:"bytes,2,opt,name=changes,proto3,oneof"`
+}
+
+type MetricsConfigurationRequest_ResetToDefault struct {
+	ResetToDefault bool `protobuf:"varint,3,opt,name=reset_to_default,json=resetToDefault,proto3,oneof"`
+}
+
+func (*MetricsConfigurationRequest_Changes) isMetricsConfigurationRequest_Operation() {}
+
+func (*MetricsConfigurationRequest_ResetToDefault) isMetricsConfigurationRequest_Operation() {}
+
+func (m *MetricsConfigurationRequest) GetOperation() isMetricsConfigurationRequest_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *MetricsConfigurationRequest) GetChanges() *MetricsConfig {
+	if x, ok := m.GetOperation().(*MetricsConfigurationRequest_Changes); ok {
+		return x.Changes
+	}
+	return nil
+}
+
+func (m *MetricsConfigurationRequest) GetResetToDefault() bool {
+	if x, ok := m.GetOperation().(*MetricsConfigurationRequest_ResetToDefault); ok {
+		return x.ResetToDefault
+	}
+	return false
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*MetricsConfigurationRequest) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*MetricsConfigurationRequest_Changes)(nil),
+		(*MetricsConfigurationRequest_ResetToDefault)(nil),
+	}
+}
+
+type MetricsConfigurationResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MetricsConfigurationResponse) Reset()         { *m = MetricsConfigurationResponse{} }
+func (m *MetricsConfigurationResponse) String() string { return proto.CompactTextString(m) }
+func (*MetricsConfigurationResponse) ProtoMessage()    {}
+func (*MetricsConfigurationResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{4}
+}
+
+func (m *MetricsConfigurationResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricsConfigurationResponse.Unmarshal(m, b)
+}
+func (m *MetricsConfigurationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricsConfigurationResponse.Marshal(b, m, deterministic)
+}
+func (m *MetricsConfigurationResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricsConfigurationResponse.Merge(m, src)
+}
+func (m *MetricsConfigurationResponse) XXX_Size() int {
+	return xxx_messageInfo_MetricsConfigurationResponse.Size(m)
+}
+func (m *MetricsConfigurationResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricsConfigurationResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricsConfigurationResponse proto.InternalMessageInfo
+
+func (m *MetricsConfigurationResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *MetricsConfigurationResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+type MetricMetaData struct {
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// uuid of the component
+	ComponentUuid        *Uuid    `protobuf:"bytes,2,opt,name=component_uuid,json=componentUuid,proto3" json:"component_uuid,omitempty"`
+	ComponentName        string   `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MetricMetaData) Reset()         { *m = MetricMetaData{} }
+func (m *MetricMetaData) String() string { return proto.CompactTextString(m) }
+func (*MetricMetaData) ProtoMessage()    {}
+func (*MetricMetaData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{5}
+}
+
+func (m *MetricMetaData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricMetaData.Unmarshal(m, b)
+}
+func (m *MetricMetaData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricMetaData.Marshal(b, m, deterministic)
+}
+func (m *MetricMetaData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricMetaData.Merge(m, src)
+}
+func (m *MetricMetaData) XXX_Size() int {
+	return xxx_messageInfo_MetricMetaData.Size(m)
+}
+func (m *MetricMetaData) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricMetaData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricMetaData proto.InternalMessageInfo
+
+func (m *MetricMetaData) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *MetricMetaData) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *MetricMetaData) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+// The Metrics are conveyed to external systems by submitting them on a kafka bus.
+// The topic to which are Metrics are submitted would be configured as startup
+// configuration of the components
+type Metric struct {
+	MetricId             MetricNames          `protobuf:"varint,1,opt,name=metric_id,json=metricId,proto3,enum=dmi.MetricNames" json:"metric_id,omitempty"`
+	MetricMetadata       *MetricMetaData      `protobuf:"bytes,2,opt,name=metric_metadata,json=metricMetadata,proto3" json:"metric_metadata,omitempty"`
+	Value                *ComponentSensorData `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Metric) Reset()         { *m = Metric{} }
+func (m *Metric) String() string { return proto.CompactTextString(m) }
+func (*Metric) ProtoMessage()    {}
+func (*Metric) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{6}
+}
+
+func (m *Metric) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Metric.Unmarshal(m, b)
+}
+func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Metric.Marshal(b, m, deterministic)
+}
+func (m *Metric) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Metric.Merge(m, src)
+}
+func (m *Metric) XXX_Size() int {
+	return xxx_messageInfo_Metric.Size(m)
+}
+func (m *Metric) XXX_DiscardUnknown() {
+	xxx_messageInfo_Metric.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Metric proto.InternalMessageInfo
+
+func (m *Metric) GetMetricId() MetricNames {
+	if m != nil {
+		return m.MetricId
+	}
+	return MetricNames_METRIC_NAME_UNDEFINED
+}
+
+func (m *Metric) GetMetricMetadata() *MetricMetaData {
+	if m != nil {
+		return m.MetricMetadata
+	}
+	return nil
+}
+
+func (m *Metric) GetValue() *ComponentSensorData {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+type GetMetricRequest struct {
+	MetaData             *MetricMetaData `protobuf:"bytes,1,opt,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty"`
+	MetricId             MetricNames     `protobuf:"varint,2,opt,name=metric_id,json=metricId,proto3,enum=dmi.MetricNames" json:"metric_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *GetMetricRequest) Reset()         { *m = GetMetricRequest{} }
+func (m *GetMetricRequest) String() string { return proto.CompactTextString(m) }
+func (*GetMetricRequest) ProtoMessage()    {}
+func (*GetMetricRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{7}
+}
+
+func (m *GetMetricRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMetricRequest.Unmarshal(m, b)
+}
+func (m *GetMetricRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMetricRequest.Marshal(b, m, deterministic)
+}
+func (m *GetMetricRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMetricRequest.Merge(m, src)
+}
+func (m *GetMetricRequest) XXX_Size() int {
+	return xxx_messageInfo_GetMetricRequest.Size(m)
+}
+func (m *GetMetricRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMetricRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMetricRequest proto.InternalMessageInfo
+
+func (m *GetMetricRequest) GetMetaData() *MetricMetaData {
+	if m != nil {
+		return m.MetaData
+	}
+	return nil
+}
+
+func (m *GetMetricRequest) GetMetricId() MetricNames {
+	if m != nil {
+		return m.MetricId
+	}
+	return MetricNames_METRIC_NAME_UNDEFINED
+}
+
+type GetMetricResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	Metric               *Metric  `protobuf:"bytes,3,opt,name=metric,proto3" json:"metric,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetMetricResponse) Reset()         { *m = GetMetricResponse{} }
+func (m *GetMetricResponse) String() string { return proto.CompactTextString(m) }
+func (*GetMetricResponse) ProtoMessage()    {}
+func (*GetMetricResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{8}
+}
+
+func (m *GetMetricResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMetricResponse.Unmarshal(m, b)
+}
+func (m *GetMetricResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMetricResponse.Marshal(b, m, deterministic)
+}
+func (m *GetMetricResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMetricResponse.Merge(m, src)
+}
+func (m *GetMetricResponse) XXX_Size() int {
+	return xxx_messageInfo_GetMetricResponse.Size(m)
+}
+func (m *GetMetricResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMetricResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMetricResponse proto.InternalMessageInfo
+
+func (m *GetMetricResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *GetMetricResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *GetMetricResponse) GetMetric() *Metric {
+	if m != nil {
+		return m.Metric
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterEnum("dmi.MetricNames", MetricNames_name, MetricNames_value)
+	proto.RegisterType((*MetricConfig)(nil), "dmi.MetricConfig")
+	proto.RegisterType((*MetricsConfig)(nil), "dmi.MetricsConfig")
+	proto.RegisterType((*ListMetricsResponse)(nil), "dmi.ListMetricsResponse")
+	proto.RegisterType((*MetricsConfigurationRequest)(nil), "dmi.MetricsConfigurationRequest")
+	proto.RegisterType((*MetricsConfigurationResponse)(nil), "dmi.MetricsConfigurationResponse")
+	proto.RegisterType((*MetricMetaData)(nil), "dmi.MetricMetaData")
+	proto.RegisterType((*Metric)(nil), "dmi.Metric")
+	proto.RegisterType((*GetMetricRequest)(nil), "dmi.GetMetricRequest")
+	proto.RegisterType((*GetMetricResponse)(nil), "dmi.GetMetricResponse")
+}
+
+func init() { proto.RegisterFile("dmi/hw_metrics_mgmt_service.proto", fileDescriptor_6b6c2f1384c11ff5) }
+
+var fileDescriptor_6b6c2f1384c11ff5 = []byte{
+	// 1008 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x4b, 0x6f, 0xdb, 0x46,
+	0x10, 0xc7, 0x4d, 0xa9, 0x71, 0xec, 0x91, 0x1f, 0xf4, 0xda, 0x4e, 0x14, 0xc5, 0x6d, 0x64, 0x19,
+	0x2d, 0x0c, 0xb7, 0x96, 0x02, 0xe7, 0xd2, 0x47, 0x2e, 0xb4, 0x44, 0xdb, 0x44, 0x25, 0x5a, 0x58,
+	0x51, 0x76, 0xd2, 0xcb, 0x62, 0x23, 0xae, 0x65, 0x02, 0x26, 0xa9, 0x92, 0x4b, 0xe7, 0xde, 0x4b,
+	0x4f, 0x05, 0xfa, 0x40, 0x3f, 0x42, 0x6f, 0x7d, 0x7f, 0x8a, 0x3e, 0xef, 0xed, 0xf7, 0x68, 0x0b,
+	0xf4, 0x56, 0x70, 0x97, 0x62, 0x57, 0x8e, 0xdc, 0x22, 0x40, 0x6e, 0xd2, 0x7f, 0x7e, 0xb3, 0xf3,
+	0xdf, 0xe1, 0x72, 0x96, 0xb0, 0xe9, 0xfa, 0x5e, 0xe3, 0xfc, 0x29, 0xf1, 0x19, 0x8f, 0xbc, 0x41,
+	0x4c, 0xfc, 0xa1, 0xcf, 0x49, 0xcc, 0xa2, 0x4b, 0x6f, 0xc0, 0xea, 0xa3, 0x28, 0xe4, 0x21, 0x2a,
+	0xba, 0xbe, 0x57, 0x59, 0x49, 0xb9, 0x41, 0xe8, 0xfb, 0x61, 0x10, 0x4b, 0xbd, 0xb2, 0x20, 0x53,
+	0xe5, 0xbf, 0xda, 0x87, 0x1a, 0x2c, 0x74, 0xc4, 0x22, 0xcd, 0x30, 0x38, 0xf3, 0x86, 0x68, 0x17,
+	0xe6, 0xe5, 0xa2, 0xc4, 0x73, 0xcb, 0x5a, 0x55, 0xdb, 0x5e, 0xda, 0xd3, 0xeb, 0xae, 0xef, 0xd5,
+	0x25, 0x65, 0x53, 0x9f, 0xc5, 0x78, 0x4e, 0x22, 0x96, 0x8b, 0xb6, 0x60, 0xd1, 0x8b, 0xc9, 0x40,
+	0xe4, 0x26, 0x11, 0x73, 0xcb, 0x85, 0xaa, 0xb6, 0x3d, 0x87, 0x17, 0xbc, 0xb8, 0x99, 0x6b, 0x29,
+	0x34, 0x0a, 0x2f, 0x2e, 0x88, 0x17, 0x70, 0x16, 0x5d, 0xd2, 0x8b, 0x72, 0xb1, 0xaa, 0x6d, 0x2f,
+	0xe2, 0x85, 0x54, 0xb4, 0x32, 0xad, 0xf6, 0x10, 0x16, 0x65, 0x89, 0x2c, 0x13, 0xbd, 0x0e, 0x37,
+	0xb3, 0xed, 0x95, 0xb5, 0x6a, 0x71, 0xbb, 0xb4, 0xb7, 0xa2, 0xf8, 0x90, 0x0c, 0x1e, 0x13, 0xb5,
+	0x8f, 0x34, 0x58, 0x6d, 0x7b, 0x31, 0xcf, 0x96, 0xc0, 0x2c, 0x1e, 0x85, 0x41, 0xcc, 0xd0, 0x16,
+	0xcc, 0xc6, 0x9c, 0xf2, 0x24, 0xce, 0xf6, 0x52, 0x12, 0x6b, 0xf4, 0x84, 0x84, 0xb3, 0x50, 0x0a,
+	0x45, 0x8c, 0xc6, 0x61, 0x20, 0xdc, 0x8f, 0x21, 0x2c, 0x24, 0x9c, 0x85, 0xd0, 0x1b, 0xff, 0xda,
+	0x49, 0xed, 0x97, 0xf6, 0x90, 0x62, 0x27, 0xbe, 0xea, 0xe7, 0x7b, 0x0d, 0xee, 0x4e, 0x84, 0x92,
+	0x88, 0x72, 0x2f, 0x0c, 0x30, 0x7b, 0x3f, 0x61, 0x31, 0x47, 0x3b, 0x50, 0x72, 0x59, 0xfa, 0xb4,
+	0x48, 0x92, 0x64, 0x8d, 0x2e, 0xed, 0xcd, 0x8b, 0x15, 0xfb, 0x89, 0xe7, 0x62, 0x90, 0xd1, 0xf4,
+	0x37, 0xaa, 0xc3, 0xcd, 0xc1, 0x39, 0x0d, 0x86, 0x2c, 0x16, 0xfe, 0xa6, 0x56, 0x3e, 0x9a, 0xc1,
+	0x63, 0x08, 0xed, 0x80, 0x1e, 0xb1, 0x98, 0x71, 0xc2, 0x43, 0xe2, 0xb2, 0x33, 0x9a, 0x5c, 0x70,
+	0x61, 0x79, 0xee, 0x68, 0x06, 0x2f, 0x89, 0x88, 0x13, 0xb6, 0xa4, 0xbe, 0x5f, 0x82, 0xf9, 0x70,
+	0xc4, 0xa4, 0xb7, 0xda, 0x39, 0x6c, 0x4c, 0xf7, 0xfc, 0xa2, 0x9b, 0x59, 0xfb, 0x5c, 0x83, 0x25,
+	0x59, 0xaa, 0xc3, 0x38, 0x6d, 0x51, 0x4e, 0x9f, 0xab, 0x23, 0xf7, 0x61, 0x69, 0x10, 0xfa, 0xa3,
+	0x30, 0x60, 0x01, 0x97, 0x78, 0xe1, 0x2a, 0xbe, 0x98, 0x03, 0x22, 0xe3, 0x55, 0x35, 0x23, 0xa0,
+	0x3e, 0x13, 0x1d, 0x99, 0x57, 0xb0, 0xf4, 0x64, 0xd7, 0xbe, 0xd0, 0x60, 0x56, 0xfa, 0x7a, 0xde,
+	0x17, 0xe1, 0x21, 0x2c, 0x67, 0xb8, 0xcf, 0x38, 0x75, 0x29, 0xa7, 0x99, 0xa7, 0x55, 0x25, 0x69,
+	0xbc, 0x59, 0xbc, 0xe4, 0xe7, 0xff, 0x53, 0x14, 0xd5, 0xe1, 0xc6, 0x25, 0xbd, 0x48, 0x58, 0x76,
+	0xb4, 0xca, 0x22, 0xa7, 0x39, 0xb6, 0xd6, 0x63, 0x41, 0x1c, 0x46, 0x22, 0x51, 0x62, 0xb5, 0x18,
+	0xf4, 0x43, 0x96, 0x1d, 0xf6, 0xf1, 0x91, 0xba, 0x2f, 0x0c, 0x53, 0x22, 0x6a, 0x6b, 0xd7, 0xd7,
+	0x4e, 0x3d, 0xcb, 0x96, 0x4f, 0x6c, 0xb1, 0xf0, 0x7f, 0x5b, 0xac, 0x7d, 0xa0, 0xc1, 0x8a, 0x52,
+	0xf5, 0x85, 0xbf, 0x61, 0x5b, 0x30, 0x2b, 0x6b, 0x65, 0x5d, 0x28, 0x29, 0x5e, 0x70, 0x16, 0xda,
+	0xf9, 0xfd, 0x06, 0x94, 0x14, 0x7b, 0xe8, 0x0e, 0xac, 0x77, 0x4c, 0x07, 0x5b, 0x4d, 0x62, 0x1b,
+	0x1d, 0x93, 0xf4, 0xed, 0x96, 0x79, 0x60, 0xd9, 0x66, 0x4b, 0x9f, 0x41, 0x6b, 0xa0, 0x67, 0xa1,
+	0x03, 0xc3, 0x26, 0xbd, 0xae, 0x69, 0xb6, 0x74, 0x0d, 0xad, 0xc2, 0x72, 0xa6, 0x36, 0xbb, 0x7d,
+	0xe2, 0x98, 0x9d, 0xae, 0xee, 0xa2, 0x7b, 0x70, 0x57, 0x11, 0xfb, 0x3d, 0xe3, 0xd0, 0x24, 0x5d,
+	0x13, 0x37, 0x4d, 0xdb, 0x31, 0x0e, 0x4d, 0x9d, 0xa1, 0x0d, 0xb8, 0x9d, 0x01, 0x0e, 0x36, 0xec,
+	0x5e, 0xd3, 0xb4, 0x4e, 0x4c, 0x2c, 0xb3, 0x7f, 0xd0, 0xd0, 0x3d, 0xa8, 0x4c, 0x89, 0x9e, 0x1c,
+	0xb7, 0x45, 0xf6, 0x8f, 0xda, 0x35, 0xe9, 0xfb, 0x96, 0xd1, 0xd3, 0x7f, 0xd2, 0x50, 0x35, 0xaf,
+	0xae, 0x46, 0xf1, 0x23, 0xd2, 0x3d, 0x3e, 0x35, 0xb1, 0xfe, 0xf3, 0x75, 0x84, 0x33, 0x26, 0x7e,
+	0xd1, 0x50, 0x0d, 0x5e, 0x9e, 0x42, 0x9c, 0x1a, 0x27, 0x66, 0xdb, 0xb4, 0x0f, 0x9d, 0x23, 0xfd,
+	0x57, 0x0d, 0xad, 0xe7, 0x0d, 0x69, 0x59, 0xbd, 0x77, 0xa5, 0xfb, 0x2f, 0x0b, 0xe8, 0x0e, 0xac,
+	0xa9, 0x72, 0xd3, 0xe8, 0x1a, 0x4d, 0xcb, 0x79, 0xac, 0x7f, 0x55, 0x40, 0xb7, 0x60, 0x45, 0x0d,
+	0x89, 0xc6, 0xe8, 0x5f, 0x17, 0xd0, 0x26, 0x6c, 0x3c, 0xa3, 0xab, 0x0d, 0xfb, 0xa6, 0x80, 0x5e,
+	0x83, 0x4d, 0x15, 0xc1, 0xa6, 0xd1, 0x22, 0xa7, 0xd8, 0x72, 0x26, 0xb8, 0x6f, 0x0b, 0x68, 0x1b,
+	0xb6, 0x54, 0xee, 0xc0, 0xe8, 0xb7, 0x9d, 0xc7, 0xa4, 0x69, 0xb6, 0xdb, 0x3d, 0x95, 0xfc, 0xae,
+	0x80, 0xd6, 0xf2, 0x27, 0x87, 0x8d, 0x8e, 0x74, 0xff, 0x71, 0x11, 0x95, 0x61, 0x55, 0x51, 0x73,
+	0xf3, 0x9f, 0x14, 0x95, 0xed, 0xa6, 0x11, 0xe9, 0xfd, 0xd3, 0xa2, 0xd2, 0xcb, 0x5c, 0x56, 0x0b,
+	0x7d, 0xa6, 0x26, 0x8a, 0xf6, 0x92, 0x8e, 0xf1, 0x48, 0xff, 0xa3, 0x88, 0x6e, 0x03, 0x9a, 0x90,
+	0xe5, 0x8a, 0x7f, 0x16, 0x95, 0xde, 0x2b, 0x01, 0x75, 0xcd, 0xbf, 0x54, 0xc6, 0xb2, 0x6d, 0x13,
+	0x93, 0x5e, 0x1f, 0xe3, 0xe3, 0xbe, 0xdd, 0xb2, 0xec, 0x43, 0xb9, 0x95, 0xdf, 0x5e, 0xda, 0xfb,
+	0x5b, 0x83, 0x57, 0x6c, 0xca, 0xbd, 0x4b, 0x96, 0x8d, 0xe1, 0x0e, 0x0d, 0xe8, 0x90, 0xf9, 0x62,
+	0x04, 0x88, 0xbb, 0x1d, 0xbd, 0x09, 0x25, 0xe5, 0x9a, 0x43, 0xcb, 0xe2, 0x15, 0x39, 0xa2, 0x91,
+	0xfb, 0x94, 0x46, 0xcc, 0x6a, 0x55, 0xe4, 0xe4, 0x98, 0x76, 0x13, 0x52, 0xa8, 0xf4, 0x47, 0x2e,
+	0xe5, 0x6c, 0xda, 0x88, 0x47, 0xd5, 0x67, 0xaf, 0x94, 0xc9, 0x1b, 0xab, 0xb2, 0xf9, 0x1f, 0x44,
+	0x56, 0xe2, 0x6d, 0x98, 0xcf, 0xe7, 0x03, 0x5a, 0x17, 0xfc, 0xd5, 0x29, 0x55, 0xb9, 0x75, 0x55,
+	0x96, 0xb9, 0xfb, 0xef, 0xbc, 0xf7, 0xd6, 0xd0, 0xe3, 0xe7, 0xc9, 0x93, 0xfa, 0x20, 0xf4, 0x1b,
+	0xe1, 0x88, 0x05, 0x83, 0x30, 0x72, 0x1b, 0x72, 0xe8, 0xef, 0xfa, 0x79, 0x23, 0x76, 0xc5, 0x47,
+	0xc4, 0x19, 0x1d, 0xb0, 0xc6, 0xe5, 0x83, 0xc6, 0x30, 0x6c, 0xb8, 0xbe, 0xf7, 0x64, 0x56, 0x7c,
+	0xcc, 0x3c, 0xf8, 0x27, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x65, 0x9d, 0xfb, 0x17, 0x09, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// NativeMetricsManagementServiceClient is the client API for NativeMetricsManagementService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NativeMetricsManagementServiceClient interface {
+	// List the supported metrics for the passed device.
+	// This would be the first call that you make to know about the metrics that a particular device supports and
+	// then use the UpdateMetricsConfiguration API to monitor only the required metrics.
+	ListMetrics(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*ListMetricsResponse, error)
+	// Updates the configuration of the list of metrics in the request
+	// Acts upon single metric configuration, collection of a single metric can be started/stopped
+	// by changing its configuration.
+	//
+	// This configuration is persisted across restart of the device or the device manager
+	UpdateMetricsConfiguration(ctx context.Context, in *MetricsConfigurationRequest, opts ...grpc.CallOption) (*MetricsConfigurationResponse, error)
+	// Get the instantenous value of a metric
+	GetMetric(ctx context.Context, in *GetMetricRequest, opts ...grpc.CallOption) (*GetMetricResponse, error)
+}
+
+type nativeMetricsManagementServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewNativeMetricsManagementServiceClient(cc *grpc.ClientConn) NativeMetricsManagementServiceClient {
+	return &nativeMetricsManagementServiceClient{cc}
+}
+
+func (c *nativeMetricsManagementServiceClient) ListMetrics(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*ListMetricsResponse, error) {
+	out := new(ListMetricsResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeMetricsManagementService/ListMetrics", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeMetricsManagementServiceClient) UpdateMetricsConfiguration(ctx context.Context, in *MetricsConfigurationRequest, opts ...grpc.CallOption) (*MetricsConfigurationResponse, error) {
+	out := new(MetricsConfigurationResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeMetricsManagementService/UpdateMetricsConfiguration", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeMetricsManagementServiceClient) GetMetric(ctx context.Context, in *GetMetricRequest, opts ...grpc.CallOption) (*GetMetricResponse, error) {
+	out := new(GetMetricResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeMetricsManagementService/GetMetric", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// NativeMetricsManagementServiceServer is the server API for NativeMetricsManagementService service.
+type NativeMetricsManagementServiceServer interface {
+	// List the supported metrics for the passed device.
+	// This would be the first call that you make to know about the metrics that a particular device supports and
+	// then use the UpdateMetricsConfiguration API to monitor only the required metrics.
+	ListMetrics(context.Context, *HardwareID) (*ListMetricsResponse, error)
+	// Updates the configuration of the list of metrics in the request
+	// Acts upon single metric configuration, collection of a single metric can be started/stopped
+	// by changing its configuration.
+	//
+	// This configuration is persisted across restart of the device or the device manager
+	UpdateMetricsConfiguration(context.Context, *MetricsConfigurationRequest) (*MetricsConfigurationResponse, error)
+	// Get the instantenous value of a metric
+	GetMetric(context.Context, *GetMetricRequest) (*GetMetricResponse, error)
+}
+
+func RegisterNativeMetricsManagementServiceServer(s *grpc.Server, srv NativeMetricsManagementServiceServer) {
+	s.RegisterService(&_NativeMetricsManagementService_serviceDesc, srv)
+}
+
+func _NativeMetricsManagementService_ListMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(HardwareID)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeMetricsManagementServiceServer).ListMetrics(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeMetricsManagementService/ListMetrics",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeMetricsManagementServiceServer).ListMetrics(ctx, req.(*HardwareID))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeMetricsManagementService_UpdateMetricsConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MetricsConfigurationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeMetricsManagementServiceServer).UpdateMetricsConfiguration(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeMetricsManagementService/UpdateMetricsConfiguration",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeMetricsManagementServiceServer).UpdateMetricsConfiguration(ctx, req.(*MetricsConfigurationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeMetricsManagementService_GetMetric_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMetricRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeMetricsManagementServiceServer).GetMetric(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeMetricsManagementService/GetMetric",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeMetricsManagementServiceServer).GetMetric(ctx, req.(*GetMetricRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _NativeMetricsManagementService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "dmi.NativeMetricsManagementService",
+	HandlerType: (*NativeMetricsManagementServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListMetrics",
+			Handler:    _NativeMetricsManagementService_ListMetrics_Handler,
+		},
+		{
+			MethodName: "UpdateMetricsConfiguration",
+			Handler:    _NativeMetricsManagementService_UpdateMetricsConfiguration_Handler,
+		},
+		{
+			MethodName: "GetMetric",
+			Handler:    _NativeMetricsManagementService_GetMetric_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "dmi/hw_metrics_mgmt_service.proto",
+}
diff --git a/vendor/github.com/opencord/device-management-interface/go/dmi/sw_image.pb.go b/vendor/github.com/opencord/device-management-interface/go/dmi/sw_image.pb.go
new file mode 100644
index 0000000..c62b587
--- /dev/null
+++ b/vendor/github.com/opencord/device-management-interface/go/dmi/sw_image.pb.go
@@ -0,0 +1,334 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/sw_image.proto
+
+package dmi
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type ImageStatus_ImageState int32
+
+const (
+	ImageStatus_UNDEFINED_STATE     ImageStatus_ImageState = 0
+	ImageStatus_COPYING_IMAGE       ImageStatus_ImageState = 1
+	ImageStatus_INSTALLING_IMAGE    ImageStatus_ImageState = 2
+	ImageStatus_COMMITTING_IMAGE    ImageStatus_ImageState = 3
+	ImageStatus_REBOOTING_DEVICE    ImageStatus_ImageState = 4
+	ImageStatus_UPGRADE_COMPLETE    ImageStatus_ImageState = 5
+	ImageStatus_UPGRADE_FAILED      ImageStatus_ImageState = 6
+	ImageStatus_ACTIVATION_COMPLETE ImageStatus_ImageState = 7
+	ImageStatus_ACTIVATION_FAILED   ImageStatus_ImageState = 8
+)
+
+var ImageStatus_ImageState_name = map[int32]string{
+	0: "UNDEFINED_STATE",
+	1: "COPYING_IMAGE",
+	2: "INSTALLING_IMAGE",
+	3: "COMMITTING_IMAGE",
+	4: "REBOOTING_DEVICE",
+	5: "UPGRADE_COMPLETE",
+	6: "UPGRADE_FAILED",
+	7: "ACTIVATION_COMPLETE",
+	8: "ACTIVATION_FAILED",
+}
+
+var ImageStatus_ImageState_value = map[string]int32{
+	"UNDEFINED_STATE":     0,
+	"COPYING_IMAGE":       1,
+	"INSTALLING_IMAGE":    2,
+	"COMMITTING_IMAGE":    3,
+	"REBOOTING_DEVICE":    4,
+	"UPGRADE_COMPLETE":    5,
+	"UPGRADE_FAILED":      6,
+	"ACTIVATION_COMPLETE": 7,
+	"ACTIVATION_FAILED":   8,
+}
+
+func (x ImageStatus_ImageState) String() string {
+	return proto.EnumName(ImageStatus_ImageState_name, int32(x))
+}
+
+func (ImageStatus_ImageState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{2, 0}
+}
+
+type ImageStatus_Reason int32
+
+const (
+	ImageStatus_UNDEFINED_REASON      ImageStatus_Reason = 0
+	ImageStatus_ERROR_IN_REQUEST      ImageStatus_Reason = 1
+	ImageStatus_INTERNAL_ERROR        ImageStatus_Reason = 2
+	ImageStatus_DEVICE_IN_WRONG_STATE ImageStatus_Reason = 3
+	ImageStatus_INVALID_IMAGE         ImageStatus_Reason = 4
+	ImageStatus_WRONG_IMAGE_CHECKSUM  ImageStatus_Reason = 5
+)
+
+var ImageStatus_Reason_name = map[int32]string{
+	0: "UNDEFINED_REASON",
+	1: "ERROR_IN_REQUEST",
+	2: "INTERNAL_ERROR",
+	3: "DEVICE_IN_WRONG_STATE",
+	4: "INVALID_IMAGE",
+	5: "WRONG_IMAGE_CHECKSUM",
+}
+
+var ImageStatus_Reason_value = map[string]int32{
+	"UNDEFINED_REASON":      0,
+	"ERROR_IN_REQUEST":      1,
+	"INTERNAL_ERROR":        2,
+	"DEVICE_IN_WRONG_STATE": 3,
+	"INVALID_IMAGE":         4,
+	"WRONG_IMAGE_CHECKSUM":  5,
+}
+
+func (x ImageStatus_Reason) String() string {
+	return proto.EnumName(ImageStatus_Reason_name, int32(x))
+}
+
+func (ImageStatus_Reason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{2, 1}
+}
+
+type ImageVersion struct {
+	ImageName            string   `protobuf:"bytes,1,opt,name=image_name,json=imageName,proto3" json:"image_name,omitempty"`
+	Version              string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ImageVersion) Reset()         { *m = ImageVersion{} }
+func (m *ImageVersion) String() string { return proto.CompactTextString(m) }
+func (*ImageVersion) ProtoMessage()    {}
+func (*ImageVersion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{0}
+}
+
+func (m *ImageVersion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageVersion.Unmarshal(m, b)
+}
+func (m *ImageVersion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageVersion.Marshal(b, m, deterministic)
+}
+func (m *ImageVersion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageVersion.Merge(m, src)
+}
+func (m *ImageVersion) XXX_Size() int {
+	return xxx_messageInfo_ImageVersion.Size(m)
+}
+func (m *ImageVersion) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageVersion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageVersion proto.InternalMessageInfo
+
+func (m *ImageVersion) GetImageName() string {
+	if m != nil {
+		return m.ImageName
+	}
+	return ""
+}
+
+func (m *ImageVersion) GetVersion() string {
+	if m != nil {
+		return m.Version
+	}
+	return ""
+}
+
+type ImageInformation struct {
+	Image *ImageVersion `protobuf:"bytes,1,opt,name=image,proto3" json:"image,omitempty"`
+	// Script used by the device specific managers to install the image.
+	// Script must be included in the object downloaded from the image_url
+	ImageInstallScript string `protobuf:"bytes,2,opt,name=image_install_script,json=imageInstallScript,proto3" json:"image_install_script,omitempty"`
+	// Location of the image and installation script, authentication (user/pass) if any should be in the url string
+	// The image_url would contain the protocol, credentials, the IP address/DNS of the server and the path of the file
+	// e.g. sftp://download_user:download_pass@192.168.0.1:22/images/image1
+	ImageUrl string `protobuf:"bytes,3,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"`
+	// SHA-256 sum of the image (sha256sum on Linux)
+	Sha256Sum            string   `protobuf:"bytes,5,opt,name=sha256sum,proto3" json:"sha256sum,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ImageInformation) Reset()         { *m = ImageInformation{} }
+func (m *ImageInformation) String() string { return proto.CompactTextString(m) }
+func (*ImageInformation) ProtoMessage()    {}
+func (*ImageInformation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{1}
+}
+
+func (m *ImageInformation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageInformation.Unmarshal(m, b)
+}
+func (m *ImageInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageInformation.Marshal(b, m, deterministic)
+}
+func (m *ImageInformation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageInformation.Merge(m, src)
+}
+func (m *ImageInformation) XXX_Size() int {
+	return xxx_messageInfo_ImageInformation.Size(m)
+}
+func (m *ImageInformation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageInformation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageInformation proto.InternalMessageInfo
+
+func (m *ImageInformation) GetImage() *ImageVersion {
+	if m != nil {
+		return m.Image
+	}
+	return nil
+}
+
+func (m *ImageInformation) GetImageInstallScript() string {
+	if m != nil {
+		return m.ImageInstallScript
+	}
+	return ""
+}
+
+func (m *ImageInformation) GetImageUrl() string {
+	if m != nil {
+		return m.ImageUrl
+	}
+	return ""
+}
+
+func (m *ImageInformation) GetSha256Sum() string {
+	if m != nil {
+		return m.Sha256Sum
+	}
+	return ""
+}
+
+type ImageStatus struct {
+	Status Status                 `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason ImageStatus_Reason     `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.ImageStatus_Reason" json:"reason,omitempty"`
+	State  ImageStatus_ImageState `protobuf:"varint,3,opt,name=state,proto3,enum=dmi.ImageStatus_ImageState" json:"state,omitempty"`
+	// description contains more information about the current state of the procedure and is device dependant
+	Description          string   `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ImageStatus) Reset()         { *m = ImageStatus{} }
+func (m *ImageStatus) String() string { return proto.CompactTextString(m) }
+func (*ImageStatus) ProtoMessage()    {}
+func (*ImageStatus) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{2}
+}
+
+func (m *ImageStatus) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageStatus.Unmarshal(m, b)
+}
+func (m *ImageStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageStatus.Marshal(b, m, deterministic)
+}
+func (m *ImageStatus) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageStatus.Merge(m, src)
+}
+func (m *ImageStatus) XXX_Size() int {
+	return xxx_messageInfo_ImageStatus.Size(m)
+}
+func (m *ImageStatus) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageStatus.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageStatus proto.InternalMessageInfo
+
+func (m *ImageStatus) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *ImageStatus) GetReason() ImageStatus_Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return ImageStatus_UNDEFINED_REASON
+}
+
+func (m *ImageStatus) GetState() ImageStatus_ImageState {
+	if m != nil {
+		return m.State
+	}
+	return ImageStatus_UNDEFINED_STATE
+}
+
+func (m *ImageStatus) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterEnum("dmi.ImageStatus_ImageState", ImageStatus_ImageState_name, ImageStatus_ImageState_value)
+	proto.RegisterEnum("dmi.ImageStatus_Reason", ImageStatus_Reason_name, ImageStatus_Reason_value)
+	proto.RegisterType((*ImageVersion)(nil), "dmi.ImageVersion")
+	proto.RegisterType((*ImageInformation)(nil), "dmi.ImageInformation")
+	proto.RegisterType((*ImageStatus)(nil), "dmi.ImageStatus")
+}
+
+func init() { proto.RegisterFile("dmi/sw_image.proto", fileDescriptor_3d058607a829baf4) }
+
+var fileDescriptor_3d058607a829baf4 = []byte{
+	// 572 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x93, 0xcf, 0x6e, 0xd3, 0x4c,
+	0x14, 0xc5, 0xeb, 0xe6, 0x4f, 0xdb, 0x9b, 0xef, 0x0b, 0xce, 0xb4, 0x55, 0x03, 0x05, 0xa9, 0x0a,
+	0x0b, 0xd8, 0x34, 0x86, 0x54, 0x20, 0x21, 0x56, 0xae, 0x33, 0x0d, 0x23, 0x92, 0x71, 0x19, 0x3b,
+	0x41, 0xb0, 0xb1, 0x5c, 0x7b, 0x9a, 0x8e, 0x94, 0xb1, 0x2b, 0xdb, 0x29, 0xaf, 0xc1, 0x13, 0xb0,
+	0xe6, 0x71, 0x78, 0x24, 0x34, 0x33, 0x6e, 0x53, 0x89, 0xdd, 0xf8, 0x77, 0xce, 0xbd, 0xf7, 0xdc,
+	0x2b, 0x19, 0x50, 0x2a, 0x85, 0x53, 0xfe, 0x88, 0x84, 0x8c, 0x97, 0x7c, 0x78, 0x5b, 0xe4, 0x55,
+	0x8e, 0x1a, 0xa9, 0x14, 0xcf, 0x7a, 0x4a, 0x48, 0x72, 0x29, 0xf3, 0xac, 0x34, 0x7c, 0x30, 0x81,
+	0xff, 0x88, 0xb2, 0x2d, 0x78, 0x51, 0x8a, 0x3c, 0x43, 0x2f, 0x00, 0x74, 0x59, 0x94, 0xc5, 0x92,
+	0xf7, 0xad, 0x13, 0xeb, 0xf5, 0x1e, 0xdb, 0xd3, 0x84, 0xc6, 0x92, 0xa3, 0x3e, 0xec, 0xdc, 0x19,
+	0x67, 0x7f, 0x5b, 0x6b, 0xf7, 0x9f, 0x83, 0xdf, 0x16, 0xd8, 0xba, 0x13, 0xc9, 0xae, 0xf3, 0x42,
+	0xc6, 0x95, 0xea, 0xf6, 0x0a, 0x5a, 0xba, 0x56, 0x37, 0xea, 0x8c, 0x7a, 0xc3, 0x54, 0x8a, 0xe1,
+	0xe3, 0x79, 0xcc, 0xe8, 0xe8, 0x0d, 0x1c, 0x98, 0xb1, 0x22, 0x2b, 0xab, 0x78, 0xb5, 0x8a, 0xca,
+	0xa4, 0x10, 0xb7, 0x55, 0x3d, 0x04, 0x09, 0xd3, 0x58, 0x4b, 0x81, 0x56, 0xd0, 0x31, 0x98, 0x58,
+	0xd1, 0xba, 0x58, 0xf5, 0x1b, 0xda, 0xb6, 0xab, 0xc1, 0xbc, 0x58, 0xa1, 0xe7, 0xb0, 0x57, 0xde,
+	0xc4, 0xa3, 0x77, 0xef, 0xcb, 0xb5, 0xec, 0xb7, 0xcc, 0x12, 0x0f, 0x60, 0xf0, 0xab, 0x09, 0x1d,
+	0x1d, 0x22, 0xa8, 0xe2, 0x6a, 0x5d, 0xa2, 0x97, 0xd0, 0x2e, 0xf5, 0x4b, 0xc7, 0xec, 0x8e, 0x3a,
+	0x3a, 0xa6, 0x11, 0x59, 0x2d, 0x21, 0x07, 0xda, 0x05, 0x8f, 0xcb, 0x7a, 0xf1, 0xee, 0xe8, 0x68,
+	0xb3, 0x8b, 0x71, 0x0e, 0x99, 0x96, 0x59, 0x6d, 0x43, 0x6f, 0xa1, 0xa5, 0x4a, 0xb9, 0x0e, 0xd7,
+	0x1d, 0x1d, 0xff, 0xe3, 0x7f, 0x78, 0x73, 0x66, 0x9c, 0xe8, 0x04, 0x3a, 0x29, 0x37, 0x9b, 0xab,
+	0x0b, 0x37, 0x75, 0xf0, 0xc7, 0x68, 0xf0, 0xc7, 0x02, 0xd8, 0xd4, 0xa1, 0x7d, 0x78, 0x32, 0xa7,
+	0x63, 0x7c, 0x41, 0x28, 0x1e, 0x47, 0x41, 0xe8, 0x86, 0xd8, 0xde, 0x42, 0x3d, 0xf8, 0xdf, 0xf3,
+	0x2f, 0xbf, 0x11, 0x3a, 0x89, 0xc8, 0xcc, 0x9d, 0x60, 0xdb, 0x42, 0x07, 0x60, 0x13, 0x1a, 0x84,
+	0xee, 0x74, 0xba, 0xa1, 0xdb, 0x8a, 0x7a, 0xfe, 0x6c, 0x46, 0xc2, 0x70, 0x43, 0x1b, 0x8a, 0x32,
+	0x7c, 0xee, 0xfb, 0x1a, 0x8e, 0xf1, 0x82, 0x78, 0xd8, 0x6e, 0x2a, 0x3a, 0xbf, 0x9c, 0x30, 0x77,
+	0x8c, 0x23, 0xcf, 0x9f, 0x5d, 0x4e, 0x71, 0x88, 0xed, 0x16, 0x42, 0xd0, 0xbd, 0xa7, 0x17, 0x2e,
+	0x99, 0xe2, 0xb1, 0xdd, 0x46, 0x47, 0xb0, 0xef, 0x7a, 0x21, 0x59, 0xb8, 0x21, 0xf1, 0xe9, 0xc6,
+	0xbc, 0x83, 0x0e, 0xa1, 0xf7, 0x48, 0xa8, 0xfd, 0xbb, 0x83, 0x9f, 0x16, 0xb4, 0xcd, 0xe9, 0xf4,
+	0x90, 0x87, 0x75, 0x18, 0x76, 0x03, 0x9f, 0xda, 0x5b, 0x8a, 0x62, 0xc6, 0x7c, 0x16, 0x11, 0x1a,
+	0x31, 0xfc, 0x65, 0x8e, 0x83, 0xd0, 0xb6, 0xd4, 0x68, 0x42, 0x43, 0xcc, 0xa8, 0x3b, 0x8d, 0xb4,
+	0x6c, 0x6f, 0xa3, 0xa7, 0x70, 0x68, 0x02, 0x2b, 0xeb, 0x57, 0xe6, 0xd3, 0x49, 0x7d, 0x94, 0x86,
+	0x3a, 0x0a, 0xa1, 0x0b, 0x77, 0x4a, 0xc6, 0xf5, 0xa2, 0x4d, 0xd4, 0x87, 0x03, 0xe3, 0xd1, 0x20,
+	0xf2, 0x3e, 0x61, 0xef, 0x73, 0x30, 0x9f, 0xd9, 0xad, 0xf3, 0x8f, 0xdf, 0x3f, 0x2c, 0x45, 0x75,
+	0xb3, 0xbe, 0x1a, 0x26, 0xb9, 0x74, 0xf2, 0x5b, 0x9e, 0x25, 0x79, 0x91, 0x3a, 0x29, 0xbf, 0x13,
+	0x09, 0x3f, 0x95, 0x71, 0x16, 0x2f, 0xb9, 0xe4, 0x59, 0x75, 0x2a, 0xb2, 0x8a, 0x17, 0xd7, 0x71,
+	0xc2, 0x9d, 0xbb, 0x33, 0x67, 0x99, 0x3b, 0xa9, 0x14, 0x57, 0x6d, 0xfd, 0x63, 0x9d, 0xfd, 0x0d,
+	0x00, 0x00, 0xff, 0xff, 0x43, 0x5f, 0xa7, 0xa1, 0x86, 0x03, 0x00, 0x00,
+}
diff --git a/vendor/github.com/opencord/device-management-interface/go/dmi/sw_management_service.pb.go b/vendor/github.com/opencord/device-management-interface/go/dmi/sw_management_service.pb.go
new file mode 100644
index 0000000..f3ef3e6
--- /dev/null
+++ b/vendor/github.com/opencord/device-management-interface/go/dmi/sw_management_service.pb.go
@@ -0,0 +1,480 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/sw_management_service.proto
+
+package dmi
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type SoftwareVersionInformation struct {
+	ActiveVersions       []*ImageVersion `protobuf:"bytes,1,rep,name=active_versions,json=activeVersions,proto3" json:"active_versions,omitempty"`
+	StandbyVersions      []*ImageVersion `protobuf:"bytes,2,rep,name=standby_versions,json=standbyVersions,proto3" json:"standby_versions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *SoftwareVersionInformation) Reset()         { *m = SoftwareVersionInformation{} }
+func (m *SoftwareVersionInformation) String() string { return proto.CompactTextString(m) }
+func (*SoftwareVersionInformation) ProtoMessage()    {}
+func (*SoftwareVersionInformation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_000929e4bec891d7, []int{0}
+}
+
+func (m *SoftwareVersionInformation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SoftwareVersionInformation.Unmarshal(m, b)
+}
+func (m *SoftwareVersionInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SoftwareVersionInformation.Marshal(b, m, deterministic)
+}
+func (m *SoftwareVersionInformation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SoftwareVersionInformation.Merge(m, src)
+}
+func (m *SoftwareVersionInformation) XXX_Size() int {
+	return xxx_messageInfo_SoftwareVersionInformation.Size(m)
+}
+func (m *SoftwareVersionInformation) XXX_DiscardUnknown() {
+	xxx_messageInfo_SoftwareVersionInformation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SoftwareVersionInformation proto.InternalMessageInfo
+
+func (m *SoftwareVersionInformation) GetActiveVersions() []*ImageVersion {
+	if m != nil {
+		return m.ActiveVersions
+	}
+	return nil
+}
+
+func (m *SoftwareVersionInformation) GetStandbyVersions() []*ImageVersion {
+	if m != nil {
+		return m.StandbyVersions
+	}
+	return nil
+}
+
+type GetSoftwareVersionInformationResponse struct {
+	Status               Status                      `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason                      `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	Info                 *SoftwareVersionInformation `protobuf:"bytes,3,opt,name=info,proto3" json:"info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *GetSoftwareVersionInformationResponse) Reset()         { *m = GetSoftwareVersionInformationResponse{} }
+func (m *GetSoftwareVersionInformationResponse) String() string { return proto.CompactTextString(m) }
+func (*GetSoftwareVersionInformationResponse) ProtoMessage()    {}
+func (*GetSoftwareVersionInformationResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_000929e4bec891d7, []int{1}
+}
+
+func (m *GetSoftwareVersionInformationResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetSoftwareVersionInformationResponse.Unmarshal(m, b)
+}
+func (m *GetSoftwareVersionInformationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetSoftwareVersionInformationResponse.Marshal(b, m, deterministic)
+}
+func (m *GetSoftwareVersionInformationResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetSoftwareVersionInformationResponse.Merge(m, src)
+}
+func (m *GetSoftwareVersionInformationResponse) XXX_Size() int {
+	return xxx_messageInfo_GetSoftwareVersionInformationResponse.Size(m)
+}
+func (m *GetSoftwareVersionInformationResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetSoftwareVersionInformationResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetSoftwareVersionInformationResponse proto.InternalMessageInfo
+
+func (m *GetSoftwareVersionInformationResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *GetSoftwareVersionInformationResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *GetSoftwareVersionInformationResponse) GetInfo() *SoftwareVersionInformation {
+	if m != nil {
+		return m.Info
+	}
+	return nil
+}
+
+type DownloadImageRequest struct {
+	DeviceUuid           *Uuid             `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	ImageInfo            *ImageInformation `protobuf:"bytes,2,opt,name=image_info,json=imageInfo,proto3" json:"image_info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *DownloadImageRequest) Reset()         { *m = DownloadImageRequest{} }
+func (m *DownloadImageRequest) String() string { return proto.CompactTextString(m) }
+func (*DownloadImageRequest) ProtoMessage()    {}
+func (*DownloadImageRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_000929e4bec891d7, []int{2}
+}
+
+func (m *DownloadImageRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DownloadImageRequest.Unmarshal(m, b)
+}
+func (m *DownloadImageRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DownloadImageRequest.Marshal(b, m, deterministic)
+}
+func (m *DownloadImageRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DownloadImageRequest.Merge(m, src)
+}
+func (m *DownloadImageRequest) XXX_Size() int {
+	return xxx_messageInfo_DownloadImageRequest.Size(m)
+}
+func (m *DownloadImageRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DownloadImageRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DownloadImageRequest proto.InternalMessageInfo
+
+func (m *DownloadImageRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *DownloadImageRequest) GetImageInfo() *ImageInformation {
+	if m != nil {
+		return m.ImageInfo
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*SoftwareVersionInformation)(nil), "dmi.SoftwareVersionInformation")
+	proto.RegisterType((*GetSoftwareVersionInformationResponse)(nil), "dmi.GetSoftwareVersionInformationResponse")
+	proto.RegisterType((*DownloadImageRequest)(nil), "dmi.DownloadImageRequest")
+}
+
+func init() { proto.RegisterFile("dmi/sw_management_service.proto", fileDescriptor_000929e4bec891d7) }
+
+var fileDescriptor_000929e4bec891d7 = []byte{
+	// 458 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x5d, 0x6b, 0x13, 0x41,
+	0x14, 0x65, 0x13, 0x29, 0x74, 0xd6, 0x36, 0xed, 0x50, 0x21, 0xee, 0x4b, 0x4a, 0x44, 0x08, 0x85,
+	0x66, 0x65, 0xd3, 0x17, 0xad, 0x08, 0x4a, 0x41, 0xf3, 0xa0, 0xe0, 0x46, 0x7d, 0xf0, 0x65, 0x99,
+	0xec, 0xdc, 0xa4, 0x03, 0xce, 0xdc, 0x38, 0x33, 0xbb, 0xd1, 0x3f, 0xe2, 0x4f, 0xd0, 0xbf, 0x29,
+	0xf3, 0x11, 0x53, 0x69, 0x03, 0x7d, 0xdb, 0x3d, 0xf7, 0x9c, 0x33, 0x67, 0xee, 0xbd, 0x43, 0x06,
+	0x5c, 0x8a, 0xdc, 0xac, 0x2b, 0xc9, 0x14, 0x5b, 0x82, 0x04, 0x65, 0x2b, 0x03, 0xba, 0x15, 0x35,
+	0x8c, 0x57, 0x1a, 0x2d, 0xd2, 0x2e, 0x97, 0x22, 0x3b, 0x76, 0xac, 0x1a, 0xa5, 0x44, 0x65, 0x02,
+	0x9e, 0x3d, 0x74, 0xd0, 0xf5, 0x3a, 0xfe, 0xd1, 0x68, 0x23, 0x24, 0x5b, 0x46, 0xe5, 0xf0, 0x57,
+	0x42, 0xb2, 0x19, 0x2e, 0xec, 0x9a, 0x69, 0xf8, 0x02, 0xda, 0x08, 0x54, 0x53, 0xb5, 0x40, 0x2d,
+	0x99, 0x15, 0xa8, 0xe8, 0x0b, 0xd2, 0x63, 0xb5, 0x15, 0x2d, 0x54, 0x6d, 0x28, 0x9a, 0x7e, 0x72,
+	0xda, 0x1d, 0xa5, 0xc5, 0xf1, 0x98, 0x4b, 0x31, 0x9e, 0x3a, 0xa7, 0x28, 0x2b, 0x0f, 0x03, 0x33,
+	0xfe, 0x1a, 0xfa, 0x92, 0x1c, 0x19, 0xcb, 0x14, 0x9f, 0xff, 0xdc, 0x8a, 0x3b, 0xbb, 0xc4, 0xbd,
+	0x48, 0xdd, 0xa8, 0x87, 0xbf, 0x13, 0xf2, 0xf4, 0x2d, 0xd8, 0xdd, 0xd9, 0x4a, 0x30, 0x2b, 0x54,
+	0x06, 0xe8, 0x13, 0xb2, 0x67, 0x2c, 0xb3, 0x8d, 0x8b, 0x96, 0x8c, 0x0e, 0x8b, 0xd4, 0xbb, 0xcf,
+	0x3c, 0x54, 0xc6, 0x92, 0x23, 0x69, 0x60, 0x06, 0x55, 0xbf, 0x73, 0x83, 0x54, 0x7a, 0xa8, 0x8c,
+	0x25, 0x3a, 0x21, 0x0f, 0x84, 0x5a, 0x60, 0xbf, 0x7b, 0x9a, 0x8c, 0xd2, 0x62, 0x10, 0x7c, 0x76,
+	0x07, 0xf0, 0xe4, 0xe1, 0x0f, 0x72, 0x72, 0x85, 0x6b, 0xf5, 0x0d, 0x19, 0xf7, 0x37, 0x2a, 0xe1,
+	0x7b, 0x03, 0xc6, 0xd2, 0x33, 0x92, 0x72, 0x70, 0x33, 0xaa, 0x9a, 0x46, 0x70, 0x9f, 0x2d, 0x2d,
+	0xf6, 0xbd, 0xe7, 0xe7, 0x46, 0xf0, 0x92, 0x84, 0xaa, 0xfb, 0xa6, 0x17, 0x84, 0xf8, 0xa1, 0x54,
+	0xfe, 0xf8, 0x8e, 0xa7, 0x3e, 0xda, 0x36, 0xe9, 0xe6, 0xa1, 0xfb, 0x62, 0x83, 0x14, 0x7f, 0x3a,
+	0x64, 0xf0, 0x81, 0xb9, 0x9e, 0x6f, 0x42, 0xbe, 0xff, 0xb7, 0x20, 0xb3, 0xb0, 0x1f, 0xf4, 0x23,
+	0xa1, 0xb7, 0xbb, 0x48, 0x7b, 0xde, 0xfb, 0x1d, 0xd3, 0xdc, 0xa1, 0xd3, 0xab, 0xec, 0xcc, 0x03,
+	0xf7, 0xeb, 0xf7, 0x2b, 0x72, 0xf0, 0xdf, 0x85, 0xe9, 0x63, 0x2f, 0xbe, 0xab, 0x09, 0xd9, 0xd1,
+	0xf6, 0x12, 0x61, 0x20, 0xcf, 0x12, 0x7a, 0x41, 0x0e, 0x5e, 0xbb, 0x4d, 0x61, 0x16, 0x82, 0xfe,
+	0x56, 0x9a, 0xbb, 0x54, 0x97, 0xe4, 0xa4, 0x84, 0x16, 0xb4, 0xfd, 0x84, 0xb3, 0xb0, 0x2a, 0xf7,
+	0x17, 0xbf, 0xb9, 0xfc, 0xfa, 0x7c, 0x29, 0xec, 0x75, 0x33, 0x1f, 0xd7, 0x28, 0x73, 0x5c, 0x81,
+	0xaa, 0x51, 0xf3, 0x3c, 0x4c, 0xe0, 0x7c, 0xfb, 0xac, 0xce, 0x85, 0xb2, 0xa0, 0x17, 0xac, 0x86,
+	0xbc, 0x9d, 0xe4, 0x4b, 0xcc, 0xb9, 0x14, 0xf3, 0x3d, 0xff, 0x52, 0x26, 0x7f, 0x03, 0x00, 0x00,
+	0xff, 0xff, 0x6d, 0x7d, 0x3b, 0xc8, 0x86, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// NativeSoftwareManagementServiceClient is the client API for NativeSoftwareManagementService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NativeSoftwareManagementServiceClient interface {
+	// Get the software version information of the Active and Standby images
+	GetSoftwareVersion(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*GetSoftwareVersionInformationResponse, error)
+	// Downloads and installs the image in the standby partition, returns the status/progress of the Install
+	DownloadImage(ctx context.Context, in *DownloadImageRequest, opts ...grpc.CallOption) (NativeSoftwareManagementService_DownloadImageClient, error)
+	// Activates and runs the OLT with the image in the standby partition. If things are fine this image will
+	// henceforth be marked as the Active Partition. The old working image would remain on the Standby partition.
+	// Any possibly required (sub-)steps like "commit" are left to the "Device Manager"
+	ActivateImage(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (NativeSoftwareManagementService_ActivateImageClient, error)
+	// Marks the image in the Standby as Active and reboots the device, so that it boots from that image which was in the standby.
+	// This API is to be used if operator wants to go back to the previous software
+	RevertToStandbyImage(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (NativeSoftwareManagementService_RevertToStandbyImageClient, error)
+}
+
+type nativeSoftwareManagementServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewNativeSoftwareManagementServiceClient(cc *grpc.ClientConn) NativeSoftwareManagementServiceClient {
+	return &nativeSoftwareManagementServiceClient{cc}
+}
+
+func (c *nativeSoftwareManagementServiceClient) GetSoftwareVersion(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*GetSoftwareVersionInformationResponse, error) {
+	out := new(GetSoftwareVersionInformationResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeSoftwareManagementService/GetSoftwareVersion", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeSoftwareManagementServiceClient) DownloadImage(ctx context.Context, in *DownloadImageRequest, opts ...grpc.CallOption) (NativeSoftwareManagementService_DownloadImageClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeSoftwareManagementService_serviceDesc.Streams[0], "/dmi.NativeSoftwareManagementService/DownloadImage", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeSoftwareManagementServiceDownloadImageClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeSoftwareManagementService_DownloadImageClient interface {
+	Recv() (*ImageStatus, error)
+	grpc.ClientStream
+}
+
+type nativeSoftwareManagementServiceDownloadImageClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeSoftwareManagementServiceDownloadImageClient) Recv() (*ImageStatus, error) {
+	m := new(ImageStatus)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeSoftwareManagementServiceClient) ActivateImage(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (NativeSoftwareManagementService_ActivateImageClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeSoftwareManagementService_serviceDesc.Streams[1], "/dmi.NativeSoftwareManagementService/ActivateImage", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeSoftwareManagementServiceActivateImageClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeSoftwareManagementService_ActivateImageClient interface {
+	Recv() (*ImageStatus, error)
+	grpc.ClientStream
+}
+
+type nativeSoftwareManagementServiceActivateImageClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeSoftwareManagementServiceActivateImageClient) Recv() (*ImageStatus, error) {
+	m := new(ImageStatus)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeSoftwareManagementServiceClient) RevertToStandbyImage(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (NativeSoftwareManagementService_RevertToStandbyImageClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeSoftwareManagementService_serviceDesc.Streams[2], "/dmi.NativeSoftwareManagementService/RevertToStandbyImage", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeSoftwareManagementServiceRevertToStandbyImageClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeSoftwareManagementService_RevertToStandbyImageClient interface {
+	Recv() (*ImageStatus, error)
+	grpc.ClientStream
+}
+
+type nativeSoftwareManagementServiceRevertToStandbyImageClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeSoftwareManagementServiceRevertToStandbyImageClient) Recv() (*ImageStatus, error) {
+	m := new(ImageStatus)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// NativeSoftwareManagementServiceServer is the server API for NativeSoftwareManagementService service.
+type NativeSoftwareManagementServiceServer interface {
+	// Get the software version information of the Active and Standby images
+	GetSoftwareVersion(context.Context, *HardwareID) (*GetSoftwareVersionInformationResponse, error)
+	// Downloads and installs the image in the standby partition, returns the status/progress of the Install
+	DownloadImage(*DownloadImageRequest, NativeSoftwareManagementService_DownloadImageServer) error
+	// Activates and runs the OLT with the image in the standby partition. If things are fine this image will
+	// henceforth be marked as the Active Partition. The old working image would remain on the Standby partition.
+	// Any possibly required (sub-)steps like "commit" are left to the "Device Manager"
+	ActivateImage(*HardwareID, NativeSoftwareManagementService_ActivateImageServer) error
+	// Marks the image in the Standby as Active and reboots the device, so that it boots from that image which was in the standby.
+	// This API is to be used if operator wants to go back to the previous software
+	RevertToStandbyImage(*HardwareID, NativeSoftwareManagementService_RevertToStandbyImageServer) error
+}
+
+func RegisterNativeSoftwareManagementServiceServer(s *grpc.Server, srv NativeSoftwareManagementServiceServer) {
+	s.RegisterService(&_NativeSoftwareManagementService_serviceDesc, srv)
+}
+
+func _NativeSoftwareManagementService_GetSoftwareVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(HardwareID)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeSoftwareManagementServiceServer).GetSoftwareVersion(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeSoftwareManagementService/GetSoftwareVersion",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeSoftwareManagementServiceServer).GetSoftwareVersion(ctx, req.(*HardwareID))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeSoftwareManagementService_DownloadImage_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(DownloadImageRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeSoftwareManagementServiceServer).DownloadImage(m, &nativeSoftwareManagementServiceDownloadImageServer{stream})
+}
+
+type NativeSoftwareManagementService_DownloadImageServer interface {
+	Send(*ImageStatus) error
+	grpc.ServerStream
+}
+
+type nativeSoftwareManagementServiceDownloadImageServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeSoftwareManagementServiceDownloadImageServer) Send(m *ImageStatus) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeSoftwareManagementService_ActivateImage_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(HardwareID)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeSoftwareManagementServiceServer).ActivateImage(m, &nativeSoftwareManagementServiceActivateImageServer{stream})
+}
+
+type NativeSoftwareManagementService_ActivateImageServer interface {
+	Send(*ImageStatus) error
+	grpc.ServerStream
+}
+
+type nativeSoftwareManagementServiceActivateImageServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeSoftwareManagementServiceActivateImageServer) Send(m *ImageStatus) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeSoftwareManagementService_RevertToStandbyImage_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(HardwareID)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeSoftwareManagementServiceServer).RevertToStandbyImage(m, &nativeSoftwareManagementServiceRevertToStandbyImageServer{stream})
+}
+
+type NativeSoftwareManagementService_RevertToStandbyImageServer interface {
+	Send(*ImageStatus) error
+	grpc.ServerStream
+}
+
+type nativeSoftwareManagementServiceRevertToStandbyImageServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeSoftwareManagementServiceRevertToStandbyImageServer) Send(m *ImageStatus) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+var _NativeSoftwareManagementService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "dmi.NativeSoftwareManagementService",
+	HandlerType: (*NativeSoftwareManagementServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetSoftwareVersion",
+			Handler:    _NativeSoftwareManagementService_GetSoftwareVersion_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "DownloadImage",
+			Handler:       _NativeSoftwareManagementService_DownloadImage_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "ActivateImage",
+			Handler:       _NativeSoftwareManagementService_ActivateImage_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "RevertToStandbyImage",
+			Handler:       _NativeSoftwareManagementService_RevertToStandbyImage_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "dmi/sw_management_service.proto",
+}
