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

// Image argument - encapsulate data about an image.
type Image struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_Image proto.InternalMessageInfo

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

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

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

// The image test arguments.
type CreateImageRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_CreateImageRequest proto.InternalMessageInfo

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

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

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

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

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

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

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

type CreateImageResult struct {
	// 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.
	Events               []*chromiumos.MetricEvent `protobuf:"bytes,4,rep,name=events,proto3" json:"events,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_CreateImageResult proto.InternalMessageInfo

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

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

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

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

// The image test arguments.
type TestImageRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_TestImageRequest proto.InternalMessageInfo

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

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

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

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

// Test results options specifications.
type TestImageRequest_Result struct {
	// Location where the test results should be written.
	Directory            string   `protobuf:"bytes,1,opt,name=directory,proto3" json:"directory,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestImageRequest_Result proto.InternalMessageInfo

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

type TestImageResult struct {
	// Whether all tests passed.
	Success              bool     `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestImageResult proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*Image)(nil), "chromite.api.Image")
	proto.RegisterType((*CreateImageRequest)(nil), "chromite.api.CreateImageRequest")
	proto.RegisterType((*CreateImageResult)(nil), "chromite.api.CreateImageResult")
	proto.RegisterType((*TestImageRequest)(nil), "chromite.api.TestImageRequest")
	proto.RegisterType((*TestImageRequest_Result)(nil), "chromite.api.TestImageRequest.Result")
	proto.RegisterType((*TestImageResult)(nil), "chromite.api.TestImageResult")
}

func init() { proto.RegisterFile("chromite/api/image.proto", fileDescriptor_abef4ffabc69f3ed) }

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

// ImageServiceClient is the client API for ImageService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ImageServiceClient interface {
	// Build an image.
	// Example json:
	// {
	//  "build_target": {"name": "reef"},
	// }
	Create(ctx context.Context, in *CreateImageRequest, opts ...grpc.CallOption) (*CreateImageResult, error)
	// Test an image.
	// Example json:
	// {
	//  "build_target": {"name": "reef"},
	//  "image": {"path": "/mnt/host/source/src/build/images/reef/latest"},
	//  "result": {"directory": "/tmp/image_test_results"}
	// }
	Test(ctx context.Context, in *TestImageRequest, opts ...grpc.CallOption) (*TestImageResult, error)
	// Execute SignerTest for an image.
	// Example json:
	// {
	//  "build_target": {"name": "reef"},
	//  "image": {"path": "/mnt/host/source/src/build/images/reef/latest"},
	//  "result": {"directory": "/tmp/image_test_results"}
	// }
	SignerTest(ctx context.Context, in *TestImageRequest, opts ...grpc.CallOption) (*TestImageResult, error)
}

type imageServiceClient struct {
	cc *grpc.ClientConn
}

func NewImageServiceClient(cc *grpc.ClientConn) ImageServiceClient {
	return &imageServiceClient{cc}
}

func (c *imageServiceClient) Create(ctx context.Context, in *CreateImageRequest, opts ...grpc.CallOption) (*CreateImageResult, error) {
	out := new(CreateImageResult)
	err := c.cc.Invoke(ctx, "/chromite.api.ImageService/Create", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *imageServiceClient) Test(ctx context.Context, in *TestImageRequest, opts ...grpc.CallOption) (*TestImageResult, error) {
	out := new(TestImageResult)
	err := c.cc.Invoke(ctx, "/chromite.api.ImageService/Test", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *imageServiceClient) SignerTest(ctx context.Context, in *TestImageRequest, opts ...grpc.CallOption) (*TestImageResult, error) {
	out := new(TestImageResult)
	err := c.cc.Invoke(ctx, "/chromite.api.ImageService/SignerTest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ImageServiceServer is the server API for ImageService service.
type ImageServiceServer interface {
	// Build an image.
	// Example json:
	// {
	//  "build_target": {"name": "reef"},
	// }
	Create(context.Context, *CreateImageRequest) (*CreateImageResult, error)
	// Test an image.
	// Example json:
	// {
	//  "build_target": {"name": "reef"},
	//  "image": {"path": "/mnt/host/source/src/build/images/reef/latest"},
	//  "result": {"directory": "/tmp/image_test_results"}
	// }
	Test(context.Context, *TestImageRequest) (*TestImageResult, error)
	// Execute SignerTest for an image.
	// Example json:
	// {
	//  "build_target": {"name": "reef"},
	//  "image": {"path": "/mnt/host/source/src/build/images/reef/latest"},
	//  "result": {"directory": "/tmp/image_test_results"}
	// }
	SignerTest(context.Context, *TestImageRequest) (*TestImageResult, error)
}

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

func (*UnimplementedImageServiceServer) Create(ctx context.Context, req *CreateImageRequest) (*CreateImageResult, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
}
func (*UnimplementedImageServiceServer) Test(ctx context.Context, req *TestImageRequest) (*TestImageResult, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Test not implemented")
}
func (*UnimplementedImageServiceServer) SignerTest(ctx context.Context, req *TestImageRequest) (*TestImageResult, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SignerTest not implemented")
}

func RegisterImageServiceServer(s *grpc.Server, srv ImageServiceServer) {
	s.RegisterService(&_ImageService_serviceDesc, srv)
}

func _ImageService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateImageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ImageServiceServer).Create(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ImageService/Create",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ImageServiceServer).Create(ctx, req.(*CreateImageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ImageService_Test_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestImageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ImageServiceServer).Test(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ImageService/Test",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ImageServiceServer).Test(ctx, req.(*TestImageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ImageService_SignerTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestImageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ImageServiceServer).SignerTest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ImageService/SignerTest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ImageServiceServer).SignerTest(ctx, req.(*TestImageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ImageService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.ImageService",
	HandlerType: (*ImageServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Create",
			Handler:    _ImageService_Create_Handler,
		},
		{
			MethodName: "Test",
			Handler:    _ImageService_Test_Handler,
		},
		{
			MethodName: "SignerTest",
			Handler:    _ImageService_SignerTest_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/image.proto",
}
