Skip to content

Commit aa9b809

Browse files
authored
Merge pull request #5584 from alimaazamat/immutable-empty-CIDRBlocks-bug
Only update the subnet spec if status ASO CIDRs not empty
2 parents 14311b2 + a5cfb23 commit aa9b809

File tree

4 files changed

+104
-3
lines changed

4 files changed

+104
-3
lines changed

azure/services/subnets/subnets.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,11 @@ func postCreateOrUpdateResourceHook(_ context.Context, scope SubnetScope, subnet
5656
}
5757

5858
name := subnet.AzureName()
59-
scope.UpdateSubnetID(name, ptr.Deref(subnet.Status.Id, ""))
60-
scope.UpdateSubnetCIDRs(name, converters.GetSubnetAddresses(*subnet))
59+
statusASOCIDRs := converters.GetSubnetAddresses(*subnet)
60+
if len(statusASOCIDRs) != 0 {
61+
scope.UpdateSubnetID(name, ptr.Deref(subnet.Status.Id, ""))
62+
scope.UpdateSubnetCIDRs(name, statusASOCIDRs)
63+
}
6164

6265
return nil
6366
}

azure/services/subnets/subnets_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,36 @@ func TestPostCreateOrUpdateResourceHook(t *testing.T) {
5555
}
5656
g.Expect(postCreateOrUpdateResourceHook(context.Background(), scope, subnet, nil)).To(Succeed())
5757
})
58+
59+
t.Run("correctly handles empty and non-empty ASO Status CIDRBlocks", func(t *testing.T) {
60+
g := NewGomegaWithT(t)
61+
mockCtrl := gomock.NewController(t)
62+
scope := mock_subnets.NewMockSubnetScope(mockCtrl)
63+
64+
emptyCIDRSubnet := &asonetworkv1.VirtualNetworksSubnet{
65+
Spec: asonetworkv1.VirtualNetworksSubnet_Spec{
66+
AzureName: "empty-cidr-status-subnet",
67+
},
68+
Status: asonetworkv1.VirtualNetworksSubnet_STATUS{
69+
Id: ptr.To("id-empty"),
70+
AddressPrefixes: []string{},
71+
},
72+
}
73+
scope.EXPECT().UpdateSubnetID("empty-cidr-status-subnet", "id-empty").Times(0)
74+
scope.EXPECT().UpdateSubnetCIDRs("empty-cidr-status-subnet", []string{}).Times(0)
75+
g.Expect(postCreateOrUpdateResourceHook(context.Background(), scope, emptyCIDRSubnet, nil)).To(Succeed())
76+
77+
nonEmptyCIDRSubnet := &asonetworkv1.VirtualNetworksSubnet{
78+
Spec: asonetworkv1.VirtualNetworksSubnet_Spec{
79+
AzureName: "nonempty-cidr-status-subnet",
80+
},
81+
Status: asonetworkv1.VirtualNetworksSubnet_STATUS{
82+
Id: ptr.To("id-nonempty"),
83+
AddressPrefixes: []string{"cidr"},
84+
},
85+
}
86+
scope.EXPECT().UpdateSubnetID("nonempty-cidr-status-subnet", "id-nonempty").Times(1)
87+
scope.EXPECT().UpdateSubnetCIDRs("nonempty-cidr-status-subnet", []string{"cidr"}).Times(1)
88+
g.Expect(postCreateOrUpdateResourceHook(context.Background(), scope, nonEmptyCIDRSubnet, nil)).To(Succeed())
89+
})
5890
}

azure/services/virtualnetworks/virtualnetworks.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ func postCreateOrUpdateResourceHook(ctx context.Context, scope VNetScope, existi
7171
return errors.Wrap(err, "failed to list subnets")
7272
}
7373
for _, subnet := range subnets.Items {
74-
scope.UpdateSubnetCIDRs(subnet.AzureName(), converters.GetSubnetAddresses(subnet))
74+
statusASOCIDRs := converters.GetSubnetAddresses(subnet)
75+
if len(statusASOCIDRs) != 0 {
76+
scope.UpdateSubnetCIDRs(subnet.AzureName(), statusASOCIDRs)
77+
}
7578
}
7679
// Only update the vnet's CIDRBlocks when we also updated subnets' since the vnet is created before
7780
// subnets to prevent an updated vnet CIDR from invalidating subnet CIDRs that were defaulted and do not

azure/services/virtualnetworks/virtualnetworks_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,67 @@ func TestPostCreateOrUpdateResourceHook(t *testing.T) {
109109
g.Expect(vnet.Tags).To(Equal(infrav1.Tags{"actual": "tags"}))
110110
g.Expect(vnet.CIDRBlocks).To(Equal([]string{"cidr"}))
111111
})
112+
113+
t.Run("correctly handles empty and non-empty ASO Status CIDRBlocks", func(t *testing.T) {
114+
g := NewGomegaWithT(t)
115+
mockCtrl := gomock.NewController(t)
116+
scope := mock_virtualnetworks.NewMockVNetScope(mockCtrl)
117+
118+
existing := &asonetworkv1.VirtualNetwork{
119+
ObjectMeta: metav1.ObjectMeta{
120+
Name: "vnet",
121+
},
122+
Status: asonetworkv1.VirtualNetwork_STATUS{
123+
Id: ptr.To("id"),
124+
Tags: map[string]string{"actual": "tags"},
125+
AddressSpace: &asonetworkv1.AddressSpace_STATUS{
126+
AddressPrefixes: []string{"cidr"},
127+
},
128+
},
129+
}
130+
131+
vnet := &infrav1.VnetSpec{}
132+
scope.EXPECT().Vnet().Return(vnet)
133+
134+
subnets := []client.Object{
135+
&asonetworkv1.VirtualNetworksSubnet{
136+
ObjectMeta: metav1.ObjectMeta{
137+
Name: "empty-cidr-status-subnet",
138+
Labels: map[string]string{
139+
labels.OwnerNameLabel: existing.Name,
140+
},
141+
},
142+
Spec: asonetworkv1.VirtualNetworksSubnet_Spec{
143+
AzureName: "empty-cidr-status-subnet",
144+
},
145+
Status: asonetworkv1.VirtualNetworksSubnet_STATUS{
146+
AddressPrefixes: []string{},
147+
},
148+
},
149+
&asonetworkv1.VirtualNetworksSubnet{
150+
ObjectMeta: metav1.ObjectMeta{
151+
Name: "nonempty-cidr-status-subnet",
152+
Labels: map[string]string{
153+
labels.OwnerNameLabel: existing.Name,
154+
},
155+
},
156+
Spec: asonetworkv1.VirtualNetworksSubnet_Spec{
157+
AzureName: "nonempty-cidr-status-subnet",
158+
},
159+
Status: asonetworkv1.VirtualNetworksSubnet_STATUS{
160+
AddressPrefixes: []string{"cidr"},
161+
},
162+
},
163+
}
164+
s := runtime.NewScheme()
165+
g.Expect(asonetworkv1.AddToScheme(s)).To(Succeed())
166+
c := fakeclient.NewClientBuilder().
167+
WithScheme(s).
168+
WithObjects(subnets...).
169+
Build()
170+
scope.EXPECT().GetClient().Return(c)
171+
scope.EXPECT().UpdateSubnetCIDRs("empty-cidr-status-subnet", []string{}).Times(0)
172+
scope.EXPECT().UpdateSubnetCIDRs("nonempty-cidr-status-subnet", []string{"cidr"}).Times(1)
173+
g.Expect(postCreateOrUpdateResourceHook(context.Background(), scope, existing, nil)).To(Succeed())
174+
})
112175
}

0 commit comments

Comments
 (0)