github.com/jenkins-x/jx/v2@v2.1.155/pkg/cloud/amazon/ec2/ec2_test.go (about)

     1  // +build unit
     2  
     3  package ec2
     4  
     5  import (
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/aws/aws-sdk-go/aws"
    10  
    11  	"github.com/jenkins-x/jx/v2/pkg/cluster"
    12  
    13  	"github.com/aws/aws-sdk-go/aws/session"
    14  
    15  	"github.com/aws/aws-sdk-go/service/ec2"
    16  	"github.com/aws/aws-sdk-go/service/ec2/ec2iface"
    17  	"github.com/stretchr/testify/assert"
    18  )
    19  
    20  type mockedEC2 struct {
    21  	ec2iface.EC2API
    22  	DescribeVolumesVols    []*ec2.Volume
    23  	DeleteVolumeValidation func([]*ec2.Volume, []*ec2.Volume)
    24  }
    25  
    26  func (m mockedEC2) DescribeVolumes(vi *ec2.DescribeVolumesInput) (*ec2.DescribeVolumesOutput, error) {
    27  	var volumes []*ec2.Volume
    28  	for _, v := range m.DescribeVolumesVols {
    29  		for _, t := range v.Tags {
    30  			if strings.Contains(*vi.Filters[0].Name, *t.Key) {
    31  				volumes = append(volumes, v)
    32  			}
    33  		}
    34  	}
    35  	return &ec2.DescribeVolumesOutput{
    36  		Volumes: volumes,
    37  	}, nil
    38  }
    39  
    40  func (m mockedEC2) DeleteVolume(input *ec2.DeleteVolumeInput) (*ec2.DeleteVolumeOutput, error) {
    41  	if len(m.DescribeVolumesVols) > 0 {
    42  		for i, v := range m.DescribeVolumesVols {
    43  			if *v.VolumeId == *input.VolumeId {
    44  				deleted := append(m.DescribeVolumesVols[:i], m.DescribeVolumesVols[i+1:]...)
    45  				m.DeleteVolumeValidation(m.DescribeVolumesVols, deleted)
    46  			}
    47  		}
    48  	}
    49  	return &ec2.DeleteVolumeOutput{}, nil
    50  }
    51  
    52  func TestEC2Options_DeleteVolumesForCluster(t *testing.T) {
    53  	sess, err := session.NewSession()
    54  	assert.NoError(t, err)
    55  	ec2Options, err := NewEC2APIHandler(sess, mockedEC2{
    56  		DescribeVolumesVols: []*ec2.Volume{
    57  			{
    58  				State:    aws.String(ec2.VolumeStateAvailable),
    59  				VolumeId: aws.String("vol1"),
    60  				Tags: []*ec2.Tag{
    61  					{
    62  						Key:   aws.String("kubernetes.io/cluster/cluster1"),
    63  						Value: aws.String("owner"),
    64  					},
    65  				},
    66  			},
    67  			{
    68  				State:    aws.String(ec2.VolumeStateAvailable),
    69  				VolumeId: aws.String("vol2"),
    70  			},
    71  		},
    72  		DeleteVolumeValidation: func(original []*ec2.Volume, deleted []*ec2.Volume) {
    73  			assert.True(t, len(original) == (len(deleted)+1), "the deleted volume slice should be one element smaller than the original")
    74  		},
    75  	})
    76  	assert.NoError(t, err)
    77  	err = ec2Options.DeleteVolumesForCluster(&cluster.Cluster{
    78  		Name: "cluster1",
    79  	})
    80  	assert.NoError(t, err)
    81  }