diff options
Diffstat (limited to 'nixpkgs/pkgs/applications/networking/cluster/terraform/default.nix')
-rw-r--r-- | nixpkgs/pkgs/applications/networking/cluster/terraform/default.nix | 138 |
1 files changed, 81 insertions, 57 deletions
diff --git a/nixpkgs/pkgs/applications/networking/cluster/terraform/default.nix b/nixpkgs/pkgs/applications/networking/cluster/terraform/default.nix index 66185b2cc3d9..2d351eebde24 100644 --- a/nixpkgs/pkgs/applications/networking/cluster/terraform/default.nix +++ b/nixpkgs/pkgs/applications/networking/cluster/terraform/default.nix @@ -1,10 +1,21 @@ -{ stdenv, lib, buildGoModule, fetchFromGitHub, makeWrapper, coreutils -, runCommand, runtimeShell, writeText, terraform-providers, fetchpatch }: +{ stdenv +, lib +, buildGoModule +, fetchFromGitHub +, makeWrapper +, coreutils +, runCommand +, runtimeShell +, writeText +, terraform-providers +, fetchpatch +}: let generic = { version, sha256, vendorSha256 ? null, ... }@attrs: let attrs' = builtins.removeAttrs attrs [ "version" "sha256" "vendorSha256" ]; - in buildGoModule ({ + in + buildGoModule ({ name = "terraform-${version}"; inherit vendorSha256; @@ -62,33 +73,37 @@ let actualPlugins = plugins terraform.plugins; # Make providers available in Terraform 0.13 and 0.12 search paths. - pluginDir = lib.concatMapStrings (pl: let - inherit (pl) version GOOS GOARCH; + pluginDir = lib.concatMapStrings + (pl: + let + inherit (pl) version GOOS GOARCH; - pname = pl.pname or (throw "${pl.name} is missing a pname attribute"); + pname = pl.pname or (throw "${pl.name} is missing a pname attribute"); - # This is just the name, without the terraform-provider- prefix - plugin_name = lib.removePrefix "terraform-provider-" pname; + # This is just the name, without the terraform-provider- prefix + plugin_name = lib.removePrefix "terraform-provider-" pname; - slug = pl.passthru.provider-source-address or "registry.terraform.io/nixpkgs/${plugin_name}"; + slug = pl.passthru.provider-source-address or "registry.terraform.io/nixpkgs/${plugin_name}"; - shim = writeText "shim" '' - #!${runtimeShell} - exec ${pl}/bin/${pname}_v${version} "$@" - ''; - in '' - TF_0_13_PROVIDER_PATH=$out/plugins/${slug}/${version}/${GOOS}_${GOARCH}/${pname}_v${version} - mkdir -p "$(dirname $TF_0_13_PROVIDER_PATH)" + shim = writeText "shim" '' + #!${runtimeShell} + exec ${pl}/bin/${pname}_v${version} "$@" + ''; + in + '' + TF_0_13_PROVIDER_PATH=$out/plugins/${slug}/${version}/${GOOS}_${GOARCH}/${pname}_v${version} + mkdir -p "$(dirname $TF_0_13_PROVIDER_PATH)" - cp ${shim} "$TF_0_13_PROVIDER_PATH" - chmod +x "$TF_0_13_PROVIDER_PATH" + cp ${shim} "$TF_0_13_PROVIDER_PATH" + chmod +x "$TF_0_13_PROVIDER_PATH" - TF_0_12_PROVIDER_PATH=$out/plugins/${pname}_v${version} + TF_0_12_PROVIDER_PATH=$out/plugins/${pname}_v${version} - cp ${shim} "$TF_0_12_PROVIDER_PATH" - chmod +x "$TF_0_12_PROVIDER_PATH" - '' - ) actualPlugins; + cp ${shim} "$TF_0_12_PROVIDER_PATH" + chmod +x "$TF_0_12_PROVIDER_PATH" + '' + ) + actualPlugins; # Wrap PATH of plugins propagatedBuildInputs, plugins may have runtime dependencies on external binaries wrapperInputs = lib.unique (lib.flatten @@ -110,9 +125,10 @@ let }; # Don't bother wrapping unless we actually have plugins, since the wrapper will stop automatic downloading # of plugins, which might be counterintuitive if someone just wants a vanilla Terraform. - in if actualPlugins == [ ] then + in + if actualPlugins == [ ] then terraform.overrideAttrs - (orig: { passthru = orig.passthru // passthru; }) + (orig: { passthru = orig.passthru // passthru; }) else lib.appendToName "with-plugins" (stdenv.mkDerivation { inherit (terraform) name meta; @@ -127,76 +143,84 @@ let inherit passthru; }); - in withPlugins (_: [ ]); + in + withPlugins (_: [ ]); plugins = removeAttrs terraform-providers [ "override" "overrideDerivation" "recurseForDerivations" ]; -in rec { - terraform_0_12 = pluggable (generic { +in +rec { + # Constructor for other terraform versions + mkTerraform = attrs: pluggable (generic attrs); + + terraform_0_12 = mkTerraform { version = "0.12.31"; sha256 = "03p698xdbk5gj0f9v8v1fpd74zng3948dyy4f2hv7zgks9hid7fg"; patches = [ - ./provider-path.patch - (fetchpatch { - name = "fix-mac-mojave-crashes.patch"; - url = "https://github.com/hashicorp/terraform/commit/cd65b28da051174a13ac76e54b7bb95d3051255c.patch"; - sha256 = "1k70kk4hli72x8gza6fy3vpckdm3sf881w61fmssrah3hgmfmbrs"; - }) ]; + ./provider-path.patch + (fetchpatch { + name = "fix-mac-mojave-crashes.patch"; + url = "https://github.com/hashicorp/terraform/commit/cd65b28da051174a13ac76e54b7bb95d3051255c.patch"; + sha256 = "1k70kk4hli72x8gza6fy3vpckdm3sf881w61fmssrah3hgmfmbrs"; + }) + ]; passthru = { inherit plugins; }; - }); + }; - terraform_0_13 = pluggable (generic { + terraform_0_13 = mkTerraform { version = "0.13.7"; sha256 = "1cahnmp66dk21g7ga6454yfhaqrxff7hpwpdgc87cswyq823fgjn"; patches = [ ./provider-path.patch ]; passthru = { inherit plugins; }; - }); + }; - terraform_0_14 = pluggable (generic { + terraform_0_14 = mkTerraform { version = "0.14.11"; sha256 = "1yi1jj3n61g1kn8klw6l78shd23q79llb7qqwigqrx3ki2mp279j"; vendorSha256 = "1d93aqkjdrvabkvix6h1qaxpjzv7w1wa7xa44czdnjs2lapx4smm"; patches = [ ./provider-path.patch ]; passthru = { inherit plugins; }; - }); + }; - terraform_0_15 = pluggable (generic { + terraform_0_15 = mkTerraform { version = "0.15.5"; sha256 = "18f4a6l24s3cym7gk40agxikd90i56q84wziskw1spy9rgv2yx6d"; vendorSha256 = "12hrpxay6k3kz89ihyhl91c4lw4wp821ppa245w9977fq09fhnx0"; patches = [ ./provider-path-0_15.patch ]; passthru = { inherit plugins; }; - }); + }; - terraform_1_0_0 = pluggable (generic { + terraform_1_0 = mkTerraform { version = "1.0.0"; sha256 = "sha256-ddcT/I2Qn1pKFyhXgh+CcD3fSv2steSNmjyyiS2SE/o="; vendorSha256 = "sha256-oFvoEsDunJR4IULdGwS6nHBKWEgUehgT+nNM41W/GYo="; patches = [ ./provider-path-0_15.patch ]; passthru = { inherit plugins; }; - }); + }; # Tests that the plugins are being used. Terraform looks at the specific # file pattern and if the plugin is not found it will try to download it # from the Internet. With sandboxing enable this test will fail if that is # the case. - terraform_plugins_test = let - mainTf = writeText "main.tf" '' - resource "random_id" "test" {} - ''; - terraform = terraform_0_12.withPlugins (p: [ p.random ]); - test = - runCommand "terraform-plugin-test" { buildInputs = [ terraform ]; } '' - set -e - # make it fail outside of sandbox - export HTTP_PROXY=http://127.0.0.1:0 HTTPS_PROXY=https://127.0.0.1:0 - cp ${mainTf} main.tf - terraform init - touch $out + terraform_plugins_test = + let + mainTf = writeText "main.tf" '' + resource "random_id" "test" {} ''; - in test; + terraform = terraform_1_0.withPlugins (p: [ p.random ]); + test = + runCommand "terraform-plugin-test" { buildInputs = [ terraform ]; } '' + set -e + # make it fail outside of sandbox + export HTTP_PROXY=http://127.0.0.1:0 HTTPS_PROXY=https://127.0.0.1:0 + cp ${mainTf} main.tf + terraform init + touch $out + ''; + in + test; } |