// 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 ListMetricsResponse_Reason int32

const (
	ListMetricsResponse_UNDEFINED_REASON ListMetricsResponse_Reason = 0
	ListMetricsResponse_UNKNOWN_DEVICE   ListMetricsResponse_Reason = 1
	ListMetricsResponse_INTERNAL_ERROR   ListMetricsResponse_Reason = 2
)

var ListMetricsResponse_Reason_name = map[int32]string{
	0: "UNDEFINED_REASON",
	1: "UNKNOWN_DEVICE",
	2: "INTERNAL_ERROR",
}

var ListMetricsResponse_Reason_value = map[string]int32{
	"UNDEFINED_REASON": 0,
	"UNKNOWN_DEVICE":   1,
	"INTERNAL_ERROR":   2,
}

func (x ListMetricsResponse_Reason) String() string {
	return proto.EnumName(ListMetricsResponse_Reason_name, int32(x))
}

func (ListMetricsResponse_Reason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6b6c2f1384c11ff5, []int{2, 0}
}

type MetricsConfigurationResponse_Reason int32

const (
	MetricsConfigurationResponse_UNDEFINED_REASON          MetricsConfigurationResponse_Reason = 0
	MetricsConfigurationResponse_UNKNOWN_DEVICE            MetricsConfigurationResponse_Reason = 1
	MetricsConfigurationResponse_INTERNAL_ERROR            MetricsConfigurationResponse_Reason = 2
	MetricsConfigurationResponse_POLL_INTERVAL_UNSUPPORTED MetricsConfigurationResponse_Reason = 3
	MetricsConfigurationResponse_INVALID_METRIC            MetricsConfigurationResponse_Reason = 4
)

var MetricsConfigurationResponse_Reason_name = map[int32]string{
	0: "UNDEFINED_REASON",
	1: "UNKNOWN_DEVICE",
	2: "INTERNAL_ERROR",
	3: "POLL_INTERVAL_UNSUPPORTED",
	4: "INVALID_METRIC",
}

var MetricsConfigurationResponse_Reason_value = map[string]int32{
	"UNDEFINED_REASON":          0,
	"UNKNOWN_DEVICE":            1,
	"INTERNAL_ERROR":            2,
	"POLL_INTERVAL_UNSUPPORTED": 3,
	"INVALID_METRIC":            4,
}

func (x MetricsConfigurationResponse_Reason) String() string {
	return proto.EnumName(MetricsConfigurationResponse_Reason_name, int32(x))
}

func (MetricsConfigurationResponse_Reason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6b6c2f1384c11ff5, []int{4, 0}
}

type GetMetricResponse_Reason int32

const (
	GetMetricResponse_UNDEFINED_REASON  GetMetricResponse_Reason = 0
	GetMetricResponse_UNKNOWN_DEVICE    GetMetricResponse_Reason = 1
	GetMetricResponse_UNKNOWN_COMPONENT GetMetricResponse_Reason = 2
	GetMetricResponse_INTERNAL_ERROR    GetMetricResponse_Reason = 3
	GetMetricResponse_INVALID_METRIC    GetMetricResponse_Reason = 4
)

var GetMetricResponse_Reason_name = map[int32]string{
	0: "UNDEFINED_REASON",
	1: "UNKNOWN_DEVICE",
	2: "UNKNOWN_COMPONENT",
	3: "INTERNAL_ERROR",
	4: "INVALID_METRIC",
}

var GetMetricResponse_Reason_value = map[string]int32{
	"UNDEFINED_REASON":  0,
	"UNKNOWN_DEVICE":    1,
	"UNKNOWN_COMPONENT": 2,
	"INTERNAL_ERROR":    3,
	"INVALID_METRIC":    4,
}

func (x GetMetricResponse_Reason) String() string {
	return proto.EnumName(GetMetricResponse_Reason_name, int32(x))
}

func (GetMetricResponse_Reason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6b6c2f1384c11ff5, []int{8, 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               ListMetricsResponse_Reason `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.ListMetricsResponse_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() ListMetricsResponse_Reason {
	if m != nil {
		return m.Reason
	}
	return ListMetricsResponse_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               MetricsConfigurationResponse_Reason `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.MetricsConfigurationResponse_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() MetricsConfigurationResponse_Reason {
	if m != nil {
		return m.Reason
	}
	return MetricsConfigurationResponse_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               GetMetricResponse_Reason `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.GetMetricResponse_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() GetMetricResponse_Reason {
	if m != nil {
		return m.Reason
	}
	return GetMetricResponse_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.RegisterEnum("dmi.ListMetricsResponse_Reason", ListMetricsResponse_Reason_name, ListMetricsResponse_Reason_value)
	proto.RegisterEnum("dmi.MetricsConfigurationResponse_Reason", MetricsConfigurationResponse_Reason_name, MetricsConfigurationResponse_Reason_value)
	proto.RegisterEnum("dmi.GetMetricResponse_Reason", GetMetricResponse_Reason_name, GetMetricResponse_Reason_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{
	// 1147 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4b, 0x6f, 0xdb, 0x46,
	0x10, 0x36, 0xa9, 0x44, 0x89, 0x57, 0xb6, 0x42, 0xaf, 0xf3, 0x50, 0x94, 0xa4, 0x91, 0x69, 0xb4,
	0x10, 0xd2, 0x46, 0x0a, 0x14, 0x14, 0x7d, 0xe5, 0x50, 0x86, 0x5c, 0xdb, 0x44, 0x24, 0x4a, 0x58,
	0x51, 0x72, 0xd2, 0xcb, 0x62, 0x23, 0x6e, 0x14, 0x02, 0x26, 0xa9, 0x90, 0x94, 0x83, 0xde, 0x7a,
	0xcb, 0xb5, 0x0f, 0xf4, 0x27, 0xf4, 0xd6, 0xf7, 0xaf, 0xe8, 0xf3, 0xde, 0xfe, 0x84, 0xde, 0xdb,
	0x02, 0xbd, 0x15, 0xdc, 0xa5, 0xd4, 0xb5, 0x22, 0x37, 0x70, 0xd1, 0x1b, 0xf9, 0xcd, 0x37, 0x33,
	0xdf, 0xcc, 0xec, 0x0b, 0x6c, 0x79, 0x81, 0xdf, 0x7c, 0xfc, 0x94, 0x04, 0x2c, 0x8d, 0xfd, 0x51,
	0x42, 0x82, 0x71, 0x90, 0x92, 0x84, 0xc5, 0x87, 0xfe, 0x88, 0x35, 0x26, 0x71, 0x94, 0x46, 0xb0,
	0xe0, 0x05, 0x7e, 0x75, 0x23, 0xe3, 0x8d, 0xa2, 0x20, 0x88, 0xc2, 0x44, 0xe0, 0xd5, 0x35, 0xe1,
	0x2a, 0xfe, 0xf4, 0x67, 0x0a, 0x58, 0xeb, 0xf0, 0x20, 0x66, 0x14, 0x3e, 0xf2, 0xc7, 0xf0, 0x26,
	0x58, 0x15, 0x41, 0x89, 0xef, 0x55, 0x94, 0x9a, 0x52, 0x2f, 0xb7, 0xb4, 0x86, 0x17, 0xf8, 0x0d,
	0xc1, 0x72, 0x68, 0xc0, 0x12, 0x7c, 0x56, 0x50, 0x6c, 0x0f, 0x6e, 0x83, 0x75, 0x3f, 0x21, 0x23,
	0xee, 0x3b, 0x8d, 0x99, 0x57, 0x51, 0x6b, 0x4a, 0xfd, 0x2c, 0x5e, 0xf3, 0x13, 0x73, 0x8e, 0x65,
	0xa4, 0x49, 0x74, 0x70, 0x40, 0xfc, 0x30, 0x65, 0xf1, 0x21, 0x3d, 0xa8, 0x14, 0x6a, 0x4a, 0x7d,
	0x1d, 0xaf, 0x65, 0xa0, 0x9d, 0x63, 0xfa, 0x1d, 0xb0, 0x2e, 0x52, 0xe4, 0x9e, 0xf0, 0x55, 0x70,
	0x26, 0x2f, 0xaf, 0xa2, 0xd4, 0x0a, 0xf5, 0x52, 0x6b, 0x43, 0xd2, 0x21, 0x38, 0x78, 0xc6, 0xd0,
	0x7f, 0x53, 0xc0, 0x66, 0xdb, 0x4f, 0xd2, 0x3c, 0x04, 0x66, 0xc9, 0x24, 0x0a, 0x13, 0x06, 0xb7,
	0x41, 0x31, 0x49, 0x69, 0x3a, 0x4d, 0xf2, 0x5a, 0x4a, 0x3c, 0x46, 0x9f, 0x43, 0x38, 0x37, 0xc1,
	0x37, 0x40, 0x31, 0x66, 0x34, 0x89, 0x42, 0xae, 0xbe, 0xdc, 0xba, 0xce, 0x49, 0x4b, 0xc2, 0x35,
	0x30, 0xa7, 0xe1, 0x9c, 0x0e, 0x5f, 0xfb, 0x47, 0x62, 0x56, 0x52, 0xa9, 0x05, 0x25, 0x89, 0xc9,
	0xa2, 0xc6, 0x1d, 0x50, 0x14, 0xfe, 0xf0, 0x3c, 0xd0, 0x06, 0x8e, 0x85, 0x76, 0x6c, 0x07, 0x59,
	0x04, 0x23, 0xa3, 0xdf, 0x75, 0xb4, 0x15, 0x08, 0x41, 0x79, 0xe0, 0xdc, 0x73, 0xba, 0xfb, 0x0e,
	0xb1, 0xd0, 0xd0, 0x36, 0x91, 0xa6, 0x64, 0x98, 0xed, 0xb8, 0x08, 0x3b, 0x46, 0x9b, 0x20, 0x8c,
	0xbb, 0x58, 0x53, 0xf5, 0x6f, 0x15, 0x70, 0xe5, 0x48, 0x8a, 0x69, 0x4c, 0x53, 0x3f, 0x0a, 0x31,
	0x7b, 0x32, 0x65, 0x49, 0x0a, 0x6f, 0x80, 0x92, 0xc7, 0xb2, 0x95, 0x40, 0xa6, 0xd3, 0x7c, 0x88,
	0xa5, 0xd6, 0x2a, 0x57, 0x36, 0x98, 0xfa, 0x1e, 0x06, 0xc2, 0x9a, 0x7d, 0xc3, 0x06, 0x38, 0x33,
	0x7a, 0x4c, 0xc3, 0x31, 0x4b, 0x78, 0xed, 0x4b, 0x2b, 0xd8, 0x5b, 0xc1, 0x33, 0x12, 0xbc, 0x01,
	0xb4, 0x98, 0x25, 0x2c, 0x25, 0x69, 0x44, 0x3c, 0xf6, 0x88, 0x4e, 0x0f, 0x52, 0x5e, 0xfa, 0xd9,
	0xbd, 0x15, 0x5c, 0xe6, 0x16, 0x37, 0xb2, 0x04, 0x7e, 0xb7, 0x04, 0x56, 0xa3, 0x09, 0x13, 0xda,
	0xf4, 0x0f, 0x54, 0x70, 0x75, 0xb9, 0xe8, 0x93, 0x4c, 0xea, 0xdd, 0x85, 0x49, 0xd5, 0x9f, 0x57,
	0xbb, 0x10, 0x77, 0x61, 0x64, 0xfa, 0xfb, 0xff, 0xcf, 0x10, 0xe0, 0x35, 0x70, 0xb9, 0xd7, 0x6d,
	0xb7, 0x09, 0x37, 0x0c, 0x8d, 0x36, 0x19, 0x38, 0xfd, 0x41, 0xaf, 0xd7, 0xc5, 0x2e, 0xb2, 0xb4,
	0x82, 0x70, 0x19, 0x1a, 0x6d, 0xdb, 0x22, 0x1d, 0xe4, 0x62, 0xdb, 0xd4, 0x4e, 0xe9, 0x9f, 0x2a,
	0xa0, 0x2c, 0xa4, 0x76, 0x58, 0x4a, 0x2d, 0x9a, 0xd2, 0x13, 0x8d, 0xea, 0x16, 0x28, 0x8f, 0xa2,
	0x60, 0x12, 0x85, 0x2c, 0x4c, 0x05, 0x5d, 0x5d, 0xa4, 0xaf, 0xcf, 0x09, 0xdc, 0xe3, 0x65, 0xd9,
	0x23, 0xa4, 0x01, 0xe3, 0xa3, 0x5a, 0x95, 0x68, 0xd9, 0x76, 0xd6, 0x3f, 0x53, 0x40, 0x51, 0xe8,
	0x3a, 0xe9, 0xee, 0xbf, 0x03, 0xce, 0xe5, 0xf4, 0x80, 0xa5, 0xd4, 0xa3, 0x29, 0xcd, 0x35, 0x6d,
	0x4a, 0x4e, 0xb3, 0x62, 0x71, 0x39, 0x98, 0xff, 0x67, 0x54, 0xd8, 0x00, 0xa7, 0x0f, 0xe9, 0xc1,
	0x94, 0xe5, 0x7b, 0xa7, 0xc2, 0x7d, 0xcc, 0x99, 0xb4, 0x3e, 0x0b, 0x93, 0x28, 0xe6, 0x8e, 0x82,
	0xa6, 0x27, 0x40, 0xdb, 0x65, 0xf9, 0x96, 0x9c, 0xad, 0xf5, 0x5b, 0x5c, 0x30, 0x25, 0x3c, 0xb7,
	0x72, 0x7c, 0xee, 0x4c, 0xb3, 0x68, 0xf9, 0x91, 0x12, 0xd5, 0x17, 0x95, 0xa8, 0x3f, 0x53, 0xc1,
	0x86, 0x94, 0xf5, 0x24, 0x8b, 0xf5, 0xf5, 0x85, 0xc5, 0x7a, 0x8d, 0x93, 0x9e, 0x0b, 0xb6, 0x78,
	0xa8, 0x6c, 0x83, 0xa2, 0xc8, 0x9e, 0xf7, 0xa5, 0x24, 0xa9, 0xc3, 0xb9, 0x49, 0x7f, 0xf2, 0x1f,
	0x96, 0xf1, 0x05, 0xb0, 0x31, 0xc3, 0xcc, 0x6e, 0xa7, 0xd7, 0x75, 0x90, 0xe3, 0x6a, 0xea, 0x92,
	0xd5, 0xbd, 0x74, 0xf9, 0xde, 0xf8, 0xf5, 0x34, 0x28, 0x49, 0x3d, 0x82, 0x97, 0xc1, 0x05, 0x61,
	0x23, 0x8e, 0xd1, 0x41, 0x64, 0x2e, 0x42, 0x5b, 0xc9, 0x34, 0xe5, 0xa6, 0x1d, 0xc3, 0x21, 0xfd,
	0x1e, 0x42, 0x96, 0xa6, 0xc0, 0x4d, 0x70, 0x2e, 0x47, 0xcd, 0xde, 0x80, 0xb8, 0xa8, 0xd3, 0xd3,
	0x3c, 0x78, 0x1d, 0x5c, 0x91, 0xc0, 0x41, 0xdf, 0xd8, 0x45, 0xa4, 0x87, 0xb0, 0x89, 0x1c, 0xd7,
	0xd8, 0x45, 0x1a, 0x83, 0x57, 0xc1, 0xa5, 0x9c, 0xe0, 0x62, 0xc3, 0xe9, 0x9b, 0xc8, 0x1e, 0x22,
	0x2c, 0xbc, 0xbf, 0x53, 0xe0, 0x75, 0x50, 0x5d, 0x62, 0x1d, 0x76, 0xdb, 0xdc, 0xfb, 0x7b, 0xe5,
	0x18, 0xf7, 0xbb, 0xb6, 0xd1, 0xd7, 0x7e, 0x50, 0x60, 0x6d, 0x9e, 0x5d, 0xb6, 0xe2, 0xfb, 0xa4,
	0xd7, 0xdd, 0x47, 0x58, 0xfb, 0xf1, 0x38, 0x86, 0x3b, 0x63, 0xfc, 0xa4, 0x40, 0x1d, 0x5c, 0x5b,
	0xc2, 0xd8, 0x37, 0x86, 0xa8, 0x8d, 0x9c, 0x5d, 0x77, 0x4f, 0xfb, 0x39, 0x6b, 0xfd, 0xac, 0x21,
	0x96, 0xdd, 0xbf, 0x27, 0xd4, 0x7f, 0xae, 0xc2, 0xcb, 0xe0, 0xbc, 0x0c, 0x9b, 0x46, 0xcf, 0x30,
	0x6d, 0xf7, 0x81, 0xf6, 0x85, 0x0a, 0x2f, 0x82, 0x0d, 0xd9, 0xc4, 0x1b, 0xa3, 0x7d, 0xa9, 0xc2,
	0x2d, 0x70, 0xf5, 0x39, 0x5c, 0x6e, 0xd8, 0x57, 0x2a, 0x7c, 0x05, 0x6c, 0xc9, 0x14, 0x8c, 0x0c,
	0x8b, 0xec, 0x63, 0xdb, 0x3d, 0xc2, 0xfb, 0x5a, 0x85, 0x75, 0xb0, 0x2d, 0xf3, 0x76, 0x8c, 0x41,
	0xdb, 0x7d, 0x40, 0x4c, 0xd4, 0x6e, 0xf7, 0x65, 0xe6, 0x37, 0x2a, 0x3c, 0x3f, 0x9f, 0x1c, 0x36,
	0x3a, 0x42, 0xfd, 0x87, 0x05, 0x58, 0x01, 0x9b, 0x12, 0x3a, 0x17, 0xff, 0x51, 0x41, 0x2a, 0x37,
	0xb3, 0x08, 0xed, 0x1f, 0x17, 0xa4, 0x5e, 0xce, 0x61, 0x39, 0xd1, 0x27, 0xb2, 0x23, 0x6f, 0x2f,
	0xe9, 0x18, 0xf7, 0xb5, 0xdf, 0x0b, 0xf0, 0x12, 0x80, 0x47, 0x60, 0x11, 0xf1, 0x8f, 0x82, 0xd4,
	0x7b, 0xc9, 0x20, 0xc7, 0xfc, 0x53, 0xe6, 0xd8, 0x8e, 0x83, 0x30, 0xe9, 0x0f, 0x30, 0xee, 0x0e,
	0x1c, 0xcb, 0x76, 0x76, 0x45, 0x29, 0xbf, 0x9c, 0x6a, 0xfd, 0xa5, 0x80, 0x97, 0x1c, 0x9a, 0xfa,
	0x87, 0x2c, 0xbf, 0x4b, 0x3a, 0x34, 0xa4, 0x63, 0x16, 0xf0, 0x73, 0x88, 0xbf, 0xaa, 0xe0, 0x9b,
	0xa0, 0x24, 0xbd, 0x08, 0xe0, 0x39, 0xbe, 0x2b, 0xf7, 0x68, 0xec, 0x3d, 0xa5, 0x31, 0xb3, 0xad,
	0x6a, 0xe5, 0xb8, 0x47, 0x03, 0xa4, 0xa0, 0x3a, 0x98, 0x78, 0x34, 0x65, 0xcb, 0xee, 0x29, 0x58,
	0xfb, 0x97, 0x2b, 0x8c, 0x9f, 0x71, 0xd5, 0xad, 0x17, 0x5e, 0x72, 0xf0, 0x6d, 0xb0, 0x3a, 0x3f,
	0x57, 0xe0, 0x85, 0xc5, 0x73, 0x46, 0x84, 0xb9, 0xb8, 0xfc, 0xf8, 0xb9, 0xfb, 0xce, 0x7b, 0x6f,
	0x8d, 0xfd, 0xf4, 0xf1, 0xf4, 0x61, 0x63, 0x14, 0x05, 0xcd, 0x68, 0xc2, 0xc2, 0x51, 0x14, 0x7b,
	0x4d, 0x71, 0xf3, 0xdc, 0x0c, 0xe6, 0x8d, 0xb8, 0xc9, 0x9f, 0x6f, 0x8f, 0xe8, 0x88, 0x35, 0x0f,
	0x6f, 0x37, 0xc7, 0x51, 0xd3, 0x0b, 0xfc, 0x87, 0x45, 0xfe, 0x8c, 0xbc, 0xfd, 0x77, 0x00, 0x00,
	0x00, 0xff, 0xff, 0xbd, 0x20, 0xee, 0x31, 0x91, 0x0a, 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",
}
