Commit 9eba26a3 authored by nimrod's avatar nimrod
Browse files

Rewrite tf in Python.

There's an issue with tf import because the options (-var-file=...) must
precede the other arguments (resource name and ID). Writing it in POSIX
shell without arrays is going to be a mess. I can probably write it in
Bash but I prefer Python so here we are. I also feel it's a bit more
readable.
parent 942b5a70
Loading
Loading
Loading
Loading
+43 −27
Original line number Diff line number Diff line
#!/bin/sh
set -eu
#!/usr/bin/env python3
"""Terraform wrapper to include a variable file is one exists that matches the workspace name"""  # noqa: E501

# A wrapper for Terraform to include a variables file if one exists that matches
# the workspace name (on commands that support that).
import glob
import os
import pathlib
import subprocess  # nosec
import sys

workspace="$(terraform workspace show)"
if [ ! -f "$workspace.tfvars" ] && [ ! -d "$workspace" ]
then
    exec terraform "$@"
fi
TF_COMMANDS_TO_MODIFY = ["plan", "console", "import", "refresh"]

for arg in "$@"
do
    if [ "$arg" = "plan" ] || [ "$arg" = "console" ] || [ "$arg" = "import" ] ||
        [ "$arg" = "refresh" ]
    then
        additional_args=''
        if [ -f "$workspace.tfvars" ]
        then
            additional_args="$additional_args -var-file=$workspace.tfvars"
        fi
        if [ -d "$workspace" ]
        then
            additional_args="$additional_args $(find "$workspace" -type f -name '*.tfvars' -exec printf '-var-file=%s ' {} \;)"
        fi
    fi
done

# shellcheck disable=SC2086
exec terraform "$@" ${additional_args:-}
def get_workspace():
    """Return the Terraform workspace."""
    proc = subprocess.run(  # nosec
        ["terraform", "workspace", "show"],
        capture_output=True,
        check=True,
        text=True,
    )
    return proc.stdout.strip()


if __name__ == "__main__":
    if len(sys.argv) == 1:
        os.execlp("terraform", "terraform")  # nosec
    for command in TF_COMMANDS_TO_MODIFY:
        if command in sys.argv:
            break
    else:
        args = sys.argv[:]
        args[0] = "terraform"
        os.execvp("terraform", args)  # nosec

    args = sys.argv[:]
    args[0] = "terraform"
    command_index = args.index(command)
    workspace = get_workspace()
    var_file = pathlib.Path(f"{workspace}.tfvars")
    var_dir = pathlib.Path(workspace)
    if var_file.exists() and var_file.is_file():
        args.insert(command_index + 1, f"-var-file={var_file}")
    elif var_dir.exists() and var_dir.is_dir():
        for var_file in glob.glob(f"{var_dir}/*.tfvars"):
            args.insert(command_index + 1, f"-var-file={var_file}")
    print(args, file=sys.stderr)
    os.execvp("terraform", args)  # nosec