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

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