# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: chromite/api/toolchain.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 chromite.api.gen.chromite.api import build_api_pb2 as chromite_dot_api_dot_build__api__pb2
from chromite.api.gen.chromiumos import common_pb2 as chromiumos_dot_common__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='chromite/api/toolchain.proto',
  package='chromite.api',
  syntax='proto3',
  serialized_options=_b('Z6go.chromium.org/chromiumos/infra/proto/go/chromite/api'),
  serialized_pb=_b('\n\x1c\x63hromite/api/toolchain.proto\x12\x0c\x63hromite.api\x1a\x1c\x63hromite/api/build_api.proto\x1a\x17\x63hromiumos/common.proto\"\x82\x01\n\x1aVerifyAFDOArtifactsRequest\x12-\n\x0c\x62uild_target\x18\x01 \x01(\x0b\x32\x17.chromiumos.BuildTarget\x12\x35\n\rartifact_type\x18\x02 \x01(\x0e\x32\x1e.chromite.api.AFDOArtifactType\"-\n\x1bVerifyAFDOArtifactsResponse\x12\x0e\n\x06status\x18\x01 \x01(\x08*f\n\x10\x41\x46\x44OArtifactType\x12\r\n\tNONE_TYPE\x10\x00\x12\r\n\tORDERFILE\x10\x01\x12\x12\n\x0e\x42\x45NCHMARK_AFDO\x10\x02\x12\x0f\n\x0bKERNEL_AFDO\x10\x03\x12\x0f\n\x0b\x43HROME_AFDO\x10\x04\x32\x8d\x02\n\x10ToolchainService\x12t\n\x1dUpdateEbuildWithAFDOArtifacts\x12(.chromite.api.VerifyAFDOArtifactsRequest\x1a).chromite.api.VerifyAFDOArtifactsResponse\x12p\n\x19UploadVettedAFDOArtifacts\x12(.chromite.api.VerifyAFDOArtifactsRequest\x1a).chromite.api.VerifyAFDOArtifactsResponse\x1a\x11\xc2\xed\x1a\r\n\ttoolchain\x10\x01\x42\x38Z6go.chromium.org/chromiumos/infra/proto/go/chromite/apib\x06proto3')
  ,
  dependencies=[chromite_dot_api_dot_build__api__pb2.DESCRIPTOR,chromiumos_dot_common__pb2.DESCRIPTOR,])

_AFDOARTIFACTTYPE = _descriptor.EnumDescriptor(
  name='AFDOArtifactType',
  full_name='chromite.api.AFDOArtifactType',
  filename=None,
  file=DESCRIPTOR,
  values=[
    _descriptor.EnumValueDescriptor(
      name='NONE_TYPE', index=0, number=0,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='ORDERFILE', index=1, number=1,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='BENCHMARK_AFDO', index=2, number=2,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='KERNEL_AFDO', index=3, number=3,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='CHROME_AFDO', index=4, number=4,
      serialized_options=None,
      type=None),
  ],
  containing_type=None,
  serialized_options=None,
  serialized_start=281,
  serialized_end=383,
)
_sym_db.RegisterEnumDescriptor(_AFDOARTIFACTTYPE)

AFDOArtifactType = enum_type_wrapper.EnumTypeWrapper(_AFDOARTIFACTTYPE)
NONE_TYPE = 0
ORDERFILE = 1
BENCHMARK_AFDO = 2
KERNEL_AFDO = 3
CHROME_AFDO = 4



_VERIFYAFDOARTIFACTSREQUEST = _descriptor.Descriptor(
  name='VerifyAFDOArtifactsRequest',
  full_name='chromite.api.VerifyAFDOArtifactsRequest',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='build_target', full_name='chromite.api.VerifyAFDOArtifactsRequest.build_target', index=0,
      number=1, 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=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='artifact_type', full_name='chromite.api.VerifyAFDOArtifactsRequest.artifact_type', 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='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=102,
  serialized_end=232,
)


_VERIFYAFDOARTIFACTSRESPONSE = _descriptor.Descriptor(
  name='VerifyAFDOArtifactsResponse',
  full_name='chromite.api.VerifyAFDOArtifactsResponse',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='status', full_name='chromite.api.VerifyAFDOArtifactsResponse.status', index=0,
      number=1, type=8, cpp_type=7, label=1,
      has_default_value=False, default_value=False,
      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='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=234,
  serialized_end=279,
)

_VERIFYAFDOARTIFACTSREQUEST.fields_by_name['build_target'].message_type = chromiumos_dot_common__pb2._BUILDTARGET
_VERIFYAFDOARTIFACTSREQUEST.fields_by_name['artifact_type'].enum_type = _AFDOARTIFACTTYPE
DESCRIPTOR.message_types_by_name['VerifyAFDOArtifactsRequest'] = _VERIFYAFDOARTIFACTSREQUEST
DESCRIPTOR.message_types_by_name['VerifyAFDOArtifactsResponse'] = _VERIFYAFDOARTIFACTSRESPONSE
DESCRIPTOR.enum_types_by_name['AFDOArtifactType'] = _AFDOARTIFACTTYPE
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

VerifyAFDOArtifactsRequest = _reflection.GeneratedProtocolMessageType('VerifyAFDOArtifactsRequest', (_message.Message,), dict(
  DESCRIPTOR = _VERIFYAFDOARTIFACTSREQUEST,
  __module__ = 'chromite.api.toolchain_pb2'
  # @@protoc_insertion_point(class_scope:chromite.api.VerifyAFDOArtifactsRequest)
  ))
_sym_db.RegisterMessage(VerifyAFDOArtifactsRequest)

VerifyAFDOArtifactsResponse = _reflection.GeneratedProtocolMessageType('VerifyAFDOArtifactsResponse', (_message.Message,), dict(
  DESCRIPTOR = _VERIFYAFDOARTIFACTSRESPONSE,
  __module__ = 'chromite.api.toolchain_pb2'
  # @@protoc_insertion_point(class_scope:chromite.api.VerifyAFDOArtifactsResponse)
  ))
_sym_db.RegisterMessage(VerifyAFDOArtifactsResponse)


DESCRIPTOR._options = None

_TOOLCHAINSERVICE = _descriptor.ServiceDescriptor(
  name='ToolchainService',
  full_name='chromite.api.ToolchainService',
  file=DESCRIPTOR,
  index=0,
  serialized_options=_b('\302\355\032\r\n\ttoolchain\020\001'),
  serialized_start=386,
  serialized_end=655,
  methods=[
  _descriptor.MethodDescriptor(
    name='UpdateEbuildWithAFDOArtifacts',
    full_name='chromite.api.ToolchainService.UpdateEbuildWithAFDOArtifacts',
    index=0,
    containing_service=None,
    input_type=_VERIFYAFDOARTIFACTSREQUEST,
    output_type=_VERIFYAFDOARTIFACTSRESPONSE,
    serialized_options=None,
  ),
  _descriptor.MethodDescriptor(
    name='UploadVettedAFDOArtifacts',
    full_name='chromite.api.ToolchainService.UploadVettedAFDOArtifacts',
    index=1,
    containing_service=None,
    input_type=_VERIFYAFDOARTIFACTSREQUEST,
    output_type=_VERIFYAFDOARTIFACTSRESPONSE,
    serialized_options=None,
  ),
])
_sym_db.RegisterServiceDescriptor(_TOOLCHAINSERVICE)

DESCRIPTOR.services_by_name['ToolchainService'] = _TOOLCHAINSERVICE

# @@protoc_insertion_point(module_scope)
