Skip to content

Commit 7c2c2fb

Browse files
committed
feat: adding subnetworks, networks, routers, peerings, tunnels, gateways
1 parent 93388a7 commit 7c2c2fb

File tree

8 files changed

+1150
-3
lines changed

8 files changed

+1150
-3
lines changed

gcp/compute_network_peerings.go

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package gcp
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"sync"
7+
"time"
8+
9+
"github.com/arehmandev/gcp-nuke/config"
10+
"github.com/arehmandev/gcp-nuke/helpers"
11+
"golang.org/x/sync/errgroup"
12+
"golang.org/x/sync/syncmap"
13+
"google.golang.org/api/compute/v1"
14+
)
15+
16+
// ComputeNetworkPeerings -
17+
type ComputeNetworkPeerings struct {
18+
serviceClient *compute.Service
19+
base ResourceBase
20+
resourceMap syncmap.Map
21+
}
22+
23+
func init() {
24+
computeService, err := compute.NewService(Ctx)
25+
if err != nil {
26+
log.Fatal(err)
27+
}
28+
computeResource := ComputeNetworkPeerings{
29+
serviceClient: computeService,
30+
}
31+
register(&computeResource)
32+
}
33+
34+
// Name - Name of the resourceLister for ComputeNetworkPeerings
35+
func (c *ComputeNetworkPeerings) Name() string {
36+
return "ComputeNetworkPeerings"
37+
}
38+
39+
// ToSlice - Name of the resourceLister for ComputeNetworkPeerings
40+
func (c *ComputeNetworkPeerings) ToSlice() (slice []string) {
41+
return helpers.SortedSyncMapKeys(&c.resourceMap)
42+
43+
}
44+
45+
// Setup - populates the struct
46+
func (c *ComputeNetworkPeerings) Setup(config config.Config) {
47+
c.base.config = config
48+
49+
}
50+
51+
// List - Returns a list of all ComputeNetworkPeerings
52+
func (c *ComputeNetworkPeerings) List(refreshCache bool) []string {
53+
if !refreshCache {
54+
return c.ToSlice()
55+
}
56+
// Refresh resource map
57+
c.resourceMap = sync.Map{}
58+
59+
networkListCall := c.serviceClient.Networks.List(c.base.config.Project)
60+
networkList, err := networkListCall.Do()
61+
if err != nil {
62+
log.Fatal(err)
63+
}
64+
65+
for _, network := range networkList.Items {
66+
for _, networkPeering := range network.Peerings {
67+
c.resourceMap.Store(networkPeering.Name, network.Name)
68+
}
69+
}
70+
return c.ToSlice()
71+
}
72+
73+
// Dependencies - Returns a List of resource names to check for
74+
func (c *ComputeNetworkPeerings) Dependencies() []string {
75+
a := ComputeInstanceGroupsRegion{}
76+
b := ComputeInstanceGroupsZone{}
77+
cl := ContainerGKEClusters{}
78+
return []string{a.Name(), b.Name(), cl.Name()}
79+
}
80+
81+
// Remove -
82+
func (c *ComputeNetworkPeerings) Remove() error {
83+
84+
// Removal logic
85+
errs, _ := errgroup.WithContext(c.base.config.Context)
86+
87+
c.resourceMap.Range(func(key, value interface{}) bool {
88+
networkPeeringID := key.(string)
89+
networkID := value.(string)
90+
91+
// Parallel network deletion
92+
errs.Go(func() error {
93+
94+
deleteCall := c.serviceClient.Networks.RemovePeering(c.base.config.Project, networkID, &compute.NetworksRemovePeeringRequest{
95+
Name: networkPeeringID,
96+
})
97+
operation, err := deleteCall.Do()
98+
if err != nil {
99+
return err
100+
}
101+
var opStatus string
102+
seconds := 0
103+
for opStatus != "DONE" {
104+
log.Printf("[Info] Resource currently being deleted %v [type: %v project: %v] (%v seconds)", networkID, c.Name(), c.base.config.Project, seconds)
105+
106+
operationCall := c.serviceClient.GlobalOperations.Get(c.base.config.Project, operation.Name)
107+
checkOpp, err := operationCall.Do()
108+
if err != nil {
109+
return err
110+
}
111+
opStatus = checkOpp.Status
112+
113+
time.Sleep(time.Duration(c.base.config.PollTime) * time.Second)
114+
seconds += c.base.config.PollTime
115+
if seconds > c.base.config.Timeout {
116+
return fmt.Errorf("[Error] Resource deletion timed out for %v [type: %v project: %v] (%v seconds)", networkID, c.Name(), c.base.config.Project, c.base.config.Timeout)
117+
}
118+
}
119+
c.resourceMap.Delete(networkID)
120+
121+
log.Printf("[Info] Resource deleted %v [type: %v project: %v] (%v seconds)", networkID, c.Name(), c.base.config.Project, seconds)
122+
return nil
123+
})
124+
return true
125+
})
126+
// Wait for all deletions to complete, and return the first non nil error
127+
err := errs.Wait()
128+
return err
129+
}

gcp/compute_routers.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package gcp
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"sync"
7+
"time"
8+
9+
"github.com/arehmandev/gcp-nuke/config"
10+
"github.com/arehmandev/gcp-nuke/helpers"
11+
"golang.org/x/sync/errgroup"
12+
"golang.org/x/sync/syncmap"
13+
"google.golang.org/api/compute/v1"
14+
)
15+
16+
// ComputeRouters -
17+
type ComputeRouters struct {
18+
serviceClient *compute.Service
19+
base ResourceBase
20+
resourceMap syncmap.Map
21+
}
22+
23+
func init() {
24+
computeService, err := compute.NewService(Ctx)
25+
if err != nil {
26+
log.Fatal(err)
27+
}
28+
computeResource := ComputeRouters{
29+
serviceClient: computeService,
30+
}
31+
register(&computeResource)
32+
}
33+
34+
// Name - Name of the resourceLister for ComputeRouters
35+
func (c *ComputeRouters) Name() string {
36+
return "ComputeRouters"
37+
}
38+
39+
// ToSlice - Name of the resourceLister for ComputeRouters
40+
func (c *ComputeRouters) ToSlice() (slice []string) {
41+
return helpers.SortedSyncMapKeys(&c.resourceMap)
42+
43+
}
44+
45+
// Setup - populates the struct
46+
func (c *ComputeRouters) Setup(config config.Config) {
47+
c.base.config = config
48+
49+
}
50+
51+
// List - Returns a list of all ComputeRouters
52+
func (c *ComputeRouters) List(refreshCache bool) []string {
53+
if !refreshCache {
54+
return c.ToSlice()
55+
}
56+
// Refresh resource map
57+
c.resourceMap = sync.Map{}
58+
59+
for _, region := range c.base.config.Regions {
60+
routerListCall := c.serviceClient.Routers.List(c.base.config.Project, region)
61+
routerList, err := routerListCall.Do()
62+
if err != nil {
63+
log.Fatal(err)
64+
}
65+
66+
for _, router := range routerList.Items {
67+
c.resourceMap.Store(router.Name, region)
68+
}
69+
}
70+
return c.ToSlice()
71+
}
72+
73+
// Dependencies - Returns a List of resource names to check for
74+
func (c *ComputeRouters) Dependencies() []string {
75+
a := ComputeVPNTunnels{}
76+
b := ComputeVPNGateways{}
77+
return []string{a.Name(), b.Name()}
78+
}
79+
80+
// Remove -
81+
func (c *ComputeRouters) Remove() error {
82+
83+
// Removal logic
84+
errs, _ := errgroup.WithContext(c.base.config.Context)
85+
86+
c.resourceMap.Range(func(key, value interface{}) bool {
87+
routerID := key.(string)
88+
region := value.(string)
89+
90+
// Parallel router deletion
91+
errs.Go(func() error {
92+
deleteCall := c.serviceClient.Routers.Delete(c.base.config.Project, region, routerID)
93+
operation, err := deleteCall.Do()
94+
if err != nil {
95+
return err
96+
}
97+
var opStatus string
98+
seconds := 0
99+
for opStatus != "DONE" {
100+
log.Printf("[Info] Resource currently being deleted %v [type: %v project: %v] (%v seconds)", routerID, c.Name(), c.base.config.Project, seconds)
101+
102+
operationCall := c.serviceClient.RegionOperations.Get(c.base.config.Project, region, operation.Name)
103+
checkOpp, err := operationCall.Do()
104+
if err != nil {
105+
return err
106+
}
107+
opStatus = checkOpp.Status
108+
109+
time.Sleep(time.Duration(c.base.config.PollTime) * time.Second)
110+
seconds += c.base.config.PollTime
111+
if seconds > c.base.config.Timeout {
112+
return fmt.Errorf("[Error] Resource deletion timed out for %v [type: %v project: %v] (%v seconds)", routerID, c.Name(), c.base.config.Project, c.base.config.Timeout)
113+
}
114+
}
115+
c.resourceMap.Delete(routerID)
116+
117+
log.Printf("[Info] Resource deleted %v [type: %v project: %v] (%v seconds)", routerID, c.Name(), c.base.config.Project, seconds)
118+
return nil
119+
})
120+
return true
121+
})
122+
// Wait for all deletions to complete, and return the first non nil error
123+
err := errs.Wait()
124+
return err
125+
}

gcp/compute_subnetworks.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package gcp
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"sync"
7+
"time"
8+
9+
"github.com/arehmandev/gcp-nuke/config"
10+
"github.com/arehmandev/gcp-nuke/helpers"
11+
"golang.org/x/sync/errgroup"
12+
"golang.org/x/sync/syncmap"
13+
"google.golang.org/api/compute/v1"
14+
)
15+
16+
// ComputeSubnetworks -
17+
type ComputeSubnetworks struct {
18+
serviceClient *compute.Service
19+
base ResourceBase
20+
resourceMap syncmap.Map
21+
}
22+
23+
func init() {
24+
computeService, err := compute.NewService(Ctx)
25+
if err != nil {
26+
log.Fatal(err)
27+
}
28+
computeResource := ComputeSubnetworks{
29+
serviceClient: computeService,
30+
}
31+
register(&computeResource)
32+
}
33+
34+
// Name - Name of the resourceLister for ComputeSubnetworks
35+
func (c *ComputeSubnetworks) Name() string {
36+
return "ComputeSubnetworks"
37+
}
38+
39+
// ToSlice - Name of the resourceLister for ComputeSubnetworks
40+
func (c *ComputeSubnetworks) ToSlice() (slice []string) {
41+
return helpers.SortedSyncMapKeys(&c.resourceMap)
42+
43+
}
44+
45+
// Setup - populates the struct
46+
func (c *ComputeSubnetworks) Setup(config config.Config) {
47+
c.base.config = config
48+
49+
}
50+
51+
// List - Returns a list of all ComputeSubnetworks
52+
func (c *ComputeSubnetworks) List(refreshCache bool) []string {
53+
if !refreshCache {
54+
return c.ToSlice()
55+
}
56+
// Refresh resource map
57+
c.resourceMap = sync.Map{}
58+
59+
for _, region := range c.base.config.Regions {
60+
subnetworkListCall := c.serviceClient.Subnetworks.List(c.base.config.Project, region)
61+
subnetworkList, err := subnetworkListCall.Do()
62+
if err != nil {
63+
log.Fatal(err)
64+
}
65+
66+
for _, subnetwork := range subnetworkList.Items {
67+
c.resourceMap.Store(subnetwork.Name, region)
68+
}
69+
}
70+
return c.ToSlice()
71+
}
72+
73+
// Dependencies - Returns a List of resource names to check for
74+
func (c *ComputeSubnetworks) Dependencies() []string {
75+
a := ComputeInstanceGroupsRegion{}
76+
b := ComputeInstanceGroupsZone{}
77+
cl := ContainerGKEClusters{}
78+
return []string{a.Name(), b.Name(), cl.Name()}
79+
}
80+
81+
// Remove -
82+
func (c *ComputeSubnetworks) Remove() error {
83+
84+
// Removal logic
85+
errs, _ := errgroup.WithContext(c.base.config.Context)
86+
87+
c.resourceMap.Range(func(key, value interface{}) bool {
88+
subnetworkID := key.(string)
89+
region := value.(string)
90+
91+
// Parallel subnetwork deletion
92+
errs.Go(func() error {
93+
deleteCall := c.serviceClient.Subnetworks.Delete(c.base.config.Project, region, subnetworkID)
94+
operation, err := deleteCall.Do()
95+
if err != nil {
96+
return err
97+
}
98+
var opStatus string
99+
seconds := 0
100+
for opStatus != "DONE" {
101+
log.Printf("[Info] Resource currently being deleted %v [type: %v project: %v] (%v seconds)", subnetworkID, c.Name(), c.base.config.Project, seconds)
102+
103+
operationCall := c.serviceClient.RegionOperations.Get(c.base.config.Project, region, operation.Name)
104+
checkOpp, err := operationCall.Do()
105+
if err != nil {
106+
return err
107+
}
108+
opStatus = checkOpp.Status
109+
110+
time.Sleep(time.Duration(c.base.config.PollTime) * time.Second)
111+
seconds += c.base.config.PollTime
112+
if seconds > c.base.config.Timeout {
113+
return fmt.Errorf("[Error] Resource deletion timed out for %v [type: %v project: %v] (%v seconds)", subnetworkID, c.Name(), c.base.config.Project, c.base.config.Timeout)
114+
}
115+
}
116+
c.resourceMap.Delete(subnetworkID)
117+
118+
log.Printf("[Info] Resource deleted %v [type: %v project: %v] (%v seconds)", subnetworkID, c.Name(), c.base.config.Project, seconds)
119+
return nil
120+
})
121+
return true
122+
})
123+
// Wait for all deletions to complete, and return the first non nil error
124+
err := errs.Wait()
125+
return err
126+
}

0 commit comments

Comments
 (0)