// 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
)

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

//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{
	// 332 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0xbd, 0x6e, 0xf2, 0x30,
	0x18, 0x85, 0x09, 0x3f, 0xf9, 0xc0, 0xdf, 0x9f, 0x6b, 0xa1, 0xaa, 0xea, 0xd2, 0xa1, 0x1b, 0x12,
	0x64, 0x60, 0xaa, 0x3a, 0xa0, 0x90, 0x98, 0x28, 0x4a, 0xfa, 0x1a, 0x39, 0x0e, 0x48, 0x5d, 0xa2,
	0x90, 0xb8, 0x69, 0xa4, 0x3a, 0x46, 0x10, 0xb8, 0xc2, 0x5e, 0x58, 0x15, 0x28, 0x43, 0xdb, 0xed,
	0xf8, 0x39, 0x3a, 0x8f, 0x87, 0x17, 0x5d, 0xe5, 0xaa, 0xb4, 0x32, 0xad, 0x94, 0xae, 0xf6, 0x93,
	0xed, 0x4e, 0xd7, 0x9a, 0x74, 0x72, 0x55, 0x8e, 0x66, 0xc8, 0x8c, 0xea, 0xb4, 0x3e, 0xec, 0xc9,
	0x10, 0xe1, 0x18, 0x5c, 0xba, 0xf0, 0x81, 0xba, 0x49, 0x24, 0x6c, 0x11, 0x47, 0xb8, 0x45, 0xfe,
	0xa2, 0x01, 0x0b, 0x2e, 0x4f, 0x83, 0x60, 0xf4, 0x87, 0x72, 0xce, 0xf8, 0x85, 0xb4, 0x47, 0xef,
	0x06, 0x32, 0xb9, 0x4c, 0xf7, 0xba, 0xfa, 0x6a, 0xe0, 0xd4, 0x8e, 0x18, 0xe0, 0x16, 0x21, 0xe8,
	0x5f, 0x0c, 0x01, 0xb0, 0x35, 0x24, 0x2e, 0x5d, 0xf9, 0x0e, 0xc5, 0x46, 0xc3, 0x7c, 0x10, 0x94,
	0x83, 0x1d, 0x26, 0x27, 0x1f, 0x6e, 0x37, 0xea, 0x35, 0x67, 0xe0, 0x25, 0x4f, 0x54, 0x70, 0xdf,
	0xc1, 0x1d, 0xf2, 0x1f, 0xfd, 0x3e, 0x13, 0xba, 0xa2, 0x20, 0x70, 0x97, 0xdc, 0xa2, 0xeb, 0x90,
	0x79, 0x9e, 0xdf, 0x20, 0x70, 0x97, 0xcc, 0x07, 0xf1, 0x39, 0xef, 0x91, 0x7b, 0x74, 0xf7, 0xa3,
	0x5b, 0x72, 0x26, 0x98, 0xc3, 0x2e, 0x7f, 0x98, 0xe4, 0x06, 0x0d, 0x03, 0x7b, 0x11, 0xd8, 0xdf,
	0xe7, 0xbf, 0x46, 0x33, 0xd4, 0x0f, 0x75, 0x11, 0xca, 0xa3, 0x7c, 0x23, 0x03, 0xd4, 0x13, 0xdc,
	0x76, 0x28, 0x6e, 0x35, 0xd1, 0xa5, 0xf3, 0xd8, 0xc3, 0x06, 0xe9, 0xa3, 0xae, 0x0f, 0x0b, 0x86,
	0xdb, 0x4d, 0x5a, 0xdb, 0x1c, 0x70, 0xa7, 0xa9, 0xcf, 0x82, 0xee, 0xfc, 0xf1, 0xf9, 0xa1, 0x28,
	0xeb, 0xd7, 0xc3, 0x66, 0x92, 0x69, 0x65, 0xe9, 0xad, 0xac, 0x32, 0xbd, 0xcb, 0xad, 0x5c, 0x1e,
	0xcb, 0x4c, 0x8e, 0x55, 0x5a, 0xa5, 0x85, 0x54, 0xb2, 0xaa, 0xc7, 0x65, 0x55, 0xcb, 0xdd, 0x4b,
	0x9a, 0x49, 0xeb, 0x38, 0xb5, 0x0a, 0x6d, 0xe5, 0xaa, 0xdc, 0x98, 0xa7, 0x8b, 0x4c, 0x3f, 0x02,
	0x00, 0x00, 0xff, 0xff, 0xab, 0xaf, 0x4b, 0x69, 0xa6, 0x01, 0x00, 0x00,
}
