// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/remote_test_driver.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	v1 "go.chromium.org/chromiumos/config/go/api/test/metadata/v1"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type AssembleRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *AssembleRequest) Reset()         { *m = AssembleRequest{} }
func (m *AssembleRequest) String() string { return proto.CompactTextString(m) }
func (*AssembleRequest) ProtoMessage()    {}
func (*AssembleRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_5784d7f92f93aadf, []int{0}
}

func (m *AssembleRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AssembleRequest.Unmarshal(m, b)
}
func (m *AssembleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AssembleRequest.Marshal(b, m, deterministic)
}
func (m *AssembleRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AssembleRequest.Merge(m, src)
}
func (m *AssembleRequest) XXX_Size() int {
	return xxx_messageInfo_AssembleRequest.Size(m)
}
func (m *AssembleRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_AssembleRequest.DiscardUnknown(m)
}

var xxx_messageInfo_AssembleRequest proto.InternalMessageInfo

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

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

type AssembleResponse struct {
	RemoteTestDrivers    []*RemoteTestDriver `protobuf:"bytes,1,rep,name=remote_test_drivers,json=remoteTestDrivers,proto3" json:"remote_test_drivers,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *AssembleResponse) Reset()         { *m = AssembleResponse{} }
func (m *AssembleResponse) String() string { return proto.CompactTextString(m) }
func (*AssembleResponse) ProtoMessage()    {}
func (*AssembleResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_5784d7f92f93aadf, []int{1}
}

func (m *AssembleResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AssembleResponse.Unmarshal(m, b)
}
func (m *AssembleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AssembleResponse.Marshal(b, m, deterministic)
}
func (m *AssembleResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AssembleResponse.Merge(m, src)
}
func (m *AssembleResponse) XXX_Size() int {
	return xxx_messageInfo_AssembleResponse.Size(m)
}
func (m *AssembleResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_AssembleResponse.DiscardUnknown(m)
}

var xxx_messageInfo_AssembleResponse proto.InternalMessageInfo

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

type RemoteTestDriver struct {
	// 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"`
	// Metadata about the RTD.
	Specifications       []*v1.Specification `protobuf:"bytes,2,rep,name=specifications,proto3" json:"specifications,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *RemoteTestDriver) Reset()         { *m = RemoteTestDriver{} }
func (m *RemoteTestDriver) String() string { return proto.CompactTextString(m) }
func (*RemoteTestDriver) ProtoMessage()    {}
func (*RemoteTestDriver) Descriptor() ([]byte, []int) {
	return fileDescriptor_5784d7f92f93aadf, []int{2}
}

func (m *RemoteTestDriver) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RemoteTestDriver.Unmarshal(m, b)
}
func (m *RemoteTestDriver) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RemoteTestDriver.Marshal(b, m, deterministic)
}
func (m *RemoteTestDriver) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RemoteTestDriver.Merge(m, src)
}
func (m *RemoteTestDriver) XXX_Size() int {
	return xxx_messageInfo_RemoteTestDriver.Size(m)
}
func (m *RemoteTestDriver) XXX_DiscardUnknown() {
	xxx_messageInfo_RemoteTestDriver.DiscardUnknown(m)
}

var xxx_messageInfo_RemoteTestDriver proto.InternalMessageInfo

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

func (m *RemoteTestDriver) GetSpecifications() []*v1.Specification {
	if m != nil {
		return m.Specifications
	}
	return nil
}

func init() {
	proto.RegisterType((*AssembleRequest)(nil), "chromite.api.AssembleRequest")
	proto.RegisterType((*AssembleResponse)(nil), "chromite.api.AssembleResponse")
	proto.RegisterType((*RemoteTestDriver)(nil), "chromite.api.RemoteTestDriver")
}

func init() {
	proto.RegisterFile("chromite/api/remote_test_driver.proto", fileDescriptor_5784d7f92f93aadf)
}

var fileDescriptor_5784d7f92f93aadf = []byte{
	// 394 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xcf, 0xca, 0xd3, 0x40,
	0x14, 0xc5, 0xc9, 0x27, 0x7c, 0xe8, 0xb4, 0x6a, 0x1c, 0xa1, 0x0d, 0x41, 0x4b, 0x29, 0x08, 0xc5,
	0xc5, 0x0c, 0xad, 0x44, 0xdc, 0x6a, 0xbb, 0x71, 0x23, 0x92, 0xba, 0x12, 0x24, 0x4c, 0x92, 0xdb,
	0x74, 0xa0, 0xc9, 0xc4, 0x99, 0x9b, 0xe0, 0xd2, 0xc7, 0xf1, 0x39, 0x7c, 0x1f, 0xdf, 0x41, 0x3a,
	0xd3, 0x3f, 0x69, 0xca, 0xb7, 0x0b, 0x73, 0x7e, 0x67, 0xe6, 0xdc, 0x93, 0x4b, 0xde, 0x64, 0x3b,
	0xad, 0x4a, 0x89, 0xc0, 0x45, 0x2d, 0xb9, 0x86, 0x52, 0x21, 0x24, 0x08, 0x06, 0x93, 0x5c, 0xcb,
	0x16, 0x34, 0xab, 0xb5, 0x42, 0x45, 0x87, 0x27, 0x8c, 0x89, 0x5a, 0x86, 0xaf, 0xae, 0x4c, 0x69,
	0x23, 0xf7, 0x79, 0x22, 0x6a, 0xe9, 0xd8, 0x70, 0xec, 0xd4, 0xa6, 0x54, 0x86, 0x67, 0xaa, 0x2c,
	0x55, 0x75, 0x14, 0xa2, 0x2b, 0xa1, 0xda, 0xca, 0xc2, 0xfa, 0x0f, 0xaf, 0xf1, 0x12, 0x50, 0xe4,
	0x02, 0x05, 0x6f, 0x17, 0xe7, 0x6f, 0x67, 0x9b, 0x21, 0x79, 0xfe, 0xd1, 0x18, 0x28, 0xd3, 0x3d,
	0xc4, 0xf0, 0xb3, 0x01, 0x83, 0xf4, 0x2d, 0xb9, 0x3f, 0xdc, 0xa5, 0x30, 0xf0, 0xa6, 0xde, 0x7c,
	0xb0, 0xa4, 0xec, 0x72, 0x35, 0x5b, 0x59, 0x25, 0x3e, 0x12, 0x34, 0x22, 0x04, 0x85, 0x2e, 0x00,
	0x93, 0x5c, 0xea, 0xe0, 0xce, 0xf2, 0xa3, 0x2e, 0x1f, 0x83, 0x69, 0xf6, 0xf8, 0x55, 0xe0, 0x2e,
	0x7e, 0xe2, 0xc8, 0xb5, 0xd4, 0xb3, 0x94, 0xf8, 0x97, 0x57, 0x4d, 0xad, 0x2a, 0x03, 0xf4, 0x0b,
	0x79, 0x79, 0xdb, 0x90, 0x09, 0xbc, 0xe9, 0xa3, 0xf9, 0x60, 0x39, 0x61, 0xdd, 0x8e, 0x58, 0x6c,
	0xc1, 0x6f, 0x60, 0x70, 0x6d, 0xb1, 0xf8, 0x85, 0xee, 0x9d, 0x98, 0xd9, 0x1f, 0x8f, 0xf8, 0x7d,
	0x8e, 0x46, 0xe4, 0xa9, 0x6b, 0x34, 0x53, 0x15, 0xc2, 0xaf, 0xd3, 0x88, 0x7e, 0x37, 0xb2, 0x0d,
	0x3b, 0xb4, 0xd8, 0xca, 0x51, 0xf4, 0x07, 0x79, 0x66, 0x6a, 0xc8, 0xe4, 0x56, 0x66, 0x02, 0xa5,
	0xaa, 0x4c, 0x70, 0x67, 0x63, 0x45, 0x5d, 0x9f, 0x6b, 0xdd, 0xe6, 0x3b, 0x4c, 0xc0, 0xce, 0x4d,
	0xb7, 0x0b, 0xb6, 0xe9, 0xba, 0xe3, 0xde, 0x65, 0xcb, 0xdf, 0x1e, 0x19, 0xf7, 0xa3, 0x6e, 0x40,
	0xb7, 0x32, 0x03, 0xfa, 0x99, 0x3c, 0x3e, 0x55, 0x45, 0x5f, 0x5f, 0xb7, 0xd0, 0xfb, 0x71, 0xe1,
	0xe4, 0x21, 0xd9, 0x35, 0x1c, 0x86, 0x7f, 0xff, 0x85, 0x23, 0x42, 0x6f, 0x5b, 0xf6, 0xbd, 0x4f,
	0x1f, 0xbe, 0xbf, 0x2f, 0xd4, 0x79, 0x1a, 0xa6, 0x74, 0xc1, 0x3b, 0x0b, 0x25, 0xab, 0xad, 0x16,
	0xdc, 0x6e, 0x0c, 0x2f, 0x14, 0xef, 0x6e, 0x68, 0x7a, 0x6f, 0x8f, 0xdf, 0xfd, 0x0f, 0x00, 0x00,
	0xff, 0xff, 0x5f, 0xc8, 0xcb, 0x2c, 0xed, 0x02, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// RemoteTestDriverServiceClient is the client API for RemoteTestDriverService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type RemoteTestDriverServiceClient interface {
	// Build RTDs (Tauto, Tast, etc.) and put them into a folder containing
	// everything needed to build a Dockerized RTD image. The caller can then do a
	// docker build from inside that directory.
	Assemble(ctx context.Context, in *AssembleRequest, opts ...grpc.CallOption) (*AssembleResponse, error)
}

type remoteTestDriverServiceClient struct {
	cc *grpc.ClientConn
}

func NewRemoteTestDriverServiceClient(cc *grpc.ClientConn) RemoteTestDriverServiceClient {
	return &remoteTestDriverServiceClient{cc}
}

func (c *remoteTestDriverServiceClient) Assemble(ctx context.Context, in *AssembleRequest, opts ...grpc.CallOption) (*AssembleResponse, error) {
	out := new(AssembleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.RemoteTestDriverService/Assemble", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// RemoteTestDriverServiceServer is the server API for RemoteTestDriverService service.
type RemoteTestDriverServiceServer interface {
	// Build RTDs (Tauto, Tast, etc.) and put them into a folder containing
	// everything needed to build a Dockerized RTD image. The caller can then do a
	// docker build from inside that directory.
	Assemble(context.Context, *AssembleRequest) (*AssembleResponse, error)
}

// UnimplementedRemoteTestDriverServiceServer can be embedded to have forward compatible implementations.
type UnimplementedRemoteTestDriverServiceServer struct {
}

func (*UnimplementedRemoteTestDriverServiceServer) Assemble(ctx context.Context, req *AssembleRequest) (*AssembleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Assemble not implemented")
}

func RegisterRemoteTestDriverServiceServer(s *grpc.Server, srv RemoteTestDriverServiceServer) {
	s.RegisterService(&_RemoteTestDriverService_serviceDesc, srv)
}

func _RemoteTestDriverService_Assemble_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AssembleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RemoteTestDriverServiceServer).Assemble(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.RemoteTestDriverService/Assemble",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RemoteTestDriverServiceServer).Assemble(ctx, req.(*AssembleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _RemoteTestDriverService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.RemoteTestDriverService",
	HandlerType: (*RemoteTestDriverServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Assemble",
			Handler:    _RemoteTestDriverService_Assemble_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/remote_test_driver.proto",
}
