Skip to content

Commit 797f527

Browse files
authored
Merge pull request #680 from cloudskiff/fix/ignore_tags_all
Middleware to manage tags_all attribute
2 parents 846b328 + 618d7eb commit 797f527

File tree

3 files changed

+130
-0
lines changed

3 files changed

+130
-0
lines changed

pkg/driftctl.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ func (d DriftCTL) Run() (*analyser.Analysis, error) {
9797
middlewares.NewAwsDefaultSqsQueuePolicy(),
9898
middlewares.NewAwsSNSTopicPolicyExpander(d.resourceFactory, d.resourceSchemaRepository),
9999
middlewares.NewAwsRoleManagedPolicyExpander(d.resourceFactory),
100+
middlewares.NewTagsAllManager(),
100101
)
101102

102103
if !d.opts.StrictMode {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package middlewares
2+
3+
import (
4+
"github.com/cloudskiff/driftctl/pkg/resource"
5+
)
6+
7+
// Manage tags_all attribute on each compatible resources
8+
type TagsAllManager struct{}
9+
10+
func NewTagsAllManager() TagsAllManager {
11+
return TagsAllManager{}
12+
}
13+
14+
func (a TagsAllManager) Execute(remoteResources, resourcesFromState *[]resource.Resource) error {
15+
for _, remoteRes := range *remoteResources {
16+
if res, ok := remoteRes.(*resource.AbstractResource); ok {
17+
if _, exist := res.Attrs.Get("tags_all"); exist {
18+
res.Attrs.SafeDelete([]string{"tags_all"})
19+
}
20+
}
21+
}
22+
for _, stateRes := range *resourcesFromState {
23+
if res, ok := stateRes.(*resource.AbstractResource); ok {
24+
if allTags, exist := res.Attrs.Get("tags_all"); exist {
25+
_ = res.Attrs.SafeSet([]string{"tags"}, allTags)
26+
res.Attrs.SafeDelete([]string{"tags_all"})
27+
}
28+
}
29+
}
30+
return nil
31+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package middlewares
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/aws/aws-sdk-go/aws/awsutil"
8+
"github.com/cloudskiff/driftctl/pkg/resource"
9+
"github.com/r3labs/diff/v2"
10+
)
11+
12+
func TestTagsAllManager_Execute(t *testing.T) {
13+
tests := []struct {
14+
name string
15+
remoteResources *[]resource.Resource
16+
resourcesFromState *[]resource.Resource
17+
wantErr bool
18+
}{
19+
{
20+
name: "With multiple resources that are tags_all compatible",
21+
remoteResources: &[]resource.Resource{
22+
&resource.AbstractResource{
23+
Id: "dummy-instance",
24+
Type: "aws_instance",
25+
Attrs: &resource.Attributes{
26+
"tags": map[string]interface{}{
27+
"Name": "toto",
28+
"Terraform": "true",
29+
},
30+
"tags_all": map[string]interface{}{
31+
"Name": "toto",
32+
"Terraform": "true",
33+
},
34+
},
35+
},
36+
&resource.AbstractResource{
37+
Id: "dummy-ebs-volume",
38+
Type: "aws_ebs_volume",
39+
Attrs: &resource.Attributes{
40+
"tags": map[string]interface{}{
41+
"Name": "tata",
42+
"Terraform": "true",
43+
},
44+
"tags_all": map[string]interface{}{
45+
"Name": "tata",
46+
"Terraform": "true",
47+
},
48+
},
49+
},
50+
},
51+
resourcesFromState: &[]resource.Resource{
52+
&resource.AbstractResource{
53+
Id: "dummy-instance",
54+
Type: "aws_instance",
55+
Attrs: &resource.Attributes{
56+
"tags": map[string]interface{}{
57+
"Name": "toto",
58+
},
59+
"tags_all": map[string]interface{}{
60+
"Name": "toto",
61+
"Terraform": "true",
62+
},
63+
},
64+
},
65+
&resource.AbstractResource{
66+
Id: "dummy-ebs-volume",
67+
Type: "aws_ebs_volume",
68+
Attrs: &resource.Attributes{
69+
"tags": map[string]interface{}{
70+
"Name": "tata",
71+
},
72+
"tags_all": map[string]interface{}{
73+
"Name": "tata",
74+
"Terraform": "true",
75+
},
76+
},
77+
},
78+
},
79+
},
80+
}
81+
for _, tt := range tests {
82+
t.Run(tt.name, func(t *testing.T) {
83+
a := NewTagsAllManager()
84+
if err := a.Execute(tt.remoteResources, tt.resourcesFromState); (err != nil) != tt.wantErr {
85+
t.Errorf("Execute() error = %v, wantErr %v", err, tt.wantErr)
86+
}
87+
changelog, err := diff.Diff(tt.resourcesFromState, tt.remoteResources)
88+
if err != nil {
89+
t.Error(err)
90+
}
91+
if len(changelog) > 0 {
92+
for _, change := range changelog {
93+
t.Errorf("%s got = %v, want %v", strings.Join(change.Path, "."), awsutil.Prettify(change.From), awsutil.Prettify(change.To))
94+
}
95+
}
96+
})
97+
}
98+
}

0 commit comments

Comments
 (0)