...
1package kube
2
3kubernetes: services: {
4 for k, x in service {
5 "\(k)": x.kubernetes & {
6 apiVersion: "v1"
7 kind: "Service"
8
9 metadata: name: x.name
10 metadata: labels: x.label
11 spec: selector: x.label
12
13 spec: ports: [for p in x.port {p}] // convert struct to list
14 }
15 }
16 // Note that we cannot write
17 // kubernetes services "\(k)": {} for k, x in service
18 // "service" is also a field comprehension and the spec prohibits one field
19 // comprehension referencing another within the same struct.
20 // In general it is good practice to define a comprehension in the smallest
21 // struct possible.
22}
23
24// TODO: with type conversions and types, if implemented:
25// deployments :: k8s.Deployment
26// deployments: _k8sSpec(X: x) for x in deployment
27// This would look nicer and would allow for superior type checking.
28
29kubernetes: deployments: {
30 for k, x in deployment if x.kind == "deployment" {
31 "\(k)": (_k8sSpec & {X: x}).X.kubernetes & {
32 apiVersion: "extensions/v1beta1"
33 kind: "Deployment"
34 spec: replicas: x.replicas
35 }
36 }
37}
38
39kubernetes: statefulSets: {
40 for k, x in deployment if x.kind == "stateful" {
41 "\(k)": (_k8sSpec & {X: x}).X.kubernetes & {
42 apiVersion: "apps/v1beta1"
43 kind: "StatefulSet"
44 spec: replicas: x.replicas
45 }
46 }
47}
48
49kubernetes: daemonSets: {
50 for k, x in deployment if x.kind == "daemon" {
51 "\(k)": (_k8sSpec & {X: x}).X.kubernetes & {
52 apiVersion: "extensions/v1beta1"
53 kind: "DaemonSet"
54 }
55 }
56}
57
58kubernetes: configMaps: {
59 for k, v in configMap {
60 "\(k)": {
61 apiVersion: "v1"
62 kind: "ConfigMap"
63
64 metadata: name: k
65 metadata: labels: component: _base.label.component
66 data: v
67 }
68 }
69}
70
71// _k8sSpec injects Kubernetes definitions into a deployment
72// Unify the deployment at X and read out kubernetes to obtain
73// the conversion.
74// TODO: use alias
75_k8sSpec: X: kubernetes: {
76 metadata: name: X.name
77 metadata: labels: component: X.label.component
78
79 spec: template: {
80 metadata: labels: X.label
81
82 spec: containers: [{
83 name: X.name
84 image: X.image
85 args: X.args
86 if len(X.envSpec) > 0 {
87 env: [for k, v in X.envSpec {v, name: k}]
88 }
89
90 ports: [for k, p in X.expose.port & X.port {
91 name: k
92 containerPort: p
93 }]
94 }]
95 }
96
97 // Volumes
98 spec: template: spec: {
99 if len(X.volume) > 0 {
100 volumes: [
101 for v in X.volume {
102 v.kubernetes
103
104 name: v.name
105 },
106 ]
107 }
108
109 containers: [{
110 // TODO: using conversions this would look like:
111 // volumeMounts: [ k8s.VolumeMount(v) for v in d.volume ]
112 if len(X.volume) > 0 {
113 volumeMounts: [
114 for v in X.volume {
115 name: v.name
116 mountPath: v.mountPath
117 if v.subPath != null {
118 subPath: v.subPath
119 }
120 if v.readOnly {
121 readOnly: v.readOnly
122 }
123 },
124 ]
125 }
126 }]
127 }
128}
View as plain text