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

// The chroot version information.
type ChrootVersion struct {
	// The version number.
	Version              uint32   `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChrootVersion proto.InternalMessageInfo

func (m *ChrootVersion) GetVersion() uint32 {
	if m != nil {
		return m.Version
	}
	return 0
}

// Create request message.
type CreateRequest struct {
	// The chroot-create flag arguments.
	Flags *CreateRequest_Flags `protobuf:"bytes,1,opt,name=flags,proto3" json:"flags,omitempty"`
	// The chroot to create.
	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 *CreateRequest) Reset()         { *m = CreateRequest{} }
func (m *CreateRequest) String() string { return proto.CompactTextString(m) }
func (*CreateRequest) ProtoMessage()    {}
func (*CreateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b3d6bdc7c0e50b1e, []int{1}
}

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

var xxx_messageInfo_CreateRequest proto.InternalMessageInfo

func (m *CreateRequest) GetFlags() *CreateRequest_Flags {
	if m != nil {
		return m.Flags
	}
	return nil
}

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

// Options that affect how the chroot is created.
type CreateRequest_Flags struct {
	// Whether or not to replace the chroot if it already exists.
	NoReplace bool `protobuf:"varint,1,opt,name=no_replace,json=noReplace,proto3" json:"no_replace,omitempty"`
	// Whether to do a full build of the SDK or use prebuilts.
	Bootstrap bool `protobuf:"varint,2,opt,name=bootstrap,proto3" json:"bootstrap,omitempty"`
	// Whether the chroot should be mounted on a loopback image or created
	// directly inside a directory. Set to true to create in a directory.
	NoUseImage           bool     `protobuf:"varint,3,opt,name=no_use_image,json=noUseImage,proto3" json:"no_use_image,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateRequest_Flags proto.InternalMessageInfo

func (m *CreateRequest_Flags) GetNoReplace() bool {
	if m != nil {
		return m.NoReplace
	}
	return false
}

func (m *CreateRequest_Flags) GetBootstrap() bool {
	if m != nil {
		return m.Bootstrap
	}
	return false
}

func (m *CreateRequest_Flags) GetNoUseImage() bool {
	if m != nil {
		return m.NoUseImage
	}
	return false
}

// Create response message.
type CreateResponse struct {
	// The resulting chroot version.
	Version              *ChrootVersion `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_CreateResponse proto.InternalMessageInfo

func (m *CreateResponse) GetVersion() *ChrootVersion {
	if m != nil {
		return m.Version
	}
	return nil
}

// Delete request message.
type DeleteRequest struct {
	// The chroot to delete.
	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 *DeleteRequest) Reset()         { *m = DeleteRequest{} }
func (m *DeleteRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteRequest) ProtoMessage()    {}
func (*DeleteRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b3d6bdc7c0e50b1e, []int{3}
}

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

var xxx_messageInfo_DeleteRequest proto.InternalMessageInfo

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

// Delete request message.
type DeleteResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DeleteResponse proto.InternalMessageInfo

type UnmountRequest struct {
	// The chroot to unmount.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_UnmountRequest proto.InternalMessageInfo

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

type UnmountResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UnmountResponse proto.InternalMessageInfo

// Chroot update request message.
// Example json:
// {"toolchain_targets": [{"name": "eve"}]}
type UpdateRequest struct {
	// The flags.
	Flags *UpdateRequest_Flags `protobuf:"bytes,1,opt,name=flags,proto3" json:"flags,omitempty"`
	// The targets whose toolchains should be updated in the chroot.
	ToolchainTargets []*chromiumos.BuildTarget `protobuf:"bytes,2,rep,name=toolchain_targets,json=toolchainTargets,proto3" json:"toolchain_targets,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *UpdateRequest) Reset()         { *m = UpdateRequest{} }
func (m *UpdateRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateRequest) ProtoMessage()    {}
func (*UpdateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b3d6bdc7c0e50b1e, []int{7}
}

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

var xxx_messageInfo_UpdateRequest proto.InternalMessageInfo

func (m *UpdateRequest) GetFlags() *UpdateRequest_Flags {
	if m != nil {
		return m.Flags
	}
	return nil
}

func (m *UpdateRequest) GetToolchainTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.ToolchainTargets
	}
	return nil
}

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

// Update flag arguments.
type UpdateRequest_Flags struct {
	// Whether to build from source or use prebuilt packages.
	BuildSource bool `protobuf:"varint,1,opt,name=build_source,json=buildSource,proto3" json:"build_source,omitempty"`
	// Whether a toolchain change has occurred.
	ToolchainChanged     bool     `protobuf:"varint,2,opt,name=toolchain_changed,json=toolchainChanged,proto3" json:"toolchain_changed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UpdateRequest_Flags proto.InternalMessageInfo

func (m *UpdateRequest_Flags) GetBuildSource() bool {
	if m != nil {
		return m.BuildSource
	}
	return false
}

func (m *UpdateRequest_Flags) GetToolchainChanged() bool {
	if m != nil {
		return m.ToolchainChanged
	}
	return false
}

// Chroot update response message.
type UpdateResponse struct {
	// The chroot version after update is complete.
	Version              *ChrootVersion `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_UpdateResponse proto.InternalMessageInfo

func (m *UpdateResponse) GetVersion() *ChrootVersion {
	if m != nil {
		return m.Version
	}
	return nil
}

type CleanRequest struct {
	Chroot               *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *CleanRequest) Reset()         { *m = CleanRequest{} }
func (m *CleanRequest) String() string { return proto.CompactTextString(m) }
func (*CleanRequest) ProtoMessage()    {}
func (*CleanRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b3d6bdc7c0e50b1e, []int{9}
}

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

var xxx_messageInfo_CleanRequest proto.InternalMessageInfo

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

type CleanResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CleanResponse proto.InternalMessageInfo

// An opaque key to a chroot snapshot state.
type SnapshotToken struct {
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SnapshotToken proto.InternalMessageInfo

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

type CreateSnapshotRequest struct {
	Chroot               *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_CreateSnapshotRequest proto.InternalMessageInfo

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

type CreateSnapshotResponse struct {
	SnapshotToken        *SnapshotToken `protobuf:"bytes,1,opt,name=snapshot_token,json=snapshotToken,proto3" json:"snapshot_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_CreateSnapshotResponse proto.InternalMessageInfo

func (m *CreateSnapshotResponse) GetSnapshotToken() *SnapshotToken {
	if m != nil {
		return m.SnapshotToken
	}
	return nil
}

type RestoreSnapshotRequest struct {
	Chroot               *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	SnapshotToken        *SnapshotToken     `protobuf:"bytes,2,opt,name=snapshot_token,json=snapshotToken,proto3" json:"snapshot_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_RestoreSnapshotRequest proto.InternalMessageInfo

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

func (m *RestoreSnapshotRequest) GetSnapshotToken() *SnapshotToken {
	if m != nil {
		return m.SnapshotToken
	}
	return nil
}

type RestoreSnapshotResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *RestoreSnapshotResponse) Reset()         { *m = RestoreSnapshotResponse{} }
func (m *RestoreSnapshotResponse) String() string { return proto.CompactTextString(m) }
func (*RestoreSnapshotResponse) ProtoMessage()    {}
func (*RestoreSnapshotResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_b3d6bdc7c0e50b1e, []int{15}
}

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

var xxx_messageInfo_RestoreSnapshotResponse proto.InternalMessageInfo

func init() {
	proto.RegisterType((*ChrootVersion)(nil), "chromite.api.ChrootVersion")
	proto.RegisterType((*CreateRequest)(nil), "chromite.api.CreateRequest")
	proto.RegisterType((*CreateRequest_Flags)(nil), "chromite.api.CreateRequest.Flags")
	proto.RegisterType((*CreateResponse)(nil), "chromite.api.CreateResponse")
	proto.RegisterType((*DeleteRequest)(nil), "chromite.api.DeleteRequest")
	proto.RegisterType((*DeleteResponse)(nil), "chromite.api.DeleteResponse")
	proto.RegisterType((*UnmountRequest)(nil), "chromite.api.UnmountRequest")
	proto.RegisterType((*UnmountResponse)(nil), "chromite.api.UnmountResponse")
	proto.RegisterType((*UpdateRequest)(nil), "chromite.api.UpdateRequest")
	proto.RegisterType((*UpdateRequest_Flags)(nil), "chromite.api.UpdateRequest.Flags")
	proto.RegisterType((*UpdateResponse)(nil), "chromite.api.UpdateResponse")
	proto.RegisterType((*CleanRequest)(nil), "chromite.api.CleanRequest")
	proto.RegisterType((*CleanResponse)(nil), "chromite.api.CleanResponse")
	proto.RegisterType((*SnapshotToken)(nil), "chromite.api.SnapshotToken")
	proto.RegisterType((*CreateSnapshotRequest)(nil), "chromite.api.CreateSnapshotRequest")
	proto.RegisterType((*CreateSnapshotResponse)(nil), "chromite.api.CreateSnapshotResponse")
	proto.RegisterType((*RestoreSnapshotRequest)(nil), "chromite.api.RestoreSnapshotRequest")
	proto.RegisterType((*RestoreSnapshotResponse)(nil), "chromite.api.RestoreSnapshotResponse")
}

func init() { proto.RegisterFile("chromite/api/sdk.proto", fileDescriptor_b3d6bdc7c0e50b1e) }

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

// SdkServiceClient is the client API for SdkService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type SdkServiceClient interface {
	// Create method, supports replacing an existing chroot.
	Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
	// Delete a chroot.
	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
	// Clean up unneeded files from the chroot.
	Clean(ctx context.Context, in *CleanRequest, opts ...grpc.CallOption) (*CleanResponse, error)
	// Unmount a chroot.
	Unmount(ctx context.Context, in *UnmountRequest, opts ...grpc.CallOption) (*UnmountResponse, error)
	// Update the chroot.
	Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*UpdateResponse, error)
	// Create a chroot snapshot.
	CreateSnapshot(ctx context.Context, in *CreateSnapshotRequest, opts ...grpc.CallOption) (*CreateSnapshotResponse, error)
	// Restore a chroot to a snapshot.
	RestoreSnapshot(ctx context.Context, in *RestoreSnapshotRequest, opts ...grpc.CallOption) (*RestoreSnapshotResponse, error)
}

type sdkServiceClient struct {
	cc *grpc.ClientConn
}

func NewSdkServiceClient(cc *grpc.ClientConn) SdkServiceClient {
	return &sdkServiceClient{cc}
}

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

func (c *sdkServiceClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
	out := new(DeleteResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SdkService/Delete", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sdkServiceClient) Clean(ctx context.Context, in *CleanRequest, opts ...grpc.CallOption) (*CleanResponse, error) {
	out := new(CleanResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SdkService/Clean", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sdkServiceClient) Unmount(ctx context.Context, in *UnmountRequest, opts ...grpc.CallOption) (*UnmountResponse, error) {
	out := new(UnmountResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SdkService/Unmount", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sdkServiceClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*UpdateResponse, error) {
	out := new(UpdateResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SdkService/Update", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sdkServiceClient) CreateSnapshot(ctx context.Context, in *CreateSnapshotRequest, opts ...grpc.CallOption) (*CreateSnapshotResponse, error) {
	out := new(CreateSnapshotResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SdkService/CreateSnapshot", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sdkServiceClient) RestoreSnapshot(ctx context.Context, in *RestoreSnapshotRequest, opts ...grpc.CallOption) (*RestoreSnapshotResponse, error) {
	out := new(RestoreSnapshotResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SdkService/RestoreSnapshot", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// SdkServiceServer is the server API for SdkService service.
type SdkServiceServer interface {
	// Create method, supports replacing an existing chroot.
	Create(context.Context, *CreateRequest) (*CreateResponse, error)
	// Delete a chroot.
	Delete(context.Context, *DeleteRequest) (*DeleteResponse, error)
	// Clean up unneeded files from the chroot.
	Clean(context.Context, *CleanRequest) (*CleanResponse, error)
	// Unmount a chroot.
	Unmount(context.Context, *UnmountRequest) (*UnmountResponse, error)
	// Update the chroot.
	Update(context.Context, *UpdateRequest) (*UpdateResponse, error)
	// Create a chroot snapshot.
	CreateSnapshot(context.Context, *CreateSnapshotRequest) (*CreateSnapshotResponse, error)
	// Restore a chroot to a snapshot.
	RestoreSnapshot(context.Context, *RestoreSnapshotRequest) (*RestoreSnapshotResponse, error)
}

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

func (*UnimplementedSdkServiceServer) Create(ctx context.Context, req *CreateRequest) (*CreateResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
}
func (*UnimplementedSdkServiceServer) Delete(ctx context.Context, req *DeleteRequest) (*DeleteResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
}
func (*UnimplementedSdkServiceServer) Clean(ctx context.Context, req *CleanRequest) (*CleanResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Clean not implemented")
}
func (*UnimplementedSdkServiceServer) Unmount(ctx context.Context, req *UnmountRequest) (*UnmountResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Unmount not implemented")
}
func (*UnimplementedSdkServiceServer) Update(ctx context.Context, req *UpdateRequest) (*UpdateResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Update not implemented")
}
func (*UnimplementedSdkServiceServer) CreateSnapshot(ctx context.Context, req *CreateSnapshotRequest) (*CreateSnapshotResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CreateSnapshot not implemented")
}
func (*UnimplementedSdkServiceServer) RestoreSnapshot(ctx context.Context, req *RestoreSnapshotRequest) (*RestoreSnapshotResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestoreSnapshot not implemented")
}

func RegisterSdkServiceServer(s *grpc.Server, srv SdkServiceServer) {
	s.RegisterService(&_SdkService_serviceDesc, srv)
}

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

func _SdkService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SdkServiceServer).Delete(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SdkService/Delete",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SdkServiceServer).Delete(ctx, req.(*DeleteRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SdkService_Clean_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CleanRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SdkServiceServer).Clean(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SdkService/Clean",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SdkServiceServer).Clean(ctx, req.(*CleanRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SdkService_Unmount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UnmountRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SdkServiceServer).Unmount(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SdkService/Unmount",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SdkServiceServer).Unmount(ctx, req.(*UnmountRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SdkService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SdkServiceServer).Update(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SdkService/Update",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SdkServiceServer).Update(ctx, req.(*UpdateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SdkService_CreateSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateSnapshotRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SdkServiceServer).CreateSnapshot(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SdkService/CreateSnapshot",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SdkServiceServer).CreateSnapshot(ctx, req.(*CreateSnapshotRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SdkService_RestoreSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(RestoreSnapshotRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SdkServiceServer).RestoreSnapshot(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SdkService/RestoreSnapshot",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SdkServiceServer).RestoreSnapshot(ctx, req.(*RestoreSnapshotRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _SdkService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.SdkService",
	HandlerType: (*SdkServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Create",
			Handler:    _SdkService_Create_Handler,
		},
		{
			MethodName: "Delete",
			Handler:    _SdkService_Delete_Handler,
		},
		{
			MethodName: "Clean",
			Handler:    _SdkService_Clean_Handler,
		},
		{
			MethodName: "Unmount",
			Handler:    _SdkService_Unmount_Handler,
		},
		{
			MethodName: "Update",
			Handler:    _SdkService_Update_Handler,
		},
		{
			MethodName: "CreateSnapshot",
			Handler:    _SdkService_CreateSnapshot_Handler,
		},
		{
			MethodName: "RestoreSnapshot",
			Handler:    _SdkService_RestoreSnapshot_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/sdk.proto",
}
