Skip to content

Commit af73013

Browse files
committed
basic vpc crud
1 parent 7b22346 commit af73013

9 files changed

Lines changed: 990 additions & 23 deletions

File tree

go.mod

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ toolchain go1.24.6
66

77
require (
88
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b
9+
github.com/aws/aws-sdk-go-v2 v1.39.0
10+
github.com/aws/aws-sdk-go-v2/config v1.31.8
11+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.251.2
912
github.com/bojanz/currency v1.3.1
1013
github.com/cenkalti/backoff v2.2.1+incompatible
1114
github.com/cenkalti/backoff/v4 v4.3.0
@@ -21,6 +24,17 @@ require (
2124
require (
2225
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1 // indirect
2326
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
27+
github.com/aws/aws-sdk-go-v2/credentials v1.18.12 // indirect
28+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7 // indirect
29+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7 // indirect
30+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7 // indirect
31+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
32+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect
33+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7 // indirect
34+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3 // indirect
35+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4 // indirect
36+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4 // indirect
37+
github.com/aws/smithy-go v1.23.0 // indirect
2438
github.com/cockroachdb/apd/v3 v3.2.1 // indirect
2539
github.com/davecgh/go-spew v1.1.1 // indirect
2640
github.com/gofrs/flock v0.12.1 // indirect

go.sum

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,34 @@ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vS
44
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
55
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
66
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
7+
github.com/aws/aws-sdk-go-v2 v1.39.0 h1:xm5WV/2L4emMRmMjHFykqiA4M/ra0DJVSWUkDyBjbg4=
8+
github.com/aws/aws-sdk-go-v2 v1.39.0/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY=
9+
github.com/aws/aws-sdk-go-v2/config v1.31.8 h1:kQjtOLlTU4m4A64TsRcqwNChhGCwaPBt+zCQt/oWsHU=
10+
github.com/aws/aws-sdk-go-v2/config v1.31.8/go.mod h1:QPpc7IgljrKwH0+E6/KolCgr4WPLerURiU592AYzfSY=
11+
github.com/aws/aws-sdk-go-v2/credentials v1.18.12 h1:zmc9e1q90wMn8wQbjryy8IwA6Q4XlaL9Bx2zIqdNNbk=
12+
github.com/aws/aws-sdk-go-v2/credentials v1.18.12/go.mod h1:3VzdRDR5u3sSJRI4kYcOSIBbeYsgtVk7dG5R/U6qLWY=
13+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7 h1:Is2tPmieqGS2edBnmOJIbdvOA6Op+rRpaYR60iBAwXM=
14+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7/go.mod h1:F1i5V5421EGci570yABvpIXgRIBPb5JM+lSkHF6Dq5w=
15+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7 h1:UCxq0X9O3xrlENdKf1r9eRJoKz/b0AfGkpp3a7FPlhg=
16+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7/go.mod h1:rHRoJUNUASj5Z/0eqI4w32vKvC7atoWR0jC+IkmVH8k=
17+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7 h1:Y6DTZUn7ZUC4th9FMBbo8LVE+1fyq3ofw+tRwkUd3PY=
18+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7/go.mod h1:x3XE6vMnU9QvHN/Wrx2s44kwzV2o2g5x/siw4ZUJ9g8=
19+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
20+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
21+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.251.2 h1:6TssXFfLHcwUS5E3MdYKkCFeOrYVBlDhJjs5kRJp0ic=
22+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.251.2/go.mod h1:MXJiLJZtMqb2dVXgEIn35d5+7MqLd4r8noLen881kpk=
23+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM=
24+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8=
25+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7 h1:mLgc5QIgOy26qyh5bvW+nDoAppxgn3J2WV3m9ewq7+8=
26+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7/go.mod h1:wXb/eQnqt8mDQIQTTmcw58B5mYGxzLGZGK8PWNFZ0BA=
27+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3 h1:7PKX3VYsZ8LUWceVRuv0+PU+E7OtQb1lgmi5vmUE9CM=
28+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3/go.mod h1:Ql6jE9kyyWI5JHn+61UT/Y5Z0oyVJGmgmJbZD5g4unY=
29+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4 h1:e0XBRn3AptQotkyBFrHAxFB8mDhAIOfsG+7KyJ0dg98=
30+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4/go.mod h1:XclEty74bsGBCr1s0VSaA11hQ4ZidK4viWK7rRfO88I=
31+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4 h1:PR00NXRYgY4FWHqOGx3fC3lhVKjsp1GdloDv2ynMSd8=
32+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4/go.mod h1:Z+Gd23v97pX9zK97+tX4ppAgqCt3Z2dIXB02CtBncK8=
33+
github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE=
34+
github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
735
github.com/bojanz/currency v1.3.1 h1:3BUAvy/5hU/Pzqg5nrQslVihV50QG+A2xKPoQw1RKH4=
836
github.com/bojanz/currency v1.3.1/go.mod h1:jNoZiJyRTqoU5DFoa+n+9lputxPUDa8Fz8BdDrW06Go=
937
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=

v1/capabilities.go

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,26 @@
11
package v1
22

3+
import "slices"
4+
35
type Capability string
46

57
type Capabilities []Capability
68

79
func (c Capabilities) IsCapable(cc Capability) bool {
8-
for _, capability := range c {
9-
if capability == cc {
10-
return true
11-
}
12-
}
13-
return false
10+
return slices.Contains(c, cc)
1411
}
1512

1613
const (
1714
CapabilityCreateInstance Capability = "create-instance"
1815
CapabilityCreateIdempotentInstance Capability = "create-instance-idempotent"
1916
CapabilityTerminateInstance Capability = "terminate-instance"
17+
CapabilityCreateTerminateInstance Capability = "create-terminate-instance"
18+
CapabilityInstanceUserData Capability = "instance-userdata" // specify user data when creating an instance in CreateInstanceAttrs // should be in instance type
19+
CapabilityTags Capability = "tags"
20+
CapabilityRebootInstance Capability = "reboot-instance"
21+
CapabilityResizeInstanceVolume Capability = "resize-instance-volume"
22+
CapabilityStopStartInstance Capability = "stop-start-instance"
23+
CapabilityMachineImage Capability = "machine-image"
24+
CapabilityModifyFirewall Capability = "modify-firewall"
25+
CapabilityVPC Capability = "vpc"
2026
)
21-
22-
const (
23-
CapabilityCreateTerminateInstance Capability = "create-terminate-instance"
24-
CapabilityInstanceUserData Capability = "instance-userdata" // specify user data when creating an instance in CreateInstanceAttrs // should be in instance type
25-
)
26-
27-
const CapabilityTags Capability = "tags"
28-
29-
const CapabilityRebootInstance Capability = "reboot-instance"
30-
31-
const CapabilityResizeInstanceVolume Capability = "resize-instance-volume"
32-
33-
const CapabilityStopStartInstance Capability = "stop-start-instance"
34-
35-
const CapabilityMachineImage Capability = "machine-image"
36-
37-
const CapabilityModifyFirewall Capability = "modify-firewall"

v1/notimplemented.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,19 @@ func (c notImplCloudClient) MergeInstanceTypeForUpdate(_, i InstanceType) Instan
126126
func (c notImplCloudClient) GetMaxCreateRequestsPerMinute() int {
127127
return 10
128128
}
129+
130+
func (c notImplCloudClient) CreateVPC(_ context.Context, _ CreateVPCArgs) (*VPC, error) {
131+
return nil, ErrNotImplemented
132+
}
133+
134+
func (c notImplCloudClient) DeleteVPC(_ context.Context, _ DeleteVPCArgs) error {
135+
return ErrNotImplemented
136+
}
137+
138+
func (c notImplCloudClient) CreatePublicSubnet(_ context.Context, _ CreatePublicSubnetArgs) (*Subnet, error) {
139+
return nil, ErrNotImplemented
140+
}
141+
142+
func (c notImplCloudClient) CreatePrivateSubnet(_ context.Context, _ CreatePrivateSubnetArgs) (*Subnet, error) {
143+
return nil, ErrNotImplemented
144+
}

v1/providers/aws/capabilities.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package v1
2+
3+
import (
4+
"context"
5+
6+
v1 "github.com/brevdev/cloud/v1"
7+
)
8+
9+
func (c *AWSClient) GetCapabilities(_ context.Context) (v1.Capabilities, error) {
10+
capabilities := v1.Capabilities{
11+
v1.CapabilityVPC,
12+
}
13+
14+
return capabilities, nil
15+
}

v1/providers/aws/client.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package v1
2+
3+
import (
4+
"context"
5+
"crypto/sha256"
6+
"fmt"
7+
8+
v1 "github.com/brevdev/cloud/v1"
9+
10+
"github.com/aws/aws-sdk-go-v2/aws"
11+
"github.com/aws/aws-sdk-go-v2/config"
12+
"github.com/aws/aws-sdk-go-v2/credentials"
13+
)
14+
15+
const CloudProviderID = "aws"
16+
17+
type AWSCredential struct {
18+
RefID string
19+
AccessKeyID string
20+
SecretAccessKey string
21+
}
22+
23+
var _ v1.CloudCredential = &AWSCredential{}
24+
25+
func NewAWSCredential(refID string, accessKeyID string, secretAccessKey string) *AWSCredential {
26+
return &AWSCredential{
27+
RefID: refID,
28+
AccessKeyID: accessKeyID,
29+
SecretAccessKey: secretAccessKey,
30+
}
31+
}
32+
33+
func (c *AWSCredential) GetReferenceID() string {
34+
return c.RefID
35+
}
36+
37+
func (c *AWSCredential) GetAPIType() v1.APIType {
38+
return v1.APITypeGlobal
39+
}
40+
41+
func (c *AWSCredential) GetCloudProviderID() v1.CloudProviderID {
42+
return CloudProviderID
43+
}
44+
45+
func (c *AWSCredential) GetTenantID() (string, error) {
46+
return fmt.Sprintf("%s-%x", CloudProviderID, sha256.Sum256([]byte(c.AccessKeyID))), nil
47+
}
48+
49+
func (c *AWSCredential) GetCapabilities(ctx context.Context) (v1.Capabilities, error) {
50+
client, err := c.MakeClient(ctx, "")
51+
if err != nil {
52+
return nil, err
53+
}
54+
return client.GetCapabilities(ctx)
55+
}
56+
57+
func (c *AWSCredential) MakeClient(_ context.Context, _ string) (v1.CloudClient, error) {
58+
return NewAWSClient(c.RefID, c.AccessKeyID, c.SecretAccessKey)
59+
}
60+
61+
type AWSClient struct {
62+
v1.NotImplCloudClient
63+
refID string
64+
awsConfig aws.Config
65+
}
66+
67+
var _ v1.CloudClient = &AWSClient{}
68+
69+
func NewAWSClient(refID string, accessKeyID string, secretAccessKey string) (*AWSClient, error) {
70+
ctx := context.Background()
71+
72+
awsCredentials := credentials.NewStaticCredentialsProvider(accessKeyID, secretAccessKey, "")
73+
74+
awsConfig, err := config.LoadDefaultConfig(ctx, config.WithCredentialsProvider(awsCredentials))
75+
if err != nil {
76+
return nil, fmt.Errorf("failed to load AWS config: %w", err)
77+
}
78+
79+
return &AWSClient{
80+
refID: refID,
81+
awsConfig: awsConfig,
82+
}, nil
83+
}
84+
85+
func (c *AWSClient) GetAPIType() v1.APIType {
86+
return v1.APITypeGlobal
87+
}
88+
89+
func (c *AWSClient) GetCloudProviderID() v1.CloudProviderID {
90+
return CloudProviderID
91+
}
92+
93+
func (c *AWSClient) GetReferenceID() string {
94+
return c.refID
95+
}

0 commit comments

Comments
 (0)