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

package voltha

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
)

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

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

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=voltha.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("voltha.DeviceTransientState_Types", DeviceTransientState_Types_name, DeviceTransientState_Types_value)
	proto.RegisterType((*DeviceTransientState)(nil), "voltha.DeviceTransientState")
}

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

var fileDescriptor_39634f15fb8a505e = []byte{
	// 264 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x4d, 0x4b, 0xc4, 0x30,
	0x10, 0x86, 0xad, 0xfb, 0xa1, 0x0c, 0x58, 0x63, 0x54, 0x58, 0x2f, 0x22, 0x3d, 0x79, 0x31, 0x05,
	0xf5, 0x0f, 0x54, 0x3b, 0x95, 0xc5, 0xb5, 0x2d, 0x6d, 0x2e, 0x7a, 0x09, 0xdd, 0x1a, 0xba, 0x05,
	0x6d, 0x4a, 0x1a, 0x0b, 0xde, 0xfc, 0xb5, 0xfe, 0x0e, 0xb1, 0x1f, 0x82, 0xb0, 0xb7, 0x99, 0xe7,
	0x99, 0xf7, 0x30, 0x2f, 0x2c, 0x5a, 0xf5, 0x66, 0x36, 0x99, 0xa8, 0xb5, 0x32, 0xaa, 0x71, 0x73,
	0xa5, 0x25, 0xeb, 0x66, 0x3a, 0xef, 0x8d, 0xf3, 0x6d, 0xc1, 0x89, 0x2f, 0xdb, 0x32, 0x97, 0x5c,
	0x67, 0x55, 0x53, 0xca, 0xca, 0xa4, 0x26, 0x33, 0x92, 0x3e, 0xc2, 0xa1, 0x19, 0x89, 0x68, 0x7e,
	0xd1, 0xc2, 0xba, 0xb0, 0x2e, 0xed, 0x6b, 0x87, 0xf5, 0x51, 0xb6, 0x2d, 0xc6, 0xf8, 0x67, 0x2d,
	0x9b, 0xc4, 0x36, 0xff, 0xa8, 0xf3, 0x65, 0xc1, 0xac, 0x33, 0x74, 0x1f, 0xa6, 0x61, 0x14, 0x22,
	0xd9, 0xa1, 0x7b, 0x30, 0xf1, 0xc2, 0x67, 0x62, 0x51, 0x0a, 0x76, 0x10, 0x25, 0xf7, 0x28, 0x7c,
	0x5c, 0x21, 0x5f, 0x86, 0x0f, 0x64, 0x97, 0x9e, 0xc1, 0xe9, 0xb8, 0x89, 0x20, 0x89, 0x9e, 0x84,
	0xe7, 0x7b, 0x31, 0xc7, 0x84, 0x4c, 0xa8, 0x03, 0xe7, 0x7f, 0x2a, 0x8e, 0x52, 0x3e, 0x2a, 0x91,
	0x60, 0x1a, 0x47, 0x61, 0x8a, 0x64, 0x4a, 0x8f, 0xe0, 0xa0, 0xbb, 0x41, 0x11, 0x78, 0xcb, 0x15,
	0xfa, 0x64, 0x76, 0x87, 0x70, 0xac, 0x74, 0xc1, 0x54, 0x2d, 0xab, 0x5c, 0xe9, 0xd7, 0xe1, 0x89,
	0x17, 0x56, 0x94, 0x66, 0xf3, 0xb1, 0x66, 0xb9, 0x7a, 0x77, 0x47, 0xe7, 0xf6, 0xee, 0x6a, 0x68,
	0xad, 0xbd, 0x75, 0x0b, 0x35, 0xb0, 0xf5, 0xbc, 0x83, 0x37, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff,
	0xe3, 0x06, 0xbc, 0xa1, 0x5a, 0x01, 0x00, 0x00,
}
