// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/toolchain.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

// TODO(crbug.com/1020615): Drop this once this is live in production and all of
// the users have migrated to using BuilderConfig.Artifacts.ArtifactType
// Meanwhile, keep this in sync with chromiumos/builder_config.proto.
type AFDOArtifactType int32

const (
	// No AFDO artifact type specified.
	AFDOArtifactType_NONE_TYPE AFDOArtifactType = 0
	// The type is orderfile.
	AFDOArtifactType_ORDERFILE AFDOArtifactType = 1
	// The type is Chrome AFDO files generated by benchmarks.
	AFDOArtifactType_BENCHMARK_AFDO AFDOArtifactType = 2
	// The type is kernel AFDO files.
	AFDOArtifactType_KERNEL_AFDO AFDOArtifactType = 3
	// The type is Chrome AFDO used in release builders.
	AFDOArtifactType_CHROME_AFDO AFDOArtifactType = 4
)

var AFDOArtifactType_name = map[int32]string{
	0: "NONE_TYPE",
	1: "ORDERFILE",
	2: "BENCHMARK_AFDO",
	3: "KERNEL_AFDO",
	4: "CHROME_AFDO",
}

var AFDOArtifactType_value = map[string]int32{
	"NONE_TYPE":      0,
	"ORDERFILE":      1,
	"BENCHMARK_AFDO": 2,
	"KERNEL_AFDO":    3,
	"CHROME_AFDO":    4,
}

func (x AFDOArtifactType) String() string {
	return proto.EnumName(AFDOArtifactType_name, int32(x))
}

func (AFDOArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{0}
}

// Does this artifact require a build?
type PrepareForToolchainBuildResponse_BuildRelevance int32

const (
	PrepareForToolchainBuildResponse_UNSPECIFIED PrepareForToolchainBuildResponse_BuildRelevance = 0
	// Build is necessary to generate artifacts.
	PrepareForToolchainBuildResponse_NEEDED PrepareForToolchainBuildResponse_BuildRelevance = 1
	// Defer to other artifacts.  Used primarily for aggregation of artifact
	// results.
	PrepareForToolchainBuildResponse_UNKNOWN PrepareForToolchainBuildResponse_BuildRelevance = 2
	// Artifacts are already generated.  The build is pointless.
	PrepareForToolchainBuildResponse_POINTLESS PrepareForToolchainBuildResponse_BuildRelevance = 3
)

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

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

func (x PrepareForToolchainBuildResponse_BuildRelevance) String() string {
	return proto.EnumName(PrepareForToolchainBuildResponse_BuildRelevance_name, int32(x))
}

func (PrepareForToolchainBuildResponse_BuildRelevance) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{2, 0}
}

// Information about a collection of artifacts.
type ArtifactInfo struct {
	// The ArtifactType.
	ArtifactType chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_type,omitempty"`
	// Artifacts for this ArtifactType.
	Artifacts            []*Artifact `protobuf:"bytes,2,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactInfo) GetArtifactType() chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactType
	}
	return chromiumos.BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED
}

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

// Prepare the build for artifact building.
type PrepareForToolchainBuildRequest struct {
	// The artifact types that this build should make.
	ArtifactTypes []chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Note: both chroot and sysroot may be unspecified, when the endpoint is
	// called prior to their creation.
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,3,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Information about artifacts available when preparing.
	InputArtifacts []*chromiumos.BuilderConfig_Artifacts_InputArtifactInfo `protobuf:"bytes,4,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Additional arguments used in PrepareForBuild.
	// TODO(crbug/1019868): Transition to artifact_profile_info.
	AdditionalArgs *chromiumos.PrepareForBuildAdditionalArgs `protobuf:"bytes,5,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	// Profile information used for the artifact.
	ProfileInfo          *chromiumos.ArtifactProfileInfo `protobuf:"bytes,6,opt,name=profile_info,json=profileInfo,proto3" json:"profile_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_PrepareForToolchainBuildRequest proto.InternalMessageInfo

func (m *PrepareForToolchainBuildRequest) GetArtifactTypes() []chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

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

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

func (m *PrepareForToolchainBuildRequest) GetInputArtifacts() []*chromiumos.BuilderConfig_Artifacts_InputArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *PrepareForToolchainBuildRequest) GetAdditionalArgs() *chromiumos.PrepareForBuildAdditionalArgs {
	if m != nil {
		return m.AdditionalArgs
	}
	return nil
}

func (m *PrepareForToolchainBuildRequest) GetProfileInfo() *chromiumos.ArtifactProfileInfo {
	if m != nil {
		return m.ProfileInfo
	}
	return nil
}

// TODO(crbug/1019868): Migrate to using chromiumos.PrepareForBuildResponse.
type PrepareForToolchainBuildResponse struct {
	BuildRelevance       PrepareForToolchainBuildResponse_BuildRelevance `protobuf:"varint,1,opt,name=build_relevance,json=buildRelevance,proto3,enum=chromite.api.PrepareForToolchainBuildResponse_BuildRelevance" json:"build_relevance,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
	XXX_unrecognized     []byte                                          `json:"-"`
	XXX_sizecache        int32                                           `json:"-"`
}

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

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

var xxx_messageInfo_PrepareForToolchainBuildResponse proto.InternalMessageInfo

func (m *PrepareForToolchainBuildResponse) GetBuildRelevance() PrepareForToolchainBuildResponse_BuildRelevance {
	if m != nil {
		return m.BuildRelevance
	}
	return PrepareForToolchainBuildResponse_UNSPECIFIED
}

type BundleToolchainRequest 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"`
	// 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"`
	// Which artifacts are wanted?
	ArtifactTypes []chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,4,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Additional arguments that were used in PrepareForBuild.
	// TODO(crbug/1019868): Transition to artifact_profile_info.
	AdditionalArgs *chromiumos.PrepareForBuildAdditionalArgs `protobuf:"bytes,5,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	// Profile information used for the artifact.
	ProfileInfo          *chromiumos.ArtifactProfileInfo `protobuf:"bytes,6,opt,name=profile_info,json=profileInfo,proto3" json:"profile_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_BundleToolchainRequest proto.InternalMessageInfo

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

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

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

func (m *BundleToolchainRequest) GetArtifactTypes() []chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *BundleToolchainRequest) GetAdditionalArgs() *chromiumos.PrepareForBuildAdditionalArgs {
	if m != nil {
		return m.AdditionalArgs
	}
	return nil
}

func (m *BundleToolchainRequest) GetProfileInfo() *chromiumos.ArtifactProfileInfo {
	if m != nil {
		return m.ProfileInfo
	}
	return nil
}

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

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

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

var xxx_messageInfo_BundleToolchainResponse proto.InternalMessageInfo

func (m *BundleToolchainResponse) GetArtifactsInfo() []*ArtifactInfo {
	if m != nil {
		return m.ArtifactsInfo
	}
	return nil
}

type VerifyAFDOArtifactsRequest struct {
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The type of AFDO artifact to test.
	ArtifactType         chromiumos.AFDOArtifactType `protobuf:"varint,2,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 *VerifyAFDOArtifactsRequest) Reset()         { *m = VerifyAFDOArtifactsRequest{} }
func (m *VerifyAFDOArtifactsRequest) String() string { return proto.CompactTextString(m) }
func (*VerifyAFDOArtifactsRequest) ProtoMessage()    {}
func (*VerifyAFDOArtifactsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{5}
}

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

var xxx_messageInfo_VerifyAFDOArtifactsRequest proto.InternalMessageInfo

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

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

type VerifyAFDOArtifactsResponse struct {
	// Status of the service
	Status               bool     `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VerifyAFDOArtifactsResponse proto.InternalMessageInfo

func (m *VerifyAFDOArtifactsResponse) GetStatus() bool {
	if m != nil {
		return m.Status
	}
	return false
}

func init() {
	proto.RegisterEnum("chromite.api.AFDOArtifactType", AFDOArtifactType_name, AFDOArtifactType_value)
	proto.RegisterEnum("chromite.api.PrepareForToolchainBuildResponse_BuildRelevance", PrepareForToolchainBuildResponse_BuildRelevance_name, PrepareForToolchainBuildResponse_BuildRelevance_value)
	proto.RegisterType((*ArtifactInfo)(nil), "chromite.api.ArtifactInfo")
	proto.RegisterType((*PrepareForToolchainBuildRequest)(nil), "chromite.api.PrepareForToolchainBuildRequest")
	proto.RegisterType((*PrepareForToolchainBuildResponse)(nil), "chromite.api.PrepareForToolchainBuildResponse")
	proto.RegisterType((*BundleToolchainRequest)(nil), "chromite.api.BundleToolchainRequest")
	proto.RegisterType((*BundleToolchainResponse)(nil), "chromite.api.BundleToolchainResponse")
	proto.RegisterType((*VerifyAFDOArtifactsRequest)(nil), "chromite.api.VerifyAFDOArtifactsRequest")
	proto.RegisterType((*VerifyAFDOArtifactsResponse)(nil), "chromite.api.VerifyAFDOArtifactsResponse")
}

func init() { proto.RegisterFile("chromite/api/toolchain.proto", fileDescriptor_7ff43bdb7436d394) }

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

// ToolchainServiceClient is the client API for ToolchainService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ToolchainServiceClient interface {
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Update Chrome ebuild with most recent unvetted orderfile
	UpdateEbuildWithAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error)
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Copy the orderfile from unvetted GS bucket to vetted bucket.
	UploadVettedAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error)
	// Prepare to build toolchain artifacts.  This will be called twice:
	// Once with chroot and sysroot = None, before the chroot is created, and
	// again at the start of the 'install packages' step, if the build gets that
	// far.
	PrepareForBuild(ctx context.Context, in *PrepareForToolchainBuildRequest, opts ...grpc.CallOption) (*PrepareForToolchainBuildResponse, error)
	// Bundle toolchain artifacts.
	BundleArtifacts(ctx context.Context, in *BundleToolchainRequest, opts ...grpc.CallOption) (*BundleToolchainResponse, error)
}

type toolchainServiceClient struct {
	cc *grpc.ClientConn
}

func NewToolchainServiceClient(cc *grpc.ClientConn) ToolchainServiceClient {
	return &toolchainServiceClient{cc}
}

func (c *toolchainServiceClient) UpdateEbuildWithAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error) {
	out := new(VerifyAFDOArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/UpdateEbuildWithAFDOArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) UploadVettedAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error) {
	out := new(VerifyAFDOArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/UploadVettedAFDOArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

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

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

// ToolchainServiceServer is the server API for ToolchainService service.
type ToolchainServiceServer interface {
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Update Chrome ebuild with most recent unvetted orderfile
	UpdateEbuildWithAFDOArtifacts(context.Context, *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error)
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Copy the orderfile from unvetted GS bucket to vetted bucket.
	UploadVettedAFDOArtifacts(context.Context, *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error)
	// Prepare to build toolchain artifacts.  This will be called twice:
	// Once with chroot and sysroot = None, before the chroot is created, and
	// again at the start of the 'install packages' step, if the build gets that
	// far.
	PrepareForBuild(context.Context, *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error)
	// Bundle toolchain artifacts.
	BundleArtifacts(context.Context, *BundleToolchainRequest) (*BundleToolchainResponse, error)
}

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

func (*UnimplementedToolchainServiceServer) UpdateEbuildWithAFDOArtifacts(ctx context.Context, req *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UpdateEbuildWithAFDOArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) UploadVettedAFDOArtifacts(ctx context.Context, req *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UploadVettedAFDOArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) PrepareForBuild(ctx context.Context, req *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PrepareForBuild not implemented")
}
func (*UnimplementedToolchainServiceServer) BundleArtifacts(ctx context.Context, req *BundleToolchainRequest) (*BundleToolchainResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleArtifacts not implemented")
}

func RegisterToolchainServiceServer(s *grpc.Server, srv ToolchainServiceServer) {
	s.RegisterService(&_ToolchainService_serviceDesc, srv)
}

func _ToolchainService_UpdateEbuildWithAFDOArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VerifyAFDOArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).UpdateEbuildWithAFDOArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/UpdateEbuildWithAFDOArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).UpdateEbuildWithAFDOArtifacts(ctx, req.(*VerifyAFDOArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_UploadVettedAFDOArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VerifyAFDOArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).UploadVettedAFDOArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/UploadVettedAFDOArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).UploadVettedAFDOArtifacts(ctx, req.(*VerifyAFDOArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

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

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

var _ToolchainService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.ToolchainService",
	HandlerType: (*ToolchainServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "UpdateEbuildWithAFDOArtifacts",
			Handler:    _ToolchainService_UpdateEbuildWithAFDOArtifacts_Handler,
		},
		{
			MethodName: "UploadVettedAFDOArtifacts",
			Handler:    _ToolchainService_UploadVettedAFDOArtifacts_Handler,
		},
		{
			MethodName: "PrepareForBuild",
			Handler:    _ToolchainService_PrepareForBuild_Handler,
		},
		{
			MethodName: "BundleArtifacts",
			Handler:    _ToolchainService_BundleArtifacts_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/toolchain.proto",
}
