Skip to content

Commit 1f6c07c

Browse files
authored
Merge pull request #3 from alauda/feat/AIT-42692
imp: delete unmanaged agent pools
2 parents 9f54c71 + 22b4612 commit 1f6c07c

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

controllers/azuremanagedcontrolplane_controller.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ import (
4545
"sigs.k8s.io/controller-runtime/pkg/source"
4646
)
4747

48+
const (
49+
reconcileAfterDurationForHeath = time.Second * 60
50+
reconcileAfterDurationForError = time.Second * 10
51+
)
52+
4853
// AzureManagedControlPlaneReconciler reconciles an AzureManagedControlPlane object.
4954
type AzureManagedControlPlaneReconciler struct {
5055
client.Client
@@ -113,7 +118,7 @@ func (amcpr *AzureManagedControlPlaneReconciler) SetupWithManager(ctx context.Co
113118
// +kubebuilder:rbac:groups=cluster.x-k8s.io,resources=clusters;clusters/status,verbs=get;list;watch
114119

115120
// Reconcile idempotently gets, creates, and updates a managed control plane.
116-
func (amcpr *AzureManagedControlPlaneReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ ctrl.Result, reterr error) {
121+
func (amcpr *AzureManagedControlPlaneReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res ctrl.Result, reterr error) {
117122
ctx, cancel := context.WithTimeout(ctx, reconciler.DefaultedLoopTimeout(amcpr.ReconcileTimeout))
118123
defer cancel()
119124

@@ -124,6 +129,15 @@ func (amcpr *AzureManagedControlPlaneReconciler) Reconcile(ctx context.Context,
124129
)
125130
defer done()
126131

132+
defer func() {
133+
if reterr != nil {
134+
log.Error(reterr, "reconcile control plane failed")
135+
res.RequeueAfter = reconcileAfterDurationForError
136+
} else {
137+
res.RequeueAfter = reconcileAfterDurationForHeath
138+
}
139+
}()
140+
127141
// Fetch the AzureManagedControlPlane instance
128142
azureControlPlane := &infrav1.AzureManagedControlPlane{}
129143
err := amcpr.Get(ctx, req.NamespacedName, azureControlPlane)

controllers/azuremanagedcontrolplane_reconciler.go

+49
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ package controllers
1818

1919
import (
2020
"context"
21+
"fmt"
2122

23+
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
24+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
25+
26+
"github.com/Azure/azure-sdk-for-go/services/containerservice/mgmt/2022-03-01/containerservice"
2227
"github.com/pkg/errors"
2328
"sigs.k8s.io/cluster-api/util/secret"
2429
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -78,6 +83,50 @@ func (r *azureManagedControlPlaneService) Reconcile(ctx context.Context) error {
7883
return errors.Wrap(err, "failed to reconcile kubeconfig secret")
7984
}
8085

86+
if err := r.deleteUnmanagedAgentPools(ctx); err != nil {
87+
return errors.Wrap(err, "failed to delete unmanaged agent pools")
88+
}
89+
90+
return nil
91+
}
92+
93+
func (r *azureManagedControlPlaneService) deleteUnmanagedAgentPools(ctx context.Context) error {
94+
ctx, log, done := tele.StartSpanWithLogger(ctx, "controllers.azureManagedControlPlaneService.deleteUnmanagedAgentPools")
95+
defer done()
96+
clusterName := r.scope.ManagedClusterSpec().ResourceName()
97+
listOptions := []client.ListOption{
98+
client.MatchingLabels(map[string]string{clusterv1.ClusterNameLabel: clusterName}),
99+
}
100+
managedMachinePools := &infrav1.AzureManagedMachinePoolList{}
101+
if err := r.kubeclient.List(ctx, managedMachinePools, listOptions...); err != nil {
102+
return fmt.Errorf("failed to list managed machine pools for cluster %s: %w", clusterName, err)
103+
}
104+
poolMap := make(map[string]struct{})
105+
for _, pool := range managedMachinePools.Items {
106+
poolMap[*pool.Spec.Name] = struct{}{}
107+
}
108+
109+
agentPoolsClient := containerservice.NewAgentPoolsClientWithBaseURI(r.scope.BaseURI(), r.scope.SubscriptionID())
110+
azure.SetAutoRestClientDefaults(&agentPoolsClient.Client, r.scope.Authorizer())
111+
112+
result, err := agentPoolsClient.List(ctx, r.scope.ManagedClusterSpec().ResourceGroupName(), clusterName)
113+
if err != nil {
114+
return errors.Wrap(err, "failed to list agent pools")
115+
}
116+
for result.NotDone() {
117+
for _, pool := range result.Values() {
118+
if _, ok := poolMap[*pool.Name]; ok {
119+
continue
120+
}
121+
log.Info("start delete node group", "nodeGroupName", pool, "clusterName", clusterName)
122+
if _, err = agentPoolsClient.Delete(ctx, r.scope.ManagedClusterSpec().ResourceGroupName(), clusterName, *pool.Name); err != nil {
123+
return errors.Wrap(err, fmt.Sprintf("failed to delete agent pool %s in cluster %s", *pool.Name, clusterName))
124+
}
125+
}
126+
if err = result.NextWithContext(ctx); err != nil {
127+
return errors.Wrap(err, "failed to list agent pools")
128+
}
129+
}
81130
return nil
82131
}
83132

0 commit comments

Comments
 (0)