// Code generated by protoc-gen-go.
// source: google.golang.org/cloud/bigtable/internal/cluster_data_proto/bigtable_cluster_data.proto
// DO NOT EDIT!

/*
Package google_bigtable_admin_cluster_v1 is a generated protocol buffer package.

It is generated from these files:
	google.golang.org/cloud/bigtable/internal/cluster_data_proto/bigtable_cluster_data.proto

It has these top-level messages:
	Zone
	Cluster
*/
package google_bigtable_admin_cluster_v1

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import 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.
const _ = proto.ProtoPackageIsVersion1

type StorageType int32

const (
	// The storage type used is unspecified.
	StorageType_STORAGE_UNSPECIFIED StorageType = 0
	// Data will be stored in SSD, providing low and consistent latencies.
	StorageType_STORAGE_SSD StorageType = 1
	// Data will be stored in HDD, providing high and less predictable
	// latencies.
	StorageType_STORAGE_HDD StorageType = 2
)

var StorageType_name = map[int32]string{
	0: "STORAGE_UNSPECIFIED",
	1: "STORAGE_SSD",
	2: "STORAGE_HDD",
}
var StorageType_value = map[string]int32{
	"STORAGE_UNSPECIFIED": 0,
	"STORAGE_SSD":         1,
	"STORAGE_HDD":         2,
}

func (x StorageType) String() string {
	return proto.EnumName(StorageType_name, int32(x))
}
func (StorageType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }

// Possible states of a zone.
type Zone_Status int32

const (
	// The state of the zone is unknown or unspecified.
	Zone_UNKNOWN Zone_Status = 0
	// The zone is in a good state.
	Zone_OK Zone_Status = 1
	// The zone is down for planned maintenance.
	Zone_PLANNED_MAINTENANCE Zone_Status = 2
	// The zone is down for emergency or unplanned maintenance.
	Zone_EMERGENCY_MAINENANCE Zone_Status = 3
)

var Zone_Status_name = map[int32]string{
	0: "UNKNOWN",
	1: "OK",
	2: "PLANNED_MAINTENANCE",
	3: "EMERGENCY_MAINENANCE",
}
var Zone_Status_value = map[string]int32{
	"UNKNOWN": 0,
	"OK":      1,
	"PLANNED_MAINTENANCE":  2,
	"EMERGENCY_MAINENANCE": 3,
}

func (x Zone_Status) String() string {
	return proto.EnumName(Zone_Status_name, int32(x))
}
func (Zone_Status) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} }

// A physical location in which a particular project can allocate Cloud BigTable
// resources.
type Zone struct {
	// A permanent unique identifier for the zone.
	// Values are of the form projects/<project>/zones/[a-z][-a-z0-9]*
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// The name of this zone as it appears in UIs.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName" json:"display_name,omitempty"`
	// The current state of this zone.
	Status Zone_Status `protobuf:"varint,3,opt,name=status,enum=google.bigtable.admin.cluster.v1.Zone_Status" json:"status,omitempty"`
}

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

// An isolated set of Cloud BigTable resources on which tables can be hosted.
type Cluster struct {
	// A permanent unique identifier for the cluster. For technical reasons, the
	// zone in which the cluster resides is included here.
	// Values are of the form
	// projects/<project>/zones/<zone>/clusters/[a-z][-a-z0-9]*
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// The descriptive name for this cluster as it appears in UIs.
	// Must be unique per zone.
	DisplayName string `protobuf:"bytes,4,opt,name=display_name,json=displayName" json:"display_name,omitempty"`
	// The number of serve nodes allocated to this cluster.
	ServeNodes int32 `protobuf:"varint,5,opt,name=serve_nodes,json=serveNodes" json:"serve_nodes,omitempty"`
	// What storage type to use for tables in this cluster. Only configurable at
	// cluster creation time. If unspecified, STORAGE_SSD will be used.
	DefaultStorageType StorageType `protobuf:"varint,8,opt,name=default_storage_type,json=defaultStorageType,enum=google.bigtable.admin.cluster.v1.StorageType" json:"default_storage_type,omitempty"`
}

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

func init() {
	proto.RegisterType((*Zone)(nil), "google.bigtable.admin.cluster.v1.Zone")
	proto.RegisterType((*Cluster)(nil), "google.bigtable.admin.cluster.v1.Cluster")
	proto.RegisterEnum("google.bigtable.admin.cluster.v1.StorageType", StorageType_name, StorageType_value)
	proto.RegisterEnum("google.bigtable.admin.cluster.v1.Zone_Status", Zone_Status_name, Zone_Status_value)
}

var fileDescriptor0 = []byte{
	// 398 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x92, 0xdf, 0x6a, 0xdb, 0x30,
	0x14, 0xc6, 0xab, 0x34, 0x4d, 0xb7, 0xe3, 0xb1, 0x19, 0xad, 0x30, 0xdf, 0x2d, 0x0b, 0xbb, 0x08,
	0x83, 0x29, 0x6c, 0x7b, 0x82, 0xd8, 0xd6, 0xda, 0xd0, 0x55, 0x31, 0x76, 0xca, 0xfe, 0xdc, 0x08,
	0x25, 0xd6, 0x8c, 0x41, 0xb1, 0x8c, 0x2d, 0x17, 0xf2, 0x7a, 0x7b, 0x88, 0x3d, 0xcf, 0xb0, 0xa2,
	0x0e, 0x43, 0x2f, 0xda, 0x3b, 0xfb, 0xfb, 0x7d, 0xe7, 0x1c, 0x9d, 0x8f, 0x03, 0x3f, 0x0a, 0xad,
	0x0b, 0x25, 0x49, 0xa1, 0x95, 0xa8, 0x0a, 0xa2, 0x9b, 0x62, 0xb1, 0x53, 0xba, 0xcb, 0x17, 0xdb,
	0xb2, 0x30, 0x62, 0xab, 0xe4, 0xa2, 0xac, 0x8c, 0x6c, 0x2a, 0xa1, 0x16, 0x3b, 0xd5, 0xb5, 0x46,
	0x36, 0x3c, 0x17, 0x46, 0xf0, 0xba, 0xd1, 0x46, 0xff, 0x37, 0xf1, 0x21, 0x23, 0x96, 0xe1, 0xa9,
	0xeb, 0x7c, 0xef, 0x21, 0x22, 0xdf, 0x97, 0x15, 0x71, 0x4e, 0x72, 0xf7, 0x69, 0xf6, 0x17, 0xc1,
	0xf8, 0x97, 0xae, 0x24, 0xc6, 0x30, 0xae, 0xc4, 0x5e, 0x06, 0x68, 0x8a, 0xe6, 0xcf, 0x53, 0xfb,
	0x8d, 0xdf, 0xc1, 0x8b, 0xbc, 0x6c, 0x6b, 0x25, 0x0e, 0xdc, 0xb2, 0x91, 0x65, 0x9e, 0xd3, 0x58,
	0x6f, 0xa1, 0x30, 0x69, 0x8d, 0x30, 0x5d, 0x1b, 0x9c, 0x4e, 0xd1, 0xfc, 0xe5, 0xe7, 0x8f, 0xe4,
	0xb1, 0x91, 0xa4, 0x1f, 0x47, 0x32, 0x5b, 0x94, 0xba, 0xe2, 0x59, 0x02, 0x93, 0xa3, 0x82, 0x3d,
	0x38, 0xbf, 0x65, 0xd7, 0x6c, 0xfd, 0x9d, 0xf9, 0x27, 0x78, 0x02, 0xa3, 0xf5, 0xb5, 0x8f, 0xf0,
	0x1b, 0x78, 0x9d, 0x7c, 0x5b, 0x32, 0x46, 0x63, 0x7e, 0xb3, 0x5c, 0xb1, 0x0d, 0x65, 0x4b, 0x16,
	0x51, 0x7f, 0x84, 0x03, 0xb8, 0xa0, 0x37, 0x34, 0xbd, 0xa4, 0x2c, 0xfa, 0x69, 0x91, 0x23, 0xa7,
	0xb3, 0x3f, 0x08, 0xce, 0xa3, 0xe3, 0xd0, 0x27, 0xed, 0x36, 0x7e, 0xb8, 0xdb, 0x5b, 0xf0, 0x5a,
	0xd9, 0xdc, 0x49, 0x5e, 0xe9, 0x5c, 0xb6, 0xc1, 0xd9, 0x14, 0xcd, 0xcf, 0x52, 0xb0, 0x12, 0xeb,
	0x15, 0xcc, 0xe1, 0x22, 0x97, 0xbf, 0x45, 0xa7, 0x0c, 0x6f, 0x8d, 0x6e, 0x44, 0x21, 0xb9, 0x39,
	0xd4, 0x32, 0x78, 0xf6, 0xd4, 0x28, 0xb2, 0x63, 0xd5, 0xe6, 0x50, 0xcb, 0x14, 0xbb, 0x56, 0x03,
	0xed, 0xc3, 0x15, 0x78, 0x83, 0xdf, 0x3e, 0x86, 0x6c, 0xb3, 0x4e, 0x97, 0x97, 0x94, 0xdf, 0xb2,
	0x2c, 0xa1, 0xd1, 0xea, 0xeb, 0x8a, 0xc6, 0xfe, 0x09, 0x7e, 0x05, 0xde, 0x3d, 0xc8, 0xb2, 0xd8,
	0x47, 0x43, 0xe1, 0x2a, 0x8e, 0xfd, 0x51, 0x18, 0xc2, 0xfb, 0x9d, 0xde, 0x3f, 0xfa, 0xa2, 0x30,
	0x08, 0x1d, 0x72, 0xd9, 0xc5, 0xc2, 0x88, 0xa4, 0xbf, 0xa5, 0x04, 0x6d, 0x27, 0xf6, 0xa8, 0xbe,
	0xfc, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x74, 0xe9, 0xe5, 0xb0, 0x02, 0x00, 0x00,
}
