2022-08-16 00:58:23 -04:00
|
|
|
{ lib
|
|
|
|
|
, writeShellScriptBin
|
|
|
|
|
, nix
|
|
|
|
|
, jq
|
|
|
|
|
, kubectl
|
|
|
|
|
, kubernetes-helm
|
|
|
|
|
,
|
|
|
|
|
}:
|
|
|
|
|
writeShellScriptBin "kubenix" ''
|
|
|
|
|
set -Eeuo pipefail
|
|
|
|
|
|
|
|
|
|
function _help() {
|
|
|
|
|
echo "
|
|
|
|
|
kubenix - Kubernetes resource management with Nix
|
|
|
|
|
|
|
|
|
|
commands:
|
|
|
|
|
apply - create resources in target cluster
|
|
|
|
|
diff - show a diff between configured and live resources
|
|
|
|
|
render - print resource manifests to stdout
|
|
|
|
|
"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _helm() {
|
|
|
|
|
RELEASES="$(${nix}/bin/nix eval '.#k8s.config.kubernetes.helm' --json | jq -c '.releases[] | del(.objects)')"
|
|
|
|
|
[ -n "$RELEASES" ] || return 0
|
|
|
|
|
|
|
|
|
|
for release in $RELEASES; do
|
|
|
|
|
values=$(mktemp)
|
|
|
|
|
echo $release | jq -r '.values' > $values
|
|
|
|
|
|
|
|
|
|
${kubernetes-helm}/bin/helm $@ \
|
|
|
|
|
-n $(echo $release | jq -r '.namespace // "default"') \
|
|
|
|
|
$(echo $release | jq -r '.name') \
|
|
|
|
|
$(echo $release | jq -r '.chart') \
|
|
|
|
|
-f $values
|
2022-08-12 09:44:00 -04:00
|
|
|
done
|
2022-08-16 00:58:23 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _kubectl() {
|
|
|
|
|
MANIFESTS=$(mktemp)
|
2022-08-16 01:56:08 -04:00
|
|
|
# TODO: find a better filter, not just not-helm, not-crd
|
2022-08-16 00:58:23 -04:00
|
|
|
cat $(${nix}/bin/nix build '.#k8s.config.kubernetes.result' --json | jq -r '.[0].outputs.out') \
|
2022-08-16 01:56:08 -04:00
|
|
|
| jq '.items[]
|
|
|
|
|
| select(.metadata.labels."app.kubernetes.io/managed-by" != "Helm")
|
|
|
|
|
| select(.kind != "CustomResourceDefinition")' > $MANIFESTS
|
2022-08-16 00:58:23 -04:00
|
|
|
|
|
|
|
|
[ -n "$MANIFESTS" ] || return 0
|
|
|
|
|
|
|
|
|
|
case $1 in
|
|
|
|
|
render)
|
|
|
|
|
cat $MANIFESTS;;
|
|
|
|
|
*)
|
|
|
|
|
${kubectl}/bin/kubectl $@ -f $MANIFESTS;;
|
|
|
|
|
esac
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# if no args given, add empty string
|
|
|
|
|
[ $# -eq 0 ] && set -- ""
|
2022-08-12 09:44:00 -04:00
|
|
|
|
2022-08-16 00:58:23 -04:00
|
|
|
# parse arguments
|
|
|
|
|
while test $# -gt 0; do
|
|
|
|
|
case "$1" in
|
|
|
|
|
|
|
|
|
|
apply)
|
|
|
|
|
_kubectl apply
|
|
|
|
|
_helm upgrade --install
|
|
|
|
|
shift;;
|
|
|
|
|
|
|
|
|
|
diff)
|
|
|
|
|
_kubectl diff
|
|
|
|
|
_helm diff upgrade --allow-unreleased
|
|
|
|
|
shift;;
|
|
|
|
|
|
|
|
|
|
render)
|
|
|
|
|
_kubectl render
|
|
|
|
|
_helm template
|
|
|
|
|
shift;;
|
|
|
|
|
|
|
|
|
|
-h|--help|"")
|
|
|
|
|
_help
|
|
|
|
|
exit 0;;
|
|
|
|
|
|
|
|
|
|
-v|--verbose)
|
|
|
|
|
set -x
|
|
|
|
|
shift;;
|
|
|
|
|
|
|
|
|
|
*)
|
|
|
|
|
_help
|
|
|
|
|
exit 1;;
|
|
|
|
|
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
''
|
2022-08-12 09:44:00 -04:00
|
|
|
|