Middleware to manage tags_all attribute
parent
846b32801a
commit
618d7ebf54
|
@ -97,6 +97,7 @@ func (d DriftCTL) Run() (*analyser.Analysis, error) {
|
|||
middlewares.NewAwsDefaultSqsQueuePolicy(),
|
||||
middlewares.NewAwsSNSTopicPolicyExpander(d.resourceFactory, d.resourceSchemaRepository),
|
||||
middlewares.NewAwsRoleManagedPolicyExpander(d.resourceFactory),
|
||||
middlewares.NewTagsAllManager(),
|
||||
)
|
||||
|
||||
if !d.opts.StrictMode {
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
package middlewares
|
||||
|
||||
import (
|
||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||
)
|
||||
|
||||
// Manage tags_all attribute on each compatible resources
|
||||
type TagsAllManager struct{}
|
||||
|
||||
func NewTagsAllManager() TagsAllManager {
|
||||
return TagsAllManager{}
|
||||
}
|
||||
|
||||
func (a TagsAllManager) Execute(remoteResources, resourcesFromState *[]resource.Resource) error {
|
||||
for _, remoteRes := range *remoteResources {
|
||||
if res, ok := remoteRes.(*resource.AbstractResource); ok {
|
||||
if _, exist := res.Attrs.Get("tags_all"); exist {
|
||||
res.Attrs.SafeDelete([]string{"tags_all"})
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, stateRes := range *resourcesFromState {
|
||||
if res, ok := stateRes.(*resource.AbstractResource); ok {
|
||||
if allTags, exist := res.Attrs.Get("tags_all"); exist {
|
||||
_ = res.Attrs.SafeSet([]string{"tags"}, allTags)
|
||||
res.Attrs.SafeDelete([]string{"tags_all"})
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
package middlewares
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws/awsutil"
|
||||
"github.com/cloudskiff/driftctl/pkg/resource"
|
||||
"github.com/r3labs/diff/v2"
|
||||
)
|
||||
|
||||
func TestTagsAllManager_Execute(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
remoteResources *[]resource.Resource
|
||||
resourcesFromState *[]resource.Resource
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "With multiple resources that are tags_all compatible",
|
||||
remoteResources: &[]resource.Resource{
|
||||
&resource.AbstractResource{
|
||||
Id: "dummy-instance",
|
||||
Type: "aws_instance",
|
||||
Attrs: &resource.Attributes{
|
||||
"tags": map[string]interface{}{
|
||||
"Name": "toto",
|
||||
"Terraform": "true",
|
||||
},
|
||||
"tags_all": map[string]interface{}{
|
||||
"Name": "toto",
|
||||
"Terraform": "true",
|
||||
},
|
||||
},
|
||||
},
|
||||
&resource.AbstractResource{
|
||||
Id: "dummy-ebs-volume",
|
||||
Type: "aws_ebs_volume",
|
||||
Attrs: &resource.Attributes{
|
||||
"tags": map[string]interface{}{
|
||||
"Name": "tata",
|
||||
"Terraform": "true",
|
||||
},
|
||||
"tags_all": map[string]interface{}{
|
||||
"Name": "tata",
|
||||
"Terraform": "true",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
resourcesFromState: &[]resource.Resource{
|
||||
&resource.AbstractResource{
|
||||
Id: "dummy-instance",
|
||||
Type: "aws_instance",
|
||||
Attrs: &resource.Attributes{
|
||||
"tags": map[string]interface{}{
|
||||
"Name": "toto",
|
||||
},
|
||||
"tags_all": map[string]interface{}{
|
||||
"Name": "toto",
|
||||
"Terraform": "true",
|
||||
},
|
||||
},
|
||||
},
|
||||
&resource.AbstractResource{
|
||||
Id: "dummy-ebs-volume",
|
||||
Type: "aws_ebs_volume",
|
||||
Attrs: &resource.Attributes{
|
||||
"tags": map[string]interface{}{
|
||||
"Name": "tata",
|
||||
},
|
||||
"tags_all": map[string]interface{}{
|
||||
"Name": "tata",
|
||||
"Terraform": "true",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
a := NewTagsAllManager()
|
||||
if err := a.Execute(tt.remoteResources, tt.resourcesFromState); (err != nil) != tt.wantErr {
|
||||
t.Errorf("Execute() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
changelog, err := diff.Diff(tt.resourcesFromState, tt.remoteResources)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if len(changelog) > 0 {
|
||||
for _, change := range changelog {
|
||||
t.Errorf("%s got = %v, want %v", strings.Join(change.Path, "."), awsutil.Prettify(change.From), awsutil.Prettify(change.To))
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue