|
2 | 2 | , vals |
3 | 3 | , colordiff |
4 | 4 | , evalModules |
5 | | -, runCommand |
6 | 5 | , writeShellScript |
| 6 | +, writeScriptBin |
| 7 | +, makeWrapper |
| 8 | +, symlinkJoin |
| 9 | +, lib |
7 | 10 | , module ? { } |
8 | 11 | , specialArgs ? { } |
9 | 12 | }: |
10 | 13 | let |
11 | 14 | kubernetes = (evalModules { |
12 | 15 | inherit module specialArgs; |
13 | 16 | }).config.kubernetes or { }; |
14 | | -in |
15 | | -runCommand "kubenix" |
16 | | -{ |
| 17 | + |
17 | 18 | kubeconfig = kubernetes.kubeconfig or ""; |
18 | 19 | result = kubernetes.result or ""; |
19 | 20 |
|
20 | 21 | # kubectl does some parsing which removes the -I flag so |
21 | 22 | # as workaround, we write to a script and call that |
22 | 23 | # https://github.com/kubernetes/kubernetes/pull/108199#issuecomment-1058405404 |
23 | 24 | diff = writeShellScript "kubenix-diff" '' |
24 | | - ${colordiff}/bin/colordiff --nobanner -N -u -I ' kubenix/hash: ' -I ' generation: ' $@ |
| 25 | + ${lib.getExe colordiff} --nobanner -N -u -I ' kubenix/hash: ' -I ' generation: ' $@ |
25 | 26 | ''; |
26 | | -} '' |
27 | | - set -euo pipefail |
28 | | - mkdir -p $out/bin |
29 | | -
|
30 | | - # write the manifests for use with `nix build` |
31 | | - ln -s $result $out/manifest.json |
32 | | -
|
33 | | - # create a script for `nix run` |
34 | | - cat <<EOF> $out/bin/kubenix |
35 | | - set -uo pipefail |
36 | | -
|
37 | | - export KUBECONFIG=$kubeconfig |
38 | | - export KUBECTL_EXTERNAL_DIFF=$diff |
39 | | -
|
40 | | - function _help() { |
41 | | - echo " |
42 | | - kubenix - Kubernetes management with Nix |
43 | | -
|
44 | | - commands: |
45 | | - "" - run diff, prompt for confirmation, then apply |
46 | | - apply - create resources in target cluster |
47 | | - diff - show a diff between configured and live resources |
48 | | - render - print resource manifests to stdout |
49 | | -
|
50 | | - options: |
51 | | - -h --help - show this menu |
52 | | - " |
53 | | - } |
54 | | -
|
55 | | - function _kubectl() { |
56 | | - ${vals}/bin/vals eval -fail-on-missing-key-in-map < $result | ${kubectl}/bin/kubectl \$@ |
57 | | - } |
58 | | -
|
59 | | - # if no args given, add empty string |
60 | | - [ \$# -eq 0 ] && set -- "" |
61 | 27 |
|
62 | | - # parse arguments |
63 | | - while test \$# -gt 0; do |
64 | | - case "\$1" in |
65 | | -
|
66 | | - -h|--help) |
67 | | - _help |
68 | | - exit 0;; |
69 | | -
|
70 | | - "") |
71 | | - _kubectl diff -f - --prune |
72 | | - if [[ "\$?" -eq 1 ]]; then |
73 | | - read -p 'apply? [y/N]: ' response |
74 | | - [[ \$response == "y" ]] && _kubectl apply -f - --prune --all |
75 | | - fi |
76 | | - shift;; |
77 | | -
|
78 | | - render) |
79 | | - ${vals}/bin/vals eval < $result |
80 | | - shift;; |
81 | | -
|
82 | | - apply|diff) |
83 | | - _kubectl \$@ -f - --prune |
84 | | - shift;; |
85 | | -
|
86 | | - *) |
87 | | - _kubectl \$@ |
88 | | - shift;; |
89 | | -
|
90 | | - esac |
91 | | - done |
92 | | -
|
93 | | - EOF |
94 | | - chmod +x $out/bin/kubenix |
95 | | -'' |
| 28 | + script = (writeScriptBin "kubenix" (builtins.readFile ./kubenix.sh)).overrideAttrs (old: { |
| 29 | + buildCommand = "${old.buildCommand}\npatchShebangs $out"; |
| 30 | + }); |
| 31 | +in |
| 32 | +symlinkJoin { |
| 33 | + name = "kubenix"; |
| 34 | + paths = [ script vals kubectl ]; |
| 35 | + buildInputs = [ makeWrapper ]; |
| 36 | + passthru.manifest = result; |
| 37 | + |
| 38 | + postBuild = '' |
| 39 | + export DIFF="${diff}" |
| 40 | + wrapProgram $out/bin/kubenix \ |
| 41 | + --set PATH "$out/bin" \ |
| 42 | + --set KUBECONFIG "${kubeconfig}" \ |
| 43 | + --set KUBECTL_EXTERNAL_DIFF "''${DIFF}" \ |
| 44 | + --set MANIFEST "${result}" |
| 45 | + ''; |
| 46 | +} |
0 commit comments