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

package common // import "github.com/opencord/voltha-protos/go/common"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"

// 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.ProtoPackageIsVersion2 // 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_meta_7d0d80d5e7f91838, []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_meta_7d0d80d5e7f91838, []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 (dst *ChildNode) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ChildNode.Merge(dst, 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,json=childNode",
	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.RegisterType((*ChildNode)(nil), "voltha.ChildNode")
	proto.RegisterEnum("voltha.Access", Access_name, Access_value)
	proto.RegisterExtension(E_ChildNode)
	proto.RegisterExtension(E_Access)
}

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

var fileDescriptor_meta_7d0d80d5e7f91838 = []byte{
	// 271 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x41, 0x4b, 0x84, 0x40,
	0x18, 0x86, 0xb3, 0x05, 0xc1, 0x2f, 0x5a, 0xcc, 0x93, 0x04, 0x0b, 0xd2, 0x69, 0x29, 0x76, 0x06,
	0xec, 0xb6, 0xb7, 0x6d, 0xdb, 0xad, 0x85, 0x4d, 0x41, 0xba, 0xd4, 0x45, 0x74, 0x9c, 0x74, 0x48,
	0xfd, 0xc4, 0x99, 0x0d, 0xfa, 0xa9, 0x5d, 0xfa, 0x05, 0xf5, 0x1f, 0x42, 0x47, 0xbb, 0xee, 0xed,
	0x9d, 0x77, 0xde, 0x79, 0x78, 0x18, 0x70, 0x3f, 0xb0, 0x54, 0x45, 0x12, 0x37, 0x2d, 0x2a, 0x94,
	0xb4, 0xe2, 0x2a, 0x21, 0x7d, 0x76, 0x4c, 0x7d, 0x73, 0xe9, 0xe5, 0x88, 0x79, 0xc9, 0x69, 0xdf,
	0xa6, 0x87, 0x37, 0x9a, 0x71, 0xc9, 0x5a, 0xd1, 0x28, 0x6c, 0xf5, 0xf2, 0x6a, 0x06, 0xd6, 0xba,
	0x10, 0x65, 0x16, 0x60, 0xc6, 0x1d, 0x1b, 0x26, 0xef, 0xfc, 0xd3, 0x35, 0x3c, 0x63, 0x6e, 0x45,
	0x5d, 0xbc, 0xf6, 0xc1, 0x5c, 0x31, 0xc6, 0xa5, 0x74, 0x00, 0xcc, 0x75, 0x18, 0x6c, 0x77, 0x0f,
	0xf6, 0x89, 0x73, 0x0e, 0x56, 0xb4, 0x59, 0xdd, 0xc7, 0x61, 0xb0, 0x7f, 0xb1, 0x8d, 0xe1, 0xb8,
	0x8f, 0x9f, 0x77, 0x4f, 0x1b, 0xfb, 0x74, 0x19, 0x01, 0xb0, 0x0e, 0x19, 0xd7, 0x1d, 0x73, 0x46,
	0xb4, 0x03, 0x19, 0x1d, 0xc8, 0x56, 0xf0, 0x32, 0x0b, 0x1b, 0x25, 0xb0, 0x96, 0xee, 0xcf, 0xf7,
	0xd7, 0xc4, 0x33, 0xe6, 0x67, 0xfe, 0x05, 0xd1, 0xce, 0xe4, 0x5f, 0x27, 0xb2, 0xd8, 0x18, 0x97,
	0x8f, 0x60, 0x26, 0xda, 0xe3, 0x08, 0xef, 0x57, 0xf3, 0xa6, 0xfe, 0x74, 0xe4, 0x69, 0xff, 0x68,
	0x78, 0x7f, 0xb7, 0x78, 0xbd, 0xc9, 0x85, 0x2a, 0x0e, 0x29, 0x61, 0x58, 0x51, 0x6c, 0x78, 0xcd,
	0xb0, 0xcd, 0xa8, 0x1e, 0x2f, 0x86, 0xaf, 0xcc, 0x91, 0x32, 0xac, 0x2a, 0xac, 0x53, 0xb3, 0x6f,
	0x6e, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x90, 0x94, 0xed, 0x6c, 0x01, 0x00, 0x00,
}
