...

Text file src/cuelang.org/go/doc/tutorial/kubernetes/manual/services/k8s.cue

Documentation: cuelang.org/go/doc/tutorial/kubernetes/manual/services

     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