@@ -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