// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

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

package testplans

import (
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

//Defines a config for tests to be retried automatically.
type SuiteRetryCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*SuiteRetryCfg) ProtoMessage() {}

func (x *SuiteRetryCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_test_retry_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SuiteRetryCfg.ProtoReflect.Descriptor instead.
func (*SuiteRetryCfg) Descriptor() ([]byte, []int) {
	return file_testplans_test_retry_proto_rawDescGZIP(), []int{0}
}

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

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

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

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

// Scenario defines the test failure conditions that trigger retry.
type SuiteRetryCfg_Scenario struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*SuiteRetryCfg_Scenario) ProtoMessage() {}

func (x *SuiteRetryCfg_Scenario) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_test_retry_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SuiteRetryCfg_Scenario.ProtoReflect.Descriptor instead.
func (*SuiteRetryCfg_Scenario) Descriptor() ([]byte, []int) {
	return file_testplans_test_retry_proto_rawDescGZIP(), []int{0, 0}
}

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

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

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

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

type SuiteRetryCfg_BuilderScenario struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*SuiteRetryCfg_BuilderScenario) ProtoMessage() {}

func (x *SuiteRetryCfg_BuilderScenario) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_test_retry_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SuiteRetryCfg_BuilderScenario.ProtoReflect.Descriptor instead.
func (*SuiteRetryCfg_BuilderScenario) Descriptor() ([]byte, []int) {
	return file_testplans_test_retry_proto_rawDescGZIP(), []int{0, 1}
}

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

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

// Reason scenario defines test failure conditions irrespective of which test.
type SuiteRetryCfg_ReasonScenario struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*SuiteRetryCfg_ReasonScenario) ProtoMessage() {}

func (x *SuiteRetryCfg_ReasonScenario) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_test_retry_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SuiteRetryCfg_ReasonScenario.ProtoReflect.Descriptor instead.
func (*SuiteRetryCfg_ReasonScenario) Descriptor() ([]byte, []int) {
	return file_testplans_test_retry_proto_rawDescGZIP(), []int{0, 2}
}

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

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

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

var File_testplans_test_retry_proto protoreflect.FileDescriptor

var file_testplans_test_retry_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x74, 0x65,
	0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x1a, 0x1d, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x65,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd0, 0x05, 0x0a, 0x0d, 0x53, 0x75, 0x69, 0x74, 0x65,
	0x52, 0x65, 0x74, 0x72, 0x79, 0x43, 0x66, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65,
	0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x73, 0x75, 0x69, 0x74, 0x65,
	0x5f, 0x73, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x21, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x75, 0x69,
	0x74, 0x65, 0x52, 0x65, 0x74, 0x72, 0x79, 0x43, 0x66, 0x67, 0x2e, 0x53, 0x63, 0x65, 0x6e, 0x61,
	0x72, 0x69, 0x6f, 0x52, 0x0e, 0x73, 0x75, 0x69, 0x74, 0x65, 0x53, 0x63, 0x65, 0x6e, 0x61, 0x72,
	0x69, 0x6f, 0x73, 0x12, 0x55, 0x0a, 0x11, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x73,
	0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x75, 0x69, 0x74, 0x65,
	0x52, 0x65, 0x74, 0x72, 0x79, 0x43, 0x66, 0x67, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x53, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x52, 0x10, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x53, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x72, 0x65,
	0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x18, 0x05,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x2e, 0x53, 0x75, 0x69, 0x74, 0x65, 0x52, 0x65, 0x74, 0x72, 0x79, 0x43, 0x66, 0x67, 0x2e, 0x52,
	0x65, 0x61, 0x73, 0x6f, 0x6e, 0x53, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x52, 0x0f, 0x72,
	0x65, 0x61, 0x73, 0x6f, 0x6e, 0x53, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x1a, 0xa6,
	0x01, 0x0a, 0x08, 0x53, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
	0x74, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73,
	0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e,
	0x12, 0x3a, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x64,
	0x69, 0x63, 0x74, 0x52, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x12, 0x29, 0x0a, 0x10,
	0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73,
	0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x1a, 0x6e, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x65, 0x72, 0x53, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x63, 0x65, 0x6e, 0x61, 0x72,
	0x69, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x75, 0x69, 0x74, 0x65, 0x52, 0x65, 0x74, 0x72, 0x79,
	0x43, 0x66, 0x67, 0x2e, 0x53, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x52, 0x09, 0x73, 0x63,
	0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x1a, 0x8f, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x73,
	0x6f, 0x6e, 0x53, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65,
	0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73,
	0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x65,
	0x72, 0x64, 0x69, 0x63, 0x74, 0x52, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x12, 0x29,
	0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61,
	0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,
	0x65, 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_testplans_test_retry_proto_rawDescOnce sync.Once
	file_testplans_test_retry_proto_rawDescData = file_testplans_test_retry_proto_rawDesc
)

func file_testplans_test_retry_proto_rawDescGZIP() []byte {
	file_testplans_test_retry_proto_rawDescOnce.Do(func() {
		file_testplans_test_retry_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_test_retry_proto_rawDescData)
	})
	return file_testplans_test_retry_proto_rawDescData
}

var file_testplans_test_retry_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_testplans_test_retry_proto_goTypes = []interface{}{
	(*SuiteRetryCfg)(nil),                 // 0: testplans.SuiteRetryCfg
	(*SuiteRetryCfg_Scenario)(nil),        // 1: testplans.SuiteRetryCfg.Scenario
	(*SuiteRetryCfg_BuilderScenario)(nil), // 2: testplans.SuiteRetryCfg.BuilderScenario
	(*SuiteRetryCfg_ReasonScenario)(nil),  // 3: testplans.SuiteRetryCfg.ReasonScenario
	(test_platform.TaskState_Verdict)(0),  // 4: test_platform.TaskState.Verdict
}
var file_testplans_test_retry_proto_depIdxs = []int32{
	1, // 0: testplans.SuiteRetryCfg.suite_scenarios:type_name -> testplans.SuiteRetryCfg.Scenario
	2, // 1: testplans.SuiteRetryCfg.builder_scenarios:type_name -> testplans.SuiteRetryCfg.BuilderScenario
	3, // 2: testplans.SuiteRetryCfg.reason_scenarios:type_name -> testplans.SuiteRetryCfg.ReasonScenario
	4, // 3: testplans.SuiteRetryCfg.Scenario.verdict:type_name -> test_platform.TaskState.Verdict
	1, // 4: testplans.SuiteRetryCfg.BuilderScenario.scenarios:type_name -> testplans.SuiteRetryCfg.Scenario
	4, // 5: testplans.SuiteRetryCfg.ReasonScenario.verdict:type_name -> test_platform.TaskState.Verdict
	6, // [6:6] is the sub-list for method output_type
	6, // [6:6] is the sub-list for method input_type
	6, // [6:6] is the sub-list for extension type_name
	6, // [6:6] is the sub-list for extension extendee
	0, // [0:6] is the sub-list for field type_name
}

func init() { file_testplans_test_retry_proto_init() }
func file_testplans_test_retry_proto_init() {
	if File_testplans_test_retry_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_testplans_test_retry_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SuiteRetryCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_test_retry_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SuiteRetryCfg_Scenario); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_test_retry_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SuiteRetryCfg_BuilderScenario); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_test_retry_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SuiteRetryCfg_ReasonScenario); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_testplans_test_retry_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   4,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_test_retry_proto_goTypes,
		DependencyIndexes: file_testplans_test_retry_proto_depIdxs,
		MessageInfos:      file_testplans_test_retry_proto_msgTypes,
	}.Build()
	File_testplans_test_retry_proto = out.File
	file_testplans_test_retry_proto_rawDesc = nil
	file_testplans_test_retry_proto_goTypes = nil
	file_testplans_test_retry_proto_depIdxs = nil
}
