about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/networking/cluster/terraform-providers/default.nix
blob: 82ce5a706796f4790d1cfd3e9ec063220c7703ad (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
{ lib
, buildGoPackage
, fetchFromGitHub
, callPackage
}:
let
  list = import ./data.nix;

  toDrv = data:
    buildGoPackage rec {
      inherit (data) owner repo rev version sha256;
      name = "${repo}-${version}";
      goPackagePath = "github.com/${owner}/${repo}";
      subPackages = [ "." ];
      src = fetchFromGitHub {
        inherit owner repo rev sha256;
      };
      # Terraform allow checking the provider versions, but this breaks
      # if the versions are not provided via file paths.
      postBuild = "mv go/bin/${repo}{,_v${version}}";
    };

  # Google is now using the vendored go modules, which works a bit differently
  # and is not 100% compatible with the pre-modules vendored folders.
  #
  # Instead of switching to goModules which requires a goModSha256, patch the
  # goPackage derivation so it can install the top-level.
  patchGoModVendor = drv:
    drv.overrideAttrs (attrs: {
      buildFlags = "-mod=vendor";

      # override configurePhase to not move the source into GOPATH
      configurePhase = ''
        export GOPATH=$NIX_BUILD_TOP/go:$GOPATH
        export GOCACHE=$TMPDIR/go-cache
        export GO111MODULE=on
      '';

      # just build and install into $GOPATH/bin
      buildPhase = ''
        go install -mod=vendor -v -p 16 .
      '';

      # don't run the tests, they are broken in this setup
      doCheck = false;
    });

  # These providers are managed with the ./update-all script
  automated-providers = lib.mapAttrs (_: toDrv) list;

  # These are the providers that don't fall in line with the default model
  special-providers = {
    # Override providers that use Go modules + vendor/ folder
    google = patchGoModVendor automated-providers.google;
    google-beta = patchGoModVendor automated-providers.google-beta;
    ibm = patchGoModVendor automated-providers.ibm;

    # providers that were moved to the `hashicorp` organization,
    # but haven't updated their references yet:

    # https://github.com/hashicorp/terraform-provider-archive/pull/67
    archive = automated-providers.archive.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-archive hashicorp/terraform-provider-archive
        substituteInPlace main.go --replace terraform-providers/terraform-provider-archive hashicorp/terraform-provider-archive
      '';
    });

    # https://github.com/hashicorp/terraform-provider-dns/pull/101
    dns = automated-providers.dns.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-dns hashicorp/terraform-provider-dns
        substituteInPlace main.go --replace terraform-providers/terraform-provider-dns hashicorp/terraform-provider-dns
      '';
    });

    # https://github.com/hashicorp/terraform-provider-external/pull/41
    external = automated-providers.external.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-external hashicorp/terraform-provider-external
        substituteInPlace main.go --replace terraform-providers/terraform-provider-external hashicorp/terraform-provider-external
      '';
    });

    # https://github.com/hashicorp/terraform-provider-http/pull/40
    http = automated-providers.http.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-http hashicorp/terraform-provider-http
        substituteInPlace main.go --replace terraform-providers/terraform-provider-http hashicorp/terraform-provider-http
      '';
    });

    # https://github.com/hashicorp/terraform-provider-local/pull/40
    local = automated-providers.local.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-local hashicorp/terraform-provider-local
        substituteInPlace main.go --replace terraform-providers/terraform-provider-local hashicorp/terraform-provider-local
      '';
    });

    # https://github.com/hashicorp/terraform-provider-null/pull/43
    null = automated-providers.null.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-null hashicorp/terraform-provider-null
        substituteInPlace main.go --replace terraform-providers/terraform-provider-null hashicorp/terraform-provider-null
      '';
    });

    # https://github.com/hashicorp/terraform-provider-random/pull/107
    random = automated-providers.random.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-random hashicorp/terraform-provider-random
        substituteInPlace main.go --replace terraform-providers/terraform-provider-random hashicorp/terraform-provider-random
      '';
    });

    # https://github.com/hashicorp/terraform-provider-template/pull/79
    template = automated-providers.template.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-template hashicorp/terraform-provider-template
        substituteInPlace main.go --replace terraform-providers/terraform-provider-template hashicorp/terraform-provider-template
      '';
    });

    # https://github.com/hashicorp/terraform-provider-tls/pull/71
    tls = automated-providers.tls.overrideAttrs (attrs: {
      prePatch = attrs.prePatch or "" + ''
        substituteInPlace go.mod --replace terraform-providers/terraform-provider-tls hashicorp/terraform-provider-tls
        substituteInPlace main.go --replace terraform-providers/terraform-provider-tls hashicorp/terraform-provider-tls
      '';
    });

    # Packages that don't fit the default model
    ansible = callPackage ./ansible {};
    gandi = callPackage ./gandi {};
    elasticsearch = callPackage ./elasticsearch {};
    libvirt = callPackage ./libvirt {};
    lxd = callPackage ./lxd {};
    vpsadmin = callPackage ./vpsadmin {};
  };
in
  automated-providers // special-providers