Skip to content

Commit e1334ef

Browse files
authored
Merge pull request #775 from cprivitere/emlb-ci-cleanup
✨ CI Cleanup of Equinix Metal Load Balancers
2 parents b280f96 + e82c3fb commit e1334ef

File tree

3 files changed

+79
-7
lines changed

3 files changed

+79
-7
lines changed

cmd/ci-clean/main.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import (
2929
"github.com/spf13/cobra"
3030
kerrors "k8s.io/apimachinery/pkg/util/errors"
3131

32+
"sigs.k8s.io/cluster-api-provider-packet/internal/emlb"
33+
lbaas "sigs.k8s.io/cluster-api-provider-packet/internal/lbaas/v1"
3234
"sigs.k8s.io/cluster-api-provider-packet/pkg/cloud/packet"
3335
)
3436

@@ -94,6 +96,26 @@ func cleanup(ctx context.Context, metalAuthToken, metalProjectID string) error {
9496
errs = append(errs, err)
9597
}
9698

99+
emlbClient := emlb.NewEMLB(metalAuthToken, metalProjectID, "da")
100+
101+
loadBalancerPools, _, err := emlbClient.GetLoadBalancerPools(ctx)
102+
if err != nil {
103+
return fmt.Errorf("failed to list load balancer pools: %w", err)
104+
}
105+
106+
if err := deleteEMLBPools(ctx, emlbClient, loadBalancerPools); err != nil {
107+
errs = append(errs, err)
108+
}
109+
110+
loadBalancers, _, err := emlbClient.GetLoadBalancers(ctx)
111+
if err != nil {
112+
return fmt.Errorf("failed to list load balancers: %w", err)
113+
}
114+
115+
if err := deleteEMLBs(ctx, emlbClient, loadBalancers); err != nil {
116+
errs = append(errs, err)
117+
}
118+
97119
return kerrors.NewAggregate(errs)
98120
}
99121

@@ -155,3 +177,35 @@ func deleteKeys(ctx context.Context, metalClient *packet.Client, keys metal.SSHK
155177

156178
return kerrors.NewAggregate(errs)
157179
}
180+
181+
func deleteEMLBPools(ctx context.Context, emlbClient *emlb.EMLB, pools *lbaas.LoadBalancerPoolCollection) error {
182+
var errs []error
183+
184+
for _, pool := range pools.Pools {
185+
if time.Since(pool.GetCreatedAt()) > 4*time.Hour {
186+
fmt.Printf("Deleting Load Balancer: %s\n", pool.GetName())
187+
_, err := emlbClient.DeleteLoadBalancerPool(ctx, pool.GetId())
188+
if err != nil {
189+
errs = append(errs, fmt.Errorf("failed to delete Load Balancer %q: %w", pool.GetName(), err))
190+
}
191+
}
192+
}
193+
194+
return kerrors.NewAggregate(errs)
195+
}
196+
197+
func deleteEMLBs(ctx context.Context, emlbClient *emlb.EMLB, lbs *lbaas.LoadBalancerCollection) error {
198+
var errs []error
199+
200+
for _, lb := range lbs.Loadbalancers {
201+
if time.Since(lb.GetCreatedAt()) > 4*time.Hour {
202+
fmt.Printf("Deleting Load Balancer: %s\n", lb.GetName())
203+
_, err := emlbClient.DeleteLoadBalancer(ctx, lb.GetId())
204+
if err != nil {
205+
errs = append(errs, fmt.Errorf("failed to delete Load Balancer %q: %w", lb.GetName(), err))
206+
}
207+
}
208+
}
209+
210+
return kerrors.NewAggregate(errs)
211+
}

controllers/packetcluster_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ func (r *PacketClusterReconciler) reconcileDelete(ctx context.Context, clusterSc
196196
// Create new EMLB object
197197
lb := emlb.NewEMLB(r.PacketClient.GetConfig().DefaultHeader["X-Auth-Token"], packetCluster.Spec.ProjectID, packetCluster.Spec.Metro)
198198

199-
if err := lb.DeleteLoadBalancer(ctx, clusterScope); err != nil {
199+
if err := lb.DeleteClusterLoadBalancer(ctx, clusterScope); err != nil {
200200
return fmt.Errorf("failed to delete load balancer: %w", err)
201201
}
202202
}

internal/emlb/emlb.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,8 @@ func (e *EMLB) ReconcileVIPOrigin(ctx context.Context, machineScope *scope.Machi
231231
return nil
232232
}
233233

234-
// DeleteLoadBalancer deletes the Equinix Metal Load Balancer associated with a given ClusterScope.
235-
func (e *EMLB) DeleteLoadBalancer(ctx context.Context, clusterScope *scope.ClusterScope) error {
234+
// DeleteClusterLoadBalancer deletes the Equinix Metal Load Balancer associated with a given ClusterScope.
235+
func (e *EMLB) DeleteClusterLoadBalancer(ctx context.Context, clusterScope *scope.ClusterScope) error {
236236
log := ctrl.LoggerFrom(ctx)
237237

238238
packetCluster := clusterScope.PacketCluster
@@ -247,7 +247,7 @@ func (e *EMLB) DeleteLoadBalancer(ctx context.Context, clusterScope *scope.Clust
247247

248248
log.Info("Deleting EMLB", "Cluster Metro", e.metro, "Cluster Name", clusterName, "Project ID", e.projectID, "Load Balancer ID", lbID)
249249

250-
resp, err := e.deleteLoadBalancer(ctx, lbID)
250+
resp, err := e.DeleteLoadBalancer(ctx, lbID)
251251
if err != nil {
252252
if resp.StatusCode == http.StatusNotFound {
253253
return nil
@@ -273,7 +273,7 @@ func (e *EMLB) DeleteLoadBalancerOrigin(ctx context.Context, machineScope *scope
273273

274274
log.Info("Deleting EMLB Pool", "Cluster Metro", e.metro, "Cluster Name", clusterName, "Project ID", e.projectID, "Pool ID", lbPoolID)
275275

276-
resp, err := e.deletePool(ctx, lbPoolID)
276+
resp, err := e.DeleteLoadBalancerPool(ctx, lbPoolID)
277277
if err != nil {
278278
if resp.StatusCode != http.StatusNotFound {
279279
return nil
@@ -284,6 +284,22 @@ func (e *EMLB) DeleteLoadBalancerOrigin(ctx context.Context, machineScope *scope
284284
return err
285285
}
286286

287+
// GetLoadBalancers returns a Load Balancer Collection of all the Equinix Metal Load Balancers in a project.
288+
func (e *EMLB) GetLoadBalancers(ctx context.Context) (*lbaas.LoadBalancerCollection, *http.Response, error) {
289+
ctx = context.WithValue(ctx, lbaas.ContextOAuth2, e.tokenExchanger)
290+
291+
LoadBalancerCollection, resp, err := e.client.ProjectsApi.ListLoadBalancers(ctx, e.projectID).Execute()
292+
return LoadBalancerCollection, resp, err
293+
}
294+
295+
// GetLoadBalancerPools returns a Load Balancer Collection of all the Equinix Metal Load Balancers in a project.
296+
func (e *EMLB) GetLoadBalancerPools(ctx context.Context) (*lbaas.LoadBalancerPoolCollection, *http.Response, error) {
297+
ctx = context.WithValue(ctx, lbaas.ContextOAuth2, e.tokenExchanger)
298+
299+
LoadBalancerPoolCollection, resp, err := e.client.ProjectsApi.ListPools(ctx, e.projectID).Execute()
300+
return LoadBalancerPoolCollection, resp, err
301+
}
302+
287303
// getLoadBalancer Returns a Load Balancer object given an id.
288304
func (e *EMLB) getLoadBalancer(ctx context.Context, id string) (*lbaas.LoadBalancer, *http.Response, error) {
289305
ctx = context.WithValue(ctx, lbaas.ContextOAuth2, e.tokenExchanger)
@@ -452,12 +468,14 @@ func (e *EMLB) createOrigin(ctx context.Context, poolID, originName string, targ
452468
return e.client.PoolsApi.CreateLoadBalancerPoolOrigin(ctx, poolID).LoadBalancerPoolOriginCreate(createOriginRequest).Execute()
453469
}
454470

455-
func (e *EMLB) deleteLoadBalancer(ctx context.Context, lbID string) (*http.Response, error) {
471+
// DeleteLoadBalancer deletes an Equinix Metal Load Balancer given an ID.
472+
func (e *EMLB) DeleteLoadBalancer(ctx context.Context, lbID string) (*http.Response, error) {
456473
ctx = context.WithValue(ctx, lbaas.ContextOAuth2, e.tokenExchanger)
457474
return e.client.LoadBalancersApi.DeleteLoadBalancer(ctx, lbID).Execute()
458475
}
459476

460-
func (e *EMLB) deletePool(ctx context.Context, poolID string) (*http.Response, error) {
477+
// DeleteLoadBalancerPool deletes an Equinix Metal Load Balancer Origin Pool given an ID.
478+
func (e *EMLB) DeleteLoadBalancerPool(ctx context.Context, poolID string) (*http.Response, error) {
461479
ctx = context.WithValue(ctx, lbaas.ContextOAuth2, e.tokenExchanger)
462480
return e.client.PoolsApi.DeleteLoadBalancerPool(ctx, poolID).Execute()
463481
}

0 commit comments

Comments
 (0)