// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/suite_scheduler/analytics.proto

package suite_scheduler

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	api "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	device "go.chromium.org/chromiumos/infra/proto/go/device"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type BranchFilter_Channel int32

const (
	BranchFilter_BRANCH_REF_NOT_SET BranchFilter_Channel = 0
	BranchFilter_MASTER             BranchFilter_Channel = 1
	BranchFilter_DEV                BranchFilter_Channel = 2
	BranchFilter_BETA               BranchFilter_Channel = 3
	BranchFilter_STABLE             BranchFilter_Channel = 4
)

var BranchFilter_Channel_name = map[int32]string{
	0: "BRANCH_REF_NOT_SET",
	1: "MASTER",
	2: "DEV",
	3: "BETA",
	4: "STABLE",
}

var BranchFilter_Channel_value = map[string]int32{
	"BRANCH_REF_NOT_SET": 0,
	"MASTER":             1,
	"DEV":                2,
	"BETA":               3,
	"STABLE":             4,
}

func (x BranchFilter_Channel) String() string {
	return proto.EnumName(BranchFilter_Channel_name, int32(x))
}

func (BranchFilter_Channel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{2, 0}
}

type BranchFilter_Operator int32

const (
	BranchFilter_UNDEFINED BranchFilter_Operator = 0
	BranchFilter_EQ        BranchFilter_Operator = 1
	BranchFilter_GE        BranchFilter_Operator = 2
	BranchFilter_LE        BranchFilter_Operator = 3
)

var BranchFilter_Operator_name = map[int32]string{
	0: "UNDEFINED",
	1: "EQ",
	2: "GE",
	3: "LE",
}

var BranchFilter_Operator_value = map[string]int32{
	"UNDEFINED": 0,
	"EQ":        1,
	"GE":        2,
	"LE":        3,
}

func (x BranchFilter_Operator) String() string {
	return proto.EnumName(BranchFilter_Operator_name, int32(x))
}

func (BranchFilter_Operator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{2, 1}
}

// The build information queried from BuildBucket DB.
type BuildInfo struct {
	// The name of the build target (a.k.a. board name), e.g., "gale", "eve".
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The milestone number (e.g. 73).
	Milestone uint32 `protobuf:"varint,2,opt,name=milestone,proto3" json:"milestone,omitempty"`
	// The chrome os version (e.g. "12240.0.0" or "").
	ChromeOsVersion string `protobuf:"bytes,3,opt,name=chrome_os_version,json=chromeOsVersion,proto3" json:"chrome_os_version,omitempty"`
	// Build type with the board name as the prefix, e.g.
	// "RELEASE" or "FIRMWARE".
	Type                 chromiumos.Branch_BranchType `protobuf:"varint,4,opt,name=type,proto3,enum=chromiumos.Branch_BranchType" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *BuildInfo) Reset()         { *m = BuildInfo{} }
func (m *BuildInfo) String() string { return proto.CompactTextString(m) }
func (*BuildInfo) ProtoMessage()    {}
func (*BuildInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{0}
}

func (m *BuildInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildInfo.Unmarshal(m, b)
}
func (m *BuildInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildInfo.Marshal(b, m, deterministic)
}
func (m *BuildInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildInfo.Merge(m, src)
}
func (m *BuildInfo) XXX_Size() int {
	return xxx_messageInfo_BuildInfo.Size(m)
}
func (m *BuildInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildInfo.DiscardUnknown(m)
}

var xxx_messageInfo_BuildInfo proto.InternalMessageInfo

func (m *BuildInfo) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *BuildInfo) GetMilestone() uint32 {
	if m != nil {
		return m.Milestone
	}
	return 0
}

func (m *BuildInfo) GetChromeOsVersion() string {
	if m != nil {
		return m.ChromeOsVersion
	}
	return ""
}

func (m *BuildInfo) GetType() chromiumos.Branch_BranchType {
	if m != nil {
		return m.Type
	}
	return chromiumos.Branch_UNSPECIFIED
}

// The firmware build information queried from BuildBucket DB.
type FirmwareBuildInfo struct {
	// Board name.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Build type, "RELEASE" or "FIRMWARE". Each has different form of
	// artifacts.
	Type chromiumos.Branch_BranchType `protobuf:"varint,2,opt,name=type,proto3,enum=chromiumos.Branch_BranchType" json:"type,omitempty"`
	// Relative path to the artifact file, e.g.
	// "firmware-board-12345.67.B-firmwarebranch/RFoo-1.0.0-b1e234567/board"
	// for firmware type or "board-release/R81-12766.0.0" for release type.
	Artifact             *api.Artifact `protobuf:"bytes,3,opt,name=artifact,proto3" json:"artifact,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *FirmwareBuildInfo) Reset()         { *m = FirmwareBuildInfo{} }
func (m *FirmwareBuildInfo) String() string { return proto.CompactTextString(m) }
func (*FirmwareBuildInfo) ProtoMessage()    {}
func (*FirmwareBuildInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{1}
}

func (m *FirmwareBuildInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FirmwareBuildInfo.Unmarshal(m, b)
}
func (m *FirmwareBuildInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FirmwareBuildInfo.Marshal(b, m, deterministic)
}
func (m *FirmwareBuildInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FirmwareBuildInfo.Merge(m, src)
}
func (m *FirmwareBuildInfo) XXX_Size() int {
	return xxx_messageInfo_FirmwareBuildInfo.Size(m)
}
func (m *FirmwareBuildInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_FirmwareBuildInfo.DiscardUnknown(m)
}

var xxx_messageInfo_FirmwareBuildInfo proto.InternalMessageInfo

func (m *FirmwareBuildInfo) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *FirmwareBuildInfo) GetType() chromiumos.Branch_BranchType {
	if m != nil {
		return m.Type
	}
	return chromiumos.Branch_UNSPECIFIED
}

func (m *FirmwareBuildInfo) GetArtifact() *api.Artifact {
	if m != nil {
		return m.Artifact
	}
	return nil
}

// BranchFilter is a combination of channel, operator and
// lag, e.g. a filter of the form ">=tot-2" is stated as
// { channel = MASTER; operator = GE; lag = 2; };
// a filter of "==tot" is translated to
// { channel = MASTER; operator = EQ; lag = 0; }.
type BranchFilter struct {
	Channel  BranchFilter_Channel  `protobuf:"varint,1,opt,name=channel,proto3,enum=test_platform.suite_scheduler.BranchFilter_Channel" json:"channel,omitempty"`
	Operator BranchFilter_Operator `protobuf:"varint,2,opt,name=operator,proto3,enum=test_platform.suite_scheduler.BranchFilter_Operator" json:"operator,omitempty"`
	// Number of minor versions behind tip-of-tree on channel.
	Lag                  int32    `protobuf:"varint,3,opt,name=lag,proto3" json:"lag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BranchFilter) Reset()         { *m = BranchFilter{} }
func (m *BranchFilter) String() string { return proto.CompactTextString(m) }
func (*BranchFilter) ProtoMessage()    {}
func (*BranchFilter) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{2}
}

func (m *BranchFilter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BranchFilter.Unmarshal(m, b)
}
func (m *BranchFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BranchFilter.Marshal(b, m, deterministic)
}
func (m *BranchFilter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BranchFilter.Merge(m, src)
}
func (m *BranchFilter) XXX_Size() int {
	return xxx_messageInfo_BranchFilter.Size(m)
}
func (m *BranchFilter) XXX_DiscardUnknown() {
	xxx_messageInfo_BranchFilter.DiscardUnknown(m)
}

var xxx_messageInfo_BranchFilter proto.InternalMessageInfo

func (m *BranchFilter) GetChannel() BranchFilter_Channel {
	if m != nil {
		return m.Channel
	}
	return BranchFilter_BRANCH_REF_NOT_SET
}

func (m *BranchFilter) GetOperator() BranchFilter_Operator {
	if m != nil {
		return m.Operator
	}
	return BranchFilter_UNDEFINED
}

func (m *BranchFilter) GetLag() int32 {
	if m != nil {
		return m.Lag
	}
	return 0
}

// BuildFilters defines on which build to run a suite test.
type BuildFilters struct {
	// If true, use the relax_builds.
	OnlyHwtestSanityRequired bool `protobuf:"varint,1,opt,name=only_hwtest_sanity_required,json=onlyHwtestSanityRequired,proto3" json:"only_hwtest_sanity_required,omitempty"`
	// BranchFilter defines the target branch of the new build.
	// Note, the final result is "AND" of each single filter.
	BranchFilters []*BranchFilter `protobuf:"bytes,2,rep,name=branch_filters,json=branchFilters,proto3" json:"branch_filters,omitempty"`
	// The firmware build type, e.g., "RELEASE" or "FIRMWARE". Note,
	// in suite scheduler, "cros" = "RELEASE".
	FirmwareRoBuildSpec  chromiumos.Branch_BranchType `protobuf:"varint,3,opt,name=firmware_ro_build_spec,json=firmwareRoBuildSpec,proto3,enum=chromiumos.Branch_BranchType" json:"firmware_ro_build_spec,omitempty"`
	FirmwareRwBuildSpec  chromiumos.Branch_BranchType `protobuf:"varint,4,opt,name=firmware_rw_build_spec,json=firmwareRwBuildSpec,proto3,enum=chromiumos.Branch_BranchType" json:"firmware_rw_build_spec,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *BuildFilters) Reset()         { *m = BuildFilters{} }
func (m *BuildFilters) String() string { return proto.CompactTextString(m) }
func (*BuildFilters) ProtoMessage()    {}
func (*BuildFilters) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{3}
}

func (m *BuildFilters) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildFilters.Unmarshal(m, b)
}
func (m *BuildFilters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildFilters.Marshal(b, m, deterministic)
}
func (m *BuildFilters) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildFilters.Merge(m, src)
}
func (m *BuildFilters) XXX_Size() int {
	return xxx_messageInfo_BuildFilters.Size(m)
}
func (m *BuildFilters) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildFilters.DiscardUnknown(m)
}

var xxx_messageInfo_BuildFilters proto.InternalMessageInfo

func (m *BuildFilters) GetOnlyHwtestSanityRequired() bool {
	if m != nil {
		return m.OnlyHwtestSanityRequired
	}
	return false
}

func (m *BuildFilters) GetBranchFilters() []*BranchFilter {
	if m != nil {
		return m.BranchFilters
	}
	return nil
}

func (m *BuildFilters) GetFirmwareRoBuildSpec() chromiumos.Branch_BranchType {
	if m != nil {
		return m.FirmwareRoBuildSpec
	}
	return chromiumos.Branch_UNSPECIFIED
}

func (m *BuildFilters) GetFirmwareRwBuildSpec() chromiumos.Branch_BranchType {
	if m != nil {
		return m.FirmwareRwBuildSpec
	}
	return chromiumos.Branch_UNSPECIFIED
}

// ScheduleJobTrigger defines the trigger to kick off a suite test.
type ScheduleJobTrigger struct {
	// Types that are valid to be assigned to Trigger:
	//	*ScheduleJobTrigger_Weekly
	//	*ScheduleJobTrigger_Nightly
	//	*ScheduleJobTrigger_Interval
	Trigger              isScheduleJobTrigger_Trigger `protobuf_oneof:"trigger"`
	BuildFilters         *BuildFilters                `protobuf:"bytes,4,opt,name=build_filters,json=buildFilters,proto3" json:"build_filters,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *ScheduleJobTrigger) Reset()         { *m = ScheduleJobTrigger{} }
func (m *ScheduleJobTrigger) String() string { return proto.CompactTextString(m) }
func (*ScheduleJobTrigger) ProtoMessage()    {}
func (*ScheduleJobTrigger) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{4}
}

func (m *ScheduleJobTrigger) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScheduleJobTrigger.Unmarshal(m, b)
}
func (m *ScheduleJobTrigger) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScheduleJobTrigger.Marshal(b, m, deterministic)
}
func (m *ScheduleJobTrigger) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScheduleJobTrigger.Merge(m, src)
}
func (m *ScheduleJobTrigger) XXX_Size() int {
	return xxx_messageInfo_ScheduleJobTrigger.Size(m)
}
func (m *ScheduleJobTrigger) XXX_DiscardUnknown() {
	xxx_messageInfo_ScheduleJobTrigger.DiscardUnknown(m)
}

var xxx_messageInfo_ScheduleJobTrigger proto.InternalMessageInfo

type isScheduleJobTrigger_Trigger interface {
	isScheduleJobTrigger_Trigger()
}

type ScheduleJobTrigger_Weekly struct {
	Weekly *ScheduleJobTrigger_WeeklyTrigger `protobuf:"bytes,1,opt,name=weekly,proto3,oneof"`
}

type ScheduleJobTrigger_Nightly struct {
	Nightly *ScheduleJobTrigger_NightlyTrigger `protobuf:"bytes,2,opt,name=nightly,proto3,oneof"`
}

type ScheduleJobTrigger_Interval struct {
	Interval *ScheduleJobTrigger_IntervalTrigger `protobuf:"bytes,3,opt,name=interval,proto3,oneof"`
}

func (*ScheduleJobTrigger_Weekly) isScheduleJobTrigger_Trigger() {}

func (*ScheduleJobTrigger_Nightly) isScheduleJobTrigger_Trigger() {}

func (*ScheduleJobTrigger_Interval) isScheduleJobTrigger_Trigger() {}

func (m *ScheduleJobTrigger) GetTrigger() isScheduleJobTrigger_Trigger {
	if m != nil {
		return m.Trigger
	}
	return nil
}

func (m *ScheduleJobTrigger) GetWeekly() *ScheduleJobTrigger_WeeklyTrigger {
	if x, ok := m.GetTrigger().(*ScheduleJobTrigger_Weekly); ok {
		return x.Weekly
	}
	return nil
}

func (m *ScheduleJobTrigger) GetNightly() *ScheduleJobTrigger_NightlyTrigger {
	if x, ok := m.GetTrigger().(*ScheduleJobTrigger_Nightly); ok {
		return x.Nightly
	}
	return nil
}

func (m *ScheduleJobTrigger) GetInterval() *ScheduleJobTrigger_IntervalTrigger {
	if x, ok := m.GetTrigger().(*ScheduleJobTrigger_Interval); ok {
		return x.Interval
	}
	return nil
}

func (m *ScheduleJobTrigger) GetBuildFilters() *BuildFilters {
	if m != nil {
		return m.BuildFilters
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ScheduleJobTrigger) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ScheduleJobTrigger_Weekly)(nil),
		(*ScheduleJobTrigger_Nightly)(nil),
		(*ScheduleJobTrigger_Interval)(nil),
	}
}

// WeeklyTrigger is for the suite test running every week.
// "day" is from 0 to 6.
type ScheduleJobTrigger_WeeklyTrigger struct {
	Day                  uint32   `protobuf:"varint,1,opt,name=day,proto3" json:"day,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScheduleJobTrigger_WeeklyTrigger) Reset()         { *m = ScheduleJobTrigger_WeeklyTrigger{} }
func (m *ScheduleJobTrigger_WeeklyTrigger) String() string { return proto.CompactTextString(m) }
func (*ScheduleJobTrigger_WeeklyTrigger) ProtoMessage()    {}
func (*ScheduleJobTrigger_WeeklyTrigger) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{4, 0}
}

func (m *ScheduleJobTrigger_WeeklyTrigger) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScheduleJobTrigger_WeeklyTrigger.Unmarshal(m, b)
}
func (m *ScheduleJobTrigger_WeeklyTrigger) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScheduleJobTrigger_WeeklyTrigger.Marshal(b, m, deterministic)
}
func (m *ScheduleJobTrigger_WeeklyTrigger) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScheduleJobTrigger_WeeklyTrigger.Merge(m, src)
}
func (m *ScheduleJobTrigger_WeeklyTrigger) XXX_Size() int {
	return xxx_messageInfo_ScheduleJobTrigger_WeeklyTrigger.Size(m)
}
func (m *ScheduleJobTrigger_WeeklyTrigger) XXX_DiscardUnknown() {
	xxx_messageInfo_ScheduleJobTrigger_WeeklyTrigger.DiscardUnknown(m)
}

var xxx_messageInfo_ScheduleJobTrigger_WeeklyTrigger proto.InternalMessageInfo

func (m *ScheduleJobTrigger_WeeklyTrigger) GetDay() uint32 {
	if m != nil {
		return m.Day
	}
	return 0
}

// NightlyTrigger is for the suite test running every day.
// "hour" is from 0 to 23.
type ScheduleJobTrigger_NightlyTrigger struct {
	Hour                 uint32   `protobuf:"varint,1,opt,name=hour,proto3" json:"hour,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScheduleJobTrigger_NightlyTrigger) Reset()         { *m = ScheduleJobTrigger_NightlyTrigger{} }
func (m *ScheduleJobTrigger_NightlyTrigger) String() string { return proto.CompactTextString(m) }
func (*ScheduleJobTrigger_NightlyTrigger) ProtoMessage()    {}
func (*ScheduleJobTrigger_NightlyTrigger) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{4, 1}
}

func (m *ScheduleJobTrigger_NightlyTrigger) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScheduleJobTrigger_NightlyTrigger.Unmarshal(m, b)
}
func (m *ScheduleJobTrigger_NightlyTrigger) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScheduleJobTrigger_NightlyTrigger.Marshal(b, m, deterministic)
}
func (m *ScheduleJobTrigger_NightlyTrigger) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScheduleJobTrigger_NightlyTrigger.Merge(m, src)
}
func (m *ScheduleJobTrigger_NightlyTrigger) XXX_Size() int {
	return xxx_messageInfo_ScheduleJobTrigger_NightlyTrigger.Size(m)
}
func (m *ScheduleJobTrigger_NightlyTrigger) XXX_DiscardUnknown() {
	xxx_messageInfo_ScheduleJobTrigger_NightlyTrigger.DiscardUnknown(m)
}

var xxx_messageInfo_ScheduleJobTrigger_NightlyTrigger proto.InternalMessageInfo

func (m *ScheduleJobTrigger_NightlyTrigger) GetHour() uint32 {
	if m != nil {
		return m.Hour
	}
	return 0
}

// IntervalTrigger is for the suite test running every N times the
// scheduler operates.
type ScheduleJobTrigger_IntervalTrigger struct {
	// pause represents the number of times scheduler skips this job
	// once the job completed. If pause is zero, we pick this job
	// whenever scheduler is kicked off.
	Pause                uint32   `protobuf:"varint,1,opt,name=pause,proto3" json:"pause,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScheduleJobTrigger_IntervalTrigger) Reset()         { *m = ScheduleJobTrigger_IntervalTrigger{} }
func (m *ScheduleJobTrigger_IntervalTrigger) String() string { return proto.CompactTextString(m) }
func (*ScheduleJobTrigger_IntervalTrigger) ProtoMessage()    {}
func (*ScheduleJobTrigger_IntervalTrigger) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{4, 2}
}

func (m *ScheduleJobTrigger_IntervalTrigger) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScheduleJobTrigger_IntervalTrigger.Unmarshal(m, b)
}
func (m *ScheduleJobTrigger_IntervalTrigger) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScheduleJobTrigger_IntervalTrigger.Marshal(b, m, deterministic)
}
func (m *ScheduleJobTrigger_IntervalTrigger) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScheduleJobTrigger_IntervalTrigger.Merge(m, src)
}
func (m *ScheduleJobTrigger_IntervalTrigger) XXX_Size() int {
	return xxx_messageInfo_ScheduleJobTrigger_IntervalTrigger.Size(m)
}
func (m *ScheduleJobTrigger_IntervalTrigger) XXX_DiscardUnknown() {
	xxx_messageInfo_ScheduleJobTrigger_IntervalTrigger.DiscardUnknown(m)
}

var xxx_messageInfo_ScheduleJobTrigger_IntervalTrigger proto.InternalMessageInfo

func (m *ScheduleJobTrigger_IntervalTrigger) GetPause() uint32 {
	if m != nil {
		return m.Pause
	}
	return 0
}

// ScheduleJob represents the schedule result for a specific board
// and model.
type ScheduleJob struct {
	// Model.
	Model *device.ModelId `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
	// Board.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Types that are valid to be assigned to Result:
	//	*ScheduleJob_QueuedTaskId
	//	*ScheduleJob_Justification
	Result isScheduleJob_Result `protobuf_oneof:"result"`
	// Result generated time in UTC.
	GeneratedTime        *timestamp.Timestamp `protobuf:"bytes,5,opt,name=generated_time,json=generatedTime,proto3" json:"generated_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *ScheduleJob) Reset()         { *m = ScheduleJob{} }
func (m *ScheduleJob) String() string { return proto.CompactTextString(m) }
func (*ScheduleJob) ProtoMessage()    {}
func (*ScheduleJob) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{5}
}

func (m *ScheduleJob) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScheduleJob.Unmarshal(m, b)
}
func (m *ScheduleJob) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScheduleJob.Marshal(b, m, deterministic)
}
func (m *ScheduleJob) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScheduleJob.Merge(m, src)
}
func (m *ScheduleJob) XXX_Size() int {
	return xxx_messageInfo_ScheduleJob.Size(m)
}
func (m *ScheduleJob) XXX_DiscardUnknown() {
	xxx_messageInfo_ScheduleJob.DiscardUnknown(m)
}

var xxx_messageInfo_ScheduleJob proto.InternalMessageInfo

func (m *ScheduleJob) GetModel() *device.ModelId {
	if m != nil {
		return m.Model
	}
	return nil
}

func (m *ScheduleJob) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

type isScheduleJob_Result interface {
	isScheduleJob_Result()
}

type ScheduleJob_QueuedTaskId struct {
	QueuedTaskId string `protobuf:"bytes,3,opt,name=queued_task_id,json=queuedTaskId,proto3,oneof"`
}

type ScheduleJob_Justification struct {
	Justification string `protobuf:"bytes,4,opt,name=justification,proto3,oneof"`
}

func (*ScheduleJob_QueuedTaskId) isScheduleJob_Result() {}

func (*ScheduleJob_Justification) isScheduleJob_Result() {}

func (m *ScheduleJob) GetResult() isScheduleJob_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *ScheduleJob) GetQueuedTaskId() string {
	if x, ok := m.GetResult().(*ScheduleJob_QueuedTaskId); ok {
		return x.QueuedTaskId
	}
	return ""
}

func (m *ScheduleJob) GetJustification() string {
	if x, ok := m.GetResult().(*ScheduleJob_Justification); ok {
		return x.Justification
	}
	return ""
}

func (m *ScheduleJob) GetGeneratedTime() *timestamp.Timestamp {
	if m != nil {
		return m.GeneratedTime
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ScheduleJob) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ScheduleJob_QueuedTaskId)(nil),
		(*ScheduleJob_Justification)(nil),
	}
}

// ScheduleJobSection represents a schedule request configured in
// suite_scheduler.ini. Varying boards and models, a job section can
// have multiple suite tests scheduled.
type ScheduleJobSection struct {
	// job_name is the name of a schedule request defined in config,
	// e.g. “CrosAVAnalysis”.
	JobName string `protobuf:"bytes,1,opt,name=job_name,json=jobName,proto3" json:"job_name,omitempty"`
	// Trigger to run jobs under this section.
	ScheduleJobTrigger *ScheduleJobTrigger `protobuf:"bytes,2,opt,name=schedule_job_trigger,json=scheduleJobTrigger,proto3" json:"schedule_job_trigger,omitempty"`
	// Specific models to run this suite.
	Models []*device.ModelId `protobuf:"bytes,3,rep,name=models,proto3" json:"models,omitempty"`
	// Specific boards to run this suite.
	BuildTargets  []*chromiumos.BuildTarget          `protobuf:"bytes,4,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	MatchedBuilds []*ScheduleJobSection_MatchedBuild `protobuf:"bytes,5,rep,name=matched_builds,json=matchedBuilds,proto3" json:"matched_builds,omitempty"`
	// Jobs in this section.
	ScheduleJobs []*ScheduleJob `protobuf:"bytes,6,rep,name=schedule_jobs,json=scheduleJobs,proto3" json:"schedule_jobs,omitempty"`
	// The pool to run jobs in this section.
	Pool string `protobuf:"bytes,7,opt,name=pool,proto3" json:"pool,omitempty"`
	// The suite name this section to execute.
	Suite                string   `protobuf:"bytes,8,opt,name=suite,proto3" json:"suite,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScheduleJobSection) Reset()         { *m = ScheduleJobSection{} }
func (m *ScheduleJobSection) String() string { return proto.CompactTextString(m) }
func (*ScheduleJobSection) ProtoMessage()    {}
func (*ScheduleJobSection) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{6}
}

func (m *ScheduleJobSection) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScheduleJobSection.Unmarshal(m, b)
}
func (m *ScheduleJobSection) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScheduleJobSection.Marshal(b, m, deterministic)
}
func (m *ScheduleJobSection) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScheduleJobSection.Merge(m, src)
}
func (m *ScheduleJobSection) XXX_Size() int {
	return xxx_messageInfo_ScheduleJobSection.Size(m)
}
func (m *ScheduleJobSection) XXX_DiscardUnknown() {
	xxx_messageInfo_ScheduleJobSection.DiscardUnknown(m)
}

var xxx_messageInfo_ScheduleJobSection proto.InternalMessageInfo

func (m *ScheduleJobSection) GetJobName() string {
	if m != nil {
		return m.JobName
	}
	return ""
}

func (m *ScheduleJobSection) GetScheduleJobTrigger() *ScheduleJobTrigger {
	if m != nil {
		return m.ScheduleJobTrigger
	}
	return nil
}

func (m *ScheduleJobSection) GetModels() []*device.ModelId {
	if m != nil {
		return m.Models
	}
	return nil
}

func (m *ScheduleJobSection) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

func (m *ScheduleJobSection) GetMatchedBuilds() []*ScheduleJobSection_MatchedBuild {
	if m != nil {
		return m.MatchedBuilds
	}
	return nil
}

func (m *ScheduleJobSection) GetScheduleJobs() []*ScheduleJob {
	if m != nil {
		return m.ScheduleJobs
	}
	return nil
}

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

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

// The build matched with this job section on BuildTarget and BuildFilters.
type ScheduleJobSection_MatchedBuild struct {
	// Types that are valid to be assigned to CrosBuild:
	//	*ScheduleJobSection_MatchedBuild_ReleaseBuild
	//	*ScheduleJobSection_MatchedBuild_RelaxBuild
	//	*ScheduleJobSection_MatchedBuild_FirmwareRoBuild
	//	*ScheduleJobSection_MatchedBuild_FirmwareRwBuild
	CrosBuild            isScheduleJobSection_MatchedBuild_CrosBuild `protobuf_oneof:"cros_build"`
	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
	XXX_unrecognized     []byte                                      `json:"-"`
	XXX_sizecache        int32                                       `json:"-"`
}

func (m *ScheduleJobSection_MatchedBuild) Reset()         { *m = ScheduleJobSection_MatchedBuild{} }
func (m *ScheduleJobSection_MatchedBuild) String() string { return proto.CompactTextString(m) }
func (*ScheduleJobSection_MatchedBuild) ProtoMessage()    {}
func (*ScheduleJobSection_MatchedBuild) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{6, 0}
}

func (m *ScheduleJobSection_MatchedBuild) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScheduleJobSection_MatchedBuild.Unmarshal(m, b)
}
func (m *ScheduleJobSection_MatchedBuild) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScheduleJobSection_MatchedBuild.Marshal(b, m, deterministic)
}
func (m *ScheduleJobSection_MatchedBuild) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScheduleJobSection_MatchedBuild.Merge(m, src)
}
func (m *ScheduleJobSection_MatchedBuild) XXX_Size() int {
	return xxx_messageInfo_ScheduleJobSection_MatchedBuild.Size(m)
}
func (m *ScheduleJobSection_MatchedBuild) XXX_DiscardUnknown() {
	xxx_messageInfo_ScheduleJobSection_MatchedBuild.DiscardUnknown(m)
}

var xxx_messageInfo_ScheduleJobSection_MatchedBuild proto.InternalMessageInfo

type isScheduleJobSection_MatchedBuild_CrosBuild interface {
	isScheduleJobSection_MatchedBuild_CrosBuild()
}

type ScheduleJobSection_MatchedBuild_ReleaseBuild struct {
	ReleaseBuild *BuildInfo `protobuf:"bytes,1,opt,name=release_build,json=releaseBuild,proto3,oneof"`
}

type ScheduleJobSection_MatchedBuild_RelaxBuild struct {
	RelaxBuild *BuildInfo `protobuf:"bytes,2,opt,name=relax_build,json=relaxBuild,proto3,oneof"`
}

type ScheduleJobSection_MatchedBuild_FirmwareRoBuild struct {
	FirmwareRoBuild *FirmwareBuildInfo `protobuf:"bytes,3,opt,name=firmware_ro_build,json=firmwareRoBuild,proto3,oneof"`
}

type ScheduleJobSection_MatchedBuild_FirmwareRwBuild struct {
	FirmwareRwBuild *FirmwareBuildInfo `protobuf:"bytes,4,opt,name=firmware_rw_build,json=firmwareRwBuild,proto3,oneof"`
}

func (*ScheduleJobSection_MatchedBuild_ReleaseBuild) isScheduleJobSection_MatchedBuild_CrosBuild() {}

func (*ScheduleJobSection_MatchedBuild_RelaxBuild) isScheduleJobSection_MatchedBuild_CrosBuild() {}

func (*ScheduleJobSection_MatchedBuild_FirmwareRoBuild) isScheduleJobSection_MatchedBuild_CrosBuild() {
}

func (*ScheduleJobSection_MatchedBuild_FirmwareRwBuild) isScheduleJobSection_MatchedBuild_CrosBuild() {
}

func (m *ScheduleJobSection_MatchedBuild) GetCrosBuild() isScheduleJobSection_MatchedBuild_CrosBuild {
	if m != nil {
		return m.CrosBuild
	}
	return nil
}

func (m *ScheduleJobSection_MatchedBuild) GetReleaseBuild() *BuildInfo {
	if x, ok := m.GetCrosBuild().(*ScheduleJobSection_MatchedBuild_ReleaseBuild); ok {
		return x.ReleaseBuild
	}
	return nil
}

func (m *ScheduleJobSection_MatchedBuild) GetRelaxBuild() *BuildInfo {
	if x, ok := m.GetCrosBuild().(*ScheduleJobSection_MatchedBuild_RelaxBuild); ok {
		return x.RelaxBuild
	}
	return nil
}

func (m *ScheduleJobSection_MatchedBuild) GetFirmwareRoBuild() *FirmwareBuildInfo {
	if x, ok := m.GetCrosBuild().(*ScheduleJobSection_MatchedBuild_FirmwareRoBuild); ok {
		return x.FirmwareRoBuild
	}
	return nil
}

func (m *ScheduleJobSection_MatchedBuild) GetFirmwareRwBuild() *FirmwareBuildInfo {
	if x, ok := m.GetCrosBuild().(*ScheduleJobSection_MatchedBuild_FirmwareRwBuild); ok {
		return x.FirmwareRwBuild
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ScheduleJobSection_MatchedBuild) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ScheduleJobSection_MatchedBuild_ReleaseBuild)(nil),
		(*ScheduleJobSection_MatchedBuild_RelaxBuild)(nil),
		(*ScheduleJobSection_MatchedBuild_FirmwareRoBuild)(nil),
		(*ScheduleJobSection_MatchedBuild_FirmwareRwBuild)(nil),
	}
}

// The response received from cros_test_platform.
type ExecutionResponse struct {
	// build id used in cros_test_platform.
	CtpBuildId           string   `protobuf:"bytes,1,opt,name=ctp_build_id,json=ctpBuildId,proto3" json:"ctp_build_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ExecutionResponse) Reset()         { *m = ExecutionResponse{} }
func (m *ExecutionResponse) String() string { return proto.CompactTextString(m) }
func (*ExecutionResponse) ProtoMessage()    {}
func (*ExecutionResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{7}
}

func (m *ExecutionResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExecutionResponse.Unmarshal(m, b)
}
func (m *ExecutionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExecutionResponse.Marshal(b, m, deterministic)
}
func (m *ExecutionResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExecutionResponse.Merge(m, src)
}
func (m *ExecutionResponse) XXX_Size() int {
	return xxx_messageInfo_ExecutionResponse.Size(m)
}
func (m *ExecutionResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_ExecutionResponse.DiscardUnknown(m)
}

var xxx_messageInfo_ExecutionResponse proto.InternalMessageInfo

func (m *ExecutionResponse) GetCtpBuildId() string {
	if m != nil {
		return m.CtpBuildId
	}
	return ""
}

// The error message received from cros_test_platform.
type ExecutionError struct {
	ErrorMessage         string   `protobuf:"bytes,1,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ExecutionError) Reset()         { *m = ExecutionError{} }
func (m *ExecutionError) String() string { return proto.CompactTextString(m) }
func (*ExecutionError) ProtoMessage()    {}
func (*ExecutionError) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{8}
}

func (m *ExecutionError) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExecutionError.Unmarshal(m, b)
}
func (m *ExecutionError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExecutionError.Marshal(b, m, deterministic)
}
func (m *ExecutionError) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExecutionError.Merge(m, src)
}
func (m *ExecutionError) XXX_Size() int {
	return xxx_messageInfo_ExecutionError.Size(m)
}
func (m *ExecutionError) XXX_DiscardUnknown() {
	xxx_messageInfo_ExecutionError.DiscardUnknown(m)
}

var xxx_messageInfo_ExecutionError proto.InternalMessageInfo

func (m *ExecutionError) GetErrorMessage() string {
	if m != nil {
		return m.ErrorMessage
	}
	return ""
}

// ExecutionTask bridges suite scheduler and cros_test_platform. With it,
// we could track the execution reuslt for a scheduled test.
type ExecutionTask struct {
	// The ID used in JobResult, to track suite's execution.
	QueuedTaskId string `protobuf:"bytes,1,opt,name=queued_task_id,json=queuedTaskId,proto3" json:"queued_task_id,omitempty"`
	// The scheduling result from cros_test_platform, either a build id
	// error message.
	//
	// Types that are valid to be assigned to Result:
	//	*ExecutionTask_Response
	//	*ExecutionTask_Error
	Result isExecutionTask_Result `protobuf_oneof:"result"`
	// Request sent time in UTC.
	RequestSent *timestamp.Timestamp `protobuf:"bytes,4,opt,name=request_sent,json=requestSent,proto3" json:"request_sent,omitempty"`
	// The CTP request tag for grouping several ScheduleJobs into
	// a multiple CTP request.
	RequestTag           string   `protobuf:"bytes,5,opt,name=request_tag,json=requestTag,proto3" json:"request_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ExecutionTask) Reset()         { *m = ExecutionTask{} }
func (m *ExecutionTask) String() string { return proto.CompactTextString(m) }
func (*ExecutionTask) ProtoMessage()    {}
func (*ExecutionTask) Descriptor() ([]byte, []int) {
	return fileDescriptor_c98de5d5bbf67507, []int{9}
}

func (m *ExecutionTask) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExecutionTask.Unmarshal(m, b)
}
func (m *ExecutionTask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExecutionTask.Marshal(b, m, deterministic)
}
func (m *ExecutionTask) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExecutionTask.Merge(m, src)
}
func (m *ExecutionTask) XXX_Size() int {
	return xxx_messageInfo_ExecutionTask.Size(m)
}
func (m *ExecutionTask) XXX_DiscardUnknown() {
	xxx_messageInfo_ExecutionTask.DiscardUnknown(m)
}

var xxx_messageInfo_ExecutionTask proto.InternalMessageInfo

func (m *ExecutionTask) GetQueuedTaskId() string {
	if m != nil {
		return m.QueuedTaskId
	}
	return ""
}

type isExecutionTask_Result interface {
	isExecutionTask_Result()
}

type ExecutionTask_Response struct {
	Response *ExecutionResponse `protobuf:"bytes,2,opt,name=response,proto3,oneof"`
}

type ExecutionTask_Error struct {
	Error *ExecutionError `protobuf:"bytes,3,opt,name=error,proto3,oneof"`
}

func (*ExecutionTask_Response) isExecutionTask_Result() {}

func (*ExecutionTask_Error) isExecutionTask_Result() {}

func (m *ExecutionTask) GetResult() isExecutionTask_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *ExecutionTask) GetResponse() *ExecutionResponse {
	if x, ok := m.GetResult().(*ExecutionTask_Response); ok {
		return x.Response
	}
	return nil
}

func (m *ExecutionTask) GetError() *ExecutionError {
	if x, ok := m.GetResult().(*ExecutionTask_Error); ok {
		return x.Error
	}
	return nil
}

func (m *ExecutionTask) GetRequestSent() *timestamp.Timestamp {
	if m != nil {
		return m.RequestSent
	}
	return nil
}

func (m *ExecutionTask) GetRequestTag() string {
	if m != nil {
		return m.RequestTag
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ExecutionTask) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ExecutionTask_Response)(nil),
		(*ExecutionTask_Error)(nil),
	}
}

func init() {
	proto.RegisterEnum("test_platform.suite_scheduler.BranchFilter_Channel", BranchFilter_Channel_name, BranchFilter_Channel_value)
	proto.RegisterEnum("test_platform.suite_scheduler.BranchFilter_Operator", BranchFilter_Operator_name, BranchFilter_Operator_value)
	proto.RegisterType((*BuildInfo)(nil), "test_platform.suite_scheduler.BuildInfo")
	proto.RegisterType((*FirmwareBuildInfo)(nil), "test_platform.suite_scheduler.FirmwareBuildInfo")
	proto.RegisterType((*BranchFilter)(nil), "test_platform.suite_scheduler.BranchFilter")
	proto.RegisterType((*BuildFilters)(nil), "test_platform.suite_scheduler.BuildFilters")
	proto.RegisterType((*ScheduleJobTrigger)(nil), "test_platform.suite_scheduler.ScheduleJobTrigger")
	proto.RegisterType((*ScheduleJobTrigger_WeeklyTrigger)(nil), "test_platform.suite_scheduler.ScheduleJobTrigger.WeeklyTrigger")
	proto.RegisterType((*ScheduleJobTrigger_NightlyTrigger)(nil), "test_platform.suite_scheduler.ScheduleJobTrigger.NightlyTrigger")
	proto.RegisterType((*ScheduleJobTrigger_IntervalTrigger)(nil), "test_platform.suite_scheduler.ScheduleJobTrigger.IntervalTrigger")
	proto.RegisterType((*ScheduleJob)(nil), "test_platform.suite_scheduler.ScheduleJob")
	proto.RegisterType((*ScheduleJobSection)(nil), "test_platform.suite_scheduler.ScheduleJobSection")
	proto.RegisterType((*ScheduleJobSection_MatchedBuild)(nil), "test_platform.suite_scheduler.ScheduleJobSection.MatchedBuild")
	proto.RegisterType((*ExecutionResponse)(nil), "test_platform.suite_scheduler.ExecutionResponse")
	proto.RegisterType((*ExecutionError)(nil), "test_platform.suite_scheduler.ExecutionError")
	proto.RegisterType((*ExecutionTask)(nil), "test_platform.suite_scheduler.ExecutionTask")
}

func init() {
	proto.RegisterFile("test_platform/suite_scheduler/analytics.proto", fileDescriptor_c98de5d5bbf67507)
}

var fileDescriptor_c98de5d5bbf67507 = []byte{
	// 1304 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xfb, 0x6e, 0x1b, 0x45,
	0x17, 0x8f, 0x2f, 0x71, 0x9c, 0xe3, 0x4b, 0x9c, 0xf9, 0xfa, 0xb5, 0xfe, 0xf2, 0xb5, 0x6a, 0x30,
	0xa5, 0x8d, 0x8a, 0xba, 0xa6, 0x29, 0xfc, 0x83, 0x28, 0x10, 0xb7, 0x9b, 0x26, 0xd0, 0x24, 0x65,
	0x6c, 0x8a, 0x40, 0x88, 0xd5, 0x78, 0x3d, 0x5e, 0x6f, 0xbb, 0xbb, 0xb3, 0x9d, 0x19, 0x37, 0xf5,
	0x43, 0xf0, 0x3a, 0x7d, 0x00, 0xc4, 0x3f, 0xbc, 0x02, 0x8f, 0x82, 0x84, 0x84, 0xe6, 0xb2, 0x8e,
	0x5d, 0xa3, 0x24, 0x16, 0xfc, 0xb5, 0x3b, 0x67, 0xce, 0xf9, 0x9d, 0xfb, 0x39, 0xbb, 0x70, 0x4f,
	0x52, 0x21, 0xbd, 0x34, 0x22, 0x72, 0xc8, 0x78, 0xdc, 0x16, 0xe3, 0x50, 0x52, 0x4f, 0xf8, 0x23,
	0x3a, 0x18, 0x47, 0x94, 0xb7, 0x49, 0x42, 0xa2, 0x89, 0x0c, 0x7d, 0xe1, 0xa4, 0x9c, 0x49, 0x86,
	0x6e, 0xcc, 0xb1, 0x3b, 0xef, 0xb0, 0x6f, 0x5d, 0xf7, 0x47, 0x9c, 0xc5, 0xa1, 0xa4, 0x6d, 0x92,
	0x86, 0x6d, 0xc2, 0x65, 0x38, 0x24, 0xbe, 0xb4, 0xc2, 0x5b, 0xd7, 0xcc, 0xed, 0x38, 0x66, 0xa2,
	0xed, 0xb3, 0x38, 0x66, 0xc9, 0xdf, 0x5c, 0xf4, 0x39, 0x49, 0xfc, 0x91, 0xbd, 0xf8, 0xef, 0x80,
	0xbe, 0x0e, 0x7d, 0xda, 0x8e, 0xd9, 0x80, 0x46, 0x5e, 0x38, 0xb0, 0xe4, 0x9b, 0x01, 0x63, 0x41,
	0x44, 0xdb, 0xfa, 0xd4, 0x1f, 0x0f, 0xdb, 0x32, 0x8c, 0xa9, 0x90, 0x24, 0x4e, 0x0d, 0x43, 0xeb,
	0xd7, 0x1c, 0xac, 0x77, 0xc6, 0x61, 0x34, 0x38, 0x4c, 0x86, 0x0c, 0x7d, 0x0a, 0xd5, 0xbe, 0x3a,
	0x78, 0x92, 0xf0, 0x80, 0xca, 0x66, 0x6e, 0x3b, 0xb7, 0x53, 0xd9, 0xbd, 0xe6, 0x9c, 0x69, 0x75,
	0x34, 0x73, 0x4f, 0x5f, 0xe3, 0x4a, 0xff, 0xec, 0x80, 0xae, 0xc3, 0x7a, 0x1c, 0x46, 0x54, 0x48,
	0x96, 0xd0, 0x66, 0x7e, 0x3b, 0xb7, 0x53, 0xc3, 0x67, 0x04, 0x74, 0x17, 0x36, 0x35, 0x08, 0xf5,
	0x98, 0xf0, 0x5e, 0x53, 0x2e, 0x42, 0x96, 0x34, 0x0b, 0xdb, 0xb9, 0x9d, 0x75, 0xbc, 0x61, 0x2e,
	0x4e, 0xc4, 0x73, 0x43, 0x46, 0xf7, 0xa1, 0x28, 0x27, 0x29, 0x6d, 0x16, 0xb7, 0x73, 0x3b, 0xf5,
	0xdd, 0x1b, 0x73, 0xda, 0x8d, 0xcf, 0xe6, 0xd1, 0x9b, 0xa4, 0x14, 0x6b, 0xd6, 0xd6, 0xdb, 0x1c,
	0x6c, 0xee, 0x87, 0x3c, 0x3e, 0x25, 0x9c, 0xfe, 0x3b, 0xee, 0x64, 0x46, 0xe4, 0x2f, 0x6d, 0x04,
	0xda, 0x85, 0x72, 0x96, 0x48, 0xed, 0x5a, 0x65, 0xf7, 0xaa, 0x93, 0xa5, 0xd9, 0x21, 0x69, 0xe8,
	0xec, 0xd9, 0x5b, 0x3c, 0xe5, 0x6b, 0xfd, 0x92, 0x87, 0xaa, 0x01, 0xda, 0x0f, 0x23, 0x49, 0x39,
	0x3a, 0x82, 0x35, 0x7f, 0x44, 0x92, 0x84, 0x46, 0xda, 0xdc, 0xfa, 0xee, 0x03, 0xe7, 0xdc, 0x4a,
	0x72, 0x66, 0xa5, 0x9d, 0x47, 0x46, 0x14, 0x67, 0x18, 0xe8, 0x19, 0x94, 0x59, 0x4a, 0x39, 0x91,
	0x8c, 0x5b, 0x57, 0x3e, 0x5e, 0x06, 0xef, 0xc4, 0xca, 0xe2, 0x29, 0x0a, 0x6a, 0x40, 0x21, 0x22,
	0x81, 0x76, 0x70, 0x15, 0xab, 0xd7, 0xd6, 0x53, 0x58, 0xb3, 0x7a, 0xd1, 0x55, 0x40, 0x1d, 0xbc,
	0x77, 0xfc, 0xe8, 0xc0, 0xc3, 0xee, 0xbe, 0x77, 0x7c, 0xd2, 0xf3, 0xba, 0x6e, 0xaf, 0xb1, 0x82,
	0x00, 0x4a, 0x47, 0x7b, 0xdd, 0x9e, 0x8b, 0x1b, 0x39, 0xb4, 0x06, 0x85, 0xc7, 0xee, 0xf3, 0x46,
	0x1e, 0x95, 0xa1, 0xd8, 0x71, 0x7b, 0x7b, 0x8d, 0x82, 0xba, 0xee, 0xf6, 0xf6, 0x3a, 0x4f, 0xdd,
	0x46, 0xb1, 0x75, 0x1f, 0xca, 0x99, 0x56, 0x54, 0x83, 0xf5, 0x6f, 0x8f, 0x1f, 0xbb, 0xfb, 0x87,
	0xc7, 0xee, 0xe3, 0xc6, 0x0a, 0x2a, 0x41, 0xde, 0xfd, 0xa6, 0x91, 0x53, 0xcf, 0x27, 0x6e, 0x23,
	0xaf, 0x9e, 0x4f, 0xdd, 0x46, 0xa1, 0xf5, 0x9b, 0x0a, 0xa2, 0xca, 0x9d, 0xb1, 0x5a, 0xa0, 0x87,
	0xf0, 0x7f, 0x96, 0x44, 0x13, 0x6f, 0x74, 0xaa, 0x7d, 0x15, 0x24, 0x09, 0xe5, 0xc4, 0xe3, 0xf4,
	0xd5, 0x38, 0xe4, 0x74, 0xa0, 0x03, 0x5b, 0xc6, 0x4d, 0xc5, 0x72, 0xa0, 0x39, 0xba, 0x9a, 0x01,
	0xdb, 0x7b, 0x84, 0xa1, 0x6e, 0x9a, 0xcb, 0x1b, 0x1a, 0xc0, 0x66, 0x7e, 0xbb, 0xb0, 0x53, 0xd9,
	0xfd, 0x70, 0x89, 0xd0, 0xe1, 0x5a, 0x7f, 0xe6, 0x24, 0x10, 0x86, 0xab, 0x43, 0x5b, 0xa0, 0x1e,
	0x67, 0x9e, 0xa9, 0x4b, 0x91, 0x52, 0x5f, 0x47, 0xf2, 0xc2, 0x0a, 0xfb, 0x4f, 0x26, 0x8c, 0x99,
	0xf6, 0xb4, 0x9b, 0x52, 0x7f, 0x1e, 0xf3, 0x74, 0x16, 0xb3, 0xb8, 0x1c, 0xe6, 0xe9, 0x14, 0xb3,
	0xf5, 0x67, 0x01, 0x50, 0xd7, 0x7a, 0xf4, 0x15, 0xeb, 0xf7, 0x78, 0x18, 0x04, 0x94, 0xa3, 0xef,
	0xa1, 0x74, 0x4a, 0xe9, 0xcb, 0x68, 0x62, 0x9b, 0xe8, 0x8b, 0x0b, 0x42, 0xb1, 0x08, 0xe1, 0x7c,
	0xa7, 0xe5, 0xed, 0xe9, 0x60, 0x05, 0x5b, 0x40, 0xf4, 0x23, 0xac, 0x25, 0x61, 0x30, 0x92, 0xd1,
	0x44, 0x57, 0x68, 0x65, 0xf7, 0xcb, 0xe5, 0xb1, 0x8f, 0x0d, 0xc0, 0x19, 0x78, 0x06, 0x89, 0x3c,
	0x28, 0x87, 0x89, 0xa4, 0xfc, 0x35, 0x89, 0x6c, 0x53, 0xee, 0x2d, 0x0f, 0x7f, 0x68, 0x11, 0xce,
	0xf0, 0xa7, 0xa0, 0xe8, 0x19, 0xd4, 0x4c, 0xe0, 0xb3, 0x5a, 0x29, 0x6a, 0x2d, 0x17, 0xd6, 0xca,
	0x4c, 0xbd, 0x62, 0x33, 0xa6, 0xec, 0x69, 0xeb, 0x3d, 0xa8, 0xcd, 0xc5, 0x4a, 0xb5, 0xdc, 0x80,
	0x98, 0xc8, 0xd7, 0xb0, 0x7a, 0xdd, 0xba, 0x05, 0xf5, 0x79, 0x97, 0x11, 0x82, 0xe2, 0x88, 0x8d,
	0xb9, 0x65, 0xd2, 0xef, 0x5b, 0x77, 0x60, 0xe3, 0x1d, 0xcb, 0xd1, 0x15, 0x58, 0x4d, 0xc9, 0x58,
	0x50, 0xcb, 0x67, 0x0e, 0x9d, 0x75, 0x58, 0x93, 0x86, 0xa1, 0xf5, 0x73, 0x1e, 0x2a, 0x33, 0x11,
	0x40, 0x1f, 0xc0, 0xaa, 0xde, 0x29, 0x36, 0xef, 0x1b, 0x8e, 0x59, 0x34, 0xce, 0x91, 0x22, 0x1e,
	0x0e, 0xb0, 0xb9, 0x5d, 0x18, 0xb5, 0xf9, 0x25, 0x46, 0xed, 0x6d, 0xa8, 0xbf, 0x1a, 0xd3, 0x31,
	0x55, 0xc2, 0xe2, 0xa5, 0x17, 0x0e, 0xcc, 0x62, 0x38, 0x58, 0xc1, 0x55, 0x43, 0xef, 0x11, 0xf1,
	0xf2, 0x70, 0x80, 0x6e, 0x43, 0xed, 0xc5, 0x58, 0xc8, 0x70, 0x18, 0xfa, 0x44, 0xaa, 0xfd, 0x51,
	0xb4, 0x6c, 0xf3, 0x64, 0xb4, 0x07, 0xf5, 0x80, 0x26, 0x6a, 0x84, 0x28, 0xc8, 0x30, 0xa6, 0xcd,
	0x55, 0x6d, 0xcd, 0x96, 0x63, 0xb6, 0xa1, 0x93, 0x6d, 0x43, 0xa7, 0x97, 0x6d, 0x43, 0x5c, 0x9b,
	0x4a, 0x28, 0x5a, 0xa7, 0x0c, 0x25, 0x4e, 0xc5, 0x38, 0x92, 0xad, 0xdf, 0x4b, 0x73, 0xfd, 0xd0,
	0xa5, 0xbe, 0xd6, 0xf1, 0x3f, 0x28, 0xbf, 0x60, 0x7d, 0x2f, 0x21, 0xb1, 0x09, 0xe5, 0x3a, 0x5e,
	0x7b, 0xc1, 0xfa, 0xc7, 0x24, 0xa6, 0xc8, 0x87, 0x2b, 0x59, 0x9a, 0x3d, 0xc5, 0x63, 0x23, 0x6b,
	0x43, 0x72, 0x7f, 0xe9, 0xea, 0xc3, 0x48, 0x2c, 0xf6, 0xe3, 0x1d, 0x28, 0xe9, 0xc0, 0x8b, 0x66,
	0x41, 0x8f, 0xa6, 0x85, 0xbc, 0xd8, 0x6b, 0xf4, 0x59, 0x56, 0x9e, 0x26, 0x31, 0xaa, 0x3c, 0x0b,
	0xe7, 0x65, 0xa6, 0x3a, 0x93, 0x19, 0x81, 0x28, 0xd4, 0x63, 0x22, 0x95, 0x7a, 0x33, 0x5d, 0x44,
	0x73, 0x55, 0x8b, 0x7f, 0x7e, 0x79, 0x2f, 0x6c, 0xc4, 0x9c, 0x23, 0x83, 0xa3, 0x75, 0xe1, 0x5a,
	0x3c, 0x73, 0x12, 0xe8, 0x04, 0x6a, 0xb3, 0x21, 0x13, 0xcd, 0x92, 0xd6, 0x72, 0xf7, 0xf2, 0x5a,
	0x70, 0x75, 0x26, 0x48, 0x42, 0x75, 0x43, 0xca, 0x58, 0xd4, 0x5c, 0xd3, 0xa9, 0xd1, 0xef, 0xaa,
	0xf4, 0x35, 0x40, 0xb3, 0xac, 0x89, 0xe6, 0xb0, 0xf5, 0x47, 0x1e, 0xaa, 0xb3, 0xa6, 0x29, 0x5b,
	0x38, 0x8d, 0x28, 0x11, 0xd4, 0xb8, 0x6c, 0x0b, 0x7f, 0xe7, 0x32, 0xfd, 0xac, 0xbe, 0x3a, 0x54,
	0xd9, 0x5a, 0x00, 0x03, 0xf8, 0x35, 0x54, 0x38, 0x8d, 0xc8, 0x1b, 0x0b, 0x97, 0x5f, 0x1a, 0x0e,
	0xb4, 0xb8, 0x01, 0xfb, 0x09, 0x36, 0x17, 0xd6, 0x88, 0x9d, 0x6b, 0x1f, 0x5d, 0x00, 0xb9, 0xf0,
	0x7d, 0x74, 0xb0, 0x82, 0x37, 0xde, 0x59, 0x2b, 0xf3, 0xf8, 0x76, 0xa5, 0xd8, 0x89, 0xf6, 0xcf,
	0xf0, 0xcd, 0x8a, 0xe9, 0x54, 0x01, 0x7c, 0xce, 0x84, 0x01, 0x6e, 0x7d, 0x02, 0x9b, 0xee, 0x1b,
	0xea, 0x8f, 0x55, 0x81, 0x60, 0x2a, 0x52, 0x96, 0x08, 0x8a, 0xb6, 0xa1, 0xea, 0xcb, 0xd4, 0x6e,
	0xb3, 0x70, 0x60, 0xdb, 0x0b, 0x7c, 0x99, 0x1a, 0x64, 0x25, 0x56, 0x9f, 0x8a, 0xb9, 0x9c, 0x33,
	0x8e, 0xde, 0x87, 0x1a, 0x55, 0x2f, 0x5e, 0x4c, 0x85, 0x20, 0x41, 0xd6, 0x93, 0x55, 0x4d, 0x3c,
	0x32, 0xb4, 0xd6, 0xdb, 0x3c, 0xd4, 0xa6, 0x72, 0x6a, 0xa6, 0xa0, 0x5b, 0x0b, 0x93, 0xc7, 0xca,
	0xcd, 0xcd, 0x9d, 0x63, 0x28, 0x73, 0x6b, 0x9c, 0xcd, 0xde, 0x45, 0xa1, 0x58, 0x70, 0x4a, 0x6d,
	0x8c, 0x0c, 0x03, 0xb9, 0xb0, 0xaa, 0xed, 0xb2, 0x79, 0xbb, 0x77, 0x59, 0x30, 0xed, 0xea, 0xc1,
	0x0a, 0x36, 0xd2, 0xe8, 0x21, 0x54, 0xd5, 0x17, 0x8d, 0xfe, 0xc0, 0xa1, 0x89, 0xb4, 0x59, 0x3a,
	0x6f, 0xc8, 0x55, 0x2c, 0x7f, 0x97, 0x26, 0x12, 0xdd, 0x84, 0xec, 0xe8, 0x49, 0x12, 0xe8, 0x11,
	0xb9, 0xae, 0x4a, 0x4d, 0x93, 0x7a, 0x24, 0x38, 0x9b, 0x81, 0x9d, 0xc3, 0x1f, 0x9e, 0x04, 0x6c,
	0x3a, 0x30, 0x1c, 0xc6, 0x83, 0xf6, 0xcc, 0x7f, 0x48, 0x98, 0x0c, 0x39, 0x31, 0x7f, 0x18, 0xed,
	0x80, 0xb5, 0xcf, 0xfd, 0x4d, 0xea, 0x97, 0x34, 0xdf, 0x83, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff,
	0x65, 0x6c, 0x9b, 0x46, 0x4e, 0x0d, 0x00, 0x00,
}
