Skip to content

Commit 9df6bea

Browse files
committed
[GCP/cloud-storage] Feat: Initialized GCP and Added Cloud storage
1 parent 354d7df commit 9df6bea

File tree

9 files changed

+169
-4
lines changed

9 files changed

+169
-4
lines changed

cmd/root.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/mensaah/reka/config"
3030
"github.com/mensaah/reka/provider"
3131
"github.com/mensaah/reka/provider/aws"
32+
"github.com/mensaah/reka/provider/gcp"
3233
"github.com/mensaah/reka/resource"
3334
"github.com/mensaah/reka/rules"
3435
"github.com/mensaah/reka/state"
@@ -121,9 +122,11 @@ func initProviders() []*provider.Provider {
121122
switch p {
122123
case aws.GetName():
123124
provider, err = aws.NewProvider()
124-
if err != nil {
125-
log.Fatal("Could not initialize AWS Provider: ", err)
126-
}
125+
case gcp.GetName():
126+
provider, err = gcp.NewProvider()
127+
}
128+
if err != nil {
129+
log.Fatalf("Could not initialize %s Provider: %s", p, err.Error())
127130
}
128131
// TODO Config providers
129132
providers = append(providers, provider)

config/config.example.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,17 @@ StateBackend:
2424
type: local
2525
path: /path/to/local/store/state
2626

27-
# aws:
27+
aws:
2828
# # Env: AWS_SECRET_ACCESS_KEY
2929
# secretAccessKey: blank
3030
# # ENV: AWS_ACCESS_KEY_ID
3131
# accessKeyID: blank
3232
# # ENV: AWS_REGION
3333
# defaultRegion: us-east-2
3434

35+
gcp:
36+
# projectId: Something
37+
3538
exclude:
3639
- name: Exclude resources with prod tags in us-east-2
3740
region: "us-east-2"

config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ type Config struct {
7777

7878
// AWS Config
7979
Aws *aws.Config
80+
// Gcp configuration
81+
Gcp Gcp
8082
}
8183

8284
// LoadConfig load all passed configs and defaults

config/gcp.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package config
2+
3+
// Gcp config stores all gcp related config for a project
4+
type Gcp struct {
5+
ProjectId string
6+
}

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/mensaah/reka
33
go 1.14
44

55
require (
6+
cloud.google.com/go/storage v1.0.0
67
github.com/alvaroloes/enumer v1.1.2 // indirect
78
github.com/aws/aws-sdk-go-v2 v0.31.0
89
github.com/aws/aws-sdk-go-v2/config v0.4.0
@@ -20,6 +21,7 @@ require (
2021
github.com/sirupsen/logrus v1.7.0
2122
github.com/spf13/cobra v1.1.1
2223
github.com/spf13/viper v1.7.1
24+
google.golang.org/api v0.13.0
2325
google.golang.org/appengine v1.6.1
2426
gorm.io/driver/postgres v1.0.6
2527
gorm.io/driver/sqlite v1.1.4

go.sum

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR
44
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
55
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
66
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
7+
cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y=
78
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
89
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
910
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
1011
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
1112
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
13+
cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4=
1214
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
1315
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
1416
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -113,6 +115,7 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
113115
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
114116
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
115117
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
118+
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
116119
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
117120
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
118121
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
@@ -133,6 +136,7 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
133136
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
134137
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
135138
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
139+
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
136140
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
137141
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
138142
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
@@ -332,6 +336,7 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q
332336
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
333337
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
334338
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
339+
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
335340
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
336341
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
337342
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -388,6 +393,7 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH
388393
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
389394
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
390395
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
396+
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
391397
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
392398
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
393399
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -455,6 +461,7 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt
455461
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
456462
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
457463
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
464+
google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA=
458465
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
459466
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
460467
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -469,9 +476,11 @@ google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRn
469476
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
470477
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
471478
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
479+
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4=
472480
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
473481
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
474482
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
483+
google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8=
475484
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
476485
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
477486
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

provider/gcp/cloud_storage.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package gcp
2+
3+
import (
4+
"context"
5+
6+
"cloud.google.com/go/storage"
7+
log "github.com/sirupsen/logrus"
8+
"google.golang.org/api/iterator"
9+
10+
"github.com/mensaah/reka/config"
11+
"github.com/mensaah/reka/resource"
12+
)
13+
14+
func getAllBuckets(cfg *config.Gcp) ([]*resource.Resource, error) {
15+
var buckets []*resource.Resource
16+
log.Debug("Fetching Cloud storage buckets")
17+
ctx := context.Background()
18+
client, err := storage.NewClient(ctx)
19+
if err != nil {
20+
return []*resource.Resource{}, err
21+
}
22+
it := client.Buckets(ctx, cfg.ProjectId)
23+
for {
24+
bucketAttrs, err := it.Next()
25+
if err == iterator.Done {
26+
break
27+
}
28+
if err != nil {
29+
log.Errorf(err.Error())
30+
}
31+
bucket := NewResource(bucketAttrs.Name, cloudStorageName)
32+
bucket.Status = resource.Running
33+
bucket.CreationDate = bucketAttrs.Created
34+
bucket.Tags = bucketAttrs.Labels
35+
buckets = append(buckets, bucket)
36+
}
37+
log.Debugf("Found %s storage buckets", len(buckets))
38+
return buckets, nil
39+
}
40+
41+
// Empties a Bucket
42+
func emptyBucket(bucket *resource.Resource) error {
43+
return nil
44+
}
45+
46+
func destroyBuckets(cfg *config.Gcp, buckets []*resource.Resource) error {
47+
ctx := context.Background()
48+
client, err := storage.NewClient(ctx)
49+
if err != nil {
50+
return err
51+
}
52+
for _, bucket := range buckets {
53+
if err := client.Bucket(bucket.UUID).Delete(ctx); err != nil {
54+
log.Errorf("Failed deleting bucket %s: %s", bucket.UUID, err.Error())
55+
}
56+
}
57+
return nil
58+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package gcp
2+
3+
import (
4+
log "github.com/sirupsen/logrus"
5+
6+
"github.com/mensaah/reka/config"
7+
"github.com/mensaah/reka/resource"
8+
)
9+
10+
const (
11+
// Name of resource
12+
cloudStorageName = "CloudStorage"
13+
// LongName descriptive name for resource
14+
cloudStorageLongName = "Simple Storage Service"
15+
)
16+
17+
var cloudStorageLogger *log.Entry
18+
19+
func newCloudStorageManager(cfg *config.Config, logPath string) resource.Manager {
20+
21+
cloudStorageLogger = config.GetLogger(cloudStorageName, logPath)
22+
23+
return resource.Manager{
24+
Name: cloudStorageName,
25+
LongName: cloudStorageLongName,
26+
Config: cfg,
27+
Logger: logger,
28+
GetAll: func() ([]*resource.Resource, error) {
29+
return getAllBuckets(&cfg.Gcp)
30+
},
31+
Destroy: func(resources []*resource.Resource) error {
32+
return destroyBuckets(&cfg.Gcp, resources)
33+
},
34+
}
35+
}

provider/gcp/gcp.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,48 @@
11
package gcp
2+
3+
import (
4+
log "github.com/sirupsen/logrus"
5+
6+
"github.com/mensaah/reka/config"
7+
"github.com/mensaah/reka/provider"
8+
"github.com/mensaah/reka/resource"
9+
)
10+
11+
var (
12+
providerName = "gcp"
13+
logger *log.Entry
14+
resourceManagers map[string]*resource.Manager
15+
)
16+
17+
func GetName() string {
18+
return providerName
19+
}
20+
21+
// NewResource Returns a new Resource object
22+
func NewResource(id, manager string) *resource.Resource {
23+
resource := resource.Resource{}
24+
resource.UUID = id
25+
resource.Manager = resourceManagers[manager]
26+
27+
return &resource
28+
}
29+
30+
// NewProvider : Creates a New AWS Provider
31+
func NewProvider() (*provider.Provider, error) {
32+
33+
gcp := provider.Provider{}
34+
gcp.Name = providerName
35+
36+
gcp.SetLogger("logger.log")
37+
38+
cfg := config.GetConfig()
39+
40+
cloudStorageManager := newCloudStorageManager(cfg, gcp.LogPath)
41+
42+
resourceManagers = map[string]*resource.Manager{
43+
cloudStorageManager.Name: &cloudStorageManager,
44+
}
45+
46+
gcp.Managers = resourceManagers
47+
return &gcp, nil
48+
}

0 commit comments

Comments
 (0)