Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit946a3ac

Browse files
committed
chore: implement assign organization roles from the cli
Basic functionality to assign roles to an organization member via cli.
1 parentc587af7 commit946a3ac

File tree

3 files changed

+119
-5
lines changed

3 files changed

+119
-5
lines changed

‎cli/organizationmembers.go

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli
22

33
import (
44
"fmt"
5+
"strings"
56

67
"golang.org/x/xerrors"
78

@@ -11,16 +12,75 @@ import (
1112
)
1213

1314
func (r*RootCmd)organizationMembers()*serpent.Command {
15+
cmd:=&serpent.Command{
16+
Use:"members",
17+
Aliases: []string{"member"},
18+
Short:"Manage organization members",
19+
Children: []*serpent.Command{
20+
r.listOrganizationMembers(),
21+
r.assignOrganizationRoles(),
22+
},
23+
Handler:func(inv*serpent.Invocation)error {
24+
returninv.Command.HelpHandler(inv)
25+
},
26+
}
27+
28+
returncmd
29+
}
30+
31+
func (r*RootCmd)assignOrganizationRoles()*serpent.Command {
32+
client:=new(codersdk.Client)
33+
34+
cmd:=&serpent.Command{
35+
Use:"edit-roles <username | user_id> [roles...]",
36+
Aliases: []string{"edit-role"},
37+
Short:"Edit organization member's roles",
38+
Middleware:serpent.Chain(
39+
r.InitClient(client),
40+
),
41+
Handler:func(inv*serpent.Invocation)error {
42+
ctx:=inv.Context()
43+
organization,err:=CurrentOrganization(r,inv,client)
44+
iferr!=nil {
45+
returnerr
46+
}
47+
48+
iflen(inv.Args)<1 {
49+
returnxerrors.Errorf("user_id or username is required as the first argument")
50+
}
51+
userIdentifier:=inv.Args[0]
52+
roles:=inv.Args[1:]
53+
54+
member,err:=client.UpdateOrganizationMemberRoles(ctx,organization.ID,userIdentifier, codersdk.UpdateRoles{
55+
Roles:roles,
56+
})
57+
iferr!=nil {
58+
returnxerrors.Errorf("update member roles: %w",err)
59+
}
60+
61+
updatedTo:=make([]string,0)
62+
for_,role:=rangemember.Roles {
63+
updatedTo=append(updatedTo,role.String())
64+
}
65+
66+
_,_=fmt.Fprintf(inv.Stdout,"Member roles updated to [%s]\n",strings.Join(updatedTo,", "))
67+
returnnil
68+
},
69+
}
70+
71+
returncmd
72+
}
73+
74+
func (r*RootCmd)listOrganizationMembers()*serpent.Command {
1475
formatter:=cliui.NewOutputFormatter(
1576
cliui.TableFormat([]codersdk.OrganizationMemberWithName{}, []string{"username","organization_roles"}),
1677
cliui.JSONFormat(),
1778
)
1879

1980
client:=new(codersdk.Client)
2081
cmd:=&serpent.Command{
21-
Use:"members",
22-
Short:"List all organization members",
23-
Aliases: []string{"member"},
82+
Use:"list",
83+
Short:"List all organization members",
2484
Middleware:serpent.Chain(
2585
serpent.RequireNArgs(0),
2686
r.InitClient(client),

‎cli/organizationmembers_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func TestListOrganizationMembers(t *testing.T) {
2323
client,user:=coderdtest.CreateAnotherUser(t,ownerClient,owner.OrganizationID,rbac.RoleUserAdmin())
2424

2525
ctx:=testutil.Context(t,testutil.WaitMedium)
26-
inv,root:=clitest.New(t,"organization","members","-c","user_id,username,roles")
26+
inv,root:=clitest.New(t,"organization","members","list","-c","user_id,username,roles")
2727
clitest.SetupConfig(t,client,root)
2828

2929
buf:=new(bytes.Buffer)

‎enterprise/cli/organizationmembers_test.go

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func TestEnterpriseListOrganizationMembers(t *testing.T) {
5353
OrganizationID:owner.OrganizationID,
5454
},rbac.ScopedRoleOrgAdmin(owner.OrganizationID))
5555

56-
inv,root:=clitest.New(t,"organization","members","-c","user_id,username,organization_roles")
56+
inv,root:=clitest.New(t,"organization","members","list","-c","user_id,username,organization_roles")
5757
clitest.SetupConfig(t,client,root)
5858

5959
buf:=new(bytes.Buffer)
@@ -66,3 +66,57 @@ func TestEnterpriseListOrganizationMembers(t *testing.T) {
6666
require.Contains(t,buf.String(),customRole.DisplayName)
6767
})
6868
}
69+
70+
funcTestAssignOrganizationMemberRole(t*testing.T) {
71+
t.Parallel()
72+
73+
t.Run("OK",func(t*testing.T) {
74+
t.Parallel()
75+
dv:=coderdtest.DeploymentValues(t)
76+
dv.Experiments= []string{string(codersdk.ExperimentCustomRoles)}
77+
78+
ownerClient,owner:=coderdenttest.New(t,&coderdenttest.Options{
79+
Options:&coderdtest.Options{
80+
DeploymentValues:dv,
81+
},
82+
LicenseOptions:&coderdenttest.LicenseOptions{
83+
Features: license.Features{
84+
codersdk.FeatureCustomRoles:1,
85+
},
86+
},
87+
})
88+
_,user:=coderdtest.CreateAnotherUser(t,ownerClient,owner.OrganizationID,rbac.RoleUserAdmin())
89+
90+
ctx:=testutil.Context(t,testutil.WaitMedium)
91+
// nolint:gocritic // requires owner role to create
92+
customRole,err:=ownerClient.PatchOrganizationRole(ctx,owner.OrganizationID, codersdk.Role{
93+
Name:"custom-role",
94+
OrganizationID:owner.OrganizationID.String(),
95+
DisplayName:"Custom Role",
96+
SitePermissions:nil,
97+
OrganizationPermissions:codersdk.CreatePermissions(map[codersdk.RBACResource][]codersdk.RBACAction{
98+
codersdk.ResourceWorkspace: {codersdk.ActionRead},
99+
}),
100+
UserPermissions:nil,
101+
})
102+
require.NoError(t,err)
103+
104+
inv,root:=clitest.New(t,"organization","members","edit-roles",user.Username,codersdk.RoleOrganizationAdmin,customRole.Name)
105+
// nolint:gocritic // you cannot change your own roles
106+
clitest.SetupConfig(t,ownerClient,root)
107+
108+
buf:=new(bytes.Buffer)
109+
inv.Stdout=buf
110+
err=inv.WithContext(ctx).Run()
111+
require.NoError(t,err)
112+
require.Contains(t,buf.String(),must(rbac.RoleByName(rbac.ScopedRoleOrgAdmin(owner.OrganizationID))).DisplayName)
113+
require.Contains(t,buf.String(),customRole.DisplayName)
114+
})
115+
}
116+
117+
funcmust[Vany](vV,errerror)V {
118+
iferr!=nil {
119+
panic(err)
120+
}
121+
returnv
122+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp