| package kube |
| |
| kubernetes: services: { |
| for k, x in service { |
| "\(k)": x.kubernetes & { |
| apiVersion: "v1" |
| kind: "Service" |
| |
| metadata: name: x.name |
| metadata: labels: x.label |
| spec: selector: x.label |
| |
| spec: ports: [ p for p in x.port ] // convert struct to list |
| } |
| } |
| // Note that we cannot write |
| // kubernetes services "\(k)": {} for k, x in service |
| // "service" is also a field comprehension and the spec prohibits one field |
| // comprehension referencing another within the same struct. |
| // In general it is good practice to define a comprehension in the smallest |
| // struct possible. |
| } |
| |
| // TODO: with type conversions and types, if implemented: |
| // deployments :: k8s.Deployment |
| // deployments: _k8sSpec(X: x) for x in deployment |
| // This would look nicer and would allow for superior type checking. |
| |
| kubernetes: deployments: { |
| for k, x in deployment if x.kind == "deployment" { |
| "\(k)": (_k8sSpec & {X: x}).X.kubernetes & { |
| apiVersion: "extensions/v1beta1" |
| kind: "Deployment" |
| spec: replicas: x.replicas |
| } |
| } |
| } |
| |
| kubernetes: statefulSets: { |
| for k, x in deployment if x.kind == "stateful" { |
| "\(k)": (_k8sSpec & {X: x}).X.kubernetes & { |
| apiVersion: "apps/v1beta1" |
| kind: "StatefulSet" |
| spec: replicas: x.replicas |
| } |
| } |
| } |
| |
| kubernetes: daemonSets: { |
| for k, x in deployment if x.kind == "daemon" { |
| "\(k)": (_k8sSpec & {X: x}).X.kubernetes & { |
| apiVersion: "extensions/v1beta1" |
| kind: "DaemonSet" |
| } |
| } |
| } |
| |
| kubernetes: configMaps: { |
| for k, v in configMap { |
| "\(k)": { |
| apiVersion: "v1" |
| kind: "ConfigMap" |
| |
| metadata: name: k |
| metadata: labels: component: _base.label.component |
| data: v |
| } |
| } |
| } |
| |
| // _k8sSpec injects Kubernetes definitions into a deployment |
| // Unify the deployment at X and read out kubernetes to obtain |
| // the conversion. |
| // TODO: use alias |
| _k8sSpec: X: kubernetes: { |
| metadata: name: X.name |
| metadata: labels: component: X.label.component |
| |
| spec: template: { |
| metadata: labels: X.label |
| |
| spec: containers: [{ |
| name: X.name |
| image: X.image |
| args: X.args |
| if len(X.envSpec) > 0 { |
| env: [ {name: k} & v for k, v in X.envSpec ] |
| } |
| |
| ports: [ { |
| name: k |
| containerPort: p |
| } for k, p in X.expose.port & X.port ] |
| }] |
| } |
| |
| // Volumes |
| spec: template: spec: { |
| if len(X.volume) > 0 { |
| volumes: [ |
| v.kubernetes & {name: v.name} for v in X.volume |
| ] |
| } |
| |
| containers: [{ |
| // TODO: using conversions this would look like: |
| // volumeMounts: [ k8s.VolumeMount(v) for v in d.volume ] |
| if len(X.volume) > 0 { |
| volumeMounts: [ { |
| name: v.name |
| mountPath: v.mountPath |
| if v.subPath != null | true { |
| subPath: v.subPath |
| } |
| if v.readOnly { |
| readOnly: v.readOnly |
| } |
| } for v in X.volume |
| ] |
| } |
| }] |
| } |
| } |