Browse Source

client: correctly unmarshal roles in ListRoles

Anthony Romano 9 years ago
parent
commit
9809da95da
2 changed files with 38 additions and 6 deletions
  1. 8 4
      client/auth_role.go
  2. 30 2
      e2e/etcdctl_test.go

+ 8 - 4
client/auth_role.go

@@ -118,13 +118,17 @@ func (r *httpAuthRoleAPI) ListRoles(ctx context.Context) ([]string, error) {
 	if err = assertStatusCode(resp.StatusCode, http.StatusOK); err != nil {
 	if err = assertStatusCode(resp.StatusCode, http.StatusOK); err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-	var userList struct {
-		Roles []string `json:"roles"`
+	var roleList struct {
+		Roles []Role `json:"roles"`
 	}
 	}
-	if err = json.Unmarshal(body, &userList); err != nil {
+	if err = json.Unmarshal(body, &roleList); err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-	return userList.Roles, nil
+	ret := make([]string, 0, len(roleList.Roles))
+	for _, r := range roleList.Roles {
+		ret = append(ret, r.Role)
+	}
+	return ret, nil
 }
 }
 
 
 func (r *httpAuthRoleAPI) AddRole(ctx context.Context, rolename string) error {
 func (r *httpAuthRoleAPI) AddRole(ctx context.Context, rolename string) error {

+ 30 - 2
e2e/etcdctl_test.go

@@ -200,7 +200,7 @@ func testCtlV2GetRoleUser(t *testing.T, cfg *etcdProcessClusterConfig) {
 	// the update loop has a delay of 500ms, so 1s should be enough wait time
 	// the update loop has a delay of 500ms, so 1s should be enough wait time
 	time.Sleep(time.Second)
 	time.Sleep(time.Second)
 
 
-	if err := etcdctlAddRole(epc, "foo"); err != nil {
+	if err := etcdctlRoleAdd(epc, "foo"); err != nil {
 		t.Fatalf("failed to add role (%v)", err)
 		t.Fatalf("failed to add role (%v)", err)
 	}
 	}
 	if err := etcdctlUserAdd(epc, "username", "password"); err != nil {
 	if err := etcdctlUserAdd(epc, "username", "password"); err != nil {
@@ -237,6 +237,29 @@ func TestCtlV2UserList(t *testing.T) {
 	}
 	}
 }
 }
 
 
+func TestCtlV2RoleList(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 := etcdctlRoleAdd(epc, "foo"); err != nil {
+		t.Fatalf("failed to add role (%v)", err)
+	}
+	if err := etcdctlRoleList(epc, "foo"); err != nil {
+		t.Fatalf("failed to list roles (%v)", err)
+	}
+}
+
 func etcdctlPrefixArgs(clus *etcdProcessCluster, noSync bool) []string {
 func etcdctlPrefixArgs(clus *etcdProcessCluster, noSync bool) []string {
 	endpoints := ""
 	endpoints := ""
 	if proxies := clus.proxies(); len(proxies) != 0 {
 	if proxies := clus.proxies(); len(proxies) != 0 {
@@ -298,11 +321,16 @@ func etcdctlWatch(clus *etcdProcessCluster, key, value string, noSync bool) <-ch
 	return errc
 	return errc
 }
 }
 
 
-func etcdctlAddRole(clus *etcdProcessCluster, role string) error {
+func etcdctlRoleAdd(clus *etcdProcessCluster, role string) error {
 	cmdArgs := append(etcdctlPrefixArgs(clus, false), "role", "add", role)
 	cmdArgs := append(etcdctlPrefixArgs(clus, false), "role", "add", role)
 	return spawnWithExpectedString(cmdArgs, role)
 	return spawnWithExpectedString(cmdArgs, role)
 }
 }
 
 
+func etcdctlRoleList(clus *etcdProcessCluster, expectedRole string) error {
+	cmdArgs := append(etcdctlPrefixArgs(clus, false), "role", "list")
+	return spawnWithExpectedString(cmdArgs, expectedRole)
+}
+
 func etcdctlUserAdd(clus *etcdProcessCluster, user, pass string) error {
 func etcdctlUserAdd(clus *etcdProcessCluster, user, pass string) error {
 	cmdArgs := append(etcdctlPrefixArgs(clus, false), "user", "add", user+":"+pass)
 	cmdArgs := append(etcdctlPrefixArgs(clus, false), "user", "add", user+":"+pass)
 	return spawnWithExpectedString(cmdArgs, "User "+user+" created")
 	return spawnWithExpectedString(cmdArgs, "User "+user+" created")