diff --git a/internal/services/apimanagement/api_management_api_operation_policy_resource.go b/internal/services/apimanagement/api_management_api_operation_policy_resource.go index b8ee32d49614..52a3326ac016 100644 --- a/internal/services/apimanagement/api_management_api_operation_policy_resource.go +++ b/internal/services/apimanagement/api_management_api_operation_policy_resource.go @@ -39,9 +39,10 @@ func resourceApiManagementApiOperationPolicy() *pluginsdk.Resource { Delete: pluginsdk.DefaultTimeout(30 * time.Minute), }, - SchemaVersion: 1, + SchemaVersion: 2, StateUpgraders: pluginsdk.StateUpgrades(map[int]pluginsdk.StateUpgrade{ 0: migration.ApiManagementApiOperationPolicyV0ToV1{}, + 1: migration.ApiManagementApiOperationPolicyV1ToV2{}, }), Schema: map[string]*pluginsdk.Schema{ diff --git a/internal/services/apimanagement/api_management_api_policy_resource.go b/internal/services/apimanagement/api_management_api_policy_resource.go index a47542f96b0c..967847189398 100644 --- a/internal/services/apimanagement/api_management_api_policy_resource.go +++ b/internal/services/apimanagement/api_management_api_policy_resource.go @@ -39,9 +39,10 @@ func resourceApiManagementApiPolicy() *pluginsdk.Resource { Delete: pluginsdk.DefaultTimeout(30 * time.Minute), }, - SchemaVersion: 1, + SchemaVersion: 2, StateUpgraders: pluginsdk.StateUpgrades(map[int]pluginsdk.StateUpgrade{ 0: migration.ApiManagementApiPolicyV0ToV1{}, + 1: migration.ApiManagementApiPolicyV1ToV2{}, }), Schema: map[string]*pluginsdk.Schema{ diff --git a/internal/services/apimanagement/api_management_product_policy_resource.go b/internal/services/apimanagement/api_management_product_policy_resource.go index c3188a2ab9e0..fd56130c7c35 100644 --- a/internal/services/apimanagement/api_management_product_policy_resource.go +++ b/internal/services/apimanagement/api_management_product_policy_resource.go @@ -39,9 +39,10 @@ func resourceApiManagementProductPolicy() *pluginsdk.Resource { Delete: pluginsdk.DefaultTimeout(30 * time.Minute), }, - SchemaVersion: 1, + SchemaVersion: 2, StateUpgraders: pluginsdk.StateUpgrades(map[int]pluginsdk.StateUpgrade{ 0: migration.ApiManagementProductPolicyV0ToV1{}, + 1: migration.ApiManagementProductPolicyV1ToV2{}, }), Schema: map[string]*pluginsdk.Schema{ diff --git a/internal/services/apimanagement/migration/api_operation_policy_v1_to_v2.go b/internal/services/apimanagement/migration/api_operation_policy_v1_to_v2.go new file mode 100644 index 000000000000..20dbe8473a8f --- /dev/null +++ b/internal/services/apimanagement/migration/api_operation_policy_v1_to_v2.go @@ -0,0 +1,76 @@ +package migration + +import ( + "context" + "log" + "strings" + + "github.com/hashicorp/go-azure-sdk/resource-manager/apimanagement/2021-08-01/apioperationpolicy" + "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" +) + +var _ pluginsdk.StateUpgrade = ApiManagementApiOperationPolicyV1ToV2{} + +type ApiManagementApiOperationPolicyV1ToV2 struct{} + +func (ApiManagementApiOperationPolicyV1ToV2) Schema() map[string]*pluginsdk.Schema { + return map[string]*pluginsdk.Schema{ + + "resource_group_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "api_management_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "api_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "operation_id": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "xml_content": { + Type: pluginsdk.TypeString, + Optional: true, + Computed: true, + }, + + "xml_link": { + Type: pluginsdk.TypeString, + Optional: true, + }, + } +} + +func (ApiManagementApiOperationPolicyV1ToV2) UpgradeFunc() pluginsdk.StateUpgraderFunc { + return func(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { + // old id : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.ApiManagement/service/instance1/apis/api1/operations/operation1/policies/policy + // new id : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.ApiManagement/service/instance1/apis/api1/operations/operation1 + oldId := rawState["id"].(string) + + // Prior to v3.70.0 of Terraform Provider, after importing resource, the id in state file ends with "/policies/policy", the id in state file ends with "/policies/xml" for creating resource by Terraform. + // So after migrating pandora SDK (starting from v3.70.0), these two cases need to be migrated. + // In ApiManagementApiPolicyV0ToV1, only the case where the ID ends with "/policies/xml" is processed, so the case where the ID ends with "/policies/policy" is processed here to solve the parse id error. + newId := strings.TrimSuffix(oldId, "/policies/policy") + parsed, err := apioperationpolicy.ParseOperationID(newId) + if err != nil { + return rawState, err + } + newId = parsed.ID() + log.Printf("[DEBUG] Updating ID from %q to %q", oldId, newId) + rawState["id"] = newId + + return rawState, nil + } +} diff --git a/internal/services/apimanagement/migration/api_policy_v1_to_v2.go b/internal/services/apimanagement/migration/api_policy_v1_to_v2.go new file mode 100644 index 000000000000..18e73afb07ad --- /dev/null +++ b/internal/services/apimanagement/migration/api_policy_v1_to_v2.go @@ -0,0 +1,70 @@ +package migration + +import ( + "context" + "log" + "strings" + + "github.com/hashicorp/go-azure-sdk/resource-manager/apimanagement/2021-08-01/apipolicy" + "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" +) + +var _ pluginsdk.StateUpgrade = ApiManagementApiPolicyV1ToV2{} + +type ApiManagementApiPolicyV1ToV2 struct{} + +func (ApiManagementApiPolicyV1ToV2) Schema() map[string]*pluginsdk.Schema { + return map[string]*pluginsdk.Schema{ + + "resource_group_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "api_management_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "api_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "xml_content": { + Type: pluginsdk.TypeString, + Optional: true, + Computed: true, + }, + + "xml_link": { + Type: pluginsdk.TypeString, + Optional: true, + }, + } +} + +func (ApiManagementApiPolicyV1ToV2) UpgradeFunc() pluginsdk.StateUpgraderFunc { + return func(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { + // old id : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.ApiManagement/service/service1/apis/exampleId/policies/policy + // new id : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.ApiManagement/service/service1/apis/exampleId + oldId := rawState["id"].(string) + + // Prior to v3.70.0 of Terraform Provider, after importing resource, the id in state file ends with "/policies/policy", the id in state file ends with "/policies/xml" for creating resource by Terraform. + // So after migrating pandora SDK (starting from v3.70.0), these two cases need to be migrated. + // In ApiManagementApiPolicyV0ToV1, only the case where the ID ends with "/policies/xml" is processed, so the case where the ID ends with "/policies/policy" is processed here to solve the parse id error. + newId := strings.TrimSuffix(oldId, "/policies/policy") + parsed, err := apipolicy.ParseApiID(newId) + if err != nil { + return rawState, err + } + newId = parsed.ID() + log.Printf("[DEBUG] Updating ID from %q to %q", oldId, newId) + rawState["id"] = newId + + return rawState, nil + } +} diff --git a/internal/services/apimanagement/migration/api_product_policy_v1_to_v2.go b/internal/services/apimanagement/migration/api_product_policy_v1_to_v2.go new file mode 100644 index 000000000000..a74c1f10cc1d --- /dev/null +++ b/internal/services/apimanagement/migration/api_product_policy_v1_to_v2.go @@ -0,0 +1,69 @@ +package migration + +import ( + "context" + "log" + "strings" + + "github.com/hashicorp/go-azure-sdk/resource-manager/apimanagement/2021-08-01/productpolicy" + "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" +) + +var _ pluginsdk.StateUpgrade = ApiManagementProductPolicyV1ToV2{} + +type ApiManagementProductPolicyV1ToV2 struct{} + +func (ApiManagementProductPolicyV1ToV2) Schema() map[string]*pluginsdk.Schema { + return map[string]*pluginsdk.Schema{ + "resource_group_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "api_management_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "product_id": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "xml_content": { + Type: pluginsdk.TypeString, + Optional: true, + Computed: true, + }, + + "xml_link": { + Type: pluginsdk.TypeString, + Optional: true, + }, + } +} + +func (ApiManagementProductPolicyV1ToV2) UpgradeFunc() pluginsdk.StateUpgraderFunc { + return func(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { + // old id : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.ApiManagement/service/service1/products/exampleId/policies/policy + // new id : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.ApiManagement/service/service1/products/exampleId + oldId := rawState["id"].(string) + + // Prior to v3.70.0 of Terraform Provider, after importing resource, the id in state file ends with "/policies/policy", the id in state file ends with "/policies/xml" for creating resource by Terraform. + // So after migrating pandora SDK (starting from v3.70.0), these two cases need to be migrated. + // In ApiManagementApiPolicyV0ToV1, only the case where the ID ends with "/policies/xml" is processed, so the case where the ID ends with "/policies/policy" is processed here to solve the parse id error. + newId := strings.TrimSuffix(oldId, "/policies/policy") + parsed, err := productpolicy.ParseProductID(newId) + if err != nil { + return rawState, err + } + newId = parsed.ID() + log.Printf("[DEBUG] Updating ID from %q to %q", oldId, newId) + rawState["id"] = newId + + return rawState, nil + } +}