// Copyright 2019 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: test_platform/phosphorus/common.proto

package phosphorus

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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

// BotEnvironment defines bot-specific parameters used by phosphorus.
type BotEnvironment struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Absolute path to the autotest directory for the bot, e.g.
	// "/usr/local/autotest".
	AutotestDir string `protobuf:"bytes,1,opt,name=autotest_dir,json=autotestDir,proto3" json:"autotest_dir,omitempty"`
}

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

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

func (*BotEnvironment) ProtoMessage() {}

func (x *BotEnvironment) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_phosphorus_common_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 BotEnvironment.ProtoReflect.Descriptor instead.
func (*BotEnvironment) Descriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_common_proto_rawDescGZIP(), []int{0}
}

func (x *BotEnvironment) GetAutotestDir() string {
	if x != nil {
		return x.AutotestDir
	}
	return ""
}

// TaskEnvironment defines task-specific parameters used by phosphorus.
type TaskEnvironment struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Absolute path to the results directory for a given run. Include results of
	//  both tests and non-test tasks like provision
	ResultsDir string `protobuf:"bytes,2,opt,name=results_dir,json=resultsDir,proto3" json:"results_dir,omitempty"`
	// Absolute path to the results directory for a given run's tests.
	//  MUST be equal to ${results_dir}/autoserv_test if present. This restriction
	//  may be lifted in the future.
	TestResultsDir string `protobuf:"bytes,3,opt,name=test_results_dir,json=testResultsDir,proto3" json:"test_results_dir,omitempty"`
	// The name of the base lxc image used for Server Side Packaging (SSP).
	//
	// autoserv fetches the base image from a hard-coded path on Google
	// Storage: gs://abci-ssp/autotest-containers/{name}.tar.xz
	//
	// See go/ctp-ssp for an overview of SSP.
	SspBaseImageName string `protobuf:"bytes,4,opt,name=ssp_base_image_name,json=sspBaseImageName,proto3" json:"ssp_base_image_name,omitempty"`
}

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

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

func (*TaskEnvironment) ProtoMessage() {}

func (x *TaskEnvironment) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_phosphorus_common_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 TaskEnvironment.ProtoReflect.Descriptor instead.
func (*TaskEnvironment) Descriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_common_proto_rawDescGZIP(), []int{1}
}

func (x *TaskEnvironment) GetResultsDir() string {
	if x != nil {
		return x.ResultsDir
	}
	return ""
}

func (x *TaskEnvironment) GetTestResultsDir() string {
	if x != nil {
		return x.TestResultsDir
	}
	return ""
}

func (x *TaskEnvironment) GetSspBaseImageName() string {
	if x != nil {
		return x.SspBaseImageName
	}
	return ""
}

// Knobs specific to the step that runs tasks to prepare the DUT for test.
type PrejobStep struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	ProvisionDutExperiment *ProvisionDutExperiment `protobuf:"bytes,1,opt,name=provision_dut_experiment,json=provisionDutExperiment,proto3" json:"provision_dut_experiment,omitempty"`
}

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

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

func (*PrejobStep) ProtoMessage() {}

func (x *PrejobStep) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_phosphorus_common_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 PrejobStep.ProtoReflect.Descriptor instead.
func (*PrejobStep) Descriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_common_proto_rawDescGZIP(), []int{2}
}

func (x *PrejobStep) GetProvisionDutExperiment() *ProvisionDutExperiment {
	if x != nil {
		return x.ProvisionDutExperiment
	}
	return nil
}

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

	// Global flag to control this experiment.
	Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
	// Types that are assignable to CrosVersionSelector:
	//	*ProvisionDutExperiment_CrosVersionAllowList
	//	*ProvisionDutExperiment_CrosVersionDisallowList
	CrosVersionSelector isProvisionDutExperiment_CrosVersionSelector `protobuf_oneof:"cros_version_selector"`
}

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

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

func (*ProvisionDutExperiment) ProtoMessage() {}

func (x *ProvisionDutExperiment) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_phosphorus_common_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 ProvisionDutExperiment.ProtoReflect.Descriptor instead.
func (*ProvisionDutExperiment) Descriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_common_proto_rawDescGZIP(), []int{3}
}

func (x *ProvisionDutExperiment) GetEnabled() bool {
	if x != nil {
		return x.Enabled
	}
	return false
}

func (m *ProvisionDutExperiment) GetCrosVersionSelector() isProvisionDutExperiment_CrosVersionSelector {
	if m != nil {
		return m.CrosVersionSelector
	}
	return nil
}

func (x *ProvisionDutExperiment) GetCrosVersionAllowList() *ProvisionDutExperiment_CrosVersionSelector {
	if x, ok := x.GetCrosVersionSelector().(*ProvisionDutExperiment_CrosVersionAllowList); ok {
		return x.CrosVersionAllowList
	}
	return nil
}

func (x *ProvisionDutExperiment) GetCrosVersionDisallowList() *ProvisionDutExperiment_CrosVersionSelector {
	if x, ok := x.GetCrosVersionSelector().(*ProvisionDutExperiment_CrosVersionDisallowList); ok {
		return x.CrosVersionDisallowList
	}
	return nil
}

type isProvisionDutExperiment_CrosVersionSelector interface {
	isProvisionDutExperiment_CrosVersionSelector()
}

type ProvisionDutExperiment_CrosVersionAllowList struct {
	// Only use ProvisionDut TLS API for the selected requests.
	CrosVersionAllowList *ProvisionDutExperiment_CrosVersionSelector `protobuf:"bytes,2,opt,name=cros_version_allow_list,json=crosVersionAllowList,proto3,oneof"`
}

type ProvisionDutExperiment_CrosVersionDisallowList struct {
	// Use ProvisionDut TLS API for all requests *except* the ones selected.
	CrosVersionDisallowList *ProvisionDutExperiment_CrosVersionSelector `protobuf:"bytes,3,opt,name=cros_version_disallow_list,json=crosVersionDisallowList,proto3,oneof"`
}

func (*ProvisionDutExperiment_CrosVersionAllowList) isProvisionDutExperiment_CrosVersionSelector() {}

func (*ProvisionDutExperiment_CrosVersionDisallowList) isProvisionDutExperiment_CrosVersionSelector() {
}

// Knobs specific to the step that uploads log-data to Google Storage.
type LogDataUploadStep struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Controls the maximum number of files that may be uploaded concurrently.
	// If unset, a hard-coded constant is used to limit concurrency (i.e., there
	// is no way to request unlimited concurrent uploads).
	MaxConcurrentUploads int32 `protobuf:"varint,1,opt,name=max_concurrent_uploads,json=maxConcurrentUploads,proto3" json:"max_concurrent_uploads,omitempty"`
}

func (x *LogDataUploadStep) Reset() {
	*x = LogDataUploadStep{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_phosphorus_common_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*LogDataUploadStep) ProtoMessage() {}

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

// Deprecated: Use LogDataUploadStep.ProtoReflect.Descriptor instead.
func (*LogDataUploadStep) Descriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_common_proto_rawDescGZIP(), []int{4}
}

func (x *LogDataUploadStep) GetMaxConcurrentUploads() int32 {
	if x != nil {
		return x.MaxConcurrentUploads
	}
	return 0
}

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

	// URL of the crash server where crashes can be uploaded.
	// e.g.: https://clients2.google.com/cr/report
	CrashServerReportUrl string `protobuf:"bytes,1,opt,name=crash_server_report_url,json=crashServerReportUrl,proto3" json:"crash_server_report_url,omitempty"`
	// URL of the crash server where pre-uploaded crashes can be viewed.
	// e.g.: https://crash.corp.google.com
	CrashServerViewUrl string `protobuf:"bytes,2,opt,name=crash_server_view_url,json=crashServerViewUrl,proto3" json:"crash_server_view_url,omitempty"`
}

func (x *FetchCrashesStep) Reset() {
	*x = FetchCrashesStep{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_phosphorus_common_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FetchCrashesStep) ProtoMessage() {}

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

// Deprecated: Use FetchCrashesStep.ProtoReflect.Descriptor instead.
func (*FetchCrashesStep) Descriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_common_proto_rawDescGZIP(), []int{5}
}

func (x *FetchCrashesStep) GetCrashServerReportUrl() string {
	if x != nil {
		return x.CrashServerReportUrl
	}
	return ""
}

func (x *FetchCrashesStep) GetCrashServerViewUrl() string {
	if x != nil {
		return x.CrashServerViewUrl
	}
	return ""
}

// Config defines configuration parameters common to phosphorus subcommands.
type Config struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Bot               *BotEnvironment    `protobuf:"bytes,1,opt,name=bot,proto3" json:"bot,omitempty"`
	Task              *TaskEnvironment   `protobuf:"bytes,2,opt,name=task,proto3" json:"task,omitempty"`
	LogDataUploadStep *LogDataUploadStep `protobuf:"bytes,3,opt,name=log_data_upload_step,json=logDataUploadStep,proto3" json:"log_data_upload_step,omitempty"`
	FetchCrashesStep  *FetchCrashesStep  `protobuf:"bytes,4,opt,name=fetch_crashes_step,json=fetchCrashesStep,proto3" json:"fetch_crashes_step,omitempty"`
	PrejobStep        *PrejobStep        `protobuf:"bytes,5,opt,name=prejob_step,json=prejobStep,proto3" json:"prejob_step,omitempty"`
}

func (x *Config) Reset() {
	*x = Config{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_phosphorus_common_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Config) ProtoMessage() {}

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

// Deprecated: Use Config.ProtoReflect.Descriptor instead.
func (*Config) Descriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_common_proto_rawDescGZIP(), []int{6}
}

func (x *Config) GetBot() *BotEnvironment {
	if x != nil {
		return x.Bot
	}
	return nil
}

func (x *Config) GetTask() *TaskEnvironment {
	if x != nil {
		return x.Task
	}
	return nil
}

func (x *Config) GetLogDataUploadStep() *LogDataUploadStep {
	if x != nil {
		return x.LogDataUploadStep
	}
	return nil
}

func (x *Config) GetFetchCrashesStep() *FetchCrashesStep {
	if x != nil {
		return x.FetchCrashesStep
	}
	return nil
}

func (x *Config) GetPrejobStep() *PrejobStep {
	if x != nil {
		return x.PrejobStep
	}
	return nil
}

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

	// Selects prejob requests by the cros-version of the OS image to install on
	// the DUT.
	//
	// e.g., a value of "reef-release" would select "reef-release/R87.1282.0.0"
	// etc.
	Prefixes []string `protobuf:"bytes,1,rep,name=prefixes,proto3" json:"prefixes,omitempty"`
}

func (x *ProvisionDutExperiment_CrosVersionSelector) Reset() {
	*x = ProvisionDutExperiment_CrosVersionSelector{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_phosphorus_common_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*ProvisionDutExperiment_CrosVersionSelector) ProtoMessage() {}

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

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

func (x *ProvisionDutExperiment_CrosVersionSelector) GetPrefixes() []string {
	if x != nil {
		return x.Prefixes
	}
	return nil
}

var File_test_platform_phosphorus_common_proto protoreflect.FileDescriptor

var file_test_platform_phosphorus_common_proto_rawDesc = []byte{
	0x0a, 0x25, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
	0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75,
	0x73, 0x22, 0x33, 0x0a, 0x0e, 0x42, 0x6f, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
	0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x74,
	0x65, 0x73, 0x74, 0x44, 0x69, 0x72, 0x22, 0xaa, 0x01, 0x0a, 0x0f, 0x54, 0x61, 0x73, 0x6b, 0x45,
	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x44, 0x69, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x73, 0x44, 0x69, 0x72, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x73, 0x70, 0x5f, 0x62, 0x61, 0x73,
	0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x10, 0x73, 0x73, 0x70, 0x42, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65,
	0x4e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x17, 0x73, 0x79, 0x6e, 0x63,
	0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x5f, 0x6f, 0x66, 0x66, 0x6c, 0x6f, 0x61, 0x64, 0x5f,
	0x64, 0x69, 0x72, 0x22, 0x78, 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x65,
	0x70, 0x12, 0x6a, 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64,
	0x75, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e, 0x50,
	0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72,
	0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x16, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
	0x44, 0x75, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x03,
	0x0a, 0x16, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x74, 0x45, 0x78,
	0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62,
	0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c,
	0x65, 0x64, 0x12, 0x7d, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e, 0x50,
	0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72,
	0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
	0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x14, 0x63, 0x72, 0x6f,
	0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73,
	0x74, 0x12, 0x83, 0x01, 0x0a, 0x1a, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75,
	0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x74, 0x45, 0x78,
	0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x56, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x17,
	0x63, 0x72, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x6c,
	0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x31, 0x0a, 0x13, 0x43, 0x72, 0x6f, 0x73, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a,
	0x0a, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,
	0x52, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x63, 0x72,
	0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63,
	0x74, 0x6f, 0x72, 0x22, 0x49, 0x0a, 0x11, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70,
	0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x65, 0x70, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f,
	0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61,
	0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e,
	0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x7c,
	0x0a, 0x10, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x53, 0x74,
	0x65, 0x70, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x72, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x65, 0x72, 0x76,
	0x65, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x72, 0x61, 0x73, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
	0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x63, 0x72, 0x61,
	0x73, 0x68, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x75,
	0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x72, 0x61, 0x73, 0x68, 0x53,
	0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x55, 0x72, 0x6c, 0x22, 0x82, 0x03, 0x0a,
	0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x0a, 0x03, 0x62, 0x6f, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e,
	0x42, 0x6f, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03,
	0x62, 0x6f, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e, 0x54, 0x61, 0x73,
	0x6b, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x74, 0x61,
	0x73, 0x6b, 0x12, 0x5c, 0x0a, 0x14, 0x6c, 0x6f, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75,
	0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x2b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x44,
	0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x65, 0x70, 0x52, 0x11, 0x6c,
	0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x65, 0x70,
	0x12, 0x58, 0x0a, 0x12, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, 0x65,
	0x73, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f,
	0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x72, 0x61,
	0x73, 0x68, 0x65, 0x73, 0x53, 0x74, 0x65, 0x70, 0x52, 0x10, 0x66, 0x65, 0x74, 0x63, 0x68, 0x43,
	0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x53, 0x74, 0x65, 0x70, 0x12, 0x45, 0x0a, 0x0b, 0x70, 0x72,
	0x65, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x24, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e,
	0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x65, 0x6a, 0x6f,
	0x62, 0x53, 0x74, 0x65, 0x70, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x65,
	0x70, 0x42, 0x44, 0x5a, 0x42, 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, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x68, 0x6f,
	0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_phosphorus_common_proto_rawDescOnce sync.Once
	file_test_platform_phosphorus_common_proto_rawDescData = file_test_platform_phosphorus_common_proto_rawDesc
)

func file_test_platform_phosphorus_common_proto_rawDescGZIP() []byte {
	file_test_platform_phosphorus_common_proto_rawDescOnce.Do(func() {
		file_test_platform_phosphorus_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_phosphorus_common_proto_rawDescData)
	})
	return file_test_platform_phosphorus_common_proto_rawDescData
}

var file_test_platform_phosphorus_common_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_test_platform_phosphorus_common_proto_goTypes = []interface{}{
	(*BotEnvironment)(nil),                             // 0: test_platform.phosphorus.BotEnvironment
	(*TaskEnvironment)(nil),                            // 1: test_platform.phosphorus.TaskEnvironment
	(*PrejobStep)(nil),                                 // 2: test_platform.phosphorus.PrejobStep
	(*ProvisionDutExperiment)(nil),                     // 3: test_platform.phosphorus.ProvisionDutExperiment
	(*LogDataUploadStep)(nil),                          // 4: test_platform.phosphorus.LogDataUploadStep
	(*FetchCrashesStep)(nil),                           // 5: test_platform.phosphorus.FetchCrashesStep
	(*Config)(nil),                                     // 6: test_platform.phosphorus.Config
	(*ProvisionDutExperiment_CrosVersionSelector)(nil), // 7: test_platform.phosphorus.ProvisionDutExperiment.CrosVersionSelector
}
var file_test_platform_phosphorus_common_proto_depIdxs = []int32{
	3, // 0: test_platform.phosphorus.PrejobStep.provision_dut_experiment:type_name -> test_platform.phosphorus.ProvisionDutExperiment
	7, // 1: test_platform.phosphorus.ProvisionDutExperiment.cros_version_allow_list:type_name -> test_platform.phosphorus.ProvisionDutExperiment.CrosVersionSelector
	7, // 2: test_platform.phosphorus.ProvisionDutExperiment.cros_version_disallow_list:type_name -> test_platform.phosphorus.ProvisionDutExperiment.CrosVersionSelector
	0, // 3: test_platform.phosphorus.Config.bot:type_name -> test_platform.phosphorus.BotEnvironment
	1, // 4: test_platform.phosphorus.Config.task:type_name -> test_platform.phosphorus.TaskEnvironment
	4, // 5: test_platform.phosphorus.Config.log_data_upload_step:type_name -> test_platform.phosphorus.LogDataUploadStep
	5, // 6: test_platform.phosphorus.Config.fetch_crashes_step:type_name -> test_platform.phosphorus.FetchCrashesStep
	2, // 7: test_platform.phosphorus.Config.prejob_step:type_name -> test_platform.phosphorus.PrejobStep
	8, // [8:8] is the sub-list for method output_type
	8, // [8:8] is the sub-list for method input_type
	8, // [8:8] is the sub-list for extension type_name
	8, // [8:8] is the sub-list for extension extendee
	0, // [0:8] is the sub-list for field type_name
}

func init() { file_test_platform_phosphorus_common_proto_init() }
func file_test_platform_phosphorus_common_proto_init() {
	if File_test_platform_phosphorus_common_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_phosphorus_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BotEnvironment); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TaskEnvironment); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PrejobStep); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_common_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ProvisionDutExperiment); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LogDataUploadStep); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FetchCrashesStep); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_common_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Config); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_common_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ProvisionDutExperiment_CrosVersionSelector); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_test_platform_phosphorus_common_proto_msgTypes[3].OneofWrappers = []interface{}{
		(*ProvisionDutExperiment_CrosVersionAllowList)(nil),
		(*ProvisionDutExperiment_CrosVersionDisallowList)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_phosphorus_common_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   8,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_phosphorus_common_proto_goTypes,
		DependencyIndexes: file_test_platform_phosphorus_common_proto_depIdxs,
		MessageInfos:      file_test_platform_phosphorus_common_proto_msgTypes,
	}.Build()
	File_test_platform_phosphorus_common_proto = out.File
	file_test_platform_phosphorus_common_proto_rawDesc = nil
	file_test_platform_phosphorus_common_proto_goTypes = nil
	file_test_platform_phosphorus_common_proto_depIdxs = nil
}
