driftctl/pkg/middlewares/aws_instance_block_device.go

78 lines
2.8 KiB
Go

package middlewares
import (
awssdk "github.com/aws/aws-sdk-go/aws"
"github.com/cloudskiff/driftctl/pkg/resource"
"github.com/cloudskiff/driftctl/pkg/resource/aws"
"github.com/sirupsen/logrus"
)
// Remove root_block_device from aws_instance resources and create dedicated aws_ebs_volume resources
type AwsInstanceBlockDeviceResourceMapper struct{}
func NewAwsInstanceBlockDeviceResourceMapper() AwsInstanceBlockDeviceResourceMapper {
return AwsInstanceBlockDeviceResourceMapper{}
}
func (a AwsInstanceBlockDeviceResourceMapper) Execute(remoteResources, resourcesFromState *[]resource.Resource) error {
newStateResources := make([]resource.Resource, 0)
for _, stateRes := range *resourcesFromState {
// Ignore all resources other than aws_instance
if stateRes.TerraformType() != aws.AwsInstanceResourceType {
newStateResources = append(newStateResources, stateRes)
continue
}
instance, _ := stateRes.(*aws.AwsInstance)
if instance.RootBlockDevice != nil && len(*instance.RootBlockDevice) > 0 {
for _, rootBlock := range *instance.RootBlockDevice {
logrus.WithFields(logrus.Fields{
"volume": *rootBlock.VolumeId,
"instance": instance.TerraformId(),
}).Debug("Creating aws_ebs_volume from aws_instance.root_block_device")
ebsVolume := aws.AwsEbsVolume{
AvailabilityZone: instance.AvailabilityZone,
Encrypted: rootBlock.Encrypted,
Id: *rootBlock.VolumeId,
Iops: rootBlock.Iops,
KmsKeyId: rootBlock.KmsKeyId,
Size: rootBlock.VolumeSize,
Type: rootBlock.VolumeType,
MultiAttachEnabled: awssdk.Bool(false),
Tags: instance.VolumeTags,
}
newStateResources = append(newStateResources, &ebsVolume)
}
instance.RootBlockDevice = nil
}
if instance.EbsBlockDevice != nil && len(*instance.EbsBlockDevice) > 0 {
for _, blockDevice := range *instance.EbsBlockDevice {
logrus.WithFields(logrus.Fields{
"volume": *blockDevice.VolumeId,
"instance": instance.TerraformId(),
}).Debug("Creating aws_ebs_volume from aws_instance.ebs_block_device")
ebsVolume := aws.AwsEbsVolume{
AvailabilityZone: instance.AvailabilityZone,
Encrypted: blockDevice.Encrypted,
Id: *blockDevice.VolumeId,
Iops: blockDevice.Iops,
KmsKeyId: blockDevice.KmsKeyId,
Size: blockDevice.VolumeSize,
Type: blockDevice.VolumeType,
MultiAttachEnabled: awssdk.Bool(false),
Tags: instance.VolumeTags,
}
newStateResources = append(newStateResources, &ebsVolume)
}
instance.EbsBlockDevice = nil
}
newStateResources = append(newStateResources, instance)
}
*resourcesFromState = newStateResources
return nil
}