# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: service_config.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()

DESCRIPTOR = _descriptor.FileDescriptor(
    name='service_config.proto',
    package='buildbucket',
    syntax='proto3',
    serialized_pb=_b(
        '\n\x14service_config.proto\x12\x0b\x62uildbucket\">\n\x0bSettingsCfg\x12/\n\x08swarming\x18\x01 \x01(\x0b\x32\x1d.buildbucket.SwarmingSettings\"`\n\x10SwarmingSettings\x12\x15\n\rmilo_hostname\x18\x02 \x01(\t\x12/\n\'default_task_template_canary_percentage\x18\x03 \x01(\x05J\x04\x08\x01\x10\x02\x62\x06proto3'
    )
)
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

_SETTINGSCFG = _descriptor.Descriptor(
    name='SettingsCfg',
    full_name='buildbucket.SettingsCfg',
    filename=None,
    file=DESCRIPTOR,
    containing_type=None,
    fields=[
        _descriptor.FieldDescriptor(
            name='swarming',
            full_name='buildbucket.SettingsCfg.swarming',
            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,
            options=None
        ),
    ],
    extensions=[],
    nested_types=[],
    enum_types=[],
    options=None,
    is_extendable=False,
    syntax='proto3',
    extension_ranges=[],
    oneofs=[],
    serialized_start=37,
    serialized_end=99,
)

_SWARMINGSETTINGS = _descriptor.Descriptor(
    name='SwarmingSettings',
    full_name='buildbucket.SwarmingSettings',
    filename=None,
    file=DESCRIPTOR,
    containing_type=None,
    fields=[
        _descriptor.FieldDescriptor(
            name='milo_hostname',
            full_name='buildbucket.SwarmingSettings.milo_hostname',
            index=0,
            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='default_task_template_canary_percentage',
            full_name=
            'buildbucket.SwarmingSettings.default_task_template_canary_percentage',
            index=1,
            number=3,
            type=5,
            cpp_type=1,
            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
        ),
    ],
    extensions=[],
    nested_types=[],
    enum_types=[],
    options=None,
    is_extendable=False,
    syntax='proto3',
    extension_ranges=[],
    oneofs=[],
    serialized_start=101,
    serialized_end=197,
)

_SETTINGSCFG.fields_by_name['swarming'].message_type = _SWARMINGSETTINGS
DESCRIPTOR.message_types_by_name['SettingsCfg'] = _SETTINGSCFG
DESCRIPTOR.message_types_by_name['SwarmingSettings'] = _SWARMINGSETTINGS

SettingsCfg = _reflection.GeneratedProtocolMessageType(
    'SettingsCfg',
    (_message.Message,),
    dict(
        DESCRIPTOR=_SETTINGSCFG,
        __module__='service_config_pb2'
        # @@protoc_insertion_point(class_scope:buildbucket.SettingsCfg)
    )
)
_sym_db.RegisterMessage(SettingsCfg)

SwarmingSettings = _reflection.GeneratedProtocolMessageType(
    'SwarmingSettings',
    (_message.Message,),
    dict(
        DESCRIPTOR=_SWARMINGSETTINGS,
        __module__='service_config_pb2'
        # @@protoc_insertion_point(class_scope:buildbucket.SwarmingSettings)
    )
)
_sym_db.RegisterMessage(SwarmingSettings)

# @@protoc_insertion_point(module_scope)
