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  }