// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/image.proto

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Image argument - encapsulate data about an image.
type Image struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Path to the image file.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The image type.
	Type chromiumos.ImageType `protobuf:"varint,2,opt,name=type,proto3,enum=chromiumos.ImageType" json:"type,omitempty"`
	// The build target used to create the image.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,3,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
}

func (x *Image) Reset() {
	*x = Image{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_image_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Image) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Image) ProtoMessage() {}

func (x *Image) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_image_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Image.ProtoReflect.Descriptor instead.
func (*Image) Descriptor() ([]byte, []int) {
	return file_chromite_api_image_proto_rawDescGZIP(), []int{0}
}

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

func (x *Image) GetType() chromiumos.ImageType {
	if x != nil {
		return x.Type
	}
	return chromiumos.ImageType_IMAGE_TYPE_UNDEFINED
}

func (x *Image) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

// The image test arguments.
type CreateImageRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required.
	// The build target whose image is being built.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The types of images to build, defaults to building base image.
	// Note: Building either of the VM image types will also force the
	// corresponding regular image to be built. Only one VM image type may be
	// built at a time, and will overwrite any previously built VM image if the
	// same output directory (version) is used.
	ImageTypes []chromiumos.ImageType `protobuf:"varint,2,rep,packed,name=image_types,json=imageTypes,proto3,enum=chromiumos.ImageType" json:"image_types,omitempty"`
	// Whether rootfs verification should be disabled (enabled by default).
	DisableRootfsVerification bool `protobuf:"varint,3,opt,name=disable_rootfs_verification,json=disableRootfsVerification,proto3" json:"disable_rootfs_verification,omitempty"`
	// The image version.
	Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
	// Disk layout option. See README.disk_layout and legacy_disk_layout.json in
	// src/scripts/build_library.
	DiskLayout string `protobuf:"bytes,5,opt,name=disk_layout,json=diskLayout,proto3" json:"disk_layout,omitempty"`
	// Used to set the LSB builder path key in /etc/lsb-release. See
	// chromite/scripts/cros_set_lsb_release.py.
	BuilderPath string `protobuf:"bytes,6,opt,name=builder_path,json=builderPath,proto3" json:"builder_path,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,7,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

func (x *CreateImageRequest) Reset() {
	*x = CreateImageRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_image_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CreateImageRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CreateImageRequest) ProtoMessage() {}

func (x *CreateImageRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_image_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CreateImageRequest.ProtoReflect.Descriptor instead.
func (*CreateImageRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_image_proto_rawDescGZIP(), []int{1}
}

func (x *CreateImageRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *CreateImageRequest) GetImageTypes() []chromiumos.ImageType {
	if x != nil {
		return x.ImageTypes
	}
	return nil
}

func (x *CreateImageRequest) GetDisableRootfsVerification() bool {
	if x != nil {
		return x.DisableRootfsVerification
	}
	return false
}

func (x *CreateImageRequest) GetVersion() string {
	if x != nil {
		return x.Version
	}
	return ""
}

func (x *CreateImageRequest) GetDiskLayout() string {
	if x != nil {
		return x.DiskLayout
	}
	return ""
}

func (x *CreateImageRequest) GetBuilderPath() string {
	if x != nil {
		return x.BuilderPath
	}
	return ""
}

func (x *CreateImageRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

type CreateImageResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Whether it completed successfully.
	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
	// Images that were built. Will contain no more than one per image type.
	Images []*Image `protobuf:"bytes,2,rep,name=images,proto3" json:"images,omitempty"`
	// Any packages that failed to build. Empty on success.
	FailedPackages []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=failed_packages,json=failedPackages,proto3" json:"failed_packages,omitempty"`
	// The metric events that occurred during the running of CreateImage.
	// Added in R79.
	Events []*chromiumos.MetricEvent `protobuf:"bytes,4,rep,name=events,proto3" json:"events,omitempty"`
}

func (x *CreateImageResult) Reset() {
	*x = CreateImageResult{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_image_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CreateImageResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CreateImageResult) ProtoMessage() {}

func (x *CreateImageResult) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_image_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CreateImageResult.ProtoReflect.Descriptor instead.
func (*CreateImageResult) Descriptor() ([]byte, []int) {
	return file_chromite_api_image_proto_rawDescGZIP(), []int{2}
}

func (x *CreateImageResult) GetSuccess() bool {
	if x != nil {
		return x.Success
	}
	return false
}

func (x *CreateImageResult) GetImages() []*Image {
	if x != nil {
		return x.Images
	}
	return nil
}

func (x *CreateImageResult) GetFailedPackages() []*chromiumos.PackageInfo {
	if x != nil {
		return x.FailedPackages
	}
	return nil
}

func (x *CreateImageResult) GetEvents() []*chromiumos.MetricEvent {
	if x != nil {
		return x.Events
	}
	return nil
}

// The image test arguments.
type TestImageRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The image to be tested.
	// Image.path is required.
	Image *Image `protobuf:"bytes,1,opt,name=image,proto3" json:"image,omitempty"`
	// The build target whose image is being tested.
	// BuildTarget.name is required.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Required.
	Result *TestImageRequest_Result `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,4,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

func (x *TestImageRequest) Reset() {
	*x = TestImageRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_image_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestImageRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestImageRequest) ProtoMessage() {}

func (x *TestImageRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_image_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestImageRequest.ProtoReflect.Descriptor instead.
func (*TestImageRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_image_proto_rawDescGZIP(), []int{3}
}

func (x *TestImageRequest) GetImage() *Image {
	if x != nil {
		return x.Image
	}
	return nil
}

func (x *TestImageRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *TestImageRequest) GetResult() *TestImageRequest_Result {
	if x != nil {
		return x.Result
	}
	return nil
}

func (x *TestImageRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

type TestImageResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Whether all tests passed.
	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
}

func (x *TestImageResult) Reset() {
	*x = TestImageResult{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_image_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestImageResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestImageResult) ProtoMessage() {}

func (x *TestImageResult) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_image_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestImageResult.ProtoReflect.Descriptor instead.
func (*TestImageResult) Descriptor() ([]byte, []int) {
	return file_chromite_api_image_proto_rawDescGZIP(), []int{4}
}

func (x *TestImageResult) GetSuccess() bool {
	if x != nil {
		return x.Success
	}
	return false
}

// Request artifacts to be pushed from the archive bucket to the release bucket,
// using chromite/scripts/pushimage.py.
type PushImageRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The chroot used to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether or not this push image request is a dry run.
	Dryrun bool `protobuf:"varint,2,opt,name=dryrun,proto3" json:"dryrun,omitempty"`
	// GS path of source artifacts to push to the release bucket.
	GsImageDir string `protobuf:"bytes,3,opt,name=gs_image_dir,json=gsImageDir,proto3" json:"gs_image_dir,omitempty"`
	// Sysroot (board) to generate symbols for.
	Sysroot *Sysroot `protobuf:"bytes,4,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Board profile in use (e.g. "asan").
	// If set, the pushimage script will look for artifacts with this profile
	// in their name.
	Profile *chromiumos.Profile `protobuf:"bytes,5,opt,name=profile,proto3" json:"profile,omitempty"`
	// If set, only sign specified image types.
	SignTypes []chromiumos.ImageType `protobuf:"varint,6,rep,packed,name=sign_types,json=signTypes,proto3,enum=chromiumos.ImageType" json:"sign_types,omitempty"`
	// Destination bucket for push image operations.
	// If not set, 'gs://chromeos-releases' will be used.
	DestBucket string `protobuf:"bytes,7,opt,name=dest_bucket,json=destBucket,proto3" json:"dest_bucket,omitempty"`
}

func (x *PushImageRequest) Reset() {
	*x = PushImageRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_image_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *PushImageRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PushImageRequest) ProtoMessage() {}

func (x *PushImageRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_image_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PushImageRequest.ProtoReflect.Descriptor instead.
func (*PushImageRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_image_proto_rawDescGZIP(), []int{5}
}

func (x *PushImageRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *PushImageRequest) GetDryrun() bool {
	if x != nil {
		return x.Dryrun
	}
	return false
}

func (x *PushImageRequest) GetGsImageDir() string {
	if x != nil {
		return x.GsImageDir
	}
	return ""
}

func (x *PushImageRequest) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

func (x *PushImageRequest) GetProfile() *chromiumos.Profile {
	if x != nil {
		return x.Profile
	}
	return nil
}

func (x *PushImageRequest) GetSignTypes() []chromiumos.ImageType {
	if x != nil {
		return x.SignTypes
	}
	return nil
}

func (x *PushImageRequest) GetDestBucket() string {
	if x != nil {
		return x.DestBucket
	}
	return ""
}

// Response from pushimage script.
type PushImageResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *PushImageResponse) Reset() {
	*x = PushImageResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_image_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *PushImageResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PushImageResponse) ProtoMessage() {}

func (x *PushImageResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_image_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PushImageResponse.ProtoReflect.Descriptor instead.
func (*PushImageResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_image_proto_rawDescGZIP(), []int{6}
}

// Test results options specifications.
type TestImageRequest_Result struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location where the test results should be written.
	Directory string `protobuf:"bytes,1,opt,name=directory,proto3" json:"directory,omitempty"`
}

func (x *TestImageRequest_Result) Reset() {
	*x = TestImageRequest_Result{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_image_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestImageRequest_Result) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestImageRequest_Result) ProtoMessage() {}

func (x *TestImageRequest_Result) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_image_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestImageRequest_Result.ProtoReflect.Descriptor instead.
func (*TestImageRequest_Result) Descriptor() ([]byte, []int) {
	return file_chromite_api_image_proto_rawDescGZIP(), []int{3, 0}
}

func (x *TestImageRequest_Result) GetDirectory() string {
	if x != nil {
		return x.Directory
	}
	return ""
}

var File_chromite_api_image_proto protoreflect.FileDescriptor

var file_chromite_api_image_proto_rawDesc = []byte{
	0x0a, 0x18, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69,
	0x6d, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x70, 0x69,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63,
	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x82, 0x01, 0x0a, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12,
	0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70,
	0x61, 0x74, 0x68, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x49,
	0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3a,
	0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xd2, 0x02, 0x0a, 0x12, 0x43,
	0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x36, 0x0a,
	0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03,
	0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65,
	0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
	0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x64, 0x69, 0x73, 0x61,
	0x62, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
	0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18, 0x05,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74,
	0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68,
	0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x50,
	0x61, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x22,
	0xcd, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52,
	0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12,
	0x2b, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x13, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49,
	0x6d, 0x61, 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0f,
	0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18,
	0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e,
	0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2f,
	0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x72,
	0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22,
	0x8c, 0x02, 0x0a, 0x10, 0x54, 0x65, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12,
	0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x72,
	0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49,
	0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68,
	0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06,
	0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x1a, 0x26, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x2b,
	0x0a, 0x0f, 0x54, 0x65, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xaf, 0x02, 0x0a, 0x10,
	0x50, 0x75, 0x73, 0x68, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68,
	0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x16, 0x0a, 0x06,
	0x64, 0x72, 0x79, 0x72, 0x75, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72,
	0x79, 0x72, 0x75, 0x6e, 0x12, 0x20, 0x0a, 0x0c, 0x67, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65,
	0x5f, 0x64, 0x69, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x73, 0x49, 0x6d,
	0x61, 0x67, 0x65, 0x44, 0x69, 0x72, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f,
	0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x07,
	0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69,
	0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x07, 0x70,
	0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x74,
	0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70,
	0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b,
	0x64, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0a, 0x64, 0x65, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x13, 0x0a,
	0x11, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x32, 0xcc, 0x02, 0x0a, 0x0c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76,
	0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65,
	0x61, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
	0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43,
	0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x12, 0x45, 0x0a, 0x04, 0x54, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67,
	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67,
	0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x65,
	0x72, 0x54, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x12, 0x4c, 0x0a, 0x09, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6d, 0x61, 0x67,
	0x65, 0x12, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x1a, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x1a, 0x0d, 0xc2, 0xed, 0x1a, 0x09, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x10,
	0x01, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f,
	0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_image_proto_rawDescOnce sync.Once
	file_chromite_api_image_proto_rawDescData = file_chromite_api_image_proto_rawDesc
)

func file_chromite_api_image_proto_rawDescGZIP() []byte {
	file_chromite_api_image_proto_rawDescOnce.Do(func() {
		file_chromite_api_image_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_image_proto_rawDescData)
	})
	return file_chromite_api_image_proto_rawDescData
}

var file_chromite_api_image_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_chromite_api_image_proto_goTypes = []interface{}{
	(*Image)(nil),                   // 0: chromite.api.Image
	(*CreateImageRequest)(nil),      // 1: chromite.api.CreateImageRequest
	(*CreateImageResult)(nil),       // 2: chromite.api.CreateImageResult
	(*TestImageRequest)(nil),        // 3: chromite.api.TestImageRequest
	(*TestImageResult)(nil),         // 4: chromite.api.TestImageResult
	(*PushImageRequest)(nil),        // 5: chromite.api.PushImageRequest
	(*PushImageResponse)(nil),       // 6: chromite.api.PushImageResponse
	(*TestImageRequest_Result)(nil), // 7: chromite.api.TestImageRequest.Result
	(chromiumos.ImageType)(0),       // 8: chromiumos.ImageType
	(*chromiumos.BuildTarget)(nil),  // 9: chromiumos.BuildTarget
	(*chromiumos.Chroot)(nil),       // 10: chromiumos.Chroot
	(*chromiumos.PackageInfo)(nil),  // 11: chromiumos.PackageInfo
	(*chromiumos.MetricEvent)(nil),  // 12: chromiumos.MetricEvent
	(*Sysroot)(nil),                 // 13: chromite.api.Sysroot
	(*chromiumos.Profile)(nil),      // 14: chromiumos.Profile
}
var file_chromite_api_image_proto_depIdxs = []int32{
	8,  // 0: chromite.api.Image.type:type_name -> chromiumos.ImageType
	9,  // 1: chromite.api.Image.build_target:type_name -> chromiumos.BuildTarget
	9,  // 2: chromite.api.CreateImageRequest.build_target:type_name -> chromiumos.BuildTarget
	8,  // 3: chromite.api.CreateImageRequest.image_types:type_name -> chromiumos.ImageType
	10, // 4: chromite.api.CreateImageRequest.chroot:type_name -> chromiumos.Chroot
	0,  // 5: chromite.api.CreateImageResult.images:type_name -> chromite.api.Image
	11, // 6: chromite.api.CreateImageResult.failed_packages:type_name -> chromiumos.PackageInfo
	12, // 7: chromite.api.CreateImageResult.events:type_name -> chromiumos.MetricEvent
	0,  // 8: chromite.api.TestImageRequest.image:type_name -> chromite.api.Image
	9,  // 9: chromite.api.TestImageRequest.build_target:type_name -> chromiumos.BuildTarget
	7,  // 10: chromite.api.TestImageRequest.result:type_name -> chromite.api.TestImageRequest.Result
	10, // 11: chromite.api.TestImageRequest.chroot:type_name -> chromiumos.Chroot
	10, // 12: chromite.api.PushImageRequest.chroot:type_name -> chromiumos.Chroot
	13, // 13: chromite.api.PushImageRequest.sysroot:type_name -> chromite.api.Sysroot
	14, // 14: chromite.api.PushImageRequest.profile:type_name -> chromiumos.Profile
	8,  // 15: chromite.api.PushImageRequest.sign_types:type_name -> chromiumos.ImageType
	1,  // 16: chromite.api.ImageService.Create:input_type -> chromite.api.CreateImageRequest
	3,  // 17: chromite.api.ImageService.Test:input_type -> chromite.api.TestImageRequest
	3,  // 18: chromite.api.ImageService.SignerTest:input_type -> chromite.api.TestImageRequest
	5,  // 19: chromite.api.ImageService.PushImage:input_type -> chromite.api.PushImageRequest
	2,  // 20: chromite.api.ImageService.Create:output_type -> chromite.api.CreateImageResult
	4,  // 21: chromite.api.ImageService.Test:output_type -> chromite.api.TestImageResult
	4,  // 22: chromite.api.ImageService.SignerTest:output_type -> chromite.api.TestImageResult
	6,  // 23: chromite.api.ImageService.PushImage:output_type -> chromite.api.PushImageResponse
	20, // [20:24] is the sub-list for method output_type
	16, // [16:20] is the sub-list for method input_type
	16, // [16:16] is the sub-list for extension type_name
	16, // [16:16] is the sub-list for extension extendee
	0,  // [0:16] is the sub-list for field type_name
}

func init() { file_chromite_api_image_proto_init() }
func file_chromite_api_image_proto_init() {
	if File_chromite_api_image_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	file_chromite_api_sysroot_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_image_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Image); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_image_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CreateImageRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_image_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CreateImageResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_image_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestImageRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_image_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestImageResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_image_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PushImageRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_image_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PushImageResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_image_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestImageRequest_Result); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_image_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   8,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_image_proto_goTypes,
		DependencyIndexes: file_chromite_api_image_proto_depIdxs,
		MessageInfos:      file_chromite_api_image_proto_msgTypes,
	}.Build()
	File_chromite_api_image_proto = out.File
	file_chromite_api_image_proto_rawDesc = nil
	file_chromite_api_image_proto_goTypes = nil
	file_chromite_api_image_proto_depIdxs = nil
}
