// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/core.proto

package core

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

// Transient State for devices
type DeviceTransientState_Types int32

const (
	// The transient state of the device is not set
	DeviceTransientState_NONE DeviceTransientState_Types = 0
	// The state of the device in core is any state, i.e DELETING, DELETED, DELETE_FAILED, NONE.
	// This state is only used for transitions.
	DeviceTransientState_ANY DeviceTransientState_Types = 1
	// The device is in FORCE_DELETING state
	DeviceTransientState_FORCE_DELETING DeviceTransientState_Types = 2
	// The device is getting deleted from adapter state
	DeviceTransientState_DELETING_FROM_ADAPTER DeviceTransientState_Types = 3
	// The device is deleted from adapter and is getting deleted in core.
	DeviceTransientState_DELETING_POST_ADAPTER_RESPONSE DeviceTransientState_Types = 4
	// State to represent that the device deletion is failed
	DeviceTransientState_DELETE_FAILED DeviceTransientState_Types = 5
	// State to represent that reconcile is in progress
	DeviceTransientState_RECONCILE_IN_PROGRESS DeviceTransientState_Types = 6
)

var DeviceTransientState_Types_name = map[int32]string{
	0: "NONE",
	1: "ANY",
	2: "FORCE_DELETING",
	3: "DELETING_FROM_ADAPTER",
	4: "DELETING_POST_ADAPTER_RESPONSE",
	5: "DELETE_FAILED",
	6: "RECONCILE_IN_PROGRESS",
}

var DeviceTransientState_Types_value = map[string]int32{
	"NONE":                           0,
	"ANY":                            1,
	"FORCE_DELETING":                 2,
	"DELETING_FROM_ADAPTER":          3,
	"DELETING_POST_ADAPTER_RESPONSE": 4,
	"DELETE_FAILED":                  5,
	"RECONCILE_IN_PROGRESS":          6,
}

func (x DeviceTransientState_Types) String() string {
	return proto.EnumName(DeviceTransientState_Types_name, int32(x))
}

func (DeviceTransientState_Types) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_39634f15fb8a505e, []int{0, 0}
}

type DeviceTransientState struct {
	TransientState       DeviceTransientState_Types `protobuf:"varint,1,opt,name=transient_state,json=transientState,proto3,enum=core.DeviceTransientState_Types" json:"transient_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *DeviceTransientState) Reset()         { *m = DeviceTransientState{} }
func (m *DeviceTransientState) String() string { return proto.CompactTextString(m) }
func (*DeviceTransientState) ProtoMessage()    {}
func (*DeviceTransientState) Descriptor() ([]byte, []int) {
	return fileDescriptor_39634f15fb8a505e, []int{0}
}

func (m *DeviceTransientState) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeviceTransientState.Unmarshal(m, b)
}
func (m *DeviceTransientState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeviceTransientState.Marshal(b, m, deterministic)
}
func (m *DeviceTransientState) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeviceTransientState.Merge(m, src)
}
func (m *DeviceTransientState) XXX_Size() int {
	return xxx_messageInfo_DeviceTransientState.Size(m)
}
func (m *DeviceTransientState) XXX_DiscardUnknown() {
	xxx_messageInfo_DeviceTransientState.DiscardUnknown(m)
}

var xxx_messageInfo_DeviceTransientState proto.InternalMessageInfo

func (m *DeviceTransientState) GetTransientState() DeviceTransientState_Types {
	if m != nil {
		return m.TransientState
	}
	return DeviceTransientState_NONE
}

func init() {
	proto.RegisterEnum("core.DeviceTransientState_Types", DeviceTransientState_Types_name, DeviceTransientState_Types_value)
	proto.RegisterType((*DeviceTransientState)(nil), "core.DeviceTransientState")
}

func init() { proto.RegisterFile("voltha_protos/core.proto", fileDescriptor_39634f15fb8a505e) }

var fileDescriptor_39634f15fb8a505e = []byte{
	// 286 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0xdf, 0x4a, 0xc3, 0x30,
	0x18, 0xc5, 0xad, 0xfb, 0xa3, 0x04, 0x9c, 0x31, 0x28, 0xcc, 0x1b, 0x19, 0xbb, 0xf2, 0x42, 0x53,
	0x50, 0x7c, 0x80, 0xba, 0x7e, 0x9b, 0x85, 0x99, 0x94, 0xa4, 0x37, 0x7a, 0x13, 0xba, 0x1a, 0xba,
	0x82, 0x36, 0xa5, 0x8d, 0x05, 0x9f, 0xc5, 0x87, 0x55, 0x9a, 0x59, 0x41, 0xf0, 0xee, 0xe4, 0x77,
	0x4e, 0x0e, 0x7c, 0x07, 0x4d, 0x5b, 0xf3, 0x6a, 0xb7, 0xa9, 0xaa, 0x6a, 0x63, 0x4d, 0xe3, 0x67,
	0xa6, 0xd6, 0xd4, 0x69, 0x32, 0xec, 0xf4, 0xfc, 0xcb, 0x43, 0xa7, 0xa1, 0x6e, 0x8b, 0x4c, 0x27,
	0x75, 0x5a, 0x36, 0x85, 0x2e, 0xad, 0xb4, 0xa9, 0xd5, 0x24, 0x42, 0xc7, 0xb6, 0x27, 0xaa, 0xe9,
	0xd0, 0xd4, 0x9b, 0x79, 0x97, 0x93, 0x9b, 0x19, 0x75, 0x25, 0xff, 0x7d, 0xa2, 0xc9, 0x47, 0xa5,
	0x1b, 0x31, 0xb1, 0x7f, 0xe8, 0xfc, 0xd3, 0x43, 0x23, 0xe7, 0x90, 0x43, 0x34, 0x64, 0x9c, 0x01,
	0xde, 0x23, 0x07, 0x68, 0x10, 0xb0, 0x27, 0xec, 0x11, 0x82, 0x26, 0x4b, 0x2e, 0x16, 0xa0, 0x42,
	0x58, 0x43, 0x12, 0xb1, 0x15, 0xde, 0x27, 0xe7, 0xe8, 0xac, 0x7f, 0xa9, 0xa5, 0xe0, 0x8f, 0x2a,
	0x08, 0x83, 0x38, 0x01, 0x81, 0x07, 0x64, 0x8e, 0x2e, 0x7e, 0xad, 0x98, 0xcb, 0xa4, 0xb7, 0x94,
	0x00, 0x19, 0x73, 0x26, 0x01, 0x0f, 0xc9, 0x09, 0x3a, 0x72, 0x19, 0x50, 0xcb, 0x20, 0x5a, 0x43,
	0x88, 0x47, 0x5d, 0xa3, 0x80, 0x05, 0x67, 0x8b, 0x68, 0x0d, 0x2a, 0x62, 0x2a, 0x16, 0x7c, 0x25,
	0x40, 0x4a, 0x3c, 0xbe, 0x7f, 0x40, 0x53, 0x53, 0xe7, 0xd4, 0x54, 0xba, 0xcc, 0x4c, 0xfd, 0x42,
	0x77, 0x83, 0xb9, 0x23, 0x9f, 0xaf, 0xf2, 0xc2, 0x6e, 0xdf, 0x37, 0x34, 0x33, 0x6f, 0x7e, 0x1f,
	0xf0, 0x77, 0x81, 0xeb, 0x9f, 0x45, 0xdb, 0x3b, 0x3f, 0x37, 0x6e, 0xd7, 0xcd, 0xd8, 0xa1, 0xdb,
	0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x32, 0x24, 0x57, 0x74, 0x01, 0x00, 0x00,
}
