Skip to content

Commit

Permalink
network -read id-style property case-insensitively (#20605)
Browse files Browse the repository at this point in the history
  • Loading branch information
myc2h6o committed Feb 22, 2023
1 parent 81232fd commit 41ec776
Show file tree
Hide file tree
Showing 51 changed files with 4,022 additions and 52 deletions.
56 changes: 56 additions & 0 deletions internal/services/compute/parse/vmss_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,59 @@ func VMSSInstanceID(input string) (*VMSSInstanceId, error) {

return &resourceId, nil
}

// VMSSInstanceIDInsensitively parses an VMSSInstance ID into an VMSSInstanceId struct, insensitively
// This should only be used to parse an ID for rewriting, the VMSSInstanceID
// 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 VMSSInstanceIDInsensitively(input string) (*VMSSInstanceId, error) {
id, err := resourceids.ParseAzureResourceID(input)
if err != nil {
return nil, err
}

resourceId := VMSSInstanceId{
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 'virtualMachineScaleSets' segment
virtualMachineScaleSetsKey := "virtualMachineScaleSets"
for key := range id.Path {
if strings.EqualFold(key, virtualMachineScaleSetsKey) {
virtualMachineScaleSetsKey = key
break
}
}
if resourceId.VirtualMachineScaleSetName, err = id.PopSegment(virtualMachineScaleSetsKey); err != nil {
return nil, err
}

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

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

return &resourceId, nil
}
136 changes: 136 additions & 0 deletions internal/services/compute/parse/vmss_instance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,139 @@ func TestVMSSInstanceID(t *testing.T) {
}
}
}

func TestVMSSInstanceIDInsensitively(t *testing.T) {
testData := []struct {
Input string
Error bool
Expected *VMSSInstanceId
}{

{
// empty
Input: "",
Error: true,
},

{
// missing SubscriptionId
Input: "/",
Error: true,
},

{
// missing value for SubscriptionId
Input: "/subscriptions/",
Error: true,
},

{
// missing ResourceGroup
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/",
Error: true,
},

{
// missing value for ResourceGroup
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/",
Error: true,
},

{
// missing VirtualMachineScaleSetName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/",
Error: true,
},

{
// missing value for VirtualMachineScaleSetName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/virtualMachineScaleSets/",
Error: true,
},

{
// missing VirtualMachineName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/virtualMachineScaleSets/vmss1/",
Error: true,
},

{
// missing value for VirtualMachineName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/virtualMachineScaleSets/vmss1/virtualMachines/",
Error: true,
},

{
// valid
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/virtualMachineScaleSets/vmss1/virtualMachines/vm1",
Expected: &VMSSInstanceId{
SubscriptionId: "12345678-1234-9876-4563-123456789012",
ResourceGroup: "resGroup1",
VirtualMachineScaleSetName: "vmss1",
VirtualMachineName: "vm1",
},
},

{
// lower-cased segment names
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/virtualmachinescalesets/vmss1/virtualmachines/vm1",
Expected: &VMSSInstanceId{
SubscriptionId: "12345678-1234-9876-4563-123456789012",
ResourceGroup: "resGroup1",
VirtualMachineScaleSetName: "vmss1",
VirtualMachineName: "vm1",
},
},

{
// upper-cased segment names
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/VIRTUALMACHINESCALESETS/vmss1/VIRTUALMACHINES/vm1",
Expected: &VMSSInstanceId{
SubscriptionId: "12345678-1234-9876-4563-123456789012",
ResourceGroup: "resGroup1",
VirtualMachineScaleSetName: "vmss1",
VirtualMachineName: "vm1",
},
},

{
// mixed-cased segment names
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/ViRtUaLmAcHiNeScAlEsEtS/vmss1/ViRtUaLmAcHiNeS/vm1",
Expected: &VMSSInstanceId{
SubscriptionId: "12345678-1234-9876-4563-123456789012",
ResourceGroup: "resGroup1",
VirtualMachineScaleSetName: "vmss1",
VirtualMachineName: "vm1",
},
},
}

for _, v := range testData {
t.Logf("[DEBUG] Testing %q", v.Input)

actual, err := VMSSInstanceIDInsensitively(v.Input)
if err != nil {
if v.Error {
continue
}

t.Fatalf("Expect a value but got an error: %s", err)
}
if v.Error {
t.Fatal("Expect an error but didn't get one")
}

if actual.SubscriptionId != v.Expected.SubscriptionId {
t.Fatalf("Expected %q but got %q for SubscriptionId", v.Expected.SubscriptionId, actual.SubscriptionId)
}
if actual.ResourceGroup != v.Expected.ResourceGroup {
t.Fatalf("Expected %q but got %q for ResourceGroup", v.Expected.ResourceGroup, actual.ResourceGroup)
}
if actual.VirtualMachineScaleSetName != v.Expected.VirtualMachineScaleSetName {
t.Fatalf("Expected %q but got %q for VirtualMachineScaleSetName", v.Expected.VirtualMachineScaleSetName, actual.VirtualMachineScaleSetName)
}
if actual.VirtualMachineName != v.Expected.VirtualMachineName {
t.Fatalf("Expected %q but got %q for VirtualMachineName", v.Expected.VirtualMachineName, actual.VirtualMachineName)
}
}
}
2 changes: 1 addition & 1 deletion internal/services/compute/resourceids.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ package compute
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=DataDisk -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/group1/providers/Microsoft.Compute/virtualMachines/machine1/dataDisks/disk1
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=Plan -id=/subscriptions/12345678-1234-9876-4563-123456789012/providers/Microsoft.MarketplaceOrdering/agreements/agreement1/offers/offer1/plans/hourly
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=HostGroup -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/group1/providers/Microsoft.Compute/hostGroups/hostgroup1
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=VMSSInstance -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/virtualMachineScaleSets/vmss1/virtualMachines/vm1
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=VMSSInstance -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Compute/virtualMachineScaleSets/vmss1/virtualMachines/vm1 -rewrite=true

0 comments on commit 41ec776

Please sign in to comment.