Skip to content

Commit 82ed072

Browse files
authored
Merge pull request kubernetes-sigs#645 from mboersma/enable-accelerated-networking
✨ support accelerated networking
2 parents ad2579d + ffad0ad commit 82ed072

21 files changed

+557
-43
lines changed

api/v1alpha2/azuremachine_conversion.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ func (src *AzureMachine) ConvertTo(dstRaw conversion.Hub) error { // nolint
4242
if len(restored.Spec.UserAssignedIdentities) > 0 {
4343
dst.Spec.UserAssignedIdentities = restored.Spec.UserAssignedIdentities
4444
}
45+
if restored.Spec.AcceleratedNetworking != nil {
46+
dst.Spec.AcceleratedNetworking = restored.Spec.AcceleratedNetworking
47+
}
4548

4649
dst.Spec.FailureDomain = restored.Spec.FailureDomain
4750

api/v1alpha2/azuremachinetemplate_conversion.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ func (src *AzureMachineTemplate) ConvertTo(dstRaw conversion.Hub) error { // nol
4040
if len(restored.Spec.Template.Spec.UserAssignedIdentities) > 0 {
4141
dst.Spec.Template.Spec.UserAssignedIdentities = restored.Spec.Template.Spec.UserAssignedIdentities
4242
}
43+
if restored.Spec.Template.Spec.AcceleratedNetworking != nil {
44+
dst.Spec.Template.Spec.AcceleratedNetworking = restored.Spec.Template.Spec.AcceleratedNetworking
45+
}
4346
dst.Spec.Template.Spec.FailureDomain = restored.Spec.Template.Spec.FailureDomain
4447

4548
return nil

api/v1alpha2/zz_generated.conversion.go

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

api/v1alpha3/azuremachine_types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ type AzureMachineSpec struct {
8080
// AllocatePublicIP allows the ability to create dynamic public ips for machines where this value is true.
8181
// +optional
8282
AllocatePublicIP bool `json:"allocatePublicIP,omitempty"`
83+
84+
// AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on
85+
// whether the requested VMSize supports accelerated networking.
86+
// If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error.
87+
// +kubebuilder:validation:nullable
88+
// +optional
89+
AcceleratedNetworking *bool `json:"acceleratedNetworking,omitempty"`
8390
}
8491

8592
// AzureMachineStatus defines the observed state of AzureMachine

api/v1alpha3/zz_generated.deepcopy.go

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

cloud/services/networkinterfaces/networkinterfaces.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ type Spec struct {
3737
PublicLoadBalancerName string
3838
InternalLoadBalancerName string
3939
PublicIPName string
40+
AcceleratedNetworking *bool
4041
}
4142

4243
// Get provides information about a network interface.
@@ -125,6 +126,16 @@ func (s *Service) Reconcile(ctx context.Context, spec interface{}) error {
125126
nicConfig.PublicIPAddress = &publicIP
126127
}
127128

129+
if nicSpec.AcceleratedNetworking == nil {
130+
// set accelerated networking to the capability of the VMSize
131+
sku := s.MachineScope.AzureMachine.Spec.VMSize
132+
accelNet, err := s.ResourceSkusClient.HasAcceleratedNetworking(ctx, sku)
133+
if err != nil {
134+
return errors.Wrap(err, "failed to get accelerated networking capability")
135+
}
136+
nicSpec.AcceleratedNetworking = to.BoolPtr(accelNet)
137+
}
138+
128139
err = s.Client.CreateOrUpdate(ctx,
129140
s.Scope.ResourceGroup(),
130141
nicSpec.Name,
@@ -137,6 +148,7 @@ func (s *Service) Reconcile(ctx context.Context, spec interface{}) error {
137148
InterfaceIPConfigurationPropertiesFormat: nicConfig,
138149
},
139150
},
151+
EnableAcceleratedNetworking: nicSpec.AcceleratedNetworking,
140152
},
141153
})
142154

cloud/services/networkinterfaces/networkinterfaces_test.go

Lines changed: 133 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ import (
2727
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/networkinterfaces/mock_networkinterfaces"
2828
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/publicips/mock_publicips"
2929
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/publicloadbalancers/mock_publicloadbalancers"
30+
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/resourceskus/mock_resourceskus"
3031
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/subnets/mock_subnets"
32+
"sigs.k8s.io/cluster-api-provider-azure/internal/test/matchers"
3133

3234
"github.com/Azure/go-autorest/autorest"
3335
"github.com/Azure/go-autorest/autorest/to"
@@ -236,7 +238,8 @@ func TestReconcileNetworkInterface(t *testing.T) {
236238
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
237239
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
238240
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
239-
mPublicIP *mock_publicips.MockClientMockRecorder)
241+
mPublicIP *mock_publicips.MockClientMockRecorder,
242+
mResourceSku *mock_resourceskus.MockClient)
240243
}{
241244
{
242245
name: "get subnets fails",
@@ -251,7 +254,8 @@ func TestReconcileNetworkInterface(t *testing.T) {
251254
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
252255
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
253256
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
254-
mPublicIP *mock_publicips.MockClientMockRecorder) {
257+
mPublicIP *mock_publicips.MockClientMockRecorder,
258+
mResourceSku *mock_resourceskus.MockClient) {
255259
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").
256260
Return(network.Subnet{}, autorest.NewErrorWithResponse("", "", &http.Response{StatusCode: 500}, "Internal Server Error"))
257261
},
@@ -269,7 +273,9 @@ func TestReconcileNetworkInterface(t *testing.T) {
269273
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
270274
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
271275
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
272-
mPublicIP *mock_publicips.MockClientMockRecorder) {
276+
mPublicIP *mock_publicips.MockClientMockRecorder,
277+
mResourceSku *mock_resourceskus.MockClient) {
278+
mResourceSku.EXPECT().HasAcceleratedNetworking(gomock.Any(), gomock.Any())
273279
gomock.InOrder(
274280
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").
275281
Return(network.Subnet{}, nil),
@@ -291,7 +297,9 @@ func TestReconcileNetworkInterface(t *testing.T) {
291297
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
292298
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
293299
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
294-
mPublicIP *mock_publicips.MockClientMockRecorder) {
300+
mPublicIP *mock_publicips.MockClientMockRecorder,
301+
mResourceSku *mock_resourceskus.MockClient) {
302+
mResourceSku.EXPECT().HasAcceleratedNetworking(gomock.Any(), gomock.Any())
295303
gomock.InOrder(
296304
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
297305
m.CreateOrUpdate(context.TODO(), "my-rg", "my-net-interface", gomock.AssignableToTypeOf(network.Interface{})))
@@ -310,7 +318,9 @@ func TestReconcileNetworkInterface(t *testing.T) {
310318
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
311319
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
312320
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
313-
mPublicIP *mock_publicips.MockClientMockRecorder) {
321+
mPublicIP *mock_publicips.MockClientMockRecorder,
322+
mResourceSku *mock_resourceskus.MockClient) {
323+
mResourceSku.EXPECT().HasAcceleratedNetworking(gomock.Any(), gomock.Any())
314324
gomock.InOrder(
315325
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
316326
m.CreateOrUpdate(context.TODO(), "my-rg", "my-net-interface", gomock.AssignableToTypeOf(network.Interface{})))
@@ -331,7 +341,9 @@ func TestReconcileNetworkInterface(t *testing.T) {
331341
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
332342
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
333343
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
334-
mPublicIP *mock_publicips.MockClientMockRecorder) {
344+
mPublicIP *mock_publicips.MockClientMockRecorder,
345+
mResourceSku *mock_resourceskus.MockClient) {
346+
mResourceSku.EXPECT().HasAcceleratedNetworking(gomock.Any(), gomock.Any())
335347
gomock.InOrder(
336348
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").
337349
Return(network.Subnet{ID: to.StringPtr("my-subnet-id")}, nil),
@@ -374,9 +386,10 @@ func TestReconcileNetworkInterface(t *testing.T) {
374386
},
375387
},
376388
}}, nil),
377-
m.CreateOrUpdate(context.TODO(), "my-rg", "my-net-interface", network.Interface{
389+
m.CreateOrUpdate(context.TODO(), "my-rg", "my-net-interface", matchers.DiffEq(network.Interface{
378390
Location: to.StringPtr("test-location"),
379391
InterfacePropertiesFormat: &network.InterfacePropertiesFormat{
392+
EnableAcceleratedNetworking: to.BoolPtr(false),
380393
IPConfigurations: &[]network.InterfaceIPConfiguration{
381394
{
382395
Name: to.StringPtr("pipConfig"),
@@ -389,7 +402,7 @@ func TestReconcileNetworkInterface(t *testing.T) {
389402
},
390403
},
391404
},
392-
}))
405+
})))
393406
},
394407
},
395408
{
@@ -407,7 +420,8 @@ func TestReconcileNetworkInterface(t *testing.T) {
407420
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
408421
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
409422
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
410-
mPublicIP *mock_publicips.MockClientMockRecorder) {
423+
mPublicIP *mock_publicips.MockClientMockRecorder,
424+
mResourceSku *mock_resourceskus.MockClient) {
411425
gomock.InOrder(
412426
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
413427
mPublicLoadBalancer.Get(context.TODO(), "my-rg", "my-publiclb").
@@ -429,7 +443,8 @@ func TestReconcileNetworkInterface(t *testing.T) {
429443
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
430444
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
431445
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
432-
mPublicIP *mock_publicips.MockClientMockRecorder) {
446+
mPublicIP *mock_publicips.MockClientMockRecorder,
447+
mResourceSku *mock_resourceskus.MockClient) {
433448
gomock.InOrder(
434449
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
435450
mPublicLoadBalancer.Get(context.TODO(), "my-rg", "my-publiclb").Return(network.LoadBalancer{
@@ -493,7 +508,8 @@ func TestReconcileNetworkInterface(t *testing.T) {
493508
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
494509
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
495510
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
496-
mPublicIP *mock_publicips.MockClientMockRecorder) {
511+
mPublicIP *mock_publicips.MockClientMockRecorder,
512+
mResourceSku *mock_resourceskus.MockClient) {
497513
gomock.InOrder(
498514
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
499515
mInternalLoadBalancer.Get(context.TODO(), "my-rg", "my-internal-lb").
@@ -514,7 +530,9 @@ func TestReconcileNetworkInterface(t *testing.T) {
514530
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
515531
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
516532
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
517-
mPublicIP *mock_publicips.MockClientMockRecorder) {
533+
mPublicIP *mock_publicips.MockClientMockRecorder,
534+
mResourceSku *mock_resourceskus.MockClient) {
535+
mResourceSku.EXPECT().HasAcceleratedNetworking(gomock.Any(), gomock.Any())
518536
gomock.InOrder(
519537
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
520538
mPublicIP.CreateOrUpdate(context.TODO(), "my-rg", "my-public-ip", gomock.AssignableToTypeOf(network.PublicIPAddress{})),
@@ -536,14 +554,112 @@ func TestReconcileNetworkInterface(t *testing.T) {
536554
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
537555
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
538556
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
539-
mPublicIP *mock_publicips.MockClientMockRecorder) {
557+
mPublicIP *mock_publicips.MockClientMockRecorder,
558+
mResourceSku *mock_resourceskus.MockClient) {
540559
gomock.InOrder(
541560
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
542561
mPublicIP.CreateOrUpdate(context.TODO(), "my-rg", "my-public-ip", gomock.AssignableToTypeOf(network.PublicIPAddress{})),
543562
mPublicIP.Get(context.TODO(), "my-rg", "my-public-ip").Return(network.PublicIPAddress{}, autorest.NewErrorWithResponse("", "", &http.Response{StatusCode: 500}, "Internal Server Error")),
544563
m.CreateOrUpdate(context.TODO(), "my-rg", "my-net-interface", gomock.AssignableToTypeOf(network.Interface{})))
545564
},
546565
},
566+
{
567+
name: "network interface with accelerated networking successfully created",
568+
netInterfaceSpec: Spec{
569+
Name: "my-net-interface",
570+
VnetName: "my-vnet",
571+
SubnetName: "my-subnet",
572+
},
573+
expectedError: "",
574+
expect: func(m *mock_networkinterfaces.MockClientMockRecorder,
575+
mSubnet *mock_subnets.MockClientMockRecorder,
576+
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
577+
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
578+
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
579+
mPublicIP *mock_publicips.MockClientMockRecorder,
580+
mResourceSku *mock_resourceskus.MockClient) {
581+
mResourceSku.EXPECT().HasAcceleratedNetworking(context.TODO(), gomock.Any()).Return(true, nil)
582+
gomock.InOrder(
583+
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
584+
m.CreateOrUpdate(context.TODO(), "my-rg", "my-net-interface", matchers.DiffEq(network.Interface{
585+
Location: to.StringPtr("test-location"),
586+
InterfacePropertiesFormat: &network.InterfacePropertiesFormat{
587+
EnableAcceleratedNetworking: to.BoolPtr(true),
588+
IPConfigurations: &[]network.InterfaceIPConfiguration{
589+
{
590+
Name: to.StringPtr("pipConfig"),
591+
InterfaceIPConfigurationPropertiesFormat: &network.InterfaceIPConfigurationPropertiesFormat{
592+
Subnet: &network.Subnet{},
593+
PrivateIPAllocationMethod: network.Dynamic,
594+
LoadBalancerBackendAddressPools: &[]network.BackendAddressPool{},
595+
},
596+
},
597+
},
598+
},
599+
})),
600+
)
601+
},
602+
},
603+
{
604+
name: "network interface without accelerated networking successfully created",
605+
netInterfaceSpec: Spec{
606+
Name: "my-net-interface",
607+
VnetName: "my-vnet",
608+
SubnetName: "my-subnet",
609+
},
610+
expectedError: "",
611+
expect: func(m *mock_networkinterfaces.MockClientMockRecorder,
612+
mSubnet *mock_subnets.MockClientMockRecorder,
613+
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
614+
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
615+
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
616+
mPublicIP *mock_publicips.MockClientMockRecorder,
617+
mResourceSku *mock_resourceskus.MockClient) {
618+
mResourceSku.EXPECT().HasAcceleratedNetworking(context.TODO(), gomock.Any()).Return(false, nil)
619+
gomock.InOrder(
620+
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
621+
m.CreateOrUpdate(context.TODO(), "my-rg", "my-net-interface", matchers.DiffEq(network.Interface{
622+
Location: to.StringPtr("test-location"),
623+
InterfacePropertiesFormat: &network.InterfacePropertiesFormat{
624+
EnableAcceleratedNetworking: to.BoolPtr(false),
625+
IPConfigurations: &[]network.InterfaceIPConfiguration{
626+
{
627+
Name: to.StringPtr("pipConfig"),
628+
InterfaceIPConfigurationPropertiesFormat: &network.InterfaceIPConfigurationPropertiesFormat{
629+
Subnet: &network.Subnet{},
630+
PrivateIPAllocationMethod: network.Dynamic,
631+
LoadBalancerBackendAddressPools: &[]network.BackendAddressPool{},
632+
},
633+
},
634+
},
635+
},
636+
})),
637+
)
638+
},
639+
},
640+
{
641+
name: "network interface fails to get accelerated networking capability",
642+
netInterfaceSpec: Spec{
643+
Name: "my-net-interface",
644+
VnetName: "my-vnet",
645+
SubnetName: "my-subnet",
646+
},
647+
expectedError: "failed to get accelerated networking capability: #: Internal Server Error: StatusCode=500",
648+
expect: func(m *mock_networkinterfaces.MockClientMockRecorder,
649+
mSubnet *mock_subnets.MockClientMockRecorder,
650+
mPublicLoadBalancer *mock_publicloadbalancers.MockClientMockRecorder,
651+
mInboundNATRules *mock_inboundnatrules.MockClientMockRecorder,
652+
mInternalLoadBalancer *mock_internalloadbalancers.MockClientMockRecorder,
653+
mPublicIP *mock_publicips.MockClientMockRecorder,
654+
mResourceSku *mock_resourceskus.MockClient) {
655+
mResourceSku.EXPECT().HasAcceleratedNetworking(context.TODO(), gomock.Any()).Return(
656+
false, autorest.NewErrorWithResponse("", "", &http.Response{StatusCode: 500}, "Internal Server Error"))
657+
gomock.InOrder(
658+
mSubnet.Get(context.TODO(), "my-rg", "my-vnet", "my-subnet").Return(network.Subnet{}, nil),
659+
m.CreateOrUpdate(context.TODO(), "my-rg", "my-net-interface", gomock.AssignableToTypeOf(network.Interface{})),
660+
)
661+
},
662+
},
547663
}
548664

549665
for _, tc := range testcases {
@@ -555,6 +671,7 @@ func TestReconcileNetworkInterface(t *testing.T) {
555671
inboundNatRulesMock := mock_inboundnatrules.NewMockClient(mockCtrl)
556672
internalLoadBalancerMock := mock_internalloadbalancers.NewMockClient(mockCtrl)
557673
publicIPsMock := mock_publicips.NewMockClient(mockCtrl)
674+
resourceSkusMock := mock_resourceskus.NewMockClient(mockCtrl)
558675

559676
cluster := &clusterv1.Cluster{
560677
ObjectMeta: metav1.ObjectMeta{Name: "test-cluster"},
@@ -613,7 +730,8 @@ func TestReconcileNetworkInterface(t *testing.T) {
613730

614731
tc.expect(netInterfaceMock.EXPECT(), subnetMock.EXPECT(),
615732
publicLoadBalancerMock.EXPECT(), inboundNatRulesMock.EXPECT(),
616-
internalLoadBalancerMock.EXPECT(), publicIPsMock.EXPECT())
733+
internalLoadBalancerMock.EXPECT(), publicIPsMock.EXPECT(),
734+
resourceSkusMock)
617735

618736
s := &Service{
619737
Scope: clusterScope,
@@ -624,6 +742,7 @@ func TestReconcileNetworkInterface(t *testing.T) {
624742
InboundNATRulesClient: inboundNatRulesMock,
625743
InternalLoadBalancersClient: internalLoadBalancerMock,
626744
PublicIPsClient: publicIPsMock,
745+
ResourceSkusClient: resourceSkusMock,
627746
}
628747

629748
err = s.Reconcile(context.TODO(), &tc.netInterfaceSpec)

cloud/services/networkinterfaces/service.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/internalloadbalancers"
2323
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/publicips"
2424
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/publicloadbalancers"
25+
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/resourceskus"
2526
"sigs.k8s.io/cluster-api-provider-azure/cloud/services/subnets"
2627
)
2728

@@ -35,6 +36,7 @@ type Service struct {
3536
InternalLoadBalancersClient internalloadbalancers.Client
3637
PublicIPsClient publicips.Client
3738
InboundNATRulesClient inboundnatrules.Client
39+
ResourceSkusClient resourceskus.Client
3840
}
3941

4042
// NewService creates a new service.
@@ -48,5 +50,6 @@ func NewService(scope *scope.ClusterScope, machineScope *scope.MachineScope) *Se
4850
InternalLoadBalancersClient: internalloadbalancers.NewClient(scope.SubscriptionID, scope.Authorizer),
4951
PublicIPsClient: publicips.NewClient(scope.SubscriptionID, scope.Authorizer),
5052
InboundNATRulesClient: inboundnatrules.NewClient(scope.SubscriptionID, scope.Authorizer),
53+
ResourceSkusClient: resourceskus.NewClient(scope.SubscriptionID, scope.Authorizer),
5154
}
5255
}

0 commit comments

Comments
 (0)