Skip to content

Commit a38d26a

Browse files
authored
Merge pull request #1921 from CecileRobertMichon/async-vnet-2
Make vnets reconcile/delete async
2 parents 5c96e82 + 021814e commit a38d26a

File tree

24 files changed

+551
-1024
lines changed

24 files changed

+551
-1024
lines changed

azure/scope/cluster.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"sigs.k8s.io/cluster-api-provider-azure/azure/services/loadbalancers"
4141
"sigs.k8s.io/cluster-api-provider-azure/azure/services/natgateways"
4242
"sigs.k8s.io/cluster-api-provider-azure/azure/services/routetables"
43+
"sigs.k8s.io/cluster-api-provider-azure/azure/services/virtualnetworks"
4344
"sigs.k8s.io/cluster-api-provider-azure/azure/services/vnetpeerings"
4445
"sigs.k8s.io/cluster-api-provider-azure/util/futures"
4546
"sigs.k8s.io/cluster-api-provider-azure/util/tele"
@@ -362,11 +363,14 @@ func (s *ClusterScope) VnetPeeringSpecs() []azure.ResourceSpecGetter {
362363
}
363364

364365
// VNetSpec returns the virtual network spec.
365-
func (s *ClusterScope) VNetSpec() azure.VNetSpec {
366-
return azure.VNetSpec{
367-
ResourceGroup: s.Vnet().ResourceGroup,
368-
Name: s.Vnet().Name,
369-
CIDRs: s.Vnet().CIDRBlocks,
366+
func (s *ClusterScope) VNetSpec() azure.ResourceSpecGetter {
367+
return &virtualnetworks.VNetSpec{
368+
ResourceGroup: s.Vnet().ResourceGroup,
369+
Name: s.Vnet().Name,
370+
CIDRs: s.Vnet().CIDRBlocks,
371+
Location: s.Location(),
372+
ClusterName: s.ClusterName(),
373+
AdditionalTags: s.AdditionalTags(),
370374
}
371375
}
372376

@@ -662,6 +666,7 @@ func (s *ClusterScope) PatchObject(ctx context.Context) error {
662666
infrav1.NATGatewaysReadyCondition,
663667
infrav1.LoadBalancersReadyCondition,
664668
infrav1.BastionHostReadyCondition,
669+
infrav1.VNetReadyCondition,
665670
),
666671
)
667672

@@ -678,6 +683,7 @@ func (s *ClusterScope) PatchObject(ctx context.Context) error {
678683
infrav1.NATGatewaysReadyCondition,
679684
infrav1.LoadBalancersReadyCondition,
680685
infrav1.BastionHostReadyCondition,
686+
infrav1.VNetReadyCondition,
681687
}})
682688
}
683689

azure/scope/managedcontrolplane.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import (
4141
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
4242
"sigs.k8s.io/cluster-api-provider-azure/azure"
4343
"sigs.k8s.io/cluster-api-provider-azure/azure/services/groups"
44+
"sigs.k8s.io/cluster-api-provider-azure/azure/services/virtualnetworks"
4445
infrav1exp "sigs.k8s.io/cluster-api-provider-azure/exp/api/v1beta1"
4546
"sigs.k8s.io/cluster-api-provider-azure/util/futures"
4647
"sigs.k8s.io/cluster-api-provider-azure/util/tele"
@@ -226,11 +227,14 @@ func (s *ManagedControlPlaneScope) GroupSpec() azure.ResourceSpecGetter {
226227
}
227228

228229
// VNetSpec returns the virtual network spec.
229-
func (s *ManagedControlPlaneScope) VNetSpec() azure.VNetSpec {
230-
return azure.VNetSpec{
231-
ResourceGroup: s.Vnet().ResourceGroup,
232-
Name: s.Vnet().Name,
233-
CIDRs: s.Vnet().CIDRBlocks,
230+
func (s *ManagedControlPlaneScope) VNetSpec() azure.ResourceSpecGetter {
231+
return &virtualnetworks.VNetSpec{
232+
ResourceGroup: s.Vnet().ResourceGroup,
233+
Name: s.Vnet().Name,
234+
CIDRs: s.Vnet().CIDRBlocks,
235+
Location: s.Location(),
236+
ClusterName: s.ClusterName(),
237+
AdditionalTags: s.AdditionalTags(),
234238
}
235239
}
236240

azure/services/async/interfaces.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,16 @@ type FutureHandler interface {
3636
Result(ctx context.Context, future azureautorest.FutureAPI, futureType string) (result interface{}, err error)
3737
}
3838

39+
// Getter is an interface that can get a resource.
40+
type Getter interface {
41+
Get(ctx context.Context, spec azure.ResourceSpecGetter) (result interface{}, err error)
42+
}
43+
3944
// Creator is a client that can create or update a resource asynchronously.
4045
type Creator interface {
4146
FutureHandler
47+
Getter
4248
CreateOrUpdateAsync(ctx context.Context, spec azure.ResourceSpecGetter, parameters interface{}) (result interface{}, future azureautorest.FutureAPI, err error)
43-
Get(ctx context.Context, spec azure.ResourceSpecGetter) (result interface{}, err error)
4449
}
4550

4651
// Deleter is a client that can delete a resource asynchronously.

azure/services/async/mock_async/async_mock.go

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

azure/services/availabilitysets/availabilitysets.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ type AvailabilitySetScope interface {
4141
// Service provides operations on Azure resources.
4242
type Service struct {
4343
Scope AvailabilitySetScope
44-
Client
44+
async.Getter
4545
async.Reconciler
4646
resourceSKUCache *resourceskus.Cache
4747
}
@@ -51,7 +51,7 @@ func New(scope AvailabilitySetScope, skuCache *resourceskus.Cache) *Service {
5151
client := NewClient(scope)
5252
return &Service{
5353
Scope: scope,
54-
Client: client,
54+
Getter: client,
5555
resourceSKUCache: skuCache,
5656
Reconciler: async.New(scope, client, client),
5757
}
@@ -88,7 +88,7 @@ func (s *Service) Delete(ctx context.Context) error {
8888
if setSpec := s.Scope.AvailabilitySetSpec(); setSpec == nil {
8989
log.V(2).Info("skip deletion when no availability set spec is found")
9090
} else {
91-
existingSet, err := s.Client.Get(ctx, setSpec)
91+
existingSet, err := s.Get(ctx, setSpec)
9292
if err != nil {
9393
if !azure.ResourceNotFound(err) {
9494
resultingErr = errors.Wrapf(err, "failed to get availability set %s in resource group %s", setSpec.ResourceName(), setSpec.ResourceGroupName())

azure/services/availabilitysets/availabilitysets_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,12 @@ func TestDeleteAvailabilitySets(t *testing.T) {
149149
testcases := []struct {
150150
name string
151151
expectedError string
152-
expect func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder)
152+
expect func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder)
153153
}{
154154
{
155155
name: "deletes availability set",
156156
expectedError: "",
157-
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
157+
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
158158
s.AvailabilitySetSpec().Return(&fakeSetSpec)
159159
gomock.InOrder(
160160
m.Get(gomockinternal.AContext(), &fakeSetSpec).Return(compute.AvailabilitySet{}, nil),
@@ -166,15 +166,15 @@ func TestDeleteAvailabilitySets(t *testing.T) {
166166
{
167167
name: "noop if AvailabilitySetSpec returns nil",
168168
expectedError: "",
169-
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
169+
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
170170
s.AvailabilitySetSpec().Return(nil)
171171
s.UpdateDeleteStatus(infrav1.AvailabilitySetReadyCondition, serviceName, nil)
172172
},
173173
},
174174
{
175175
name: "delete proceeds with missing required value in availability set spec",
176176
expectedError: "",
177-
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
177+
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
178178
s.AvailabilitySetSpec().Return(&fakeSetSpecMissing)
179179
gomock.InOrder(
180180
m.Get(gomockinternal.AContext(), &fakeSetSpecMissing).Return(compute.AvailabilitySet{}, nil),
@@ -186,7 +186,7 @@ func TestDeleteAvailabilitySets(t *testing.T) {
186186
{
187187
name: "noop if availability set has vms",
188188
expectedError: "",
189-
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
189+
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
190190
s.AvailabilitySetSpec().Return(&fakeSetSpec)
191191
gomock.InOrder(
192192
m.Get(gomockinternal.AContext(), &fakeSetSpec).Return(fakeSetWithVMs, nil),
@@ -197,7 +197,7 @@ func TestDeleteAvailabilitySets(t *testing.T) {
197197
{
198198
name: "availability set not found",
199199
expectedError: "",
200-
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
200+
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
201201
s.AvailabilitySetSpec().Return(&fakeSetSpec)
202202
gomock.InOrder(
203203
m.Get(gomockinternal.AContext(), &fakeSetSpec).Return(nil, notFoundError),
@@ -208,7 +208,7 @@ func TestDeleteAvailabilitySets(t *testing.T) {
208208
{
209209
name: "error in getting availability set",
210210
expectedError: "failed to get availability set test-as in resource group test-rg: #: Internal Server Error: StatusCode=500",
211-
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
211+
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
212212
s.AvailabilitySetSpec().Return(&fakeSetSpec)
213213
gomock.InOrder(
214214
m.Get(gomockinternal.AContext(), &fakeSetSpec).Return(nil, internalError),
@@ -219,7 +219,7 @@ func TestDeleteAvailabilitySets(t *testing.T) {
219219
{
220220
name: "availability set get result is not an availability set",
221221
expectedError: "string is not a compute.AvailabilitySet",
222-
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
222+
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
223223
s.AvailabilitySetSpec().Return(&fakeSetSpec)
224224
gomock.InOrder(
225225
m.Get(gomockinternal.AContext(), &fakeSetSpec).Return("not an availability set", nil),
@@ -230,7 +230,7 @@ func TestDeleteAvailabilitySets(t *testing.T) {
230230
{
231231
name: "error in deleting availability set",
232232
expectedError: "#: Internal Server Error: StatusCode=500",
233-
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_availabilitysets.MockClientMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
233+
expect: func(s *mock_availabilitysets.MockAvailabilitySetScopeMockRecorder, m *mock_async.MockGetterMockRecorder, r *mock_async.MockReconcilerMockRecorder) {
234234
s.AvailabilitySetSpec().Return(&fakeSetSpec)
235235
gomock.InOrder(
236236
m.Get(gomockinternal.AContext(), &fakeSetSpec).Return(compute.AvailabilitySet{}, nil),
@@ -249,14 +249,14 @@ func TestDeleteAvailabilitySets(t *testing.T) {
249249
mockCtrl := gomock.NewController(t)
250250
defer mockCtrl.Finish()
251251
scopeMock := mock_availabilitysets.NewMockAvailabilitySetScope(mockCtrl)
252-
clientMock := mock_availabilitysets.NewMockClient(mockCtrl)
252+
getterMock := mock_async.NewMockGetter(mockCtrl)
253253
asyncMock := mock_async.NewMockReconciler(mockCtrl)
254254

255-
tc.expect(scopeMock.EXPECT(), clientMock.EXPECT(), asyncMock.EXPECT())
255+
tc.expect(scopeMock.EXPECT(), getterMock.EXPECT(), asyncMock.EXPECT())
256256

257257
s := &Service{
258258
Scope: scopeMock,
259-
Client: clientMock,
259+
Getter: getterMock,
260260
Reconciler: asyncMock,
261261
}
262262

azure/services/availabilitysets/client.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,11 @@ import (
2828
"sigs.k8s.io/cluster-api-provider-azure/util/tele"
2929
)
3030

31-
// Client wraps go-sdk.
32-
type Client interface {
33-
Get(ctx context.Context, spec azure.ResourceSpecGetter) (result interface{}, err error)
34-
CreateOrUpdateAsync(ctx context.Context, spec azure.ResourceSpecGetter, parameters interface{}) (result interface{}, future azureautorest.FutureAPI, err error)
35-
DeleteAsync(ctx context.Context, spec azure.ResourceSpecGetter) (future azureautorest.FutureAPI, err error)
36-
IsDone(ctx context.Context, future azureautorest.FutureAPI) (isDone bool, err error)
37-
Result(ctx context.Context, future azureautorest.FutureAPI, futureType string) (result interface{}, err error)
38-
}
39-
4031
// AzureClient contains the Azure go-sdk Client.
4132
type AzureClient struct {
4233
availabilitySets compute.AvailabilitySetsClient
4334
}
4435

45-
var _ Client = (*AzureClient)(nil)
46-
4736
// NewClient creates a new Resource SKUs Client from subscription ID.
4837
func NewClient(auth azure.Authorizer) *AzureClient {
4938
return &AzureClient{

azure/services/availabilitysets/mock_availabilitysets/client_mock.go

Lines changed: 0 additions & 108 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)