Skip to content

Commit

Permalink
(MINOR) Adding code for testing & getting ec2 volume type, threshold …
Browse files Browse the repository at this point in the history
…& iops (#28)

## ADDED
* Methods for testing & getting ec2 volume type, threshold & iops. This change will support customizing & testing volume types other than gp2.
  • Loading branch information
sunkaraamrutha authored Feb 23, 2022
1 parent e1d1ede commit 4758482
Show file tree
Hide file tree
Showing 3 changed files with 300 additions and 2 deletions.
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ module github.com/hbocodelabs/infratest
go 1.17

require (
github.com/aws/aws-sdk-go v1.42.43 // indirect
github.com/aws/aws-sdk-go-v2 v1.13.0
github.com/aws/aws-sdk-go-v2/service/dax v1.6.0
github.com/aws/aws-sdk-go-v2/service/ec2 v1.12.0
github.com/aws/aws-sdk-go-v2/service/eks v1.18.0
Expand All @@ -26,7 +26,7 @@ require (
cloud.google.com/go v0.83.0 // indirect
github.com/BurntSushi/toml v0.3.1 // indirect
github.com/alessio/shellescape v1.4.1 // indirect
github.com/aws/aws-sdk-go-v2 v1.13.0 // indirect
github.com/aws/aws-sdk-go v1.42.43 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.4 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.2.0 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.1 // indirect
Expand Down
65 changes: 65 additions & 0 deletions pkg/aws/ec2.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

const (
Expand Down Expand Up @@ -48,6 +49,21 @@ type AssertEC2TagValueEInput struct {
InstanceID string
}

// AssertVolumeAttributesInput is used as an input to the AssertEC2VolumeType,AssertEC2VolumeIops,AssertEC2VolumeThroughput methods.
type AssertVolumeAttributesInput struct {
// The Instance ID that is used to get devices associated to it.
InstanceID string
// The device ID that the volume is mapped to on the instance.
// Used for informational purpose
DeviceID string
// The Volume Type for each volume
VolumeType string
// The Volume IOPS for each volume
VolumeIOPS *int32
// The Volume throughput for each volume
VolumeThroughput *int32
}

// AssertEC2TagValueInput is used as an input to the AssertEC2TagValue method.
type AssertEC2TagValueInput struct {
// The name of the tag to assert exists.
Expand Down Expand Up @@ -119,6 +135,55 @@ func AssertEC2VolumeEncrypted(t *testing.T, ctx context.Context, client EC2Clien
assert.True(t, deviceEncrypted, "Volume with device ID '%s' for instance '%s' was not encrypted.", input.DeviceID, input.InstanceID)
}

// AssertVolumeType asserts the right volume type
func AssertEC2VolumeType(t *testing.T, ctx context.Context, client EC2Client, input AssertVolumeAttributesInput) {

instance, err := getEC2InstanceByInstanceIDE(ctx, client, input.InstanceID)

require.NoError(t, err)

for _, v := range instance.BlockDeviceMappings {
volume, err := getEC2VolumeByVolumeIDE(ctx, client, *v.Ebs.VolumeId)
require.NoError(t, err)
volumeType := fmt.Sprintf("%v", volume.VolumeType)
assert.Equal(t, input.VolumeType, volumeType, "Volume with device ID '%s' does not have the right volume type.", input.DeviceID)
}
}

// AssertVolumeThroughput & IOPs asserts associated throughput for given volume type
func AssertEC2VolumeThroughput(t *testing.T, ctx context.Context, client EC2Client, input AssertVolumeAttributesInput) {

instance, err := getEC2InstanceByInstanceIDE(ctx, client, input.InstanceID)
require.NoError(t, err)

for _, v := range instance.BlockDeviceMappings {
volume, err := getEC2VolumeByVolumeIDE(ctx, client, *v.Ebs.VolumeId)
require.NoError(t, err)
if input.VolumeType != "gp2" {
assert.Equal(t, input.VolumeThroughput, volume.Throughput, "Volume with device ID '%s' does not have the right throughput associated to volume.", input.DeviceID)
} else {
t.Logf("This test is ignored since it is not gp3 volume type : %s", input.VolumeType)
}
}
}

// AssertVolumeIops asserts associated Iops for given volume type
func AssertEC2VolumeIOPS(t *testing.T, ctx context.Context, client EC2Client, input AssertVolumeAttributesInput) {

instance, err := getEC2InstanceByInstanceIDE(ctx, client, input.InstanceID)
require.NoError(t, err)

for _, v := range instance.BlockDeviceMappings {
volume, err := getEC2VolumeByVolumeIDE(ctx, client, *v.Ebs.VolumeId)
require.NoError(t, err)
if input.VolumeType != "gp2" {
assert.Equal(t, input.VolumeIOPS, volume.Iops, "Volume with device ID '%s' does not have the right IOPS value associated to volume.", input.DeviceID)
} else {
t.Logf("This test is ignored since it is not gp3 volume type : %s", input.VolumeType)
}
}
}

// AssertEC2TagValue asserts that an EC2 instance has a tag with the given value.
func AssertEC2TagValue(t *testing.T, ctx context.Context, client EC2Client, input AssertEC2TagValueInput) {
resourceTypeFilterName := resourceTypeFilterName
Expand Down
233 changes: 233 additions & 0 deletions pkg/aws/ec2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"context"
"fmt"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/golang/mock/gomock"
Expand Down Expand Up @@ -730,3 +731,235 @@ func TestGetEC2SecurityGroupByNameE(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, expectedOutput, actualOutput)
}

func TestAssertEC2VolumeType_MatchWithGP2(t *testing.T) {
// Setup
instanceID := "i546acas321sd"
volumeId := "v123dfasd92"
deviceName := "/dev/sdc"
kmsKeyID := "/key/id"
encrypted := true
volumeType := types.VolumeTypeGp2
volumeIops := aws.Int32(0)
volumeThroughput := aws.Int32(0)
instanceOutput := &ec2.DescribeInstancesOutput{
Reservations: []types.Reservation{
{
Instances: []types.Instance{
{
InstanceId: &instanceID,
BlockDeviceMappings: []types.InstanceBlockDeviceMapping{
{
DeviceName: &deviceName,
Ebs: &types.EbsInstanceBlockDevice{
VolumeId: &volumeId,
},
},
},
},
},
},
},
}
volumeOutput := &ec2.DescribeVolumesOutput{
Volumes: []types.Volume{
{
Encrypted: &encrypted,
KmsKeyId: &kmsKeyID,
VolumeType: volumeType,
},
},
}
clientMock := &EC2ClientMock{
DescribeInstancesOutput: instanceOutput,
DescribeVolumesOutput: volumeOutput,
}
fakeTest := &testing.T{}

// Execute
AssertEC2VolumeType(fakeTest, context.Background(), clientMock, AssertVolumeAttributesInput{
DeviceID: deviceName,
InstanceID: instanceID,
VolumeType: "gp2",
VolumeIOPS: volumeIops,
VolumeThroughput: volumeThroughput,
})

// Assert
assert.False(t, fakeTest.Failed())
}

func TestAssertEC2VolumeType_MatchWithGP3(t *testing.T) {
// Setup
instanceID := "i546acas321sd"
volumeId := "v123dfasd92"
deviceName := "/dev/sdc"
kmsKeyID := "/key/id"
encrypted := true
volumeType := types.VolumeTypeGp3
volumeIops := aws.Int32(100)
volumeThroughput := aws.Int32(1000)
instanceOutput := &ec2.DescribeInstancesOutput{
Reservations: []types.Reservation{
{
Instances: []types.Instance{
{
InstanceId: &instanceID,
BlockDeviceMappings: []types.InstanceBlockDeviceMapping{
{
DeviceName: &deviceName,
Ebs: &types.EbsInstanceBlockDevice{
VolumeId: &volumeId,
},
},
},
},
},
},
},
}
volumeOutput := &ec2.DescribeVolumesOutput{
Volumes: []types.Volume{
{
Encrypted: &encrypted,
KmsKeyId: &kmsKeyID,
VolumeType: volumeType,
},
},
}
clientMock := &EC2ClientMock{
DescribeInstancesOutput: instanceOutput,
DescribeVolumesOutput: volumeOutput,
}
fakeTest := &testing.T{}

// Execute
AssertEC2VolumeType(fakeTest, context.Background(), clientMock, AssertVolumeAttributesInput{
DeviceID: deviceName,
InstanceID: instanceID,
VolumeType: "gp3",
VolumeIOPS: volumeIops,
VolumeThroughput: volumeThroughput,
})

// Assert
assert.False(t, fakeTest.Failed())
}

func TestAssertEC2VolumeType_MatchWithThroughput(t *testing.T) {
// Setup
instanceID := "i546acas321sd"
volumeId := "v123dfasd92"
deviceName := "/dev/sdc"
kmsKeyID := "/key/id"
encrypted := true
volumeType := types.VolumeTypeGp3
volumeIops := aws.Int32(100)
volumeThroughput := aws.Int32(1000)
instanceOutput := &ec2.DescribeInstancesOutput{
Reservations: []types.Reservation{
{
Instances: []types.Instance{
{
InstanceId: &instanceID,
BlockDeviceMappings: []types.InstanceBlockDeviceMapping{
{
DeviceName: &deviceName,
Ebs: &types.EbsInstanceBlockDevice{
VolumeId: &volumeId,
},
},
},
},
},
},
},
}
volumeOutput := &ec2.DescribeVolumesOutput{
Volumes: []types.Volume{
{
Encrypted: &encrypted,
KmsKeyId: &kmsKeyID,
VolumeType: volumeType,
Throughput: volumeThroughput,
Iops: volumeIops,
},
},
}
clientMock := &EC2ClientMock{
DescribeInstancesOutput: instanceOutput,
DescribeVolumesOutput: volumeOutput,
}
fakeTest := &testing.T{}

// Execute
AssertEC2VolumeThroughput(fakeTest, context.Background(), clientMock, AssertVolumeAttributesInput{
DeviceID: deviceName,
InstanceID: instanceID,
VolumeType: "gp3",
VolumeIOPS: volumeIops,
VolumeThroughput: volumeThroughput,
})

// Assert
assert.False(t, fakeTest.Failed())
}

func TestAssertEC2VolumeType_MatchWithIOPS(t *testing.T) {
// Setup
instanceID := "i546acas321sd"
volumeId := "v123dfasd92"
deviceName := "/dev/sdc"
kmsKeyID := "/key/id"
encrypted := true
volumeType := types.VolumeTypeGp3
volumeIops := aws.Int32(100)
volumeThroughput := aws.Int32(1000)
instanceOutput := &ec2.DescribeInstancesOutput{
Reservations: []types.Reservation{
{
Instances: []types.Instance{
{
InstanceId: &instanceID,
BlockDeviceMappings: []types.InstanceBlockDeviceMapping{
{
DeviceName: &deviceName,
Ebs: &types.EbsInstanceBlockDevice{
VolumeId: &volumeId,
},
},
},
},
},
},
},
}
volumeOutput := &ec2.DescribeVolumesOutput{
Volumes: []types.Volume{
{
Encrypted: &encrypted,
KmsKeyId: &kmsKeyID,
VolumeType: volumeType,
Throughput: volumeThroughput,
Iops: volumeIops,
},
},
}
clientMock := &EC2ClientMock{
DescribeInstancesOutput: instanceOutput,
DescribeVolumesOutput: volumeOutput,
}
fakeTest := &testing.T{}

// Execute
AssertEC2VolumeIOPS(fakeTest, context.Background(), clientMock, AssertVolumeAttributesInput{
DeviceID: deviceName,
InstanceID: instanceID,
VolumeType: "gp3",
VolumeIOPS: volumeIops,
VolumeThroughput: volumeThroughput,
})

// Assert
assert.False(t, fakeTest.Failed())
}

0 comments on commit 4758482

Please sign in to comment.