blob: a00163b9d8969351e60d1174eccbee7f1c267ccb [file] [log] [blame]
Sergiusz Bazanski1e565dc2019-01-18 09:40:59 +01001# Deploy MetalLB
2
3local kube = import "../../../kube/kube.libsonnet";
4
5local bindServiceAccountClusterRole(sa, cr) = kube.ClusterRoleBinding(cr.metadata.name) {
6 roleRef: {
7 apiGroup: "rbac.authorization.k8s.io",
8 kind: "ClusterRole",
9 name: cr.metadata.name,
10 },
11 subjects: [
12 {
13 kind: "ServiceAccount",
14 name: sa.metadata.name,
15 namespace: sa.metadata.namespace,
16 },
17 ],
18};
19
20{
21 Environment: {
22 local env = self,
23 local cfg = env.cfg,
24 cfg:: {
25 namespace: "metallb-system",
26 namespaceCreate: true,
27 },
28
29 ns: if cfg.namespaceCreate then kube.Namespace(cfg.namespace),
30
31 saController: kube.ServiceAccount("controller") {
32 metadata+: {
33 namespace: cfg.namespace,
34 },
35 },
36
37 saSpeaker: kube.ServiceAccount("speaker") {
38 metadata+: {
39 namespace: cfg.namespace,
40 },
41 },
42
43 crController: kube.ClusterRole("%s:controller" % cfg.namespace) {
44 rules: [
45 {
46 apiGroups: [""],
47 resources: ["services"],
48 verbs: ["get", "list", "watch", "update"],
49 },
50 {
51 apiGroups: [""],
52 resources: ["services/status"],
53 verbs: ["update"],
54 },
55 {
56 apiGroups: [""],
57 resources: ["events"],
58 verbs: ["create", "patch"],
59 },
60 ],
61 },
62
63 crbController: bindServiceAccountClusterRole(env.saController, env.crController),
64
65 crSpeaker: kube.ClusterRole("%s:speaker" % cfg.namespace) {
66 rules: [
67 {
68 apiGroups: [""],
69 resources: ["services", "endpoints", "nodes"],
70 verbs: ["get", "list", "watch"],
71 },
72 ],
73 },
74
75 crbSpeaker: bindServiceAccountClusterRole(env.saSpeaker, env.crSpeaker),
76
77 roleWatcher: kube.Role("config-watcher") {
78 metadata+: {
79 namespace: cfg.namespace,
80 },
81 rules: [
82 {
83 apiGroups: [""],
84 resources: ["configmaps"],
85 verbs: ["get", "list", "watch"],
86 },
87 {
88 apiGroups: [""],
89 resources: ["events"],
90 verbs: ["create"],
91 },
92 ],
93 },
94
95 rbWatcher: kube.RoleBinding("config-watcher") {
96 metadata+: {
97 namespace: cfg.namespace,
98 },
99 subjects: [
100 { kind: "ServiceAccount", name: env.saController.metadata.name },
101 { kind: "ServiceAccount", name: env.saSpeaker.metadata.name },
102 ],
103 roleRef: {
104 apiGroup: "rbac.authorization.k8s.io",
105 kind: "Role",
106 name: env.roleWatcher.metadata.name,
107 },
108 },
109 },
110}