Skip to content

Commit

Permalink
ES-3323: gcp-nuke now only supports access tokens + Improved error …
Browse files Browse the repository at this point in the history
…handling + Added possibility to build release-candidates using `-rc[0-9]+` + Bumping `goreleaser` (#193)

* Test

* Lets see

* New regex for releases

* Added missing package

* Woop

* This?

* More saying fatals

* This is a bearer

* Fixing token pasing

* Forgot to save this

* Cleaning up errors

* Bump versions

* Bumping goreleaser
  • Loading branch information
OrKarstoft authored Sep 17, 2024
1 parent 3c5e84c commit 96336ce
Show file tree
Hide file tree
Showing 27 changed files with 323 additions and 388 deletions.
4 changes: 2 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
enum: ["test", "release"]
default: "test"
docker:
- image: goreleaser/goreleaser:v2.0.0
- image: goreleaser/goreleaser:v2.3.1
resource_class: xlarge
steps:
- checkout
Expand All @@ -60,7 +60,7 @@ release_filter: &release_filter
branches:
ignore: /.*/
tags:
only: /v[0-9]+.[0-9]+.[0-9]+/
only: /v([0-9]+\.){2}[0-9](-rc[0-9]+)?/
context: &context
context:
- es02-prod
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ GLOBAL OPTIONS:
--exclusionsconfig value, --ec value Path to exclusions config file [$EXCLUSIONS_CONFIG]
--help, -h show help
--version, -v print the version
--gcpaccesstoken Access token to use
```

### Example dryrun
Expand Down
21 changes: 16 additions & 5 deletions cmd/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cmd

import (
"encoding/json"
"fmt"
"log"
"os"

Expand All @@ -12,7 +13,6 @@ import (

// Command -
func Command() {

app := &cli.App{
Usage: "The GCP project cleanup tool with added radiation",
Version: "v0.1.0",
Expand Down Expand Up @@ -43,19 +43,30 @@ func Command() {
EnvVars: []string{"EXCLUSIONS_CONFIG"},
Aliases: []string{"ec"},
},
&cli.StringFlag{
Name: "gcpaccesstoken",
Usage: "GCP token for authentication",
EnvVars: []string{"GCP_ACCESS_TOKEN"},
},
},
Action: func(c *cli.Context) error {

if c.String("gcpaccesstoken") == "" {
return fmt.Errorf("GCP Access Token not provided")
}
token := config.ConvertStringToTokenSource(c.String("gcpaccesstoken"))
// Behaviour to delete all resource in parallel in one project at a time - will be made into loop / concurrenct project nuke if required
config := config.Config{
Project: c.String("project"),
DryRun: c.Bool("dryrun"),
Timeout: c.Int("timeout"),
PollTime: c.Int("polltime"),
Context: gcp.Ctx,
Zones: gcp.GetZones(gcp.Ctx, c.String("project")),
Regions: gcp.GetRegions(gcp.Ctx, c.String("project")),
// Zones: gcp.GetZones(gcp.Ctx, c.String("project")),
// Regions: gcp.GetRegions(gcp.Ctx, c.String("project")),
GCPToken: token,
}
gcp.AddZonesToConfig(gcp.Ctx, c.String("project"), config)
gcp.AddRegionsToConfig(gcp.Ctx, c.String("project"), config)

if c.String("exclusionsconfig") != "" {
// Read exclusions config file and marshall into Config.Exclusions struct
Expand Down Expand Up @@ -83,6 +94,6 @@ func Command() {

err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
log.Fatalf("app.Run: %s", err)
}
}
7 changes: 7 additions & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package config

import (
"context"

"golang.org/x/oauth2"
)

// Config -
Expand All @@ -14,6 +16,7 @@ type Config struct {
Context context.Context
DryRun bool
Exclusions Exclusions
GCPToken oauth2.TokenSource
}

type Exclusions struct {
Expand All @@ -35,3 +38,7 @@ type Exclusions struct {
GoogleComputeNetwork []string `json:"google_compute_network"`
IAMServiceAccount []string `json:"iam_service_account"`
}

func ConvertStringToTokenSource(token string) oauth2.TokenSource {
return oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token, TokenType: "Bearer"})
}
31 changes: 12 additions & 19 deletions gcp/bigquery_dataset.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"golang.org/x/sync/errgroup"
"golang.org/x/sync/syncmap"
"google.golang.org/api/bigquery/v2"
"google.golang.org/api/option"
)

type BigQueryDataset struct {
Expand All @@ -21,30 +22,26 @@ type BigQueryDataset struct {
DatasetIDs []string
}

func init() {

bigqueryService, err := bigquery.NewService(Ctx)
if err != nil {
log.Fatal(err)
}

bigqueryResource := BigQueryDataset{
serviceClient: bigqueryService,
}
register(&bigqueryResource)
}

func (c *BigQueryDataset) Name() string {
return "BigQueryDataset"
}

func (c *BigQueryDataset) ToSlice() (slice []string) {
return helpers.SortedSyncMapKeys(&c.resourceMap)

}

func (c *BigQueryDataset) Setup(config config.Config) {
c.base.config = config

bigqueryService, err := bigquery.NewService(Ctx, option.WithTokenSource(config.GCPToken))
if err != nil {
log.Fatalf("BigQueryDataset.Setup.NewService: %s", err)
}

bigqueryResource := BigQueryDataset{
serviceClient: bigqueryService,
}
register(&bigqueryResource)
}

func (c *BigQueryDataset) List(refreshCache bool) []string {
Expand All @@ -56,13 +53,11 @@ func (c *BigQueryDataset) List(refreshCache bool) []string {

datasetList, err := c.serviceClient.Datasets.List(c.base.config.Project).Context(Ctx).Do()
if err != nil {
log.Fatal(err)
log.Fatalf("BigQueryDataset.List: %s", err)
}

for _, dataset := range datasetList.Datasets {

c.resourceMap.Store(dataset.Id, dataset.DatasetReference.DatasetId)

}

return c.ToSlice()
Expand All @@ -74,7 +69,6 @@ func (c *BigQueryDataset) Dependencies() []string {
}

func (c *BigQueryDataset) Remove() error {

client, err := bq.NewClient(Ctx, c.base.config.Project)
if err != nil {
return fmt.Errorf("bigquery.NewClient: %v", err)
Expand Down Expand Up @@ -105,7 +99,6 @@ func (c *BigQueryDataset) Remove() error {
log.Printf("[Info] Resource currently being deleted %v [type: %v project: %v ] (%v seconds)", datasetID, c.Name(), c.base.config.Project, seconds)
tableList, _ := c.serviceClient.Tables.List(c.base.config.Project, datasetID).Context(Ctx).Do()
if tableList == nil {

deletedTables = true
}

Expand Down
24 changes: 10 additions & 14 deletions gcp/compute_disks.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"golang.org/x/sync/errgroup"
"golang.org/x/sync/syncmap"
"google.golang.org/api/compute/v1"
"google.golang.org/api/option"
)

// ComputeDisks -
Expand All @@ -21,17 +22,6 @@ type ComputeDisks struct {
resourceMap syncmap.Map
}

func init() {
computeService, err := compute.NewService(Ctx)
if err != nil {
log.Fatal(err)
}
computeResource := ComputeDisks{
serviceClient: computeService,
}
register(&computeResource)
}

// Name - Name of the resourceLister for ComputeDisks
func (c *ComputeDisks) Name() string {
return "ComputeDisks"
Expand All @@ -40,13 +30,20 @@ func (c *ComputeDisks) Name() string {
// ToSlice - Name of the resourceLister for ComputeDisks
func (c *ComputeDisks) ToSlice() (slice []string) {
return helpers.SortedSyncMapKeys(&c.resourceMap)

}

// Setup - populates the struct
func (c *ComputeDisks) Setup(config config.Config) {
c.base.config = config

computeService, err := compute.NewService(Ctx, option.WithTokenSource(config.GCPToken))
if err != nil {
log.Fatalf("ComputeDisks.Setup.NewService: %s", err)
}
computeResource := ComputeDisks{
serviceClient: computeService,
}
register(&computeResource)
}

// List - Returns a list of all ComputeDisks
Expand All @@ -61,7 +58,7 @@ func (c *ComputeDisks) List(refreshCache bool) []string {
instanceListCall := c.serviceClient.Disks.List(c.base.config.Project, zone)
instanceList, err := instanceListCall.Do()
if err != nil {
log.Fatal(err)
log.Fatalf("ComputeDisks.List: %s", err)
}

for _, instance := range instanceList.Items {
Expand All @@ -85,7 +82,6 @@ func (c *ComputeDisks) Dependencies() []string {

// Remove -
func (c *ComputeDisks) Remove() error {

// Removal logic
errs, _ := errgroup.WithContext(c.base.config.Context)

Expand Down
24 changes: 10 additions & 14 deletions gcp/compute_firewalls.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"golang.org/x/sync/errgroup"
"golang.org/x/sync/syncmap"
"google.golang.org/api/compute/v1"
"google.golang.org/api/option"
)

// ComputeFirewalls -
Expand All @@ -21,17 +22,6 @@ type ComputeFirewalls struct {
resourceMap syncmap.Map
}

func init() {
computeService, err := compute.NewService(Ctx)
if err != nil {
log.Fatal(err)
}
computeResource := ComputeFirewalls{
serviceClient: computeService,
}
register(&computeResource)
}

// Name - Name of the resourceLister for ComputeFirewalls
func (c *ComputeFirewalls) Name() string {
return "ComputeFirewalls"
Expand All @@ -40,13 +30,20 @@ func (c *ComputeFirewalls) Name() string {
// ToSlice - Name of the resourceLister for ComputeFirewalls
func (c *ComputeFirewalls) ToSlice() (slice []string) {
return helpers.SortedSyncMapKeys(&c.resourceMap)

}

// Setup - populates the struct
func (c *ComputeFirewalls) Setup(config config.Config) {
c.base.config = config

computeService, err := compute.NewService(Ctx, option.WithTokenSource(config.GCPToken))
if err != nil {
log.Fatalf("ComputeFirewalls.Setup.NewService: %s", err)
}
computeResource := ComputeFirewalls{
serviceClient: computeService,
}
register(&computeResource)
}

// List - Returns a list of all ComputeFirewalls
Expand All @@ -60,7 +57,7 @@ func (c *ComputeFirewalls) List(refreshCache bool) []string {
firewallListCall := c.serviceClient.Firewalls.List(c.base.config.Project)
firewallList, err := firewallListCall.Do()
if err != nil {
log.Fatal(err)
log.Fatalf("ComputeFirewalls.List: %s", err)
}

for _, firewall := range firewallList.Items {
Expand All @@ -79,7 +76,6 @@ func (c *ComputeFirewalls) Dependencies() []string {

// Remove -
func (c *ComputeFirewalls) Remove() error {

// Removal logic
errs, _ := errgroup.WithContext(c.base.config.Context)

Expand Down
24 changes: 10 additions & 14 deletions gcp/compute_instance_groups_region.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"golang.org/x/sync/errgroup"
"golang.org/x/sync/syncmap"
"google.golang.org/api/compute/v1"
"google.golang.org/api/option"
)

// ComputeInstanceGroupsRegion -
Expand All @@ -21,17 +22,6 @@ type ComputeInstanceGroupsRegion struct {
resourceMap syncmap.Map
}

func init() {
computeService, err := compute.NewService(Ctx)
if err != nil {
log.Fatal(err)
}
computeResource := ComputeInstanceGroupsRegion{
serviceClient: computeService,
}
register(&computeResource)
}

// Name - Name of the resourceLister for ComputeInstanceGroupsRegion
func (c *ComputeInstanceGroupsRegion) Name() string {
return "ComputeInstanceGroupsRegion"
Expand All @@ -40,13 +30,20 @@ func (c *ComputeInstanceGroupsRegion) Name() string {
// ToSlice - Name of the resourceLister for ComputeInstanceGroupsRegion
func (c *ComputeInstanceGroupsRegion) ToSlice() (slice []string) {
return helpers.SortedSyncMapKeys(&c.resourceMap)

}

// Setup - populates the struct
func (c *ComputeInstanceGroupsRegion) Setup(config config.Config) {
c.base.config = config

computeService, err := compute.NewService(Ctx, option.WithTokenSource(config.GCPToken))
if err != nil {
log.Fatalf("ComputeInstanceGroupsRegion.Setup.NewService: %s", err)
}
computeResource := ComputeInstanceGroupsRegion{
serviceClient: computeService,
}
register(&computeResource)
}

// List - Returns a list of all ComputeInstanceGroupsRegion
Expand All @@ -61,7 +58,7 @@ func (c *ComputeInstanceGroupsRegion) List(refreshCache bool) []string {
instanceListCall := c.serviceClient.RegionInstanceGroupManagers.List(c.base.config.Project, region)
instanceList, err := instanceListCall.Do()
if err != nil {
log.Fatal(err)
log.Fatalf("ComputeInstanceGroupsRegion.List: %s", err)
}

for _, instance := range instanceList.Items {
Expand All @@ -82,7 +79,6 @@ func (c *ComputeInstanceGroupsRegion) Dependencies() []string {

// Remove -
func (c *ComputeInstanceGroupsRegion) Remove() error {

// Removal logic
errs, _ := errgroup.WithContext(c.base.config.Context)

Expand Down
Loading

0 comments on commit 96336ce

Please sign in to comment.