# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test_platform/result_flow/ctp.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/ctp.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/ctp.proto\x12\x19test_platform.result_flow\x1a&test_platform/result_flow/common.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xa4\x01\n\nCTPRequest\x12.\n\x03\x63tp\x18\x01 \x01(\x0b\x32!.test_platform.result_flow.Source\x12\x38\n\rtest_plan_run\x18\x02 \x01(\x0b\x32!.test_platform.result_flow.Target\x12,\n\x08\x64\x65\x61\x64line\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\">\n\x0b\x43TPResponse\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,])




_CTPREQUEST = _descriptor.Descriptor(
  name='CTPRequest',
  full_name='test_platform.result_flow.CTPRequest',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='ctp', full_name='test_platform.result_flow.CTPRequest.ctp', 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='test_plan_run', full_name='test_platform.result_flow.CTPRequest.test_plan_run', index=1,
      number=2, 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.CTPRequest.deadline', 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),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=140,
  serialized_end=304,
)


_CTPRESPONSE = _descriptor.Descriptor(
  name='CTPResponse',
  full_name='test_platform.result_flow.CTPResponse',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='state', full_name='test_platform.result_flow.CTPResponse.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=306,
  serialized_end=368,
)

_CTPREQUEST.fields_by_name['ctp'].message_type = test__platform_dot_result__flow_dot_common__pb2._SOURCE
_CTPREQUEST.fields_by_name['test_plan_run'].message_type = test__platform_dot_result__flow_dot_common__pb2._TARGET
_CTPREQUEST.fields_by_name['deadline'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
_CTPRESPONSE.fields_by_name['state'].enum_type = test__platform_dot_result__flow_dot_common__pb2._STATE
DESCRIPTOR.message_types_by_name['CTPRequest'] = _CTPREQUEST
DESCRIPTOR.message_types_by_name['CTPResponse'] = _CTPRESPONSE
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

CTPRequest = _reflection.GeneratedProtocolMessageType('CTPRequest', (_message.Message,), dict(
  DESCRIPTOR = _CTPREQUEST,
  __module__ = 'test_platform.result_flow.ctp_pb2'
  # @@protoc_insertion_point(class_scope:test_platform.result_flow.CTPRequest)
  ))
_sym_db.RegisterMessage(CTPRequest)

CTPResponse = _reflection.GeneratedProtocolMessageType('CTPResponse', (_message.Message,), dict(
  DESCRIPTOR = _CTPRESPONSE,
  __module__ = 'test_platform.result_flow.ctp_pb2'
  # @@protoc_insertion_point(class_scope:test_platform.result_flow.CTPResponse)
  ))
_sym_db.RegisterMessage(CTPResponse)


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