about summary refs log tree commit diff
path: root/users/grfn/terraform/workspace.nix
blob: c2a0fdb97793cd757ae5a461be56a7535906f337 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
{ pkgs, depot, ... }:
name: { plugins }: module_tf:

let

  inherit (pkgs) lib runCommandNoCC writeText writeScript;
  inherit (lib) filterAttrsRecursive;

  allPlugins = (p: plugins p ++ (with p; [
    external
    local
    tls
    p.null
  ]));

  tf = pkgs.terraform.withPlugins allPlugins;

  cleanTerraform = filterAttrsRecursive (k: _: ! (builtins.elem k [
    "__readTree"
    "__readTreeChildren"
  ]));

  plugins_tf = {
    terraform.required_providers = (builtins.listToAttrs (map (p: {
      name = lib.last (lib.splitString "/" p.provider-source-address);
      value = {
        source = p.provider-source-address;
        version = p.version;
      };
    }) (allPlugins pkgs.terraform.plugins)));
  };


  module_tf' = module_tf // {
    inherit (depot.users.grfn.terraform) globals;
    plugins = plugins_tf;
  };

  module = runCommandNoCC "module" {} ''
    mkdir $out
    ${lib.concatStrings (lib.mapAttrsToList (k: config_tf:
      (let
        # TODO: filterAttrsRecursive?
        configJson = writeText "${k}.tf.json"
          (builtins.toJSON (cleanTerraform config_tf));
      in ''
        ${pkgs.jq}/bin/jq . ${configJson} > $out/${lib.escapeShellArg k}.tf.json
      ''))
      (cleanTerraform module_tf'))}
  '';


  tfcmd = writeScript "${name}-tfcmd" ''
    set -e
    dir="''${TF_STATE_ROOT:-$HOME/tfstate}/${name}"
    cd "$dir"
    rm -f *.json
    cp ${module}/*.json .
    exec ${tf}/bin/terraform "$(basename "$0")"
  '';

  init = writeScript "${name}-init" ''
    set -e
    dir="''${TF_STATE_ROOT:-$HOME/tfstate}/${name}"
    [ -d "$dir" ] || mkdir -p "$dir"
    cd "$dir"
    rm -f *.json
    cp ${module}/*.json .
    exec ${tf}/bin/terraform init
  '';

  # TODO: import (-config)
  tfcmds = runCommandNoCC "${name}-tfcmds" {} ''
    mkdir -p $out/bin
    ln -s ${init} $out/bin/init
    ln -s ${tfcmd} $out/bin/validate
    ln -s ${tfcmd} $out/bin/plan
    ln -s ${tfcmd} $out/bin/apply
    ln -s ${tfcmd} $out/bin/destroy
  '';

in {
  inherit name module;
  terraform = tf;
  cmds = tfcmds;

  # run = {
  #   init = depot.nix.nixRunWrapper "init" tfcmds;
  #   validate = depot.nix.nixRunWrapper "validate" tfcmds;
  #   plan = depot.nix.nixRunWrapper "plan" tfcmds;
  #   apply = depot.nix.nixRunWrapper "apply" tfcmds;
  #   destroy = depot.nix.nixRunWrapper "destroy" tfcmds;
  # };

  test = runCommandNoCC "${name}-test" {} ''
    set -e
    export TF_STATE_ROOT=$(pwd)
    ${tfcmds}/bin/init
    ${tfcmds}/bin/validate
    touch $out
  '';

  meta.targets = [ "module" "test" ];
}