// 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        Status = 1
	Status_ERROR_STATUS     Status = 2
)

var Status_name = map[int32]string{
	0: "UNDEFINED_STATUS",
	1: "OK_STATUS",
	2: "ERROR_STATUS",
}

var Status_value = map[string]int32{
	"UNDEFINED_STATUS": 0,
	"OK_STATUS":        1,
	"ERROR_STATUS":     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
	Reason_UNKNOWN_LOG_ENTITY              Reason = 8
)

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",
	8: "UNKNOWN_LOG_ENTITY",
}

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,
	"UNKNOWN_LOG_ENTITY":              8,
}

func (x Reason) String() string {
	return proto.EnumName(Reason_name, int32(x))
}

func (Reason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_74aedf0dda1205d8, []int{1}
}

//Log Level
type LogLevel int32

const (
	LogLevel_TRACE LogLevel = 0
	LogLevel_DEBUG LogLevel = 1
	LogLevel_INFO  LogLevel = 2
	LogLevel_WARN  LogLevel = 3
	LogLevel_ERROR LogLevel = 4
)

var LogLevel_name = map[int32]string{
	0: "TRACE",
	1: "DEBUG",
	2: "INFO",
	3: "WARN",
	4: "ERROR",
}

var LogLevel_value = map[string]int32{
	"TRACE": 0,
	"DEBUG": 1,
	"INFO":  2,
	"WARN":  3,
	"ERROR": 4,
}

func (x LogLevel) String() string {
	return proto.EnumName(LogLevel_name, int32(x))
}

func (LogLevel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_74aedf0dda1205d8, []int{2}
}

func init() {
	proto.RegisterEnum("dmi.Status", Status_name, Status_value)
	proto.RegisterEnum("dmi.Reason", Reason_name, Reason_value)
	proto.RegisterEnum("dmi.LogLevel", LogLevel_name, LogLevel_value)
}

func init() { proto.RegisterFile("dmi/commons.proto", fileDescriptor_74aedf0dda1205d8) }

var fileDescriptor_74aedf0dda1205d8 = []byte{
	// 344 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0x4d, 0x6f, 0xba, 0x30,
	0x00, 0xc6, 0xc5, 0x17, 0xfe, 0xda, 0xff, 0x5b, 0xd7, 0x18, 0xb3, 0xec, 0xb2, 0xc3, 0x6e, 0x26,
	0xca, 0xc1, 0xd3, 0xb2, 0x83, 0x41, 0xa8, 0xa4, 0x81, 0xb5, 0xa6, 0x14, 0xcd, 0x76, 0x21, 0x08,
	0x1d, 0x23, 0x59, 0xa9, 0x51, 0xf4, 0xd3, 0xee, 0xc3, 0x2c, 0xe8, 0x38, 0x6c, 0xbb, 0x3d, 0xfd,
	0x3d, 0x79, 0x7e, 0x6d, 0x52, 0x70, 0x95, 0xa9, 0xc2, 0x4a, 0xb5, 0x52, 0xba, 0x3c, 0x4c, 0x77,
	0x7b, 0x5d, 0x69, 0xd4, 0xc9, 0x54, 0x31, 0x9e, 0x03, 0x33, 0xac, 0x92, 0xea, 0x78, 0x40, 0x43,
	0x00, 0x23, 0xea, 0xe2, 0x25, 0xa1, 0xd8, 0x8d, 0x43, 0x61, 0x8b, 0x28, 0x84, 0x2d, 0xf4, 0x17,
	0x0c, 0x98, 0xdf, 0x1c, 0x0d, 0x04, 0xc1, 0x1f, 0xcc, 0x39, 0xe3, 0x0d, 0x69, 0x8f, 0xdf, 0x0d,
	0x60, 0x72, 0x99, 0x1c, 0x74, 0xf9, 0xd5, 0xc0, 0xb1, 0x1d, 0x32, 0x0a, 0x5b, 0x08, 0x81, 0x7f,
	0x11, 0xf5, 0x29, 0xdb, 0xd0, 0xd8, 0xc5, 0x6b, 0xe2, 0x60, 0x68, 0xd4, 0x8c, 0x50, 0x81, 0x39,
	0xb5, 0x83, 0xf8, 0xec, 0x83, 0xed, 0x5a, 0xbd, 0xe1, 0x8c, 0x7a, 0xf1, 0x23, 0x16, 0x9c, 0x38,
	0xb0, 0x83, 0xfe, 0x83, 0xdf, 0x17, 0x82, 0xd7, 0x98, 0x0a, 0xd8, 0x45, 0x37, 0x60, 0x14, 0x30,
	0xcf, 0x23, 0x35, 0xa2, 0xee, 0x8a, 0x11, 0x2a, 0x3e, 0xe7, 0x3d, 0x74, 0x07, 0x6e, 0x7f, 0x74,
	0x2b, 0xce, 0x04, 0x73, 0x58, 0x73, 0x87, 0x89, 0xae, 0xc1, 0xd0, 0xb7, 0x97, 0xbe, 0xfd, 0x7d,
	0xfe, 0x0b, 0x8d, 0x00, 0x6a, 0x5e, 0x19, 0xb0, 0x5a, 0x21, 0x88, 0x78, 0x82, 0xfd, 0xf1, 0x1c,
	0xf4, 0x03, 0x9d, 0x07, 0xf2, 0x24, 0xdf, 0xd0, 0x00, 0xf4, 0x04, 0xb7, 0x1d, 0x0c, 0x5b, 0x75,
	0x74, 0xf1, 0x22, 0xf2, 0xa0, 0x81, 0xfa, 0xa0, 0x4b, 0xe8, 0x92, 0xc1, 0x76, 0x9d, 0x36, 0x36,
	0xa7, 0xb0, 0x53, 0xd7, 0x17, 0x71, 0x77, 0xf1, 0xf0, 0x7c, 0x9f, 0x17, 0xd5, 0xeb, 0x71, 0x3b,
	0x4d, 0xb5, 0xb2, 0xf4, 0x4e, 0x96, 0xa9, 0xde, 0x67, 0x56, 0x26, 0x4f, 0x45, 0x2a, 0x27, 0x2a,
	0x29, 0x93, 0x5c, 0x2a, 0x59, 0x56, 0x93, 0xa2, 0xac, 0xe4, 0xfe, 0x25, 0x49, 0xa5, 0x75, 0x9a,
	0x59, 0xb9, 0xb6, 0x32, 0x55, 0x6c, 0xcd, 0xf3, 0x4f, 0xcd, 0x3e, 0x02, 0x00, 0x00, 0xff, 0xff,
	0x79, 0x7a, 0xa9, 0x6f, 0xbe, 0x01, 0x00, 0x00,
}
