@@ -2,69 +2,100 @@ package gcp
22
33import (
44 "context"
5+ "fmt"
56
6- "github.com/pkg/errors "
7+ "github.com/sirupsen/logrus "
78 "google.golang.org/api/compute/v1"
89 "google.golang.org/api/googleapi"
910
1011 "github.com/openshift/installer/pkg/types/gcp"
1112)
1213
13- func (o * ClusterUninstaller ) listBackendServices (ctx context.Context ) ([]cloudResource , error ) {
14- return o .listBackendServicesWithFilter (ctx , "items(name),nextPageToken" , o .clusterIDFilter (), nil )
14+ func (o * ClusterUninstaller ) listBackendServices (ctx context.Context , scope resourceScope ) ([]cloudResource , error ) {
15+ return o .listBackendServicesWithFilter (ctx , "items(name),nextPageToken" , o .clusterIDFilter (), nil , scope )
16+ }
17+
18+ func createBackendServiceCloudResources (filterFunc func (* compute.BackendService ) bool , list * compute.BackendServiceList ) []cloudResource {
19+ result := []cloudResource {}
20+
21+ for _ , item := range list .Items {
22+ if filterFunc == nil || filterFunc (item ) {
23+ logrus .Debugf ("Found backend service: %s" , item .Name )
24+ result = append (result , cloudResource {
25+ key : item .Name ,
26+ name : item .Name ,
27+ typeName : "backendservice" ,
28+ quota : []gcp.QuotaUsage {{
29+ Metric : & gcp.Metric {
30+ Service : gcp .ServiceComputeEngineAPI ,
31+ Limit : "backend_services" ,
32+ },
33+ Amount : 1 ,
34+ }},
35+ })
36+ }
37+ }
38+
39+ return result
1540}
1641
1742// listBackendServicesWithFilter lists backend services in the project that satisfy the filter criteria.
1843// The fields parameter specifies which fields should be returned in the result, the filter string contains
1944// a filter string passed to the API to filter results. The filterFunc is a client-side filtering function
2045// that determines whether a particular result should be returned or not.
21- func (o * ClusterUninstaller ) listBackendServicesWithFilter (ctx context.Context , fields string , filter string , filterFunc func (* compute.BackendService ) bool ) ([]cloudResource , error ) {
22- o .Logger .Debugf ("Listing backend services" )
46+ func (o * ClusterUninstaller ) listBackendServicesWithFilter (ctx context.Context , fields string , filter string , filterFunc func (* compute.BackendService ) bool , scope resourceScope ) ([]cloudResource , error ) {
47+ o .Logger .Debugf ("Listing %s backend services" , scope )
2348 ctx , cancel := context .WithTimeout (ctx , defaultTimeout )
2449 defer cancel ()
2550 result := []cloudResource {}
51+
52+ if scope == gcpGlobalResource {
53+ req := o .computeSvc .BackendServices .List (o .ProjectID ).Fields (googleapi .Field (fields ))
54+ if len (filter ) > 0 {
55+ req = req .Filter (filter )
56+ }
57+ err := req .Pages (ctx , func (list * compute.BackendServiceList ) error {
58+ result = append (result , createBackendServiceCloudResources (filterFunc , list )... )
59+ return nil
60+ })
61+ if err != nil {
62+ return nil , fmt .Errorf ("failed to list global backend services: %w" , err )
63+ }
64+ return result , nil
65+ }
66+
67+ // Regional backend services
2668 req := o .computeSvc .RegionBackendServices .List (o .ProjectID , o .Region ).Fields (googleapi .Field (fields ))
2769 if len (filter ) > 0 {
2870 req = req .Filter (filter )
2971 }
3072 err := req .Pages (ctx , func (list * compute.BackendServiceList ) error {
31- for _ , item := range list .Items {
32- if filterFunc == nil || filterFunc != nil && filterFunc (item ) {
33- o .Logger .Debugf ("Found backend service: %s" , item .Name )
34- result = append (result , cloudResource {
35- key : item .Name ,
36- name : item .Name ,
37- typeName : "backendservice" ,
38- quota : []gcp.QuotaUsage {{
39- Metric : & gcp.Metric {
40- Service : gcp .ServiceComputeEngineAPI ,
41- Limit : "backend_services" ,
42- },
43- Amount : 1 ,
44- }},
45- })
46- }
47- }
73+ result = append (result , createBackendServiceCloudResources (filterFunc , list )... )
4874 return nil
4975 })
5076 if err != nil {
51- return nil , errors . Wrapf ( err , "failed to list backend services" )
77+ return nil , fmt . Errorf ( "failed to list regional backend services: %w" , err )
5278 }
79+
5380 return result , nil
5481}
5582
56- func (o * ClusterUninstaller ) deleteBackendService (ctx context.Context , item cloudResource ) error {
83+ func (o * ClusterUninstaller ) deleteBackendService (ctx context.Context , item cloudResource , scope resourceScope ) error {
5784 o .Logger .Debugf ("Deleting backend service %s" , item .name )
5885 ctx , cancel := context .WithTimeout (ctx , defaultTimeout )
5986 defer cancel ()
60- op , err := o .computeSvc .RegionBackendServices .Delete (o .ProjectID , o .Region , item .name ).RequestId (o .requestID (item .typeName , item .name )).Context (ctx ).Do ()
61- if err != nil && ! isNoOp (err ) {
62- o .resetRequestID (item .typeName , item .name )
63- return errors .Wrapf (err , "failed to delete backend service %s" , item .name )
87+
88+ var op * compute.Operation
89+ var err error
90+ if scope == gcpGlobalResource {
91+ op , err = o .computeSvc .BackendServices .Delete (o .ProjectID , item .name ).RequestId (o .requestID (item .typeName , item .name )).Context (ctx ).Do ()
92+ } else {
93+ op , err = o .computeSvc .RegionBackendServices .Delete (o .ProjectID , o .Region , item .name ).RequestId (o .requestID (item .typeName , item .name )).Context (ctx ).Do ()
6494 }
95+
6596 if op != nil && op .Status == "DONE" && isErrorStatus (op .HttpErrorStatusCode ) {
6697 o .resetRequestID (item .typeName , item .name )
67- return errors .Errorf ("failed to delete backend service %s with error: %s" , item .name , operationErrorMessage (op ))
98+ return fmt .Errorf ("failed to delete backend service %s with error: %s: %w " , item .name , operationErrorMessage (op ), err )
6899 }
69100 if (err != nil && isNoOp (err )) || (op != nil && op .Status == "DONE" ) {
70101 o .resetRequestID (item .typeName , item .name )
@@ -77,19 +108,25 @@ func (o *ClusterUninstaller) deleteBackendService(ctx context.Context, item clou
77108// destroyBackendServices removes backend services with a name prefixed
78109// with the cluster's infra ID.
79110func (o * ClusterUninstaller ) destroyBackendServices (ctx context.Context ) error {
80- found , err := o .listBackendServices (ctx )
81- if err != nil {
82- return err
83- }
84- items := o .insertPendingItems ("backendservice" , found )
85- for _ , item := range items {
86- err := o .deleteBackendService (ctx , item )
111+ for _ , scope := range []resourceScope {gcpGlobalResource , gcpRegionalResource } {
112+ found , err := o .listBackendServices (ctx , scope )
87113 if err != nil {
88- o .errorTracker .suppressWarning (item .key , err , o .Logger )
114+ return fmt .Errorf ("failed to list backend services: %w" , err )
115+ }
116+ items := o .insertPendingItems ("backendservice" , found )
117+ for _ , item := range items {
118+ err := o .deleteBackendService (ctx , item , scope )
119+ if err != nil {
120+ o .errorTracker .suppressWarning (item .key , err , o .Logger )
121+ }
122+ }
123+ if items = o .getPendingItems ("backendservice" ); len (items ) > 0 {
124+ for _ , item := range items {
125+ if err := o .deleteBackendService (ctx , item , scope ); err != nil {
126+ return fmt .Errorf ("error deleting pending backend service %s: %w" , item .name , err )
127+ }
128+ }
89129 }
90- }
91- if items = o .getPendingItems ("backendservice" ); len (items ) > 0 {
92- return errors .Errorf ("%d items pending" , len (items ))
93130 }
94131 return nil
95132}
0 commit comments