Skip to content

Commit 96bdac1

Browse files
committed
feat: Allow configurable override of app rules via helm charts values file
1 parent 88aec0a commit 96bdac1

File tree

6 files changed

+89
-5
lines changed

6 files changed

+89
-5
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: wego-app-rules
5+
data:
6+
rules.yaml: |-
7+
{{ toYaml .Values.weaveGitOpsApprules | indent 4 }}

charts/gitops-server/values.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,30 @@ envVars:
2929
- name: WEAVE_GITOPS_FEATURE_GITOPS_RUNTIME
3030
value: "false"
3131

32+
# This section is used to configure the app rules for the GitOps server.
33+
# The app rules are used to define the permissions that the GitOps server has
34+
# to access resources in the cluster. The rules are defined in a ConfigMap
35+
# that is mounted into the GitOps server pod.
36+
weaveGitOpsApprules:
37+
- apiGroups: [""]
38+
resources: ["pods", "secrets"]
39+
verbs: ["get", "list"]
40+
- apiGroups: [""]
41+
resources: ["events"]
42+
verbs: ["get", "list", "watch"]
43+
- apiGroups: ["apps"]
44+
resources: ["deployments", "replicasets"]
45+
verbs: ["get", "list"]
46+
- apiGroups: ["kustomize.toolkit.fluxcd.io"]
47+
resources: ["kustomizations"]
48+
verbs: ["get", "list"]
49+
- apiGroups: ["helm.toolkit.fluxcd.io"]
50+
resources: ["helmreleases"]
51+
verbs: ["get", "list"]
52+
- apiGroups: ["source.toolkit.fluxcd.io"]
53+
resources: ["buckets", "helmcharts", "helmrepositories", "gitrepositories", "ocirepositories"]
54+
verbs: ["get", "list"]
55+
3256
# -- Annotations to add to the deployment
3357
annotations: {}
3458
# Should the 'oidc-auth' secret be created. For a detailed

cmd/gitops-server/cmd/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ func runCmd(cmd *cobra.Command, args []string) error {
244244

245245
fetcher := fetcher.NewSingleClusterFetcher(cl)
246246

247-
clustersManager := clustersmngr.NewClustersManager([]clustersmngr.ClusterFetcher{fetcher}, nsaccess.NewChecker(nsaccess.DefautltWegoAppRules), log)
247+
clustersManager := clustersmngr.NewClustersManager([]clustersmngr.ClusterFetcher{fetcher}, nsaccess.NewChecker(nsaccess.MergeAppRules), log)
248248
clustersManager.Start(ctx)
249249

250250
healthChecker := health.NewHealthChecker()

core/nsaccess/nsaccess.go

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ package nsaccess
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
7+
"k8s.io/client-go/kubernetes"
8+
"k8s.io/client-go/rest"
69

710
authorizationv1 "k8s.io/api/authorization/v1"
811
corev1 "k8s.io/api/core/v1"
@@ -14,8 +17,9 @@ import (
1417

1518
//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate
1619

17-
// DefautltWegoAppRules is the minimun set of permissions a user will need to use the wego-app in a given namespace
18-
var DefautltWegoAppRules = []rbacv1.PolicyRule{
20+
// BaseWegoAppRules is the minimun set of permissions a user will need to use the wego-app in a given namespace.
21+
// was DefautltWegoAppRules
22+
var BaseWegoAppRules = []rbacv1.PolicyRule{
1923
{
2024
APIGroups: []string{""},
2125
Resources: []string{"pods", "secrets"},
@@ -48,6 +52,55 @@ var DefautltWegoAppRules = []rbacv1.PolicyRule{
4852
},
4953
}
5054

55+
func getWegoAppRulesFromConfigMap() interface{} {
56+
57+
config, err := rest.InClusterConfig()
58+
if err != nil {
59+
panic(err.Error())
60+
}
61+
62+
clientset, err := kubernetes.NewForConfig(config)
63+
if err != nil {
64+
panic(err.Error())
65+
}
66+
67+
configMap, err := clientset.CoreV1().ConfigMaps("flux-system").Get(context.TODO(), "wego-app-rules", metav1.GetOptions{})
68+
if err != nil {
69+
panic(err.Error())
70+
}
71+
72+
var rules []rbacv1.PolicyRule
73+
err = json.Unmarshal([]byte(configMap.Data["rules"]), &rules)
74+
if err != nil {
75+
panic(err.Error())
76+
}
77+
78+
return rules
79+
80+
}
81+
82+
// MergeAppRules merges the default rules with the rules from the configMap, overriding defaults with configMap rules
83+
func MergeAppRules(defaultRules, configMapRules []rbacv1.PolicyRule) []rbacv1.PolicyRule {
84+
ruleMap := make(map[string]rbacv1.PolicyRule)
85+
86+
for _, rule := range defaultRules {
87+
key := fmt.Sprintf("%s-%s", rule.APIGroups, rule.Resources)
88+
ruleMap[key] = rule
89+
}
90+
91+
for _, rule := range configMapRules {
92+
key := fmt.Sprintf("%s-%s", rule.APIGroups, rule.Resources)
93+
ruleMap[key] = rule
94+
}
95+
96+
mergedRules := make([]rbacv1.PolicyRule, 0, len(ruleMap))
97+
for _, rule := range ruleMap {
98+
mergedRules = append(mergedRules, rule)
99+
}
100+
101+
return mergedRules
102+
}
103+
51104
// Checker contains methods for validing user access to Kubernetes namespaces, based on a set of PolicyRules
52105
//
53106
//counterfeiter:generate . Checker

core/server/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func NewCoreConfig(log logr.Logger, cfg *rest.Config, clusterName string, cluste
6262
log: log.WithName("core-server"),
6363
RestCfg: cfg,
6464
clusterName: clusterName,
65-
NSAccess: nsaccess.NewChecker(nsaccess.DefautltWegoAppRules),
65+
NSAccess: nsaccess.NewChecker(nsaccess.MergeAppRules),
6666
ClustersManager: clustersManager,
6767
PrimaryKinds: kinds,
6868
HealthChecker: healthChecker,

pkg/services/crd/suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func createClient(k8sEnv *testutils.K8sTestEnv) (clustersmngr.Client, clustersmn
6868

6969
clustersManager := clustersmngr.NewClustersManager(
7070
[]clustersmngr.ClusterFetcher{fetcher},
71-
nsaccess.NewChecker(nsaccess.DefautltWegoAppRules),
71+
nsaccess.NewChecker(nsaccess.MergeAppRules),
7272
log,
7373
)
7474

0 commit comments

Comments
 (0)