Skip to content

Commit 3cb3d61

Browse files
authored
support for testing (#7)
* tests: init localstack infra * feat: basic Terraform infra for tests * chore: add dependabot for GHAs and docker
1 parent e3605bf commit 3cb3d61

36 files changed

+774
-645
lines changed

.github/dependabot.yml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: github-actions
4+
directory: ".github"
5+
schedule:
6+
interval: weekly
7+
- package-ecosystem: "docker"
8+
directory: "/"
9+
schedule:
10+
interval: weekly

.github/workflows/golanci-lint.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ jobs:
1818
name: lint
1919
runs-on: ubuntu-latest
2020
steps:
21-
- uses: actions/setup-go@v3
22-
with:
23-
go-version: 1.18
2421
- uses: actions/checkout@v3
22+
- uses: actions/setup-go@v4
23+
with:
24+
go-version: 1.19
2525
- name: golangci-lint
2626
uses: golangci/golangci-lint-action@v3
2727
with:

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ nuvola
33
*.json
44
!.vscode/*.json
55
.env
6+
!tests/.env
67
dist
78
*.log
89
backup/

Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,7 @@ backup:
4646
.PHONY: restore
4747
restore:
4848
@cat ./backup/all.cypher | docker-compose exec -T neo4j cypher-shell -u neo4j -p ${PASSWORD} -d nuvoladb --non-interactive
49+
50+
.PHONY: tests
51+
tests: start build
52+
$(MAKE) -C tests all

assets/demos/demo1/lambda/variables.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ variable "vulnerable_lambda_role" {
1010

1111
variable "dummy_lambda_role" {
1212
type = string
13-
description = "role for the dimmy Lambda"
13+
description = "role for the dummy Lambda"
1414
}

connector/cloud_connector.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@ package connector
33
import (
44
"errors"
55
awsconfig "nuvola/connector/services/aws"
6-
"os"
76
"strings"
87
)
98

10-
func NewCloudConnector(profile string) (*CloudConnector, error) {
11-
awsEndpoint := os.Getenv("AWS_ENDPOINT")
9+
func NewCloudConnector(profile string, endpointUrl string) (*CloudConnector, error) {
1210
cc := &CloudConnector{
13-
AWSConfig: awsconfig.InitAWSConfiguration(profile, awsEndpoint),
11+
AWSConfig: awsconfig.InitAWSConfiguration(profile, endpointUrl),
1412
}
1513
if !cc.testConnection("aws") {
1614
return nil, errors.New("invalid credentials or expired session")

connector/services/aws/aws.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package awsconnector
22

33
import (
44
"context"
5+
"os"
56

67
"nuvola/connector/services/aws/database"
78
"nuvola/connector/services/aws/ec2"
@@ -27,8 +28,9 @@ func InitAWSConfiguration(profile string, awsEndpoint string) (awsc AWSConfig) {
2728
customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
2829
if awsEndpoint != "" {
2930
return aws.Endpoint{
30-
PartitionID: "aws",
31-
URL: awsEndpoint,
31+
PartitionID: "aws",
32+
URL: awsEndpoint,
33+
SigningRegion: os.Getenv("AWS_DEFAULT_REGION"),
3234
}, nil
3335
}
3436

connector/services/aws/database/rds.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ func ListRDS(cfg aws.Config) (rdsRet *RDS, re *awshttp.ResponseError) {
3535
func (rc *RDSClient) listRDSClustersForRegion() (clusters []types.DBCluster) {
3636
output, err := rc.client.DescribeDBClusters(context.TODO(), &rds.DescribeDBClustersInput{})
3737
if errors.As(err, &re) {
38-
nuvolaerror.HandleAWSError(re, "RDS", "DescribeDBClusters")
38+
if re.Response.StatusCode != 501 { // When using LocalStack: this is a Pro feature
39+
nuvolaerror.HandleAWSError(re, "RDS", "DescribeDBClusters")
40+
}
3941
}
4042

41-
for i := 0; i < len(output.DBClusters); i++ {
42-
clusters = append(clusters, output.DBClusters[i])
43+
if output != nil {
44+
for i := 0; i < len(output.DBClusters); i++ {
45+
clusters = append(clusters, output.DBClusters[i])
46+
}
4347
}
4448

4549
return
@@ -48,11 +52,15 @@ func (rc *RDSClient) listRDSClustersForRegion() (clusters []types.DBCluster) {
4852
func (rc *RDSClient) listRDSInstancesForRegion() (instances []types.DBInstance) {
4953
output, err := rc.client.DescribeDBInstances(context.TODO(), &rds.DescribeDBInstancesInput{})
5054
if errors.As(err, &re) {
51-
nuvolaerror.HandleAWSError(re, "RDS", "DescribeDBInstances")
55+
if re.Response.StatusCode != 501 { // When using LocalStack: this is a Pro feature
56+
nuvolaerror.HandleAWSError(re, "RDS", "DescribeDBInstances")
57+
}
5258
}
5359

54-
for i := 0; i < len(output.DBInstances); i++ {
55-
instances = append(instances, output.DBInstances[i])
60+
if output != nil {
61+
for i := 0; i < len(output.DBInstances); i++ {
62+
instances = append(instances, output.DBInstances[i])
63+
}
5664
}
5765
return
5866
}

connector/services/aws/iam/users.go

+17-15
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,23 @@ func ListUsers(cfg aws.Config, credentialReport map[string]*CredentialReport) (u
2525
wg sync.WaitGroup
2626
)
2727

28-
rootAccount := credentialReport["<root_account>"]
29-
rootDate, _ := time.Parse("2006-01-02T15:04:05+00:00", rootAccount.UserCreation)
30-
rootUsedDate, _ := time.Parse("2006-01-02T15:04:05+00:00", rootAccount.PasswordLastUsed)
31-
users = append(users, &User{
32-
User: types.User{
33-
UserName: &rootAccount.User,
34-
Arn: &rootAccount.Arn,
35-
CreateDate: &rootDate,
36-
PasswordLastUsed: &rootUsedDate,
37-
UserId: aws.String("0"),
38-
},
39-
PasswordEnabled: rootAccount.PasswordEnabled,
40-
PasswordLastChanged: rootAccount.PasswordLastChanged,
41-
MfaActive: rootAccount.MfaActive,
42-
})
28+
if len(credentialReport) > 0 {
29+
rootAccount := credentialReport["<root_account>"]
30+
rootDate, _ := time.Parse("2006-01-02T15:04:05+00:00", rootAccount.UserCreation)
31+
rootUsedDate, _ := time.Parse("2006-01-02T15:04:05+00:00", rootAccount.PasswordLastUsed)
32+
users = append(users, &User{
33+
User: types.User{
34+
UserName: &rootAccount.User,
35+
Arn: &rootAccount.Arn,
36+
CreateDate: &rootDate,
37+
PasswordLastUsed: &rootUsedDate,
38+
UserId: aws.String("0"),
39+
},
40+
PasswordEnabled: rootAccount.PasswordEnabled,
41+
PasswordLastChanged: rootAccount.PasswordLastChanged,
42+
MfaActive: rootAccount.MfaActive,
43+
})
44+
}
4345

4446
for _, user := range listUsers() {
4547
wg.Add(1)

connector/services/aws/s3/s3.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919

2020
func ListBuckets(cfg aws.Config) (buckets []*Bucket) {
2121
var (
22-
s3Client = S3Client{Config: cfg, client: s3.NewFromConfig(cfg)}
22+
s3Client = S3Client{Config: cfg, client: s3.NewFromConfig(cfg, func(o *s3.Options) { o.UsePathStyle = true })}
2323
mu = &sync.Mutex{}
2424
sem = semaphore.NewWeighted(int64(15))
2525
wg sync.WaitGroup

connector/services/aws/tools.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"strings"
66
"time"
77

8-
"github.com/imroc/req/v3"
8+
req "github.com/imroc/req/v3"
99
"github.com/itchyny/gojq"
1010
"github.com/ohler55/ojg/oj"
1111
)

connector/services/neo4j/neo4j.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
nuvolaerror "nuvola/tools/error"
99

1010
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
11+
"github.com/neo4j/neo4j-go-driver/v5/neo4j/config"
1112
"github.com/neo4j/neo4j-go-driver/v5/neo4j/dbtype"
1213
)
1314

@@ -18,18 +19,17 @@ type Neo4jClient struct {
1819

1920
var logLevel = neo4j.LogLevel(neo4j.WARNING)
2021

21-
var useConsoleLogger = func(level neo4j.LogLevel) func(config *neo4j.Config) {
22-
return func(config *neo4j.Config) {
22+
var useConsoleLogger = func(level neo4j.LogLevel) func(config *config.Config) {
23+
return func(config *config.Config) {
2324
config.Log = neo4j.ConsoleLogger(level)
2425
}
2526
}
2627

2728
func Connect(url, username, password string) (*Neo4jClient, error) {
2829
nc := &Neo4jClient{}
29-
nc.Driver, nc.err = neo4j.NewDriverWithContext(url, neo4j.BasicAuth(username, password, ""), useConsoleLogger(logLevel), func(c *neo4j.Config) {
30+
nc.Driver, nc.err = neo4j.NewDriverWithContext(url, neo4j.BasicAuth(username, password, ""), useConsoleLogger(logLevel), func(c *config.Config) {
3031
c.SocketConnectTimeout = 5 * time.Second
3132
c.MaxConnectionLifetime = 30 * time.Minute
32-
// c.ConnectionAcquisitionTimeout = 5 * time.Second
3333
})
3434
if nc.err != nil {
3535
return &Neo4jClient{}, nc.err
@@ -48,7 +48,7 @@ func (nc *Neo4jClient) DeleteAll() {
4848
session := nc.NewSession()
4949
defer session.Close(context.TODO())
5050

51-
session.Run(context.TODO(), `call apoc.periodic.commit("MATCH (n) WITH n LIMIT $limit DETACH DELETE n RETURN count(*)", {limit:10000})`, nil)
51+
session.Run(context.TODO(), `call apoc.periodic.commit("MATCH (n) WITH n LIMIT $limit DETACH DELETE n RETURN count(*)", {limit:20000})`, nil)
5252
session.Run(context.TODO(), "CALL apoc.schema.assert({},{})", nil)
5353
session.Run(context.TODO(), "CALL apoc.trigger.removeAll()", nil)
5454

@@ -65,15 +65,14 @@ func (nc *Neo4jClient) DeleteAll() {
6565
session.Run(context.TODO(), "CREATE CONSTRAINT IF NOT EXISTS ON (r:Rds) ASSERT r.DBClusterArn IS UNIQUE", nil)
6666
session.Run(context.TODO(), "CREATE CONSTRAINT IF NOT EXISTS ON (r:Rds) ASSERT r.DBInstanceArn IS UNIQUE", nil)
6767

68-
session.Run(context.TODO(), "CREATE INDEX index_Group IF NOT EXISTS FOR (g:User) ON g.UserName", nil)
68+
session.Run(context.TODO(), "CREATE INDEX index_User IF NOT EXISTS FOR (u:User) ON u.UserName", nil)
6969

7070
session.Run(context.TODO(), "CREATE INDEX index_Role IF NOT EXISTS FOR (r:Role) ON r.RoleName", nil)
7171
session.Run(context.TODO(), "CREATE INDEX index_RoleInstanceProfileArn IF NOT EXISTS FOR (r:Role) ON r.InstanceProfileArn", nil)
7272

7373
session.Run(context.TODO(), "CREATE INDEX index_Group IF NOT EXISTS FOR (g:Group) ON g.GroupName", nil)
7474

7575
session.Run(context.TODO(), "CREATE INDEX index_Policy IF NOT EXISTS FOR (p:Policy) ON p.Name", nil)
76-
session.Run(context.TODO(), "CREATE INDEX index_PolicyId IF NOT EXISTS FOR (p:Policy) ON p.id", nil)
7776

7877
session.Run(context.TODO(), "CREATE INDEX index_Action IF NOT EXISTS FOR (n:Action) ON n.Action", nil)
7978

controller/dump/dump.go

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ func DumpData(storageConnector *connector.StorageConnector, cloudConnector *conn
4848
}
4949

5050
func SaveResults(awsProfile string, outputDir string, outputFormat string) {
51+
if awsProfile == "" {
52+
awsProfile = "default"
53+
}
5154
if outputFormat == "zip" {
5255
zip.Zip(outputDir, awsProfile, &AWSResults)
5356
}

go.mod

+46-53
Original file line numberDiff line numberDiff line change
@@ -3,73 +3,66 @@ module nuvola
33
go 1.18
44

55
require (
6-
github.com/aws/aws-sdk-go-v2 v1.17.5
7-
github.com/aws/aws-sdk-go-v2/config v1.18.14
8-
github.com/aws/aws-sdk-go-v2/service/accessanalyzer v1.19.4
9-
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.18.4
10-
github.com/aws/aws-sdk-go-v2/service/ec2 v1.86.1
11-
github.com/aws/aws-sdk-go-v2/service/iam v1.19.3
12-
github.com/aws/aws-sdk-go-v2/service/lambda v1.29.3
13-
github.com/aws/aws-sdk-go-v2/service/rds v1.40.4
14-
github.com/aws/aws-sdk-go-v2/service/redshift v1.27.3
15-
github.com/aws/aws-sdk-go-v2/service/s3 v1.30.4
16-
github.com/aws/aws-sdk-go-v2/service/sts v1.18.4
17-
github.com/fatih/color v1.14.1
18-
github.com/gocarina/gocsv v0.0.0-20230221171204-bee85eaae879
19-
github.com/imroc/req/v3 v3.32.0
20-
github.com/itchyny/gojq v0.12.11
6+
github.com/aws/aws-sdk-go-v2 v1.18.0
7+
github.com/aws/aws-sdk-go-v2/config v1.18.25
8+
github.com/aws/aws-sdk-go-v2/service/accessanalyzer v1.19.12
9+
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.7
10+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.99.0
11+
github.com/aws/aws-sdk-go-v2/service/iam v1.19.12
12+
github.com/aws/aws-sdk-go-v2/service/lambda v1.35.0
13+
github.com/aws/aws-sdk-go-v2/service/rds v1.45.0
14+
github.com/aws/aws-sdk-go-v2/service/redshift v1.27.11
15+
github.com/aws/aws-sdk-go-v2/service/s3 v1.33.1
16+
github.com/aws/aws-sdk-go-v2/service/sts v1.19.0
17+
github.com/fatih/color v1.15.0
18+
github.com/gocarina/gocsv v0.0.0-20230513223533-9ddd7fd60602
19+
github.com/imroc/req/v3 v3.35.1
20+
github.com/itchyny/gojq v0.12.13
2121
github.com/joho/godotenv v1.5.1
22-
github.com/neo4j/neo4j-go-driver/v5 v5.5.0
23-
github.com/notdodo/arner v0.0.0-20221120105200-4e2f2b6d4546
22+
github.com/neo4j/neo4j-go-driver/v5 v5.9.0
23+
github.com/notdodo/arner v0.0.0-20230222134658-4fe417a6cc9c
2424
github.com/notdodo/goflat v0.0.0-20220904193052-d6f007cccdea
25-
github.com/ohler55/ojg v1.17.5
26-
golang.org/x/sync v0.1.0
27-
golang.org/x/text v0.7.0
25+
github.com/ohler55/ojg v1.18.7
26+
golang.org/x/sync v0.2.0
27+
golang.org/x/text v0.9.0
2828
gopkg.in/yaml.v2 v2.4.0
2929
)
3030

3131
require (
3232
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect
33-
github.com/aws/aws-sdk-go-v2/credentials v1.13.14 // indirect
34-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23 // indirect
35-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29 // indirect
36-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23 // indirect
37-
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30 // indirect
38-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.21 // indirect
33+
github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect
34+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect
35+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect
36+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect
37+
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect
38+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.25 // indirect
3939
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect
40-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.24 // indirect
41-
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.23 // indirect
42-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.23 // indirect
43-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.23 // indirect
44-
github.com/aws/aws-sdk-go-v2/service/sso v1.12.3 // indirect
45-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.3 // indirect
40+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.28 // indirect
41+
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.27 // indirect
42+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect
43+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.2 // indirect
44+
github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 // indirect
45+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect
4646
github.com/aws/smithy-go v1.13.5 // indirect
47-
github.com/fsnotify/fsnotify v1.6.0 // indirect
48-
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
47+
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
4948
github.com/golang/mock v1.6.0 // indirect
50-
github.com/google/pprof v0.0.0-20230207041349-798e818bf904 // indirect
49+
github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect
5150
github.com/hashicorp/errwrap v1.1.0 // indirect
5251
github.com/hashicorp/go-multierror v1.1.1 // indirect
5352
github.com/itchyny/timefmt-go v0.1.5 // indirect
5453
github.com/jmespath/go-jmespath v0.4.0 // indirect
55-
github.com/lucas-clemente/quic-go v0.31.1 // indirect
56-
github.com/marten-seemann/qpack v0.3.0 // indirect
57-
github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect
58-
github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect
59-
github.com/marten-seemann/qtls-go1-18 v0.1.4 // indirect
60-
github.com/marten-seemann/qtls-go1-19 v0.1.2 // indirect
54+
github.com/kr/pretty v0.3.1 // indirect
6155
github.com/mattn/go-colorable v0.1.13 // indirect
62-
github.com/mattn/go-isatty v0.0.17 // indirect
63-
github.com/onsi/ginkgo/v2 v2.8.3 // indirect
56+
github.com/mattn/go-isatty v0.0.19 // indirect
57+
github.com/onsi/ginkgo/v2 v2.9.7 // indirect
6458
github.com/quic-go/qpack v0.4.0 // indirect
65-
github.com/quic-go/qtls-go1-18 v0.2.0 // indirect
66-
github.com/quic-go/qtls-go1-19 v0.2.1 // indirect
67-
github.com/quic-go/qtls-go1-20 v0.1.1 // indirect
68-
github.com/quic-go/quic-go v0.32.0 // indirect
69-
golang.org/x/crypto v0.6.0 // indirect
70-
golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect
71-
golang.org/x/mod v0.8.0 // indirect
72-
golang.org/x/net v0.7.0 // indirect
73-
golang.org/x/sys v0.5.0 // indirect
74-
golang.org/x/tools v0.6.0 // indirect
59+
github.com/quic-go/qtls-go1-19 v0.3.2 // indirect
60+
github.com/quic-go/qtls-go1-20 v0.2.2 // indirect
61+
github.com/quic-go/quic-go v0.35.1 // indirect
62+
golang.org/x/crypto v0.9.0 // indirect
63+
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect
64+
golang.org/x/mod v0.10.0 // indirect
65+
golang.org/x/net v0.10.0 // indirect
66+
golang.org/x/sys v0.8.0 // indirect
67+
golang.org/x/tools v0.9.3 // indirect
7568
)

0 commit comments

Comments
 (0)