# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test_platform/skylab_local_state/multihost.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.skylab_local_state import host_info_pb2 as test__platform_dot_skylab__local__state_dot_host__info__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='test_platform/skylab_local_state/multihost.proto',
  package='test_platform.skylab_local_state',
  syntax='proto3',
  serialized_options=_b('ZJgo.chromium.org/chromiumos/infra/proto/go/test_platform/skylab_local_state'),
  serialized_pb=_b('\n0test_platform/skylab_local_state/multihost.proto\x12 test_platform.skylab_local_state\x1a\x30test_platform/skylab_local_state/host_info.proto\"k\n\x10MultiBotHostInfo\x12\x45\n\thost_info\x18\x01 \x01(\x0b\x32\x32.test_platform.skylab_local_state.AutotestHostInfo\x12\x10\n\x08\x64ut_name\x18\x02 \x01(\tBLZJgo.chromium.org/chromiumos/infra/proto/go/test_platform/skylab_local_stateb\x06proto3')
  ,
  dependencies=[test__platform_dot_skylab__local__state_dot_host__info__pb2.DESCRIPTOR,])




_MULTIBOTHOSTINFO = _descriptor.Descriptor(
  name='MultiBotHostInfo',
  full_name='test_platform.skylab_local_state.MultiBotHostInfo',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='host_info', full_name='test_platform.skylab_local_state.MultiBotHostInfo.host_info', 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='dut_name', full_name='test_platform.skylab_local_state.MultiBotHostInfo.dut_name', 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,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=136,
  serialized_end=243,
)

_MULTIBOTHOSTINFO.fields_by_name['host_info'].message_type = test__platform_dot_skylab__local__state_dot_host__info__pb2._AUTOTESTHOSTINFO
DESCRIPTOR.message_types_by_name['MultiBotHostInfo'] = _MULTIBOTHOSTINFO
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

MultiBotHostInfo = _reflection.GeneratedProtocolMessageType('MultiBotHostInfo', (_message.Message,), dict(
  DESCRIPTOR = _MULTIBOTHOSTINFO,
  __module__ = 'test_platform.skylab_local_state.multihost_pb2'
  # @@protoc_insertion_point(class_scope:test_platform.skylab_local_state.MultiBotHostInfo)
  ))
_sym_db.RegisterMessage(MultiBotHostInfo)


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