From 7f27697df986e695a99076471db97ca7eb644724 Mon Sep 17 00:00:00 2001 From: Jan Kuri Date: Tue, 21 Jul 2020 01:53:25 +0200 Subject: [PATCH] v3client: implement clientv3.Auth interface (#12140) --- clientv3/auth.go | 8 ++++ embed/auth_test.go | 58 +++++++++++++++++++++++++++++ etcdserver/api/v3client/v3client.go | 3 +- 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 embed/auth_test.go diff --git a/clientv3/auth.go b/clientv3/auth.go index ad97410ee..d6c2d3a3d 100644 --- a/clientv3/auth.go +++ b/clientv3/auth.go @@ -121,6 +121,14 @@ func NewAuth(c *Client) Auth { return api } +func NewAuthFromAuthClient(remote pb.AuthClient, c *Client) Auth { + api := &authClient{remote: remote} + if c != nil { + api.callOpts = c.callOpts + } + return api +} + func (auth *authClient) AuthEnable(ctx context.Context) (*AuthEnableResponse, error) { resp, err := auth.remote.AuthEnable(ctx, &pb.AuthEnableRequest{}, auth.callOpts...) return (*AuthEnableResponse)(resp), toErr(ctx, err) diff --git a/embed/auth_test.go b/embed/auth_test.go new file mode 100644 index 000000000..a96c585f8 --- /dev/null +++ b/embed/auth_test.go @@ -0,0 +1,58 @@ +// Copyright 2020 The etcd Authors +// +// 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 embed + +import ( + "context" + "io/ioutil" + "os" + "testing" + + "go.etcd.io/etcd/v3/etcdserver/api/v3client" +) + +func TestEnableAuth(t *testing.T) { + tdir, err := ioutil.TempDir(os.TempDir(), "auth-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tdir) + cfg := NewConfig() + cfg.Dir = tdir + e, err := StartEtcd(cfg) + if err != nil { + t.Fatal(err) + } + defer e.Close() + client := v3client.New(e.Server) + defer client.Close() + + _, err = client.RoleAdd(context.TODO(), "root") + if err != nil { + t.Fatal(err) + } + _, err = client.UserAdd(context.TODO(), "root", "root") + if err != nil { + t.Fatal(err) + } + _, err = client.UserGrantRole(context.TODO(), "root", "root") + if err != nil { + t.Fatal(err) + } + _, err = client.AuthEnable(context.TODO()) + if err != nil { + t.Fatal(err) + } +} diff --git a/etcdserver/api/v3client/v3client.go b/etcdserver/api/v3client/v3client.go index f93474fe7..5a8107b9f 100644 --- a/etcdserver/api/v3client/v3client.go +++ b/etcdserver/api/v3client/v3client.go @@ -49,7 +49,8 @@ func New(s *etcdserver.EtcdServer) *clientv3.Client { clc := adapter.ClusterServerToClusterClient(v3rpc.NewClusterServer(s)) c.Cluster = clientv3.NewClusterFromClusterClient(clc, c) - // TODO: implement clientv3.Auth interface? + a := adapter.AuthServerToAuthClient(v3rpc.NewAuthServer(s)) + c.Auth = clientv3.NewAuthFromAuthClient(a, c) return c }