// 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.

// WARNING: DO NOT USE these protos outside of suite scheduler. This is
// only intended to help the transition to starlark configs. It will
// be deprecated once the new replacement is in place.

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

package testplans

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)
)

// Branches that can be targeted.
type Branch int32

const (
	Branch_BRANCH_UNSPECIFIED Branch = 0
	// Canary Branch or ToT.
	Branch_CANARY Branch = 1
	// Dev Branch or ToT-1.
	Branch_DEV Branch = 2
	// Beta Branch or ToT-2.
	Branch_BETA Branch = 3
	// Stable Branch or ToT-3.
	Branch_STABLE Branch = 4
)

// Enum value maps for Branch.
var (
	Branch_name = map[int32]string{
		0: "BRANCH_UNSPECIFIED",
		1: "CANARY",
		2: "DEV",
		3: "BETA",
		4: "STABLE",
	}
	Branch_value = map[string]int32{
		"BRANCH_UNSPECIFIED": 0,
		"CANARY":             1,
		"DEV":                2,
		"BETA":               3,
		"STABLE":             4,
	}
)

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

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

func (Branch) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_suite_scheduler_proto_enumTypes[0].Descriptor()
}

func (Branch) Type() protoreflect.EnumType {
	return &file_testplans_suite_scheduler_proto_enumTypes[0]
}

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

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

// Whether to use firmware from ToT or firmware branch.
type SchedulerConfig_FirmwareBranch int32

const (
	SchedulerConfig_UNSPECIFIED SchedulerConfig_FirmwareBranch = 0
	// ToT branch.
	SchedulerConfig_CROS SchedulerConfig_FirmwareBranch = 1
	// Firmware branch.
	SchedulerConfig_FIRMWARE SchedulerConfig_FirmwareBranch = 2
)

// Enum value maps for SchedulerConfig_FirmwareBranch.
var (
	SchedulerConfig_FirmwareBranch_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "CROS",
		2: "FIRMWARE",
	}
	SchedulerConfig_FirmwareBranch_value = map[string]int32{
		"UNSPECIFIED": 0,
		"CROS":        1,
		"FIRMWARE":    2,
	}
)

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

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

func (SchedulerConfig_FirmwareBranch) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_suite_scheduler_proto_enumTypes[1].Descriptor()
}

func (SchedulerConfig_FirmwareBranch) Type() protoreflect.EnumType {
	return &file_testplans_suite_scheduler_proto_enumTypes[1]
}

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

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

type SchedulerConfig_TriggerType int32

const (
	// Trigger test whenever there is a new build for the primary board.
	SchedulerConfig_PRIMARY SchedulerConfig_TriggerType = 0
	// Trigger test when every board in the group has a new build.
	SchedulerConfig_ALL SchedulerConfig_TriggerType = 1
)

// Enum value maps for SchedulerConfig_TriggerType.
var (
	SchedulerConfig_TriggerType_name = map[int32]string{
		0: "PRIMARY",
		1: "ALL",
	}
	SchedulerConfig_TriggerType_value = map[string]int32{
		"PRIMARY": 0,
		"ALL":     1,
	}
)

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

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

func (SchedulerConfig_TriggerType) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_suite_scheduler_proto_enumTypes[2].Descriptor()
}

func (SchedulerConfig_TriggerType) Type() protoreflect.EnumType {
	return &file_testplans_suite_scheduler_proto_enumTypes[2]
}

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

// Deprecated: Use SchedulerConfig_TriggerType.Descriptor instead.
func (SchedulerConfig_TriggerType) EnumDescriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 1}
}

// LaunchProfile defines how often the suite is launched.
type SchedulerConfig_LaunchCriteria_LaunchProfile int32

const (
	SchedulerConfig_LaunchCriteria_UNSPECIFIED SchedulerConfig_LaunchCriteria_LaunchProfile = 0
	// Run on every new release build of the boards/variants targeted.
	SchedulerConfig_LaunchCriteria_NEW_BUILD SchedulerConfig_LaunchCriteria_LaunchProfile = 1
	// Run once a day at the specified hour. Used to be "NIGHTLY".
	SchedulerConfig_LaunchCriteria_DAILY SchedulerConfig_LaunchCriteria_LaunchProfile = 2
	// Run once a week at the specified time.
	SchedulerConfig_LaunchCriteria_WEEKLY SchedulerConfig_LaunchCriteria_LaunchProfile = 3
	// NOT SUPPORTED. Will be supported in the redesign.
	SchedulerConfig_LaunchCriteria_CRON_BASED SchedulerConfig_LaunchCriteria_LaunchProfile = 4
)

// Enum value maps for SchedulerConfig_LaunchCriteria_LaunchProfile.
var (
	SchedulerConfig_LaunchCriteria_LaunchProfile_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "NEW_BUILD",
		2: "DAILY",
		3: "WEEKLY",
		4: "CRON_BASED",
	}
	SchedulerConfig_LaunchCriteria_LaunchProfile_value = map[string]int32{
		"UNSPECIFIED": 0,
		"NEW_BUILD":   1,
		"DAILY":       2,
		"WEEKLY":      3,
		"CRON_BASED":  4,
	}
)

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

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

func (SchedulerConfig_LaunchCriteria_LaunchProfile) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_suite_scheduler_proto_enumTypes[3].Descriptor()
}

func (SchedulerConfig_LaunchCriteria_LaunchProfile) Type() protoreflect.EnumType {
	return &file_testplans_suite_scheduler_proto_enumTypes[3]
}

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

// Deprecated: Use SchedulerConfig_LaunchCriteria_LaunchProfile.Descriptor instead.
func (SchedulerConfig_LaunchCriteria_LaunchProfile) EnumDescriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 1, 0}
}

// Defines a board, its variants and its models.
type Board struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the board. Eg: eve.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// List of variants assiciated with the board.
	// This should only be the suffixes. Eg: ['-kernelnext'].
	Variants []string `protobuf:"bytes,2,rep,name=variants,proto3" json:"variants,omitempty"`
	// List of models of the boards to test on.
	Models []string `protobuf:"bytes,3,rep,name=models,proto3" json:"models,omitempty"`
}

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

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

func (*Board) ProtoMessage() {}

func (x *Board) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_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 Board.ProtoReflect.Descriptor instead.
func (*Board) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{0}
}

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

func (x *Board) GetVariants() []string {
	if x != nil {
		return x.Variants
	}
	return nil
}

func (x *Board) GetModels() []string {
	if x != nil {
		return x.Models
	}
	return nil
}

// Aims to reflect data in lab_config.ini.
type LabConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of board definitions.
	Boards []*Board `protobuf:"bytes,1,rep,name=boards,proto3" json:"boards,omitempty"`
}

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

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

func (*LabConfig) ProtoMessage() {}

func (x *LabConfig) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_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 LabConfig.ProtoReflect.Descriptor instead.
func (*LabConfig) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{1}
}

func (x *LabConfig) GetBoards() []*Board {
	if x != nil {
		return x.Boards
	}
	return nil
}

// Specify a Board and Variant pair.
type BoardVariant struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Board   string `protobuf:"bytes,1,opt,name=board,proto3" json:"board,omitempty"`
	Variant string `protobuf:"bytes,2,opt,name=variant,proto3" json:"variant,omitempty"`
}

func (x *BoardVariant) Reset() {
	*x = BoardVariant{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BoardVariant) ProtoMessage() {}

func (x *BoardVariant) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[2]
	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 BoardVariant.ProtoReflect.Descriptor instead.
func (*BoardVariant) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{2}
}

func (x *BoardVariant) GetBoard() string {
	if x != nil {
		return x.Board
	}
	return ""
}

func (x *BoardVariant) GetVariant() string {
	if x != nil {
		return x.Variant
	}
	return ""
}

// Most fields are the same as suite_scheduler.ini just better organized.
// The entries will be used to generate a suite_scheduler.ini in starlark scripts.
type SchedulerConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the config. Needs to be unique.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Name of the suite to run.
	Suite          string                          `protobuf:"bytes,2,opt,name=suite,proto3" json:"suite,omitempty"`
	Contacts       []*SchedulerConfig_Contact      `protobuf:"bytes,3,rep,name=contacts,proto3" json:"contacts,omitempty"`
	LaunchCriteria *SchedulerConfig_LaunchCriteria `protobuf:"bytes,4,opt,name=launch_criteria,json=launchCriteria,proto3" json:"launch_criteria,omitempty"`
	// Branches to target.
	Branches            []Branch                       `protobuf:"varint,5,rep,packed,name=branches,proto3,enum=testplans.Branch" json:"branches,omitempty"`
	TargetOptions       *SchedulerConfig_TargetOptions `protobuf:"bytes,6,opt,name=target_options,json=targetOptions,proto3" json:"target_options,omitempty"`
	PoolOptions         *SchedulerConfig_PoolOptions   `protobuf:"bytes,7,opt,name=pool_options,json=poolOptions,proto3" json:"pool_options,omitempty"`
	FirmwareRoBuildSpec SchedulerConfig_FirmwareBranch `protobuf:"varint,8,opt,name=firmware_ro_build_spec,json=firmwareRoBuildSpec,proto3,enum=testplans.SchedulerConfig_FirmwareBranch" json:"firmware_ro_build_spec,omitempty"`
	RunOptions          *SchedulerConfig_RunOptions    `protobuf:"bytes,9,opt,name=run_options,json=runOptions,proto3" json:"run_options,omitempty"`
	// Name of the config, used for analytics. Does not have to be unique.
	AnalyticsName string `protobuf:"bytes,10,opt,name=analytics_name,json=analyticsName,proto3" json:"analytics_name,omitempty"`
}

func (x *SchedulerConfig) Reset() {
	*x = SchedulerConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SchedulerConfig) ProtoMessage() {}

func (x *SchedulerConfig) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[3]
	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 SchedulerConfig.ProtoReflect.Descriptor instead.
func (*SchedulerConfig) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3}
}

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

func (x *SchedulerConfig) GetSuite() string {
	if x != nil {
		return x.Suite
	}
	return ""
}

func (x *SchedulerConfig) GetContacts() []*SchedulerConfig_Contact {
	if x != nil {
		return x.Contacts
	}
	return nil
}

func (x *SchedulerConfig) GetLaunchCriteria() *SchedulerConfig_LaunchCriteria {
	if x != nil {
		return x.LaunchCriteria
	}
	return nil
}

func (x *SchedulerConfig) GetBranches() []Branch {
	if x != nil {
		return x.Branches
	}
	return nil
}

func (x *SchedulerConfig) GetTargetOptions() *SchedulerConfig_TargetOptions {
	if x != nil {
		return x.TargetOptions
	}
	return nil
}

func (x *SchedulerConfig) GetPoolOptions() *SchedulerConfig_PoolOptions {
	if x != nil {
		return x.PoolOptions
	}
	return nil
}

func (x *SchedulerConfig) GetFirmwareRoBuildSpec() SchedulerConfig_FirmwareBranch {
	if x != nil {
		return x.FirmwareRoBuildSpec
	}
	return SchedulerConfig_UNSPECIFIED
}

func (x *SchedulerConfig) GetRunOptions() *SchedulerConfig_RunOptions {
	if x != nil {
		return x.RunOptions
	}
	return nil
}

func (x *SchedulerConfig) GetAnalyticsName() string {
	if x != nil {
		return x.AnalyticsName
	}
	return ""
}

// A proto to contain all the configs.
type SchedulerCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Configs []*SchedulerConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"`
}

func (x *SchedulerCfg) Reset() {
	*x = SchedulerCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SchedulerCfg) ProtoMessage() {}

func (x *SchedulerCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[4]
	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 SchedulerCfg.ProtoReflect.Descriptor instead.
func (*SchedulerCfg) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{4}
}

func (x *SchedulerCfg) GetConfigs() []*SchedulerConfig {
	if x != nil {
		return x.Configs
	}
	return nil
}

// Contact emails will one day be paged in case of problems with the config.
type SchedulerConfig_Contact struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"`
}

func (x *SchedulerConfig_Contact) Reset() {
	*x = SchedulerConfig_Contact{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SchedulerConfig_Contact) ProtoMessage() {}

func (x *SchedulerConfig_Contact) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[5]
	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 SchedulerConfig_Contact.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_Contact) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 0}
}

func (x *SchedulerConfig_Contact) GetEmail() string {
	if x != nil {
		return x.Email
	}
	return ""
}

// LaunchCriteria specifies when the suite should be launched.
type SchedulerConfig_LaunchCriteria struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	LaunchProfile SchedulerConfig_LaunchCriteria_LaunchProfile `protobuf:"varint,1,opt,name=launch_profile,json=launchProfile,proto3,enum=testplans.SchedulerConfig_LaunchCriteria_LaunchProfile" json:"launch_profile,omitempty"`
	// Hour at which to run. Needs to be specified for nightly and weekly profiles.
	// Has to be [0, 23].
	Hour int32 `protobuf:"varint,2,opt,name=hour,proto3" json:"hour,omitempty"`
	// Day on which to run. Needs to be specified for weekly profile.
	// Has to be [0, 6].
	Day int32 `protobuf:"varint,3,opt,name=day,proto3" json:"day,omitempty"`
	// NOT SUPPORTED. Cron compatible schedule eg: "* * 1,3,5 * *".
	CronSchedule string `protobuf:"bytes,4,opt,name=cron_schedule,json=cronSchedule,proto3" json:"cron_schedule,omitempty"`
}

func (x *SchedulerConfig_LaunchCriteria) Reset() {
	*x = SchedulerConfig_LaunchCriteria{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SchedulerConfig_LaunchCriteria) ProtoMessage() {}

func (x *SchedulerConfig_LaunchCriteria) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[6]
	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 SchedulerConfig_LaunchCriteria.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_LaunchCriteria) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 1}
}

func (x *SchedulerConfig_LaunchCriteria) GetLaunchProfile() SchedulerConfig_LaunchCriteria_LaunchProfile {
	if x != nil {
		return x.LaunchProfile
	}
	return SchedulerConfig_LaunchCriteria_UNSPECIFIED
}

func (x *SchedulerConfig_LaunchCriteria) GetHour() int32 {
	if x != nil {
		return x.Hour
	}
	return 0
}

func (x *SchedulerConfig_LaunchCriteria) GetDay() int32 {
	if x != nil {
		return x.Day
	}
	return 0
}

func (x *SchedulerConfig_LaunchCriteria) GetCronSchedule() string {
	if x != nil {
		return x.CronSchedule
	}
	return ""
}

// Set of boards, variants and models to target.
type SchedulerConfig_TargetOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Use at the most one among the two fields below. If boards_list is empty,
	// all boards are targeted. exclude_boards will exclude those boards from
	// the all boards list.
	BoardsList    []string `protobuf:"bytes,1,rep,name=boards_list,json=boardsList,proto3" json:"boards_list,omitempty"`
	ExcludeBoards []string `protobuf:"bytes,2,rep,name=exclude_boards,json=excludeBoards,proto3" json:"exclude_boards,omitempty"`
	// To specify variants, either all variants can be skipped.
	SkipVariants bool `protobuf:"varint,8,opt,name=skip_variants,json=skipVariants,proto3" json:"skip_variants,omitempty"`
	// OR use at the most one among the two fields below. If variants_list is empty,
	// all variants are targeted. exclude_variants will exclude those variants
	// from the all variants list.
	VariantsList    []*BoardVariant `protobuf:"bytes,3,rep,name=variants_list,json=variantsList,proto3" json:"variants_list,omitempty"`
	ExcludeVariants []*BoardVariant `protobuf:"bytes,4,rep,name=exclude_variants,json=excludeVariants,proto3" json:"exclude_variants,omitempty"`
	// There's two ways of specifying models. If all of these fields are empty,
	// all possible models are targeted.
	// Models to be targeted can be listed explicitly in models_list.
	ModelsList []string `protobuf:"bytes,5,rep,name=models_list,json=modelsList,proto3" json:"models_list,omitempty"`
	// OR start with the complete list and exclude some specific models.
	// any_model only tests the suite on a single model.
	AnyModel      bool     `protobuf:"varint,6,opt,name=any_model,json=anyModel,proto3" json:"any_model,omitempty"`
	ExcludeModels []string `protobuf:"bytes,7,rep,name=exclude_models,json=excludeModels,proto3" json:"exclude_models,omitempty"`
}

func (x *SchedulerConfig_TargetOptions) Reset() {
	*x = SchedulerConfig_TargetOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SchedulerConfig_TargetOptions) ProtoMessage() {}

func (x *SchedulerConfig_TargetOptions) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[7]
	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 SchedulerConfig_TargetOptions.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_TargetOptions) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 2}
}

func (x *SchedulerConfig_TargetOptions) GetBoardsList() []string {
	if x != nil {
		return x.BoardsList
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetExcludeBoards() []string {
	if x != nil {
		return x.ExcludeBoards
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetSkipVariants() bool {
	if x != nil {
		return x.SkipVariants
	}
	return false
}

func (x *SchedulerConfig_TargetOptions) GetVariantsList() []*BoardVariant {
	if x != nil {
		return x.VariantsList
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetExcludeVariants() []*BoardVariant {
	if x != nil {
		return x.ExcludeVariants
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetModelsList() []string {
	if x != nil {
		return x.ModelsList
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetAnyModel() bool {
	if x != nil {
		return x.AnyModel
	}
	return false
}

func (x *SchedulerConfig_TargetOptions) GetExcludeModels() []string {
	if x != nil {
		return x.ExcludeModels
	}
	return nil
}

// Aggregate of options related to DUT pool.
type SchedulerConfig_PoolOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Quota Scheduler account to use.
	QsAccount string `protobuf:"bytes,1,opt,name=qs_account,json=qsAccount,proto3" json:"qs_account,omitempty"`
	// Pool to schedule on.
	Pool string `protobuf:"bytes,2,opt,name=pool,proto3" json:"pool,omitempty"`
	// Integer priority to assign. Only used by CTS. Quota scheduler takes care of
	// priorities for the rest. Has to be [20, 255].
	Priority int32 `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"`
}

func (x *SchedulerConfig_PoolOptions) Reset() {
	*x = SchedulerConfig_PoolOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SchedulerConfig_PoolOptions) ProtoMessage() {}

func (x *SchedulerConfig_PoolOptions) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[8]
	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 SchedulerConfig_PoolOptions.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_PoolOptions) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 3}
}

func (x *SchedulerConfig_PoolOptions) GetQsAccount() string {
	if x != nil {
		return x.QsAccount
	}
	return ""
}

func (x *SchedulerConfig_PoolOptions) GetPool() string {
	if x != nil {
		return x.Pool
	}
	return ""
}

func (x *SchedulerConfig_PoolOptions) GetPriority() int32 {
	if x != nil {
		return x.Priority
	}
	return 0
}

// Execution related options.
type SchedulerConfig_RunOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Whether to retry if the task fails.
	Retry      bool                                            `protobuf:"varint,1,opt,name=retry,proto3" json:"retry,omitempty"`
	Dimensions []*SchedulerConfig_RunOptions_SwarmingDimension `protobuf:"bytes,2,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
	// Timeout of the task.
	TimeoutMins int32 `protobuf:"varint,3,opt,name=timeout_mins,json=timeoutMins,proto3" json:"timeout_mins,omitempty"`
	// If sanity HW test passed, launch this test. Irrespective of the release build's
	// final status.
	OnlySanityTestRequired bool                        `protobuf:"varint,4,opt,name=only_sanity_test_required,json=onlySanityTestRequired,proto3" json:"only_sanity_test_required,omitempty"`
	TriggerType            SchedulerConfig_TriggerType `protobuf:"varint,5,opt,name=trigger_type,json=triggerType,proto3,enum=testplans.SchedulerConfig_TriggerType" json:"trigger_type,omitempty"`
}

func (x *SchedulerConfig_RunOptions) Reset() {
	*x = SchedulerConfig_RunOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SchedulerConfig_RunOptions) ProtoMessage() {}

func (x *SchedulerConfig_RunOptions) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[9]
	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 SchedulerConfig_RunOptions.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_RunOptions) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 4}
}

func (x *SchedulerConfig_RunOptions) GetRetry() bool {
	if x != nil {
		return x.Retry
	}
	return false
}

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

func (x *SchedulerConfig_RunOptions) GetTimeoutMins() int32 {
	if x != nil {
		return x.TimeoutMins
	}
	return 0
}

func (x *SchedulerConfig_RunOptions) GetOnlySanityTestRequired() bool {
	if x != nil {
		return x.OnlySanityTestRequired
	}
	return false
}

func (x *SchedulerConfig_RunOptions) GetTriggerType() SchedulerConfig_TriggerType {
	if x != nil {
		return x.TriggerType
	}
	return SchedulerConfig_PRIMARY
}

// A list of extra labels/dimensions to attach.
// Extra Swarming Dimensions that can be specified.
type SchedulerConfig_RunOptions_SwarmingDimension struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Key   string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) Reset() {
	*x = SchedulerConfig_RunOptions_SwarmingDimension{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SchedulerConfig_RunOptions_SwarmingDimension) ProtoMessage() {}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[10]
	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 SchedulerConfig_RunOptions_SwarmingDimension.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_RunOptions_SwarmingDimension) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 4, 0}
}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) GetKey() string {
	if x != nil {
		return x.Key
	}
	return ""
}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) GetValue() string {
	if x != nil {
		return x.Value
	}
	return ""
}

var File_testplans_suite_scheduler_proto protoreflect.FileDescriptor

var file_testplans_suite_scheduler_proto_rawDesc = []byte{
	0x0a, 0x1f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x73, 0x75, 0x69, 0x74,
	0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x09, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x22, 0x4f, 0x0a, 0x05,
	0x42, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x61, 0x72,
	0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x61, 0x72,
	0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18,
	0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x22, 0x35, 0x0a,
	0x09, 0x4c, 0x61, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x62, 0x6f,
	0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x06, 0x62, 0x6f,
	0x61, 0x72, 0x64, 0x73, 0x22, 0x3e, 0x0a, 0x0c, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x56, 0x61, 0x72,
	0x69, 0x61, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x61,
	0x72, 0x69, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x61, 0x72,
	0x69, 0x61, 0x6e, 0x74, 0x22, 0xa8, 0x0e, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
	0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05,
	0x73, 0x75, 0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x75, 0x69,
	0x74, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x18, 0x03,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63,
	0x74, 0x73, 0x12, 0x52, 0x0a, 0x0f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x63, 0x72, 0x69,
	0x74, 0x65, 0x72, 0x69, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x43, 0x72,
	0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x0e, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x43, 0x72,
	0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x2d, 0x0a, 0x08, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68,
	0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x08, 0x62, 0x72, 0x61,
	0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f,
	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75,
	0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6f,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
	0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x70, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x6f, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x73, 0x12, 0x5e, 0x0a, 0x16, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x72, 0x6f,
	0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63,
	0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x13, 0x66, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x6f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x70, 0x65,
	0x63, 0x12, 0x46, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61,
	0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x72,
	0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6e, 0x61,
	0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0d, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x4e, 0x61, 0x6d, 0x65,
	0x1a, 0x1f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65,
	0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69,
	0x6c, 0x1a, 0x93, 0x02, 0x0a, 0x0e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74,
	0x65, 0x72, 0x69, 0x61, 0x12, 0x5e, 0x0a, 0x0e, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x70,
	0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
	0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x43,
	0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x72,
	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f,
	0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x05, 0x52, 0x04, 0x68, 0x6f, 0x75, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x64, 0x61, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72,
	0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22,
	0x56, 0x0a, 0x0d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,
	0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
	0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x45, 0x57, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x01,
	0x12, 0x09, 0x0a, 0x05, 0x44, 0x41, 0x49, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x57,
	0x45, 0x45, 0x4b, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x52, 0x4f, 0x4e, 0x5f,
	0x42, 0x41, 0x53, 0x45, 0x44, 0x10, 0x04, 0x1a, 0xe3, 0x02, 0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6f, 0x61,
	0x72, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a,
	0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78,
	0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03,
	0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x6f, 0x61, 0x72, 0x64,
	0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e,
	0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x56, 0x61,
	0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e,
	0x74, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x56,
	0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x0c, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73,
	0x4c, 0x69, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f,
	0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x42, 0x6f, 0x61, 0x72, 0x64,
	0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65,
	0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x65,
	0x6c, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d,
	0x6f, 0x64, 0x65, 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6e, 0x79,
	0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x6e,
	0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64,
	0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d,
	0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x1a, 0x5c, 0x0a,
	0x0b, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a,
	0x71, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x09, 0x71, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70,
	0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12,
	0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x1a, 0xe1, 0x02, 0x0a, 0x0a,
	0x52, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65,
	0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79,
	0x12, 0x57, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x52, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 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, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d,
	0x65, 0x6f, 0x75, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52,
	0x0b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x69, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x19,
	0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x16, 0x6f, 0x6e, 0x6c, 0x79, 0x53, 0x61, 0x6e, 0x69, 0x74, 0x79, 0x54, 0x65, 0x73, 0x74, 0x52,
	0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67,
	0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75,
	0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65,
	0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79,
	0x70, 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x53, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x44, 0x69,
	0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,
	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22,
	0x39, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63,
	0x68, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
	0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x52, 0x4f, 0x53, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08,
	0x46, 0x49, 0x52, 0x4d, 0x57, 0x41, 0x52, 0x45, 0x10, 0x02, 0x22, 0x23, 0x0a, 0x0b, 0x54, 0x72,
	0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x49,
	0x4d, 0x41, 0x52, 0x59, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x22,
	0x44, 0x0a, 0x0c, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x66, 0x67, 0x12,
	0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x1a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68,
	0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x73, 0x2a, 0x4b, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12,
	0x16, 0x0a, 0x12, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x41, 0x4e, 0x41, 0x52,
	0x59, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x45, 0x56, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04,
	0x42, 0x45, 0x54, 0x41, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45,
	0x10, 0x04, 0x42, 0x35, 0x5a, 0x33, 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,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_testplans_suite_scheduler_proto_rawDescOnce sync.Once
	file_testplans_suite_scheduler_proto_rawDescData = file_testplans_suite_scheduler_proto_rawDesc
)

func file_testplans_suite_scheduler_proto_rawDescGZIP() []byte {
	file_testplans_suite_scheduler_proto_rawDescOnce.Do(func() {
		file_testplans_suite_scheduler_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_suite_scheduler_proto_rawDescData)
	})
	return file_testplans_suite_scheduler_proto_rawDescData
}

var file_testplans_suite_scheduler_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
var file_testplans_suite_scheduler_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
var file_testplans_suite_scheduler_proto_goTypes = []interface{}{
	(Branch)(0),                                          // 0: testplans.Branch
	(SchedulerConfig_FirmwareBranch)(0),                  // 1: testplans.SchedulerConfig.FirmwareBranch
	(SchedulerConfig_TriggerType)(0),                     // 2: testplans.SchedulerConfig.TriggerType
	(SchedulerConfig_LaunchCriteria_LaunchProfile)(0),    // 3: testplans.SchedulerConfig.LaunchCriteria.LaunchProfile
	(*Board)(nil),                                        // 4: testplans.Board
	(*LabConfig)(nil),                                    // 5: testplans.LabConfig
	(*BoardVariant)(nil),                                 // 6: testplans.BoardVariant
	(*SchedulerConfig)(nil),                              // 7: testplans.SchedulerConfig
	(*SchedulerCfg)(nil),                                 // 8: testplans.SchedulerCfg
	(*SchedulerConfig_Contact)(nil),                      // 9: testplans.SchedulerConfig.Contact
	(*SchedulerConfig_LaunchCriteria)(nil),               // 10: testplans.SchedulerConfig.LaunchCriteria
	(*SchedulerConfig_TargetOptions)(nil),                // 11: testplans.SchedulerConfig.TargetOptions
	(*SchedulerConfig_PoolOptions)(nil),                  // 12: testplans.SchedulerConfig.PoolOptions
	(*SchedulerConfig_RunOptions)(nil),                   // 13: testplans.SchedulerConfig.RunOptions
	(*SchedulerConfig_RunOptions_SwarmingDimension)(nil), // 14: testplans.SchedulerConfig.RunOptions.SwarmingDimension
}
var file_testplans_suite_scheduler_proto_depIdxs = []int32{
	4,  // 0: testplans.LabConfig.boards:type_name -> testplans.Board
	9,  // 1: testplans.SchedulerConfig.contacts:type_name -> testplans.SchedulerConfig.Contact
	10, // 2: testplans.SchedulerConfig.launch_criteria:type_name -> testplans.SchedulerConfig.LaunchCriteria
	0,  // 3: testplans.SchedulerConfig.branches:type_name -> testplans.Branch
	11, // 4: testplans.SchedulerConfig.target_options:type_name -> testplans.SchedulerConfig.TargetOptions
	12, // 5: testplans.SchedulerConfig.pool_options:type_name -> testplans.SchedulerConfig.PoolOptions
	1,  // 6: testplans.SchedulerConfig.firmware_ro_build_spec:type_name -> testplans.SchedulerConfig.FirmwareBranch
	13, // 7: testplans.SchedulerConfig.run_options:type_name -> testplans.SchedulerConfig.RunOptions
	7,  // 8: testplans.SchedulerCfg.configs:type_name -> testplans.SchedulerConfig
	3,  // 9: testplans.SchedulerConfig.LaunchCriteria.launch_profile:type_name -> testplans.SchedulerConfig.LaunchCriteria.LaunchProfile
	6,  // 10: testplans.SchedulerConfig.TargetOptions.variants_list:type_name -> testplans.BoardVariant
	6,  // 11: testplans.SchedulerConfig.TargetOptions.exclude_variants:type_name -> testplans.BoardVariant
	14, // 12: testplans.SchedulerConfig.RunOptions.dimensions:type_name -> testplans.SchedulerConfig.RunOptions.SwarmingDimension
	2,  // 13: testplans.SchedulerConfig.RunOptions.trigger_type:type_name -> testplans.SchedulerConfig.TriggerType
	14, // [14:14] is the sub-list for method output_type
	14, // [14:14] is the sub-list for method input_type
	14, // [14:14] is the sub-list for extension type_name
	14, // [14:14] is the sub-list for extension extendee
	0,  // [0:14] is the sub-list for field type_name
}

func init() { file_testplans_suite_scheduler_proto_init() }
func file_testplans_suite_scheduler_proto_init() {
	if File_testplans_suite_scheduler_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_testplans_suite_scheduler_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Board); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LabConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BoardVariant); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_Contact); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_LaunchCriteria); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_TargetOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_PoolOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_RunOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_RunOptions_SwarmingDimension); 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_testplans_suite_scheduler_proto_rawDesc,
			NumEnums:      4,
			NumMessages:   11,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_suite_scheduler_proto_goTypes,
		DependencyIndexes: file_testplans_suite_scheduler_proto_depIdxs,
		EnumInfos:         file_testplans_suite_scheduler_proto_enumTypes,
		MessageInfos:      file_testplans_suite_scheduler_proto_msgTypes,
	}.Build()
	File_testplans_suite_scheduler_proto = out.File
	file_testplans_suite_scheduler_proto_rawDesc = nil
	file_testplans_suite_scheduler_proto_goTypes = nil
	file_testplans_suite_scheduler_proto_depIdxs = nil
}
