nixpkgs/nixos/tests/kubernetes/rbac.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

205 lines
5.1 KiB
Nix
Raw Permalink Normal View History

{
system ? builtins.currentSystem,
pkgs ? import ../../.. { inherit system; },
}:
2017-09-09 02:00:35 +02:00
with import ./base.nix { inherit system; };
2017-05-03 01:20:32 +02:00
let
roServiceAccount = pkgs.writeText "ro-service-account.json" (
builtins.toJSON {
2017-09-09 02:00:35 +02:00
kind = "ServiceAccount";
2017-05-03 01:20:32 +02:00
apiVersion = "v1";
metadata = {
2017-09-09 02:00:35 +02:00
name = "read-only";
namespace = "default";
2017-05-03 01:20:32 +02:00
};
}
);
2017-05-03 01:20:32 +02:00
roRoleBinding = pkgs.writeText "ro-role-binding.json" (
builtins.toJSON {
apiVersion = "rbac.authorization.k8s.io/v1";
2017-09-09 02:00:35 +02:00
kind = "RoleBinding";
metadata = {
name = "read-pods";
namespace = "default";
};
2017-09-09 02:00:35 +02:00
roleRef = {
apiGroup = "rbac.authorization.k8s.io";
2017-05-24 19:05:54 +02:00
kind = "Role";
name = "pod-reader";
};
2017-09-09 02:00:35 +02:00
subjects = [
{
2017-09-09 02:00:35 +02:00
kind = "ServiceAccount";
2017-05-03 01:20:32 +02:00
name = "read-only";
2017-05-24 19:05:54 +02:00
namespace = "default";
2017-05-03 01:20:32 +02:00
}
2017-05-24 19:05:54 +02:00
];
}
2017-05-24 19:05:54 +02:00
);
2017-05-24 19:05:54 +02:00
roRole = pkgs.writeText "ro-role.json" (
2017-05-03 01:20:32 +02:00
builtins.toJSON {
apiVersion = "rbac.authorization.k8s.io/v1";
2017-09-09 02:00:35 +02:00
kind = "Role";
2017-05-24 19:05:54 +02:00
metadata = {
2017-09-09 02:00:35 +02:00
name = "pod-reader";
namespace = "default";
};
rules = [
{
2017-05-24 19:05:54 +02:00
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;
}
];
}
);
2017-05-03 01:20:32 +02:00
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;
}
];
}
);
copyKubectl = pkgs.runCommand "copy-kubectl" { } ''
2017-09-09 02:00:35 +02:00
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";
copyToRoot = pkgs.buildEnv {
name = "image-root";
pathsToLink = [ "/bin" ];
paths = [
copyKubectl
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 = ''
machine1.wait_until_succeeds("kubectl get node machine1.my.zyx | grep -w Ready")
machine1.wait_until_succeeds(
"${pkgs.gzip}/bin/zcat ${kubectlImage} | ${pkgs.containerd}/bin/ctr -n k8s.io image import -"
)
machine1.wait_until_succeeds(
"kubectl apply -f ${roServiceAccount}"
)
machine1.wait_until_succeeds(
"kubectl apply -f ${roRole}"
)
machine1.wait_until_succeeds(
"kubectl apply -f ${roRoleBinding}"
)
machine1.wait_until_succeeds(
"kubectl create -f ${kubectlPod}"
)
machine1.wait_until_succeeds("kubectl get pod kubectl | grep Running")
machine1.wait_until_succeeds("kubectl exec kubectl -- kubectl get pods")
machine1.fail("kubectl exec kubectl -- kubectl create -f /kubectl-pod-2.json")
machine1.fail("kubectl exec kubectl -- kubectl delete pods -l name=kubectl")
2017-09-09 02:00:35 +02:00
'';
2017-05-03 01:20:32 +02:00
};
2017-09-09 02:00:35 +02:00
multinode = base // {
test = ''
# Node token exchange
machine1.wait_until_succeeds(
"cp -f /var/lib/cfssl/apitoken.secret /tmp/shared/apitoken.secret"
)
machine2.wait_until_succeeds(
"cat /tmp/shared/apitoken.secret | nixos-kubernetes-node-join"
)
machine1.wait_until_succeeds("kubectl get node machine2.my.zyx | grep -w Ready")
machine2.wait_until_succeeds(
"${pkgs.gzip}/bin/zcat ${kubectlImage} | ${pkgs.containerd}/bin/ctr -n k8s.io image import -"
)
machine1.wait_until_succeeds(
"kubectl apply -f ${roServiceAccount}"
)
machine1.wait_until_succeeds(
"kubectl apply -f ${roRole}"
)
machine1.wait_until_succeeds(
"kubectl apply -f ${roRoleBinding}"
)
machine1.wait_until_succeeds(
"kubectl create -f ${kubectlPod}"
)
machine1.wait_until_succeeds("kubectl get pod kubectl | grep Running")
machine1.wait_until_succeeds("kubectl exec kubectl -- kubectl get pods")
machine1.fail("kubectl exec kubectl -- kubectl create -f /kubectl-pod-2.json")
machine1.fail("kubectl exec kubectl -- kubectl delete pods -l name=kubectl")
2017-09-09 02:00:35 +02:00
'';
};
in
{
singlenode = mkKubernetesSingleNodeTest singlenode;
multinode = mkKubernetesMultiNodeTest multinode;
2017-05-03 01:20:32 +02:00
}