From 2a0d64bb4ae59ebb6a6802f02f9e6deec4765bdd Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Sat, 5 Mar 2016 10:10:31 -0800 Subject: [PATCH] client: correctly unmarshal users in ListUsers --- client/auth_user.go | 15 +++++++++++++-- e2e/etcdctl_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/client/auth_user.go b/client/auth_user.go index dda60a4e4..1566ba1e0 100644 --- a/client/auth_user.go +++ b/client/auth_user.go @@ -41,6 +41,10 @@ type UserRoles struct { Roles []Role `json:"roles"` } +type userName struct { + User string `json:"user"` +} + func v2AuthURL(ep url.URL, action string, name string) *url.URL { if name != "" { ep.Path = path.Join(ep.Path, defaultV2AuthPrefix, action, name) @@ -192,13 +196,20 @@ func (u *httpAuthUserAPI) ListUsers(ctx context.Context) ([]string, error) { } return nil, sec } + var userList struct { - Users []string `json:"users"` + Users []User `json:"users"` } + if err = json.Unmarshal(body, &userList); err != nil { return nil, err } - return userList.Users, nil + + ret := make([]string, 0, len(userList.Users)) + for _, u := range userList.Users { + ret = append(ret, u.User) + } + return ret, nil } func (u *httpAuthUserAPI) AddUser(ctx context.Context, username string, password string) error { diff --git a/e2e/etcdctl_test.go b/e2e/etcdctl_test.go index 466370b31..a90f84ba0 100644 --- a/e2e/etcdctl_test.go +++ b/e2e/etcdctl_test.go @@ -214,6 +214,29 @@ func testCtlV2GetRoleUser(t *testing.T, cfg *etcdProcessClusterConfig) { } } +func TestCtlV2UserList(t *testing.T) { + defer testutil.AfterTest(t) + + mustEtcdctl(t) + + epc, cerr := newEtcdProcessCluster(&defaultConfigWithProxy) + if cerr != nil { + t.Fatalf("could not start etcd process cluster (%v)", cerr) + } + defer func() { + if err := epc.Close(); err != nil { + t.Fatalf("error closing etcd processes (%v)", err) + } + }() + + if err := etcdctlUserAdd(epc, "username", "password"); err != nil { + t.Fatalf("failed to add user (%v)", err) + } + if err := etcdctlUserList(epc, "username"); err != nil { + t.Fatalf("failed to list users (%v)", err) + } +} + func etcdctlPrefixArgs(clus *etcdProcessCluster, noSync bool) []string { endpoints := "" if proxies := clus.proxies(); len(proxies) != 0 { @@ -295,6 +318,11 @@ func etcdctlUserGet(clus *etcdProcessCluster, user string) error { return spawnWithExpectedString(cmdArgs, "User: "+user) } +func etcdctlUserList(clus *etcdProcessCluster, expectedUser string) error { + cmdArgs := append(etcdctlPrefixArgs(clus, false), "user", "list") + return spawnWithExpectedString(cmdArgs, expectedUser) +} + func mustEtcdctl(t *testing.T) { if !fileutil.Exist("../bin/etcdctl") { t.Fatalf("could not find etcdctl binary")