// 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

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

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

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

var xxx_messageInfo_UnmountPathRequest proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_UnmountPathResponse 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")
	proto.RegisterType((*UnmountPathRequest)(nil), "chromite.api.UnmountPathRequest")
	proto.RegisterType((*UnmountPathResponse)(nil), "chromite.api.UnmountPathResponse")
}

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

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

func (c *sdkServiceClient) UnmountPath(ctx context.Context, in *UnmountPathRequest, opts ...grpc.CallOption) (*UnmountPathResponse, error) {
	out := new(UnmountPathResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SdkService/UnmountPath", 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)
	// Unmount a filesystem path and any submounts under it.
	UnmountPath(context.Context, *UnmountPathRequest) (*UnmountPathResponse, 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 (*UnimplementedSdkServiceServer) UnmountPath(ctx context.Context, req *UnmountPathRequest) (*UnmountPathResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UnmountPath 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)
}

func _SdkService_UnmountPath_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UnmountPathRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SdkServiceServer).UnmountPath(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SdkService/UnmountPath",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SdkServiceServer).UnmountPath(ctx, req.(*UnmountPathRequest))
	}
	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,
		},
		{
			MethodName: "UnmountPath",
			Handler:    _SdkService_UnmountPath_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/sdk.proto",
}
