Skip to content

Commit 8850de9

Browse files
Ensure PublicIPAddress resources aren't permanently blocked (#4481)
* Make ReferencedResourceNotProvisioned into a warning * Add test for fix
1 parent ec6984d commit 8850de9

3 files changed

+1781
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
Copyright (c) Microsoft Corporation.
3+
Licensed under the MIT license.
4+
*/
5+
6+
package customizations
7+
8+
import (
9+
"github.com/go-logr/logr"
10+
11+
"github.com/Azure/azure-service-operator/v2/internal/genericarmclient"
12+
"github.com/Azure/azure-service-operator/v2/pkg/genruntime/core"
13+
"github.com/Azure/azure-service-operator/v2/pkg/genruntime/extensions"
14+
)
15+
16+
var _ extensions.ErrorClassifier = &PublicIPAddressExtension{}
17+
18+
func (extension *PublicIPAddressExtension) ClassifyError(
19+
cloudError *genericarmclient.CloudError,
20+
apiVersion string,
21+
log logr.Logger,
22+
next extensions.ErrorClassifierFunc,
23+
) (core.CloudErrorDetails, error) {
24+
details, err := next(cloudError)
25+
if err != nil {
26+
return core.CloudErrorDetails{}, err
27+
}
28+
29+
// Override is to treat Conflict as retryable for Redis, if the message contains "try again later"
30+
if isRetryablePublicIPAddressError(cloudError) {
31+
details.Classification = core.ErrorRetryable
32+
}
33+
34+
return details, nil
35+
}
36+
37+
func isRetryablePublicIPAddressError(err *genericarmclient.CloudError) bool {
38+
if err == nil {
39+
return false
40+
}
41+
42+
// If a referenced resource is not yet provisioned, it may be coming soon
43+
if err.Code() == "ReferencedResourceNotProvisioned" {
44+
return true
45+
}
46+
47+
return false
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
Copyright (c) Microsoft Corporation.
3+
Licensed under the MIT license.
4+
*/
5+
6+
package controllers_test
7+
8+
import (
9+
"testing"
10+
11+
network "github.com/Azure/azure-service-operator/v2/api/network/v1api20240301"
12+
"github.com/Azure/azure-service-operator/v2/internal/testcommon"
13+
"github.com/Azure/azure-service-operator/v2/internal/util/to"
14+
)
15+
16+
func Test_Network_PublicIPAddress_creationNotBlockedByPublicIPPrefix_20240301(t *testing.T) {
17+
t.Parallel()
18+
19+
tc := globalTestContext.ForTest(t)
20+
21+
rg := tc.CreateTestResourceGroupAndWait()
22+
23+
prefix := &network.PublicIPPrefix{
24+
ObjectMeta: tc.MakeObjectMetaWithName("prefix"),
25+
Spec: network.PublicIPPrefix_Spec{
26+
Location: tc.AzureRegion,
27+
Owner: testcommon.AsOwner(rg),
28+
PrefixLength: to.Ptr(29),
29+
PublicIPAddressVersion: to.Ptr(network.IPVersion_IPv4),
30+
Sku: &network.PublicIPPrefixSku{
31+
Name: to.Ptr(network.PublicIPPrefixSku_Name_Standard),
32+
Tier: to.Ptr(network.PublicIPPrefixSku_Tier_Regional),
33+
},
34+
},
35+
}
36+
37+
ip1 := &network.PublicIPAddress{
38+
ObjectMeta: tc.MakeObjectMetaWithName("ip1"),
39+
Spec: network.PublicIPAddress_Spec{
40+
Location: tc.AzureRegion,
41+
Owner: testcommon.AsOwner(rg),
42+
Sku: &network.PublicIPAddressSku{
43+
Name: to.Ptr(network.PublicIPAddressSku_Name_Standard),
44+
},
45+
PublicIPAllocationMethod: to.Ptr(network.IPAllocationMethod_Static),
46+
PublicIPAddressVersion: to.Ptr(network.IPVersion_IPv4),
47+
PublicIPPrefix: &network.SubResource{
48+
Reference: tc.MakeReferenceFromResource(prefix),
49+
},
50+
},
51+
}
52+
53+
ip2 := &network.PublicIPAddress{
54+
ObjectMeta: tc.MakeObjectMetaWithName("ip2"),
55+
Spec: network.PublicIPAddress_Spec{
56+
Location: tc.AzureRegion,
57+
Owner: testcommon.AsOwner(rg),
58+
Sku: &network.PublicIPAddressSku{
59+
Name: to.Ptr(network.PublicIPAddressSku_Name_Standard),
60+
},
61+
PublicIPAllocationMethod: to.Ptr(network.IPAllocationMethod_Static),
62+
PublicIPAddressVersion: to.Ptr(network.IPVersion_IPv4),
63+
PublicIPPrefix: &network.SubResource{
64+
Reference: tc.MakeReferenceFromResource(prefix),
65+
},
66+
},
67+
}
68+
69+
ip3 := &network.PublicIPAddress{
70+
ObjectMeta: tc.MakeObjectMetaWithName("ip3"),
71+
Spec: network.PublicIPAddress_Spec{
72+
Location: tc.AzureRegion,
73+
Owner: testcommon.AsOwner(rg),
74+
Sku: &network.PublicIPAddressSku{
75+
Name: to.Ptr(network.PublicIPAddressSku_Name_Standard),
76+
},
77+
PublicIPAllocationMethod: to.Ptr(network.IPAllocationMethod_Static),
78+
PublicIPAddressVersion: to.Ptr(network.IPVersion_IPv4),
79+
PublicIPPrefix: &network.SubResource{
80+
Reference: tc.MakeReferenceFromResource(prefix),
81+
},
82+
},
83+
}
84+
85+
tc.CreateResourcesAndWait(prefix, ip1, ip2, ip3)
86+
}

0 commit comments

Comments
 (0)