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

// 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[2].Descriptor()
}

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

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"`
	// The options are primary and all, which indicate whether we want to trigger this test
	// whenever there is a new build for the primary board or only run the test when
	// every board in a group has a new build.
	TriggerType string `protobuf:"bytes,5,opt,name=trigger_type,json=triggerType,proto3" 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() string {
	if x != nil {
		return x.TriggerType
	}
	return ""
}

// 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, 0xdb, 0x0d, 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, 0xb9, 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, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67,
	0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 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, 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, 3)
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_LaunchCriteria_LaunchProfile)(0),    // 2: testplans.SchedulerConfig.LaunchCriteria.LaunchProfile
	(*Board)(nil),                                        // 3: testplans.Board
	(*LabConfig)(nil),                                    // 4: testplans.LabConfig
	(*BoardVariant)(nil),                                 // 5: testplans.BoardVariant
	(*SchedulerConfig)(nil),                              // 6: testplans.SchedulerConfig
	(*SchedulerCfg)(nil),                                 // 7: testplans.SchedulerCfg
	(*SchedulerConfig_Contact)(nil),                      // 8: testplans.SchedulerConfig.Contact
	(*SchedulerConfig_LaunchCriteria)(nil),               // 9: testplans.SchedulerConfig.LaunchCriteria
	(*SchedulerConfig_TargetOptions)(nil),                // 10: testplans.SchedulerConfig.TargetOptions
	(*SchedulerConfig_PoolOptions)(nil),                  // 11: testplans.SchedulerConfig.PoolOptions
	(*SchedulerConfig_RunOptions)(nil),                   // 12: testplans.SchedulerConfig.RunOptions
	(*SchedulerConfig_RunOptions_SwarmingDimension)(nil), // 13: testplans.SchedulerConfig.RunOptions.SwarmingDimension
}
var file_testplans_suite_scheduler_proto_depIdxs = []int32{
	3,  // 0: testplans.LabConfig.boards:type_name -> testplans.Board
	8,  // 1: testplans.SchedulerConfig.contacts:type_name -> testplans.SchedulerConfig.Contact
	9,  // 2: testplans.SchedulerConfig.launch_criteria:type_name -> testplans.SchedulerConfig.LaunchCriteria
	0,  // 3: testplans.SchedulerConfig.branches:type_name -> testplans.Branch
	10, // 4: testplans.SchedulerConfig.target_options:type_name -> testplans.SchedulerConfig.TargetOptions
	11, // 5: testplans.SchedulerConfig.pool_options:type_name -> testplans.SchedulerConfig.PoolOptions
	1,  // 6: testplans.SchedulerConfig.firmware_ro_build_spec:type_name -> testplans.SchedulerConfig.FirmwareBranch
	12, // 7: testplans.SchedulerConfig.run_options:type_name -> testplans.SchedulerConfig.RunOptions
	6,  // 8: testplans.SchedulerCfg.configs:type_name -> testplans.SchedulerConfig
	2,  // 9: testplans.SchedulerConfig.LaunchCriteria.launch_profile:type_name -> testplans.SchedulerConfig.LaunchCriteria.LaunchProfile
	5,  // 10: testplans.SchedulerConfig.TargetOptions.variants_list:type_name -> testplans.BoardVariant
	5,  // 11: testplans.SchedulerConfig.TargetOptions.exclude_variants:type_name -> testplans.BoardVariant
	13, // 12: testplans.SchedulerConfig.RunOptions.dimensions:type_name -> testplans.SchedulerConfig.RunOptions.SwarmingDimension
	13, // [13:13] is the sub-list for method output_type
	13, // [13:13] is the sub-list for method input_type
	13, // [13:13] is the sub-list for extension type_name
	13, // [13:13] is the sub-list for extension extendee
	0,  // [0:13] 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:      3,
			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
}
