Skip to content

Commit a7062da

Browse files
Add retaining unchanged alias ip ranges and handle permadiff caused by the change (#11321) (#7898)
[upstream:8fbe154440c88dc24388746f2a1cd48929a293a3] Signed-off-by: Modular Magician <[email protected]>
1 parent 09b2f8a commit a7062da

File tree

5 files changed

+303
-9
lines changed

5 files changed

+303
-9
lines changed

.changelog/11321.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
compute: fixed maintaining unchanged `alias_ip_range` in `compute_instance` in between PATCH API calls and handled permadiff caused by the change
3+
```

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ require (
2626
github.com/mitchellh/go-homedir v1.1.0
2727
github.com/mitchellh/hashstructure v1.1.0
2828
github.com/sirupsen/logrus v1.8.1
29+
github.com/stretchr/testify v1.9.0
2930
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba
3031
golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8
3132
golang.org/x/net v0.27.0
@@ -90,6 +91,7 @@ require (
9091
github.com/mitchellh/mapstructure v1.5.0 // indirect
9192
github.com/mitchellh/reflectwalk v1.0.2 // indirect
9293
github.com/oklog/run v1.0.0 // indirect
94+
github.com/pmezard/go-difflib v1.0.0 // indirect
9395
github.com/rogpeppe/go-internal v1.12.0 // indirect
9496
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
9597
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
@@ -114,4 +116,5 @@ require (
114116
google.golang.org/genproto v0.0.0-20240730163845-b1a4ccb954bf // indirect
115117
google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f // indirect
116118
gopkg.in/yaml.v2 v2.4.0 // indirect
119+
gopkg.in/yaml.v3 v3.0.1 // indirect
117120
)

google-beta/services/compute/compute_instance_helpers.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,28 @@ func expandAliasIpRanges(ranges []interface{}) []*compute.AliasIpRange {
5151
return ipRanges
5252
}
5353

54-
func flattenAliasIpRange(ranges []*compute.AliasIpRange) []map[string]interface{} {
55-
rangesSchema := make([]map[string]interface{}, 0, len(ranges))
54+
func flattenAliasIpRange(d *schema.ResourceData, ranges []*compute.AliasIpRange, i int) []map[string]interface{} {
55+
prefix := fmt.Sprintf("network_interface.%d", i)
56+
57+
configData := []map[string]interface{}{}
58+
for _, item := range d.Get(prefix + ".alias_ip_range").([]interface{}) {
59+
configData = append(configData, item.(map[string]interface{}))
60+
}
61+
62+
apiData := make([]map[string]interface{}, 0, len(ranges))
5663
for _, ipRange := range ranges {
57-
rangesSchema = append(rangesSchema, map[string]interface{}{
64+
apiData = append(apiData, map[string]interface{}{
5865
"ip_cidr_range": ipRange.IpCidrRange,
5966
"subnetwork_range_name": ipRange.SubnetworkRangeName,
6067
})
6168
}
62-
return rangesSchema
69+
70+
//permadiff fix
71+
sorted, err := tpgresource.SortMapsByConfigOrder(configData, apiData, "ip_cidr_range")
72+
if err != nil {
73+
return apiData
74+
}
75+
return sorted
6376
}
6477

6578
func expandScheduling(v interface{}) (*compute.Scheduling, error) {
@@ -376,7 +389,7 @@ func flattenNetworkInterfaces(d *schema.ResourceData, config *transport_tpg.Conf
376389
"subnetwork": tpgresource.ConvertSelfLinkToV1(iface.Subnetwork),
377390
"subnetwork_project": subnet.Project,
378391
"access_config": ac,
379-
"alias_ip_range": flattenAliasIpRange(iface.AliasIpRanges),
392+
"alias_ip_range": flattenAliasIpRange(d, iface.AliasIpRanges, i),
380393
"nic_type": iface.NicType,
381394
"stack_type": iface.StackType,
382395
"ipv6_access_config": flattenIpv6AccessConfigs(iface.Ipv6AccessConfigs),

google-beta/services/compute/resource_compute_instance.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2106,6 +2106,9 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err
21062106
Fingerprint: instNetworkInterface.Fingerprint,
21072107
ForceSendFields: []string{"AliasIpRanges"},
21082108
}
2109+
if commonAliasIpRanges := CheckForCommonAliasIp(instNetworkInterface, networkInterface); len(commonAliasIpRanges) > 0 {
2110+
ni.AliasIpRanges = commonAliasIpRanges
2111+
}
21092112
op, err := config.NewComputeClient(userAgent).Instances.UpdateNetworkInterface(project, zone, instance.Name, networkName, ni).Do()
21102113
if err != nil {
21112114
return errwrap.Wrapf("Error removing alias_ip_range: {{err}}", err)
@@ -3135,3 +3138,20 @@ func isEmptyServiceAccountBlock(d *schema.ResourceData) bool {
31353138
}
31363139
return false
31373140
}
3141+
3142+
// Alias ip ranges cannot be removed and created at the same time. This checks if there are any unchanged alias ip ranges
3143+
// to be kept in between the PATCH operations on Network Interface
3144+
func CheckForCommonAliasIp(old, new *compute.NetworkInterface) []*compute.AliasIpRange {
3145+
newAliasIpMap := make(map[string]bool)
3146+
for _, ipRange := range new.AliasIpRanges {
3147+
newAliasIpMap[ipRange.IpCidrRange] = true
3148+
}
3149+
3150+
resultAliasIpRanges := make([]*compute.AliasIpRange, 0)
3151+
for _, val := range old.AliasIpRanges {
3152+
if newAliasIpMap[val.IpCidrRange] {
3153+
resultAliasIpRanges = append(resultAliasIpRanges, val)
3154+
}
3155+
}
3156+
return resultAliasIpRanges
3157+
}

0 commit comments

Comments
 (0)