// Code generated by protoc-gen-go. DO NOT EDIT.
// source: testplans/test_retry.proto

package testplans

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	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

//Defines a config for tests to be retried automatically.
type SuiteRetryCfg struct {
	// Tag defines which suite this config set should apply.
	TestSuite string `protobuf:"bytes,1,opt,name=test_suite,json=testSuite,proto3" json:"test_suite,omitempty"`
	// Scenarios to retry for each build_target.
	SuiteScenarios   []*SuiteRetryCfg_Scenario        `protobuf:"bytes,3,rep,name=suite_scenarios,json=suiteScenarios,proto3" json:"suite_scenarios,omitempty"`
	BuilderScenarios []*SuiteRetryCfg_BuilderScenario `protobuf:"bytes,4,rep,name=builder_scenarios,json=builderScenarios,proto3" json:"builder_scenarios,omitempty"`
	// ReasonScenarios to retry for the suite.
	ReasonScenarios      []*SuiteRetryCfg_ReasonScenario `protobuf:"bytes,5,rep,name=reason_scenarios,json=reasonScenarios,proto3" json:"reason_scenarios,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_SuiteRetryCfg proto.InternalMessageInfo

func (m *SuiteRetryCfg) GetTestSuite() string {
	if m != nil {
		return m.TestSuite
	}
	return ""
}

func (m *SuiteRetryCfg) GetSuiteScenarios() []*SuiteRetryCfg_Scenario {
	if m != nil {
		return m.SuiteScenarios
	}
	return nil
}

func (m *SuiteRetryCfg) GetBuilderScenarios() []*SuiteRetryCfg_BuilderScenario {
	if m != nil {
		return m.BuilderScenarios
	}
	return nil
}

func (m *SuiteRetryCfg) GetReasonScenarios() []*SuiteRetryCfg_ReasonScenario {
	if m != nil {
		return m.ReasonScenarios
	}
	return nil
}

// Scenario defines the test failure conditions that trigger retry.
type SuiteRetryCfg_Scenario struct {
	// Name of the test.
	TestName string `protobuf:"bytes,1,opt,name=test_name,json=testName,proto3" json:"test_name,omitempty"`
	// Failure reason/summary. This field is a substring of the actual error
	// message. Ex: 'SSH connection failed' or 'DUT rebooted'.
	Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
	// Verdict of the test run.
	Verdict test_platform.TaskState_Verdict `protobuf:"varint,3,opt,name=verdict,proto3,enum=test_platform.TaskState_Verdict" json:"verdict,omitempty"`
	// Should the DUT/VM restart before retry?
	RequiresRestart      bool     `protobuf:"varint,4,opt,name=requires_restart,json=requiresRestart,proto3" json:"requires_restart,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SuiteRetryCfg_Scenario proto.InternalMessageInfo

func (m *SuiteRetryCfg_Scenario) GetTestName() string {
	if m != nil {
		return m.TestName
	}
	return ""
}

func (m *SuiteRetryCfg_Scenario) GetReason() string {
	if m != nil {
		return m.Reason
	}
	return ""
}

func (m *SuiteRetryCfg_Scenario) GetVerdict() test_platform.TaskState_Verdict {
	if m != nil {
		return m.Verdict
	}
	return test_platform.TaskState_VERDICT_UNSPECIFIED
}

func (m *SuiteRetryCfg_Scenario) GetRequiresRestart() bool {
	if m != nil {
		return m.RequiresRestart
	}
	return false
}

type SuiteRetryCfg_BuilderScenario struct {
	// Tag defines which builders this config set should apply.
	Builders             []string                  `protobuf:"bytes,1,rep,name=builders,proto3" json:"builders,omitempty"`
	Scenarios            []*SuiteRetryCfg_Scenario `protobuf:"bytes,2,rep,name=scenarios,proto3" json:"scenarios,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_SuiteRetryCfg_BuilderScenario proto.InternalMessageInfo

func (m *SuiteRetryCfg_BuilderScenario) GetBuilders() []string {
	if m != nil {
		return m.Builders
	}
	return nil
}

func (m *SuiteRetryCfg_BuilderScenario) GetScenarios() []*SuiteRetryCfg_Scenario {
	if m != nil {
		return m.Scenarios
	}
	return nil
}

// Reason scenario defines test failure conditions irrespective of which test.
type SuiteRetryCfg_ReasonScenario struct {
	// Failures reason.
	Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"`
	// Verdict of the test run.
	Verdict test_platform.TaskState_Verdict `protobuf:"varint,2,opt,name=verdict,proto3,enum=test_platform.TaskState_Verdict" json:"verdict,omitempty"`
	// Should the DUT/VM restart before retry?
	RequiresRestart      bool     `protobuf:"varint,3,opt,name=requires_restart,json=requiresRestart,proto3" json:"requires_restart,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SuiteRetryCfg_ReasonScenario proto.InternalMessageInfo

func (m *SuiteRetryCfg_ReasonScenario) GetReason() string {
	if m != nil {
		return m.Reason
	}
	return ""
}

func (m *SuiteRetryCfg_ReasonScenario) GetVerdict() test_platform.TaskState_Verdict {
	if m != nil {
		return m.Verdict
	}
	return test_platform.TaskState_VERDICT_UNSPECIFIED
}

func (m *SuiteRetryCfg_ReasonScenario) GetRequiresRestart() bool {
	if m != nil {
		return m.RequiresRestart
	}
	return false
}

func init() {
	proto.RegisterType((*SuiteRetryCfg)(nil), "testplans.SuiteRetryCfg")
	proto.RegisterType((*SuiteRetryCfg_Scenario)(nil), "testplans.SuiteRetryCfg.Scenario")
	proto.RegisterType((*SuiteRetryCfg_BuilderScenario)(nil), "testplans.SuiteRetryCfg.BuilderScenario")
	proto.RegisterType((*SuiteRetryCfg_ReasonScenario)(nil), "testplans.SuiteRetryCfg.ReasonScenario")
}

func init() { proto.RegisterFile("testplans/test_retry.proto", fileDescriptor_5e1b8044c4eb67ff) }

var fileDescriptor_5e1b8044c4eb67ff = []byte{
	// 397 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x92, 0xb1, 0x6e, 0xe2, 0x40,
	0x14, 0x45, 0x35, 0x18, 0x58, 0x33, 0xab, 0x05, 0x76, 0x8a, 0x95, 0xe5, 0x15, 0x92, 0x77, 0x9b,
	0x38, 0xcd, 0x58, 0x02, 0xa5, 0x49, 0x13, 0x89, 0x74, 0x29, 0x52, 0x98, 0x24, 0x45, 0x1a, 0x6b,
	0x80, 0xc1, 0xb1, 0xc0, 0x1e, 0xf2, 0xde, 0x38, 0x52, 0xbe, 0x22, 0x7f, 0x91, 0xef, 0xc9, 0x27,
	0x45, 0x1e, 0x63, 0x83, 0xa3, 0x20, 0xa5, 0x48, 0xc7, 0xbd, 0xef, 0xdd, 0xcb, 0xcc, 0x19, 0x53,
	0x57, 0x4b, 0xd4, 0xdb, 0x8d, 0xc8, 0x30, 0x28, 0x7e, 0x45, 0x20, 0x35, 0x3c, 0xf3, 0x2d, 0x28,
	0xad, 0x58, 0xaf, 0x9e, 0xb9, 0x23, 0x33, 0xdc, 0x6e, 0x84, 0x5e, 0x29, 0x48, 0x03, 0x2d, 0x70,
	0x8d, 0x5a, 0x68, 0x59, 0x6e, 0xfe, 0x7f, 0xeb, 0xd0, 0x5f, 0xb3, 0x3c, 0xd1, 0x32, 0x2c, 0xe2,
	0x97, 0xab, 0x98, 0x8d, 0x28, 0x35, 0x11, 0x2c, 0x5c, 0x87, 0x78, 0xc4, 0xef, 0x85, 0xa6, 0xcf,
	0xac, 0xb1, 0x2b, 0x3a, 0x30, 0x93, 0x08, 0x17, 0x32, 0x13, 0x90, 0x28, 0x74, 0x2c, 0xcf, 0xf2,
	0x7f, 0x8e, 0xff, 0xf1, 0xfa, 0x4f, 0x79, 0xa3, 0x91, 0xcf, 0x76, 0x9b, 0x61, 0xdf, 0x24, 0x2b,
	0x89, 0xec, 0x96, 0xfe, 0x9e, 0xe7, 0xc9, 0x66, 0x29, 0xe1, 0xa0, 0xad, 0x6d, 0xda, 0xfc, 0xa3,
	0x6d, 0xd3, 0x32, 0x51, 0x97, 0x0e, 0xe7, 0x4d, 0x03, 0x59, 0x48, 0x87, 0x20, 0x05, 0xaa, 0xec,
	0xa0, 0xb5, 0x63, 0x5a, 0x4f, 0x8e, 0xb6, 0x86, 0x26, 0x50, 0x97, 0x0e, 0xa0, 0xa1, 0xd1, 0x7d,
	0x25, 0xd4, 0xae, 0x14, 0xfb, 0x4b, 0x0d, 0x90, 0x28, 0x13, 0x69, 0x45, 0xc8, 0x2e, 0x8c, 0x6b,
	0x91, 0x4a, 0xf6, 0x87, 0x76, 0xcb, 0xb0, 0xd3, 0x32, 0x93, 0x9d, 0x62, 0xe7, 0xf4, 0xc7, 0x93,
	0x84, 0x65, 0xb2, 0xd0, 0x8e, 0xe5, 0x11, 0xbf, 0x3f, 0xf6, 0x78, 0xe3, 0x69, 0xf8, 0x8d, 0xc0,
	0xf5, 0xcc, 0x3c, 0xcd, 0x5d, 0xb9, 0x17, 0x56, 0x01, 0x76, 0x5a, 0xdc, 0xe8, 0x31, 0x4f, 0x40,
	0x62, 0x04, 0x12, 0xb5, 0x00, 0xed, 0xb4, 0x3d, 0xe2, 0xdb, 0xc5, 0x41, 0x4b, 0x3f, 0x2c, 0x6d,
	0x37, 0xa3, 0x83, 0x0f, 0x84, 0x98, 0x4b, 0xed, 0x1d, 0x23, 0x74, 0x88, 0x67, 0x15, 0xa7, 0xad,
	0x34, 0xbb, 0xa0, 0xbd, 0x3d, 0xa4, 0xd6, 0x57, 0x1f, 0x72, 0x9f, 0x71, 0x5f, 0x08, 0xed, 0x37,
	0xe1, 0x1d, 0x10, 0x20, 0xc7, 0x08, 0xb4, 0xbe, 0x83, 0x80, 0xf5, 0x29, 0x81, 0xe9, 0xd9, 0xfd,
	0x24, 0x56, 0x7c, 0xf1, 0x00, 0x2a, 0x4d, 0xf2, 0x94, 0x2b, 0x88, 0x83, 0x4a, 0x28, 0x0c, 0x92,
	0x6c, 0x05, 0x22, 0x30, 0x1f, 0x7f, 0x10, 0xab, 0xa0, 0xbe, 0xea, 0xbc, 0x6b, 0xbc, 0xc9, 0x7b,
	0x00, 0x00, 0x00, 0xff, 0xff, 0x62, 0x14, 0xfe, 0x25, 0x58, 0x03, 0x00, 0x00,
}
