Skip to content
This repository was archived by the owner on Mar 17, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions engines/terraform/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ func (td *TerraformDeployment) resolveInfraResource(infraName string) (cdktf.Ter
return nil, err
}

td.createVariablesForIntent(infraName, resource)

td.terraformInfraResources[infraName] = cdktf.NewTerraformHclModule(td.stack, jsii.String(infraName), &cdktf.TerraformHclModuleConfig{
Source: jsii.String(pluginRef.Deployment.Terraform),
})
Expand Down
8 changes: 5 additions & 3 deletions engines/terraform/resolve.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,13 @@ func (td *TerraformDeployment) resolveDependencies(resource *ResourceBlueprint,
return fmt.Errorf("depends_on can only reference infra resources")
}

if _, ok := td.terraformInfraResources[specRef.Path[0]]; !ok {
continue
// Ensure the infra resource is created if it doesn't exist
infraResource, err := td.resolveInfraResource(specRef.Path[0])
if err != nil {
return fmt.Errorf("failed to resolve infra resource %s: %w", specRef.Path[0], err)
}

moduleId := fmt.Sprintf("module.%s", *td.terraformInfraResources[specRef.Path[0]].Node().Id())
moduleId := fmt.Sprintf("module.%s", *infraResource.Node().Id())
dependsOnResources = append(dependsOnResources, jsii.String(moduleId))
}
module.SetDependsOn(&dependsOnResources)
Expand Down
26 changes: 13 additions & 13 deletions engines/terraform/terraform.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,53 +151,53 @@ func (e *TerraformEngine) Apply(appSpec *app_spec_schema.Application) (result st
}
}

// Resolve resource tokens for all created resources
// Resolve dependencies first to ensure all infra resources are created
resourceIntents := appSpec.GetResourceIntents()
for resourceName, resourceIntent := range resourceIntents {
resourceSpec, err := e.platform.GetResourceBlueprint(resourceIntent.GetType(), resourceIntent.GetSubType())
for resourceName, resource := range resourceIntents {
resourceSpec, err := e.platform.GetResourceBlueprint(resource.GetType(), resource.GetSubType())
if err != nil {
return "", err
}

err = tfDeployment.resolveTokensForModule(resourceName, resourceSpec, tfDeployment.terraformResources[resourceName])
err = tfDeployment.resolveDependencies(resourceSpec, tfDeployment.terraformResources[resourceName])
if err != nil {
return "", err
}
}

// Resolve infra tokens
// Resolve dependencies for all created infrastructure
for infraName, infra := range tfDeployment.terraformInfraResources {
infraSpec, ok := e.platform.InfraSpecs[infraName]
if !ok {
return "", fmt.Errorf("infra resource %s not found", infraName)
}
err := tfDeployment.resolveTokensForModule(infraName, infraSpec, infra)

err := tfDeployment.resolveDependencies(infraSpec, infra)
if err != nil {
return "", err
}
}

// Resolve dependencies for all created modules
for resourceName, resource := range resourceIntents {
resourceSpec, err := e.platform.GetResourceBlueprint(resource.GetType(), resource.GetSubType())
// Now resolve tokens for all resources (after all infra resources have been created)
for resourceName, resourceIntent := range resourceIntents {
resourceSpec, err := e.platform.GetResourceBlueprint(resourceIntent.GetType(), resourceIntent.GetSubType())
if err != nil {
return "", err
}

err = tfDeployment.resolveDependencies(resourceSpec, tfDeployment.terraformResources[resourceName])
err = tfDeployment.resolveTokensForModule(resourceName, resourceSpec, tfDeployment.terraformResources[resourceName])
if err != nil {
return "", err
}
}

// Resolve dependencies for all created infrastructure
// Resolve infra tokens
for infraName, infra := range tfDeployment.terraformInfraResources {
infraSpec, ok := e.platform.InfraSpecs[infraName]
if !ok {
return "", fmt.Errorf("infra resource %s not found", infraName)
}

err := tfDeployment.resolveDependencies(infraSpec, infra)
err := tfDeployment.resolveTokensForModule(infraName, infraSpec, infra)
if err != nil {
return "", err
}
Expand Down
Loading