Skip to content

Commit 0725bc2

Browse files
committed
hooking up aws validation k8s test
1 parent 6f09626 commit 0725bc2

13 files changed

Lines changed: 155 additions & 44 deletions

internal/validation/suite.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -331,12 +331,19 @@ func RunKubernetesValidation(t *testing.T, config ProviderConfig, opts Kubernete
331331
}
332332
}()
333333

334-
// Test: Create Kubernetes Cluster
334+
// Map the input subnet ref IDs to their real subnets
335+
subnetRefIDs := make(map[string]*v1.Subnet)
336+
for _, subnet := range vpc.GetSubnets() {
337+
subnetRefIDs[subnet.GetRefID()] = subnet
338+
}
339+
340+
// Convert the input subnet ref IDs to their real subnet IDs
335341
subnetIDs := []v1.CloudProviderResourceID{}
336-
for _, subnet := range opts.NetworkOpts.Subnets {
337-
subnetIDs = append(subnetIDs, v1.CloudProviderResourceID(subnet.RefID))
342+
for _, subnet := range opts.Subnets {
343+
subnetIDs = append(subnetIDs, subnetRefIDs[subnet.RefID].GetID())
338344
}
339345

346+
// Test: Create Kubernetes Cluster
340347
var clusterID v1.CloudProviderResourceID
341348
t.Run("ValidateCreateKubernetesCluster", func(t *testing.T) {
342349
cluster, err := v1.ValidateCreateKubernetesCluster(ctx, client, v1.CreateClusterArgs{
@@ -392,7 +399,8 @@ func RunKubernetesValidation(t *testing.T, config ProviderConfig, opts Kubernete
392399

393400
// Test: Get Kubernetes Cluster Credentials
394401
t.Run("ValidateGetKubernetesClusterCredentials", func(t *testing.T) {
395-
_, err := v1.ValidateGetKubernetesClusterCredentials(ctx, client, v1.PutClusterUserArgs{
402+
t.Skip("Under development")
403+
_, err := v1.ValidateSetKubernetesClusterUser(ctx, client, v1.SetClusterUserArgs{
396404
ClusterID: clusterID,
397405
Username: opts.UserOpts.Username,
398406
Role: opts.UserOpts.Role,
@@ -442,8 +450,8 @@ func RunKubernetesValidation(t *testing.T, config ProviderConfig, opts Kubernete
442450
Predicate: func(nodeGroup *v1.NodeGroup) bool {
443451
return nodeGroup.GetStatus() == v1.NodeGroupStatusAvailable
444452
},
445-
Timeout: 5 * time.Minute,
446-
Interval: 5 * time.Second,
453+
Timeout: 20 * time.Minute,
454+
Interval: 15 * time.Second,
447455
})
448456
require.NoError(t, err, "WaitForKubernetesNodeGroupToBeAvailable should pass")
449457
})
@@ -475,8 +483,8 @@ func RunKubernetesValidation(t *testing.T, config ProviderConfig, opts Kubernete
475483
nodeGroup.GetMinNodeCount() == opts.NodeGroupOpts.MinNodeCount+1 &&
476484
nodeGroup.GetMaxNodeCount() == opts.NodeGroupOpts.MaxNodeCount+1
477485
},
478-
Timeout: 5 * time.Minute,
479-
Interval: 5 * time.Second,
486+
Timeout: 20 * time.Minute,
487+
Interval: 15 * time.Second,
480488
})
481489
require.NoError(t, err, "WaitForKubernetesNodeGroupToBeAvailable should pass")
482490
})
@@ -507,8 +515,8 @@ func RunKubernetesValidation(t *testing.T, config ProviderConfig, opts Kubernete
507515
Predicate: func(_ *v1.Cluster) bool {
508516
return false // continue until failure
509517
},
510-
Timeout: 5 * time.Minute,
511-
Interval: 5 * time.Second,
518+
Timeout: 20 * time.Minute,
519+
Interval: 15 * time.Second,
512520
})
513521
require.ErrorIs(t, err, v1.ErrResourceNotFound)
514522
clusterDeletionSucceeded = true

v1/kubernetes.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,8 @@ type CloudMaintainKubernetes interface {
478478
// Get a Kubernetes cluster identified by the provided args.
479479
GetCluster(ctx context.Context, args GetClusterArgs) (*Cluster, error)
480480

481-
// Put a user into a Kubernetes cluster.
482-
PutUser(ctx context.Context, args PutClusterUserArgs) (*ClusterUser, error)
481+
// Idempotently set a user into a Kubernetes cluster.
482+
SetClusterUser(ctx context.Context, args SetClusterUserArgs) (*ClusterUser, error)
483483

484484
// Create a new Kubernetes node group.
485485
CreateNodeGroup(ctx context.Context, args CreateNodeGroupArgs) (*NodeGroup, error)
@@ -506,7 +506,7 @@ type CreateClusterArgs struct {
506506
Tags Tags
507507
}
508508

509-
type PutClusterUserArgs struct {
509+
type SetClusterUserArgs struct {
510510
ClusterID CloudProviderResourceID
511511
Username string
512512
RSAPEMBase64 string

v1/kubernetes_validation.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ func ValidateGetKubernetesCluster(ctx context.Context, client CloudMaintainKuber
5353
return cluster, nil
5454
}
5555

56-
// ValidateGetKubernetesClusterCredentials validates that the PutUser functionality works correctly.
57-
func ValidateGetKubernetesClusterCredentials(ctx context.Context, client CloudMaintainKubernetes, attrs PutClusterUserArgs) (*ClusterUser, error) {
58-
putUserResponse, err := client.PutUser(ctx, attrs)
56+
// ValidateSetKubernetesClusterUser validates that the SetClusterUser functionality works correctly.
57+
func ValidateSetKubernetesClusterUser(ctx context.Context, client CloudMaintainKubernetes, attrs SetClusterUserArgs) (*ClusterUser, error) {
58+
clusterUser, err := client.SetClusterUser(ctx, attrs)
5959
if err != nil {
6060
return nil, err
6161
}
62-
return putUserResponse, nil
62+
return clusterUser, nil
6363
}
6464

6565
// ValidateCreateKubernetesNodeGroup validates that the CreateNodeGroup functionality works correctly.

v1/notimplemented.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (c notImplCloudClient) GetCluster(_ context.Context, _ GetClusterArgs) (*Cl
147147
return nil, ErrNotImplemented
148148
}
149149

150-
func (c notImplCloudClient) PutUser(_ context.Context, _ PutClusterUserArgs) (*ClusterUser, error) {
150+
func (c notImplCloudClient) SetClusterUser(_ context.Context, _ SetClusterUserArgs) (*ClusterUser, error) {
151151
return nil, ErrNotImplemented
152152
}
153153

v1/providers/aws/client.go

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/aws/aws-sdk-go-v2/aws"
1111
"github.com/aws/aws-sdk-go-v2/config"
1212
"github.com/aws/aws-sdk-go-v2/credentials"
13+
awslogging "github.com/aws/smithy-go/logging"
1314
)
1415

1516
const CloudProviderID string = "aws"
@@ -73,23 +74,28 @@ func NewAWSClient(refID string, accessKeyID string, secretAccessKey string, regi
7374

7475
awsCredentials := credentials.NewStaticCredentialsProvider(accessKeyID, secretAccessKey, "")
7576

77+
awsClient := &AWSClient{
78+
refID: refID,
79+
region: region,
80+
logger: &v1.NoopLogger{},
81+
}
82+
83+
for _, opt := range opts {
84+
opt(awsClient)
85+
}
86+
7687
awsConfig, err := config.LoadDefaultConfig(ctx,
7788
config.WithCredentialsProvider(awsCredentials),
7889
config.WithRegion(region),
90+
config.WithLogger(&AWSLoggerAdapter{
91+
logger: awsClient.logger,
92+
}),
7993
)
8094
if err != nil {
8195
return nil, fmt.Errorf("failed to load AWS config: %w", err)
8296
}
8397

84-
awsClient := &AWSClient{
85-
refID: refID,
86-
awsConfig: awsConfig,
87-
region: region,
88-
}
89-
90-
for _, opt := range opts {
91-
opt(awsClient)
92-
}
98+
awsClient.awsConfig = awsConfig
9399

94100
return awsClient, nil
95101
}
@@ -105,3 +111,17 @@ func (c *AWSClient) GetCloudProviderID() v1.CloudProviderID {
105111
func (c *AWSClient) GetReferenceID() string {
106112
return c.refID
107113
}
114+
115+
type AWSLoggerAdapter struct {
116+
logger v1.Logger
117+
}
118+
119+
func (l *AWSLoggerAdapter) Logf(classification awslogging.Classification, format string, v ...interface{}) {
120+
ctx := context.Background()
121+
switch classification {
122+
case awslogging.Debug:
123+
l.logger.Debug(ctx, fmt.Sprintf(format, v...))
124+
case awslogging.Warn:
125+
l.logger.Warn(ctx, fmt.Sprintf(format, v...))
126+
}
127+
}

v1/providers/aws/kubernetes.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ func (c *AWSClient) installEKSAddons(ctx context.Context, eksClient *eks.Client,
218218
return err
219219
}
220220

221-
err = c.installEKSAddon(ctx, eksClient, eksCluster, "cert-manager")
221+
err = c.installEKSAddon(ctx, eksClient, eksCluster, "cert-manager") // This requires nodes to complete!
222222
if err != nil {
223223
return err
224224
}
@@ -729,7 +729,7 @@ func (c *AWSClient) DeleteNodeGroup(ctx context.Context, args v1.DeleteNodeGroup
729729
}
730730

731731
// TODO: AWS EKS only supports IAM or OIDC authentication.
732-
func (c *AWSClient) PutUser(ctx context.Context, args v1.PutClusterUserArgs) (*v1.ClusterUser, error) {
732+
func (c *AWSClient) SetClusterUser(ctx context.Context, args v1.SetClusterUserArgs) (*v1.ClusterUser, error) {
733733
err := validatePutUserArgs(args)
734734
if err != nil {
735735
return nil, errors.WrapAndTrace(err)
@@ -820,7 +820,7 @@ func (c *AWSClient) PutUser(ctx context.Context, args v1.PutClusterUserArgs) (*v
820820
return brevClusterUser, nil
821821
}
822822

823-
func validatePutUserArgs(args v1.PutClusterUserArgs) error {
823+
func validatePutUserArgs(args v1.SetClusterUserArgs) error {
824824
errs := []error{}
825825
if args.Username == "" {
826826
errs = append(errs, fmt.Errorf("username is required"))

v1/providers/aws/kubernetes_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func TestPutUser(t *testing.T) {
141141
t.Fatalf("failed to create AWS client: %v", err)
142142
}
143143

144-
config, err := awsClient.PutUser(context.Background(), v1.PutClusterUserArgs{
144+
config, err := awsClient.SetClusterUser(context.Background(), v1.SetClusterUserArgs{
145145
ClusterID: v1.CloudProviderResourceID("cloud-sdk-test2"),
146146
Username: "test-user",
147147
Role: "cluster-admin",

v1/providers/aws/network.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func (c *AWSClient) createCompleteVPC(ctx context.Context, awsClient *ec2.Client
115115
}
116116
publicSubnets = append(publicSubnets, publicSubnet)
117117

118-
brevSubnet, err := awsSubnetToCloudSubnet(publicSubnet, vpc)
118+
brevSubnet, err := awsSubnetToCloudSubnet(publicSubnet, v1.SubnetTypePublic, vpc)
119119
if err != nil {
120120
return nil, nil, errors.WrapAndTrace(err)
121121
}
@@ -133,7 +133,7 @@ func (c *AWSClient) createCompleteVPC(ctx context.Context, awsClient *ec2.Client
133133
return nil, nil, errors.WrapAndTrace(err)
134134
}
135135

136-
brevSubnet, err := awsSubnetToCloudSubnet(privateSubnet, vpc)
136+
brevSubnet, err := awsSubnetToCloudSubnet(privateSubnet, v1.SubnetTypePrivate, vpc)
137137
if err != nil {
138138
return nil, nil, errors.WrapAndTrace(err)
139139
}
@@ -276,7 +276,7 @@ func (c *AWSClient) createInternetGateway(ctx context.Context, awsClient *ec2.Cl
276276
return internetGateway, nil
277277
}
278278

279-
func awsSubnetToCloudSubnet(awsSubnet *types.Subnet, vpc *types.Vpc) (*v1.Subnet, error) {
279+
func awsSubnetToCloudSubnet(awsSubnet *types.Subnet, subnetType v1.SubnetType, vpc *types.Vpc) (*v1.Subnet, error) {
280280
tags := make(map[string]string)
281281
for _, tag := range awsSubnet.Tags {
282282
tags[*tag.Key] = *tag.Value
@@ -289,7 +289,7 @@ func awsSubnetToCloudSubnet(awsSubnet *types.Subnet, vpc *types.Vpc) (*v1.Subnet
289289
VPCID: v1.CloudProviderResourceID(*vpc.VpcId),
290290
Location: *awsSubnet.AvailabilityZone,
291291
CidrBlock: *awsSubnet.CidrBlock,
292-
Type: v1.SubnetTypePublic,
292+
Type: subnetType,
293293
Tags: v1.Tags(tags),
294294
})
295295
if err != nil {

v1/providers/aws/network_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ func TestCreateVPC(t *testing.T) {
4646
}
4747

4848
func TestDeleteVPC(t *testing.T) {
49-
awsClient, err := NewAWSClient("test", accessKeyID, secretAccessKey, "us-east-1")
49+
awsClient, err := NewAWSClient("test", accessKeyID, secretAccessKey, "us-east-1", WithLogger(&validation.ValidationLogger{}))
5050
if err != nil {
5151
t.Fatalf("failed to create AWS client: %v", err)
5252
}
5353

5454
err = awsClient.DeleteVPC(context.Background(), v1.DeleteVPCArgs{
55-
ID: v1.CloudProviderResourceID("vpc-058c6bf7024c272dc"),
55+
ID: v1.CloudProviderResourceID("vpc-0971c0a1800608e7b"),
5656
})
5757
if err != nil {
5858
t.Fatalf("failed to delete VPC: %v", err)
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package v1
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
"time"
8+
9+
"github.com/brevdev/cloud/internal/validation"
10+
v1 "github.com/brevdev/cloud/v1"
11+
)
12+
13+
func TestAWSKubernetesValidation(t *testing.T) {
14+
testUserPrivateKeyPEMBase64 := os.Getenv("TEST_USER_PRIVATE_KEY_PEM_BASE64")
15+
16+
if accessKeyID == "" || secretAccessKey == "" {
17+
t.Fatalf("AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY must be set")
18+
}
19+
20+
config := validation.ProviderConfig{
21+
Location: "us-east-1",
22+
Credential: NewAWSCredential(fmt.Sprintf("validation-%s", t.Name()), accessKeyID, secretAccessKey),
23+
}
24+
25+
// Use the test name as the name of the cluster and node group
26+
name := fmt.Sprintf("cloud-sdk-%s-%s", t.Name(), time.Now().UTC().Format("20060102150405"))
27+
28+
// Network CIDR
29+
networkCidr := "10.0.0.0/16"
30+
31+
// Network subnets
32+
pubSubnet1 := validation.KubernetesValidationSubnetOpts{Name: "pub-subnet-1", RefID: "pub-subnet-1", CidrBlock: "10.0.0.0/19", SubnetType: v1.SubnetTypePublic}
33+
prvSubnet1 := validation.KubernetesValidationSubnetOpts{Name: "prv-subnet-1", RefID: "prv-subnet-1", CidrBlock: "10.0.32.0/19", SubnetType: v1.SubnetTypePrivate}
34+
pubSubnet2 := validation.KubernetesValidationSubnetOpts{Name: "pub-subnet-2", RefID: "pub-subnet-2", CidrBlock: "10.0.64.0/19", SubnetType: v1.SubnetTypePublic}
35+
prvSubnet2 := validation.KubernetesValidationSubnetOpts{Name: "prv-subnet-2", RefID: "prv-subnet-2", CidrBlock: "10.0.96.0/19", SubnetType: v1.SubnetTypePrivate}
36+
37+
validation.RunKubernetesValidation(t, config, validation.KubernetesValidationOpts{
38+
Name: name,
39+
RefID: name,
40+
KubernetesVersion: "1.31",
41+
// Associate the VPC with the private subnets
42+
Subnets: []validation.KubernetesValidationSubnetOpts{prvSubnet1, prvSubnet2},
43+
NetworkOpts: &validation.KubernetesValidationNetworkOpts{
44+
Name: name,
45+
RefID: name,
46+
CidrBlock: networkCidr,
47+
// Build the network with all subnets
48+
Subnets: []validation.KubernetesValidationSubnetOpts{pubSubnet1, prvSubnet1, pubSubnet2, prvSubnet2},
49+
},
50+
NodeGroupOpts: &validation.KubernetesValidationNodeGroupOpts{
51+
Name: name,
52+
RefID: name,
53+
InstanceType: "t3.medium",
54+
DiskSizeGiB: 20,
55+
MinNodeCount: 1,
56+
MaxNodeCount: 1,
57+
},
58+
UserOpts: &validation.KubernetesValidationUserOpts{
59+
Username: "test-user",
60+
Role: "cluster-admin",
61+
RSAPEMBase64: testUserPrivateKeyPEMBase64,
62+
},
63+
Tags: map[string]string{
64+
"test": "TestKubernetesValidation",
65+
},
66+
})
67+
}

0 commit comments

Comments
 (0)