Skip to content

Commit 87037dd

Browse files
authored
feat: support deletion of firewall policies attached to folders in clean up module (#76)
* support deletion of firewall policies attached to folders * continue processing of firewall policies on error
1 parent 2875deb commit 87037dd

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

modules/project_cleanup/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ The following services must be enabled on the project housing the cleanup functi
1515
- Cloud Functions (`cloudfunctions.googleapis.com`)
1616
- Cloud Scheduler (`cloudscheduler.googleapis.com`)
1717
- Cloud Resource Manager (`cloudresourcemanager.googleapis.com`)
18+
- Compute Engine API (`compute.googleapis.com`)
1819

1920
<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
2021
## Inputs

modules/project_cleanup/function_source/main.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
212223
func 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 {

modules/project_cleanup/main.tf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ resource "google_organization_iam_member" "main" {
2929
"roles/resourcemanager.projectDeleter",
3030
"roles/resourcemanager.folderEditor",
3131
"roles/resourcemanager.lienModifier",
32-
"roles/owner"
32+
"roles/serviceusage.serviceUsageAdmin",
33+
"roles/compute.orgSecurityResourceAdmin",
34+
"roles/compute.orgSecurityPolicyAdmin",
35+
"roles/viewer"
3336
])
3437

3538
member = "serviceAccount:${google_service_account.project_cleaner_function.email}"

0 commit comments

Comments
 (0)