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

// Portage environment variable that points to a remote binhost.
type BinhostKey int32

const (
	// No binhost key was specified.
	BinhostKey_UNSPECIFIED BinhostKey = 0
	// Contains prebuilts generated by the postsubmit builder.
	BinhostKey_POSTSUBMIT_BINHOST BinhostKey = 1
	// Contains prebuilts generated by the PFQ.
	BinhostKey_LATEST_RELEASE_CHROME_BINHOST BinhostKey = 2
	// Contains prebuilts generated by pre-flight builders.
	BinhostKey_PREFLIGHT_BINHOST BinhostKey = 3
)

var BinhostKey_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "POSTSUBMIT_BINHOST",
	2: "LATEST_RELEASE_CHROME_BINHOST",
	3: "PREFLIGHT_BINHOST",
}

var BinhostKey_value = map[string]int32{
	"UNSPECIFIED":                   0,
	"POSTSUBMIT_BINHOST":            1,
	"LATEST_RELEASE_CHROME_BINHOST": 2,
	"PREFLIGHT_BINHOST":             3,
}

func (x BinhostKey) String() string {
	return proto.EnumName(BinhostKey_name, int32(x))
}

func (BinhostKey) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{0}
}

// Overlay types for push_overlays.
type OverlayType int32

const (
	// Not specified.
	OverlayType_OVERLAYTYPE_UNSPECIFIED OverlayType = 0
	// Both public and private.
	OverlayType_OVERLAYTYPE_BOTH OverlayType = 1
	// Only public overlays.
	OverlayType_OVERLAYTYPE_PUBLIC OverlayType = 2
	// Only private overlays.
	OverlayType_OVERLAYTYPE_PRIVATE OverlayType = 3
	// No overlays will be used.
	OverlayType_OVERLAYTYPE_NONE OverlayType = 4
)

var OverlayType_name = map[int32]string{
	0: "OVERLAYTYPE_UNSPECIFIED",
	1: "OVERLAYTYPE_BOTH",
	2: "OVERLAYTYPE_PUBLIC",
	3: "OVERLAYTYPE_PRIVATE",
	4: "OVERLAYTYPE_NONE",
}

var OverlayType_value = map[string]int32{
	"OVERLAYTYPE_UNSPECIFIED": 0,
	"OVERLAYTYPE_BOTH":        1,
	"OVERLAYTYPE_PUBLIC":      2,
	"OVERLAYTYPE_PRIVATE":     3,
	"OVERLAYTYPE_NONE":        4,
}

func (x OverlayType) String() string {
	return proto.EnumName(OverlayType_name, int32(x))
}

func (OverlayType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{1}
}

type Binhost struct {
	// The binhost URI.
	Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
	// The package index file name relative to the base binhost uri.
	PackageIndex         string   `protobuf:"bytes,2,opt,name=package_index,json=packageIndex,proto3" json:"package_index,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Binhost proto.InternalMessageInfo

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

func (m *Binhost) GetPackageIndex() string {
	if m != nil {
		return m.PackageIndex
	}
	return ""
}

// Local package index file message.
type PackageIndex struct {
	Path                 *chromiumos.Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_PackageIndex proto.InternalMessageInfo

func (m *PackageIndex) GetPath() *chromiumos.Path {
	if m != nil {
		return m.Path
	}
	return nil
}

// Get the private prebuilts' ACL args for a build target.
type AclArgsRequest struct {
	// Required. The build target whose Prebuilt ACL args are being fetched.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_AclArgsRequest proto.InternalMessageInfo

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

type AclArgsResponse struct {
	Args                 []*AclArgsResponse_AclArg `protobuf:"bytes,1,rep,name=args,proto3" json:"args,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_AclArgsResponse proto.InternalMessageInfo

func (m *AclArgsResponse) GetArgs() []*AclArgsResponse_AclArg {
	if m != nil {
		return m.Args
	}
	return nil
}

// An ACL command argument.
type AclArgsResponse_AclArg struct {
	// The argument (usually -g or -u).
	Arg string `protobuf:"bytes,1,opt,name=arg,proto3" json:"arg,omitempty"`
	// The argument value ([group_id|user]:PERMISSION)
	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AclArgsResponse_AclArg proto.InternalMessageInfo

func (m *AclArgsResponse_AclArg) GetArg() string {
	if m != nil {
		return m.Arg
	}
	return ""
}

func (m *AclArgsResponse_AclArg) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

// Get the binhosts for the build target.
type BinhostGetRequest struct {
	// Required.
	// The build target whose binhosts are being fetched.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Required.
	// Whether to include private binhosts.
	Private              bool     `protobuf:"varint,2,opt,name=private,proto3" json:"private,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BinhostGetRequest proto.InternalMessageInfo

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

func (m *BinhostGetRequest) GetPrivate() bool {
	if m != nil {
		return m.Private
	}
	return false
}

type BinhostGetResponse struct {
	// The binhosts.
	Binhosts             []*Binhost `protobuf:"bytes,1,rep,name=binhosts,proto3" json:"binhosts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_BinhostGetResponse proto.InternalMessageInfo

func (m *BinhostGetResponse) GetBinhosts() []*Binhost {
	if m != nil {
		return m.Binhosts
	}
	return nil
}

// Describes where prebuilts will be uploaded so package index and other
// Portage metadata can be updated appropriately.
type PrepareBinhostUploadsRequest struct {
	// Deprecated.
	// Build target to prepare prebuilts for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Full URI where we wish to store prebuilts. Note that this service
	// call does NOT upload them, it only updates metadata.
	// Example: gs://chromeos-prebuilt/board/amd64-generic/packages/
	Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
	// Required when chroot not at default location.
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Required.
	// The sysroot whose prebuilts are being uploaded.
	Sysroot *Sysroot `protobuf:"bytes,4,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// The package index files to deduplicate the prebuilt list.
	PackageIndexFiles    []*PackageIndex `protobuf:"bytes,5,rep,name=package_index_files,json=packageIndexFiles,proto3" json:"package_index_files,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_PrepareBinhostUploadsRequest proto.InternalMessageInfo

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

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

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

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

func (m *PrepareBinhostUploadsRequest) GetPackageIndexFiles() []*PackageIndex {
	if m != nil {
		return m.PackageIndexFiles
	}
	return nil
}

// An upload target is a file in the uploads_dir, and is used by
// PrepareBinhostUploadsResponse and PrepareDevInstallBinhostUploadsResponse.
type UploadTarget struct {
	// Paths relative to uploads_dir.
	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 *UploadTarget) Reset()         { *m = UploadTarget{} }
func (m *UploadTarget) String() string { return proto.CompactTextString(m) }
func (*UploadTarget) ProtoMessage()    {}
func (*UploadTarget) Descriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{7}
}

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

var xxx_messageInfo_UploadTarget proto.InternalMessageInfo

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

// Return all files to upload.
type PrepareBinhostUploadsResponse struct {
	// Absolute chroot path to the local directory containing files to upload.
	UploadsDir string `protobuf:"bytes,1,opt,name=uploads_dir,json=uploadsDir,proto3" json:"uploads_dir,omitempty"`
	// All targets to be uploaded to the binhost.
	UploadTargets        []*UploadTarget `protobuf:"bytes,2,rep,name=upload_targets,json=uploadTargets,proto3" json:"upload_targets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_PrepareBinhostUploadsResponse proto.InternalMessageInfo

func (m *PrepareBinhostUploadsResponse) GetUploadsDir() string {
	if m != nil {
		return m.UploadsDir
	}
	return ""
}

func (m *PrepareBinhostUploadsResponse) GetUploadTargets() []*UploadTarget {
	if m != nil {
		return m.UploadTargets
	}
	return nil
}

// Describes where dev-install prebuilts will be uploaded so package index and
// other Portage metadata can be updated appropriately.
type PrepareDevInstallBinhostUploadsRequest struct {
	// Absolute path to the local directory that will contain all of the files to
	// upload.  This directory must already exist before calling
	// PrepareDevInstallBinhostUploads.
	UploadsDir string `protobuf:"bytes,1,opt,name=uploads_dir,json=uploadsDir,proto3" json:"uploads_dir,omitempty"`
	// Full URI where we wish to store prebuilts. Note that this service
	// call does NOT upload them, it only updates metadata.
	// Example: gs://chromeos-prebuilt/board/amd64-generic/packages/
	Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
	// Required when chroot not at default location.
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Required.
	// The sysroot whose prebuilts are being uploaded.
	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 *PrepareDevInstallBinhostUploadsRequest) Reset() {
	*m = PrepareDevInstallBinhostUploadsRequest{}
}
func (m *PrepareDevInstallBinhostUploadsRequest) String() string { return proto.CompactTextString(m) }
func (*PrepareDevInstallBinhostUploadsRequest) ProtoMessage()    {}
func (*PrepareDevInstallBinhostUploadsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{9}
}

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

var xxx_messageInfo_PrepareDevInstallBinhostUploadsRequest proto.InternalMessageInfo

func (m *PrepareDevInstallBinhostUploadsRequest) GetUploadsDir() string {
	if m != nil {
		return m.UploadsDir
	}
	return ""
}

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

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

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

// Return all dev-install files to upload.
type PrepareDevInstallBinhostUploadsResponse struct {
	// All targets to be uploaded to the binhost.
	UploadTargets        []*UploadTarget `protobuf:"bytes,1,rep,name=upload_targets,json=uploadTargets,proto3" json:"upload_targets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_PrepareDevInstallBinhostUploadsResponse proto.InternalMessageInfo

func (m *PrepareDevInstallBinhostUploadsResponse) GetUploadTargets() []*UploadTarget {
	if m != nil {
		return m.UploadTargets
	}
	return nil
}

// Set a binhost URL for the given build target.
type SetBinhostRequest struct {
	// Build target to update binhost for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Whether or not the binhost is private.
	Private bool `protobuf:"varint,2,opt,name=private,proto3" json:"private,omitempty"`
	// Binhost key to set or update.
	Key BinhostKey `protobuf:"varint,3,opt,name=key,proto3,enum=chromite.api.BinhostKey" json:"key,omitempty"`
	// URI storing all the binaries.
	Uri                  string   `protobuf:"bytes,4,opt,name=uri,proto3" json:"uri,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SetBinhostRequest) Reset()         { *m = SetBinhostRequest{} }
func (m *SetBinhostRequest) String() string { return proto.CompactTextString(m) }
func (*SetBinhostRequest) ProtoMessage()    {}
func (*SetBinhostRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{11}
}

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

var xxx_messageInfo_SetBinhostRequest proto.InternalMessageInfo

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

func (m *SetBinhostRequest) GetPrivate() bool {
	if m != nil {
		return m.Private
	}
	return false
}

func (m *SetBinhostRequest) GetKey() BinhostKey {
	if m != nil {
		return m.Key
	}
	return BinhostKey_UNSPECIFIED
}

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

// Response for SetBinhost service call.
type SetBinhostResponse struct {
	// Absolute path to the updated binhost conf file.
	OutputFile           string   `protobuf:"bytes,1,opt,name=output_file,json=outputFile,proto3" json:"output_file,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SetBinhostResponse) Reset()         { *m = SetBinhostResponse{} }
func (m *SetBinhostResponse) String() string { return proto.CompactTextString(m) }
func (*SetBinhostResponse) ProtoMessage()    {}
func (*SetBinhostResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{12}
}

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

var xxx_messageInfo_SetBinhostResponse proto.InternalMessageInfo

func (m *SetBinhostResponse) GetOutputFile() string {
	if m != nil {
		return m.OutputFile
	}
	return ""
}

// Regenerate the build cache.
type RegenBuildCacheRequest struct {
	// Required.
	// The type of overlays to push:  "public", "private", or "both".
	OverlayType OverlayType `protobuf:"varint,1,opt,name=overlay_type,json=overlayType,proto3,enum=chromite.api.OverlayType" json:"overlay_type,omitempty"`
	// Required if not in the default location.
	// The chroot to be used.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *RegenBuildCacheRequest) Reset()         { *m = RegenBuildCacheRequest{} }
func (m *RegenBuildCacheRequest) String() string { return proto.CompactTextString(m) }
func (*RegenBuildCacheRequest) ProtoMessage()    {}
func (*RegenBuildCacheRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{13}
}

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

var xxx_messageInfo_RegenBuildCacheRequest proto.InternalMessageInfo

func (m *RegenBuildCacheRequest) GetOverlayType() OverlayType {
	if m != nil {
		return m.OverlayType
	}
	return OverlayType_OVERLAYTYPE_UNSPECIFIED
}

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

type RegenBuildCacheResponse struct {
	// The overlays that have outstanding cache updates.
	ModifiedOverlays     []*RegenBuildCacheResponse_Overlay `protobuf:"bytes,1,rep,name=modified_overlays,json=modifiedOverlays,proto3" json:"modified_overlays,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

func (m *RegenBuildCacheResponse) Reset()         { *m = RegenBuildCacheResponse{} }
func (m *RegenBuildCacheResponse) String() string { return proto.CompactTextString(m) }
func (*RegenBuildCacheResponse) ProtoMessage()    {}
func (*RegenBuildCacheResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{14}
}

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

var xxx_messageInfo_RegenBuildCacheResponse proto.InternalMessageInfo

func (m *RegenBuildCacheResponse) GetModifiedOverlays() []*RegenBuildCacheResponse_Overlay {
	if m != nil {
		return m.ModifiedOverlays
	}
	return nil
}

// Message to encapsulate the modified overlays.
type RegenBuildCacheResponse_Overlay struct {
	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 *RegenBuildCacheResponse_Overlay) Reset()         { *m = RegenBuildCacheResponse_Overlay{} }
func (m *RegenBuildCacheResponse_Overlay) String() string { return proto.CompactTextString(m) }
func (*RegenBuildCacheResponse_Overlay) ProtoMessage()    {}
func (*RegenBuildCacheResponse_Overlay) Descriptor() ([]byte, []int) {
	return fileDescriptor_d632782a0b1177ef, []int{14, 0}
}

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

var xxx_messageInfo_RegenBuildCacheResponse_Overlay proto.InternalMessageInfo

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

func init() {
	proto.RegisterEnum("chromite.api.BinhostKey", BinhostKey_name, BinhostKey_value)
	proto.RegisterEnum("chromite.api.OverlayType", OverlayType_name, OverlayType_value)
	proto.RegisterType((*Binhost)(nil), "chromite.api.Binhost")
	proto.RegisterType((*PackageIndex)(nil), "chromite.api.PackageIndex")
	proto.RegisterType((*AclArgsRequest)(nil), "chromite.api.AclArgsRequest")
	proto.RegisterType((*AclArgsResponse)(nil), "chromite.api.AclArgsResponse")
	proto.RegisterType((*AclArgsResponse_AclArg)(nil), "chromite.api.AclArgsResponse.AclArg")
	proto.RegisterType((*BinhostGetRequest)(nil), "chromite.api.BinhostGetRequest")
	proto.RegisterType((*BinhostGetResponse)(nil), "chromite.api.BinhostGetResponse")
	proto.RegisterType((*PrepareBinhostUploadsRequest)(nil), "chromite.api.PrepareBinhostUploadsRequest")
	proto.RegisterType((*UploadTarget)(nil), "chromite.api.UploadTarget")
	proto.RegisterType((*PrepareBinhostUploadsResponse)(nil), "chromite.api.PrepareBinhostUploadsResponse")
	proto.RegisterType((*PrepareDevInstallBinhostUploadsRequest)(nil), "chromite.api.PrepareDevInstallBinhostUploadsRequest")
	proto.RegisterType((*PrepareDevInstallBinhostUploadsResponse)(nil), "chromite.api.PrepareDevInstallBinhostUploadsResponse")
	proto.RegisterType((*SetBinhostRequest)(nil), "chromite.api.SetBinhostRequest")
	proto.RegisterType((*SetBinhostResponse)(nil), "chromite.api.SetBinhostResponse")
	proto.RegisterType((*RegenBuildCacheRequest)(nil), "chromite.api.RegenBuildCacheRequest")
	proto.RegisterType((*RegenBuildCacheResponse)(nil), "chromite.api.RegenBuildCacheResponse")
	proto.RegisterType((*RegenBuildCacheResponse_Overlay)(nil), "chromite.api.RegenBuildCacheResponse.Overlay")
}

func init() { proto.RegisterFile("chromite/api/binhost.proto", fileDescriptor_d632782a0b1177ef) }

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

// BinhostServiceClient is the client API for BinhostService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type BinhostServiceClient interface {
	// Get the binhosts for a build target.
	Get(ctx context.Context, in *BinhostGetRequest, opts ...grpc.CallOption) (*BinhostGetResponse, error)
	// Get the arguments from the private overlay's ACL file.
	GetPrivatePrebuiltAclArgs(ctx context.Context, in *AclArgsRequest, opts ...grpc.CallOption) (*AclArgsResponse, error)
	// Return a list of files to upload to the binhost. Importantly, this method
	// assumes that all files, once uploaded, will share the same relative path
	// on the remote disk as they do on the remote disk. E.g., package foo/bar,
	// stored locally at /mnt/bin/foo/bar, must be uploaded to <uri>/foo/bar.
	PrepareBinhostUploads(ctx context.Context, in *PrepareBinhostUploadsRequest, opts ...grpc.CallOption) (*PrepareBinhostUploadsResponse, error)
	// Return a list of dev-install files to upload to the binhost. Like
	// PrepareBinhostUploads, this method assumes that all files, once uploaded,
	// will share the same relative path on the remote disk as they do on the
	// remote disk.
	PrepareDevInstallBinhostUploads(ctx context.Context, in *PrepareDevInstallBinhostUploadsRequest, opts ...grpc.CallOption) (*PrepareDevInstallBinhostUploadsResponse, error)
	// Update the binhost key for a build targets.
	SetBinhost(ctx context.Context, in *SetBinhostRequest, opts ...grpc.CallOption) (*SetBinhostResponse, error)
	// Regenerate the builder cache.
	RegenBuildCache(ctx context.Context, in *RegenBuildCacheRequest, opts ...grpc.CallOption) (*RegenBuildCacheResponse, error)
}

type binhostServiceClient struct {
	cc *grpc.ClientConn
}

func NewBinhostServiceClient(cc *grpc.ClientConn) BinhostServiceClient {
	return &binhostServiceClient{cc}
}

func (c *binhostServiceClient) Get(ctx context.Context, in *BinhostGetRequest, opts ...grpc.CallOption) (*BinhostGetResponse, error) {
	out := new(BinhostGetResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.BinhostService/Get", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binhostServiceClient) GetPrivatePrebuiltAclArgs(ctx context.Context, in *AclArgsRequest, opts ...grpc.CallOption) (*AclArgsResponse, error) {
	out := new(AclArgsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.BinhostService/GetPrivatePrebuiltAclArgs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binhostServiceClient) PrepareBinhostUploads(ctx context.Context, in *PrepareBinhostUploadsRequest, opts ...grpc.CallOption) (*PrepareBinhostUploadsResponse, error) {
	out := new(PrepareBinhostUploadsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.BinhostService/PrepareBinhostUploads", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binhostServiceClient) PrepareDevInstallBinhostUploads(ctx context.Context, in *PrepareDevInstallBinhostUploadsRequest, opts ...grpc.CallOption) (*PrepareDevInstallBinhostUploadsResponse, error) {
	out := new(PrepareDevInstallBinhostUploadsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.BinhostService/PrepareDevInstallBinhostUploads", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binhostServiceClient) SetBinhost(ctx context.Context, in *SetBinhostRequest, opts ...grpc.CallOption) (*SetBinhostResponse, error) {
	out := new(SetBinhostResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.BinhostService/SetBinhost", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binhostServiceClient) RegenBuildCache(ctx context.Context, in *RegenBuildCacheRequest, opts ...grpc.CallOption) (*RegenBuildCacheResponse, error) {
	out := new(RegenBuildCacheResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.BinhostService/RegenBuildCache", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// BinhostServiceServer is the server API for BinhostService service.
type BinhostServiceServer interface {
	// Get the binhosts for a build target.
	Get(context.Context, *BinhostGetRequest) (*BinhostGetResponse, error)
	// Get the arguments from the private overlay's ACL file.
	GetPrivatePrebuiltAclArgs(context.Context, *AclArgsRequest) (*AclArgsResponse, error)
	// Return a list of files to upload to the binhost. Importantly, this method
	// assumes that all files, once uploaded, will share the same relative path
	// on the remote disk as they do on the remote disk. E.g., package foo/bar,
	// stored locally at /mnt/bin/foo/bar, must be uploaded to <uri>/foo/bar.
	PrepareBinhostUploads(context.Context, *PrepareBinhostUploadsRequest) (*PrepareBinhostUploadsResponse, error)
	// Return a list of dev-install files to upload to the binhost. Like
	// PrepareBinhostUploads, this method assumes that all files, once uploaded,
	// will share the same relative path on the remote disk as they do on the
	// remote disk.
	PrepareDevInstallBinhostUploads(context.Context, *PrepareDevInstallBinhostUploadsRequest) (*PrepareDevInstallBinhostUploadsResponse, error)
	// Update the binhost key for a build targets.
	SetBinhost(context.Context, *SetBinhostRequest) (*SetBinhostResponse, error)
	// Regenerate the builder cache.
	RegenBuildCache(context.Context, *RegenBuildCacheRequest) (*RegenBuildCacheResponse, error)
}

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

func (*UnimplementedBinhostServiceServer) Get(ctx context.Context, req *BinhostGetRequest) (*BinhostGetResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
}
func (*UnimplementedBinhostServiceServer) GetPrivatePrebuiltAclArgs(ctx context.Context, req *AclArgsRequest) (*AclArgsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetPrivatePrebuiltAclArgs not implemented")
}
func (*UnimplementedBinhostServiceServer) PrepareBinhostUploads(ctx context.Context, req *PrepareBinhostUploadsRequest) (*PrepareBinhostUploadsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PrepareBinhostUploads not implemented")
}
func (*UnimplementedBinhostServiceServer) PrepareDevInstallBinhostUploads(ctx context.Context, req *PrepareDevInstallBinhostUploadsRequest) (*PrepareDevInstallBinhostUploadsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PrepareDevInstallBinhostUploads not implemented")
}
func (*UnimplementedBinhostServiceServer) SetBinhost(ctx context.Context, req *SetBinhostRequest) (*SetBinhostResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetBinhost not implemented")
}
func (*UnimplementedBinhostServiceServer) RegenBuildCache(ctx context.Context, req *RegenBuildCacheRequest) (*RegenBuildCacheResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RegenBuildCache not implemented")
}

func RegisterBinhostServiceServer(s *grpc.Server, srv BinhostServiceServer) {
	s.RegisterService(&_BinhostService_serviceDesc, srv)
}

func _BinhostService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BinhostGetRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinhostServiceServer).Get(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.BinhostService/Get",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinhostServiceServer).Get(ctx, req.(*BinhostGetRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinhostService_GetPrivatePrebuiltAclArgs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AclArgsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinhostServiceServer).GetPrivatePrebuiltAclArgs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.BinhostService/GetPrivatePrebuiltAclArgs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinhostServiceServer).GetPrivatePrebuiltAclArgs(ctx, req.(*AclArgsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinhostService_PrepareBinhostUploads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PrepareBinhostUploadsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinhostServiceServer).PrepareBinhostUploads(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.BinhostService/PrepareBinhostUploads",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinhostServiceServer).PrepareBinhostUploads(ctx, req.(*PrepareBinhostUploadsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinhostService_PrepareDevInstallBinhostUploads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PrepareDevInstallBinhostUploadsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinhostServiceServer).PrepareDevInstallBinhostUploads(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.BinhostService/PrepareDevInstallBinhostUploads",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinhostServiceServer).PrepareDevInstallBinhostUploads(ctx, req.(*PrepareDevInstallBinhostUploadsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinhostService_SetBinhost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SetBinhostRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinhostServiceServer).SetBinhost(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.BinhostService/SetBinhost",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinhostServiceServer).SetBinhost(ctx, req.(*SetBinhostRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinhostService_RegenBuildCache_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(RegenBuildCacheRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinhostServiceServer).RegenBuildCache(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.BinhostService/RegenBuildCache",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinhostServiceServer).RegenBuildCache(ctx, req.(*RegenBuildCacheRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _BinhostService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.BinhostService",
	HandlerType: (*BinhostServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Get",
			Handler:    _BinhostService_Get_Handler,
		},
		{
			MethodName: "GetPrivatePrebuiltAclArgs",
			Handler:    _BinhostService_GetPrivatePrebuiltAclArgs_Handler,
		},
		{
			MethodName: "PrepareBinhostUploads",
			Handler:    _BinhostService_PrepareBinhostUploads_Handler,
		},
		{
			MethodName: "PrepareDevInstallBinhostUploads",
			Handler:    _BinhostService_PrepareDevInstallBinhostUploads_Handler,
		},
		{
			MethodName: "SetBinhost",
			Handler:    _BinhostService_SetBinhost_Handler,
		},
		{
			MethodName: "RegenBuildCache",
			Handler:    _BinhostService_RegenBuildCache_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/binhost.proto",
}
