# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: chromiumos/dut_tracking.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf.internal import enum_type_wrapper
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.chromiumos import bot_scaling_pb2 as chromiumos_dot_bot__scaling__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='chromiumos/dut_tracking.proto',
  package='chromiumos',
  syntax='proto3',
  serialized_options=_b('Z4go.chromium.org/chromiumos/infra/proto/go/chromiumos'),
  serialized_pb=_b('\n\x1d\x63hromiumos/dut_tracking.proto\x12\nchromiumos\x1a\x1c\x63hromiumos/bot_scaling.proto\"\xe7\x01\n\x0eTrackingPolicy\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\ndimensions\x18\x02 \x03(\x0b\x32\x1d.chromiumos.SwarmingDimension\x12)\n\x05modes\x18\x03 \x03(\x0e\x32\x1a.chromiumos.MonitoringMode\x12\x16\n\x0elookback_hours\x18\x04 \x01(\x11\x12\x36\n\x0ftask_dimensions\x18\x05 \x03(\x0b\x32\x1d.chromiumos.SwarmingDimension\x12\x19\n\x11swarming_instance\x18\x06 \x01(\t\"A\n\x11TrackingPolicyCfg\x12,\n\x08policies\x18\x01 \x03(\x0b\x32\x1a.chromiumos.TrackingPolicy*b\n\x0eMonitoringMode\x12\x14\n\x10\x44\x45\x46\x41ULT_TRACKING\x10\x00\x12\x12\n\x0eTASK_BOT_COUNT\x10\x01\x12\x11\n\rMAX_PEND_TIME\x10\x02\x12\x13\n\x0fPASS_FAIL_COUNT\x10\x03\x42\x36Z4go.chromium.org/chromiumos/infra/proto/go/chromiumosb\x06proto3')
  ,
  dependencies=[chromiumos_dot_bot__scaling__pb2.DESCRIPTOR,])

_MONITORINGMODE = _descriptor.EnumDescriptor(
  name='MonitoringMode',
  full_name='chromiumos.MonitoringMode',
  filename=None,
  file=DESCRIPTOR,
  values=[
    _descriptor.EnumValueDescriptor(
      name='DEFAULT_TRACKING', index=0, number=0,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='TASK_BOT_COUNT', index=1, number=1,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='MAX_PEND_TIME', index=2, number=2,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='PASS_FAIL_COUNT', index=3, number=3,
      serialized_options=None,
      type=None),
  ],
  containing_type=None,
  serialized_options=None,
  serialized_start=376,
  serialized_end=474,
)
_sym_db.RegisterEnumDescriptor(_MONITORINGMODE)

MonitoringMode = enum_type_wrapper.EnumTypeWrapper(_MONITORINGMODE)
DEFAULT_TRACKING = 0
TASK_BOT_COUNT = 1
MAX_PEND_TIME = 2
PASS_FAIL_COUNT = 3



_TRACKINGPOLICY = _descriptor.Descriptor(
  name='TrackingPolicy',
  full_name='chromiumos.TrackingPolicy',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='name', full_name='chromiumos.TrackingPolicy.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,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='dimensions', full_name='chromiumos.TrackingPolicy.dimensions', index=1,
      number=2, 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,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='modes', full_name='chromiumos.TrackingPolicy.modes', index=2,
      number=3, type=14, cpp_type=8, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='lookback_hours', full_name='chromiumos.TrackingPolicy.lookback_hours', index=3,
      number=4, type=17, 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,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='task_dimensions', full_name='chromiumos.TrackingPolicy.task_dimensions', 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,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='swarming_instance', full_name='chromiumos.TrackingPolicy.swarming_instance', index=5,
      number=6, 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=76,
  serialized_end=307,
)


_TRACKINGPOLICYCFG = _descriptor.Descriptor(
  name='TrackingPolicyCfg',
  full_name='chromiumos.TrackingPolicyCfg',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='policies', full_name='chromiumos.TrackingPolicyCfg.policies', index=0,
      number=1, 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,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=309,
  serialized_end=374,
)

_TRACKINGPOLICY.fields_by_name['dimensions'].message_type = chromiumos_dot_bot__scaling__pb2._SWARMINGDIMENSION
_TRACKINGPOLICY.fields_by_name['modes'].enum_type = _MONITORINGMODE
_TRACKINGPOLICY.fields_by_name['task_dimensions'].message_type = chromiumos_dot_bot__scaling__pb2._SWARMINGDIMENSION
_TRACKINGPOLICYCFG.fields_by_name['policies'].message_type = _TRACKINGPOLICY
DESCRIPTOR.message_types_by_name['TrackingPolicy'] = _TRACKINGPOLICY
DESCRIPTOR.message_types_by_name['TrackingPolicyCfg'] = _TRACKINGPOLICYCFG
DESCRIPTOR.enum_types_by_name['MonitoringMode'] = _MONITORINGMODE
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

TrackingPolicy = _reflection.GeneratedProtocolMessageType('TrackingPolicy', (_message.Message,), dict(
  DESCRIPTOR = _TRACKINGPOLICY,
  __module__ = 'chromiumos.dut_tracking_pb2'
  # @@protoc_insertion_point(class_scope:chromiumos.TrackingPolicy)
  ))
_sym_db.RegisterMessage(TrackingPolicy)

TrackingPolicyCfg = _reflection.GeneratedProtocolMessageType('TrackingPolicyCfg', (_message.Message,), dict(
  DESCRIPTOR = _TRACKINGPOLICYCFG,
  __module__ = 'chromiumos.dut_tracking_pb2'
  # @@protoc_insertion_point(class_scope:chromiumos.TrackingPolicyCfg)
  ))
_sym_db.RegisterMessage(TrackingPolicyCfg)


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