TERRAFORM_ARGS_IMPROVEMENT.md
Enhanced the argument handling system to support stage-specific CLI arguments for Terraform tasks. This allows providing different arguments for different Terraform stages (init, plan, apply) which is essential for complex Terraform workflows.
db_lib/LocalApp.go)Unified to use map-based arguments with "default" key for backward compatibility:
type LocalAppRunningArgs struct {
CliArgs map[string][]string // Stage-specific args (e.g., "init", "apply", "default")
EnvironmentVars []string
Inputs map[string]string
TaskParams any
TemplateParams any
Callback func(*os.Process)
}
Key Change: Array format arguments are automatically converted to map format with key "default".
services/tasks/LocalJob.go)Added convertArgsJSONIfArray() and getCLIArgsMap() functions that:
convertArgsJSONIfArray(): Checks JSON format and converts array format to map with "default" key in-placegetCLIArgsMap(): Parses arguments as map format (after conversion)services/tasks/LocalJob.go)Updated getTerraformArgs() to:
db_lib/TerraformApp.go)Modified Terraform execution to:
InstallRequirementsWithInitArgs() for init customizationservices/tasks/LocalJob.go)Enhanced Run() method to:
Array format arguments are automatically converted to map with "default" key:
{
"arguments": ["-var", "environment=production"]
}
Internally converted to:
{
"arguments": {
"default": ["-var", "environment=production"]
}
}
Stage-specific arguments for different Terraform operations:
{
"arguments": {
"init": ["-upgrade"],
"plan": ["-var", "foo=bar"],
"apply": ["-var", "foo=baz"]
}
}
Template with stage-specific configurations:
{
"template": {
"arguments": {
"init": ["-backend-config=bucket=my-bucket"],
"plan": ["-out=tfplan"],
"apply": ["tfplan"]
}
}
}
Task override combining with template args:
{
"task": {
"arguments": {
"init": ["-reconfigure"],
"apply": ["-auto-approve"]
}
}
}
Result: Arguments are merged per stage
-backend-config=bucket=my-bucket, -reconfigure-out=tfplantfplan, -auto-approve✅ 100% Backward Compatible
getCLIArgsMap(): Parses both formats from JSONgetTerraformArgs(): Builds stage-specific argument mapsprepareRunTerraform(): Passes init args to Terraform installationTerraformApp.Run(): Uses plan/apply-specific args during executionterraform init (via InstallRequirements)terraform planterraform applyFor each stage, arguments are resolved in this order:
Array Format → Map Conversion:
["-var", "foo=bar"] is converted to {"default": ["-var", "foo=bar"]} in-place when the task runsThe implementation has been validated with:
{"arguments": ["-var", "foo=bar"]}
Result: Automatically converted to {"default": ["-var", "foo=bar"]} internally
{"arguments": {"init": ["-upgrade"], "apply": ["-var", "foo=bar"]}}
Result: Uses stage-specific args for init and apply
{
"arguments": {
"default": ["-var", "common=value"],
"init": ["-upgrade"],
"apply": ["-parallelism=20"]
}
}
Result: plan stage uses "default" args, init and apply use their specific args
{
"arguments": {
"init": ["-backend-config=..."],
"plan": ["-out=tfplan", "-var-file=prod.tfvars"],
"apply": ["tfplan", "-parallelism=20"]
}
}
Result: Complete control over each stage independently