Skip to content

Commit 2da3106

Browse files
Merge pull request #44 from AthenZ/filter-msd-rules
Support feature to filter out msd rules
2 parents adc352b + 5b57752 commit 2da3106

File tree

7 files changed

+335
-7
lines changed

7 files changed

+335
-7
lines changed

main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ func main() {
126126
header := flag.String("auth-header", "", "Authentication header field")
127127
nTokenExpireTime := flag.String("ntoken-expiry", "1h0m0s", "Custom nToken expiration duration")
128128
excludeNamespaces := flag.String("exclude-namespaces", "", "Namespaces to exclude from processing ex: 'kube-system,kube-public,acceptance-test'")
129+
excludeMSDRules := flag.Bool("exclude-msd-rules", false, "Exclude MSD based role and policies when syncing Athenz domains")
129130

130131
klog.InitFlags(nil)
131132
flag.Set("logtostderr", "false")
@@ -201,7 +202,7 @@ func main() {
201202
exclusionList = append(exclusionList, item)
202203
}
203204
}
204-
util := util.NewUtil(*adminDomain, processList, exclusionList)
205+
util := util.NewUtil(*adminDomain, processList, exclusionList, *excludeMSDRules)
205206

206207
// construct the Controller object which has all of the necessary components to
207208
// handle logging, connections, informing (listing and watching), the queue,

pkg/controller/controller.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,5 +310,10 @@ func (c *Controller) zmsGetSignedDomains(domain string) (*zms.SignedDomains, boo
310310
log.Error("SignedDomain call returned an empty list")
311311
return nil, false, nil
312312
}
313+
314+
for i := range signedDomain.Domains {
315+
signedDomain.Domains[i].Domain = c.util.FilterMSDRules(signedDomain.Domains[i].Domain)
316+
}
317+
313318
return signedDomain, true, nil
314319
}

pkg/controller/controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func newController() *Controller {
4848
athenzclientset := fake.NewSimpleClientset()
4949
clientset := k8sfake.NewSimpleClientset()
5050
zmsclient := zms.NewClient("https://zms.athenz.com", &http.Transport{})
51-
util := util.NewUtil("admin.domain", []string{"kube-system", "kube-public", "kube-test"}, []string{"acceptance-test"})
51+
util := util.NewUtil("admin.domain", []string{"kube-system", "kube-public", "kube-test"}, []string{"acceptance-test"}, false)
5252
cm := &cron.AthenzContactTimeConfigMap{
5353
Namespace: "kube-yahoo",
5454
Name: "athenzcall-config",
@@ -253,7 +253,7 @@ func TestNsinformerhandler(t *testing.T) {
253253
for _, tt := range tests {
254254
t.Run(tt.name, func(t *testing.T) {
255255
c := newController()
256-
c.util = util.NewUtil("admin.domain", []string{"kube-system"}, tt.excludedNS)
256+
c.util = util.NewUtil("admin.domain", []string{"kube-system"}, tt.excludedNS, false)
257257
mockQueue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter())
258258
c.queue = mockQueue
259259

pkg/cron/cron_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func newCron() *Cron {
4848
clientset := k8sfake.NewSimpleClientset()
4949
rateLimiter := ratelimiter.NewRateLimiter(250 * time.Millisecond)
5050
queue := workqueue.NewRateLimitingQueue(rateLimiter)
51-
util := util.NewUtil("test.domain", []string{"kube-system"}, []string{"acceptance-test"})
51+
util := util.NewUtil("test.domain", []string{"kube-system"}, []string{"acceptance-test"}, false)
5252
athenzclientset := fake.NewSimpleClientset()
5353
informer := athenzInformer.NewAthenzDomainInformer(athenzclientset, 0, cache.Indexers{
5454
"trustDomain": cr.TrustDomainIndexFunc,

pkg/util/util.go

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,20 @@ import (
1919
"fmt"
2020
"os"
2121
"strings"
22+
23+
"github.com/AthenZ/athenz/clients/go/zms"
2224
)
2325

2426
// Util - struct with 2 fields adminDomain and list of system namespaces
2527
type Util struct {
2628
adminDomain string
2729
systemNamespaces []string
2830
excludeNamespaces map[string]bool
31+
excludeMSDRules bool
2932
}
3033

3134
// NewUtil - create new Util object
32-
func NewUtil(adminDomain string, systemNamespaces []string, excludeNamespaces []string) *Util {
35+
func NewUtil(adminDomain string, systemNamespaces []string, excludeNamespaces []string, excludeMSDRules bool) *Util {
3336
excludedNamespaceMap := make(map[string]bool)
3437
for _, ns := range excludeNamespaces {
3538
excludedNamespaceMap[ns] = true
@@ -39,6 +42,7 @@ func NewUtil(adminDomain string, systemNamespaces []string, excludeNamespaces []
3942
adminDomain: adminDomain,
4043
systemNamespaces: systemNamespaces,
4144
excludeNamespaces: excludedNamespaceMap,
45+
excludeMSDRules: excludeMSDRules,
4246
}
4347
}
4448

@@ -124,3 +128,45 @@ func HomeDir() string {
124128
}
125129
return os.Getenv("USERPROFILE") // windows
126130
}
131+
132+
func filterMSDRules(domain *zms.DomainData) *zms.DomainData {
133+
domainName := string(domain.Name)
134+
var filteredRoles []*zms.Role
135+
var filteredPolicies []*zms.Policy
136+
// Filter out roles where the names starts with "domainName:role.acl." which are MSD roles
137+
// Filter out roles that start with "domainName:role.msd-read-role-"
138+
for _, role := range domain.Roles {
139+
roleName := string(role.Name)
140+
aclPrefix := domainName + ":role.acl."
141+
msdReadPrefix := domainName + ":role.msd-read-role-"
142+
if strings.HasPrefix(roleName, aclPrefix) ||
143+
strings.HasPrefix(roleName, msdReadPrefix) {
144+
continue
145+
}
146+
filteredRoles = append(filteredRoles, role)
147+
}
148+
domain.Roles = filteredRoles
149+
150+
// Filter out policies start with "domainName:policy.acl." which are MSD policies
151+
// Filter out policies start with "domainName:policy.msd-read-policy-"
152+
for _, policy := range domain.Policies.Contents.Policies {
153+
policyName := string(policy.Name)
154+
aclPrefix := domainName + ":policy.acl."
155+
msdReadPrefix := domainName + ":policy.msd-read-policy-"
156+
if strings.HasPrefix(policyName, aclPrefix) ||
157+
strings.HasPrefix(policyName, msdReadPrefix) {
158+
continue
159+
}
160+
filteredPolicies = append(filteredPolicies, policy)
161+
}
162+
domain.Policies.Contents.Policies = filteredPolicies
163+
164+
return domain
165+
}
166+
167+
func (u *Util) FilterMSDRules(domainData *zms.DomainData) *zms.DomainData {
168+
if !u.excludeMSDRules {
169+
return domainData
170+
}
171+
return filterMSDRules(domainData)
172+
}

0 commit comments

Comments
 (0)