Skip to content

Commit 92553eb

Browse files
authored
feat(project_cleanup): remove clusters prior to project (#246)
1 parent 94d54f7 commit 92553eb

File tree

3 files changed

+113
-50
lines changed

3 files changed

+113
-50
lines changed

modules/project_cleanup/function_source/go.mod

+15-14
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,32 @@ go 1.21
44

55
require (
66
cloud.google.com/go/asset v1.19.3
7+
cloud.google.com/go/container v1.38.0
78
cloud.google.com/go/securitycenter v1.32.0
89
golang.org/x/net v0.27.0
910
golang.org/x/oauth2 v0.21.0
10-
google.golang.org/api v0.187.0
11+
google.golang.org/api v0.189.0
1112
)
1213

1314
require (
1415
cloud.google.com/go v0.115.0 // indirect
15-
cloud.google.com/go/accesscontextmanager v1.8.7 // indirect
16-
cloud.google.com/go/auth v0.6.1 // indirect
17-
cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect
18-
cloud.google.com/go/compute/metadata v0.3.0 // indirect
19-
cloud.google.com/go/iam v1.1.8 // indirect
20-
cloud.google.com/go/longrunning v0.5.7 // indirect
21-
cloud.google.com/go/orgpolicy v1.12.3 // indirect
22-
cloud.google.com/go/osconfig v1.12.7 // indirect
16+
cloud.google.com/go/accesscontextmanager v1.8.9 // indirect
17+
cloud.google.com/go/auth v0.7.2 // indirect
18+
cloud.google.com/go/auth/oauth2adapt v0.2.3 // indirect
19+
cloud.google.com/go/compute/metadata v0.5.0 // indirect
20+
cloud.google.com/go/iam v1.1.10 // indirect
21+
cloud.google.com/go/longrunning v0.5.9 // indirect
22+
cloud.google.com/go/orgpolicy v1.12.5 // indirect
23+
cloud.google.com/go/osconfig v1.13.0 // indirect
2324
github.com/felixge/httpsnoop v1.0.4 // indirect
24-
github.com/go-logr/logr v1.4.1 // indirect
25+
github.com/go-logr/logr v1.4.2 // indirect
2526
github.com/go-logr/stdr v1.2.2 // indirect
2627
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
2728
github.com/golang/protobuf v1.5.4 // indirect
2829
github.com/google/s2a-go v0.1.7 // indirect
2930
github.com/google/uuid v1.6.0 // indirect
3031
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
31-
github.com/googleapis/gax-go/v2 v2.12.5 // indirect
32+
github.com/googleapis/gax-go/v2 v2.13.0 // indirect
3233
go.opencensus.io v0.24.0 // indirect
3334
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
3435
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
@@ -40,9 +41,9 @@ require (
4041
golang.org/x/sys v0.22.0 // indirect
4142
golang.org/x/text v0.16.0 // indirect
4243
golang.org/x/time v0.5.0 // indirect
43-
google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d // indirect
44-
google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 // indirect
45-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect
44+
google.golang.org/genproto v0.0.0-20240722135656-d784300faade // indirect
45+
google.golang.org/genproto/googleapis/api v0.0.0-20240722135656-d784300faade // indirect
46+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240722135656-d784300faade // indirect
4647
google.golang.org/grpc v1.64.1 // indirect
4748
google.golang.org/protobuf v1.34.2 // indirect
4849
)

modules/project_cleanup/function_source/go.sum

+32-28
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
22
cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
33
cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
4-
cloud.google.com/go/accesscontextmanager v1.8.7 h1:GgdNoDwZR5RIO3j8XwXqa6Gc6q5mP3KYMdFC7FEVyG4=
5-
cloud.google.com/go/accesscontextmanager v1.8.7/go.mod h1:jSvChL1NBQ+uLY9zUBdPy9VIlozPoHptdBnRYeWuQoM=
4+
cloud.google.com/go/accesscontextmanager v1.8.9 h1:oVjc3eFQP92zezKsof5ly6ENhuNSsgadRdFKhUn7L9g=
5+
cloud.google.com/go/accesscontextmanager v1.8.9/go.mod h1:IXvQesVgOC7aXgK9OpYFn5eWnzz8fazegIiJ5WnCOVw=
66
cloud.google.com/go/asset v1.19.3 h1:vl8wy3jpRa3ATctym5tiICp70iymSyOVbpKb3tKA668=
77
cloud.google.com/go/asset v1.19.3/go.mod h1:1j8NNcHsbSE/KeHMZrizPIS6c8nm0WjEAPoFXzXNCj4=
8-
cloud.google.com/go/auth v0.6.1 h1:T0Zw1XM5c1GlpN2HYr2s+m3vr1p2wy+8VN+Z1FKxW38=
9-
cloud.google.com/go/auth v0.6.1/go.mod h1:eFHG7zDzbXHKmjJddFG/rBlcGp6t25SwRUiEQSlO4x4=
10-
cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4=
11-
cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q=
12-
cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
13-
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
14-
cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0=
15-
cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE=
16-
cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU=
17-
cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng=
18-
cloud.google.com/go/orgpolicy v1.12.3 h1:fGftW2bPi8vTjQm57xlwtLBZQcrgC+c3HMFBzJ+KWPc=
19-
cloud.google.com/go/orgpolicy v1.12.3/go.mod h1:6BOgIgFjWfJzTsVcib/4QNHOAeOjCdaBj69aJVs//MA=
20-
cloud.google.com/go/osconfig v1.12.7 h1:HXsXGFaFaLTklwKgSob/GSE+c3verYDQDgreFaosxyc=
21-
cloud.google.com/go/osconfig v1.12.7/go.mod h1:ID7Lbqr0fiihKMwAOoPomWRqsZYKWxfiuafNZ9j1Y1M=
8+
cloud.google.com/go/auth v0.7.2 h1:uiha352VrCDMXg+yoBtaD0tUF4Kv9vrtrWPYXwutnDE=
9+
cloud.google.com/go/auth v0.7.2/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs=
10+
cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI=
11+
cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I=
12+
cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
13+
cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
14+
cloud.google.com/go/container v1.38.0 h1:GP5zLamfvPZeOTifnGBSER/br76D5eJ97xhcXXrh5tM=
15+
cloud.google.com/go/container v1.38.0/go.mod h1:U0uPBvkVWOJGY/0qTVuPS7NeafFEUsHSPqT5pB8+fCY=
16+
cloud.google.com/go/iam v1.1.10 h1:ZSAr64oEhQSClwBL670MsJAW5/RLiC6kfw3Bqmd5ZDI=
17+
cloud.google.com/go/iam v1.1.10/go.mod h1:iEgMq62sg8zx446GCaijmA2Miwg5o3UbO+nI47WHJps=
18+
cloud.google.com/go/longrunning v0.5.9 h1:haH9pAuXdPAMqHvzX0zlWQigXT7B0+CL4/2nXXdBo5k=
19+
cloud.google.com/go/longrunning v0.5.9/go.mod h1:HD+0l9/OOW0za6UWdKJtXoFAX/BGg/3Wj8p10NeWF7c=
20+
cloud.google.com/go/orgpolicy v1.12.5 h1:NEbK9U6HuhjXOUI1+fJVdIEh0FHiJtGVq4kYQQ5B8t8=
21+
cloud.google.com/go/orgpolicy v1.12.5/go.mod h1:f778/jOHKp6cP6NbbQgjy4SDfQf6BoVGiSWdxky3ONQ=
22+
cloud.google.com/go/osconfig v1.13.0 h1:k+nAmaTcJ08BSR1yGadRZyLwRSvk5XgaZJinS1sEz4Q=
23+
cloud.google.com/go/osconfig v1.13.0/go.mod h1:tlACnQi1rtSLnHRYzfw9SH9zXs0M7S1jqiW2EOCn2Y0=
2224
cloud.google.com/go/securitycenter v1.32.0 h1:UJvalA9NoLhU0DWLa10qMSvMucEe+iQOqxC4/KGqMys=
2325
cloud.google.com/go/securitycenter v1.32.0/go.mod h1:s1dN6hM6HZyzUyJrqBoGvhxR/GecT5u48sidMIgDxTo=
2426
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -35,8 +37,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
3537
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
3638
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
3739
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
38-
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
39-
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
40+
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
41+
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
4042
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
4143
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
4244
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -70,8 +72,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
7072
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
7173
github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
7274
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
73-
github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA=
74-
github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E=
75+
github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
76+
github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
7577
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
7678
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7779
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -93,6 +95,8 @@ go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
9395
go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
9496
go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
9597
go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
98+
go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
99+
go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
96100
go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
97101
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
98102
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -137,19 +141,19 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
137141
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
138142
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
139143
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
140-
google.golang.org/api v0.187.0 h1:Mxs7VATVC2v7CY+7Xwm4ndkX71hpElcvx0D1Ji/p1eo=
141-
google.golang.org/api v0.187.0/go.mod h1:KIHlTc4x7N7gKKuVsdmfBXN13yEEWXWFURWY6SBp2gk=
144+
google.golang.org/api v0.189.0 h1:equMo30LypAkdkLMBqfeIqtyAnlyig1JSZArl4XPwdI=
145+
google.golang.org/api v0.189.0/go.mod h1:FLWGJKb0hb+pU2j+rJqwbnsF+ym+fQs73rbJ+KAUgy8=
142146
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
143147
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
144148
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
145149
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
146150
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
147-
google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d h1:PksQg4dV6Sem3/HkBX+Ltq8T0ke0PKIRBNBatoDTVls=
148-
google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:s7iA721uChleev562UJO2OYB0PPT9CMFjV+Ce7VJH5M=
149-
google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 h1:MuYw1wJzT+ZkybKfaOXKp5hJiZDn2iHaXRw0mRYdHSc=
150-
google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4/go.mod h1:px9SlOOZBg1wM1zdnr8jEL4CNGUBZ+ZKYtNPApNQc4c=
151-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk=
152-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
151+
google.golang.org/genproto v0.0.0-20240722135656-d784300faade h1:lKFsS7wpngDgSCeFn7MoLy+wBDQZ1UQIJD4UNM1Qvkg=
152+
google.golang.org/genproto v0.0.0-20240722135656-d784300faade/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY=
153+
google.golang.org/genproto/googleapis/api v0.0.0-20240722135656-d784300faade h1:WxZOF2yayUHpHSbUE6NMzumUzBxYc3YGwo0YHnbzsJY=
154+
google.golang.org/genproto/googleapis/api v0.0.0-20240722135656-d784300faade/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0=
155+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240722135656-d784300faade h1:oCRSWfwGXQsqlVdErcyTt4A93Y8fo0/9D4b1gnI++qo=
156+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240722135656-d784300faade/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
153157
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
154158
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
155159
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=

modules/project_cleanup/function_source/main.go

+66-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2019 Google LLC
2+
Copyright 2019-2024 Google LLC
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -29,6 +29,8 @@ import (
2929

3030
asset "cloud.google.com/go/asset/apiv1"
3131
"cloud.google.com/go/asset/apiv1/assetpb"
32+
container "cloud.google.com/go/container/apiv1"
33+
"cloud.google.com/go/container/apiv1/containerpb"
3234
securitycenter "cloud.google.com/go/securitycenter/apiv1"
3335
"cloud.google.com/go/securitycenter/apiv1/securitycenterpb"
3436
"golang.org/x/net/context"
@@ -240,7 +242,7 @@ func getRegexListFromEnv(envVariableName string) []*regexp.Regexp {
240242
logger.Printf("Got Regex list [%s] from [%s] env variable", regexList, envVariableName)
241243
}
242244

243-
//build Regexes
245+
// build Regexes
244246
for _, r := range regexList {
245247
result, err := regexp.Compile(r)
246248
if err != nil {
@@ -381,7 +383,7 @@ func getBillingAccountSinkServiceOrTerminateExecution(ctx context.Context, clien
381383
return loggingService.BillingAccounts.Sinks
382384
}
383385

384-
func getSCCNotificationServiceOrTerminateExecution(ctx context.Context, client *http.Client) *securitycenter.Client {
386+
func getSCCNotificationServiceOrTerminateExecution(ctx context.Context) *securitycenter.Client {
385387
logger.Println("Try to get SCC Notification Service")
386388
securitycenterClient, err := securitycenter.NewClient(ctx)
387389
if err != nil {
@@ -391,7 +393,7 @@ func getSCCNotificationServiceOrTerminateExecution(ctx context.Context, client *
391393
return securitycenterClient
392394
}
393395

394-
func getAssetServiceOrTerminateExecution(ctx context.Context, client *http.Client) *asset.Client {
396+
func getAssetServiceOrTerminateExecution(ctx context.Context) *asset.Client {
395397
logger.Println("Try to get Asset Service")
396398
assetService, err := asset.NewClient(ctx)
397399
if err != nil {
@@ -401,6 +403,16 @@ func getAssetServiceOrTerminateExecution(ctx context.Context, client *http.Clien
401403
return assetService
402404
}
403405

406+
func getContainerServiceOrTerminateExecution(ctx context.Context) *container.ClusterManagerClient {
407+
logger.Println("Try to get Container Service")
408+
containerService, err := container.NewClusterManagerClient(ctx)
409+
if err != nil {
410+
logger.Fatalf("Failed to get Container Service with error [%s], terminate execution", err.Error())
411+
}
412+
logger.Println("Got Container Service")
413+
return containerService
414+
}
415+
404416
func getFirewallPoliciesServiceOrTerminateExecution(ctx context.Context, client *http.Client) *compute.FirewallPoliciesService {
405417
logger.Println("Try to get Firewall Policies Service")
406418
computeService, err := compute.NewService(ctx, option.WithHTTPClient(client))
@@ -426,12 +438,13 @@ func invoke(ctx context.Context) {
426438
cloudResourceManagerService := getResourceManagerServiceOrTerminateExecution(ctx, client)
427439
folderService := getFolderServiceOrTerminateExecution(ctx, client)
428440
tagKeyService := getTagKeysServiceOrTerminateExecution(ctx, client)
429-
sccService := getSCCNotificationServiceOrTerminateExecution(ctx, client)
441+
sccService := getSCCNotificationServiceOrTerminateExecution(ctx)
430442
tagValuesService := getTagValuesServiceOrTerminateExecution(ctx, client)
431-
feedsService := getAssetServiceOrTerminateExecution(ctx, client)
443+
feedsService := getAssetServiceOrTerminateExecution(ctx)
432444
billingSinkService := getBillingAccountSinkServiceOrTerminateExecution(ctx, client)
433445
firewallPoliciesService := getFirewallPoliciesServiceOrTerminateExecution(ctx, client)
434446
endpointService := getServiceManagementServiceOrTerminateExecution(ctx, client)
447+
containerService := getContainerServiceOrTerminateExecution(ctx)
435448

436449
removeLien := func(name string) {
437450
logger.Printf("Try to remove lien [%s]", name)
@@ -576,7 +589,7 @@ func invoke(ctx context.Context) {
576589
return
577590
}
578591
for _, sink := range sinkList.Sinks {
579-
if sink.Name != "_Required" && sink.Name != "_Default" && billingSinkAgeFilter(sink) && checkIfNameIncluded(sink.ResourceName, targetBillingSinks) {
592+
if sink.Name != "_Required" && sink.Name != "_Default" && billingSinkAgeFilter(sink) && checkIfNameIncluded(sink.ResourceName, targetBillingSinks) {
580593
_, err = billingSinkService.Delete(sink.ResourceName).Context(ctx).Do()
581594
if err != nil {
582595
logger.Printf("Failed to delete billing account log sink [%s] from billing account [%s], error [%s]", sink.ResourceName, billing, err.Error())
@@ -611,6 +624,48 @@ func invoke(ctx context.Context) {
611624
return err
612625
}
613626

627+
removeProjectClusters := func(projectId string) int {
628+
logger.Printf("Try to remove clusters for [%s]", projectId)
629+
reqLCR := &containerpb.ListClustersRequest{Parent: fmt.Sprintf("projects/%s/locations/*", projectId)}
630+
listResponse, err := containerService.ListClusters(ctx, reqLCR)
631+
if err != nil {
632+
logger.Printf("Failed to list clusters for [%s], error [%s]", projectId, err.Error())
633+
return 0
634+
}
635+
636+
logger.Printf("Got [%d] clusters for project [%s]", len(listResponse.Clusters), projectId)
637+
if len(listResponse.Clusters) == 0 {
638+
return 0
639+
}
640+
641+
var pendingDeletion int = 0
642+
for _, cluster := range listResponse.Clusters {
643+
switch clusterStatus := cluster.Status.String(); clusterStatus {
644+
case "DEGRADED":
645+
fallthrough
646+
case "RUNNING":
647+
logger.Printf("Deleting cluster %s status: %s", cluster.Name, clusterStatus)
648+
reqDCR := &containerpb.DeleteClusterRequest{Name: fmt.Sprintf("projects/%s/locations/%s/clusters/%s", projectId, cluster.Location, cluster.Name)}
649+
_, err := containerService.DeleteCluster(ctx, reqDCR)
650+
if err != nil {
651+
logger.Printf("Failed to delete cluster [%s] for [%s], error [%s]", cluster.Name, projectId, err.Error())
652+
} else {
653+
pendingDeletion++
654+
}
655+
case "PROVISIONING":
656+
fallthrough
657+
case "RECONCILING":
658+
fallthrough
659+
case "STOPPING":
660+
logger.Printf("Deferring cluster %s status: %s", cluster.Name, clusterStatus)
661+
pendingDeletion++
662+
default:
663+
logger.Printf("Ignoring cluster %s status: %s", cluster.Name, clusterStatus)
664+
}
665+
}
666+
return pendingDeletion
667+
}
668+
614669
removeProjectEndpoints := func(projectId string) {
615670
logger.Printf("Try to remove endpoints for [%s]", projectId)
616671
listResponse, err := endpointService.Services.List().ProducerProjectId(projectId).Do()
@@ -638,6 +693,9 @@ func invoke(ctx context.Context) {
638693

639694
cleanupProjectById := func(projectId string) {
640695
logger.Printf("Try to remove project [%s]", projectId)
696+
if clusters := removeProjectClusters(projectId); clusters != 0 {
697+
logger.Printf("Defer removing project [%s], %d clusters marked for deletion", projectId, clusters)
698+
}
641699
err := removeProjectById(projectId)
642700
if err != nil {
643701
removeProjectEndpoints(projectId)
@@ -738,7 +796,7 @@ func invoke(ctx context.Context) {
738796
removeSCCNotifications(organizationId)
739797
}
740798

741-
//Only delete Feeds from deleted projects
799+
// Only delete Feeds from deleted projects
742800
if cleanUpCaiFeeds {
743801
removeFeedsByName(organizationId)
744802
}

0 commit comments

Comments
 (0)