/
upgrade.go
66 lines (49 loc) · 1.39 KB
/
upgrade.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package api
import (
"github.com/go-logr/zapr"
"github.com/kubeflow/internal-acls/google_groups/pkg/api/v1alpha1"
"go.uber.org/zap"
"sort"
)
const (
expectedSuffix = ".members.txt"
)
// Upgrade all specs. addUsers a list of users to ensure are present in all groups
func Upgrade(groups []*v1alpha1.GoogleGroup, addUsers []*v1alpha1.Member, removeUsers map[string]bool) error {
log := zapr.NewLogger(zap.L())
initMissing := func() map[string]*v1alpha1.Member{
r := map[string]*v1alpha1.Member {}
for _, a := range addUsers{
r[a.Email] = a
}
return r
}
for _, g := range groups {
missing := initMissing()
toKeep := []v1alpha1.Member{}
for _, m := range g.Spec.Members {
if _, ok := removeUsers[m.Email]; ok {
log.Info("Removing member", "group" ,g.Spec.Email , "member", m.Email)
continue
}
toKeep = append(toKeep, m)
desired, ok := missing[m.Email]
if !ok {
continue
}
log.Info("Group already has member", "group",g.Spec.Email , "member", m.Email)
m.Role = desired.Role
delete(missing, m.Email)
}
g.Spec.Members = toKeep
for _, m := range missing {
log.Info("Adding member to group", "group", g.Spec.Email, "member", m.Email)
g.Spec.Members = append(g.Spec.Members, *m)
}
// Sort the members
sort.Slice(g.Spec.Members[:], func(i, j int) bool {
return g.Spec.Members[i].Email < g.Spec.Members[j].Email
})
}
return nil
}