// 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
	Reason_ERROR_FETCHING_CONFIG           Reason = 9
	Reason_INVALID_CONFIG                  Reason = 10
)

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",
	9:  "ERROR_FETCHING_CONFIG",
	10: "INVALID_CONFIG",
}

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,
	"ERROR_FETCHING_CONFIG":           9,
	"INVALID_CONFIG":                  10,
}

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{
	// 373 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0xcf, 0x6f, 0xd3, 0x30,
	0x14, 0xc7, 0xdb, 0xb4, 0x0b, 0xed, 0xe3, 0x97, 0xb1, 0xc6, 0x04, 0x5c, 0x38, 0x70, 0xab, 0xb4,
	0xe5, 0xb0, 0x13, 0xe2, 0x30, 0x79, 0x89, 0x13, 0xac, 0x04, 0x7b, 0x72, 0x9c, 0x56, 0x70, 0x89,
	0xb2, 0xc4, 0x84, 0x48, 0x38, 0x9e, 0xda, 0xac, 0xff, 0x04, 0xff, 0x34, 0x72, 0x43, 0x0e, 0xc0,
	0xed, 0xf9, 0xf3, 0xf4, 0x3e, 0x7e, 0x5f, 0x3d, 0x78, 0xd5, 0x98, 0x2e, 0xa8, 0xad, 0x31, 0xb6,
	0x3f, 0x5c, 0x3d, 0xec, 0xed, 0x60, 0xf1, 0xa2, 0x31, 0xdd, 0xe6, 0x06, 0xfc, 0x7c, 0xa8, 0x86,
	0xc7, 0x03, 0x3e, 0x07, 0x54, 0xf0, 0x88, 0xc6, 0x8c, 0xd3, 0xa8, 0xcc, 0x15, 0x51, 0x45, 0x8e,
	0x66, 0xf8, 0x39, 0xac, 0x45, 0x3a, 0x3d, 0xe7, 0x18, 0xc1, 0x33, 0x2a, 0xa5, 0x90, 0x13, 0xf1,
	0x36, 0xbf, 0x3c, 0xf0, 0xa5, 0xae, 0x0e, 0xb6, 0xff, 0xdb, 0x20, 0x29, 0xc9, 0x05, 0x47, 0x33,
	0x8c, 0xe1, 0x45, 0xc1, 0x53, 0x2e, 0x76, 0xbc, 0x8c, 0xe8, 0x96, 0x85, 0x14, 0xcd, 0x1d, 0x63,
	0x5c, 0x51, 0xc9, 0x49, 0x56, 0x9e, 0x7c, 0xc8, 0x73, 0xea, 0x9d, 0x14, 0x3c, 0x29, 0xbf, 0x50,
	0x25, 0x59, 0x88, 0x16, 0xf8, 0x25, 0x3c, 0x1d, 0x09, 0xdd, 0x52, 0xae, 0xd0, 0x12, 0xbf, 0x83,
	0x8b, 0x4c, 0x24, 0x09, 0x73, 0x88, 0x47, 0x77, 0x82, 0x71, 0xf5, 0x67, 0xfc, 0x0c, 0x7f, 0x80,
	0xf7, 0xff, 0xf5, 0xee, 0xa4, 0x50, 0x22, 0x14, 0xd3, 0x1f, 0x3e, 0x7e, 0x03, 0xe7, 0x29, 0x89,
	0x53, 0xf2, 0xef, 0xf8, 0x13, 0x7c, 0x01, 0x78, 0xda, 0x32, 0x13, 0x4e, 0xa1, 0x98, 0xfa, 0x8a,
	0x56, 0xf8, 0x2d, 0xbc, 0x1e, 0x03, 0xc7, 0x54, 0x85, 0x9f, 0x9d, 0x3d, 0x14, 0x3c, 0x66, 0x09,
	0x5a, 0x8f, 0x21, 0xb6, 0x24, 0x63, 0xd1, 0xc4, 0x60, 0x73, 0x03, 0xab, 0xcc, 0xb6, 0x99, 0x3e,
	0xea, 0x9f, 0x78, 0x0d, 0x67, 0x4a, 0x92, 0x90, 0xa2, 0x99, 0x2b, 0x23, 0x7a, 0x5b, 0x24, 0x68,
	0x8e, 0x57, 0xb0, 0x64, 0x3c, 0x16, 0xc8, 0x73, 0xd5, 0x8e, 0x48, 0x8e, 0x16, 0xae, 0x3d, 0xee,
	0xb1, 0xbc, 0xfd, 0xf4, 0xed, 0x63, 0xdb, 0x0d, 0x3f, 0x1e, 0xef, 0xaf, 0x6a, 0x6b, 0x02, 0xfb,
	0xa0, 0xfb, 0xda, 0xee, 0x9b, 0xa0, 0xd1, 0xc7, 0xae, 0xd6, 0x97, 0xa6, 0xea, 0xab, 0x56, 0x1b,
	0xdd, 0x0f, 0x97, 0x5d, 0x3f, 0xe8, 0xfd, 0xf7, 0xaa, 0xd6, 0xc1, 0xf1, 0x3a, 0x68, 0x6d, 0xd0,
	0x98, 0xee, 0xde, 0x3f, 0x1d, 0xf6, 0xfa, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc8, 0xb6, 0xed,
	0xcf, 0xed, 0x01, 0x00, 0x00,
}
