78 lines
2.8 KiB
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
|
||
|
}
|