github.com/joomcode/cue@v0.4.4-0.20221111115225-539fe3512047/doc/tutorial/kubernetes/manual/services/k8s.cue (about) 1 package kube 2 3 kubernetes: 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 29 kubernetes: 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 39 kubernetes: 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 49 kubernetes: 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 58 kubernetes: 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 }