# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test_platform/multibot/requests.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.phosphorus import prejob_pb2 as test__platform_dot_phosphorus_dot_prejob__pb2
from chromite.api.gen_sdk.test_platform.multibot import common_pb2 as test__platform_dot_multibot_dot_common__pb2
from chromite.api.gen_sdk.test_platform import request_pb2 as test__platform_dot_request__pb2


DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%test_platform/multibot/requests.proto\x12\x16test_platform.multibot\x1a%test_platform/phosphorus/prejob.proto\x1a#test_platform/multibot/common.proto\x1a\x1btest_platform/request.proto\"{\n\rLeaderRequest\x12,\n\x07payload\x18\x01 \x01(\x0b\x32\x1b.test_platform.Request.Test\x12<\n\x0e\x66ollower_specs\x18\x02 \x03(\x0b\x32$.test_platform.multibot.FollowerSpec\"\x8b\x03\n\x0f\x46ollowerRequest\x12\x19\n\x11subscription_name\x18\x01 \x01(\t\x12T\n\x0fincoming_filter\x18\x02 \x03(\x0b\x32;.test_platform.multibot.FollowerRequest.IncomingFilterEntry\x12\\\n\x13outgoing_attributes\x18\x03 \x03(\x0b\x32?.test_platform.multibot.FollowerRequest.OutgoingAttributesEntry\x12\x37\n\x06prejob\x18\x04 \x01(\x0b\x32\'.test_platform.phosphorus.PrejobRequest\x1a\x35\n\x13IncomingFilterEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x39\n\x17OutgoingAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x42Z@go.chromium.org/chromiumos/infra/proto/go/test_platform/multibotb\x06proto3')

_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'test_platform.multibot.requests_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/multibot'
  _FOLLOWERREQUEST_INCOMINGFILTERENTRY._options = None
  _FOLLOWERREQUEST_INCOMINGFILTERENTRY._serialized_options = b'8\001'
  _FOLLOWERREQUEST_OUTGOINGATTRIBUTESENTRY._options = None
  _FOLLOWERREQUEST_OUTGOINGATTRIBUTESENTRY._serialized_options = b'8\001'
  _globals['_LEADERREQUEST']._serialized_start=170
  _globals['_LEADERREQUEST']._serialized_end=293
  _globals['_FOLLOWERREQUEST']._serialized_start=296
  _globals['_FOLLOWERREQUEST']._serialized_end=691
  _globals['_FOLLOWERREQUEST_INCOMINGFILTERENTRY']._serialized_start=579
  _globals['_FOLLOWERREQUEST_INCOMINGFILTERENTRY']._serialized_end=632
  _globals['_FOLLOWERREQUEST_OUTGOINGATTRIBUTESENTRY']._serialized_start=634
  _globals['_FOLLOWERREQUEST_OUTGOINGATTRIBUTESENTRY']._serialized_end=691
# @@protoc_insertion_point(module_scope)
