@@ -18,6 +18,7 @@ package cleanerupper
1818
1919import (
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