Skip to content

Commit

Permalink
azurerm_spring_cloud_(customized)_accelerator - state migration to …
Browse files Browse the repository at this point in the history
…fix the ID casing (#23749)

* `azurerm_spring_cloud_accelerator`, `azurerm_spring_cloud_customized_accelerator` - state migration to fix the ID casing

* condense the migration schema
  • Loading branch information
ms-henglu committed Nov 1, 2023
1 parent 57563ea commit b0a9a94
Show file tree
Hide file tree
Showing 13 changed files with 655 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package migration

import (
"context"
"log"

"github.com/hashicorp/terraform-provider-azurerm/internal/services/springcloud/parse"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
)

type SpringCloudCustomizedAcceleratorV0ToV1 struct{}

func (s SpringCloudCustomizedAcceleratorV0ToV1) Schema() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{
"name": {
Type: pluginsdk.TypeString,
Required: true,
},

"spring_cloud_accelerator_id": {
Type: pluginsdk.TypeString,
Required: true,
},

"git_repository": {
Type: pluginsdk.TypeList,
Required: true,
Elem: &pluginsdk.Resource{
Schema: map[string]*pluginsdk.Schema{
"url": {
Type: pluginsdk.TypeString,
Required: true,
},

"basic_auth": {
Type: pluginsdk.TypeList,
Optional: true,
Elem: &pluginsdk.Resource{
Schema: map[string]*pluginsdk.Schema{
"username": {
Type: pluginsdk.TypeString,
Required: true,
},

"password": {
Type: pluginsdk.TypeString,
Required: true,
},
},
},
},

"ssh_auth": {
Type: pluginsdk.TypeList,
Optional: true,
Elem: &pluginsdk.Resource{
Schema: map[string]*pluginsdk.Schema{
"private_key": {
Type: pluginsdk.TypeString,
Required: true,
},

"host_key": {
Type: pluginsdk.TypeString,
Optional: true,
},

"host_key_algorithm": {
Type: pluginsdk.TypeString,
Optional: true,
},
},
},
},

"branch": {
Type: pluginsdk.TypeString,
Optional: true,
},

"ca_certificate_id": {
Type: pluginsdk.TypeString,
Optional: true,
},

"commit": {
Type: pluginsdk.TypeString,
Optional: true,
},

"git_tag": {
Type: pluginsdk.TypeString,
Optional: true,
},

"interval_in_seconds": {
Type: pluginsdk.TypeInt,
Optional: true,
},
},
},
},

"accelerator_tags": {
Type: pluginsdk.TypeList,
Optional: true,
Elem: &pluginsdk.Schema{
Type: pluginsdk.TypeString,
},
},

"description": {
Type: pluginsdk.TypeString,
Optional: true,
},

"display_name": {
Type: pluginsdk.TypeString,
Optional: true,
},

"icon_url": {
Type: pluginsdk.TypeString,
Optional: true,
},
}
}

func (s SpringCloudCustomizedAcceleratorV0ToV1) UpgradeFunc() pluginsdk.StateUpgraderFunc {
return func(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) {
oldId := rawState["id"].(string)
newId, err := parse.SpringCloudCustomizedAcceleratorIDInsensitively(oldId)
if err != nil {
return nil, err
}

log.Printf("[DEBUG] Updating ID from %q to %q", oldId, newId)

rawState["id"] = newId.ID()
return rawState, nil
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package migration

import (
"context"
"log"

"github.com/hashicorp/terraform-provider-azurerm/internal/services/springcloud/parse"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
)

type SpringCloudAcceleratorV0ToV1 struct{}

func (s SpringCloudAcceleratorV0ToV1) Schema() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{
"name": {
Type: pluginsdk.TypeString,
Required: true,
},

"spring_cloud_service_id": {
Type: pluginsdk.TypeString,
Required: true,
},
}
}

func (s SpringCloudAcceleratorV0ToV1) UpgradeFunc() pluginsdk.StateUpgraderFunc {
return func(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) {
oldId := rawState["id"].(string)
newId, err := parse.SpringCloudAcceleratorIDInsensitively(oldId)
if err != nil {
return nil, err
}

log.Printf("[DEBUG] Updating ID from %q to %q", oldId, newId)

rawState["id"] = newId.ID()
return rawState, nil
}
}
60 changes: 58 additions & 2 deletions internal/services/springcloud/parse/spring_cloud_accelerator.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (id SpringCloudAcceleratorId) String() string {
}

func (id SpringCloudAcceleratorId) ID() string {
fmtString := "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.AppPlatform/Spring/%s/applicationAccelerators/%s"
fmtString := "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.AppPlatform/spring/%s/applicationAccelerators/%s"
return fmt.Sprintf(fmtString, id.SubscriptionId, id.ResourceGroup, id.SpringName, id.ApplicationAcceleratorName)
}

Expand All @@ -63,7 +63,7 @@ func SpringCloudAcceleratorID(input string) (*SpringCloudAcceleratorId, error) {
return nil, fmt.Errorf("ID was missing the 'resourceGroups' element")
}

if resourceId.SpringName, err = id.PopSegment("Spring"); err != nil {
if resourceId.SpringName, err = id.PopSegment("spring"); err != nil {
return nil, err
}
if resourceId.ApplicationAcceleratorName, err = id.PopSegment("applicationAccelerators"); err != nil {
Expand All @@ -76,3 +76,59 @@ func SpringCloudAcceleratorID(input string) (*SpringCloudAcceleratorId, error) {

return &resourceId, nil
}

// SpringCloudAcceleratorIDInsensitively parses an SpringCloudAccelerator ID into an SpringCloudAcceleratorId struct, insensitively
// This should only be used to parse an ID for rewriting, the SpringCloudAcceleratorID
// method should be used instead for validation etc.
//
// Whilst this may seem strange, this enables Terraform have consistent casing
// which works around issues in Core, whilst handling broken API responses.
func SpringCloudAcceleratorIDInsensitively(input string) (*SpringCloudAcceleratorId, error) {
id, err := resourceids.ParseAzureResourceID(input)
if err != nil {
return nil, err
}

resourceId := SpringCloudAcceleratorId{
SubscriptionId: id.SubscriptionID,
ResourceGroup: id.ResourceGroup,
}

if resourceId.SubscriptionId == "" {
return nil, fmt.Errorf("ID was missing the 'subscriptions' element")
}

if resourceId.ResourceGroup == "" {
return nil, fmt.Errorf("ID was missing the 'resourceGroups' element")
}

// find the correct casing for the 'spring' segment
springKey := "spring"
for key := range id.Path {
if strings.EqualFold(key, springKey) {
springKey = key
break
}
}
if resourceId.SpringName, err = id.PopSegment(springKey); err != nil {
return nil, err
}

// find the correct casing for the 'applicationAccelerators' segment
applicationAcceleratorsKey := "applicationAccelerators"
for key := range id.Path {
if strings.EqualFold(key, applicationAcceleratorsKey) {
applicationAcceleratorsKey = key
break
}
}
if resourceId.ApplicationAcceleratorName, err = id.PopSegment(applicationAcceleratorsKey); err != nil {
return nil, err
}

if err := id.ValidateNoEmptySegments(input); err != nil {
return nil, err
}

return &resourceId, nil
}
Loading

0 comments on commit b0a9a94

Please sign in to comment.