// 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/request.proto

package test_platform

import (
	duration "github.com/golang/protobuf/ptypes/duration"
	api "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	execution "go.chromium.org/chromiumos/infra/proto/go/test_platform/execution"
	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)
)

// ManagedPool enumerates certain large pools of DUTs in the lab.
//
// The distinction between managed / unmanaged pools (below) is historic
// and no longer relevant.
type Request_Params_Scheduling_ManagedPool int32

const (
	Request_Params_Scheduling_MANAGED_POOL_UNSPECIFIED   Request_Params_Scheduling_ManagedPool = 0
	Request_Params_Scheduling_MANAGED_POOL_CQ            Request_Params_Scheduling_ManagedPool = 1
	Request_Params_Scheduling_MANAGED_POOL_BVT           Request_Params_Scheduling_ManagedPool = 2
	Request_Params_Scheduling_MANAGED_POOL_SUITES        Request_Params_Scheduling_ManagedPool = 3
	Request_Params_Scheduling_MANAGED_POOL_CTS           Request_Params_Scheduling_ManagedPool = 4
	Request_Params_Scheduling_MANAGED_POOL_CTS_PERBUILD  Request_Params_Scheduling_ManagedPool = 5
	Request_Params_Scheduling_MANAGED_POOL_CONTINUOUS    Request_Params_Scheduling_ManagedPool = 6
	Request_Params_Scheduling_MANAGED_POOL_ARC_PRESUBMIT Request_Params_Scheduling_ManagedPool = 7
	Request_Params_Scheduling_MANAGED_POOL_QUOTA         Request_Params_Scheduling_ManagedPool = 8
)

// Enum value maps for Request_Params_Scheduling_ManagedPool.
var (
	Request_Params_Scheduling_ManagedPool_name = map[int32]string{
		0: "MANAGED_POOL_UNSPECIFIED",
		1: "MANAGED_POOL_CQ",
		2: "MANAGED_POOL_BVT",
		3: "MANAGED_POOL_SUITES",
		4: "MANAGED_POOL_CTS",
		5: "MANAGED_POOL_CTS_PERBUILD",
		6: "MANAGED_POOL_CONTINUOUS",
		7: "MANAGED_POOL_ARC_PRESUBMIT",
		8: "MANAGED_POOL_QUOTA",
	}
	Request_Params_Scheduling_ManagedPool_value = map[string]int32{
		"MANAGED_POOL_UNSPECIFIED":   0,
		"MANAGED_POOL_CQ":            1,
		"MANAGED_POOL_BVT":           2,
		"MANAGED_POOL_SUITES":        3,
		"MANAGED_POOL_CTS":           4,
		"MANAGED_POOL_CTS_PERBUILD":  5,
		"MANAGED_POOL_CONTINUOUS":    6,
		"MANAGED_POOL_ARC_PRESUBMIT": 7,
		"MANAGED_POOL_QUOTA":         8,
	}
)

func (x Request_Params_Scheduling_ManagedPool) Enum() *Request_Params_Scheduling_ManagedPool {
	p := new(Request_Params_Scheduling_ManagedPool)
	*p = x
	return p
}

func (x Request_Params_Scheduling_ManagedPool) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Request_Params_Scheduling_ManagedPool) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_request_proto_enumTypes[0].Descriptor()
}

func (Request_Params_Scheduling_ManagedPool) Type() protoreflect.EnumType {
	return &file_test_platform_request_proto_enumTypes[0]
}

func (x Request_Params_Scheduling_ManagedPool) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Request_Params_Scheduling_ManagedPool.Descriptor instead.
func (Request_Params_Scheduling_ManagedPool) EnumDescriptor() ([]byte, []int) {
	return file_test_platform_request_proto_rawDescGZIP(), []int{0, 0, 4, 0}
}

// Request represents a request to the ChromeOS Test Platform to run a test,
// set of tests, suite of tests, or test plan on a set of devices (eventually
// also: virtual devices) in the ChromeOS Test Lab.
type Request struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Params   *Request_Params   `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"`
	TestPlan *Request_TestPlan `protobuf:"bytes,5,opt,name=test_plan,json=testPlan,proto3" json:"test_plan,omitempty"`
}

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

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

func (*Request) ProtoMessage() {}

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

func (x *Request) GetParams() *Request_Params {
	if x != nil {
		return x.Params
	}
	return nil
}

func (x *Request) GetTestPlan() *Request_TestPlan {
	if x != nil {
		return x.TestPlan
	}
	return nil
}

// Params defines parameters that apply to an entire Request.
//
// NEXT_TAG: 11
type Request_Params struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	HardwareAttributes   *Request_Params_HardwareAttributes   `protobuf:"bytes,1,opt,name=hardware_attributes,json=hardwareAttributes,proto3" json:"hardware_attributes,omitempty"`
	SoftwareAttributes   *Request_Params_SoftwareAttributes   `protobuf:"bytes,2,opt,name=software_attributes,json=softwareAttributes,proto3" json:"software_attributes,omitempty"`
	FreeformAttributes   *Request_Params_FreeformAttributes   `protobuf:"bytes,9,opt,name=freeform_attributes,json=freeformAttributes,proto3" json:"freeform_attributes,omitempty"`
	SoftwareDependencies []*Request_Params_SoftwareDependency `protobuf:"bytes,3,rep,name=software_dependencies,json=softwareDependencies,proto3" json:"software_dependencies,omitempty"`
	Scheduling           *Request_Params_Scheduling           `protobuf:"bytes,4,opt,name=scheduling,proto3" json:"scheduling,omitempty"`
	Retry                *Request_Params_Retry                `protobuf:"bytes,5,opt,name=retry,proto3" json:"retry,omitempty"`
	Metadata             *Request_Params_Metadata             `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"`
	Time                 *Request_Params_Time                 `protobuf:"bytes,7,opt,name=time,proto3" json:"time,omitempty"`
	Decorations          *Request_Params_Decorations          `protobuf:"bytes,8,opt,name=decorations,proto3" json:"decorations,omitempty"`
	Migrations           *Request_Params_Migrations           `protobuf:"bytes,12,opt,name=migrations,proto3" json:"migrations,omitempty"`
	// Uniformly applied parameters for all test executions in this request.
	ExecutionParam *execution.Param `protobuf:"bytes,13,opt,name=execution_param,json=executionParam,proto3" json:"execution_param,omitempty"`
}

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

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

func (*Request_Params) ProtoMessage() {}

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

func (x *Request_Params) GetHardwareAttributes() *Request_Params_HardwareAttributes {
	if x != nil {
		return x.HardwareAttributes
	}
	return nil
}

func (x *Request_Params) GetSoftwareAttributes() *Request_Params_SoftwareAttributes {
	if x != nil {
		return x.SoftwareAttributes
	}
	return nil
}

func (x *Request_Params) GetFreeformAttributes() *Request_Params_FreeformAttributes {
	if x != nil {
		return x.FreeformAttributes
	}
	return nil
}

func (x *Request_Params) GetSoftwareDependencies() []*Request_Params_SoftwareDependency {
	if x != nil {
		return x.SoftwareDependencies
	}
	return nil
}

func (x *Request_Params) GetScheduling() *Request_Params_Scheduling {
	if x != nil {
		return x.Scheduling
	}
	return nil
}

func (x *Request_Params) GetRetry() *Request_Params_Retry {
	if x != nil {
		return x.Retry
	}
	return nil
}

func (x *Request_Params) GetMetadata() *Request_Params_Metadata {
	if x != nil {
		return x.Metadata
	}
	return nil
}

func (x *Request_Params) GetTime() *Request_Params_Time {
	if x != nil {
		return x.Time
	}
	return nil
}

func (x *Request_Params) GetDecorations() *Request_Params_Decorations {
	if x != nil {
		return x.Decorations
	}
	return nil
}

func (x *Request_Params) GetMigrations() *Request_Params_Migrations {
	if x != nil {
		return x.Migrations
	}
	return nil
}

func (x *Request_Params) GetExecutionParam() *execution.Param {
	if x != nil {
		return x.ExecutionParam
	}
	return nil
}

// SuiteRequest defines an individual named suite.
type Request_Suite struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

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

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

func (*Request_Suite) ProtoMessage() {}

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

func (x *Request_Suite) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

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

	// Types that are assignable to Harness:
	//	*Request_Test_Autotest_
	Harness isRequest_Test_Harness `protobuf_oneof:"harness"`
}

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

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

func (*Request_Test) ProtoMessage() {}

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

func (m *Request_Test) GetHarness() isRequest_Test_Harness {
	if m != nil {
		return m.Harness
	}
	return nil
}

func (x *Request_Test) GetAutotest() *Request_Test_Autotest {
	if x, ok := x.GetHarness().(*Request_Test_Autotest_); ok {
		return x.Autotest
	}
	return nil
}

type isRequest_Test_Harness interface {
	isRequest_Test_Harness()
}

type Request_Test_Autotest_ struct {
	Autotest *Request_Test_Autotest `protobuf:"bytes,1,opt,name=autotest,proto3,oneof"`
}

func (*Request_Test_Autotest_) isRequest_Test_Harness() {}

// Enumeration is a previously enumerated test plan.
//
// This is a copy of test_platform.steps.EnumerationResponse
// Keep in sync.
type Request_Enumeration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	AutotestInvocations []*Request_Enumeration_AutotestInvocation `protobuf:"bytes,2,rep,name=autotest_invocations,json=autotestInvocations,proto3" json:"autotest_invocations,omitempty"`
}

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

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

func (*Request_Enumeration) ProtoMessage() {}

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

func (x *Request_Enumeration) GetAutotestInvocations() []*Request_Enumeration_AutotestInvocation {
	if x != nil {
		return x.AutotestInvocations
	}
	return nil
}

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

	Suite       []*Request_Suite     `protobuf:"bytes,1,rep,name=suite,proto3" json:"suite,omitempty"`
	Test        []*Request_Test      `protobuf:"bytes,2,rep,name=test,proto3" json:"test,omitempty"`
	Enumeration *Request_Enumeration `protobuf:"bytes,3,opt,name=enumeration,proto3" json:"enumeration,omitempty"`
}

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

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

func (*Request_TestPlan) ProtoMessage() {}

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

func (x *Request_TestPlan) GetSuite() []*Request_Suite {
	if x != nil {
		return x.Suite
	}
	return nil
}

func (x *Request_TestPlan) GetTest() []*Request_Test {
	if x != nil {
		return x.Test
	}
	return nil
}

func (x *Request_TestPlan) GetEnumeration() *Request_Enumeration {
	if x != nil {
		return x.Enumeration
	}
	return nil
}

// HardwareAttributes defines the hardware-bound characteristics
// of the devices to run tests on.
type Request_Params_HardwareAttributes struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Model is the model to run tests against.
	Model string `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
}

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

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

func (*Request_Params_HardwareAttributes) ProtoMessage() {}

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

func (x *Request_Params_HardwareAttributes) GetModel() string {
	if x != nil {
		return x.Model
	}
	return ""
}

// SoftwareAttributes defines software characteristics that are strongly
// associated with a device, though not immutable or hardware-bound.
type Request_Params_SoftwareAttributes struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
}

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

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

func (*Request_Params_SoftwareAttributes) ProtoMessage() {}

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

func (x *Request_Params_SoftwareAttributes) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

// FreeformAttributes defines user-specified device attributes that are
// opaque to the test platform. It is preferrable not to use these, but
// they are provided to cover cases in which the test platform does not
// present a parameter corresponding to the attributes of interest.
type Request_Params_FreeformAttributes struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// SwarmingDimensions are raw swarming bot dimensions, expressed as
	// "key:value" strings.
	SwarmingDimensions []string `protobuf:"bytes,1,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
}

func (x *Request_Params_FreeformAttributes) Reset() {
	*x = Request_Params_FreeformAttributes{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Params_FreeformAttributes) ProtoMessage() {}

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

func (x *Request_Params_FreeformAttributes) GetSwarmingDimensions() []string {
	if x != nil {
		return x.SwarmingDimensions
	}
	return nil
}

// SoftwareDependency defines mutable software characteristics of the
// devices to run tests on (for instance, the desired version of ChromeOS).
type Request_Params_SoftwareDependency struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Dep:
	//	*Request_Params_SoftwareDependency_ChromeosBuild
	//	*Request_Params_SoftwareDependency_RoFirmwareBuild
	//	*Request_Params_SoftwareDependency_RwFirmwareBuild
	//	*Request_Params_SoftwareDependency_LacrosGcsPath
	Dep isRequest_Params_SoftwareDependency_Dep `protobuf_oneof:"dep"`
}

func (x *Request_Params_SoftwareDependency) Reset() {
	*x = Request_Params_SoftwareDependency{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Params_SoftwareDependency) ProtoMessage() {}

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

func (m *Request_Params_SoftwareDependency) GetDep() isRequest_Params_SoftwareDependency_Dep {
	if m != nil {
		return m.Dep
	}
	return nil
}

func (x *Request_Params_SoftwareDependency) GetChromeosBuild() string {
	if x, ok := x.GetDep().(*Request_Params_SoftwareDependency_ChromeosBuild); ok {
		return x.ChromeosBuild
	}
	return ""
}

func (x *Request_Params_SoftwareDependency) GetRoFirmwareBuild() string {
	if x, ok := x.GetDep().(*Request_Params_SoftwareDependency_RoFirmwareBuild); ok {
		return x.RoFirmwareBuild
	}
	return ""
}

func (x *Request_Params_SoftwareDependency) GetRwFirmwareBuild() string {
	if x, ok := x.GetDep().(*Request_Params_SoftwareDependency_RwFirmwareBuild); ok {
		return x.RwFirmwareBuild
	}
	return ""
}

func (x *Request_Params_SoftwareDependency) GetLacrosGcsPath() string {
	if x, ok := x.GetDep().(*Request_Params_SoftwareDependency_LacrosGcsPath); ok {
		return x.LacrosGcsPath
	}
	return ""
}

type isRequest_Params_SoftwareDependency_Dep interface {
	isRequest_Params_SoftwareDependency_Dep()
}

type Request_Params_SoftwareDependency_ChromeosBuild struct {
	// ChromeOS build name, e.g. "reef-release/R77-12345.0.0"
	ChromeosBuild string `protobuf:"bytes,3,opt,name=chromeos_build,json=chromeosBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_RoFirmwareBuild struct {
	// Readonly firmware build name, e.g.
	// "firmware-reef-9042.B-firmwarebranch/R72-11311.0.0"
	RoFirmwareBuild string `protobuf:"bytes,4,opt,name=ro_firmware_build,json=roFirmwareBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_RwFirmwareBuild struct {
	// Read-write firmware build name, e.g.
	// "firmware-reef-9042.B-firmwarebranch/R72-11311.0.0"
	RwFirmwareBuild string `protobuf:"bytes,5,opt,name=rw_firmware_build,json=rwFirmwareBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_LacrosGcsPath struct {
	// Google Cloud Storage path for obtaining LaCrOS images.
	//
	// Unlike chromeos/ro_firmware/rw_firmware, this is full Google Cloud
	// Storage path (e.g. gs://shiny-lacros/builds/M56/for-pupr/1.2.3.4).
	LacrosGcsPath string `protobuf:"bytes,6,opt,name=lacros_gcs_path,json=lacrosGcsPath,proto3,oneof"`
}

func (*Request_Params_SoftwareDependency_ChromeosBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_RoFirmwareBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_RwFirmwareBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_LacrosGcsPath) isRequest_Params_SoftwareDependency_Dep() {}

// Scheduling defines parameters that affect how the tests in this
// request are prioritized relative to other requests, and how capacity for
// them is allocated.
type Request_Params_Scheduling struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Pool:
	//	*Request_Params_Scheduling_ManagedPool_
	//	*Request_Params_Scheduling_UnmanagedPool
	Pool isRequest_Params_Scheduling_Pool `protobuf_oneof:"pool"`
	// Priority corresponds to a swarming task priority; if specified, it
	// should be in the range [50,255]. This priority will be used for
	// any swaming tasks created by this run.
	//
	// Note that the scheduler behavior with a given priority depends on
	// other factors, such as pool. In particular, if requests are run in
	// a quotascheduler-controlled pool, then this priority will be ignored,
	// as priority will be determined by quota account balances.
	Priority int64 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
	// It is an error to set both qs_account and priority at the same time.
	// qs_account should be used if the request is scheduled on a pool
	// managed by QuotaScheduler. See go/qs-enabled-pools for details.
	// If qs_account is set for requests on no QuotaScheduler pools,
	// it will be ignored and the request will default to running at
	// the lowest priority.
	QsAccount string `protobuf:"bytes,5,opt,name=qs_account,json=qsAccount,proto3" json:"qs_account,omitempty"`
}

func (x *Request_Params_Scheduling) Reset() {
	*x = Request_Params_Scheduling{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Params_Scheduling) ProtoMessage() {}

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

func (m *Request_Params_Scheduling) GetPool() isRequest_Params_Scheduling_Pool {
	if m != nil {
		return m.Pool
	}
	return nil
}

func (x *Request_Params_Scheduling) GetManagedPool() Request_Params_Scheduling_ManagedPool {
	if x, ok := x.GetPool().(*Request_Params_Scheduling_ManagedPool_); ok {
		return x.ManagedPool
	}
	return Request_Params_Scheduling_MANAGED_POOL_UNSPECIFIED
}

func (x *Request_Params_Scheduling) GetUnmanagedPool() string {
	if x, ok := x.GetPool().(*Request_Params_Scheduling_UnmanagedPool); ok {
		return x.UnmanagedPool
	}
	return ""
}

func (x *Request_Params_Scheduling) GetPriority() int64 {
	if x != nil {
		return x.Priority
	}
	return 0
}

func (x *Request_Params_Scheduling) GetQsAccount() string {
	if x != nil {
		return x.QsAccount
	}
	return ""
}

type isRequest_Params_Scheduling_Pool interface {
	isRequest_Params_Scheduling_Pool()
}

type Request_Params_Scheduling_ManagedPool_ struct {
	// Managed pool of devices to run tests in.
	ManagedPool Request_Params_Scheduling_ManagedPool `protobuf:"varint,1,opt,name=managed_pool,json=managedPool,proto3,enum=test_platform.Request_Params_Scheduling_ManagedPool,oneof"`
}

type Request_Params_Scheduling_UnmanagedPool struct {
	// Unmanaged pool of devices to run tests in.
	// Must not be a managed pool.
	UnmanagedPool string `protobuf:"bytes,2,opt,name=unmanaged_pool,json=unmanagedPool,proto3,oneof"`
}

func (*Request_Params_Scheduling_ManagedPool_) isRequest_Params_Scheduling_Pool() {}

func (*Request_Params_Scheduling_UnmanagedPool) isRequest_Params_Scheduling_Pool() {}

// Retry defines parameters that affect how failed tests within
// a request are retried.
type Request_Params_Retry struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Whether to allow test retries.
	Allow bool `protobuf:"varint,1,opt,name=allow,proto3" json:"allow,omitempty"`
	// Maximum number of retries of tests within this invocation to allow.
	// 0 = unlimited.
	Max int32 `protobuf:"varint,2,opt,name=max,proto3" json:"max,omitempty"`
}

func (x *Request_Params_Retry) Reset() {
	*x = Request_Params_Retry{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Params_Retry) ProtoMessage() {}

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

func (x *Request_Params_Retry) GetAllow() bool {
	if x != nil {
		return x.Allow
	}
	return false
}

func (x *Request_Params_Retry) GetMax() int32 {
	if x != nil {
		return x.Max
	}
	return 0
}

// Metadata defines parameters that determine where test definitions
// and metadata are stored and discovered from.
type Request_Params_Metadata struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A Google Storage path to the location of test metadata to be used.
	// For example:
	// "gs://chromeos-image-archive/arkham-release/R57-9202.10.11".
	TestMetadataUrl string `protobuf:"bytes,1,opt,name=test_metadata_url,json=testMetadataUrl,proto3" json:"test_metadata_url,omitempty"`
	// A Google Storage path to the location of image archive in which to find
	// debug symbols to be used in post-process symbolication of crashes. This
	// is generally the same as test_metadata_url.
	DebugSymbolsArchiveUrl string `protobuf:"bytes,2,opt,name=debug_symbols_archive_url,json=debugSymbolsArchiveUrl,proto3" json:"debug_symbols_archive_url,omitempty"`
}

func (x *Request_Params_Metadata) Reset() {
	*x = Request_Params_Metadata{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Params_Metadata) ProtoMessage() {}

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

func (x *Request_Params_Metadata) GetTestMetadataUrl() string {
	if x != nil {
		return x.TestMetadataUrl
	}
	return ""
}

func (x *Request_Params_Metadata) GetDebugSymbolsArchiveUrl() string {
	if x != nil {
		return x.DebugSymbolsArchiveUrl
	}
	return ""
}

// Time defines parameters related to timeouts.
type Request_Params_Time struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Maximum duration for the entire request to be handled.
	MaximumDuration *duration.Duration `protobuf:"bytes,1,opt,name=maximum_duration,json=maximumDuration,proto3" json:"maximum_duration,omitempty"`
}

func (x *Request_Params_Time) Reset() {
	*x = Request_Params_Time{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Params_Time) ProtoMessage() {}

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

func (x *Request_Params_Time) GetMaximumDuration() *duration.Duration {
	if x != nil {
		return x.MaximumDuration
	}
	return nil
}

// Decorations defines parameters that add additional decorations to
// test runs.
type Request_Params_Decorations struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// AutotestKeyvals are (key, value) pairs that will be added to all
	// autotest tasks run.
	AutotestKeyvals map[string]string `protobuf:"bytes,1,rep,name=autotest_keyvals,json=autotestKeyvals,proto3" json:"autotest_keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Tags are swarming tags that will be applied to all swarming tasks
	// launched.
	Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
}

func (x *Request_Params_Decorations) Reset() {
	*x = Request_Params_Decorations{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Params_Decorations) ProtoMessage() {}

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

func (x *Request_Params_Decorations) GetAutotestKeyvals() map[string]string {
	if x != nil {
		return x.AutotestKeyvals
	}
	return nil
}

func (x *Request_Params_Decorations) GetTags() []string {
	if x != nil {
		return x.Tags
	}
	return nil
}

// Migrations defines parameters that facilitate gradual migrations between
// different implementations of downstream components.
type Request_Params_Migrations struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *Request_Params_Migrations) Reset() {
	*x = Request_Params_Migrations{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Params_Migrations) ProtoMessage() {}

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

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

	Name     string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	TestArgs string `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	// Name to be used to display this test's output artifacts, e.g. logs,
	// results etc. By default display_name is the same as name.
	//
	// display_name is especially useful when using test_args to distinguish
	// between multiple instances of the same test in a request.
	DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
}

func (x *Request_Test_Autotest) Reset() {
	*x = Request_Test_Autotest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Test_Autotest) ProtoMessage() {}

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

func (x *Request_Test_Autotest) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Request_Test_Autotest) GetTestArgs() string {
	if x != nil {
		return x.TestArgs
	}
	return ""
}

func (x *Request_Test_Autotest) GetDisplayName() string {
	if x != nil {
		return x.DisplayName
	}
	return ""
}

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

	Test          *api.AutotestTest `protobuf:"bytes,1,opt,name=test,proto3" json:"test,omitempty"`
	TestArgs      string            `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	DisplayName   string            `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	ResultKeyvals map[string]string `protobuf:"bytes,4,rep,name=result_keyvals,json=resultKeyvals,proto3" json:"result_keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

func (x *Request_Enumeration_AutotestInvocation) Reset() {
	*x = Request_Enumeration_AutotestInvocation{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_request_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Request_Enumeration_AutotestInvocation) ProtoMessage() {}

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

func (x *Request_Enumeration_AutotestInvocation) GetTest() *api.AutotestTest {
	if x != nil {
		return x.Test
	}
	return nil
}

func (x *Request_Enumeration_AutotestInvocation) GetTestArgs() string {
	if x != nil {
		return x.TestArgs
	}
	return ""
}

func (x *Request_Enumeration_AutotestInvocation) GetDisplayName() string {
	if x != nil {
		return x.DisplayName
	}
	return ""
}

func (x *Request_Enumeration_AutotestInvocation) GetResultKeyvals() map[string]string {
	if x != nil {
		return x.ResultKeyvals
	}
	return nil
}

var File_test_platform_request_proto protoreflect.FileDescriptor

var file_test_platform_request_proto_rawDesc = []byte{
	0x0a, 0x1b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x20, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
	0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
	0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfa, 0x19, 0x0a,
	0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61,
	0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12,
	0x3c, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
	0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50,
	0x6c, 0x61, 0x6e, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x1a, 0xac, 0x12,
	0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x61, 0x0a, 0x13, 0x68, 0x61, 0x72, 0x64,
	0x77, 0x61, 0x72, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61,
	0x72, 0x61, 0x6d, 0x73, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x41, 0x74, 0x74,
	0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x12, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72,
	0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x13, 0x73,
	0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
	0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
	0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x12, 0x73, 0x6f, 0x66, 0x74,
	0x77, 0x61, 0x72, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x61,
	0x0a, 0x13, 0x66, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69,
	0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x46, 0x72, 0x65, 0x65, 0x66,
	0x6f, 0x72, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x12, 0x66,
	0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
	0x73, 0x12, 0x65, 0x0a, 0x15, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x64, 0x65,
	0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x30, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e,
	0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e,
	0x63, 0x79, 0x52, 0x14, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x44, 0x65, 0x70, 0x65,
	0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0a, 0x73, 0x63, 0x68, 0x65,
	0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65,
	0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69,
	0x6e, 0x67, 0x12, 0x39, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
	0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x12, 0x42, 0x0a,
	0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x26, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x4d,
	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
	0x61, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x54,
	0x69, 0x6d, 0x65, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x64, 0x65, 0x63,
	0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x44, 0x65,
	0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6f, 0x72,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x12, 0x47, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61,
	0x72, 0x61, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
	0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75,
	0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x1a, 0x2a, 0x0a, 0x12, 0x48, 0x61, 0x72,
	0x64, 0x77, 0x61, 0x72, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12,
	0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
	0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0x50, 0x0a, 0x12, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72,
	0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x1a, 0x45, 0x0a, 0x12, 0x46, 0x72, 0x65, 0x65, 0x66,
	0x6f, 0x72, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a,
	0x13, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73,
	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x73, 0x77, 0x61, 0x72,
	0x6d, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xca,
	0x01, 0x0a, 0x12, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e,
	0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x27, 0x0a, 0x0e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f,
	0x73, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
	0x0d, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2c,
	0x0a, 0x11, 0x72, 0x6f, 0x5f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x6f, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2c, 0x0a, 0x11,
	0x72, 0x77, 0x5f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x77, 0x46, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x6c, 0x61,
	0x63, 0x72, 0x6f, 0x73, 0x5f, 0x67, 0x63, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20,
	0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x6c, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x47, 0x63, 0x73,
	0x50, 0x61, 0x74, 0x68, 0x42, 0x05, 0x0a, 0x03, 0x64, 0x65, 0x70, 0x1a, 0xcf, 0x03, 0x0a, 0x0a,
	0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x59, 0x0a, 0x0c, 0x6d, 0x61,
	0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x34, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e,
	0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67,
	0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65,
	0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x27, 0x0a, 0x0e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67,
	0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
	0x0d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a,
	0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
	0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x73,
	0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
	0x71, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xf9, 0x01, 0x0a, 0x0b, 0x4d, 0x61,
	0x6e, 0x61, 0x67, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x4e,
	0x41, 0x47, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x41, 0x4e, 0x41, 0x47,
	0x45, 0x44, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x43, 0x51, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10,
	0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x42, 0x56, 0x54,
	0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x50, 0x4f,
	0x4f, 0x4c, 0x5f, 0x53, 0x55, 0x49, 0x54, 0x45, 0x53, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4d,
	0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x43, 0x54, 0x53, 0x10,
	0x04, 0x12, 0x1d, 0x0a, 0x19, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x4f,
	0x4c, 0x5f, 0x43, 0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x05,
	0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x4f, 0x4c,
	0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x06, 0x12, 0x1e, 0x0a,
	0x1a, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x41, 0x52,
	0x43, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54, 0x10, 0x07, 0x12, 0x16, 0x0a,
	0x12, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x51, 0x55,
	0x4f, 0x54, 0x41, 0x10, 0x08, 0x42, 0x06, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x1a, 0x2f, 0x0a,
	0x05, 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x03,
	0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x1a, 0x71,
	0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65,
	0x73, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x72, 0x6c, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64,
	0x61, 0x74, 0x61, 0x55, 0x72, 0x6c, 0x12, 0x39, 0x0a, 0x19, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f,
	0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x5f,
	0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x64, 0x65, 0x62, 0x75, 0x67,
	0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x55, 0x72,
	0x6c, 0x1a, 0x4c, 0x0a, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x6d, 0x61, 0x78,
	0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f,
	0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a,
	0xd0, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
	0x69, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x76,
	0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79,
	0x76, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x74,
	0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61,
	0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x42,
	0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x76, 0x61, 0x6c,
	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
	0x38, 0x01, 0x1a, 0x65, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03,
	0x10, 0x04, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e,
	0x6e, 0x65, 0x72, 0x52, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63,
	0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x5f, 0x6f, 0x66, 0x66, 0x6c, 0x6f, 0x61, 0x64, 0x52,
	0x18, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73,
	0x73, 0x5f, 0x6f, 0x66, 0x66, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a,
	0x04, 0x08, 0x0a, 0x10, 0x0b, 0x52, 0x0d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x06, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x1a, 0x1b, 0x0a, 0x05,
	0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0xb5, 0x01, 0x0a, 0x04, 0x54, 0x65,
	0x73, 0x74, 0x12, 0x42, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73,
	0x74, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x61, 0x75,
	0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x1a, 0x5e, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65,
	0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61,
	0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x41,
	0x72, 0x67, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c,
	0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x68, 0x61, 0x72, 0x6e, 0x65, 0x73,
	0x73, 0x1a, 0xb1, 0x03, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x68, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e,
	0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x35, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x6f,
	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74,
	0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xb7, 0x02, 0x0a, 0x12,
	0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x04, 0x74, 0x65,
	0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12,
	0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61,
	0x6d, 0x65, 0x12, 0x6f, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6b, 0x65, 0x79,
	0x76, 0x61, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41,
	0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4b, 0x65, 0x79, 0x76, 0x61, 0x6c, 0x73, 0x45,
	0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4b, 0x65, 0x79, 0x76,
	0x61, 0x6c, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4b, 0x65, 0x79,
	0x76, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xb5, 0x01, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x50, 0x6c,
	0x61, 0x6e, 0x12, 0x32, 0x0a, 0x05, 0x73, 0x75, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x75, 0x69, 0x74, 0x65, 0x52,
	0x05, 0x73, 0x75, 0x69, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x02,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73,
	0x74, 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x65,
	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x52, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08,
	0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x42, 0x39, 0x5a, 0x37, 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, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_request_proto_rawDescOnce sync.Once
	file_test_platform_request_proto_rawDescData = file_test_platform_request_proto_rawDesc
)

func file_test_platform_request_proto_rawDescGZIP() []byte {
	file_test_platform_request_proto_rawDescOnce.Do(func() {
		file_test_platform_request_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_request_proto_rawDescData)
	})
	return file_test_platform_request_proto_rawDescData
}

var file_test_platform_request_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_test_platform_request_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
var file_test_platform_request_proto_goTypes = []interface{}{
	(Request_Params_Scheduling_ManagedPool)(0), // 0: test_platform.Request.Params.Scheduling.ManagedPool
	(*Request)(nil),                                // 1: test_platform.Request
	(*Request_Params)(nil),                         // 2: test_platform.Request.Params
	(*Request_Suite)(nil),                          // 3: test_platform.Request.Suite
	(*Request_Test)(nil),                           // 4: test_platform.Request.Test
	(*Request_Enumeration)(nil),                    // 5: test_platform.Request.Enumeration
	(*Request_TestPlan)(nil),                       // 6: test_platform.Request.TestPlan
	(*Request_Params_HardwareAttributes)(nil),      // 7: test_platform.Request.Params.HardwareAttributes
	(*Request_Params_SoftwareAttributes)(nil),      // 8: test_platform.Request.Params.SoftwareAttributes
	(*Request_Params_FreeformAttributes)(nil),      // 9: test_platform.Request.Params.FreeformAttributes
	(*Request_Params_SoftwareDependency)(nil),      // 10: test_platform.Request.Params.SoftwareDependency
	(*Request_Params_Scheduling)(nil),              // 11: test_platform.Request.Params.Scheduling
	(*Request_Params_Retry)(nil),                   // 12: test_platform.Request.Params.Retry
	(*Request_Params_Metadata)(nil),                // 13: test_platform.Request.Params.Metadata
	(*Request_Params_Time)(nil),                    // 14: test_platform.Request.Params.Time
	(*Request_Params_Decorations)(nil),             // 15: test_platform.Request.Params.Decorations
	(*Request_Params_Migrations)(nil),              // 16: test_platform.Request.Params.Migrations
	nil,                                            // 17: test_platform.Request.Params.Decorations.AutotestKeyvalsEntry
	(*Request_Test_Autotest)(nil),                  // 18: test_platform.Request.Test.Autotest
	(*Request_Enumeration_AutotestInvocation)(nil), // 19: test_platform.Request.Enumeration.AutotestInvocation
	nil,                            // 20: test_platform.Request.Enumeration.AutotestInvocation.ResultKeyvalsEntry
	(*execution.Param)(nil),        // 21: test_platform.execution.Param
	(*chromiumos.BuildTarget)(nil), // 22: chromiumos.BuildTarget
	(*duration.Duration)(nil),      // 23: google.protobuf.Duration
	(*api.AutotestTest)(nil),       // 24: chromite.api.AutotestTest
}
var file_test_platform_request_proto_depIdxs = []int32{
	2,  // 0: test_platform.Request.params:type_name -> test_platform.Request.Params
	6,  // 1: test_platform.Request.test_plan:type_name -> test_platform.Request.TestPlan
	7,  // 2: test_platform.Request.Params.hardware_attributes:type_name -> test_platform.Request.Params.HardwareAttributes
	8,  // 3: test_platform.Request.Params.software_attributes:type_name -> test_platform.Request.Params.SoftwareAttributes
	9,  // 4: test_platform.Request.Params.freeform_attributes:type_name -> test_platform.Request.Params.FreeformAttributes
	10, // 5: test_platform.Request.Params.software_dependencies:type_name -> test_platform.Request.Params.SoftwareDependency
	11, // 6: test_platform.Request.Params.scheduling:type_name -> test_platform.Request.Params.Scheduling
	12, // 7: test_platform.Request.Params.retry:type_name -> test_platform.Request.Params.Retry
	13, // 8: test_platform.Request.Params.metadata:type_name -> test_platform.Request.Params.Metadata
	14, // 9: test_platform.Request.Params.time:type_name -> test_platform.Request.Params.Time
	15, // 10: test_platform.Request.Params.decorations:type_name -> test_platform.Request.Params.Decorations
	16, // 11: test_platform.Request.Params.migrations:type_name -> test_platform.Request.Params.Migrations
	21, // 12: test_platform.Request.Params.execution_param:type_name -> test_platform.execution.Param
	18, // 13: test_platform.Request.Test.autotest:type_name -> test_platform.Request.Test.Autotest
	19, // 14: test_platform.Request.Enumeration.autotest_invocations:type_name -> test_platform.Request.Enumeration.AutotestInvocation
	3,  // 15: test_platform.Request.TestPlan.suite:type_name -> test_platform.Request.Suite
	4,  // 16: test_platform.Request.TestPlan.test:type_name -> test_platform.Request.Test
	5,  // 17: test_platform.Request.TestPlan.enumeration:type_name -> test_platform.Request.Enumeration
	22, // 18: test_platform.Request.Params.SoftwareAttributes.build_target:type_name -> chromiumos.BuildTarget
	0,  // 19: test_platform.Request.Params.Scheduling.managed_pool:type_name -> test_platform.Request.Params.Scheduling.ManagedPool
	23, // 20: test_platform.Request.Params.Time.maximum_duration:type_name -> google.protobuf.Duration
	17, // 21: test_platform.Request.Params.Decorations.autotest_keyvals:type_name -> test_platform.Request.Params.Decorations.AutotestKeyvalsEntry
	24, // 22: test_platform.Request.Enumeration.AutotestInvocation.test:type_name -> chromite.api.AutotestTest
	20, // 23: test_platform.Request.Enumeration.AutotestInvocation.result_keyvals:type_name -> test_platform.Request.Enumeration.AutotestInvocation.ResultKeyvalsEntry
	24, // [24:24] is the sub-list for method output_type
	24, // [24:24] is the sub-list for method input_type
	24, // [24:24] is the sub-list for extension type_name
	24, // [24:24] is the sub-list for extension extendee
	0,  // [0:24] is the sub-list for field type_name
}

func init() { file_test_platform_request_proto_init() }
func file_test_platform_request_proto_init() {
	if File_test_platform_request_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_request_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Suite); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Test); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Enumeration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_TestPlan); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_HardwareAttributes); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_SoftwareAttributes); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_FreeformAttributes); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_SoftwareDependency); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_Scheduling); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_Retry); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_Metadata); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_Time); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_Decorations); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Params_Migrations); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Test_Autotest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_request_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Enumeration_AutotestInvocation); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_test_platform_request_proto_msgTypes[3].OneofWrappers = []interface{}{
		(*Request_Test_Autotest_)(nil),
	}
	file_test_platform_request_proto_msgTypes[9].OneofWrappers = []interface{}{
		(*Request_Params_SoftwareDependency_ChromeosBuild)(nil),
		(*Request_Params_SoftwareDependency_RoFirmwareBuild)(nil),
		(*Request_Params_SoftwareDependency_RwFirmwareBuild)(nil),
		(*Request_Params_SoftwareDependency_LacrosGcsPath)(nil),
	}
	file_test_platform_request_proto_msgTypes[10].OneofWrappers = []interface{}{
		(*Request_Params_Scheduling_ManagedPool_)(nil),
		(*Request_Params_Scheduling_UnmanagedPool)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_request_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   20,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_request_proto_goTypes,
		DependencyIndexes: file_test_platform_request_proto_depIdxs,
		EnumInfos:         file_test_platform_request_proto_enumTypes,
		MessageInfos:      file_test_platform_request_proto_msgTypes,
	}.Build()
	File_test_platform_request_proto = out.File
	file_test_platform_request_proto_rawDesc = nil
	file_test_platform_request_proto_goTypes = nil
	file_test_platform_request_proto_depIdxs = nil
}
