# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: step.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
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()

from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
from . import common_pb2 as common__pb2

DESCRIPTOR = _descriptor.FileDescriptor(
    name='step.proto',
    package='buildbucket.v2',
    syntax='proto3',
    serialized_pb=_b(
        '\n\nstep.proto\x12\x0e\x62uildbucket.v2\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x0c\x63ommon.proto\"\x90\x02\n\x04Step\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\nstart_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x06status\x18\x04 \x01(\x0e\x32\x16.buildbucket.v2.Status\x12&\n\x04logs\x18\x05 \x03(\x0b\x32\x18.buildbucket.v2.Step.Log\x12\x18\n\x10summary_markdown\x18\x07 \x01(\t\x1a\x32\n\x03Log\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08view_url\x18\x02 \x01(\t\x12\x0b\n\x03url\x18\x03 \x01(\tB6Z4go.chromium.org/luci/buildbucket/proto;buildbucketpbb\x06proto3'
    ),
    dependencies=[
        google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,
        common__pb2.DESCRIPTOR,
    ]
)
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

_STEP_LOG = _descriptor.Descriptor(
    name='Log',
    full_name='buildbucket.v2.Step.Log',
    filename=None,
    file=DESCRIPTOR,
    containing_type=None,
    fields=[
        _descriptor.FieldDescriptor(
            name='name',
            full_name='buildbucket.v2.Step.Log.name',
            index=0,
            number=1,
            type=9,
            cpp_type=9,
            label=1,
            has_default_value=False,
            default_value=_b("").decode('utf-8'),
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None
        ),
        _descriptor.FieldDescriptor(
            name='view_url',
            full_name='buildbucket.v2.Step.Log.view_url',
            index=1,
            number=2,
            type=9,
            cpp_type=9,
            label=1,
            has_default_value=False,
            default_value=_b("").decode('utf-8'),
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None
        ),
        _descriptor.FieldDescriptor(
            name='url',
            full_name='buildbucket.v2.Step.Log.url',
            index=2,
            number=3,
            type=9,
            cpp_type=9,
            label=1,
            has_default_value=False,
            default_value=_b("").decode('utf-8'),
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None
        ),
    ],
    extensions=[],
    nested_types=[],
    enum_types=[],
    options=None,
    is_extendable=False,
    syntax='proto3',
    extension_ranges=[],
    oneofs=[],
    serialized_start=300,
    serialized_end=350,
)

_STEP = _descriptor.Descriptor(
    name='Step',
    full_name='buildbucket.v2.Step',
    filename=None,
    file=DESCRIPTOR,
    containing_type=None,
    fields=[
        _descriptor.FieldDescriptor(
            name='name',
            full_name='buildbucket.v2.Step.name',
            index=0,
            number=1,
            type=9,
            cpp_type=9,
            label=1,
            has_default_value=False,
            default_value=_b("").decode('utf-8'),
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None
        ),
        _descriptor.FieldDescriptor(
            name='start_time',
            full_name='buildbucket.v2.Step.start_time',
            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,
            options=None
        ),
        _descriptor.FieldDescriptor(
            name='end_time',
            full_name='buildbucket.v2.Step.end_time',
            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,
            options=None
        ),
        _descriptor.FieldDescriptor(
            name='status',
            full_name='buildbucket.v2.Step.status',
            index=3,
            number=4,
            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,
            options=None
        ),
        _descriptor.FieldDescriptor(
            name='logs',
            full_name='buildbucket.v2.Step.logs',
            index=4,
            number=5,
            type=11,
            cpp_type=10,
            label=3,
            has_default_value=False,
            default_value=[],
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None
        ),
        _descriptor.FieldDescriptor(
            name='summary_markdown',
            full_name='buildbucket.v2.Step.summary_markdown',
            index=5,
            number=7,
            type=9,
            cpp_type=9,
            label=1,
            has_default_value=False,
            default_value=_b("").decode('utf-8'),
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None
        ),
    ],
    extensions=[],
    nested_types=[
        _STEP_LOG,
    ],
    enum_types=[],
    options=None,
    is_extendable=False,
    syntax='proto3',
    extension_ranges=[],
    oneofs=[],
    serialized_start=78,
    serialized_end=350,
)

_STEP_LOG.containing_type = _STEP
_STEP.fields_by_name[
    'start_time'
].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
_STEP.fields_by_name[
    'end_time'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
_STEP.fields_by_name['status'].enum_type = common__pb2._STATUS
_STEP.fields_by_name['logs'].message_type = _STEP_LOG
DESCRIPTOR.message_types_by_name['Step'] = _STEP

Step = _reflection.GeneratedProtocolMessageType(
    'Step',
    (_message.Message,),
    dict(
        Log=_reflection.GeneratedProtocolMessageType(
            'Log',
            (_message.Message,),
            dict(
                DESCRIPTOR=_STEP_LOG,
                __module__='step_pb2'
                # @@protoc_insertion_point(class_scope:buildbucket.v2.Step.Log)
            )
        ),
        DESCRIPTOR=_STEP,
        __module__='step_pb2'
        # @@protoc_insertion_point(class_scope:buildbucket.v2.Step)
    )
)
_sym_db.RegisterMessage(Step)
_sym_db.RegisterMessage(Step.Log)

DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(
    descriptor_pb2.FileOptions(),
    _b('Z4go.chromium.org/luci/buildbucket/proto;buildbucketpb')
)
# @@protoc_insertion_point(module_scope)
