| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  | { system ? builtins.currentSystem, pkgs ? import <nixpkgs> { inherit system; } }: | 
					
						
							|  |  |  | with import ./base.nix { inherit system; }; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  | let | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   roServiceAccount = pkgs.writeText "ro-service-account.json" (builtins.toJSON { | 
					
						
							|  |  |  |     kind = "ServiceAccount"; | 
					
						
							|  |  |  |     apiVersion = "v1"; | 
					
						
							|  |  |  |     metadata = { | 
					
						
							|  |  |  |       name = "read-only"; | 
					
						
							|  |  |  |       namespace = "default"; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   roRoleBinding = pkgs.writeText "ro-role-binding.json" (builtins.toJSON { | 
					
						
							| 
									
										
										
										
											2018-03-17 01:35:35 -04:00
										 |  |  |     apiVersion = "rbac.authorization.k8s.io/v1"; | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |     kind = "RoleBinding"; | 
					
						
							|  |  |  |     metadata = { | 
					
						
							|  |  |  |       name = "read-pods"; | 
					
						
							|  |  |  |       namespace = "default"; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |     roleRef = { | 
					
						
							|  |  |  |       apiGroup = "rbac.authorization.k8s.io"; | 
					
						
							|  |  |  |       kind = "Role"; | 
					
						
							|  |  |  |       name = "pod-reader"; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |     subjects = [{ | 
					
						
							|  |  |  |       kind = "ServiceAccount"; | 
					
						
							|  |  |  |       name = "read-only"; | 
					
						
							|  |  |  |       namespace = "default"; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |     }]; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   roRole = pkgs.writeText "ro-role.json" (builtins.toJSON { | 
					
						
							| 
									
										
										
										
											2018-03-17 01:35:35 -04:00
										 |  |  |     apiVersion = "rbac.authorization.k8s.io/v1"; | 
					
						
							| 
									
										
										
										
											2017-05-24 19:05:54 +02:00
										 |  |  |     kind = "Role"; | 
					
						
							|  |  |  |     metadata = { | 
					
						
							|  |  |  |       name = "pod-reader"; | 
					
						
							|  |  |  |       namespace = "default"; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-05-24 19:05:54 +02:00
										 |  |  |     rules = [{ | 
					
						
							|  |  |  |       apiGroups = [""]; | 
					
						
							|  |  |  |       resources = ["pods"]; | 
					
						
							|  |  |  |       verbs = ["get" "list" "watch"]; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |     }]; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   kubectlPod = pkgs.writeText "kubectl-pod.json" (builtins.toJSON { | 
					
						
							|  |  |  |     kind = "Pod"; | 
					
						
							|  |  |  |     apiVersion = "v1"; | 
					
						
							|  |  |  |     metadata.name = "kubectl"; | 
					
						
							|  |  |  |     metadata.namespace = "default"; | 
					
						
							|  |  |  |     metadata.labels.name = "kubectl"; | 
					
						
							|  |  |  |     spec.serviceAccountName = "read-only"; | 
					
						
							|  |  |  |     spec.containers = [{ | 
					
						
							|  |  |  |       name = "kubectl"; | 
					
						
							|  |  |  |       image = "kubectl:latest"; | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |       command = ["/bin/tail" "-f"]; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |       imagePullPolicy = "Never"; | 
					
						
							|  |  |  |       tty = true; | 
					
						
							|  |  |  |     }]; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   kubectlPod2 = pkgs.writeTextDir "kubectl-pod-2.json" (builtins.toJSON { | 
					
						
							|  |  |  |     kind = "Pod"; | 
					
						
							|  |  |  |     apiVersion = "v1"; | 
					
						
							|  |  |  |     metadata.name = "kubectl-2"; | 
					
						
							|  |  |  |     metadata.namespace = "default"; | 
					
						
							|  |  |  |     metadata.labels.name = "kubectl-2"; | 
					
						
							|  |  |  |     spec.serviceAccountName = "read-only"; | 
					
						
							|  |  |  |     spec.containers = [{ | 
					
						
							|  |  |  |       name = "kubectl-2"; | 
					
						
							|  |  |  |       image = "kubectl:latest"; | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |       command = ["/bin/tail" "-f"]; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |       imagePullPolicy = "Never"; | 
					
						
							|  |  |  |       tty = true; | 
					
						
							|  |  |  |     }]; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |   kubectl = pkgs.runCommand "copy-kubectl" { buildInputs = [ pkgs.kubernetes ]; } ''
 | 
					
						
							|  |  |  |     mkdir -p $out/bin | 
					
						
							|  |  |  |     cp ${pkgs.kubernetes}/bin/kubectl $out/bin/kubectl | 
					
						
							|  |  |  |   '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |   kubectlImage = pkgs.dockerTools.buildImage { | 
					
						
							|  |  |  |     name = "kubectl"; | 
					
						
							|  |  |  |     tag = "latest"; | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |     contents = [ kubectl pkgs.busybox kubectlPod2 ]; | 
					
						
							|  |  |  |     config.Entrypoint = "/bin/sh"; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |   base = { | 
					
						
							|  |  |  |     name = "rbac"; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |   singlenode = base // { | 
					
						
							|  |  |  |     test = ''
 | 
					
						
							| 
									
										
										
										
											2019-03-01 08:44:45 +01:00
										 |  |  |       $machine1->waitForUnit("kubernetes.target"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |       $machine1->waitUntilSucceeds("kubectl get node machine1.my.zyx | grep -w Ready"); | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-14 10:51:44 +01:00
										 |  |  |       $machine1->waitUntilSucceeds("docker load < ${kubectlImage}"); | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |       $machine1->waitUntilSucceeds("kubectl apply -f ${roServiceAccount}"); | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("kubectl apply -f ${roRole}"); | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("kubectl apply -f ${roRoleBinding}"); | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("kubectl create -f ${kubectlPod}"); | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |       $machine1->waitUntilSucceeds("kubectl get pod kubectl | grep Running"); | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-22 13:14:20 +02:00
										 |  |  |       $machine1->waitUntilSucceeds("kubectl exec -ti kubectl -- kubectl get pods"); | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |       $machine1->fail("kubectl exec -ti kubectl -- kubectl create -f /kubectl-pod-2.json"); | 
					
						
							|  |  |  |       $machine1->fail("kubectl exec -ti kubectl -- kubectl delete pods -l name=kubectl"); | 
					
						
							|  |  |  |     '';
 | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |   multinode = base // { | 
					
						
							|  |  |  |     test = ''
 | 
					
						
							| 
									
										
										
										
											2018-07-22 13:14:20 +02:00
										 |  |  |       # Node token exchange | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("cp -f /var/lib/cfssl/apitoken.secret /tmp/shared/apitoken.secret"); | 
					
						
							|  |  |  |       $machine2->waitUntilSucceeds("cat /tmp/shared/apitoken.secret | nixos-kubernetes-node-join"); | 
					
						
							| 
									
										
										
										
											2019-03-01 08:44:45 +01:00
										 |  |  |       $machine1->waitForUnit("kubernetes.target"); | 
					
						
							|  |  |  |       $machine2->waitForUnit("kubernetes.target"); | 
					
						
							| 
									
										
										
										
											2018-07-22 13:14:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |       $machine1->waitUntilSucceeds("kubectl get node machine2.my.zyx | grep -w Ready"); | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-14 10:51:44 +01:00
										 |  |  |       $machine2->waitUntilSucceeds("docker load < ${kubectlImage}"); | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("kubectl apply -f ${roServiceAccount}"); | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("kubectl apply -f ${roRole}"); | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("kubectl apply -f ${roRoleBinding}"); | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("kubectl create -f ${kubectlPod}"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       $machine1->waitUntilSucceeds("kubectl get pod kubectl | grep Running"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-22 13:14:20 +02:00
										 |  |  |       $machine1->waitUntilSucceeds("kubectl exec -ti kubectl -- kubectl get pods"); | 
					
						
							| 
									
										
										
										
											2017-09-09 02:00:35 +02:00
										 |  |  |       $machine1->fail("kubectl exec -ti kubectl -- kubectl create -f /kubectl-pod-2.json"); | 
					
						
							|  |  |  |       $machine1->fail("kubectl exec -ti kubectl -- kubectl delete pods -l name=kubectl"); | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | in { | 
					
						
							|  |  |  |   singlenode = mkKubernetesSingleNodeTest singlenode; | 
					
						
							|  |  |  |   multinode = mkKubernetesMultiNodeTest multinode; | 
					
						
							| 
									
										
										
										
											2017-05-03 01:20:32 +02:00
										 |  |  | } |