Skip to content

Commit b60d003

Browse files
authored
Preserve tenant fields on partial update (#1875)
1 parent 221b73c commit b60d003

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

pkg/ctl/tenant/update.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,29 @@ func doUpdateTenant(vc *cmdutils.VerbCmd, data *utils.TenantData) error {
106106

107107
data.Name = vc.NameArg
108108
admin := cmdutils.NewPulsarClient()
109-
err := admin.Tenants().Update(*data)
109+
tenantClient := admin.Tenants()
110+
111+
flags := vc.Command.Flags()
112+
adminRolesFlag := flags.Lookup("admin-roles")
113+
allowedClustersFlag := flags.Lookup("allowed-clusters")
114+
115+
adminRolesChanged := adminRolesFlag != nil && adminRolesFlag.Changed
116+
allowedClustersChanged := allowedClustersFlag != nil && allowedClustersFlag.Changed
117+
118+
if !adminRolesChanged || !allowedClustersChanged {
119+
current, err := tenantClient.Get(data.Name)
120+
if err != nil {
121+
return err
122+
}
123+
if !adminRolesChanged {
124+
data.AdminRoles = current.AdminRoles
125+
}
126+
if !allowedClustersChanged {
127+
data.AllowedClusters = current.AllowedClusters
128+
}
129+
}
130+
131+
err := tenantClient.Update(*data)
110132
if err == nil {
111133
vc.Command.Printf("Update tenant %s successfully\n", data.Name)
112134
}

pkg/ctl/tenant/update_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,49 @@ func TestUpdateTenantCmd(t *testing.T) {
6363
assert.Equal(t, "standalone", tenantData.AllowedClusters[0])
6464
}
6565

66+
func TestUpdateTenantPartial(t *testing.T) {
67+
args := []string{"create", "--admin-roles", "initial-role", "--allowed-clusters", "standalone", "update-tenant-partial"}
68+
_, execErr, _, _ := TestTenantCommands(createTenantCmd, args)
69+
assert.Nil(t, execErr)
70+
71+
args = []string{"update", "--allowed-clusters", "standalone", "update-tenant-partial"}
72+
_, execErr, _, _ = TestTenantCommands(UpdateTenantCmd, args)
73+
assert.Nil(t, execErr)
74+
75+
args = []string{"get", "update-tenant-partial"}
76+
out, execErr, _, _ := TestTenantCommands(getTenantCmd, args)
77+
assert.Nil(t, execErr)
78+
79+
var tenantData utils.TenantData
80+
err := json.Unmarshal(out.Bytes(), &tenantData)
81+
if err != nil {
82+
t.Fatal(err)
83+
}
84+
85+
assert.Equal(t, 1, len(tenantData.AdminRoles))
86+
assert.Equal(t, "initial-role", tenantData.AdminRoles[0])
87+
assert.Equal(t, 1, len(tenantData.AllowedClusters))
88+
assert.Equal(t, "standalone", tenantData.AllowedClusters[0])
89+
90+
args = []string{"update", "--admin-roles", "updated-role", "update-tenant-partial"}
91+
_, execErr, _, _ = TestTenantCommands(UpdateTenantCmd, args)
92+
assert.Nil(t, execErr)
93+
94+
args = []string{"get", "update-tenant-partial"}
95+
out, execErr, _, _ = TestTenantCommands(getTenantCmd, args)
96+
assert.Nil(t, execErr)
97+
98+
err = json.Unmarshal(out.Bytes(), &tenantData)
99+
if err != nil {
100+
t.Fatal(err)
101+
}
102+
103+
assert.Equal(t, 1, len(tenantData.AdminRoles))
104+
assert.Equal(t, "updated-role", tenantData.AdminRoles[0])
105+
assert.Equal(t, 1, len(tenantData.AllowedClusters))
106+
assert.Equal(t, "standalone", tenantData.AllowedClusters[0])
107+
}
108+
66109
func TestUpdateArgsError(t *testing.T) {
67110
args := []string{"update"}
68111
_, _, nameErr, _ := TestTenantCommands(UpdateTenantCmd, args)

0 commit comments

Comments
 (0)