Skip to content

Commit 770a080

Browse files
drewhlicopybara-github
authored andcommitted
Add zonal NEG and routes cleanup support to cleanerupper, and update Go version
PiperOrigin-RevId: 814743591
1 parent 5019526 commit 770a080

8 files changed

Lines changed: 387 additions & 331 deletions

File tree

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
FROM golang:1.24 as builder
15+
FROM golang:1.25 as builder
1616

1717
WORKDIR /build
1818
COPY . .

cleanerupper/cleanerupper.go

Lines changed: 125 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package cleanerupper
1818

1919
import (
2020
"context"
21+
"errors"
2122
"fmt"
2223
"path"
2324
"strconv"
@@ -463,7 +464,6 @@ func CleanLoadBalancerResources(clients Clients, project string, delete PolicyFu
463464

464465
regionalForwardingRules := make(map[string][]*compute.ForwardingRule)
465466
regionalBackendServices := make(map[string][]*compute.BackendService)
466-
regionalNetworkEndpointGroups := make(map[string][]*compute.NetworkEndpointGroup)
467467
regionalURLMaps := make(map[string][]*compute.UrlMap)
468468
regionalHTTPProxies := make(map[string][]*compute.TargetHttpProxy)
469469

@@ -670,39 +670,11 @@ func CleanLoadBalancerResources(clients Clients, project string, delete PolicyFu
670670

671671
// Delete network endpoint groups, they might associated with health checks so
672672
// wait for those to be deleted first.
673-
regionalNEGs, ok := regionalNetworkEndpointGroups[region]
674-
if !ok {
675-
var err error
676-
regionalNEGs, err = clients.Daisy.ListRegionNetworkEndpointGroups(project, region)
677-
if err != nil {
678-
errsMu.Lock()
679-
errs = append(errs, err)
680-
errsMu.Unlock()
681-
} else {
682-
regionalNetworkEndpointGroups[region] = regionalNEGs
683-
}
684-
}
685-
for _, neg := range regionalNEGs {
686-
if !delete(neg) {
687-
continue
688-
}
689-
negpartial := fmt.Sprintf("projects/%s/regions/%s/networkEndpointGroups/%s", project, region, neg.Name)
690-
wg.Add(1)
691-
go func(negName string) {
692-
defer wg.Done()
693-
if !dryRun {
694-
if err := clients.Daisy.DeleteRegionNetworkEndpointGroup(project, region, negName); err != nil {
695-
errsMu.Lock()
696-
defer errsMu.Unlock()
697-
errs = append(errs, err)
698-
return
699-
}
700-
}
701-
deletedMu.Lock()
702-
defer deletedMu.Unlock()
703-
deleted = append(deleted, negpartial)
704-
}(neg.Name)
673+
deletedNEGs, err := deleteNetworkEndpointGroups(clients, project, region, delete, nil, dryRun)
674+
if err != nil {
675+
errs = append(errs, err)
705676
}
677+
deleted = append(deleted, deletedNEGs...)
706678
}
707679
wg.Wait()
708680
return deleted, errs
@@ -728,9 +700,13 @@ func CleanNetworks(clients Clients, project string, delete PolicyFunc, dryRun bo
728700
return nil, []error{fmt.Errorf("error listing subnetworks in project %q: %v", project, err)}
729701
}
730702

703+
routes, err := clients.Daisy.ListRoutes(project)
704+
if err != nil {
705+
return nil, []error{fmt.Errorf("error listing routes in project %q: %v", project, err)}
706+
}
707+
731708
regionalForwardingRules := make(map[string][]*compute.ForwardingRule)
732709
regionalBackendServices := make(map[string][]*compute.BackendService)
733-
regionalNetworkEndpointGroups := make(map[string][]*compute.NetworkEndpointGroup)
734710
regionalURLMaps := make(map[string][]*compute.UrlMap)
735711
regionalHTTPProxies := make(map[string][]*compute.TargetHttpProxy)
736712

@@ -788,7 +764,6 @@ func CleanNetworks(clients Clients, project string, delete PolicyFunc, dryRun bo
788764
}
789765
// Don't delete network yet - wait until resources associated with it are
790766
// deleted to avoid resource in use issues.
791-
792767
region := path.Base(sn.Region)
793768
regionFRs, ok := regionalForwardingRules[region]
794769
if !ok {
@@ -956,46 +931,13 @@ func CleanNetworks(clients Clients, project string, delete PolicyFunc, dryRun bo
956931
}
957932
wg.Wait()
958933

959-
regionalNEGs, ok := regionalNetworkEndpointGroups[region]
960-
if !ok {
961-
var err error
962-
regionalNEGs, err = clients.Daisy.ListRegionNetworkEndpointGroups(project, region)
963-
if err != nil {
964-
errsMu.Lock()
965-
errs = append(errs, err)
966-
errsMu.Unlock()
967-
} else {
968-
regionalNetworkEndpointGroups[region] = regionalNEGs
969-
}
970-
}
971-
for _, neg := range regionalNEGs {
972-
// Delete all NEGs in the same region as the subnetwork.
973-
if neg.Network != n.SelfLink {
974-
continue
975-
}
976-
negpartial := fmt.Sprintf("projects/%s/regions/%s/networkEndpointGroups/%s", project, region, neg.Name)
977-
wg.Add(1)
978-
go func(negName string) {
979-
defer wg.Done()
980-
if !dryRun {
981-
if err := clients.Daisy.DeleteRegionNetworkEndpointGroup(project, region, negName); err != nil {
982-
errsMu.Lock()
983-
defer errsMu.Unlock()
984-
errs = append(errs, err)
985-
return
986-
}
987-
}
988-
deletedMu.Lock()
989-
defer deletedMu.Unlock()
990-
deleted = append(deleted, negpartial)
991-
}(neg.Name)
934+
deletedNEGs, err := deleteNetworkEndpointGroups(clients, project, region, delete, n, dryRun)
935+
if err != nil {
936+
errs = append(errs, err)
992937
}
993-
// Wait for NEG deletion before subnetwork deletion to avoid resource in use
994-
// issues.
995-
wg.Wait()
938+
deleted = append(deleted, deletedNEGs...)
996939

997940
subnetpartial := fmt.Sprintf("projects/%s/regions/%s/subnetworks/%s", project, region, sn.Name)
998-
wg.Wait()
999941
wg.Add(1)
1000942
go func(snName string) {
1001943
defer wg.Done()
@@ -1012,12 +954,32 @@ func CleanNetworks(clients Clients, project string, delete PolicyFunc, dryRun bo
1012954
deleted = append(deleted, subnetpartial)
1013955
}(sn.Name)
1014956
}
1015-
// Wait for subnetwork deletion before network deletion to avoid resource
1016-
// in use issues.
957+
// Delete all routes in the same network.
958+
for _, r := range routes {
959+
if r.Network != n.SelfLink {
960+
continue
961+
}
962+
rpartial := fmt.Sprintf("projects/%s/global/routes/%s", project, r.Name)
963+
wg.Add(1)
964+
go func(rName string) {
965+
defer wg.Done()
966+
if !dryRun {
967+
if err := clients.Daisy.DeleteRoute(project, rName); err != nil {
968+
errsMu.Lock()
969+
defer errsMu.Unlock()
970+
errs = append(errs, err)
971+
return
972+
}
973+
}
974+
deletedMu.Lock()
975+
defer deletedMu.Unlock()
976+
deleted = append(deleted, rpartial)
977+
}(r.Name)
978+
}
979+
// Wait for subnetwork and routes deletion before network deletion to avoid
980+
// resource in use issues.
1017981
wg.Wait()
1018-
wg.Add(1)
1019-
go func() {
1020-
defer wg.Done()
982+
wg.Go(func() {
1021983
if !dryRun {
1022984
if err := clients.Daisy.DeleteNetwork(project, name); err != nil {
1023985
errsMu.Lock()
@@ -1029,12 +991,97 @@ func CleanNetworks(clients Clients, project string, delete PolicyFunc, dryRun bo
1029991
deletedMu.Lock()
1030992
defer deletedMu.Unlock()
1031993
deleted = append(deleted, netpartial)
1032-
}()
994+
})
1033995
}
1034996
wg.Wait()
1035997
return deleted, errs
1036998
}
1037999

1000+
// deleteNetworkEndpointGroups deletes all network endpoint groups in the given network and region.
1001+
func deleteNetworkEndpointGroups(clients Clients, project, region string, delete PolicyFunc, network *compute.Network, dryRun bool) ([]string, error) {
1002+
var errs []error
1003+
var errsMu sync.Mutex
1004+
var deleted []string
1005+
var deletedMu sync.Mutex
1006+
var wg sync.WaitGroup
1007+
regionalNEGs, err := clients.Daisy.ListRegionNetworkEndpointGroups(project, region)
1008+
if err != nil {
1009+
errsMu.Lock()
1010+
errs = append(errs, err)
1011+
errsMu.Unlock()
1012+
}
1013+
for _, neg := range regionalNEGs {
1014+
// Make sure the NEG is associated with the given network.
1015+
if network != nil && neg.Network != network.SelfLink {
1016+
continue
1017+
}
1018+
// Make sure the NEG should be deleted.
1019+
if !delete(neg) {
1020+
continue
1021+
}
1022+
negpartial := fmt.Sprintf("projects/%s/regions/%s/networkEndpointGroups/%s", project, region, neg.Name)
1023+
wg.Add(1)
1024+
go func(negName string) {
1025+
defer wg.Done()
1026+
if !dryRun {
1027+
if err := clients.Daisy.DeleteRegionNetworkEndpointGroup(project, region, negName); err != nil {
1028+
errsMu.Lock()
1029+
defer errsMu.Unlock()
1030+
errs = append(errs, err)
1031+
return
1032+
}
1033+
}
1034+
deletedMu.Lock()
1035+
defer deletedMu.Unlock()
1036+
deleted = append(deleted, negpartial)
1037+
}(neg.Name)
1038+
}
1039+
1040+
// Delete all zonal NEGs within the given region in the given network.
1041+
zones, err := clients.Daisy.ListZones(project, daisyCompute.Filter(fmt.Sprintf("name eq %s-[a-z]", region)))
1042+
if err != nil {
1043+
errsMu.Lock()
1044+
errs = append(errs, err)
1045+
errsMu.Unlock()
1046+
}
1047+
for _, zone := range zones {
1048+
zoneString := zone.Name
1049+
zonalNEGs, err := clients.Daisy.ListNetworkEndpointGroups(project, zoneString)
1050+
if err != nil {
1051+
errsMu.Lock()
1052+
errs = append(errs, err)
1053+
errsMu.Unlock()
1054+
}
1055+
for _, neg := range zonalNEGs {
1056+
// Make sure the NEG is associated with the given network.
1057+
if network != nil && neg.Network != network.SelfLink {
1058+
continue
1059+
}
1060+
// Make sure the NEG should be deleted.
1061+
if !delete(neg) {
1062+
continue
1063+
}
1064+
negpartial := fmt.Sprintf("projects/%s/zones/%s/networkEndpointGroups/%s", project, zoneString, neg.Name)
1065+
wg.Add(1)
1066+
go func(negName string) {
1067+
defer wg.Done()
1068+
if !dryRun {
1069+
if err := clients.Daisy.DeleteNetworkEndpointGroup(project, zoneString, negName); err != nil {
1070+
errsMu.Lock()
1071+
errs = append(errs, err)
1072+
errsMu.Unlock()
1073+
}
1074+
}
1075+
deletedMu.Lock()
1076+
defer deletedMu.Unlock()
1077+
deleted = append(deleted, negpartial)
1078+
}(neg.Name)
1079+
}
1080+
}
1081+
wg.Wait()
1082+
return deleted, errors.Join(errs...)
1083+
}
1084+
10381085
// CleanGuestPolicies deletes all guest policies indicated, returning a slice
10391086
// of deleted policy names and a slice of encountered errors. On dry run,
10401087
// returns what would have been deleted.

0 commit comments

Comments
 (0)