...
1package kube
2
3service: [ID=_]: {
4 apiVersion: "v1"
5 kind: "Service"
6 metadata: {
7 name: ID
8 labels: {
9 app: ID // by convention
10 domain: "prod" // always the same in the given files
11 component: #Component // varies per directory
12 }
13 }
14 spec: {
15 // Any port has the following properties.
16 ports: [...{
17 port: int
18 protocol: *"TCP" | "UDP" // from the Kubernetes definition
19 name: string | *"client"
20 }]
21 selector: metadata.labels // we want those to be the same
22 }
23}
24
25deployment: [ID=_]: {
26 apiVersion: "apps/v1"
27 kind: "Deployment"
28 metadata: name: ID
29 spec: {
30 // 1 is the default, but we allow any number
31 replicas: *1 | int
32 template: {
33 metadata: labels: {
34 app: ID
35 domain: "prod"
36 component: #Component
37 }
38 // we always have one namesake container
39 spec: containers: [{name: ID}]
40 }
41 }
42}
43
44#Component: string
45
46daemonSet: [ID=_]: _spec & {
47 apiVersion: "apps/v1"
48 kind: "DaemonSet"
49 _name: ID
50}
51
52statefulSet: [ID=_]: _spec & {
53 apiVersion: "apps/v1"
54 kind: "StatefulSet"
55 _name: ID
56}
57
58deployment: [ID=_]: _spec & {
59 apiVersion: "apps/v1"
60 kind: "Deployment"
61 _name: ID
62 spec: replicas: *1 | int
63}
64
65configMap: [ID=_]: {
66 metadata: name: ID
67 metadata: labels: component: #Component
68}
69
70_spec: {
71 _name: string
72
73 metadata: name: _name
74 metadata: labels: component: #Component
75 spec: selector: {}
76 spec: template: {
77 metadata: labels: {
78 app: _name
79 component: #Component
80 domain: "prod"
81 }
82 spec: containers: [{name: _name}]
83 }
84}
85
86// Define the _export option and set the default to true
87// for all ports defined in all containers.
88_spec: spec: template: spec: containers: [...{
89 ports: [...{
90 _export: *true | false // include the port in the service
91 }]
92}]
93
94for x in [deployment, daemonSet, statefulSet] for k, v in x {
95 service: "\(k)": {
96 spec: selector: v.spec.template.metadata.labels
97
98 spec: ports: [
99 for c in v.spec.template.spec.containers
100 for p in c.ports
101 if p._export {
102 let Port = p.containerPort // Port is an alias
103 port: *Port | int
104 targetPort: *Port | int
105 },
106 ]
107 }
108}
View as plain text