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

package skylab_test_runner

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

// Request represents a request for running an individual test via the
// skylab_test_runner recipe.
type Request struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Prejob *Request_Prejob `protobuf:"bytes,1,opt,name=prejob,proto3" json:"prejob,omitempty"`
	Test   *Request_Test   `protobuf:"bytes,2,opt,name=test,proto3" json:"test,omitempty"`
	// Soft deadline for test_runner execution.
	//
	// All prejob or test execution should abort beyond this deadline.
	// Clean up actions may execute beyond the deadline.
	Deadline *timestamp.Timestamp `protobuf:"bytes,3,opt,name=deadline,proto3" json:"deadline,omitempty"`
	// The UID of the individual CTP request which kicked off this test run.
	// Note that distinct requests inside a multi-request CTP build will have
	// different UIDs.
	ParentRequestUid string `protobuf:"bytes,4,opt,name=parent_request_uid,json=parentRequestUid,proto3" json:"parent_request_uid,omitempty"`
	// The buildbucket ID of the CTP build that sent this test_runner request.
	ParentBuildId int64 `protobuf:"varint,5,opt,name=parent_build_id,json=parentBuildId,proto3" json:"parent_build_id,omitempty"`
	// Set of Tests to run. The string is a UUID provided by the client
	// and used to identify each test result in the response.
	Tests map[string]*Request_Test `protobuf:"bytes,6,rep,name=tests,proto3" json:"tests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Uniformly applied parameters for all test executions in the parent test
	// platform request.
	ExecutionParam *execution.Param `protobuf:"bytes,7,opt,name=execution_param,json=executionParam,proto3" json:"execution_param,omitempty"`
}

func (x *Request) Reset() {
	*x = Request{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_test_runner_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_skylab_test_runner_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_skylab_test_runner_request_proto_rawDescGZIP(), []int{0}
}

func (x *Request) GetPrejob() *Request_Prejob {
	if x != nil {
		return x.Prejob
	}
	return nil
}

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

func (x *Request) GetDeadline() *timestamp.Timestamp {
	if x != nil {
		return x.Deadline
	}
	return nil
}

func (x *Request) GetParentRequestUid() string {
	if x != nil {
		return x.ParentRequestUid
	}
	return ""
}

func (x *Request) GetParentBuildId() int64 {
	if x != nil {
		return x.ParentBuildId
	}
	return 0
}

func (x *Request) GetTests() map[string]*Request_Test {
	if x != nil {
		return x.Tests
	}
	return nil
}

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

// Prejob defines parameters that affect the steps before the actual test
// (e.g. provision).
type Request_Prejob struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// What needs to be installed onto the DUT at the end of prejob, as specified
	// in the cros_test_platform request.
	SoftwareDependencies []*test_platform.Request_Params_SoftwareDependency `protobuf:"bytes,1,rep,name=software_dependencies,json=softwareDependencies,proto3" json:"software_dependencies,omitempty"`
	// Mutable software prerequisites. Are installed before running the test if
	// necessary. E.g. {"cros-version" : "reef-release/R77-12345.0.0"}
	// TODO(crbug.com/1162347): Delete this post-migration.
	//
	// Deprecated: Do not use.
	ProvisionableLabels map[string]string `protobuf:"bytes,2,rep,name=provisionable_labels,json=provisionableLabels,proto3" json:"provisionable_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// If set, use the Provision TLS API for the prejob.
	// See go/cros-prover go/cros-tls
	//
	// crbug.com/1137444: This is a transitional argument. Once go/cros-prover
	// migration is complete, all prejobs will use the TLS API and this argument
	// will be dropped.
	UseTls bool `protobuf:"varint,3,opt,name=use_tls,json=useTls,proto3" json:"use_tls,omitempty"`
}

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

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

func (*Request_Prejob) ProtoMessage() {}

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

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

// Deprecated: Do not use.
func (x *Request_Prejob) GetProvisionableLabels() map[string]string {
	if x != nil {
		return x.ProvisionableLabels
	}
	return nil
}

func (x *Request_Prejob) GetUseTls() bool {
	if x != nil {
		return x.UseTls
	}
	return false
}

// Test describes which test harness and which test(s) to run.
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"`
	Offload *Request_Test_OffloadOptions `protobuf:"bytes,2,opt,name=offload,proto3" json:"offload,omitempty"`
}

func (x *Request_Test) Reset() {
	*x = Request_Test{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_test_runner_request_proto_msgTypes[2]
		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_skylab_test_runner_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_Test.ProtoReflect.Descriptor instead.
func (*Request_Test) Descriptor() ([]byte, []int) {
	return file_test_platform_skylab_test_runner_request_proto_rawDescGZIP(), []int{0, 1}
}

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
}

func (x *Request_Test) GetOffload() *Request_Test_OffloadOptions {
	if x != nil {
		return x.Offload
	}
	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() {}

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"`
	// Keyvals are key:value pairs added to the autoserv command.
	Keyvals map[string]string `protobuf:"bytes,3,rep,name=keyvals,proto3" json:"keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// If true, run the test as a client-side test: the test logic is
	// executed in its entirety on the DUT itself.
	// Otherwise, run the test as a server-side test: the test logic is
	// executed on the drone server and interacts with the DUT as an external
	// object.
	IsClientTest bool `protobuf:"varint,4,opt,name=is_client_test,json=isClientTest,proto3" json:"is_client_test,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,5,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_skylab_test_runner_request_proto_msgTypes[5]
		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_skylab_test_runner_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_Test_Autotest.ProtoReflect.Descriptor instead.
func (*Request_Test_Autotest) Descriptor() ([]byte, []int) {
	return file_test_platform_skylab_test_runner_request_proto_rawDescGZIP(), []int{0, 1, 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) GetKeyvals() map[string]string {
	if x != nil {
		return x.Keyvals
	}
	return nil
}

func (x *Request_Test_Autotest) GetIsClientTest() bool {
	if x != nil {
		return x.IsClientTest
	}
	return false
}

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

// User-specified options for how results are served to clients
type Request_Test_OffloadOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// If this test needs synchronous offloading of results to Google Storage
	SynchronousGsEnable bool `protobuf:"varint,1,opt,name=synchronous_gs_enable,json=synchronousGsEnable,proto3" json:"synchronous_gs_enable,omitempty"`
}

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

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

func (*Request_Test_OffloadOptions) ProtoMessage() {}

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

func (x *Request_Test_OffloadOptions) GetSynchronousGsEnable() bool {
	if x != nil {
		return x.SynchronousGsEnable
	}
	return false
}

var File_test_platform_skylab_test_runner_request_proto protoreflect.FileDescriptor

var file_test_platform_skylab_test_runner_request_proto_rawDesc = []byte{
	0x0a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e,
	0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x20, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e,
	0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e,
	0x65, 0x72, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 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, 0x1a, 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, 0x22, 0xa7, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x48, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75,
	0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x65,
	0x6a, 0x6f, 0x62, 0x52, 0x06, 0x70, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x12, 0x42, 0x0a, 0x04, 0x74,
	0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x12,
	0x36, 0x0a, 0x08, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x64,
	0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x65, 0x6e,
	0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x55, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d,
	0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x4a, 0x0a,
	0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79,
	0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74,
	0x72, 0x79, 0x52, 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x65, 0x78, 0x65,
	0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x07, 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, 0xd3, 0x02, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x6a, 0x6f, 0x62, 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, 0x01, 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, 0x80, 0x01, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69,
	0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50,
	0x72, 0x65, 0x6a, 0x6f, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x61,
	0x62, 0x6c, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02,
	0x18, 0x01, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c,
	0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x5f, 0x74,
	0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, 0x73, 0x65, 0x54, 0x6c, 0x73,
	0x1a, 0x46, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c,
	0x65, 0x4c, 0x61, 0x62, 0x65, 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, 0xaa, 0x04, 0x0a, 0x04, 0x54, 0x65, 0x73,
	0x74, 0x12, 0x55, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 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, 0x12, 0x57, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x6c,
	0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x66, 0x66, 0x6c, 0x6f, 0x61,
	0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x6c, 0x6f, 0x61,
	0x64, 0x1a, 0xa0, 0x02, 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,
	0x5e, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x76, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x44, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e,
	0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74,
	0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x4b, 0x65, 0x79, 0x76, 0x61, 0x6c,
	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x76, 0x61, 0x6c, 0x73, 0x12,
	0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x65, 0x73,
	0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x43, 0x6c, 0x69, 0x65, 0x6e,
	0x74, 0x54, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79,
	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73,
	0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 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, 0x44, 0x0a, 0x0e, 0x4f, 0x66, 0x66, 0x6c, 0x6f, 0x61, 0x64, 0x4f,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72,
	0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x5f, 0x67, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f,
	0x75, 0x73, 0x47, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x68, 0x61,
	0x72, 0x6e, 0x65, 0x73, 0x73, 0x1a, 0x68, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 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, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
	0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42,
	0x4c, 0x5a, 0x4a, 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, 0x73, 0x6b, 0x79, 0x6c, 0x61,
	0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x62, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_skylab_test_runner_request_proto_rawDescOnce sync.Once
	file_test_platform_skylab_test_runner_request_proto_rawDescData = file_test_platform_skylab_test_runner_request_proto_rawDesc
)

func file_test_platform_skylab_test_runner_request_proto_rawDescGZIP() []byte {
	file_test_platform_skylab_test_runner_request_proto_rawDescOnce.Do(func() {
		file_test_platform_skylab_test_runner_request_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_skylab_test_runner_request_proto_rawDescData)
	})
	return file_test_platform_skylab_test_runner_request_proto_rawDescData
}

var file_test_platform_skylab_test_runner_request_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_test_platform_skylab_test_runner_request_proto_goTypes = []interface{}{
	(*Request)(nil),                     // 0: test_platform.skylab_test_runner.Request
	(*Request_Prejob)(nil),              // 1: test_platform.skylab_test_runner.Request.Prejob
	(*Request_Test)(nil),                // 2: test_platform.skylab_test_runner.Request.Test
	nil,                                 // 3: test_platform.skylab_test_runner.Request.TestsEntry
	nil,                                 // 4: test_platform.skylab_test_runner.Request.Prejob.ProvisionableLabelsEntry
	(*Request_Test_Autotest)(nil),       // 5: test_platform.skylab_test_runner.Request.Test.Autotest
	(*Request_Test_OffloadOptions)(nil), // 6: test_platform.skylab_test_runner.Request.Test.OffloadOptions
	nil,                                 // 7: test_platform.skylab_test_runner.Request.Test.Autotest.KeyvalsEntry
	(*timestamp.Timestamp)(nil),         // 8: google.protobuf.Timestamp
	(*execution.Param)(nil),             // 9: test_platform.execution.Param
	(*test_platform.Request_Params_SoftwareDependency)(nil), // 10: test_platform.Request.Params.SoftwareDependency
}
var file_test_platform_skylab_test_runner_request_proto_depIdxs = []int32{
	1,  // 0: test_platform.skylab_test_runner.Request.prejob:type_name -> test_platform.skylab_test_runner.Request.Prejob
	2,  // 1: test_platform.skylab_test_runner.Request.test:type_name -> test_platform.skylab_test_runner.Request.Test
	8,  // 2: test_platform.skylab_test_runner.Request.deadline:type_name -> google.protobuf.Timestamp
	3,  // 3: test_platform.skylab_test_runner.Request.tests:type_name -> test_platform.skylab_test_runner.Request.TestsEntry
	9,  // 4: test_platform.skylab_test_runner.Request.execution_param:type_name -> test_platform.execution.Param
	10, // 5: test_platform.skylab_test_runner.Request.Prejob.software_dependencies:type_name -> test_platform.Request.Params.SoftwareDependency
	4,  // 6: test_platform.skylab_test_runner.Request.Prejob.provisionable_labels:type_name -> test_platform.skylab_test_runner.Request.Prejob.ProvisionableLabelsEntry
	5,  // 7: test_platform.skylab_test_runner.Request.Test.autotest:type_name -> test_platform.skylab_test_runner.Request.Test.Autotest
	6,  // 8: test_platform.skylab_test_runner.Request.Test.offload:type_name -> test_platform.skylab_test_runner.Request.Test.OffloadOptions
	2,  // 9: test_platform.skylab_test_runner.Request.TestsEntry.value:type_name -> test_platform.skylab_test_runner.Request.Test
	7,  // 10: test_platform.skylab_test_runner.Request.Test.Autotest.keyvals:type_name -> test_platform.skylab_test_runner.Request.Test.Autotest.KeyvalsEntry
	11, // [11:11] is the sub-list for method output_type
	11, // [11:11] is the sub-list for method input_type
	11, // [11:11] is the sub-list for extension type_name
	11, // [11:11] is the sub-list for extension extendee
	0,  // [0:11] is the sub-list for field type_name
}

func init() { file_test_platform_skylab_test_runner_request_proto_init() }
func file_test_platform_skylab_test_runner_request_proto_init() {
	if File_test_platform_skylab_test_runner_request_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_skylab_test_runner_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_skylab_test_runner_request_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Prejob); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_skylab_test_runner_request_proto_msgTypes[2].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_skylab_test_runner_request_proto_msgTypes[5].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_skylab_test_runner_request_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Request_Test_OffloadOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_test_platform_skylab_test_runner_request_proto_msgTypes[2].OneofWrappers = []interface{}{
		(*Request_Test_Autotest_)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_skylab_test_runner_request_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   8,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_skylab_test_runner_request_proto_goTypes,
		DependencyIndexes: file_test_platform_skylab_test_runner_request_proto_depIdxs,
		MessageInfos:      file_test_platform_skylab_test_runner_request_proto_msgTypes,
	}.Build()
	File_test_platform_skylab_test_runner_request_proto = out.File
	file_test_platform_skylab_test_runner_request_proto_rawDesc = nil
	file_test_platform_skylab_test_runner_request_proto_goTypes = nil
	file_test_platform_skylab_test_runner_request_proto_depIdxs = nil
}
