61 lines
2.1 KiB
Go
61 lines
2.1 KiB
Go
package middlewares
|
|
|
|
import (
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/snyk/driftctl/enumeration/resource"
|
|
"github.com/snyk/driftctl/pkg/resource/aws"
|
|
)
|
|
|
|
// AwsRDSClusterInstanceExpander search for cluster instances from state to import corresponding remote db instances.
|
|
// RDS cluster instance does not represent an actual AWS resource, so shouldn't be used for comparison.
|
|
type AwsRDSClusterInstanceExpander struct {
|
|
resourceFactory resource.ResourceFactory
|
|
}
|
|
|
|
func NewRDSClusterInstanceExpander(resourceFactory resource.ResourceFactory) AwsRDSClusterInstanceExpander {
|
|
return AwsRDSClusterInstanceExpander{
|
|
resourceFactory: resourceFactory,
|
|
}
|
|
}
|
|
|
|
func (m AwsRDSClusterInstanceExpander) Execute(remoteResources, resourcesFromState *[]*resource.Resource) error {
|
|
newResourcesFromState := make([]*resource.Resource, 0)
|
|
|
|
dbInstances := make([]*resource.Resource, 0)
|
|
for _, remoteRes := range *remoteResources {
|
|
if remoteRes.ResourceType() != aws.AwsDbInstanceResourceType {
|
|
continue
|
|
}
|
|
dbInstances = append(dbInstances, remoteRes)
|
|
}
|
|
|
|
for _, stateRes := range *resourcesFromState {
|
|
// Ignore all resources other than rds_cluster_instance
|
|
if stateRes.ResourceType() != aws.AwsRDSClusterInstanceResourceType {
|
|
newResourcesFromState = append(newResourcesFromState, stateRes)
|
|
continue
|
|
}
|
|
|
|
var found bool
|
|
for _, remoteRes := range dbInstances {
|
|
// If the db instance's id matches the rds cluster instance's id, import it in the state
|
|
if remoteRes.ResourceId() == stateRes.ResourceId() {
|
|
found = true
|
|
newDbInstance := m.resourceFactory.CreateAbstractResource(aws.AwsDbInstanceResourceType, remoteRes.ResourceId(), *remoteRes.Attributes())
|
|
newResourcesFromState = append(newResourcesFromState, newDbInstance)
|
|
logrus.WithFields(logrus.Fields{
|
|
"id": newDbInstance.ResourceId(),
|
|
}).Debug("Created new db instance from RDS cluster instance")
|
|
break
|
|
}
|
|
}
|
|
|
|
// If we don't manage to find a db instance corresponding to this RDS cluster instance, simply add it back to the state.
|
|
if !found {
|
|
newResourcesFromState = append(newResourcesFromState, stateRes)
|
|
}
|
|
}
|
|
*resourcesFromState = newResourcesFromState
|
|
return nil
|
|
}
|