109 lines
2.1 KiB
Text
109 lines
2.1 KiB
Text
![]() |
package kube
|
||
|
|
||
|
service: [ID=_]: {
|
||
|
apiVersion: "v1"
|
||
|
kind: "Service"
|
||
|
metadata: {
|
||
|
name: ID
|
||
|
labels: {
|
||
|
app: ID // by convention
|
||
|
domain: "prod" // always the same in the given files
|
||
|
component: #Component // varies per directory
|
||
|
}
|
||
|
}
|
||
|
spec: {
|
||
|
// Any port has the following properties.
|
||
|
ports: [...{
|
||
|
port: int
|
||
|
protocol: *"TCP" | "UDP" // from the Kubernetes definition
|
||
|
name: string | *"client"
|
||
|
}]
|
||
|
selector: metadata.labels // we want those to be the same
|
||
|
}
|
||
|
}
|
||
|
|
||
|
deployment: [ID=_]: {
|
||
|
apiVersion: "apps/v1"
|
||
|
kind: "Deployment"
|
||
|
metadata: name: ID
|
||
|
spec: {
|
||
|
// 1 is the default, but we allow any number
|
||
|
replicas: *1 | int
|
||
|
template: {
|
||
|
metadata: labels: {
|
||
|
app: ID
|
||
|
domain: "prod"
|
||
|
component: #Component
|
||
|
}
|
||
|
// we always have one namesake container
|
||
|
spec: containers: [{name: ID}]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#Component: string
|
||
|
|
||
|
daemonSet: [ID=_]: _spec & {
|
||
|
apiVersion: "apps/v1"
|
||
|
kind: "DaemonSet"
|
||
|
_name: ID
|
||
|
}
|
||
|
|
||
|
statefulSet: [ID=_]: _spec & {
|
||
|
apiVersion: "apps/v1"
|
||
|
kind: "StatefulSet"
|
||
|
_name: ID
|
||
|
}
|
||
|
|
||
|
deployment: [ID=_]: _spec & {
|
||
|
apiVersion: "apps/v1"
|
||
|
kind: "Deployment"
|
||
|
_name: ID
|
||
|
spec: replicas: *1 | int
|
||
|
}
|
||
|
|
||
|
configMap: [ID=_]: {
|
||
|
metadata: name: ID
|
||
|
metadata: labels: component: #Component
|
||
|
}
|
||
|
|
||
|
_spec: {
|
||
|
_name: string
|
||
|
|
||
|
metadata: name: _name
|
||
|
metadata: labels: component: #Component
|
||
|
spec: selector: {}
|
||
|
spec: template: {
|
||
|
metadata: labels: {
|
||
|
app: _name
|
||
|
component: #Component
|
||
|
domain: "prod"
|
||
|
}
|
||
|
spec: containers: [{name: _name}]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Define the _export option and set the default to true
|
||
|
// for all ports defined in all containers.
|
||
|
_spec: spec: template: spec: containers: [...{
|
||
|
ports: [...{
|
||
|
_export: *true | false // include the port in the service
|
||
|
}]
|
||
|
}]
|
||
|
|
||
|
for x in [deployment, daemonSet, statefulSet] for k, v in x {
|
||
|
service: "\(k)": {
|
||
|
spec: selector: v.spec.template.metadata.labels
|
||
|
|
||
|
spec: ports: [
|
||
|
for c in v.spec.template.spec.containers
|
||
|
for p in c.ports
|
||
|
if p._export {
|
||
|
let Port = p.containerPort // Port is an alias
|
||
|
port: *Port | int
|
||
|
targetPort: *Port | int
|
||
|
},
|
||
|
]
|
||
|
}
|
||
|
}
|