driftctl/pkg/middlewares/aws_sns_topic_policy_expand...

94 lines
2.5 KiB
Go
Raw Normal View History

package middlewares
import (
2021-05-03 17:22:36 +00:00
"github.com/pkg/errors"
2021-03-29 16:10:50 +00:00
"github.com/sirupsen/logrus"
2021-12-06 13:29:39 +00:00
"github.com/snyk/driftctl/pkg/resource"
"github.com/snyk/driftctl/pkg/resource/aws"
)
// Explodes policy found in aws_sns_topic from state resources to aws_sns_topic_policy resources
2021-03-29 16:10:50 +00:00
type AwsSNSTopicPolicyExpander struct {
2021-05-03 17:15:14 +00:00
resourceFactory resource.ResourceFactory
resourceSchemaRepository resource.SchemaRepositoryInterface
2021-03-29 16:10:50 +00:00
}
2021-05-03 17:15:14 +00:00
func NewAwsSNSTopicPolicyExpander(resourceFactory resource.ResourceFactory, resourceSchemaRepository resource.SchemaRepositoryInterface) AwsSNSTopicPolicyExpander {
2021-03-29 16:10:50 +00:00
return AwsSNSTopicPolicyExpander{
resourceFactory,
2021-05-03 17:15:14 +00:00
resourceSchemaRepository,
2021-03-29 16:10:50 +00:00
}
}
2021-08-09 14:03:04 +00:00
func (m AwsSNSTopicPolicyExpander) Execute(remoteResources, resourcesFromState *[]*resource.Resource) error {
for _, res := range *remoteResources {
if res.ResourceType() != aws.AwsSnsTopicResourceType {
continue
}
2021-08-09 14:03:04 +00:00
res.Attrs.SafeDelete([]string{"policy"})
}
2021-08-09 14:03:04 +00:00
newList := make([]*resource.Resource, 0)
for _, res := range *resourcesFromState {
// Ignore all resources other than sns_topic
if res.ResourceType() != aws.AwsSnsTopicResourceType {
newList = append(newList, res)
continue
}
newList = append(newList, res)
2021-08-09 14:03:04 +00:00
if m.hasPolicyAttached(res, resourcesFromState) {
res.Attrs.SafeDelete([]string{"policy"})
continue
}
2021-08-09 14:03:04 +00:00
err := m.splitPolicy(res, &newList)
if err != nil {
return err
}
}
*resourcesFromState = newList
return nil
}
2021-08-09 14:03:04 +00:00
func (m *AwsSNSTopicPolicyExpander) splitPolicy(topic *resource.Resource, results *[]*resource.Resource) error {
2021-05-03 17:22:36 +00:00
policy, exist := topic.Attrs.Get("policy")
if !exist || policy == "" {
return nil
}
2021-05-03 17:22:36 +00:00
arn, exist := topic.Attrs.Get("arn")
if !exist || arn == "" {
return errors.Errorf("No arn found for resource %s (%s)", topic.Id, topic.Type)
2021-03-29 16:10:50 +00:00
}
2021-05-03 17:22:36 +00:00
data := map[string]interface{}{
"arn": arn,
"id": topic.Id,
"policy": policy,
}
newPolicy := m.resourceFactory.CreateAbstractResource("aws_sns_topic_policy", topic.Id, data)
2021-05-03 17:15:14 +00:00
*results = append(*results, newPolicy)
logrus.WithFields(logrus.Fields{
"id": newPolicy.ResourceId(),
}).Debug("Created new policy from sns_topic")
2021-05-03 17:22:36 +00:00
topic.Attrs.SafeDelete([]string{"policy"})
return nil
}
2021-08-09 14:03:04 +00:00
func (m *AwsSNSTopicPolicyExpander) hasPolicyAttached(topic *resource.Resource, resourcesFromState *[]*resource.Resource) bool {
for _, res := range *resourcesFromState {
if res.ResourceType() == aws.AwsSnsTopicPolicyResourceType &&
res.ResourceId() == topic.Id {
return true
}
}
return false
}