// Proto config.

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

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	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)
)

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

	// The chroot used to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Target directory for the RTD dirs.
	TargetDir *chromiumos.ResultPath `protobuf:"bytes,2,opt,name=target_dir,json=targetDir,proto3" json:"target_dir,omitempty"`
}

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

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

func (*AssembleRequest) ProtoMessage() {}

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

func (x *AssembleRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *AssembleRequest) GetTargetDir() *chromiumos.ResultPath {
	if x != nil {
		return x.TargetDir
	}
	return nil
}

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

	RemoteTestDrivers []*RemoteTestDriver `protobuf:"bytes,1,rep,name=remote_test_drivers,json=remoteTestDrivers,proto3" json:"remote_test_drivers,omitempty"`
}

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

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

func (*AssembleResponse) ProtoMessage() {}

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

func (x *AssembleResponse) GetRemoteTestDrivers() []*RemoteTestDriver {
	if x != nil {
		return x.RemoteTestDrivers
	}
	return nil
}

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

	// A folder containing the files needed to build a docker image for
	// the Remote Test Driver. This folder will contain a Dockerfile in addition
	// to test harness(es) and content. It will be such that `gcloud builds
	// submit` can be invoked in the directory.
	BuildContext *chromiumos.Path `protobuf:"bytes,1,opt,name=build_context,json=buildContext,proto3" json:"build_context,omitempty"`
}

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

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

func (*RemoteTestDriver) ProtoMessage() {}

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

func (x *RemoteTestDriver) GetBuildContext() *chromiumos.Path {
	if x != nil {
		return x.BuildContext
	}
	return nil
}

var File_chromite_api_remote_test_driver_proto protoreflect.FileDescriptor

var file_chromite_api_remote_test_driver_proto_rawDesc = []byte{
	0x0a, 0x25, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72,
	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65,
	0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f,
	0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x70, 0x69, 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, 0x22, 0x74, 0x0a, 0x0f,
	0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
	0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72,
	0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x74,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44,
	0x69, 0x72, 0x22, 0x62, 0x0a, 0x10, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x44, 0x72, 0x69,
	0x76, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x44,
	0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x22, 0x49, 0x0a, 0x10, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65,
	0x54, 0x65, 0x73, 0x74, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0d, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x10, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50,
	0x61, 0x74, 0x68, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78,
	0x74, 0x32, 0x80, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74,
	0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a,
	0x08, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c,
	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x1a, 0xc2, 0xed, 0x1a, 0x16, 0x0a, 0x12,
	0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x72, 0x69, 0x76,
	0x65, 0x72, 0x10, 0x01, 0x42, 0x38, 0x5a, 0x36, 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, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_remote_test_driver_proto_rawDescOnce sync.Once
	file_chromite_api_remote_test_driver_proto_rawDescData = file_chromite_api_remote_test_driver_proto_rawDesc
)

func file_chromite_api_remote_test_driver_proto_rawDescGZIP() []byte {
	file_chromite_api_remote_test_driver_proto_rawDescOnce.Do(func() {
		file_chromite_api_remote_test_driver_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_remote_test_driver_proto_rawDescData)
	})
	return file_chromite_api_remote_test_driver_proto_rawDescData
}

var file_chromite_api_remote_test_driver_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_chromite_api_remote_test_driver_proto_goTypes = []interface{}{
	(*AssembleRequest)(nil),       // 0: chromite.api.AssembleRequest
	(*AssembleResponse)(nil),      // 1: chromite.api.AssembleResponse
	(*RemoteTestDriver)(nil),      // 2: chromite.api.RemoteTestDriver
	(*chromiumos.Chroot)(nil),     // 3: chromiumos.Chroot
	(*chromiumos.ResultPath)(nil), // 4: chromiumos.ResultPath
	(*chromiumos.Path)(nil),       // 5: chromiumos.Path
}
var file_chromite_api_remote_test_driver_proto_depIdxs = []int32{
	3, // 0: chromite.api.AssembleRequest.chroot:type_name -> chromiumos.Chroot
	4, // 1: chromite.api.AssembleRequest.target_dir:type_name -> chromiumos.ResultPath
	2, // 2: chromite.api.AssembleResponse.remote_test_drivers:type_name -> chromite.api.RemoteTestDriver
	5, // 3: chromite.api.RemoteTestDriver.build_context:type_name -> chromiumos.Path
	0, // 4: chromite.api.RemoteTestDriverService.Assemble:input_type -> chromite.api.AssembleRequest
	1, // 5: chromite.api.RemoteTestDriverService.Assemble:output_type -> chromite.api.AssembleResponse
	5, // [5:6] is the sub-list for method output_type
	4, // [4:5] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_chromite_api_remote_test_driver_proto_init() }
func file_chromite_api_remote_test_driver_proto_init() {
	if File_chromite_api_remote_test_driver_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_remote_test_driver_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AssembleRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_remote_test_driver_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AssembleResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_remote_test_driver_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RemoteTestDriver); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_remote_test_driver_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_remote_test_driver_proto_goTypes,
		DependencyIndexes: file_chromite_api_remote_test_driver_proto_depIdxs,
		MessageInfos:      file_chromite_api_remote_test_driver_proto_msgTypes,
	}.Build()
	File_chromite_api_remote_test_driver_proto = out.File
	file_chromite_api_remote_test_driver_proto_rawDesc = nil
	file_chromite_api_remote_test_driver_proto_goTypes = nil
	file_chromite_api_remote_test_driver_proto_depIdxs = nil
}
