This commit is contained in:
Gyu-Ho Lee 2016-03-30 15:48:11 -07:00
parent be1f2e2ad4
commit e4d2b9c687
18 changed files with 1362 additions and 486 deletions

28
Godeps/Godeps.json generated
View File

@ -25,38 +25,38 @@
},
{
"ImportPath": "github.com/coreos/etcd/client",
"Comment": "v2.3.0-104-g83ada72",
"Rev": "83ada7232a13491f7ef94cb398d9af8b3b2cb5fb"
"Comment": "v2.3.0-172-g93c3f92",
"Rev": "93c3f920ca5443089fab9b45eb470ffc46a5170c"
},
{
"ImportPath": "github.com/coreos/etcd/clientv3",
"Comment": "v2.3.0-104-g83ada72",
"Rev": "83ada7232a13491f7ef94cb398d9af8b3b2cb5fb"
"Comment": "v2.3.0-172-g93c3f92",
"Rev": "93c3f920ca5443089fab9b45eb470ffc46a5170c"
},
{
"ImportPath": "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes",
"Comment": "v2.3.0-104-g83ada72",
"Rev": "83ada7232a13491f7ef94cb398d9af8b3b2cb5fb"
"Comment": "v2.3.0-172-g93c3f92",
"Rev": "93c3f920ca5443089fab9b45eb470ffc46a5170c"
},
{
"ImportPath": "github.com/coreos/etcd/etcdserver/etcdserverpb",
"Comment": "v2.3.0-104-g83ada72",
"Rev": "83ada7232a13491f7ef94cb398d9af8b3b2cb5fb"
"Comment": "v2.3.0-172-g93c3f92",
"Rev": "93c3f920ca5443089fab9b45eb470ffc46a5170c"
},
{
"ImportPath": "github.com/coreos/etcd/pkg/pathutil",
"Comment": "v2.3.0-104-g83ada72",
"Rev": "83ada7232a13491f7ef94cb398d9af8b3b2cb5fb"
"Comment": "v2.3.0-172-g93c3f92",
"Rev": "93c3f920ca5443089fab9b45eb470ffc46a5170c"
},
{
"ImportPath": "github.com/coreos/etcd/pkg/types",
"Comment": "v2.3.0-104-g83ada72",
"Rev": "83ada7232a13491f7ef94cb398d9af8b3b2cb5fb"
"Comment": "v2.3.0-172-g93c3f92",
"Rev": "93c3f920ca5443089fab9b45eb470ffc46a5170c"
},
{
"ImportPath": "github.com/coreos/etcd/storage/storagepb",
"Comment": "v2.3.0-104-g83ada72",
"Rev": "83ada7232a13491f7ef94cb398d9af8b3b2cb5fb"
"Comment": "v2.3.0-172-g93c3f92",
"Rev": "93c3f920ca5443089fab9b45eb470ffc46a5170c"
},
{
"ImportPath": "github.com/dustin/go-humanize",

View File

@ -4,6 +4,11 @@ etcd/client is the Go client library for etcd.
[![GoDoc](https://godoc.org/github.com/coreos/etcd/client?status.png)](https://godoc.org/github.com/coreos/etcd/client)
etcd uses go's `vendor` directory to manage external dependencies. If `client` is imported
outside of etcd, simply copy `client` to the `vendor` directory or use tools like godep to
manage your own dependency, as in [vendor directories](https://golang.org/cmd/go/#hdr-Vendor_Directories).
For more detail, please read [Go vendor design](https://golang.org/s/go15vendor).
## Install
```bash

View File

@ -342,7 +342,9 @@ func (c *httpClusterClient) Do(ctx context.Context, act httpAction) (*http.Respo
resp, body, err = hc.Do(ctx, action)
if err != nil {
cerr.Errors = append(cerr.Errors, err)
// mask previous errors with context error, which is controlled by user
if err == ctx.Err() {
return nil, nil, ctx.Err()
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, nil, err
}

View File

@ -34,6 +34,8 @@ Create a Config and exchange it for a Client:
// handle error
}
Clients are safe for concurrent use by multiple goroutines.
Create a KeysAPI using the Client, then use it to interact with etcd:
kAPI := client.NewKeysAPI(c)

View File

@ -40,6 +40,11 @@ if err != nil {
// use the response
```
etcd uses go's `vendor` directory to manage external dependencies. If `clientv3` is imported
outside of etcd, simply copy `clientv3` to the `vendor` directory or use tools like godep to
manage your own dependency, as in [vendor directories](https://golang.org/cmd/go/#hdr-Vendor_Directories).
For more detail, please read [Go vendor design](https://golang.org/s/go15vendor).
## Error Handling
etcd client returns 2 types of errors:

View File

@ -21,8 +21,8 @@ import (
)
type (
AuthEnableResponse pb.AuthEnableResponse
UserAddResponse pb.UserAddResponse
AuthEnableResponse pb.AuthEnableResponse
AuthUserAddResponse pb.AuthUserAddResponse
)
type Auth interface {
@ -30,7 +30,7 @@ type Auth interface {
AuthEnable(ctx context.Context) (*AuthEnableResponse, error)
// UserAdd adds a new user to an etcd cluster.
UserAdd(ctx context.Context, name string, password string) (*UserAddResponse, error)
UserAdd(ctx context.Context, name string, password string) (*AuthUserAddResponse, error)
}
type auth struct {
@ -54,7 +54,7 @@ func (auth *auth) AuthEnable(ctx context.Context) (*AuthEnableResponse, error) {
return (*AuthEnableResponse)(resp), err
}
func (auth *auth) UserAdd(ctx context.Context, name string, password string) (*UserAddResponse, error) {
resp, err := auth.remote.UserAdd(ctx, &pb.UserAddRequest{Name: name, Password: password})
return (*UserAddResponse)(resp), err
func (auth *auth) UserAdd(ctx context.Context, name string, password string) (*AuthUserAddResponse, error) {
resp, err := auth.remote.UserAdd(ctx, &pb.AuthUserAddRequest{Name: name, Password: password})
return (*AuthUserAddResponse)(resp), err
}

View File

@ -28,15 +28,12 @@ import (
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/grpclog"
)
var (
ErrNoAvailableEndpoints = errors.New("etcdclient: no available endpoints")
)
type Logger grpclog.Logger
// Client provides and manages an etcd v3 client session.
type Client struct {
Cluster
@ -54,8 +51,6 @@ type Client struct {
ctx context.Context
cancel context.CancelFunc
logger Logger
}
// EndpointDialer is a policy for choosing which endpoint to dial next
@ -189,14 +184,12 @@ func newClient(cfg *Config) (*Client, error) {
client.Lease = NewLease(client)
client.Watcher = NewWatcher(client)
client.Auth = NewAuth(client)
client.Maintenance = &maintenance{c: client}
if cfg.Logger == nil {
client.logger = log.New(ioutil.Discard, "", 0)
// disable client side grpc by default
grpclog.SetLogger(log.New(ioutil.Discard, "", 0))
client.Maintenance = NewMaintenance(client)
if cfg.Logger != nil {
logger.Set(cfg.Logger)
} else {
client.logger = cfg.Logger
grpclog.SetLogger(cfg.Logger)
// disable client side grpc by default
logger.Set(log.New(ioutil.Discard, "", 0))
}
return client, nil

View File

@ -38,6 +38,9 @@
// }
// // use the response
//
// The Client has internal state (watchers and leases), so Clients should be reused instead of created as needed.
// Clients are safe for concurrent use by multiple goroutines.
//
// etcd client returns 2 types of errors:
//
// 1. context error: canceled or deadline exceeded.

View File

@ -183,14 +183,18 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) {
}
func (kv *kv) switchRemote(prevErr error) error {
// Usually it's a bad idea to lock on network i/o but here it's OK
// since the link is down and new requests can't be processed anyway.
// Likewise, if connecting stalls, closing the Client can break the
// lock via context cancelation.
kv.mu.Lock()
defer kv.mu.Unlock()
newConn, err := kv.c.retryConnection(kv.conn, prevErr)
if err != nil {
return err
}
kv.mu.Lock()
defer kv.mu.Unlock()
kv.conn = newConn
kv.remote = pb.NewKVClient(kv.conn)
return nil

64
vendor/github.com/coreos/etcd/clientv3/logger.go generated vendored Normal file
View File

@ -0,0 +1,64 @@
// Copyright 2016 CoreOS, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package clientv3
import (
"log"
"os"
"sync"
"google.golang.org/grpc/grpclog"
)
type Logger grpclog.Logger
var (
logger settableLogger
)
type settableLogger struct {
l grpclog.Logger
mu sync.RWMutex
}
func init() {
// use go's standard logger by default like grpc
logger.mu.Lock()
logger.l = log.New(os.Stderr, "", log.LstdFlags)
grpclog.SetLogger(&logger)
logger.mu.Unlock()
}
func (s *settableLogger) Set(l Logger) {
s.mu.Lock()
logger.l = l
s.mu.Unlock()
}
func (s *settableLogger) Get() Logger {
s.mu.RLock()
l := logger.l
s.mu.RUnlock()
return l
}
// implement the grpclog.Logger interface
func (s *settableLogger) Fatal(args ...interface{}) { s.Get().Fatal(args...) }
func (s *settableLogger) Fatalf(format string, args ...interface{}) { s.Get().Fatalf(format, args...) }
func (s *settableLogger) Fatalln(args ...interface{}) { s.Get().Fatalln(args...) }
func (s *settableLogger) Print(args ...interface{}) { s.Get().Print(args...) }
func (s *settableLogger) Printf(format string, args ...interface{}) { s.Get().Printf(format, args...) }
func (s *settableLogger) Println(args ...interface{}) { s.Get().Println(args...) }

View File

@ -15,15 +15,26 @@
package clientv3
import (
"sync"
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
type (
DefragmentResponse pb.DefragmentResponse
AlarmResponse pb.AlarmResponse
AlarmMember pb.AlarmMember
)
type Maintenance interface {
// AlarmList gets all active alarms.
AlarmList(ctx context.Context) (*AlarmResponse, error)
// AlarmDisarm disarms a given alarm.
AlarmDisarm(ctx context.Context, m *AlarmMember) (*AlarmResponse, error)
// Defragment defragments storage backend of the etcd member with given endpoint.
// Defragment is only needed when deleting a large number of keys and want to reclaim
// the resources.
@ -36,6 +47,72 @@ type Maintenance interface {
type maintenance struct {
c *Client
mu sync.Mutex
conn *grpc.ClientConn // conn in-use
remote pb.MaintenanceClient
}
func NewMaintenance(c *Client) Maintenance {
conn := c.ActiveConnection()
return &maintenance{
c: c,
conn: conn,
remote: pb.NewMaintenanceClient(conn),
}
}
func (m *maintenance) AlarmList(ctx context.Context) (*AlarmResponse, error) {
req := &pb.AlarmRequest{
Action: pb.AlarmRequest_GET,
MemberID: 0, // all
Alarm: pb.AlarmType_NONE, // all
}
for {
resp, err := m.getRemote().Alarm(ctx, req)
if err == nil {
return (*AlarmResponse)(resp), nil
}
if isHalted(ctx, err) {
return nil, err
}
if err = m.switchRemote(err); err != nil {
return nil, err
}
}
}
func (m *maintenance) AlarmDisarm(ctx context.Context, am *AlarmMember) (*AlarmResponse, error) {
req := &pb.AlarmRequest{
Action: pb.AlarmRequest_DEACTIVATE,
MemberID: am.MemberID,
Alarm: am.Alarm,
}
if req.MemberID == 0 && req.Alarm == pb.AlarmType_NONE {
ar, err := m.AlarmList(ctx)
if err != nil {
return nil, err
}
ret := AlarmResponse{}
for _, am := range ar.Alarms {
dresp, derr := m.AlarmDisarm(ctx, (*AlarmMember)(am))
if derr != nil {
return nil, derr
}
ret.Alarms = append(ret.Alarms, dresp.Alarms...)
}
return &ret, nil
}
resp, err := m.getRemote().Alarm(ctx, req)
if err == nil {
return (*AlarmResponse)(resp), nil
}
if !isHalted(ctx, err) {
go m.switchRemote(err)
}
return nil, err
}
func (m *maintenance) Defragment(ctx context.Context, endpoint string) (*DefragmentResponse, error) {
@ -50,3 +127,21 @@ func (m *maintenance) Defragment(ctx context.Context, endpoint string) (*Defragm
}
return (*DefragmentResponse)(resp), nil
}
func (m *maintenance) getRemote() pb.MaintenanceClient {
m.mu.Lock()
defer m.mu.Unlock()
return m.remote
}
func (m *maintenance) switchRemote(prevErr error) error {
m.mu.Lock()
defer m.mu.Unlock()
newConn, err := m.c.retryConnection(m.conn, prevErr)
if err != nil {
return err
}
m.conn = newConn
m.remote = pb.NewMaintenanceClient(m.conn)
return nil
}

View File

@ -240,11 +240,11 @@ func (w *watcher) addStream(resp *pb.WatchResponse, pendingReq *watchRequest) {
w.streams[ws.id] = ws
w.mu.Unlock()
// send messages to subscriber
go w.serveStream(ws)
// pass back the subscriber channel for the watcher
pendingReq.retc <- ret
// send messages to subscriber
go w.serveStream(ws)
}
// closeStream closes the watcher resources and removes it
@ -436,11 +436,15 @@ func (w *watcher) serveStream(ws *watcherStream) {
// TODO don't keep buffering if subscriber stops reading
wrs = append(wrs, wr)
case resumeRev := <-ws.resumec:
wrs = nil
resuming = true
if resumeRev == -1 {
// pause serving stream while resume gets set up
break
}
if resumeRev != ws.lastRev {
panic("unexpected resume revision")
}
wrs = nil
resuming = true
case <-w.donec:
closing = true
case <-ws.initReq.ctx.Done():
@ -502,6 +506,9 @@ func (w *watcher) resumeWatchers(wc pb.Watch_WatchClient) error {
w.mu.RUnlock()
for _, ws := range streams {
// pause serveStream
ws.resumec <- -1
// reconstruct watcher from initial request
if ws.lastRev != 0 {
ws.initReq.rev = ws.lastRev
@ -525,6 +532,7 @@ func (w *watcher) resumeWatchers(wc pb.Watch_WatchClient) error {
w.streams[ws.id] = ws
w.mu.Unlock()
// unpause serveStream
ws.resumec <- ws.lastRev
}
return nil

View File

@ -25,6 +25,7 @@ var (
ErrDuplicateKey = grpc.Errorf(codes.InvalidArgument, "etcdserver: duplicate key given in txn request")
ErrCompacted = grpc.Errorf(codes.OutOfRange, "etcdserver: storage: required revision has been compacted")
ErrFutureRev = grpc.Errorf(codes.OutOfRange, "etcdserver: storage: required revision is a future revision")
ErrNoSpace = grpc.Errorf(codes.ResourceExhausted, "etcdserver: storage: database space exceeded")
ErrLeaseNotFound = grpc.Errorf(codes.NotFound, "etcdserver: requested lease not found")
ErrLeaseExist = grpc.Errorf(codes.FailedPrecondition, "etcdserver: lease already exists")

View File

@ -52,34 +52,37 @@
MemberListResponse
DefragmentRequest
DefragmentResponse
AlarmRequest
AlarmMember
AlarmResponse
AuthEnableRequest
AuthDisableRequest
AuthenticateRequest
UserAddRequest
UserGetRequest
UserDeleteRequest
UserChangePasswordRequest
UserGrantRequest
UserRevokeRequest
RoleAddRequest
RoleGetRequest
RoleDeleteRequest
RoleGrantRequest
RoleRevokeRequest
AuthUserAddRequest
AuthUserGetRequest
AuthUserDeleteRequest
AuthUserChangePasswordRequest
AuthUserGrantRequest
AuthUserRevokeRequest
AuthRoleAddRequest
AuthRoleGetRequest
AuthRoleDeleteRequest
AuthRoleGrantRequest
AuthRoleRevokeRequest
AuthEnableResponse
AuthDisableResponse
AuthenticateResponse
UserAddResponse
UserGetResponse
UserDeleteResponse
UserChangePasswordResponse
UserGrantResponse
UserRevokeResponse
RoleAddResponse
RoleGetResponse
RoleDeleteResponse
RoleGrantResponse
RoleRevokeResponse
AuthUserAddResponse
AuthUserGetResponse
AuthUserDeleteResponse
AuthUserChangePasswordResponse
AuthUserGrantResponse
AuthUserRevokeResponse
AuthRoleAddResponse
AuthRoleGetResponse
AuthRoleDeleteResponse
AuthRoleGrantResponse
AuthRoleRevokeResponse
*/
package etcdserverpb

View File

@ -32,7 +32,8 @@ type InternalRaftRequest struct {
LeaseCreate *LeaseCreateRequest `protobuf:"bytes,8,opt,name=lease_create" json:"lease_create,omitempty"`
LeaseRevoke *LeaseRevokeRequest `protobuf:"bytes,9,opt,name=lease_revoke" json:"lease_revoke,omitempty"`
AuthEnable *AuthEnableRequest `protobuf:"bytes,10,opt,name=auth_enable" json:"auth_enable,omitempty"`
UserAdd *UserAddRequest `protobuf:"bytes,11,opt,name=user_add" json:"user_add,omitempty"`
AuthUserAdd *AuthUserAddRequest `protobuf:"bytes,11,opt,name=auth_user_add" json:"auth_user_add,omitempty"`
Alarm *AlarmRequest `protobuf:"bytes,12,opt,name=alarm" json:"alarm,omitempty"`
}
func (m *InternalRaftRequest) Reset() { *m = InternalRaftRequest{} }
@ -160,16 +161,26 @@ func (m *InternalRaftRequest) MarshalTo(data []byte) (int, error) {
}
i += n9
}
if m.UserAdd != nil {
if m.AuthUserAdd != nil {
data[i] = 0x5a
i++
i = encodeVarintRaftInternal(data, i, uint64(m.UserAdd.Size()))
n10, err := m.UserAdd.MarshalTo(data[i:])
i = encodeVarintRaftInternal(data, i, uint64(m.AuthUserAdd.Size()))
n10, err := m.AuthUserAdd.MarshalTo(data[i:])
if err != nil {
return 0, err
}
i += n10
}
if m.Alarm != nil {
data[i] = 0x62
i++
i = encodeVarintRaftInternal(data, i, uint64(m.Alarm.Size()))
n11, err := m.Alarm.MarshalTo(data[i:])
if err != nil {
return 0, err
}
i += n11
}
return i, nil
}
@ -260,8 +271,12 @@ func (m *InternalRaftRequest) Size() (n int) {
l = m.AuthEnable.Size()
n += 1 + l + sovRaftInternal(uint64(l))
}
if m.UserAdd != nil {
l = m.UserAdd.Size()
if m.AuthUserAdd != nil {
l = m.AuthUserAdd.Size()
n += 1 + l + sovRaftInternal(uint64(l))
}
if m.Alarm != nil {
l = m.Alarm.Size()
n += 1 + l + sovRaftInternal(uint64(l))
}
return n
@ -633,7 +648,7 @@ func (m *InternalRaftRequest) Unmarshal(data []byte) error {
iNdEx = postIndex
case 11:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field UserAdd", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field AuthUserAdd", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@ -657,10 +672,43 @@ func (m *InternalRaftRequest) Unmarshal(data []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.UserAdd == nil {
m.UserAdd = &UserAddRequest{}
if m.AuthUserAdd == nil {
m.AuthUserAdd = &AuthUserAddRequest{}
}
if err := m.UserAdd.Unmarshal(data[iNdEx:postIndex]); err != nil {
if err := m.AuthUserAdd.Unmarshal(data[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 12:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Alarm", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRaftInternal
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := data[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthRaftInternal
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Alarm == nil {
m.Alarm = &AlarmRequest{}
}
if err := m.Alarm.Unmarshal(data[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex

View File

@ -26,7 +26,9 @@ message InternalRaftRequest {
LeaseRevokeRequest lease_revoke = 9;
AuthEnableRequest auth_enable = 10;
UserAddRequest user_add = 11;
AuthUserAddRequest auth_user_add = 11;
AlarmRequest alarm = 12;
}
message EmptyResponse {

File diff suppressed because it is too large Load Diff

View File

@ -30,11 +30,6 @@ service KV {
// Compact compacts the event history in etcd. User should compact the
// event history periodically, or it will grow infinitely.
rpc Compact(CompactionRequest) returns (CompactionResponse) {}
// Hash returns the hash of local KV state for consistency checking purpose.
// This is designed for testing purpose. Do not use this in production when there
// are ongoing transactions.
rpc Hash(HashRequest) returns (HashResponse) {}
}
service Watch {
@ -77,8 +72,15 @@ service Cluster {
}
service Maintenance {
// TODO: move Hash from kv to Maintenance
// Alarm activates, deactivates, and queries alarms regarding cluster health.
rpc Alarm(AlarmRequest) returns (AlarmResponse) {}
rpc Defragment(DefragmentRequest) returns (DefragmentResponse) {}
// Hash returns the hash of the local KV state for consistency checking purpose.
// This is designed for testing; do not use this in production when there
// are ongoing transactions.
rpc Hash(HashRequest) returns (HashResponse) {}
}
service Auth {
@ -92,37 +94,37 @@ service Auth {
rpc Authenticate(AuthenticateRequest) returns (AuthenticateResponse) {}
// UserAdd adds a new user.
rpc UserAdd(UserAddRequest) returns (UserAddResponse) {}
rpc UserAdd(AuthUserAddRequest) returns (AuthUserAddResponse) {}
// UserGet gets a detailed information of a user or lists entire users.
rpc UserGet(UserGetRequest) returns (UserGetResponse) {}
rpc UserGet(AuthUserGetRequest) returns (AuthUserGetResponse) {}
// UserDelete deletes a specified user.
rpc UserDelete(UserDeleteRequest) returns (UserDeleteResponse) {}
rpc UserDelete(AuthUserDeleteRequest) returns (AuthUserDeleteResponse) {}
// UserChangePassword changes password of a specified user.
rpc UserChangePassword(UserChangePasswordRequest) returns (UserChangePasswordResponse) {}
rpc UserChangePassword(AuthUserChangePasswordRequest) returns (AuthUserChangePasswordResponse) {}
// UserGrant grants a role to a specified user.
rpc UserGrant(UserGrantRequest) returns (UserGrantResponse) {}
rpc UserGrant(AuthUserGrantRequest) returns (AuthUserGrantResponse) {}
// UserRevoke revokes a role of specified user.
rpc UserRevoke(UserRevokeRequest) returns (UserRevokeResponse) {}
rpc UserRevoke(AuthUserRevokeRequest) returns (AuthUserRevokeResponse) {}
// RoleAdd adds a new role.
rpc RoleAdd(RoleAddRequest) returns (RoleAddResponse) {}
rpc RoleAdd(AuthRoleAddRequest) returns (AuthRoleAddResponse) {}
// RoleGet gets a detailed information of a role or lists entire roles.
rpc RoleGet(RoleGetRequest) returns (RoleGetResponse) {}
rpc RoleGet(AuthRoleGetRequest) returns (AuthRoleGetResponse) {}
// RoleDelete deletes a specified role.
rpc RoleDelete(RoleDeleteRequest) returns (RoleDeleteResponse) {}
rpc RoleDelete(AuthRoleDeleteRequest) returns (AuthRoleDeleteResponse) {}
// RoleGrant grants a permission of a specified key or range to a specified role.
rpc RoleGrant(RoleGrantRequest) returns (RoleGrantResponse) {}
rpc RoleGrant(AuthRoleGrantRequest) returns (AuthRoleGrantResponse) {}
// RoleRevoke revokes a key or range permission of a specified role.
rpc RoleRevoke(RoleRevokeRequest) returns (RoleRevokeResponse) {}
rpc RoleRevoke(AuthRoleRevokeRequest) returns (AuthRoleRevokeResponse) {}
}
message ResponseHeader {
@ -287,6 +289,10 @@ message TxnResponse {
// revision.
message CompactionRequest {
int64 revision = 1;
// physical is set so the RPC will wait until the compaction is physically
// applied to the local database such that compacted entries are totally
// removed from the backing store.
bool physical = 2;
}
message CompactionResponse {
@ -438,6 +444,33 @@ message DefragmentResponse {
ResponseHeader header = 1;
}
enum AlarmType {
NONE = 0; // default, used to query if any alarm is active
NOSPACE = 1;
}
message AlarmRequest {
enum AlarmAction {
GET = 0;
ACTIVATE = 1;
DEACTIVATE = 2;
}
AlarmAction action = 1;
// MemberID is the member raising the alarm request
uint64 memberID = 2;
AlarmType alarm = 3;
}
message AlarmMember {
uint64 memberID = 1;
AlarmType alarm = 2;
}
message AlarmResponse {
ResponseHeader header = 1;
repeated AlarmMember alarms = 2;
}
message AuthEnableRequest {
}
@ -447,39 +480,39 @@ message AuthDisableRequest {
message AuthenticateRequest {
}
message UserAddRequest {
message AuthUserAddRequest {
string name = 1;
string password = 2;
}
message UserGetRequest {
message AuthUserGetRequest {
}
message UserDeleteRequest {
message AuthUserDeleteRequest {
}
message UserChangePasswordRequest {
message AuthUserChangePasswordRequest {
}
message UserGrantRequest {
message AuthUserGrantRequest {
}
message UserRevokeRequest {
message AuthUserRevokeRequest {
}
message RoleAddRequest {
message AuthRoleAddRequest {
}
message RoleGetRequest {
message AuthRoleGetRequest {
}
message RoleDeleteRequest {
message AuthRoleDeleteRequest {
}
message RoleGrantRequest {
message AuthRoleGrantRequest {
}
message RoleRevokeRequest {
message AuthRoleRevokeRequest {
}
message AuthEnableResponse {
@ -494,46 +527,46 @@ message AuthenticateResponse {
ResponseHeader header = 1;
}
message UserAddResponse {
message AuthUserAddResponse {
ResponseHeader header = 1;
}
message UserGetResponse {
message AuthUserGetResponse {
ResponseHeader header = 1;
}
message UserDeleteResponse {
message AuthUserDeleteResponse {
ResponseHeader header = 1;
}
message UserChangePasswordResponse {
message AuthUserChangePasswordResponse {
ResponseHeader header = 1;
}
message UserGrantResponse {
message AuthUserGrantResponse {
ResponseHeader header = 1;
}
message UserRevokeResponse {
message AuthUserRevokeResponse {
ResponseHeader header = 1;
}
message RoleAddResponse {
message AuthRoleAddResponse {
ResponseHeader header = 1;
}
message RoleGetResponse {
message AuthRoleGetResponse {
ResponseHeader header = 1;
}
message RoleDeleteResponse {
message AuthRoleDeleteResponse {
ResponseHeader header = 1;
}
message RoleGrantResponse {
message AuthRoleGrantResponse {
ResponseHeader header = 1;
}
message RoleRevokeResponse {
message AuthRoleRevokeResponse {
ResponseHeader header = 1;
}