# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test_platform/result_flow/publish.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
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.test_platform.result_flow import common_pb2 as test__platform_dot_result__flow_dot_common__pb2
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='test_platform/result_flow/publish.proto',
  package='test_platform.result_flow',
  syntax='proto3',
  serialized_options=_b('ZCgo.chromium.org/chromiumos/infra/proto/go/test_platform/result_flow'),
  serialized_pb=_b('\n\'test_platform/result_flow/publish.proto\x12\x19test_platform.result_flow\x1a&test_platform/result_flow/common.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xdd\x01\n\x0ePublishRequest\x12\x10\n\x08\x62uild_id\x18\x01 \x01(\x03\x12\x17\n\x0fparent_build_id\x18\x02 \x01(\x03\x12\x34\n\x03\x63tp\x18\x03 \x01(\x0b\x32\'.test_platform.result_flow.PubSubConfig\x12<\n\x0btest_runner\x18\x04 \x01(\x0b\x32\'.test_platform.result_flow.PubSubConfig\x12,\n\x08\x64\x65\x61\x64line\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"B\n\x0fPublishResponse\x12/\n\x05state\x18\x01 \x01(\x0e\x32 .test_platform.result_flow.StateBEZCgo.chromium.org/chromiumos/infra/proto/go/test_platform/result_flowb\x06proto3')
  ,
  dependencies=[test__platform_dot_result__flow_dot_common__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,])




_PUBLISHREQUEST = _descriptor.Descriptor(
  name='PublishRequest',
  full_name='test_platform.result_flow.PublishRequest',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='build_id', full_name='test_platform.result_flow.PublishRequest.build_id', index=0,
      number=1, type=3, cpp_type=2, 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),
    _descriptor.FieldDescriptor(
      name='parent_build_id', full_name='test_platform.result_flow.PublishRequest.parent_build_id', index=1,
      number=2, type=3, cpp_type=2, 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),
    _descriptor.FieldDescriptor(
      name='ctp', full_name='test_platform.result_flow.PublishRequest.ctp', index=2,
      number=3, 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='test_runner', full_name='test_platform.result_flow.PublishRequest.test_runner', index=3,
      number=4, 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='deadline', full_name='test_platform.result_flow.PublishRequest.deadline', index=4,
      number=5, 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),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=144,
  serialized_end=365,
)


_PUBLISHRESPONSE = _descriptor.Descriptor(
  name='PublishResponse',
  full_name='test_platform.result_flow.PublishResponse',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='state', full_name='test_platform.result_flow.PublishResponse.state', index=0,
      number=1, 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=367,
  serialized_end=433,
)

_PUBLISHREQUEST.fields_by_name['ctp'].message_type = test__platform_dot_result__flow_dot_common__pb2._PUBSUBCONFIG
_PUBLISHREQUEST.fields_by_name['test_runner'].message_type = test__platform_dot_result__flow_dot_common__pb2._PUBSUBCONFIG
_PUBLISHREQUEST.fields_by_name['deadline'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
_PUBLISHRESPONSE.fields_by_name['state'].enum_type = test__platform_dot_result__flow_dot_common__pb2._STATE
DESCRIPTOR.message_types_by_name['PublishRequest'] = _PUBLISHREQUEST
DESCRIPTOR.message_types_by_name['PublishResponse'] = _PUBLISHRESPONSE
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

PublishRequest = _reflection.GeneratedProtocolMessageType('PublishRequest', (_message.Message,), dict(
  DESCRIPTOR = _PUBLISHREQUEST,
  __module__ = 'test_platform.result_flow.publish_pb2'
  # @@protoc_insertion_point(class_scope:test_platform.result_flow.PublishRequest)
  ))
_sym_db.RegisterMessage(PublishRequest)

PublishResponse = _reflection.GeneratedProtocolMessageType('PublishResponse', (_message.Message,), dict(
  DESCRIPTOR = _PUBLISHRESPONSE,
  __module__ = 'test_platform.result_flow.publish_pb2'
  # @@protoc_insertion_point(class_scope:test_platform.result_flow.PublishResponse)
  ))
_sym_db.RegisterMessage(PublishResponse)


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