// 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?
// TODO(crbug/1034529): Once the users of this enum have moved to using
// artifacts.PrepareForBuildResponse.${NAME}, remove this enum.
type PrepareForToolchainBuildResponse_OldBuildRelevance int32

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

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

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

func (x PrepareForToolchainBuildResponse_OldBuildRelevance) String() string {
	return proto.EnumName(PrepareForToolchainBuildResponse_OldBuildRelevance_name, int32(x))
}

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