github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/terraform/transform_orphan_count_test.go (about) 1 package terraform 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/hashicorp/terraform/internal/addrs" 8 "github.com/hashicorp/terraform/internal/states" 9 ) 10 11 func TestOrphanResourceCountTransformer(t *testing.T) { 12 state := states.NewState() 13 root := state.RootModule() 14 root.SetResourceInstanceCurrent( 15 mustResourceInstanceAddr("aws_instance.web").Resource, 16 &states.ResourceInstanceObjectSrc{ 17 Status: states.ObjectReady, 18 AttrsJSON: []byte(`{"id":"foo"}`), 19 }, 20 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 21 ) 22 root.SetResourceInstanceCurrent( 23 mustResourceInstanceAddr("aws_instance.foo[0]").Resource, 24 &states.ResourceInstanceObjectSrc{ 25 Status: states.ObjectReady, 26 AttrsJSON: []byte(`{"id":"foo"}`), 27 }, 28 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 29 ) 30 root.SetResourceInstanceCurrent( 31 mustResourceInstanceAddr("aws_instance.foo[2]").Resource, 32 &states.ResourceInstanceObjectSrc{ 33 Status: states.ObjectReady, 34 AttrsJSON: []byte(`{"id":"foo"}`), 35 }, 36 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 37 ) 38 39 g := Graph{Path: addrs.RootModuleInstance} 40 41 { 42 tf := &OrphanResourceInstanceCountTransformer{ 43 Concrete: testOrphanResourceConcreteFunc, 44 Addr: addrs.RootModuleInstance.Resource( 45 addrs.ManagedResourceMode, "aws_instance", "foo", 46 ), 47 InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")}, 48 State: state, 49 } 50 if err := tf.Transform(&g); err != nil { 51 t.Fatalf("err: %s", err) 52 } 53 } 54 55 actual := strings.TrimSpace(g.String()) 56 expected := strings.TrimSpace(testTransformOrphanResourceCountBasicStr) 57 if actual != expected { 58 t.Fatalf("bad:\n\n%s", actual) 59 } 60 } 61 62 func TestOrphanResourceCountTransformer_zero(t *testing.T) { 63 state := states.NewState() 64 root := state.RootModule() 65 root.SetResourceInstanceCurrent( 66 mustResourceInstanceAddr("aws_instance.web").Resource, 67 &states.ResourceInstanceObjectSrc{ 68 Status: states.ObjectReady, 69 AttrsJSON: []byte(`{"id":"foo"}`), 70 }, 71 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 72 ) 73 root.SetResourceInstanceCurrent( 74 mustResourceInstanceAddr("aws_instance.foo[0]").Resource, 75 &states.ResourceInstanceObjectSrc{ 76 Status: states.ObjectReady, 77 AttrsJSON: []byte(`{"id":"foo"}`), 78 }, 79 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 80 ) 81 root.SetResourceInstanceCurrent( 82 mustResourceInstanceAddr("aws_instance.foo[2]").Resource, 83 &states.ResourceInstanceObjectSrc{ 84 Status: states.ObjectReady, 85 AttrsJSON: []byte(`{"id":"foo"}`), 86 }, 87 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 88 ) 89 90 g := Graph{Path: addrs.RootModuleInstance} 91 92 { 93 tf := &OrphanResourceInstanceCountTransformer{ 94 Concrete: testOrphanResourceConcreteFunc, 95 Addr: addrs.RootModuleInstance.Resource( 96 addrs.ManagedResourceMode, "aws_instance", "foo", 97 ), 98 InstanceAddrs: []addrs.AbsResourceInstance{}, 99 State: state, 100 } 101 if err := tf.Transform(&g); err != nil { 102 t.Fatalf("err: %s", err) 103 } 104 } 105 106 actual := strings.TrimSpace(g.String()) 107 expected := strings.TrimSpace(testTransformOrphanResourceCountZeroStr) 108 if actual != expected { 109 t.Fatalf("bad:\n\n%s", actual) 110 } 111 } 112 113 func TestOrphanResourceCountTransformer_oneIndex(t *testing.T) { 114 state := states.NewState() 115 root := state.RootModule() 116 root.SetResourceInstanceCurrent( 117 mustResourceInstanceAddr("aws_instance.web").Resource, 118 &states.ResourceInstanceObjectSrc{ 119 Status: states.ObjectReady, 120 AttrsJSON: []byte(`{"id":"foo"}`), 121 }, 122 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 123 ) 124 root.SetResourceInstanceCurrent( 125 mustResourceInstanceAddr("aws_instance.foo[0]").Resource, 126 &states.ResourceInstanceObjectSrc{ 127 Status: states.ObjectReady, 128 AttrsJSON: []byte(`{"id":"foo"}`), 129 }, 130 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 131 ) 132 root.SetResourceInstanceCurrent( 133 mustResourceInstanceAddr("aws_instance.foo[1]").Resource, 134 &states.ResourceInstanceObjectSrc{ 135 Status: states.ObjectReady, 136 AttrsJSON: []byte(`{"id":"foo"}`), 137 }, 138 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 139 ) 140 141 g := Graph{Path: addrs.RootModuleInstance} 142 143 { 144 tf := &OrphanResourceInstanceCountTransformer{ 145 Concrete: testOrphanResourceConcreteFunc, 146 Addr: addrs.RootModuleInstance.Resource( 147 addrs.ManagedResourceMode, "aws_instance", "foo", 148 ), 149 InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")}, 150 State: state, 151 } 152 if err := tf.Transform(&g); err != nil { 153 t.Fatalf("err: %s", err) 154 } 155 } 156 157 actual := strings.TrimSpace(g.String()) 158 expected := strings.TrimSpace(testTransformOrphanResourceCountOneIndexStr) 159 if actual != expected { 160 t.Fatalf("bad:\n\n%s", actual) 161 } 162 } 163 164 func TestOrphanResourceCountTransformer_deposed(t *testing.T) { 165 state := states.NewState() 166 root := state.RootModule() 167 root.SetResourceInstanceCurrent( 168 mustResourceInstanceAddr("aws_instance.web").Resource, 169 &states.ResourceInstanceObjectSrc{ 170 Status: states.ObjectReady, 171 AttrsJSON: []byte(`{"id":"foo"}`), 172 }, 173 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 174 ) 175 root.SetResourceInstanceCurrent( 176 mustResourceInstanceAddr("aws_instance.foo[0]").Resource, 177 &states.ResourceInstanceObjectSrc{ 178 Status: states.ObjectReady, 179 AttrsJSON: []byte(`{"id":"foo"}`), 180 }, 181 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 182 ) 183 root.SetResourceInstanceCurrent( 184 mustResourceInstanceAddr("aws_instance.foo[1]").Resource, 185 &states.ResourceInstanceObjectSrc{ 186 Status: states.ObjectReady, 187 AttrsJSON: []byte(`{"id":"foo"}`), 188 }, 189 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 190 ) 191 root.SetResourceInstanceDeposed( 192 mustResourceInstanceAddr("aws_instance.foo[2]").Resource, 193 states.NewDeposedKey(), 194 &states.ResourceInstanceObjectSrc{ 195 Status: states.ObjectReady, 196 AttrsJSON: []byte(`{"id":"foo"}`), 197 }, 198 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 199 ) 200 201 g := Graph{Path: addrs.RootModuleInstance} 202 203 { 204 tf := &OrphanResourceInstanceCountTransformer{ 205 Concrete: testOrphanResourceConcreteFunc, 206 Addr: addrs.RootModuleInstance.Resource( 207 addrs.ManagedResourceMode, "aws_instance", "foo", 208 ), 209 InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")}, 210 State: state, 211 } 212 if err := tf.Transform(&g); err != nil { 213 t.Fatalf("err: %s", err) 214 } 215 } 216 217 actual := strings.TrimSpace(g.String()) 218 expected := strings.TrimSpace(testTransformOrphanResourceCountDeposedStr) 219 if actual != expected { 220 t.Fatalf("bad:\n\n%s", actual) 221 } 222 } 223 224 // When converting from a NoEach mode to an EachMap via a switch to for_each, 225 // an edge is necessary to ensure that the map-key'd instances 226 // are evaluated after the NoKey resource, because the final instance evaluated 227 // sets the whole resource's EachMode. 228 func TestOrphanResourceCountTransformer_ForEachEdgesAdded(t *testing.T) { 229 state := states.BuildState(func(s *states.SyncState) { 230 // "bar" key'd resource 231 s.SetResourceInstanceCurrent( 232 addrs.Resource{ 233 Mode: addrs.ManagedResourceMode, 234 Type: "aws_instance", 235 Name: "foo", 236 }.Instance(addrs.StringKey("bar")).Absolute(addrs.RootModuleInstance), 237 &states.ResourceInstanceObjectSrc{ 238 AttrsFlat: map[string]string{ 239 "id": "foo", 240 }, 241 Status: states.ObjectReady, 242 }, 243 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 244 ) 245 246 // NoKey'd resource 247 s.SetResourceInstanceCurrent( 248 addrs.Resource{ 249 Mode: addrs.ManagedResourceMode, 250 Type: "aws_instance", 251 Name: "foo", 252 }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), 253 &states.ResourceInstanceObjectSrc{ 254 AttrsFlat: map[string]string{ 255 "id": "foo", 256 }, 257 Status: states.ObjectReady, 258 }, 259 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 260 ) 261 }) 262 263 g := Graph{Path: addrs.RootModuleInstance} 264 265 { 266 tf := &OrphanResourceInstanceCountTransformer{ 267 Concrete: testOrphanResourceConcreteFunc, 268 Addr: addrs.RootModuleInstance.Resource( 269 addrs.ManagedResourceMode, "aws_instance", "foo", 270 ), 271 InstanceAddrs: []addrs.AbsResourceInstance{}, 272 State: state, 273 } 274 if err := tf.Transform(&g); err != nil { 275 t.Fatalf("err: %s", err) 276 } 277 } 278 279 actual := strings.TrimSpace(g.String()) 280 expected := strings.TrimSpace(testTransformOrphanResourceForEachStr) 281 if actual != expected { 282 t.Fatalf("bad:\n\n%s", actual) 283 } 284 } 285 286 const testTransformOrphanResourceCountBasicStr = ` 287 aws_instance.foo[2] (orphan) 288 ` 289 290 const testTransformOrphanResourceCountZeroStr = ` 291 aws_instance.foo[0] (orphan) 292 aws_instance.foo[2] (orphan) 293 ` 294 295 const testTransformOrphanResourceCountOneIndexStr = ` 296 aws_instance.foo[1] (orphan) 297 ` 298 299 const testTransformOrphanResourceCountDeposedStr = ` 300 aws_instance.foo[1] (orphan) 301 ` 302 303 const testTransformOrphanResourceForEachStr = ` 304 aws_instance.foo (orphan) 305 aws_instance.foo["bar"] (orphan) 306 `