diff --git a/pkg/ctl/tenant/update.go b/pkg/ctl/tenant/update.go index 068fe9216..15a98e872 100644 --- a/pkg/ctl/tenant/update.go +++ b/pkg/ctl/tenant/update.go @@ -106,7 +106,29 @@ func doUpdateTenant(vc *cmdutils.VerbCmd, data *utils.TenantData) error { data.Name = vc.NameArg admin := cmdutils.NewPulsarClient() - err := admin.Tenants().Update(*data) + tenantClient := admin.Tenants() + + flags := vc.Command.Flags() + adminRolesFlag := flags.Lookup("admin-roles") + allowedClustersFlag := flags.Lookup("allowed-clusters") + + adminRolesChanged := adminRolesFlag != nil && adminRolesFlag.Changed + allowedClustersChanged := allowedClustersFlag != nil && allowedClustersFlag.Changed + + if !adminRolesChanged || !allowedClustersChanged { + current, err := tenantClient.Get(data.Name) + if err != nil { + return err + } + if !adminRolesChanged { + data.AdminRoles = current.AdminRoles + } + if !allowedClustersChanged { + data.AllowedClusters = current.AllowedClusters + } + } + + err := tenantClient.Update(*data) if err == nil { vc.Command.Printf("Update tenant %s successfully\n", data.Name) } diff --git a/pkg/ctl/tenant/update_test.go b/pkg/ctl/tenant/update_test.go index 50e398c9b..e02034887 100644 --- a/pkg/ctl/tenant/update_test.go +++ b/pkg/ctl/tenant/update_test.go @@ -63,6 +63,49 @@ func TestUpdateTenantCmd(t *testing.T) { assert.Equal(t, "standalone", tenantData.AllowedClusters[0]) } +func TestUpdateTenantPartial(t *testing.T) { + args := []string{"create", "--admin-roles", "initial-role", "--allowed-clusters", "standalone", "update-tenant-partial"} + _, execErr, _, _ := TestTenantCommands(createTenantCmd, args) + assert.Nil(t, execErr) + + args = []string{"update", "--allowed-clusters", "standalone", "update-tenant-partial"} + _, execErr, _, _ = TestTenantCommands(UpdateTenantCmd, args) + assert.Nil(t, execErr) + + args = []string{"get", "update-tenant-partial"} + out, execErr, _, _ := TestTenantCommands(getTenantCmd, args) + assert.Nil(t, execErr) + + var tenantData utils.TenantData + err := json.Unmarshal(out.Bytes(), &tenantData) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, 1, len(tenantData.AdminRoles)) + assert.Equal(t, "initial-role", tenantData.AdminRoles[0]) + assert.Equal(t, 1, len(tenantData.AllowedClusters)) + assert.Equal(t, "standalone", tenantData.AllowedClusters[0]) + + args = []string{"update", "--admin-roles", "updated-role", "update-tenant-partial"} + _, execErr, _, _ = TestTenantCommands(UpdateTenantCmd, args) + assert.Nil(t, execErr) + + args = []string{"get", "update-tenant-partial"} + out, execErr, _, _ = TestTenantCommands(getTenantCmd, args) + assert.Nil(t, execErr) + + err = json.Unmarshal(out.Bytes(), &tenantData) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, 1, len(tenantData.AdminRoles)) + assert.Equal(t, "updated-role", tenantData.AdminRoles[0]) + assert.Equal(t, 1, len(tenantData.AllowedClusters)) + assert.Equal(t, "standalone", tenantData.AllowedClusters[0]) +} + func TestUpdateArgsError(t *testing.T) { args := []string{"update"} _, _, nameErr, _ := TestTenantCommands(UpdateTenantCmd, args)