@@ -31,6 +31,7 @@ import (
3131 "golang.org/x/oauth2/google"
3232 "google.golang.org/api/cloudresourcemanager/v1"
3333 cloudresourcemanager2 "google.golang.org/api/cloudresourcemanager/v2"
34+ "google.golang.org/api/compute/v1"
3435 "google.golang.org/api/googleapi"
3536 "google.golang.org/api/servicemanagement/v1"
3637)
@@ -203,12 +204,22 @@ func getFolderServiceOrTerminateExecution(client *http.Client) *cloudresourceman
203204 logger .Println ("Try to get Folders Service" )
204205 cloudResourceManagerService , err := cloudresourcemanager2 .New (client )
205206 if err != nil {
206- logger .Fatalf ("Fail to get Folders Servicewith error [%s], terminate execution" , err .Error ())
207+ logger .Fatalf ("Fail to get Folders Service with error [%s], terminate execution" , err .Error ())
207208 }
208209 logger .Println ("Got Folders Service" )
209210 return cloudResourceManagerService .Folders
210211}
211212
213+ func getFirewallPoliciesServiceOrTerminateExecution (client * http.Client ) * compute.FirewallPoliciesService {
214+ logger .Println ("Try to get Firewall Policies Service" )
215+ computeService , err := compute .New (client )
216+ if err != nil {
217+ logger .Fatalf ("Fail to get Firewall Policies Service with error [%s], terminate execution" , err .Error ())
218+ }
219+ logger .Println ("Got Firewall Policies Service" )
220+ return computeService .FirewallPolicies
221+ }
222+
212223func initializeGoogleClient (ctx context.Context ) * http.Client {
213224 logger .Println ("Try to initialize Google client" )
214225 client , err := google .DefaultClient (ctx , cloudresourcemanager .CloudPlatformScope )
@@ -223,6 +234,7 @@ func invoke(ctx context.Context) {
223234 client := initializeGoogleClient (ctx )
224235 cloudResourceManagerService := getResourceManagerServiceOrTerminateExecution (client )
225236 folderService := getFolderServiceOrTerminateExecution (client )
237+ firewallPoliciesService := getFirewallPoliciesServiceOrTerminateExecution (client )
226238 endpointService := getServiceManagementServiceOrTerminateExecution (client )
227239
228240 removeLien := func (name string ) {
@@ -235,6 +247,27 @@ func invoke(ctx context.Context) {
235247 }
236248 }
237249
250+ removeFirewallPolicies := func (folder string ) {
251+ logger .Printf ("Try to remove Firewall Policies from folder [%s]" , folder )
252+ firewallPolicyList , err := firewallPoliciesService .List ().ParentId (folder ).Context (ctx ).Do ()
253+ if err != nil {
254+ logger .Printf ("Fail to list Firewall Policies from folder [%s], error [%s]" , folder , err .Error ())
255+ return
256+ }
257+ for _ , policy := range firewallPolicyList .Items {
258+ for _ , association := range policy .Associations {
259+ _ , err := firewallPoliciesService .RemoveAssociation (policy .Name ).Name (association .Name ).Context (ctx ).Do ()
260+ if err != nil {
261+ logger .Printf ("Fail to Remove Association for Firewall Policies from folder [%s], error [%s]" , folder , err .Error ())
262+ }
263+ }
264+ _ , err := firewallPoliciesService .Delete (policy .Name ).Context (ctx ).Do ()
265+ if err != nil {
266+ logger .Printf ("Fail to delete Firewall Policy [%s] from folder [%s], error [%s]" , policy .Name , folder , err .Error ())
267+ }
268+ }
269+ }
270+
238271 removeProjectById := func (projectId string ) error {
239272 _ , err := cloudResourceManagerService .Projects .Delete (projectId ).Context (ctx ).Do ()
240273 return err
@@ -312,6 +345,7 @@ func invoke(ctx context.Context) {
312345
313346 removeFolder := func (folder * cloudresourcemanager2.Folder ) {
314347 folderId := folder .Name
348+ removeFirewallPolicies (folderId )
315349 logger .Printf ("Try to delete folder with id [%s]" , folderId )
316350 _ , err := folderService .Delete (folderId ).Do ()
317351 if err != nil {
0 commit comments