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

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	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

// Whether this artifact requires a build.
type PrepareForBuildResponse_BuildRelevance int32

const (
	PrepareForBuildResponse_UNSPECIFIED PrepareForBuildResponse_BuildRelevance = 0
	// Build is necessary to generate artifacts.
	PrepareForBuildResponse_NEEDED PrepareForBuildResponse_BuildRelevance = 1
	// Defer to other artifacts.  Used primarily for aggregation of artifact
	// results.
	PrepareForBuildResponse_UNKNOWN PrepareForBuildResponse_BuildRelevance = 2
	// Artifacts are already generated.  The build is pointless.
	PrepareForBuildResponse_POINTLESS PrepareForBuildResponse_BuildRelevance = 3
)

var PrepareForBuildResponse_BuildRelevance_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "NEEDED",
	2: "UNKNOWN",
	3: "POINTLESS",
}

var PrepareForBuildResponse_BuildRelevance_value = map[string]int32{
	"UNSPECIFIED": 0,
	"NEEDED":      1,
	"UNKNOWN":     2,
	"POINTLESS":   3,
}

func (x PrepareForBuildResponse_BuildRelevance) String() string {
	return proto.EnumName(PrepareForBuildResponse_BuildRelevance_name, int32(x))
}

func (PrepareForBuildResponse_BuildRelevance) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{2, 0}
}

// An artifact is a file generated during or after a build.
type Artifact struct {
	// Absolute path to the artifact file.
	Path                 string   `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Artifact proto.InternalMessageInfo

func (m *Artifact) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

type PrepareForBuildRequest struct {
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,2,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Information about the artifacts.
	ArtifactInfo *chromiumos.ArtifactsByService `protobuf:"bytes,3,opt,name=artifact_info,json=artifactInfo,proto3" json:"artifact_info,omitempty"`
	// Whether we will proceed even if the build is POINTLESS.
	ForcedBuildRelevance bool     `protobuf:"varint,4,opt,name=forced_build_relevance,json=forcedBuildRelevance,proto3" json:"forced_build_relevance,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrepareForBuildRequest proto.InternalMessageInfo

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

func (m *PrepareForBuildRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *PrepareForBuildRequest) GetArtifactInfo() *chromiumos.ArtifactsByService {
	if m != nil {
		return m.ArtifactInfo
	}
	return nil
}

func (m *PrepareForBuildRequest) GetForcedBuildRelevance() bool {
	if m != nil {
		return m.ForcedBuildRelevance
	}
	return false
}

type PrepareForBuildResponse struct {
	BuildRelevance       PrepareForBuildResponse_BuildRelevance `protobuf:"varint,1,opt,name=build_relevance,json=buildRelevance,proto3,enum=chromite.api.PrepareForBuildResponse_BuildRelevance" json:"build_relevance,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

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

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

var xxx_messageInfo_PrepareForBuildResponse proto.InternalMessageInfo

func (m *PrepareForBuildResponse) GetBuildRelevance() PrepareForBuildResponse_BuildRelevance {
	if m != nil {
		return m.BuildRelevance
	}
	return PrepareForBuildResponse_UNSPECIFIED
}

type BundleArtifactsRequest struct {
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,2,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Artifact information.
	ArtifactInfo *chromiumos.ArtifactsByService `protobuf:"bytes,3,opt,name=artifact_info,json=artifactInfo,proto3" json:"artifact_info,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir            string   `protobuf:"bytes,4,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BundleArtifactsRequest) Reset()         { *m = BundleArtifactsRequest{} }
func (m *BundleArtifactsRequest) String() string { return proto.CompactTextString(m) }
func (*BundleArtifactsRequest) ProtoMessage()    {}
func (*BundleArtifactsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{3}
}

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

var xxx_messageInfo_BundleArtifactsRequest proto.InternalMessageInfo

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

func (m *BundleArtifactsRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *BundleArtifactsRequest) GetArtifactInfo() *chromiumos.ArtifactsByService {
	if m != nil {
		return m.ArtifactInfo
	}
	return nil
}

func (m *BundleArtifactsRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

type BundleArtifactsResponse struct {
	// The artifacts that were bundled.
	Artifacts            *chromiumos.UploadedArtifactsByService `protobuf:"bytes,1,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

func (m *BundleArtifactsResponse) Reset()         { *m = BundleArtifactsResponse{} }
func (m *BundleArtifactsResponse) String() string { return proto.CompactTextString(m) }
func (*BundleArtifactsResponse) ProtoMessage()    {}
func (*BundleArtifactsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{4}
}

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

var xxx_messageInfo_BundleArtifactsResponse proto.InternalMessageInfo

func (m *BundleArtifactsResponse) GetArtifacts() *chromiumos.UploadedArtifactsByService {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

// Request describing where build artifact bundles for a given build target
// should be dumped.
// TODO(crbug/1034529): BundleRequest and BundleResponse are being deprecated
// (along with most of this file).  See BundleArtifactsRequest/Response
type BundleRequest struct {
	// The build target to bundle artifacts for.
	// Deprecated. Use sysroot instead.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir string `protobuf:"bytes,2,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot              *Sysroot `protobuf:"bytes,4,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BundleRequest) Reset()         { *m = BundleRequest{} }
func (m *BundleRequest) String() string { return proto.CompactTextString(m) }
func (*BundleRequest) ProtoMessage()    {}
func (*BundleRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{5}
}

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

var xxx_messageInfo_BundleRequest proto.InternalMessageInfo

func (m *BundleRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *BundleRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

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

func (m *BundleRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

// Response describing which bundles were dumped to the given output directory.
type BundleResponse struct {
	// The artifacts that added to the output directory.
	Artifacts            []*Artifact `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *BundleResponse) Reset()         { *m = BundleResponse{} }
func (m *BundleResponse) String() string { return proto.CompactTextString(m) }
func (*BundleResponse) ProtoMessage()    {}
func (*BundleResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{6}
}

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

var xxx_messageInfo_BundleResponse proto.InternalMessageInfo

func (m *BundleResponse) GetArtifacts() []*Artifact {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

// Request describing where to find build artifacts that are taken from a
// sysroot.
type BundleVmFilesRequest struct {
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,2,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Test results directory relative to the sysroot.
	TestResultsDir string `protobuf:"bytes,3,opt,name=test_results_dir,json=testResultsDir,proto3" json:"test_results_dir,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir            string   `protobuf:"bytes,4,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BundleVmFilesRequest) Reset()         { *m = BundleVmFilesRequest{} }
func (m *BundleVmFilesRequest) String() string { return proto.CompactTextString(m) }
func (*BundleVmFilesRequest) ProtoMessage()    {}
func (*BundleVmFilesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{7}
}

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

var xxx_messageInfo_BundleVmFilesRequest proto.InternalMessageInfo

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

func (m *BundleVmFilesRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

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

func (m *BundleVmFilesRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

// DEPRECATED for recipes: crbug/1019868: This is being replaced with
// BundleRequest.
// Request describing where to find Chrome AFDO artifacts
type BundleChromeAFDORequest struct {
	// The chroot where the orderfile lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build_target of the builder.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir string `protobuf:"bytes,3,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	// The type of AFDO artifact (benchmark-afdo or orderfile)
	ArtifactType         chromiumos.AFDOArtifactType `protobuf:"varint,4,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.AFDOArtifactType" json:"artifact_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *BundleChromeAFDORequest) Reset()         { *m = BundleChromeAFDORequest{} }
func (m *BundleChromeAFDORequest) String() string { return proto.CompactTextString(m) }
func (*BundleChromeAFDORequest) ProtoMessage()    {}
func (*BundleChromeAFDORequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{8}
}

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

var xxx_messageInfo_BundleChromeAFDORequest proto.InternalMessageInfo

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

func (m *BundleChromeAFDORequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *BundleChromeAFDORequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

func (m *BundleChromeAFDORequest) GetArtifactType() chromiumos.AFDOArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return chromiumos.AFDOArtifactType_NONE_TYPE
}

// Fetch the pinned guest image uris.
type PinnedGuestImageUriRequest struct {
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot              *Sysroot `protobuf:"bytes,2,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PinnedGuestImageUriRequest) Reset()         { *m = PinnedGuestImageUriRequest{} }
func (m *PinnedGuestImageUriRequest) String() string { return proto.CompactTextString(m) }
func (*PinnedGuestImageUriRequest) ProtoMessage()    {}
func (*PinnedGuestImageUriRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{9}
}

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

var xxx_messageInfo_PinnedGuestImageUriRequest proto.InternalMessageInfo

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

func (m *PinnedGuestImageUriRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

// Response from fetching pinned guest image uris.
type PinnedGuestImageUriResponse struct {
	// The pinned guest images.
	PinnedImages         []*PinnedGuestImageUriResponse_PinnedGuestImage `protobuf:"bytes,1,rep,name=pinned_images,json=pinnedImages,proto3" json:"pinned_images,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
	XXX_unrecognized     []byte                                          `json:"-"`
	XXX_sizecache        int32                                           `json:"-"`
}

func (m *PinnedGuestImageUriResponse) Reset()         { *m = PinnedGuestImageUriResponse{} }
func (m *PinnedGuestImageUriResponse) String() string { return proto.CompactTextString(m) }
func (*PinnedGuestImageUriResponse) ProtoMessage()    {}
func (*PinnedGuestImageUriResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{10}
}

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

var xxx_messageInfo_PinnedGuestImageUriResponse proto.InternalMessageInfo

func (m *PinnedGuestImageUriResponse) GetPinnedImages() []*PinnedGuestImageUriResponse_PinnedGuestImage {
	if m != nil {
		return m.PinnedImages
	}
	return nil
}

type PinnedGuestImageUriResponse_PinnedGuestImage struct {
	Filename             string   `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"`
	Uri                  string   `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PinnedGuestImageUriResponse_PinnedGuestImage proto.InternalMessageInfo

func (m *PinnedGuestImageUriResponse_PinnedGuestImage) GetFilename() string {
	if m != nil {
		return m.Filename
	}
	return ""
}

func (m *PinnedGuestImageUriResponse_PinnedGuestImage) GetUri() string {
	if m != nil {
		return m.Uri
	}
	return ""
}

func init() {
	proto.RegisterEnum("chromite.api.PrepareForBuildResponse_BuildRelevance", PrepareForBuildResponse_BuildRelevance_name, PrepareForBuildResponse_BuildRelevance_value)
	proto.RegisterType((*Artifact)(nil), "chromite.api.Artifact")
	proto.RegisterType((*PrepareForBuildRequest)(nil), "chromite.api.PrepareForBuildRequest")
	proto.RegisterType((*PrepareForBuildResponse)(nil), "chromite.api.PrepareForBuildResponse")
	proto.RegisterType((*BundleArtifactsRequest)(nil), "chromite.api.BundleArtifactsRequest")
	proto.RegisterType((*BundleArtifactsResponse)(nil), "chromite.api.BundleArtifactsResponse")
	proto.RegisterType((*BundleRequest)(nil), "chromite.api.BundleRequest")
	proto.RegisterType((*BundleResponse)(nil), "chromite.api.BundleResponse")
	proto.RegisterType((*BundleVmFilesRequest)(nil), "chromite.api.BundleVmFilesRequest")
	proto.RegisterType((*BundleChromeAFDORequest)(nil), "chromite.api.BundleChromeAFDORequest")
	proto.RegisterType((*PinnedGuestImageUriRequest)(nil), "chromite.api.PinnedGuestImageUriRequest")
	proto.RegisterType((*PinnedGuestImageUriResponse)(nil), "chromite.api.PinnedGuestImageUriResponse")
	proto.RegisterType((*PinnedGuestImageUriResponse_PinnedGuestImage)(nil), "chromite.api.PinnedGuestImageUriResponse.PinnedGuestImage")
}

func init() { proto.RegisterFile("chromite/api/artifacts.proto", fileDescriptor_62a7d4c8524262a7) }

var fileDescriptor_62a7d4c8524262a7 = []byte{
	// 1008 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x57, 0x51, 0x6f, 0xe3, 0x44,
	0x10, 0xc6, 0x4d, 0xd5, 0x6b, 0x26, 0x4d, 0x6a, 0x96, 0xa3, 0x0d, 0x69, 0xaf, 0x3a, 0x59, 0x1c,
	0x0a, 0x3c, 0x24, 0x52, 0xa8, 0x10, 0xba, 0x27, 0xda, 0x24, 0x3e, 0x45, 0x57, 0x92, 0xe0, 0x24,
	0x80, 0x0e, 0x41, 0xe4, 0xd8, 0x9b, 0x74, 0xa5, 0xd8, 0xbb, 0xac, 0xd7, 0x85, 0xfc, 0x22, 0xfe,
	0x04, 0x0f, 0x08, 0x1e, 0xf8, 0x0d, 0x3c, 0xf3, 0x8c, 0xc4, 0x4f, 0x40, 0x5e, 0xdb, 0xa9, 0xed,
	0xa6, 0x6a, 0x39, 0x57, 0x27, 0xdd, 0x9b, 0xbd, 0xb3, 0xfb, 0xcd, 0xcc, 0x37, 0xdf, 0xcc, 0xda,
	0x70, 0x6c, 0x5d, 0x72, 0xea, 0x10, 0x81, 0x9b, 0x26, 0x23, 0x4d, 0x93, 0x0b, 0x32, 0x37, 0x2d,
	0xe1, 0x35, 0x18, 0xa7, 0x82, 0xa2, 0xbd, 0xd8, 0xda, 0x30, 0x19, 0xa9, 0xa5, 0xf7, 0xce, 0x7c,
	0xb2, 0xb4, 0xa7, 0x26, 0x23, 0xe1, 0xde, 0x5a, 0x2d, 0x65, 0xf5, 0x56, 0x1e, 0xa7, 0x54, 0x44,
	0xb6, 0xc3, 0xd0, 0xe6, 0x3b, 0xd4, 0x6b, 0x5a, 0xd4, 0x71, 0xa8, 0x1b, 0x1a, 0xb4, 0x13, 0xd8,
	0x3d, 0x8b, 0x7c, 0x22, 0x04, 0xdb, 0xcc, 0x14, 0x97, 0x55, 0xe5, 0xa9, 0x52, 0x2f, 0x1a, 0xf2,
	0x59, 0xfb, 0x57, 0x81, 0x83, 0x21, 0xc7, 0xcc, 0xe4, 0x58, 0xa7, 0xfc, 0x3c, 0x70, 0x69, 0xe0,
	0x1f, 0x7d, 0xec, 0x09, 0xf4, 0x09, 0xec, 0x04, 0xa8, 0x54, 0xc8, 0x03, 0xa5, 0x16, 0x6a, 0x5c,
	0x3b, 0x69, 0xb4, 0xa5, 0xc5, 0x88, 0x76, 0xa0, 0x26, 0x3c, 0x8a, 0x02, 0xaa, 0x6e, 0xc9, 0xcd,
	0xef, 0x37, 0x92, 0x99, 0x35, 0x46, 0xa1, 0xd1, 0x88, 0x77, 0xa1, 0x36, 0x94, 0x63, 0x2e, 0xa6,
	0xc4, 0x9d, 0xd3, 0x6a, 0x41, 0x1e, 0x3b, 0x49, 0xfa, 0x88, 0x03, 0xf7, 0xce, 0x57, 0x23, 0xcc,
	0xaf, 0x88, 0x85, 0x8d, 0xbd, 0xf8, 0x50, 0xcf, 0x9d, 0x53, 0x74, 0x0a, 0x07, 0x73, 0xca, 0x2d,
	0x6c, 0x4f, 0x43, 0xae, 0x38, 0x5e, 0xe2, 0x2b, 0xd3, 0xb5, 0x70, 0x75, 0xfb, 0xa9, 0x52, 0xdf,
	0x35, 0x1e, 0x87, 0xd6, 0x28, 0xab, 0xc8, 0xa6, 0xfd, 0xa1, 0xc0, 0xe1, 0x8d, 0x94, 0x3d, 0x46,
	0x5d, 0x0f, 0xa3, 0xef, 0x61, 0x3f, 0x0b, 0x15, 0x24, 0x5f, 0x69, 0x9d, 0xa6, 0xf3, 0xb9, 0xe5,
	0x7c, 0x23, 0xed, 0xca, 0xa8, 0xcc, 0xd2, 0xae, 0x7b, 0x50, 0x49, 0xef, 0x40, 0xfb, 0x50, 0x9a,
	0xf4, 0x47, 0xc3, 0x6e, 0xbb, 0xa7, 0xf7, 0xba, 0x1d, 0xf5, 0x1d, 0x04, 0xb0, 0xd3, 0xef, 0x76,
	0x3b, 0xdd, 0x8e, 0xaa, 0xa0, 0x12, 0x3c, 0x9a, 0xf4, 0x5f, 0xf6, 0x07, 0xdf, 0xf4, 0xd5, 0x2d,
	0x54, 0x86, 0xe2, 0x70, 0xd0, 0xeb, 0x8f, 0x2f, 0xba, 0xa3, 0x91, 0x5a, 0xd0, 0xfe, 0x52, 0xe0,
	0xe0, 0xdc, 0x77, 0xed, 0x25, 0x5e, 0xd3, 0xf4, 0xf6, 0x14, 0xee, 0x09, 0x00, 0xf5, 0x05, 0xf3,
	0xc5, 0xd4, 0x26, 0x5c, 0x16, 0xab, 0x68, 0x14, 0xc3, 0x95, 0x0e, 0xe1, 0xda, 0x14, 0x0e, 0x6f,
	0xa4, 0x16, 0x15, 0xa8, 0x03, 0xc5, 0x75, 0x0f, 0x45, 0xe9, 0x7d, 0x94, 0x74, 0x3d, 0x61, 0x4b,
	0x6a, 0xda, 0xd8, 0xde, 0x10, 0xc2, 0xf5, 0x41, 0xed, 0x4f, 0x05, 0xca, 0xa1, 0x87, 0x98, 0xb3,
	0xe7, 0xb0, 0x17, 0x16, 0x5e, 0x98, 0x7c, 0x81, 0x63, 0xe6, 0x0e, 0x93, 0xd0, 0xb2, 0x72, 0x63,
	0x69, 0x36, 0x4a, 0xb3, 0xeb, 0x97, 0x4c, 0x36, 0x5b, 0x99, 0x6c, 0x12, 0xe5, 0x28, 0xfc, 0x9f,
	0x72, 0x6c, 0xdf, 0xa7, 0x1c, 0x9a, 0x1e, 0x28, 0x2a, 0x4c, 0x24, 0x62, 0xe8, 0x34, 0xcd, 0x50,
	0xa1, 0x5e, 0x6a, 0x1d, 0xa4, 0x41, 0x62, 0x6e, 0x92, 0x8c, 0xfc, 0xaa, 0xc0, 0xe3, 0x10, 0xe8,
	0x6b, 0x47, 0x27, 0x4b, 0xfc, 0x66, 0xc4, 0x54, 0x07, 0x55, 0x60, 0x4f, 0x4c, 0x39, 0xf6, 0xfc,
	0xa5, 0xf0, 0x24, 0x7f, 0x05, 0xc9, 0x5f, 0x25, 0x58, 0x37, 0xc2, 0xe5, 0x80, 0xc4, 0x3b, 0x14,
	0xf3, 0xb7, 0x12, 0x4b, 0x26, 0x08, 0xc9, 0xc1, 0x67, 0x7a, 0x67, 0xf0, 0x3a, 0x19, 0x64, 0x65,
	0xb0, 0xf5, 0xda, 0x32, 0x28, 0x64, 0x65, 0x70, 0x96, 0x68, 0x1c, 0xb1, 0x62, 0xe1, 0x8c, 0xaa,
	0xb4, 0x8e, 0x53, 0x8d, 0xa3, 0x77, 0x06, 0x71, 0x75, 0xc6, 0x2b, 0x96, 0x68, 0x9b, 0xe0, 0x4d,
	0x5b, 0x41, 0x6d, 0x48, 0x5c, 0x17, 0xdb, 0x2f, 0x82, 0xc4, 0x7a, 0x8e, 0xb9, 0xc0, 0x13, 0x4e,
	0xde, 0x44, 0xa5, 0xb4, 0xdf, 0x14, 0x38, 0xda, 0xe8, 0x3b, 0x52, 0xdd, 0x14, 0xca, 0x4c, 0x9a,
	0xa7, 0x24, 0x30, 0xc5, 0xca, 0x7b, 0x9e, 0x19, 0x9b, 0xb7, 0x23, 0xdc, 0xb0, 0x19, 0x7b, 0x21,
	0xa0, 0x7c, 0xf1, 0x6a, 0x5f, 0x80, 0x9a, 0xdd, 0x81, 0x6a, 0xb0, 0x3b, 0x27, 0x4b, 0xec, 0x9a,
	0x0e, 0x8e, 0x2e, 0xb5, 0xf5, 0x3b, 0x52, 0xa1, 0xe0, 0x73, 0x12, 0x75, 0x63, 0xf0, 0xd8, 0xfa,
	0xa5, 0x0c, 0xea, 0x7a, 0x2c, 0x44, 0x43, 0x01, 0xfd, 0x00, 0xfb, 0x99, 0x59, 0x8e, 0x3e, 0xbc,
	0x63, 0xd4, 0x4b, 0xb6, 0x6b, 0xcf, 0xee, 0x75, 0x21, 0x04, 0xf8, 0x99, 0x51, 0x96, 0xc5, 0xdf,
	0x3c, 0xc4, 0xb3, 0xf8, 0xb7, 0xcd, 0x43, 0x06, 0x1f, 0xe8, 0x58, 0x58, 0x97, 0x1b, 0x98, 0xf5,
	0x50, 0xfd, 0x1e, 0xec, 0x87, 0xde, 0x3e, 0xbe, 0x77, 0x9d, 0xd0, 0x10, 0xde, 0x8b, 0x82, 0xf1,
	0x05, 0x0d, 0xba, 0x54, 0x8e, 0x0b, 0x74, 0xb4, 0x29, 0xde, 0x18, 0xfe, 0x78, 0xb3, 0x31, 0x42,
	0xfc, 0x2a, 0x1e, 0x3d, 0x61, 0xef, 0x0e, 0x46, 0x6d, 0xea, 0xce, 0xc9, 0x22, 0x0f, 0xe4, 0x97,
	0xa0, 0x86, 0x2b, 0x5d, 0xd9, 0xa1, 0x17, 0x74, 0x91, 0x2b, 0xc2, 0x97, 0xf1, 0x94, 0xd5, 0x09,
	0x77, 0x7e, 0x32, 0x39, 0xce, 0x03, 0xb6, 0x26, 0x50, 0x52, 0x7b, 0xc6, 0xad, 0x4b, 0x72, 0x85,
	0x1f, 0x26, 0x3c, 0x89, 0xf8, 0x8a, 0xb0, 0x3c, 0x60, 0x36, 0x3c, 0x89, 0xea, 0xab, 0x77, 0x06,
	0x2f, 0xb0, 0x8b, 0xb9, 0x29, 0x08, 0x75, 0xaf, 0xf5, 0xbb, 0x51, 0x99, 0x37, 0xc6, 0xee, 0x1d,
	0x5e, 0xc6, 0xf1, 0xbc, 0xce, 0x4a, 0x2d, 0x17, 0x11, 0xdf, 0xc2, 0x51, 0xb8, 0x32, 0x22, 0x0e,
	0x5b, 0x07, 0xb5, 0x8e, 0x3c, 0x07, 0xf2, 0x45, 0xdc, 0xc7, 0x63, 0xf3, 0x01, 0x14, 0x3f, 0x81,
	0x6a, 0x84, 0x86, 0x3d, 0x31, 0x61, 0xb6, 0x29, 0xf0, 0xd0, 0x5c, 0x05, 0x5f, 0x2e, 0x39, 0x1b,
	0xa9, 0x9c, 0xba, 0xc3, 0x91, 0xb6, 0x69, 0x7b, 0xfa, 0x82, 0xbf, 0x3b, 0xef, 0xee, 0xcf, 0x8c,
	0x72, 0xd1, 0x66, 0xd8, 0xc0, 0xc1, 0xc3, 0x83, 0x74, 0xba, 0xce, 0x1c, 0xcb, 0x9f, 0xb8, 0x44,
	0x04, 0x03, 0x24, 0x57, 0xce, 0x33, 0x78, 0x16, 0x89, 0x14, 0x1b, 0xd8, 0xa1, 0x42, 0x52, 0xda,
	0xe1, 0xe4, 0x0a, 0xf3, 0x11, 0xc3, 0x16, 0x99, 0x13, 0x4b, 0xea, 0x37, 0x8f, 0x8f, 0xef, 0xe0,
	0xe4, 0x36, 0x1f, 0xb9, 0x35, 0x5b, 0x7b, 0xf7, 0xf7, 0x7f, 0x6a, 0xe5, 0xc4, 0x37, 0x9b, 0xba,
	0x75, 0xfe, 0xf9, 0xab, 0xcf, 0x16, 0x74, 0x7d, 0x7b, 0x37, 0x28, 0x5f, 0x34, 0x13, 0xff, 0x77,
	0xc4, 0x9d, 0x73, 0xb3, 0x29, 0x7f, 0xef, 0x9a, 0x0b, 0xda, 0x4c, 0xfe, 0x15, 0xce, 0x76, 0xe4,
	0xf2, 0xa7, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb6, 0xf8, 0x70, 0x75, 0x76, 0x0e, 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

// ArtifactsServiceClient is the client API for ArtifactsService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ArtifactsServiceClient interface {
	// Prepare to build artifacts.
	PrepareForBuild(ctx context.Context, in *PrepareForBuildRequest, opts ...grpc.CallOption) (*PrepareForBuildResponse, error)
	// Bundle artifacts for build.
	BundleArtifacts(ctx context.Context, in *BundleArtifactsRequest, opts ...grpc.CallOption) (*BundleArtifactsResponse, error)
	// Fetch the pinned guest image locations.
	FetchPinnedGuestImageUris(ctx context.Context, in *PinnedGuestImageUriRequest, opts ...grpc.CallOption) (*PinnedGuestImageUriResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with all files needed for Autotest HW testing.
	BundleAutotestFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create the ChromeOS Config JSON payload.
	BundleChromeOSConfig(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with ebuild logs.
	BundleEbuildLogs(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with unsigned firmware images.
	BundleFirmware(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar.xz archive for each image that has been created.
	BundleImageArchives(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Generate zip containing all built images for the target.
	BundleImageZip(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// DEPRECATED for recipes: crbug/1019868: This are being replaced by
	// ToolchainService.Bundle{ArtifactType}()
	// Create Chrome Benchmark AFDO builder artifacts.
	BundleAFDOGenerationArtifacts(ctx context.Context, in *BundleChromeAFDORequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with all guest images test bundles.
	BundlePinnedGuestImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create the simple chrome artifacts.
	BundleSimpleChromeArtifacts(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with all files needed for Tast HW testing.
	BundleTastFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Generate minimal update payloads to be used in HW testing.
	BundleTestUpdatePayloads(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with VM memory and disk images.
	BundleVmFiles(ctx context.Context, in *BundleVmFilesRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Generate a CPE report to a file.
	ExportCpeReport(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with fingerprint MCU on-device unittest binaries.
	BundleFpmcuUnittests(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// Generate all Remote Test Driver metadata.
	//
	// Response consists of one or more metadata files. Each file must contain a
	// single binary encoded chromiumos.config.api.test.metadata.v1.Specification
	// protobuf payload.
	// Schema defined at
	// https://chromium.googlesource.com/chromiumos/config/+/refs/heads/master/proto/chromiumos/config/api/test/metadata/v1/metadata.proto
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverImages()
	//
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	GenerateRemoteTestDriverSpecification(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// Generate all Remote Test Driver container images.
	//
	// Response consists of one or more Docker container images.
	// The images are identified by their Docker image digest. The filenames of
	// the created artifacts are ignored.
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverSpecification()
	//
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	GenerateRemoteTestDriverImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
}

type artifactsServiceClient struct {
	cc *grpc.ClientConn
}

func NewArtifactsServiceClient(cc *grpc.ClientConn) ArtifactsServiceClient {
	return &artifactsServiceClient{cc}
}

func (c *artifactsServiceClient) PrepareForBuild(ctx context.Context, in *PrepareForBuildRequest, opts ...grpc.CallOption) (*PrepareForBuildResponse, error) {
	out := new(PrepareForBuildResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/PrepareForBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleArtifacts(ctx context.Context, in *BundleArtifactsRequest, opts ...grpc.CallOption) (*BundleArtifactsResponse, error) {
	out := new(BundleArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) FetchPinnedGuestImageUris(ctx context.Context, in *PinnedGuestImageUriRequest, opts ...grpc.CallOption) (*PinnedGuestImageUriResponse, error) {
	out := new(PinnedGuestImageUriResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/FetchPinnedGuestImageUris", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleAutotestFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleAutotestFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleChromeOSConfig(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleChromeOSConfig", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleEbuildLogs(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleEbuildLogs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleFirmware(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleFirmware", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleImageArchives(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleImageArchives", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleImageZip(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleImageZip", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleAFDOGenerationArtifacts(ctx context.Context, in *BundleChromeAFDORequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleAFDOGenerationArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundlePinnedGuestImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundlePinnedGuestImages", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleSimpleChromeArtifacts(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleSimpleChromeArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleTastFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleTastFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleTestUpdatePayloads(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleTestUpdatePayloads", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleVmFiles(ctx context.Context, in *BundleVmFilesRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleVmFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) ExportCpeReport(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/ExportCpeReport", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleFpmcuUnittests(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleFpmcuUnittests", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) GenerateRemoteTestDriverSpecification(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/GenerateRemoteTestDriverSpecification", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) GenerateRemoteTestDriverImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/GenerateRemoteTestDriverImages", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ArtifactsServiceServer is the server API for ArtifactsService service.
type ArtifactsServiceServer interface {
	// Prepare to build artifacts.
	PrepareForBuild(context.Context, *PrepareForBuildRequest) (*PrepareForBuildResponse, error)
	// Bundle artifacts for build.
	BundleArtifacts(context.Context, *BundleArtifactsRequest) (*BundleArtifactsResponse, error)
	// Fetch the pinned guest image locations.
	FetchPinnedGuestImageUris(context.Context, *PinnedGuestImageUriRequest) (*PinnedGuestImageUriResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with all files needed for Autotest HW testing.
	BundleAutotestFiles(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create the ChromeOS Config JSON payload.
	BundleChromeOSConfig(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with ebuild logs.
	BundleEbuildLogs(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with unsigned firmware images.
	BundleFirmware(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar.xz archive for each image that has been created.
	BundleImageArchives(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Generate zip containing all built images for the target.
	BundleImageZip(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// DEPRECATED for recipes: crbug/1019868: This are being replaced by
	// ToolchainService.Bundle{ArtifactType}()
	// Create Chrome Benchmark AFDO builder artifacts.
	BundleAFDOGenerationArtifacts(context.Context, *BundleChromeAFDORequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with all guest images test bundles.
	BundlePinnedGuestImages(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create the simple chrome artifacts.
	BundleSimpleChromeArtifacts(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with all files needed for Tast HW testing.
	BundleTastFiles(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Generate minimal update payloads to be used in HW testing.
	BundleTestUpdatePayloads(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with VM memory and disk images.
	BundleVmFiles(context.Context, *BundleVmFilesRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Generate a CPE report to a file.
	ExportCpeReport(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	// Create a tar archive with fingerprint MCU on-device unittest binaries.
	BundleFpmcuUnittests(context.Context, *BundleRequest) (*BundleResponse, error)
	// Generate all Remote Test Driver metadata.
	//
	// Response consists of one or more metadata files. Each file must contain a
	// single binary encoded chromiumos.config.api.test.metadata.v1.Specification
	// protobuf payload.
	// Schema defined at
	// https://chromium.googlesource.com/chromiumos/config/+/refs/heads/master/proto/chromiumos/config/api/test/metadata/v1/metadata.proto
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverImages()
	//
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	GenerateRemoteTestDriverSpecification(context.Context, *BundleRequest) (*BundleResponse, error)
	// Generate all Remote Test Driver container images.
	//
	// Response consists of one or more Docker container images.
	// The images are identified by their Docker image digest. The filenames of
	// the created artifacts are ignored.
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverSpecification()
	//
	// TODO(crbug/1034529): DEPRECATED use BundleArtifacts
	GenerateRemoteTestDriverImages(context.Context, *BundleRequest) (*BundleResponse, error)
}

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

func (*UnimplementedArtifactsServiceServer) PrepareForBuild(ctx context.Context, req *PrepareForBuildRequest) (*PrepareForBuildResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PrepareForBuild not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleArtifacts(ctx context.Context, req *BundleArtifactsRequest) (*BundleArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleArtifacts not implemented")
}
func (*UnimplementedArtifactsServiceServer) FetchPinnedGuestImageUris(ctx context.Context, req *PinnedGuestImageUriRequest) (*PinnedGuestImageUriResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method FetchPinnedGuestImageUris not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleAutotestFiles(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleAutotestFiles not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleChromeOSConfig(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleChromeOSConfig not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleEbuildLogs(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleEbuildLogs not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleFirmware(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleFirmware not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleImageArchives(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleImageArchives not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleImageZip(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleImageZip not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleAFDOGenerationArtifacts(ctx context.Context, req *BundleChromeAFDORequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleAFDOGenerationArtifacts not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundlePinnedGuestImages(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundlePinnedGuestImages not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleSimpleChromeArtifacts(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleSimpleChromeArtifacts not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleTastFiles(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleTastFiles not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleTestUpdatePayloads(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleTestUpdatePayloads not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleVmFiles(ctx context.Context, req *BundleVmFilesRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleVmFiles not implemented")
}
func (*UnimplementedArtifactsServiceServer) ExportCpeReport(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ExportCpeReport not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleFpmcuUnittests(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleFpmcuUnittests not implemented")
}
func (*UnimplementedArtifactsServiceServer) GenerateRemoteTestDriverSpecification(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateRemoteTestDriverSpecification not implemented")
}
func (*UnimplementedArtifactsServiceServer) GenerateRemoteTestDriverImages(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateRemoteTestDriverImages not implemented")
}

func RegisterArtifactsServiceServer(s *grpc.Server, srv ArtifactsServiceServer) {
	s.RegisterService(&_ArtifactsService_serviceDesc, srv)
}

func _ArtifactsService_PrepareForBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PrepareForBuildRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).PrepareForBuild(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/PrepareForBuild",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).PrepareForBuild(ctx, req.(*PrepareForBuildRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleArtifacts(ctx, req.(*BundleArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_FetchPinnedGuestImageUris_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PinnedGuestImageUriRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).FetchPinnedGuestImageUris(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/FetchPinnedGuestImageUris",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).FetchPinnedGuestImageUris(ctx, req.(*PinnedGuestImageUriRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleAutotestFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleAutotestFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleAutotestFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleAutotestFiles(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleChromeOSConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleChromeOSConfig(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleChromeOSConfig",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleChromeOSConfig(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleEbuildLogs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleEbuildLogs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleEbuildLogs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleEbuildLogs(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleFirmware_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleFirmware(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleFirmware",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleFirmware(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleImageArchives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleImageArchives(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleImageArchives",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleImageArchives(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleImageZip_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleImageZip(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleImageZip",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleImageZip(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleAFDOGenerationArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleChromeAFDORequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleAFDOGenerationArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleAFDOGenerationArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleAFDOGenerationArtifacts(ctx, req.(*BundleChromeAFDORequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundlePinnedGuestImages_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundlePinnedGuestImages(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundlePinnedGuestImages",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundlePinnedGuestImages(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleSimpleChromeArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleSimpleChromeArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleSimpleChromeArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleSimpleChromeArtifacts(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleTastFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleTastFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleTastFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleTastFiles(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleTestUpdatePayloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleTestUpdatePayloads(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleTestUpdatePayloads",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleTestUpdatePayloads(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleVmFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleVmFilesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleVmFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleVmFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleVmFiles(ctx, req.(*BundleVmFilesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_ExportCpeReport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).ExportCpeReport(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/ExportCpeReport",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).ExportCpeReport(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleFpmcuUnittests_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleFpmcuUnittests(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleFpmcuUnittests",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleFpmcuUnittests(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_GenerateRemoteTestDriverSpecification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverSpecification(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/GenerateRemoteTestDriverSpecification",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverSpecification(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_GenerateRemoteTestDriverImages_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverImages(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/GenerateRemoteTestDriverImages",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverImages(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ArtifactsService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.ArtifactsService",
	HandlerType: (*ArtifactsServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "PrepareForBuild",
			Handler:    _ArtifactsService_PrepareForBuild_Handler,
		},
		{
			MethodName: "BundleArtifacts",
			Handler:    _ArtifactsService_BundleArtifacts_Handler,
		},
		{
			MethodName: "FetchPinnedGuestImageUris",
			Handler:    _ArtifactsService_FetchPinnedGuestImageUris_Handler,
		},
		{
			MethodName: "BundleAutotestFiles",
			Handler:    _ArtifactsService_BundleAutotestFiles_Handler,
		},
		{
			MethodName: "BundleChromeOSConfig",
			Handler:    _ArtifactsService_BundleChromeOSConfig_Handler,
		},
		{
			MethodName: "BundleEbuildLogs",
			Handler:    _ArtifactsService_BundleEbuildLogs_Handler,
		},
		{
			MethodName: "BundleFirmware",
			Handler:    _ArtifactsService_BundleFirmware_Handler,
		},
		{
			MethodName: "BundleImageArchives",
			Handler:    _ArtifactsService_BundleImageArchives_Handler,
		},
		{
			MethodName: "BundleImageZip",
			Handler:    _ArtifactsService_BundleImageZip_Handler,
		},
		{
			MethodName: "BundleAFDOGenerationArtifacts",
			Handler:    _ArtifactsService_BundleAFDOGenerationArtifacts_Handler,
		},
		{
			MethodName: "BundlePinnedGuestImages",
			Handler:    _ArtifactsService_BundlePinnedGuestImages_Handler,
		},
		{
			MethodName: "BundleSimpleChromeArtifacts",
			Handler:    _ArtifactsService_BundleSimpleChromeArtifacts_Handler,
		},
		{
			MethodName: "BundleTastFiles",
			Handler:    _ArtifactsService_BundleTastFiles_Handler,
		},
		{
			MethodName: "BundleTestUpdatePayloads",
			Handler:    _ArtifactsService_BundleTestUpdatePayloads_Handler,
		},
		{
			MethodName: "BundleVmFiles",
			Handler:    _ArtifactsService_BundleVmFiles_Handler,
		},
		{
			MethodName: "ExportCpeReport",
			Handler:    _ArtifactsService_ExportCpeReport_Handler,
		},
		{
			MethodName: "BundleFpmcuUnittests",
			Handler:    _ArtifactsService_BundleFpmcuUnittests_Handler,
		},
		{
			MethodName: "GenerateRemoteTestDriverSpecification",
			Handler:    _ArtifactsService_GenerateRemoteTestDriverSpecification_Handler,
		},
		{
			MethodName: "GenerateRemoteTestDriverImages",
			Handler:    _ArtifactsService_GenerateRemoteTestDriverImages_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/artifacts.proto",
}
