Skip to content

Commit 13f9415

Browse files
authored
Merge pull request #1006 from daftping/main
fix: add custom ExternalName handling for azurerm_policy_definition
2 parents 26ed89d + ebf0d66 commit 13f9415

1 file changed

Lines changed: 60 additions & 3 deletions

File tree

config/externalname.go

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/pkg/errors"
1515

1616
"github.com/crossplane/upjet/pkg/config"
17+
"github.com/crossplane/upjet/pkg/terraform"
1718
)
1819

1920
// TerraformPluginSDKExternalNameConfigs contains all external name configurations
@@ -892,9 +893,11 @@ var TerraformPluginSDKExternalNameConfigs = map[string]config.ExternalName{
892893
// /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example/providers/Microsoft.TimeSeriesInsights/environments/example
893894
"azurerm_iot_time_series_insights_standard_environment": config.TemplatedStringAsIdentifier("name", "/subscriptions/{{ .setup.configuration.subscription_id }}/resourceGroups/{{ .parameters.resource_group_name }}/providers/Microsoft.TimeSeriesInsights/environments/{{ .external_name }}"),
894895

895-
// azurerm_policy_definition can be imported
896-
// azurerm_policy_definition.examplePolicy /subscriptions/<SUBSCRIPTION_ID>/providers/Microsoft.Authorization/policyDefinitions/<POLICY_NAME>
897-
"azurerm_policy_definition": config.TemplatedStringAsIdentifier("name", "/subscriptions/{{ .setup.configuration.subscription_id }}/providers/Microsoft.Authorization/policyDefinitions/{{ .external_name }}"),
896+
// azurerm_policy_definition can be imported at subscription or management group level
897+
// Example IDs:
898+
// /subscriptions/<SUBSCRIPTION_ID>/providers/Microsoft.Authorization/policyDefinitions/<POLICY_NAME>
899+
// /providers/Microsoft.Management/managementgroups/<MGMT_GROUP_ID>/providers/Microsoft.Authorization/policyDefinitions/<POLICY_NAME>
900+
"azurerm_policy_definition": policyDefinitionExternalName(),
898901

899902
// alertsmanagement
900903
//
@@ -2122,6 +2125,60 @@ func mongoDatabaseBasedId(nameField string, objectType string) config.ExternalNa
21222125
}
21232126
}
21242127

2128+
// policyDefinitionExternalName returns a custom ExternalName configuration
2129+
// for azurerm_policy_definition. It supports both subscription and management
2130+
// group level policy definitions by constructing and parsing the appropriate
2131+
// Azure resource ID formats.
2132+
//
2133+
// Supported ID formats:
2134+
// - /subscriptions/<SUBSCRIPTION_ID>/providers/Microsoft.Authorization/policyDefinitions/<POLICY_NAME>
2135+
// - /providers/Microsoft.Management/managementgroups/<MGMT_GROUP_ID>/providers/Microsoft.Authorization/policyDefinitions/<POLICY_NAME>
2136+
func policyDefinitionExternalName() config.ExternalName {
2137+
return config.ExternalName{
2138+
SetIdentifierArgumentFn: func(base map[string]any, externalName string) {
2139+
base["name"] = externalName
2140+
},
2141+
2142+
GetExternalNameFn: func(tfstate map[string]interface{}) (string, error) {
2143+
id, ok := tfstate["id"]
2144+
if !ok {
2145+
return "", errors.New("cannot find 'id' in tfstate")
2146+
}
2147+
2148+
parts := strings.Split(id.(string), "/")
2149+
if len(parts) != 7 && len(parts) != 9 {
2150+
return "", errors.New("unexpected format for 'id' in tfstate")
2151+
}
2152+
return parts[len(parts)-1], nil
2153+
},
2154+
2155+
GetIDFn: func(_ context.Context, externalName string, parameters map[string]interface{}, terraformProviderConfig map[string]interface{}) (string, error) {
2156+
// Management group level
2157+
if mg, ok := parameters["management_group_id"]; ok {
2158+
if mgStr, ok := mg.(string); ok && mgStr != "" {
2159+
return fmt.Sprintf("%s/providers/Microsoft.Authorization/policyDefinitions/%s", mgStr, externalName), nil
2160+
}
2161+
}
2162+
2163+
// Subscription level
2164+
conf, ok := terraformProviderConfig["configuration"].(terraform.ProviderConfiguration)
2165+
if !ok {
2166+
return "", errors.New("terraform provider configuration is not a map")
2167+
}
2168+
subID, ok := conf["subscription_id"].(string)
2169+
if !ok || subID == "" {
2170+
return "", errors.New("unable to extract 'subscription_id' from provider configuration")
2171+
}
2172+
2173+
return fmt.Sprintf("/subscriptions/%s/providers/Microsoft.Authorization/policyDefinitions/%s", subID, externalName), nil
2174+
},
2175+
OmittedFields: []string{
2176+
"name",
2177+
"name_prefix",
2178+
},
2179+
}
2180+
}
2181+
21252182
// ResourceConfigurator applies all external name configs
21262183
// listed in the table TerraformPluginSDKExternalNameConfigs and
21272184
// CLIReconciledExternalNameConfigs and sets the version

0 commit comments

Comments
 (0)