// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromiumos/dut_tracking.proto

package chromiumos

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Defines the modes of monitoring to execute on swarming.
type MonitoringMode int32

const (
	MonitoringMode_DEFAULT_TRACKING MonitoringMode = 0
	// Track Task and Bot count.
	MonitoringMode_TASK_BOT_COUNT MonitoringMode = 1
	// Maximum pending time of the tasks.
	MonitoringMode_MAX_PEND_TIME MonitoringMode = 2
	// Success and failure count over a time period.
	MonitoringMode_PASS_FAIL_COUNT MonitoringMode = 3
)

// Enum value maps for MonitoringMode.
var (
	MonitoringMode_name = map[int32]string{
		0: "DEFAULT_TRACKING",
		1: "TASK_BOT_COUNT",
		2: "MAX_PEND_TIME",
		3: "PASS_FAIL_COUNT",
	}
	MonitoringMode_value = map[string]int32{
		"DEFAULT_TRACKING": 0,
		"TASK_BOT_COUNT":   1,
		"MAX_PEND_TIME":    2,
		"PASS_FAIL_COUNT":  3,
	}
)

func (x MonitoringMode) Enum() *MonitoringMode {
	p := new(MonitoringMode)
	*p = x
	return p
}

func (x MonitoringMode) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (MonitoringMode) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_dut_tracking_proto_enumTypes[0].Descriptor()
}

func (MonitoringMode) Type() protoreflect.EnumType {
	return &file_chromiumos_dut_tracking_proto_enumTypes[0]
}

func (x MonitoringMode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use MonitoringMode.Descriptor instead.
func (MonitoringMode) EnumDescriptor() ([]byte, []int) {
	return file_chromiumos_dut_tracking_proto_rawDescGZIP(), []int{0}
}

// Defines a tracking policy for a specific "bot group". This can be used
// to track a DUT, a model, a qs_account or tasks with certain priority.
type TrackingPolicy struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Bot group being tracked.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Dimensions to query swarming on.
	// DO NOT use values field here. Only value will be used.
	Dimensions []*SwarmingDimension `protobuf:"bytes,2,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
	// What monitorings to apply on the bot group.
	Modes []MonitoringMode `protobuf:"varint,3,rep,packed,name=modes,proto3,enum=chromiumos.MonitoringMode" json:"modes,omitempty"`
	// Number of hours to lookback for Swarming stats.
	LookbackHours int32 `protobuf:"zigzag32,4,opt,name=lookback_hours,json=lookbackHours,proto3" json:"lookback_hours,omitempty"`
	// Dimensions that are only needed to query tasks.
	TaskDimensions []*SwarmingDimension `protobuf:"bytes,5,rep,name=task_dimensions,json=taskDimensions,proto3" json:"task_dimensions,omitempty"`
	// Swarming instance name:  chromeos-swarming.appspot.com
	SwarmingInstance string `protobuf:"bytes,6,opt,name=swarming_instance,json=swarmingInstance,proto3" json:"swarming_instance,omitempty"`
}

func (x *TrackingPolicy) Reset() {
	*x = TrackingPolicy{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_dut_tracking_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TrackingPolicy) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TrackingPolicy) ProtoMessage() {}

func (x *TrackingPolicy) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_dut_tracking_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TrackingPolicy.ProtoReflect.Descriptor instead.
func (*TrackingPolicy) Descriptor() ([]byte, []int) {
	return file_chromiumos_dut_tracking_proto_rawDescGZIP(), []int{0}
}

func (x *TrackingPolicy) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *TrackingPolicy) GetDimensions() []*SwarmingDimension {
	if x != nil {
		return x.Dimensions
	}
	return nil
}

func (x *TrackingPolicy) GetModes() []MonitoringMode {
	if x != nil {
		return x.Modes
	}
	return nil
}

func (x *TrackingPolicy) GetLookbackHours() int32 {
	if x != nil {
		return x.LookbackHours
	}
	return 0
}

func (x *TrackingPolicy) GetTaskDimensions() []*SwarmingDimension {
	if x != nil {
		return x.TaskDimensions
	}
	return nil
}

func (x *TrackingPolicy) GetSwarmingInstance() string {
	if x != nil {
		return x.SwarmingInstance
	}
	return ""
}

// Defines a root message.
type TrackingPolicyCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// All tracking policies.
	Policies []*TrackingPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"`
}

func (x *TrackingPolicyCfg) Reset() {
	*x = TrackingPolicyCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_dut_tracking_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TrackingPolicyCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TrackingPolicyCfg) ProtoMessage() {}

func (x *TrackingPolicyCfg) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_dut_tracking_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TrackingPolicyCfg.ProtoReflect.Descriptor instead.
func (*TrackingPolicyCfg) Descriptor() ([]byte, []int) {
	return file_chromiumos_dut_tracking_proto_rawDescGZIP(), []int{1}
}

func (x *TrackingPolicyCfg) GetPolicies() []*TrackingPolicy {
	if x != nil {
		return x.Policies
	}
	return nil
}

var File_chromiumos_dut_tracking_proto protoreflect.FileDescriptor

var file_chromiumos_dut_tracking_proto_rawDesc = []byte{
	0x0a, 0x1d, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x64, 0x75, 0x74,
	0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
	0x0a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x1a, 0x1c, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c,
	0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb1, 0x02, 0x0a, 0x0e, 0x54, 0x72,
	0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04,
	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
	0x12, 0x3d, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x53, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73,
	0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12,
	0x30, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1a,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x4d, 0x6f, 0x6e, 0x69,
	0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65,
	0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x68, 0x6f,
	0x75, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0d, 0x6c, 0x6f, 0x6f, 0x6b, 0x62,
	0x61, 0x63, 0x6b, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x74, 0x61, 0x73, 0x6b,
	0x5f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x53,
	0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
	0x52, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
	0x12, 0x2b, 0x0a, 0x11, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x73,
	0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x77, 0x61,
	0x72, 0x6d, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x4b, 0x0a,
	0x11, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43,
	0x66, 0x67, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
	0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2a, 0x62, 0x0a, 0x0e, 0x4d, 0x6f,
	0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10,
	0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47,
	0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x4f, 0x54, 0x5f, 0x43,
	0x4f, 0x55, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x41, 0x58, 0x5f, 0x50, 0x45,
	0x4e, 0x44, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x41, 0x53,
	0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x03, 0x42, 0x36,
	0x5a, 0x34, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66,
	0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_dut_tracking_proto_rawDescOnce sync.Once
	file_chromiumos_dut_tracking_proto_rawDescData = file_chromiumos_dut_tracking_proto_rawDesc
)

func file_chromiumos_dut_tracking_proto_rawDescGZIP() []byte {
	file_chromiumos_dut_tracking_proto_rawDescOnce.Do(func() {
		file_chromiumos_dut_tracking_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_dut_tracking_proto_rawDescData)
	})
	return file_chromiumos_dut_tracking_proto_rawDescData
}

var file_chromiumos_dut_tracking_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_chromiumos_dut_tracking_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_chromiumos_dut_tracking_proto_goTypes = []interface{}{
	(MonitoringMode)(0),       // 0: chromiumos.MonitoringMode
	(*TrackingPolicy)(nil),    // 1: chromiumos.TrackingPolicy
	(*TrackingPolicyCfg)(nil), // 2: chromiumos.TrackingPolicyCfg
	(*SwarmingDimension)(nil), // 3: chromiumos.SwarmingDimension
}
var file_chromiumos_dut_tracking_proto_depIdxs = []int32{
	3, // 0: chromiumos.TrackingPolicy.dimensions:type_name -> chromiumos.SwarmingDimension
	0, // 1: chromiumos.TrackingPolicy.modes:type_name -> chromiumos.MonitoringMode
	3, // 2: chromiumos.TrackingPolicy.task_dimensions:type_name -> chromiumos.SwarmingDimension
	1, // 3: chromiumos.TrackingPolicyCfg.policies:type_name -> chromiumos.TrackingPolicy
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_chromiumos_dut_tracking_proto_init() }
func file_chromiumos_dut_tracking_proto_init() {
	if File_chromiumos_dut_tracking_proto != nil {
		return
	}
	file_chromiumos_bot_scaling_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_dut_tracking_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TrackingPolicy); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_dut_tracking_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TrackingPolicyCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromiumos_dut_tracking_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_dut_tracking_proto_goTypes,
		DependencyIndexes: file_chromiumos_dut_tracking_proto_depIdxs,
		EnumInfos:         file_chromiumos_dut_tracking_proto_enumTypes,
		MessageInfos:      file_chromiumos_dut_tracking_proto_msgTypes,
	}.Build()
	File_chromiumos_dut_tracking_proto = out.File
	file_chromiumos_dut_tracking_proto_rawDesc = nil
	file_chromiumos_dut_tracking_proto_goTypes = nil
	file_chromiumos_dut_tracking_proto_depIdxs = nil
}
