Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
No related merge requests found
#!/bin/sh #!/usr/bin/env python3
set -eu """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 import glob
# the workspace name (on commands that support that). import os
import pathlib
import subprocess # nosec
import sys
workspace="$(terraform workspace show)" TF_COMMANDS_TO_MODIFY = ["plan", "console", "import", "refresh"]
if [ ! -f "$workspace.tfvars" ] && [ ! -d "$workspace" ]
then
exec terraform "$@"
fi
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 def get_workspace():
exec terraform "$@" ${additional_args:-} """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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment