# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test_platform/steps/compute_backfill.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from chromite.api.gen_sdk.test_platform import request_pb2 as test__platform_dot_request__pb2
from chromite.api.gen_sdk.test_platform.steps import enumeration_pb2 as test__platform_dot_steps_dot_enumeration__pb2
from chromite.api.gen_sdk.test_platform.steps import execution_pb2 as test__platform_dot_steps_dot_execution__pb2


DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*test_platform/steps/compute_backfill.proto\x12\x13test_platform.steps\x1a\x1btest_platform/request.proto\x1a%test_platform/steps/enumeration.proto\x1a#test_platform/steps/execution.proto\"\x97\x02\n\x17\x43omputeBackfillRequests\x12=\n\x08requests\x18\x01 \x03(\x0b\x32+.test_platform.steps.ComputeBackfillRequest\x12Y\n\x0ftagged_requests\x18\x02 \x03(\x0b\x32@.test_platform.steps.ComputeBackfillRequests.TaggedRequestsEntry\x1a\x62\n\x13TaggedRequestsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.test_platform.steps.ComputeBackfillRequest:\x02\x38\x01\"\x9f\x02\n\x18\x43omputeBackfillResponses\x12?\n\tresponses\x18\x01 \x03(\x0b\x32,.test_platform.steps.ComputeBackfillResponse\x12\\\n\x10tagged_responses\x18\x02 \x03(\x0b\x32\x42.test_platform.steps.ComputeBackfillResponses.TaggedResponsesEntry\x1a\x64\n\x14TaggedResponsesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12;\n\x05value\x18\x02 \x01(\x0b\x32,.test_platform.steps.ComputeBackfillResponse:\x02\x38\x01\"\xb9\x01\n\x16\x43omputeBackfillRequest\x12\'\n\x07request\x18\x01 \x01(\x0b\x32\x16.test_platform.Request\x12=\n\x0b\x65numeration\x18\x02 \x01(\x0b\x32(.test_platform.steps.EnumerationResponse\x12\x37\n\texecution\x18\x03 \x01(\x0b\x32$.test_platform.steps.ExecuteResponse\"B\n\x17\x43omputeBackfillResponse\x12\'\n\x07request\x18\x01 \x01(\x0b\x32\x16.test_platform.RequestB?Z=go.chromium.org/chromiumos/infra/proto/go/test_platform/stepsb\x06proto3')

_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'test_platform.steps.compute_backfill_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:

  DESCRIPTOR._options = None
  DESCRIPTOR._serialized_options = b'Z=go.chromium.org/chromiumos/infra/proto/go/test_platform/steps'
  _COMPUTEBACKFILLREQUESTS_TAGGEDREQUESTSENTRY._options = None
  _COMPUTEBACKFILLREQUESTS_TAGGEDREQUESTSENTRY._serialized_options = b'8\001'
  _COMPUTEBACKFILLRESPONSES_TAGGEDRESPONSESENTRY._options = None
  _COMPUTEBACKFILLRESPONSES_TAGGEDRESPONSESENTRY._serialized_options = b'8\001'
  _globals['_COMPUTEBACKFILLREQUESTS']._serialized_start=173
  _globals['_COMPUTEBACKFILLREQUESTS']._serialized_end=452
  _globals['_COMPUTEBACKFILLREQUESTS_TAGGEDREQUESTSENTRY']._serialized_start=354
  _globals['_COMPUTEBACKFILLREQUESTS_TAGGEDREQUESTSENTRY']._serialized_end=452
  _globals['_COMPUTEBACKFILLRESPONSES']._serialized_start=455
  _globals['_COMPUTEBACKFILLRESPONSES']._serialized_end=742
  _globals['_COMPUTEBACKFILLRESPONSES_TAGGEDRESPONSESENTRY']._serialized_start=642
  _globals['_COMPUTEBACKFILLRESPONSES_TAGGEDRESPONSESENTRY']._serialized_end=742
  _globals['_COMPUTEBACKFILLREQUEST']._serialized_start=745
  _globals['_COMPUTEBACKFILLREQUEST']._serialized_end=930
  _globals['_COMPUTEBACKFILLRESPONSE']._serialized_start=932
  _globals['_COMPUTEBACKFILLRESPONSE']._serialized_end=998
# @@protoc_insertion_point(module_scope)
