improve additional teams lookup (#2445)

* improve additional teams lookup

---------

Co-authored-by: Jan Mussler <janm81@gmail.com>
This commit is contained in:
Felix Kunde 2023-10-16 16:48:19 +02:00 committed by GitHub
parent 8ae769a567
commit f41c14f468
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 9 deletions

View File

@ -66,13 +66,20 @@ func (ptm *PostgresTeamMap) fetchAdditionalTeams(team string, superuserTeams boo
teams = (*ptm)[team].AdditionalTeams teams = (*ptm)[team].AdditionalTeams
} }
if transitive { if transitive {
exclude = append(exclude, team)
for _, additionalTeam := range teams { for _, additionalTeam := range teams {
if !(util.SliceContains(exclude, additionalTeam)) { if !(util.SliceContains(exclude, additionalTeam)) {
// remember to not check team and additionalTeam again
exclude = append(exclude, additionalTeam)
transitiveTeams := (*ptm).fetchAdditionalTeams(additionalTeam, superuserTeams, transitive, exclude) transitiveTeams := (*ptm).fetchAdditionalTeams(additionalTeam, superuserTeams, transitive, exclude)
for _, transitiveTeam := range transitiveTeams { for _, transitiveTeam := range transitiveTeams {
if !(util.SliceContains(exclude, transitiveTeam)) && !(util.SliceContains(teams, transitiveTeam)) { if !(util.SliceContains(exclude, transitiveTeam)) {
teams = append(teams, transitiveTeam) // remember to not check transitive team again in case
// it is one of the next additional teams of the outer loop
exclude = append(exclude, transitiveTeam)
if !(util.SliceContains(teams, transitiveTeam)) {
// found a new transitive additional team
teams = append(teams, transitiveTeam)
}
} }
} }
} }
@ -84,12 +91,12 @@ func (ptm *PostgresTeamMap) fetchAdditionalTeams(team string, superuserTeams boo
// GetAdditionalTeams function to retrieve list of additional teams // GetAdditionalTeams function to retrieve list of additional teams
func (ptm *PostgresTeamMap) GetAdditionalTeams(team string, transitive bool) []string { func (ptm *PostgresTeamMap) GetAdditionalTeams(team string, transitive bool) []string {
return ptm.fetchAdditionalTeams(team, false, transitive, []string{}) return ptm.fetchAdditionalTeams(team, false, transitive, []string{team})
} }
// GetAdditionalSuperuserTeams function to retrieve list of additional superuser teams // GetAdditionalSuperuserTeams function to retrieve list of additional superuser teams
func (ptm *PostgresTeamMap) GetAdditionalSuperuserTeams(team string, transitive bool) []string { func (ptm *PostgresTeamMap) GetAdditionalSuperuserTeams(team string, transitive bool) []string {
return ptm.fetchAdditionalTeams(team, true, transitive, []string{}) return ptm.fetchAdditionalTeams(team, true, transitive, []string{team})
} }
// Load function to import data from PostgresTeam CRD // Load function to import data from PostgresTeam CRD

View File

@ -42,12 +42,26 @@ var (
AdditionalMembers: map[string][]string{"acid": []string{"batman"}}, AdditionalMembers: map[string][]string{"acid": []string{"batman"}},
}, },
}, },
{
TypeMeta: metav1.TypeMeta{
Kind: "PostgresTeam",
APIVersion: "acid.zalan.do/v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "teamD",
},
Spec: acidv1.PostgresTeamSpec{
AdditionalSuperuserTeams: map[string][]string{},
AdditionalTeams: map[string][]string{"teamA": []string{"teamD"}, "teamC": []string{"teamD"}, "teamD": []string{"teamA", "teamB", "teamC"}},
AdditionalMembers: map[string][]string{"acid": []string{"batman"}},
},
},
}, },
} }
pgTeamMap = PostgresTeamMap{ pgTeamMap = PostgresTeamMap{
"teamA": { "teamA": {
AdditionalSuperuserTeams: []string{"teamB", "team24x7"}, AdditionalSuperuserTeams: []string{"teamB", "team24x7"},
AdditionalTeams: []string{"teamC"}, AdditionalTeams: []string{"teamC", "teamD"},
AdditionalMembers: []string{}, AdditionalMembers: []string{},
}, },
"teamB": { "teamB": {
@ -57,7 +71,12 @@ var (
}, },
"teamC": { "teamC": {
AdditionalSuperuserTeams: []string{"team24x7"}, AdditionalSuperuserTeams: []string{"team24x7"},
AdditionalTeams: []string{"teamA", "teamB", "acid"}, AdditionalTeams: []string{"teamA", "teamB", "teamD", "acid"},
AdditionalMembers: []string{},
},
"teamD": {
AdditionalSuperuserTeams: []string{},
AdditionalTeams: []string{"teamA", "teamB", "teamC"},
AdditionalMembers: []string{}, AdditionalMembers: []string{},
}, },
"team24x7": { "team24x7": {
@ -119,14 +138,14 @@ func TestGetAdditionalTeams(t *testing.T) {
"Check that additional teams are returned", "Check that additional teams are returned",
"teamA", "teamA",
false, false,
[]string{"teamC"}, []string{"teamC", "teamD"},
"GetAdditionalTeams returns wrong list", "GetAdditionalTeams returns wrong list",
}, },
{ {
"Check that additional teams are returned incl. transitive teams", "Check that additional teams are returned incl. transitive teams",
"teamA", "teamA",
true, true,
[]string{"teamC", "teamB", "acid"}, []string{"teamC", "teamD", "teamB", "acid"},
"GetAdditionalTeams returns wrong list", "GetAdditionalTeams returns wrong list",
}, },
{ {