diff --git a/engines/terraform/deployment.go b/engines/terraform/deployment.go index 3e8c160..0f658e8 100644 --- a/engines/terraform/deployment.go +++ b/engines/terraform/deployment.go @@ -28,6 +28,7 @@ type TerraformDeployment struct { identityBlueprints map[string]*ResourceBlueprint terraformVariables map[string]cdktf.TerraformVariable instancedTerraformVariables map[string]map[string]cdktf.TerraformVariable + sugaProperties map[string]interface{} } func NewTerraformDeployment(engine *TerraformEngine, stackName string) *TerraformDeployment { @@ -60,6 +61,9 @@ func NewTerraformDeployment(engine *TerraformEngine, stackName string) *Terrafor terraformVariables: map[string]cdktf.TerraformVariable{}, instancedTerraformVariables: map[string]map[string]cdktf.TerraformVariable{}, serviceIdentities: map[string]map[string]interface{}{}, + sugaProperties: map[string]interface{}{ + "stack_id": stackId.Result(), + }, } } diff --git a/engines/terraform/resolve.go b/engines/terraform/resolve.go index 78cbf73..fbbd23c 100644 --- a/engines/terraform/resolve.go +++ b/engines/terraform/resolve.go @@ -124,6 +124,26 @@ func (td *TerraformDeployment) resolveToken(intentName string, specRef *SpecRefe } return tfVariable.Value(), nil + case "suga": + if len(specRef.Path) < 1 { + return nil, fmt.Errorf("suga reference requires at least 1 path component (e.g., suga.stack_id)") + } + + propertyName := specRef.Path[0] + + value, ok := td.sugaProperties[propertyName] + if !ok { + availableProps := slices.Collect(maps.Keys(td.sugaProperties)) + return nil, fmt.Errorf("suga property '%s' does not exist. Available properties are: %v", propertyName, availableProps) + } + + // If there are nested path components, we don't support that for suga properties currently + if len(specRef.Path) > 1 { + return nil, fmt.Errorf("nested property access is not supported for suga properties (attempted: suga.%s)", strings.Join(specRef.Path, ".")) + } + + return value, nil + default: return nil, fmt.Errorf("unknown reference source '%s'", specRef.Source) } diff --git a/engines/terraform/token.go b/engines/terraform/token.go index 6875176..692ce80 100644 --- a/engines/terraform/token.go +++ b/engines/terraform/token.go @@ -45,5 +45,5 @@ func isOnlyToken(input string) bool { return strings.TrimSpace(input) == strings.TrimSpace(allTokensPattern.FindString(input)) } -var tokenPattern = regexp.MustCompile(`((?:infra|var|self)\.[a-zA-Z_\-][a-zA-Z0-9_\-\.]*)`) -var allTokensPattern = regexp.MustCompile(`((?:infra|var|self)\.[a-zA-Z_\-][a-zA-Z0-9_\-\.]*)`) +var tokenPattern = regexp.MustCompile(`((?:infra|var|self|suga)\.[a-zA-Z_\-][a-zA-Z0-9_\-\.]*)`) +var allTokensPattern = regexp.MustCompile(`((?:infra|var|self|suga)\.[a-zA-Z_\-][a-zA-Z0-9_\-\.]*)`)