Skip to content

Commit

Permalink
parameterize attributes to allow both terraform and (default) opentofu
Browse files Browse the repository at this point in the history
  • Loading branch information
KiaraGrouwstra committed Dec 31, 2024
1 parent e5d2f44 commit 648b868
Showing 1 changed file with 67 additions and 50 deletions.
117 changes: 67 additions & 50 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@

pkgs = import inputs.nixpkgs {
localSystem = { inherit system; };
# config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
# "terraform"
# ];
config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
"terraform"
];
overlays = [
(import inputs.rust-overlay)
];
Expand Down Expand Up @@ -136,13 +136,13 @@
]
);

release = pkgs.runCommand "release-tarball"
getRelease = terraform: pkgs.runCommand "release-tarball"
{
nativeBuildInputs = [ pkgs.pixz ];
} ''
mkdir -p $out
mkdir tf-ncl
${lib.concatLines (lib.flip lib.mapAttrsToList inputs.self.schemas.${system} (provider: schema: ''
${lib.concatLines (lib.flip lib.mapAttrsToList (getSchemas terraform) (provider: schema: ''
cp ${schema} tf-ncl/${provider}.ncl
''))}
tar --sort=name --mtime='@1' --owner=0 --group=0 --numeric-owner -c tf-ncl/*.ncl | pixz -t > $out/tf-ncl.tar.xz
Expand All @@ -162,10 +162,9 @@
set -e -x
${lib.concatMapStringsSep "\n" (tmpl: "${test-single-example tmpl}") (lib.attrNames self.templates)}
'';
in
{
checks =
self.schemas.${system} //

getChecks = terraform:
(getSchemas terraform) //
(lib.mapAttrs'
(name: drv: lib.nameValuePair "check-${name}" (
let
Expand All @@ -190,61 +189,56 @@
${inputs.nickel.packages.${system}.default}/bin/nickel export -f ${conf} > $out
''
))
self.schemas.${system}) //
(getSchemas terraform)) //
{
inherit tf-ncl schema-merge pre-commit;
};

packages = {
getPackages = terraform: {
default = tf-ncl;
terraform = pkgs.opentofu;
inherit tf-ncl schema-merge release test-examples;
} // lib.mapAttrs' (name: value: lib.nameValuePair "schema-${name}" value) self.schemas.${system};

inherit terraformProviders;
inherit terraform tf-ncl schema-merge test-examples;
release = getRelease terraform;
} // lib.mapAttrs' (name: value: lib.nameValuePair "schema-${name}" value) (getSchemas terraform);

generateJsonSchema = providerFn: pkgs.callPackage
generateJsonSchema = terraform: providerFn: pkgs.callPackage
(import ./nix/terraform_schema.nix (providerFn terraformProviders))
{ inherit (self.packages.${system}) terraform schema-merge; };
{ inherit terraform; inherit (getPackages terraform) schema-merge; };

generateSchema = providerFn: pkgs.callPackage
generateSchema = terraform: providerFn: pkgs.callPackage
./nix/nickel_schema.nix
{ jsonSchema = self.generateJsonSchema.${system} providerFn; inherit (self.packages.${system}) tf-ncl; };
{ jsonSchema = (generateJsonSchema terraform) providerFn; inherit (getPackages terraform) tf-ncl; };

schemas = lib.mapAttrs
(name: p: self.generateSchema.${system} (_: { ${name} = p; }))
getSchemas = terraform: lib.mapAttrs
(name: p: (generateSchema terraform) (_: { ${name} = p; }))
terraformProviders;

lib = {
mkDevShell =
args: pkgs.mkShell {
buildInputs = lib.attrValues
(pkgs.callPackage ./nix/devshell.nix
{
generateSchema = self.generateSchema.${system};
nickel = inputs.nickel.packages.${system}.nickel-lang-cli;
inherit (self.packages.${system}) terraform;
}
args) ++ [
inputs.nickel.packages.${system}.default
inputs.topiary.packages.${system}.default
];
shellHook = ''
cat <<EOF
* Use 'link-schema' to produce 'tf-ncl-schema.ncl'
* Use 'run-nickel' to evaluate 'main.ncl' to a Terraform deployment
* Use 'run-terraform' to first evaluate 'main.ncl' and then run Terraform on the result
EOF
'';
};
};
mkDevShell = terraform:
args: pkgs.mkShell {
buildInputs = lib.attrValues
(pkgs.callPackage ./nix/devshell.nix
{
generateSchema = generateSchema terraform;
nickel = inputs.nickel.packages.${system}.nickel-lang-cli;
inherit terraform;
}
args) ++ [
inputs.nickel.packages.${system}.default
inputs.topiary.packages.${system}.default
];
shellHook = ''
cat <<EOF
* Use 'link-schema' to produce 'tf-ncl-schema.ncl'
* Use 'run-nickel' to evaluate 'main.ncl' to a Terraform deployment
* Use 'run-terraform' to first evaluate 'main.ncl' and then run Terraform on the result
EOF
'';
};

devShells.default = pkgs.mkShell {
inputsFrom = builtins.attrValues self.checks;
buildInputs = with pkgs; [
getDevShell = terraform: pkgs.mkShell {
inputsFrom = builtins.attrValues (getChecks terraform);
buildInputs = [ terraform ] ++ (with pkgs; [
cargo
rustc
self.packages.terraform
inputs.nickel.packages.${system}.default
rust-analyzer
rustfmt
Expand All @@ -257,11 +251,34 @@
gotools
go-tools
gofumpt
];
]);
shellHook = ''
${pre-commit.shellHook}
'';
};

tf = {
inherit (pkgs) terraform opentofu;
};
in
{
inherit terraformProviders;

packages = getPackages tf.opentofu;

checks = getChecks tf.opentofu;

lib = {
mkDevShell-terraform = mkDevShell tf.terraform;
mkDevShell-opentofu = mkDevShell tf.opentofu;
mkDevShell = mkDevShell tf.opentofu;
};

devShells = rec {
terraform = getDevShell tf.terraform;
opentofu = getDevShell tf.opentofu;
default = opentofu;
};
}) // {
templates = rec {
hello-tf = {
Expand Down

0 comments on commit 648b868

Please sign in to comment.