github.com/nbering/terraform@v0.8.5-0.20170113232247-453f670684b5/terraform/context_import_test.go (about) 1 package terraform 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 ) 8 9 func TestContextImport_basic(t *testing.T) { 10 p := testProvider("aws") 11 ctx := testContext2(t, &ContextOpts{ 12 Providers: map[string]ResourceProviderFactory{ 13 "aws": testProviderFuncFixed(p), 14 }, 15 }) 16 17 p.ImportStateReturn = []*InstanceState{ 18 &InstanceState{ 19 ID: "foo", 20 Ephemeral: EphemeralState{Type: "aws_instance"}, 21 }, 22 } 23 24 state, err := ctx.Import(&ImportOpts{ 25 Targets: []*ImportTarget{ 26 &ImportTarget{ 27 Addr: "aws_instance.foo", 28 ID: "bar", 29 }, 30 }, 31 }) 32 if err != nil { 33 t.Fatalf("err: %s", err) 34 } 35 actual := strings.TrimSpace(state.String()) 36 expected := strings.TrimSpace(testImportStr) 37 if actual != expected { 38 t.Fatalf("bad: \n%s", actual) 39 } 40 } 41 42 func TestContextImport_countIndex(t *testing.T) { 43 p := testProvider("aws") 44 ctx := testContext2(t, &ContextOpts{ 45 Providers: map[string]ResourceProviderFactory{ 46 "aws": testProviderFuncFixed(p), 47 }, 48 }) 49 50 p.ImportStateReturn = []*InstanceState{ 51 &InstanceState{ 52 ID: "foo", 53 Ephemeral: EphemeralState{Type: "aws_instance"}, 54 }, 55 } 56 57 state, err := ctx.Import(&ImportOpts{ 58 Targets: []*ImportTarget{ 59 &ImportTarget{ 60 Addr: "aws_instance.foo[0]", 61 ID: "bar", 62 }, 63 }, 64 }) 65 if err != nil { 66 t.Fatalf("err: %s", err) 67 } 68 69 actual := strings.TrimSpace(state.String()) 70 expected := strings.TrimSpace(testImportCountIndexStr) 71 if actual != expected { 72 t.Fatalf("bad: \n%s", actual) 73 } 74 } 75 76 func TestContextImport_collision(t *testing.T) { 77 p := testProvider("aws") 78 ctx := testContext2(t, &ContextOpts{ 79 Providers: map[string]ResourceProviderFactory{ 80 "aws": testProviderFuncFixed(p), 81 }, 82 83 State: &State{ 84 Modules: []*ModuleState{ 85 &ModuleState{ 86 Path: []string{"root"}, 87 Resources: map[string]*ResourceState{ 88 "aws_instance.foo": &ResourceState{ 89 Type: "aws_instance", 90 Primary: &InstanceState{ 91 ID: "bar", 92 }, 93 }, 94 }, 95 }, 96 }, 97 }, 98 }) 99 100 p.ImportStateReturn = []*InstanceState{ 101 &InstanceState{ 102 ID: "foo", 103 Ephemeral: EphemeralState{Type: "aws_instance"}, 104 }, 105 } 106 107 state, err := ctx.Import(&ImportOpts{ 108 Targets: []*ImportTarget{ 109 &ImportTarget{ 110 Addr: "aws_instance.foo", 111 ID: "bar", 112 }, 113 }, 114 }) 115 if err == nil { 116 t.Fatalf("err: %s", err) 117 } 118 119 actual := strings.TrimSpace(state.String()) 120 expected := strings.TrimSpace(testImportCollisionStr) 121 if actual != expected { 122 t.Fatalf("bad: \n%s", actual) 123 } 124 } 125 126 func TestContextImport_missingType(t *testing.T) { 127 p := testProvider("aws") 128 ctx := testContext2(t, &ContextOpts{ 129 Providers: map[string]ResourceProviderFactory{ 130 "aws": testProviderFuncFixed(p), 131 }, 132 }) 133 134 p.ImportStateReturn = []*InstanceState{ 135 &InstanceState{ 136 ID: "foo", 137 }, 138 } 139 140 state, err := ctx.Import(&ImportOpts{ 141 Targets: []*ImportTarget{ 142 &ImportTarget{ 143 Addr: "aws_instance.foo", 144 ID: "bar", 145 }, 146 }, 147 }) 148 if err == nil { 149 t.Fatal("should error") 150 } 151 152 actual := strings.TrimSpace(state.String()) 153 expected := "<no state>" 154 if actual != expected { 155 t.Fatalf("bad: \n%s", actual) 156 } 157 } 158 159 func TestContextImport_moduleProvider(t *testing.T) { 160 p := testProvider("aws") 161 ctx := testContext2(t, &ContextOpts{ 162 Providers: map[string]ResourceProviderFactory{ 163 "aws": testProviderFuncFixed(p), 164 }, 165 }) 166 167 p.ImportStateReturn = []*InstanceState{ 168 &InstanceState{ 169 ID: "foo", 170 Ephemeral: EphemeralState{Type: "aws_instance"}, 171 }, 172 } 173 174 configured := false 175 p.ConfigureFn = func(c *ResourceConfig) error { 176 configured = true 177 178 if v, ok := c.Get("foo"); !ok || v.(string) != "bar" { 179 return fmt.Errorf("bad") 180 } 181 182 return nil 183 } 184 185 m := testModule(t, "import-provider") 186 187 state, err := ctx.Import(&ImportOpts{ 188 Module: m, 189 Targets: []*ImportTarget{ 190 &ImportTarget{ 191 Addr: "aws_instance.foo", 192 ID: "bar", 193 }, 194 }, 195 }) 196 if err != nil { 197 t.Fatalf("err: %s", err) 198 } 199 200 if !configured { 201 t.Fatal("didn't configure provider") 202 } 203 204 actual := strings.TrimSpace(state.String()) 205 expected := strings.TrimSpace(testImportStr) 206 if actual != expected { 207 t.Fatalf("bad: \n%s", actual) 208 } 209 } 210 211 // Test that import will interpolate provider configuration and use 212 // that configuration for import. 213 func TestContextImport_providerVarConfig(t *testing.T) { 214 p := testProvider("aws") 215 ctx := testContext2(t, &ContextOpts{ 216 Module: testModule(t, "import-provider-vars"), 217 Providers: map[string]ResourceProviderFactory{ 218 "aws": testProviderFuncFixed(p), 219 }, 220 Variables: map[string]interface{}{ 221 "foo": "bar", 222 }, 223 }) 224 225 configured := false 226 p.ConfigureFn = func(c *ResourceConfig) error { 227 configured = true 228 229 if v, ok := c.Get("foo"); !ok || v.(string) != "bar" { 230 return fmt.Errorf("bad value: %#v", v) 231 } 232 233 return nil 234 } 235 236 p.ImportStateReturn = []*InstanceState{ 237 &InstanceState{ 238 ID: "foo", 239 Ephemeral: EphemeralState{Type: "aws_instance"}, 240 }, 241 } 242 243 state, err := ctx.Import(&ImportOpts{ 244 Targets: []*ImportTarget{ 245 &ImportTarget{ 246 Addr: "aws_instance.foo", 247 ID: "bar", 248 }, 249 }, 250 }) 251 if err != nil { 252 t.Fatalf("err: %s", err) 253 } 254 255 if !configured { 256 t.Fatal("didn't configure provider") 257 } 258 259 actual := strings.TrimSpace(state.String()) 260 expected := strings.TrimSpace(testImportStr) 261 if actual != expected { 262 t.Fatalf("bad: \n%s", actual) 263 } 264 } 265 266 // Test that provider configs can't reference resources. 267 func TestContextImport_providerNonVarConfig(t *testing.T) { 268 p := testProvider("aws") 269 ctx := testContext2(t, &ContextOpts{ 270 Module: testModule(t, "import-provider-non-vars"), 271 Providers: map[string]ResourceProviderFactory{ 272 "aws": testProviderFuncFixed(p), 273 }, 274 }) 275 276 p.ImportStateReturn = []*InstanceState{ 277 &InstanceState{ 278 ID: "foo", 279 Ephemeral: EphemeralState{Type: "aws_instance"}, 280 }, 281 } 282 283 _, err := ctx.Import(&ImportOpts{ 284 Targets: []*ImportTarget{ 285 &ImportTarget{ 286 Addr: "aws_instance.foo", 287 ID: "bar", 288 }, 289 }, 290 }) 291 if err == nil { 292 t.Fatal("should error") 293 } 294 } 295 296 func TestContextImport_refresh(t *testing.T) { 297 p := testProvider("aws") 298 ctx := testContext2(t, &ContextOpts{ 299 Providers: map[string]ResourceProviderFactory{ 300 "aws": testProviderFuncFixed(p), 301 }, 302 }) 303 304 p.ImportStateReturn = []*InstanceState{ 305 &InstanceState{ 306 ID: "foo", 307 Ephemeral: EphemeralState{Type: "aws_instance"}, 308 }, 309 } 310 311 p.RefreshFn = func(info *InstanceInfo, s *InstanceState) (*InstanceState, error) { 312 return &InstanceState{ 313 ID: "foo", 314 Attributes: map[string]string{"foo": "bar"}, 315 }, nil 316 } 317 318 state, err := ctx.Import(&ImportOpts{ 319 Targets: []*ImportTarget{ 320 &ImportTarget{ 321 Addr: "aws_instance.foo", 322 ID: "bar", 323 }, 324 }, 325 }) 326 if err != nil { 327 t.Fatalf("err: %s", err) 328 } 329 330 actual := strings.TrimSpace(state.String()) 331 expected := strings.TrimSpace(testImportRefreshStr) 332 if actual != expected { 333 t.Fatalf("bad: \n%s", actual) 334 } 335 } 336 337 func TestContextImport_refreshNil(t *testing.T) { 338 p := testProvider("aws") 339 ctx := testContext2(t, &ContextOpts{ 340 Providers: map[string]ResourceProviderFactory{ 341 "aws": testProviderFuncFixed(p), 342 }, 343 }) 344 345 p.ImportStateReturn = []*InstanceState{ 346 &InstanceState{ 347 ID: "foo", 348 Ephemeral: EphemeralState{Type: "aws_instance"}, 349 }, 350 } 351 352 p.RefreshFn = func(info *InstanceInfo, s *InstanceState) (*InstanceState, error) { 353 return nil, nil 354 } 355 356 state, err := ctx.Import(&ImportOpts{ 357 Targets: []*ImportTarget{ 358 &ImportTarget{ 359 Addr: "aws_instance.foo", 360 ID: "bar", 361 }, 362 }, 363 }) 364 if err == nil { 365 t.Fatal("should error") 366 } 367 368 actual := strings.TrimSpace(state.String()) 369 expected := "<no state>" 370 if actual != expected { 371 t.Fatalf("bad: \n%s", actual) 372 } 373 } 374 375 func TestContextImport_module(t *testing.T) { 376 p := testProvider("aws") 377 ctx := testContext2(t, &ContextOpts{ 378 Providers: map[string]ResourceProviderFactory{ 379 "aws": testProviderFuncFixed(p), 380 }, 381 }) 382 383 p.ImportStateReturn = []*InstanceState{ 384 &InstanceState{ 385 ID: "foo", 386 Ephemeral: EphemeralState{Type: "aws_instance"}, 387 }, 388 } 389 390 state, err := ctx.Import(&ImportOpts{ 391 Targets: []*ImportTarget{ 392 &ImportTarget{ 393 Addr: "module.foo.aws_instance.foo", 394 ID: "bar", 395 }, 396 }, 397 }) 398 if err != nil { 399 t.Fatalf("err: %s", err) 400 } 401 402 actual := strings.TrimSpace(state.String()) 403 expected := strings.TrimSpace(testImportModuleStr) 404 if actual != expected { 405 t.Fatalf("bad: \n%s", actual) 406 } 407 } 408 409 func TestContextImport_moduleDepth2(t *testing.T) { 410 p := testProvider("aws") 411 ctx := testContext2(t, &ContextOpts{ 412 Providers: map[string]ResourceProviderFactory{ 413 "aws": testProviderFuncFixed(p), 414 }, 415 }) 416 417 p.ImportStateReturn = []*InstanceState{ 418 &InstanceState{ 419 ID: "foo", 420 Ephemeral: EphemeralState{Type: "aws_instance"}, 421 }, 422 } 423 424 state, err := ctx.Import(&ImportOpts{ 425 Targets: []*ImportTarget{ 426 &ImportTarget{ 427 Addr: "module.a.module.b.aws_instance.foo", 428 ID: "bar", 429 }, 430 }, 431 }) 432 if err != nil { 433 t.Fatalf("err: %s", err) 434 } 435 436 actual := strings.TrimSpace(state.String()) 437 expected := strings.TrimSpace(testImportModuleDepth2Str) 438 if actual != expected { 439 t.Fatalf("bad: \n%s", actual) 440 } 441 } 442 443 func TestContextImport_moduleDiff(t *testing.T) { 444 p := testProvider("aws") 445 ctx := testContext2(t, &ContextOpts{ 446 Providers: map[string]ResourceProviderFactory{ 447 "aws": testProviderFuncFixed(p), 448 }, 449 450 State: &State{ 451 Modules: []*ModuleState{ 452 &ModuleState{ 453 Path: []string{"root", "bar"}, 454 Resources: map[string]*ResourceState{ 455 "aws_instance.bar": &ResourceState{ 456 Type: "aws_instance", 457 Primary: &InstanceState{ 458 ID: "bar", 459 }, 460 }, 461 }, 462 }, 463 }, 464 }, 465 }) 466 467 p.ImportStateReturn = []*InstanceState{ 468 &InstanceState{ 469 ID: "foo", 470 Ephemeral: EphemeralState{Type: "aws_instance"}, 471 }, 472 } 473 474 state, err := ctx.Import(&ImportOpts{ 475 Targets: []*ImportTarget{ 476 &ImportTarget{ 477 Addr: "module.foo.aws_instance.foo", 478 ID: "bar", 479 }, 480 }, 481 }) 482 if err != nil { 483 t.Fatalf("err: %s", err) 484 } 485 486 actual := strings.TrimSpace(state.String()) 487 expected := strings.TrimSpace(testImportModuleDiffStr) 488 if actual != expected { 489 t.Fatalf("bad: \n%s", actual) 490 } 491 } 492 493 func TestContextImport_moduleExisting(t *testing.T) { 494 p := testProvider("aws") 495 ctx := testContext2(t, &ContextOpts{ 496 Providers: map[string]ResourceProviderFactory{ 497 "aws": testProviderFuncFixed(p), 498 }, 499 500 State: &State{ 501 Modules: []*ModuleState{ 502 &ModuleState{ 503 Path: []string{"root", "foo"}, 504 Resources: map[string]*ResourceState{ 505 "aws_instance.bar": &ResourceState{ 506 Type: "aws_instance", 507 Primary: &InstanceState{ 508 ID: "bar", 509 }, 510 }, 511 }, 512 }, 513 }, 514 }, 515 }) 516 517 p.ImportStateReturn = []*InstanceState{ 518 &InstanceState{ 519 ID: "foo", 520 Ephemeral: EphemeralState{Type: "aws_instance"}, 521 }, 522 } 523 524 state, err := ctx.Import(&ImportOpts{ 525 Targets: []*ImportTarget{ 526 &ImportTarget{ 527 Addr: "module.foo.aws_instance.foo", 528 ID: "bar", 529 }, 530 }, 531 }) 532 if err != nil { 533 t.Fatalf("err: %s", err) 534 } 535 536 actual := strings.TrimSpace(state.String()) 537 expected := strings.TrimSpace(testImportModuleExistingStr) 538 if actual != expected { 539 t.Fatalf("bad: \n%s", actual) 540 } 541 } 542 543 func TestContextImport_multiState(t *testing.T) { 544 p := testProvider("aws") 545 ctx := testContext2(t, &ContextOpts{ 546 Providers: map[string]ResourceProviderFactory{ 547 "aws": testProviderFuncFixed(p), 548 }, 549 }) 550 551 p.ImportStateReturn = []*InstanceState{ 552 &InstanceState{ 553 ID: "foo", 554 Ephemeral: EphemeralState{Type: "aws_instance"}, 555 }, 556 &InstanceState{ 557 ID: "bar", 558 Ephemeral: EphemeralState{Type: "aws_instance_thing"}, 559 }, 560 } 561 562 state, err := ctx.Import(&ImportOpts{ 563 Targets: []*ImportTarget{ 564 &ImportTarget{ 565 Addr: "aws_instance.foo", 566 ID: "bar", 567 }, 568 }, 569 }) 570 if err != nil { 571 t.Fatalf("err: %s", err) 572 } 573 574 actual := strings.TrimSpace(state.String()) 575 expected := strings.TrimSpace(testImportMultiStr) 576 if actual != expected { 577 t.Fatalf("bad: \n%s", actual) 578 } 579 } 580 581 func TestContextImport_multiStateSame(t *testing.T) { 582 p := testProvider("aws") 583 ctx := testContext2(t, &ContextOpts{ 584 Providers: map[string]ResourceProviderFactory{ 585 "aws": testProviderFuncFixed(p), 586 }, 587 }) 588 589 p.ImportStateReturn = []*InstanceState{ 590 &InstanceState{ 591 ID: "foo", 592 Ephemeral: EphemeralState{Type: "aws_instance"}, 593 }, 594 &InstanceState{ 595 ID: "bar", 596 Ephemeral: EphemeralState{Type: "aws_instance_thing"}, 597 }, 598 &InstanceState{ 599 ID: "qux", 600 Ephemeral: EphemeralState{Type: "aws_instance_thing"}, 601 }, 602 } 603 604 state, err := ctx.Import(&ImportOpts{ 605 Targets: []*ImportTarget{ 606 &ImportTarget{ 607 Addr: "aws_instance.foo", 608 ID: "bar", 609 }, 610 }, 611 }) 612 if err != nil { 613 t.Fatalf("err: %s", err) 614 } 615 616 actual := strings.TrimSpace(state.String()) 617 expected := strings.TrimSpace(testImportMultiSameStr) 618 if actual != expected { 619 t.Fatalf("bad: \n%s", actual) 620 } 621 } 622 623 func TestContextImport_customProvider(t *testing.T) { 624 p := testProvider("aws") 625 ctx := testContext2(t, &ContextOpts{ 626 Providers: map[string]ResourceProviderFactory{ 627 "aws": testProviderFuncFixed(p), 628 }, 629 }) 630 631 p.ImportStateReturn = []*InstanceState{ 632 &InstanceState{ 633 ID: "foo", 634 Ephemeral: EphemeralState{Type: "aws_instance"}, 635 }, 636 } 637 638 state, err := ctx.Import(&ImportOpts{ 639 Targets: []*ImportTarget{ 640 &ImportTarget{ 641 Addr: "aws_instance.foo", 642 ID: "bar", 643 Provider: "aws.alias", 644 }, 645 }, 646 }) 647 if err != nil { 648 t.Fatalf("err: %s", err) 649 } 650 651 actual := strings.TrimSpace(state.String()) 652 expected := strings.TrimSpace(testImportCustomProviderStr) 653 if actual != expected { 654 t.Fatalf("bad: \n%s", actual) 655 } 656 } 657 658 const testImportStr = ` 659 aws_instance.foo: 660 ID = foo 661 provider = aws 662 ` 663 664 const testImportCountIndexStr = ` 665 aws_instance.foo.0: 666 ID = foo 667 provider = aws 668 ` 669 670 const testImportCollisionStr = ` 671 aws_instance.foo: 672 ID = bar 673 ` 674 675 const testImportModuleStr = ` 676 <no state> 677 module.foo: 678 aws_instance.foo: 679 ID = foo 680 provider = aws 681 ` 682 683 const testImportModuleDepth2Str = ` 684 <no state> 685 module.a.b: 686 aws_instance.foo: 687 ID = foo 688 provider = aws 689 ` 690 691 const testImportModuleDiffStr = ` 692 module.bar: 693 aws_instance.bar: 694 ID = bar 695 module.foo: 696 aws_instance.foo: 697 ID = foo 698 provider = aws 699 ` 700 701 const testImportModuleExistingStr = ` 702 module.foo: 703 aws_instance.bar: 704 ID = bar 705 aws_instance.foo: 706 ID = foo 707 provider = aws 708 ` 709 710 const testImportMultiStr = ` 711 aws_instance.foo: 712 ID = foo 713 provider = aws 714 aws_instance_thing.foo: 715 ID = bar 716 provider = aws 717 ` 718 719 const testImportMultiSameStr = ` 720 aws_instance.foo: 721 ID = foo 722 provider = aws 723 aws_instance_thing.foo: 724 ID = bar 725 provider = aws 726 aws_instance_thing.foo-1: 727 ID = qux 728 provider = aws 729 ` 730 731 const testImportRefreshStr = ` 732 aws_instance.foo: 733 ID = foo 734 provider = aws 735 foo = bar 736 ` 737 738 const testImportCustomProviderStr = ` 739 aws_instance.foo: 740 ID = foo 741 provider = aws.alias 742 `