# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: chromite/api/build_api.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='chromite/api/build_api.proto',
  package='',
  syntax='proto2',
  serialized_options=_b('Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api'),
  serialized_pb=_b('\n\x1c\x63hromite/api/build_api.proto\x1a google/protobuf/descriptor.proto\"Y\n\x16\x42uildApiServiceOptions\x12\x0e\n\x06module\x18\x01 \x02(\t\x12/\n\x15service_chroot_assert\x18\x02 \x01(\x0e\x32\x10.ChrootAssertion\"d\n\x15\x42uildApiMethodOptions\x12\x1b\n\x13implementation_name\x18\x01 \x01(\t\x12.\n\x14method_chroot_assert\x18\x02 \x01(\x0e\x32\x10.ChrootAssertion*<\n\x0f\x43hrootAssertion\x12\x10\n\x0cNO_ASSERTION\x10\x00\x12\n\n\x06INSIDE\x10\x01\x12\x0b\n\x07OUTSIDE\x10\x02:S\n\x0fservice_options\x12\x1f.google.protobuf.ServiceOptions\x18\xd8\xad\x03 \x01(\x0b\x32\x17.BuildApiServiceOptions:P\n\x0emethod_options\x12\x1e.google.protobuf.MethodOptions\x18\xd8\xad\x03 \x01(\x0b\x32\x16.BuildApiMethodOptionsB8Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api')
  ,
  dependencies=[google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,])

_CHROOTASSERTION = _descriptor.EnumDescriptor(
  name='ChrootAssertion',
  full_name='ChrootAssertion',
  filename=None,
  file=DESCRIPTOR,
  values=[
    _descriptor.EnumValueDescriptor(
      name='NO_ASSERTION', index=0, number=0,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='INSIDE', index=1, number=1,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='OUTSIDE', index=2, number=2,
      serialized_options=None,
      type=None),
  ],
  containing_type=None,
  serialized_options=None,
  serialized_start=259,
  serialized_end=319,
)
_sym_db.RegisterEnumDescriptor(_CHROOTASSERTION)

ChrootAssertion = enum_type_wrapper.EnumTypeWrapper(_CHROOTASSERTION)
NO_ASSERTION = 0
INSIDE = 1
OUTSIDE = 2

SERVICE_OPTIONS_FIELD_NUMBER = 55000
service_options = _descriptor.FieldDescriptor(
  name='service_options', full_name='service_options', index=0,
  number=55000, type=11, cpp_type=10, label=1,
  has_default_value=False, default_value=None,
  message_type=None, enum_type=None, containing_type=None,
  is_extension=True, extension_scope=None,
  serialized_options=None, file=DESCRIPTOR)
METHOD_OPTIONS_FIELD_NUMBER = 55000
method_options = _descriptor.FieldDescriptor(
  name='method_options', full_name='method_options', index=1,
  number=55000, type=11, cpp_type=10, label=1,
  has_default_value=False, default_value=None,
  message_type=None, enum_type=None, containing_type=None,
  is_extension=True, extension_scope=None,
  serialized_options=None, file=DESCRIPTOR)


_BUILDAPISERVICEOPTIONS = _descriptor.Descriptor(
  name='BuildApiServiceOptions',
  full_name='BuildApiServiceOptions',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='module', full_name='BuildApiServiceOptions.module', index=0,
      number=1, type=9, cpp_type=9, label=2,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='service_chroot_assert', full_name='BuildApiServiceOptions.service_chroot_assert', index=1,
      number=2, type=14, cpp_type=8, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=66,
  serialized_end=155,
)


_BUILDAPIMETHODOPTIONS = _descriptor.Descriptor(
  name='BuildApiMethodOptions',
  full_name='BuildApiMethodOptions',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='implementation_name', full_name='BuildApiMethodOptions.implementation_name', index=0,
      number=1, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='method_chroot_assert', full_name='BuildApiMethodOptions.method_chroot_assert', index=1,
      number=2, type=14, cpp_type=8, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=157,
  serialized_end=257,
)

_BUILDAPISERVICEOPTIONS.fields_by_name['service_chroot_assert'].enum_type = _CHROOTASSERTION
_BUILDAPIMETHODOPTIONS.fields_by_name['method_chroot_assert'].enum_type = _CHROOTASSERTION
DESCRIPTOR.message_types_by_name['BuildApiServiceOptions'] = _BUILDAPISERVICEOPTIONS
DESCRIPTOR.message_types_by_name['BuildApiMethodOptions'] = _BUILDAPIMETHODOPTIONS
DESCRIPTOR.enum_types_by_name['ChrootAssertion'] = _CHROOTASSERTION
DESCRIPTOR.extensions_by_name['service_options'] = service_options
DESCRIPTOR.extensions_by_name['method_options'] = method_options
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

BuildApiServiceOptions = _reflection.GeneratedProtocolMessageType('BuildApiServiceOptions', (_message.Message,), dict(
  DESCRIPTOR = _BUILDAPISERVICEOPTIONS,
  __module__ = 'chromite.api.build_api_pb2'
  # @@protoc_insertion_point(class_scope:BuildApiServiceOptions)
  ))
_sym_db.RegisterMessage(BuildApiServiceOptions)

BuildApiMethodOptions = _reflection.GeneratedProtocolMessageType('BuildApiMethodOptions', (_message.Message,), dict(
  DESCRIPTOR = _BUILDAPIMETHODOPTIONS,
  __module__ = 'chromite.api.build_api_pb2'
  # @@protoc_insertion_point(class_scope:BuildApiMethodOptions)
  ))
_sym_db.RegisterMessage(BuildApiMethodOptions)

service_options.message_type = _BUILDAPISERVICEOPTIONS
google_dot_protobuf_dot_descriptor__pb2.ServiceOptions.RegisterExtension(service_options)
method_options.message_type = _BUILDAPIMETHODOPTIONS
google_dot_protobuf_dot_descriptor__pb2.MethodOptions.RegisterExtension(method_options)

DESCRIPTOR._options = None
# @@protoc_insertion_point(module_scope)
