Remove duplicate policies when creating/updating identity groups (#15055)
* Remove duplicate policies for identity groups * adding changelog * test cleanup
This commit is contained in:
parent
23e67be230
commit
b14dc0d95d
|
@ -0,0 +1,3 @@
|
||||||
|
```release-note:bug
|
||||||
|
identity: deduplicate policies when creating/updating identity groups
|
||||||
|
```
|
|
@ -774,6 +774,94 @@ func TestIdentityStore_GroupsCreateUpdate(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIdentityStore_GroupsCreateUpdateDuplicatePolicy(t *testing.T) {
|
||||||
|
var resp *logical.Response
|
||||||
|
var err error
|
||||||
|
|
||||||
|
ctx := namespace.RootContext(nil)
|
||||||
|
is, _, _ := testIdentityStoreWithGithubAuth(ctx, t)
|
||||||
|
|
||||||
|
// Create a group with the above created 2 entities as its members
|
||||||
|
groupData := map[string]interface{}{
|
||||||
|
"policies": []string{"testpolicy1", "testpolicy2"},
|
||||||
|
"metadata": []string{"testkey1=testvalue1", "testkey2=testvalue2"},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a group and get its ID
|
||||||
|
groupReq := &logical.Request{
|
||||||
|
Operation: logical.UpdateOperation,
|
||||||
|
Path: "group",
|
||||||
|
Data: groupData,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a group with the above 2 groups as its members
|
||||||
|
resp, err = is.HandleRequest(ctx, groupReq)
|
||||||
|
if err != nil || (resp != nil && resp.IsError()) {
|
||||||
|
t.Fatalf("bad: resp: %#v, err: %v", resp, err)
|
||||||
|
}
|
||||||
|
groupID := resp.Data["id"].(string)
|
||||||
|
|
||||||
|
// Read the group using its iD and check if all the fields are properly
|
||||||
|
// set
|
||||||
|
groupReq = &logical.Request{
|
||||||
|
Operation: logical.ReadOperation,
|
||||||
|
Path: "group/id/" + groupID,
|
||||||
|
}
|
||||||
|
resp, err = is.HandleRequest(ctx, groupReq)
|
||||||
|
if err != nil || (resp != nil && resp.IsError()) {
|
||||||
|
t.Fatalf("bad: resp: %#v, err: %v", resp, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedData := map[string]interface{}{
|
||||||
|
"policies": []string{"testpolicy1", "testpolicy2"},
|
||||||
|
"metadata": map[string]string{
|
||||||
|
"testkey1": "testvalue1",
|
||||||
|
"testkey2": "testvalue2",
|
||||||
|
},
|
||||||
|
"parent_group_ids": []string(nil),
|
||||||
|
}
|
||||||
|
expectedData["id"] = resp.Data["id"]
|
||||||
|
expectedData["type"] = resp.Data["type"]
|
||||||
|
expectedData["name"] = resp.Data["name"]
|
||||||
|
expectedData["creation_time"] = resp.Data["creation_time"]
|
||||||
|
expectedData["last_update_time"] = resp.Data["last_update_time"]
|
||||||
|
expectedData["modify_index"] = resp.Data["modify_index"]
|
||||||
|
expectedData["alias"] = resp.Data["alias"]
|
||||||
|
expectedData["namespace_id"] = "root"
|
||||||
|
expectedData["member_group_ids"] = resp.Data["member_group_ids"]
|
||||||
|
expectedData["member_entity_ids"] = resp.Data["member_entity_ids"]
|
||||||
|
|
||||||
|
if diff := deep.Equal(expectedData, resp.Data); diff != nil {
|
||||||
|
t.Fatal(diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the policies and metadata in the group
|
||||||
|
groupReq.Operation = logical.UpdateOperation
|
||||||
|
groupReq.Data = groupData
|
||||||
|
|
||||||
|
// Update by setting ID in the param
|
||||||
|
groupData["id"] = groupID
|
||||||
|
groupData["policies"] = []string{"updatedpolicy1", "updatedpolicy2", "updatedpolicy2"}
|
||||||
|
resp, err = is.HandleRequest(ctx, groupReq)
|
||||||
|
if err != nil || (resp != nil && resp.IsError()) {
|
||||||
|
t.Fatalf("bad: resp: %#v, err: %v", resp, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if updates are reflected
|
||||||
|
groupReq.Operation = logical.ReadOperation
|
||||||
|
resp, err = is.HandleRequest(ctx, groupReq)
|
||||||
|
if err != nil || (resp != nil && resp.IsError()) {
|
||||||
|
t.Fatalf("bad: resp: %#v, err: %v", resp, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedData["policies"] = []string{"updatedpolicy1", "updatedpolicy2"}
|
||||||
|
expectedData["last_update_time"] = resp.Data["last_update_time"]
|
||||||
|
expectedData["modify_index"] = resp.Data["modify_index"]
|
||||||
|
if !reflect.DeepEqual(expectedData, resp.Data) {
|
||||||
|
t.Fatalf("bad: group data; expected: %#v\n actual: %#v\n", expectedData, resp.Data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestIdentityStore_GroupsCRUD_ByID(t *testing.T) {
|
func TestIdentityStore_GroupsCRUD_ByID(t *testing.T) {
|
||||||
var resp *logical.Response
|
var resp *logical.Response
|
||||||
var err error
|
var err error
|
||||||
|
|
|
@ -1483,6 +1483,9 @@ func (i *IdentityStore) sanitizeAndUpsertGroup(ctx context.Context, group *ident
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove duplicate policies
|
||||||
|
group.Policies = strutil.RemoveDuplicates(group.Policies, false)
|
||||||
|
|
||||||
txn := i.db.Txn(true)
|
txn := i.db.Txn(true)
|
||||||
defer txn.Abort()
|
defer txn.Abort()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue