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

package common

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
	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 Access int32

const (
	// read-write, stored attribute
	Access_CONFIG Access = 0
	// read-only field, stored with the model, covered by its hash
	Access_READ_ONLY Access = 1
	// A read-only attribute that is not stored in the model, not covered
	// by its hash, its value is filled real-time upon each request.
	Access_REAL_TIME Access = 2
)

var Access_name = map[int32]string{
	0: "CONFIG",
	1: "READ_ONLY",
	2: "REAL_TIME",
}

var Access_value = map[string]int32{
	"CONFIG":    0,
	"READ_ONLY": 1,
	"REAL_TIME": 2,
}

func (x Access) String() string {
	return proto.EnumName(Access_name, int32(x))
}

func (Access) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_96b320e8a67781f3, []int{0}
}

type ChildNode struct {
	Key                  string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChildNode proto.InternalMessageInfo

func (m *ChildNode) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

var E_ChildNode = &proto.ExtensionDesc{
	ExtendedType:  (*descriptor.FieldOptions)(nil),
	ExtensionType: (*ChildNode)(nil),
	Field:         7761772,
	Name:          "voltha.child_node",
	Tag:           "bytes,7761772,opt,name=child_node",
	Filename:      "voltha_protos/meta.proto",
}

var E_Access = &proto.ExtensionDesc{
	ExtendedType:  (*descriptor.FieldOptions)(nil),
	ExtensionType: (*Access)(nil),
	Field:         7761773,
	Name:          "voltha.access",
	Tag:           "varint,7761773,opt,name=access,enum=voltha.Access",
	Filename:      "voltha_protos/meta.proto",
}

func init() {
	proto.RegisterEnum("voltha.Access", Access_name, Access_value)
	proto.RegisterType((*ChildNode)(nil), "voltha.ChildNode")
	proto.RegisterExtension(E_ChildNode)
	proto.RegisterExtension(E_Access)
}

func init() { proto.RegisterFile("voltha_protos/meta.proto", fileDescriptor_96b320e8a67781f3) }

var fileDescriptor_96b320e8a67781f3 = []byte{
	// 281 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x41, 0x4b, 0x84, 0x40,
	0x14, 0xc7, 0xb3, 0x05, 0xc1, 0x17, 0x2d, 0xe6, 0x69, 0x59, 0x58, 0x90, 0x4e, 0x4b, 0xd0, 0x0c,
	0x58, 0xa7, 0xbd, 0x6d, 0xdb, 0x6e, 0x2d, 0x98, 0x82, 0x74, 0xa9, 0x8b, 0xe8, 0x38, 0xa9, 0xa4,
	0x3e, 0x71, 0x66, 0x17, 0xfa, 0xa8, 0x5d, 0xfa, 0x04, 0xf5, 0x1d, 0x42, 0xc7, 0xe9, 0xda, 0xed,
	0xff, 0xde, 0xfc, 0xe7, 0xc7, 0x8f, 0x07, 0xb3, 0x23, 0x56, 0xb2, 0x48, 0xe2, 0xb6, 0x43, 0x89,
	0x82, 0xd6, 0x5c, 0x26, 0x64, 0xc8, 0x8e, 0xa9, 0x5e, 0xe6, 0x6e, 0x8e, 0x98, 0x57, 0x9c, 0x0e,
	0xdb, 0xf4, 0xf0, 0x46, 0x33, 0x2e, 0x58, 0x57, 0xb6, 0x12, 0x3b, 0xd5, 0xbc, 0x5c, 0x80, 0xb5,
	0x29, 0xca, 0x2a, 0x0b, 0x30, 0xe3, 0x8e, 0x0d, 0x93, 0x77, 0xfe, 0x31, 0x33, 0x5c, 0x63, 0x69,
	0x45, 0x7d, 0xbc, 0xf2, 0xc0, 0x5c, 0x33, 0xc6, 0x85, 0x70, 0x00, 0xcc, 0x4d, 0x18, 0xec, 0xf6,
	0x0f, 0xf6, 0x89, 0x73, 0x0e, 0x56, 0xb4, 0x5d, 0xdf, 0xc7, 0x61, 0xe0, 0xbf, 0xd8, 0xc6, 0x38,
	0xfa, 0xf1, 0xf3, 0xfe, 0x69, 0x6b, 0x9f, 0xae, 0x22, 0x00, 0xd6, 0x23, 0xe3, 0xa6, 0x67, 0x2e,
	0x88, 0x72, 0x20, 0xda, 0x81, 0xec, 0x4a, 0x5e, 0x65, 0x61, 0x2b, 0x4b, 0x6c, 0xc4, 0xec, 0xfb,
	0xeb, 0x73, 0xe2, 0x1a, 0xcb, 0x33, 0xef, 0x82, 0x28, 0x67, 0xf2, 0xa7, 0x13, 0x59, 0x4c, 0xc7,
	0xd5, 0x23, 0x98, 0x89, 0xf2, 0xf8, 0x87, 0xf7, 0xa3, 0x78, 0x53, 0x6f, 0xaa, 0x79, 0xca, 0x3f,
	0x1a, 0xff, 0xdf, 0xf9, 0x30, 0xc7, 0x2e, 0x27, 0xd8, 0xf2, 0x86, 0x61, 0x97, 0xe9, 0x16, 0xc3,
	0xba, 0xc6, 0xe6, 0x95, 0xe4, 0xa5, 0x2c, 0x0e, 0x69, 0x3f, 0x52, 0x5d, 0xa1, 0xaa, 0x72, 0x3d,
	0x9e, 0xf9, 0x78, 0x4b, 0x73, 0xa4, 0xaa, 0x9f, 0x9a, 0xc3, 0xf2, 0xe6, 0x37, 0x00, 0x00, 0xff,
	0xff, 0x0e, 0xea, 0x69, 0xf5, 0x8b, 0x01, 0x00, 0x00,
}
