@@ -19,18 +19,60 @@ type GCP struct {
1919 projectID string
2020
2121 networkClient * compute.NetworksClient
22+ subnetworksClient * compute.SubnetworksClient
2223 forwardRuleClient * compute.ForwardingRulesClient
2324 addressClient * compute.AddressesClient
2425 keyManagementClient * kms.KeyManagementClient
2526}
2627
2728func (gcp * GCP ) DeleteVpc (ctx context.Context , vpcName string ) error {
29+ vpcGetRequest := & computepb.GetNetworkRequest {
30+ Project : gcp .projectID ,
31+ Network : vpcName ,
32+ }
33+ net , err := gcp .networkClient .Get (ctx , vpcGetRequest )
34+ if err != nil {
35+ return fmt .Errorf ("failed to get VPC %q: %v" , vpcName , err )
36+ }
37+ for _ , subnetURL := range net .Subnetworks {
38+ subnet , region := decodeSubnetURL (subnetURL )
39+ if subnet == "" {
40+ return fmt .Errorf ("failed to decode subnet URL %q" , subnetURL )
41+ }
42+ subnetDeleteRequest := & computepb.DeleteSubnetworkRequest {
43+ Project : gcp .projectID ,
44+ Subnetwork : subnet ,
45+ Region : region ,
46+ }
47+ op , err := gcp .subnetworksClient .Delete (ctx , subnetDeleteRequest )
48+ if err := waitOrFailOp (ctx , op , err ); err != nil {
49+ return fmt .Errorf ("failed to delete subnet %q: %v" , subnet , err )
50+ }
51+ }
2852 vpcRequest := & computepb.DeleteNetworkRequest {
2953 Project : gcp .projectID ,
3054 Network : vpcName ,
3155 }
3256
3357 op , err := gcp .networkClient .Delete (ctx , vpcRequest )
58+ if err := waitOrFailOp (ctx , op , err ); err != nil {
59+ return fmt .Errorf ("failed to delete VPC %q: %v" , vpcName , err )
60+ }
61+
62+ return nil
63+ }
64+
65+ func decodeSubnetURL (subnetURL string ) (string , string ) {
66+ parts := strings .Split (subnetURL , "/" )
67+ if len (parts ) < 11 {
68+ return "" , ""
69+ }
70+ region := parts [8 ]
71+ subnet := parts [10 ]
72+ return subnet , region
73+ }
74+
75+ func waitOrFailOp (ctx context.Context , op * compute.Operation , err error ) error {
3476 if err != nil {
3577 return err
3678 }
@@ -39,7 +81,6 @@ func (gcp *GCP) DeleteVpc(ctx context.Context, vpcName string) error {
3981 if err != nil {
4082 return err
4183 }
42-
4384 return nil
4485}
4586
@@ -177,6 +218,11 @@ func NewGCPCleaner(ctx context.Context) (*GCP, error) {
177218 return nil , err
178219 }
179220
221+ subnetworksClient , err := compute .NewSubnetworksRESTClient (ctx )
222+ if err != nil {
223+ return nil , err
224+ }
225+
180226 forwardRuleClient , err := compute .NewForwardingRulesRESTClient (ctx )
181227 if err != nil {
182228 return nil , err
@@ -195,6 +241,7 @@ func NewGCPCleaner(ctx context.Context) (*GCP, error) {
195241 return & GCP {
196242 projectID : projectID ,
197243 networkClient : networkClient ,
244+ subnetworksClient : subnetworksClient ,
198245 forwardRuleClient : forwardRuleClient ,
199246 addressClient : addressClient ,
200247 keyManagementClient : keyManagementClient ,
0 commit comments