github.com/nov1n/terraform@v0.7.9-0.20161103151050-bf6852f38e28/builtin/providers/google/resource_compute_instance_test.go (about) 1 package google 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/hashicorp/terraform/helper/acctest" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 "google.golang.org/api/compute/v1" 12 ) 13 14 func TestAccComputeInstance_basic_deprecated_network(t *testing.T) { 15 var instance compute.Instance 16 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 17 18 resource.Test(t, resource.TestCase{ 19 PreCheck: func() { testAccPreCheck(t) }, 20 Providers: testAccProviders, 21 CheckDestroy: testAccCheckComputeInstanceDestroy, 22 Steps: []resource.TestStep{ 23 resource.TestStep{ 24 Config: testAccComputeInstance_basic_deprecated_network(instanceName), 25 Check: resource.ComposeTestCheckFunc( 26 testAccCheckComputeInstanceExists( 27 "google_compute_instance.foobar", &instance), 28 testAccCheckComputeInstanceTag(&instance, "foo"), 29 testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"), 30 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 31 ), 32 }, 33 }, 34 }) 35 } 36 37 func TestAccComputeInstance_basic1(t *testing.T) { 38 var instance compute.Instance 39 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 40 41 resource.Test(t, resource.TestCase{ 42 PreCheck: func() { testAccPreCheck(t) }, 43 Providers: testAccProviders, 44 CheckDestroy: testAccCheckComputeInstanceDestroy, 45 Steps: []resource.TestStep{ 46 resource.TestStep{ 47 Config: testAccComputeInstance_basic(instanceName), 48 Check: resource.ComposeTestCheckFunc( 49 testAccCheckComputeInstanceExists( 50 "google_compute_instance.foobar", &instance), 51 testAccCheckComputeInstanceTag(&instance, "foo"), 52 testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"), 53 testAccCheckComputeInstanceMetadata(&instance, "baz", "qux"), 54 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 55 ), 56 }, 57 }, 58 }) 59 } 60 61 func TestAccComputeInstance_basic2(t *testing.T) { 62 var instance compute.Instance 63 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 64 65 resource.Test(t, resource.TestCase{ 66 PreCheck: func() { testAccPreCheck(t) }, 67 Providers: testAccProviders, 68 CheckDestroy: testAccCheckComputeInstanceDestroy, 69 Steps: []resource.TestStep{ 70 resource.TestStep{ 71 Config: testAccComputeInstance_basic2(instanceName), 72 Check: resource.ComposeTestCheckFunc( 73 testAccCheckComputeInstanceExists( 74 "google_compute_instance.foobar", &instance), 75 testAccCheckComputeInstanceTag(&instance, "foo"), 76 testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"), 77 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 78 ), 79 }, 80 }, 81 }) 82 } 83 84 func TestAccComputeInstance_basic3(t *testing.T) { 85 var instance compute.Instance 86 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 87 88 resource.Test(t, resource.TestCase{ 89 PreCheck: func() { testAccPreCheck(t) }, 90 Providers: testAccProviders, 91 CheckDestroy: testAccCheckComputeInstanceDestroy, 92 Steps: []resource.TestStep{ 93 resource.TestStep{ 94 Config: testAccComputeInstance_basic3(instanceName), 95 Check: resource.ComposeTestCheckFunc( 96 testAccCheckComputeInstanceExists( 97 "google_compute_instance.foobar", &instance), 98 testAccCheckComputeInstanceTag(&instance, "foo"), 99 testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"), 100 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 101 ), 102 }, 103 }, 104 }) 105 } 106 107 func TestAccComputeInstance_basic4(t *testing.T) { 108 var instance compute.Instance 109 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 110 111 resource.Test(t, resource.TestCase{ 112 PreCheck: func() { testAccPreCheck(t) }, 113 Providers: testAccProviders, 114 CheckDestroy: testAccCheckComputeInstanceDestroy, 115 Steps: []resource.TestStep{ 116 resource.TestStep{ 117 Config: testAccComputeInstance_basic4(instanceName), 118 Check: resource.ComposeTestCheckFunc( 119 testAccCheckComputeInstanceExists( 120 "google_compute_instance.foobar", &instance), 121 testAccCheckComputeInstanceTag(&instance, "foo"), 122 testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"), 123 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 124 ), 125 }, 126 }, 127 }) 128 } 129 130 func TestAccComputeInstance_basic5(t *testing.T) { 131 var instance compute.Instance 132 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 133 134 resource.Test(t, resource.TestCase{ 135 PreCheck: func() { testAccPreCheck(t) }, 136 Providers: testAccProviders, 137 CheckDestroy: testAccCheckComputeInstanceDestroy, 138 Steps: []resource.TestStep{ 139 resource.TestStep{ 140 Config: testAccComputeInstance_basic5(instanceName), 141 Check: resource.ComposeTestCheckFunc( 142 testAccCheckComputeInstanceExists( 143 "google_compute_instance.foobar", &instance), 144 testAccCheckComputeInstanceTag(&instance, "foo"), 145 testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"), 146 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 147 ), 148 }, 149 }, 150 }) 151 } 152 153 func TestAccComputeInstance_IP(t *testing.T) { 154 var instance compute.Instance 155 var ipName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 156 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 157 158 resource.Test(t, resource.TestCase{ 159 PreCheck: func() { testAccPreCheck(t) }, 160 Providers: testAccProviders, 161 CheckDestroy: testAccCheckComputeInstanceDestroy, 162 Steps: []resource.TestStep{ 163 resource.TestStep{ 164 Config: testAccComputeInstance_ip(ipName, instanceName), 165 Check: resource.ComposeTestCheckFunc( 166 testAccCheckComputeInstanceExists( 167 "google_compute_instance.foobar", &instance), 168 testAccCheckComputeInstanceAccessConfigHasIP(&instance), 169 ), 170 }, 171 }, 172 }) 173 } 174 175 func TestAccComputeInstance_disksWithoutAutodelete(t *testing.T) { 176 var instance compute.Instance 177 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 178 var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10)) 179 180 resource.Test(t, resource.TestCase{ 181 PreCheck: func() { testAccPreCheck(t) }, 182 Providers: testAccProviders, 183 CheckDestroy: testAccCheckComputeInstanceDestroy, 184 Steps: []resource.TestStep{ 185 resource.TestStep{ 186 Config: testAccComputeInstance_disks(diskName, instanceName, false), 187 Check: resource.ComposeTestCheckFunc( 188 testAccCheckComputeInstanceExists( 189 "google_compute_instance.foobar", &instance), 190 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 191 testAccCheckComputeInstanceDisk(&instance, diskName, false, false), 192 ), 193 }, 194 }, 195 }) 196 } 197 198 func TestAccComputeInstance_disksWithAutodelete(t *testing.T) { 199 var instance compute.Instance 200 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 201 var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10)) 202 203 resource.Test(t, resource.TestCase{ 204 PreCheck: func() { testAccPreCheck(t) }, 205 Providers: testAccProviders, 206 CheckDestroy: testAccCheckComputeInstanceDestroy, 207 Steps: []resource.TestStep{ 208 resource.TestStep{ 209 Config: testAccComputeInstance_disks(diskName, instanceName, true), 210 Check: resource.ComposeTestCheckFunc( 211 testAccCheckComputeInstanceExists( 212 "google_compute_instance.foobar", &instance), 213 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 214 testAccCheckComputeInstanceDisk(&instance, diskName, true, false), 215 ), 216 }, 217 }, 218 }) 219 } 220 221 func TestAccComputeInstance_local_ssd(t *testing.T) { 222 var instance compute.Instance 223 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 224 225 resource.Test(t, resource.TestCase{ 226 PreCheck: func() { testAccPreCheck(t) }, 227 Providers: testAccProviders, 228 CheckDestroy: testAccCheckComputeInstanceDestroy, 229 Steps: []resource.TestStep{ 230 resource.TestStep{ 231 Config: testAccComputeInstance_local_ssd(instanceName), 232 Check: resource.ComposeTestCheckFunc( 233 testAccCheckComputeInstanceExists( 234 "google_compute_instance.local-ssd", &instance), 235 testAccCheckComputeInstanceDisk(&instance, instanceName, true, true), 236 ), 237 }, 238 }, 239 }) 240 } 241 242 func TestAccComputeInstance_update_deprecated_network(t *testing.T) { 243 var instance compute.Instance 244 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 245 246 resource.Test(t, resource.TestCase{ 247 PreCheck: func() { testAccPreCheck(t) }, 248 Providers: testAccProviders, 249 CheckDestroy: testAccCheckComputeInstanceDestroy, 250 Steps: []resource.TestStep{ 251 resource.TestStep{ 252 Config: testAccComputeInstance_basic_deprecated_network(instanceName), 253 Check: resource.ComposeTestCheckFunc( 254 testAccCheckComputeInstanceExists( 255 "google_compute_instance.foobar", &instance), 256 ), 257 }, 258 resource.TestStep{ 259 Config: testAccComputeInstance_update_deprecated_network(instanceName), 260 Check: resource.ComposeTestCheckFunc( 261 testAccCheckComputeInstanceExists( 262 "google_compute_instance.foobar", &instance), 263 testAccCheckComputeInstanceMetadata( 264 &instance, "bar", "baz"), 265 testAccCheckComputeInstanceTag(&instance, "baz"), 266 ), 267 }, 268 }, 269 }) 270 } 271 272 func TestAccComputeInstance_forceNewAndChangeMetadata(t *testing.T) { 273 var instance compute.Instance 274 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 275 276 resource.Test(t, resource.TestCase{ 277 PreCheck: func() { testAccPreCheck(t) }, 278 Providers: testAccProviders, 279 CheckDestroy: testAccCheckComputeInstanceDestroy, 280 Steps: []resource.TestStep{ 281 resource.TestStep{ 282 Config: testAccComputeInstance_basic(instanceName), 283 Check: resource.ComposeTestCheckFunc( 284 testAccCheckComputeInstanceExists( 285 "google_compute_instance.foobar", &instance), 286 ), 287 }, 288 resource.TestStep{ 289 Config: testAccComputeInstance_forceNewAndChangeMetadata(instanceName), 290 Check: resource.ComposeTestCheckFunc( 291 testAccCheckComputeInstanceExists( 292 "google_compute_instance.foobar", &instance), 293 testAccCheckComputeInstanceMetadata( 294 &instance, "qux", "true"), 295 ), 296 }, 297 }, 298 }) 299 } 300 301 func TestAccComputeInstance_update(t *testing.T) { 302 var instance compute.Instance 303 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 304 305 resource.Test(t, resource.TestCase{ 306 PreCheck: func() { testAccPreCheck(t) }, 307 Providers: testAccProviders, 308 CheckDestroy: testAccCheckComputeInstanceDestroy, 309 Steps: []resource.TestStep{ 310 resource.TestStep{ 311 Config: testAccComputeInstance_basic(instanceName), 312 Check: resource.ComposeTestCheckFunc( 313 testAccCheckComputeInstanceExists( 314 "google_compute_instance.foobar", &instance), 315 ), 316 }, 317 resource.TestStep{ 318 Config: testAccComputeInstance_update(instanceName), 319 Check: resource.ComposeTestCheckFunc( 320 testAccCheckComputeInstanceExists( 321 "google_compute_instance.foobar", &instance), 322 testAccCheckComputeInstanceMetadata( 323 &instance, "bar", "baz"), 324 testAccCheckComputeInstanceTag(&instance, "baz"), 325 testAccCheckComputeInstanceAccessConfig(&instance), 326 ), 327 }, 328 }, 329 }) 330 } 331 332 func TestAccComputeInstance_service_account(t *testing.T) { 333 var instance compute.Instance 334 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 335 336 resource.Test(t, resource.TestCase{ 337 PreCheck: func() { testAccPreCheck(t) }, 338 Providers: testAccProviders, 339 CheckDestroy: testAccCheckComputeInstanceDestroy, 340 Steps: []resource.TestStep{ 341 resource.TestStep{ 342 Config: testAccComputeInstance_service_account(instanceName), 343 Check: resource.ComposeTestCheckFunc( 344 testAccCheckComputeInstanceExists( 345 "google_compute_instance.foobar", &instance), 346 testAccCheckComputeInstanceServiceAccount(&instance, 347 "https://www.googleapis.com/auth/compute.readonly"), 348 testAccCheckComputeInstanceServiceAccount(&instance, 349 "https://www.googleapis.com/auth/devstorage.read_only"), 350 testAccCheckComputeInstanceServiceAccount(&instance, 351 "https://www.googleapis.com/auth/userinfo.email"), 352 ), 353 }, 354 }, 355 }) 356 } 357 358 func TestAccComputeInstance_scheduling(t *testing.T) { 359 var instance compute.Instance 360 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 361 362 resource.Test(t, resource.TestCase{ 363 PreCheck: func() { testAccPreCheck(t) }, 364 Providers: testAccProviders, 365 CheckDestroy: testAccCheckComputeInstanceDestroy, 366 Steps: []resource.TestStep{ 367 resource.TestStep{ 368 Config: testAccComputeInstance_scheduling(instanceName), 369 Check: resource.ComposeTestCheckFunc( 370 testAccCheckComputeInstanceExists( 371 "google_compute_instance.foobar", &instance), 372 ), 373 }, 374 }, 375 }) 376 } 377 378 func TestAccComputeInstance_subnet_auto(t *testing.T) { 379 var instance compute.Instance 380 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 381 382 resource.Test(t, resource.TestCase{ 383 PreCheck: func() { testAccPreCheck(t) }, 384 Providers: testAccProviders, 385 CheckDestroy: testAccCheckComputeInstanceDestroy, 386 Steps: []resource.TestStep{ 387 resource.TestStep{ 388 Config: testAccComputeInstance_subnet_auto(instanceName), 389 Check: resource.ComposeTestCheckFunc( 390 testAccCheckComputeInstanceExists( 391 "google_compute_instance.foobar", &instance), 392 testAccCheckComputeInstanceHasSubnet(&instance), 393 ), 394 }, 395 }, 396 }) 397 } 398 399 func TestAccComputeInstance_subnet_custom(t *testing.T) { 400 var instance compute.Instance 401 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 402 403 resource.Test(t, resource.TestCase{ 404 PreCheck: func() { testAccPreCheck(t) }, 405 Providers: testAccProviders, 406 CheckDestroy: testAccCheckComputeInstanceDestroy, 407 Steps: []resource.TestStep{ 408 resource.TestStep{ 409 Config: testAccComputeInstance_subnet_custom(instanceName), 410 Check: resource.ComposeTestCheckFunc( 411 testAccCheckComputeInstanceExists( 412 "google_compute_instance.foobar", &instance), 413 testAccCheckComputeInstanceHasSubnet(&instance), 414 ), 415 }, 416 }, 417 }) 418 } 419 420 func TestAccComputeInstance_address_auto(t *testing.T) { 421 var instance compute.Instance 422 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 423 424 resource.Test(t, resource.TestCase{ 425 PreCheck: func() { testAccPreCheck(t) }, 426 Providers: testAccProviders, 427 CheckDestroy: testAccCheckComputeInstanceDestroy, 428 Steps: []resource.TestStep{ 429 resource.TestStep{ 430 Config: testAccComputeInstance_address_auto(instanceName), 431 Check: resource.ComposeTestCheckFunc( 432 testAccCheckComputeInstanceExists( 433 "google_compute_instance.foobar", &instance), 434 testAccCheckComputeInstanceHasAnyAddress(&instance), 435 ), 436 }, 437 }, 438 }) 439 } 440 441 func TestAccComputeInstance_address_custom(t *testing.T) { 442 var instance compute.Instance 443 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 444 var address = "10.0.200.200" 445 resource.Test(t, resource.TestCase{ 446 PreCheck: func() { testAccPreCheck(t) }, 447 Providers: testAccProviders, 448 CheckDestroy: testAccCheckComputeInstanceDestroy, 449 Steps: []resource.TestStep{ 450 resource.TestStep{ 451 Config: testAccComputeInstance_address_custom(instanceName, address), 452 Check: resource.ComposeTestCheckFunc( 453 testAccCheckComputeInstanceExists( 454 "google_compute_instance.foobar", &instance), 455 testAccCheckComputeInstanceHasAddress(&instance, address), 456 ), 457 }, 458 }, 459 }) 460 } 461 462 func TestAccComputeInstance_private_image_family(t *testing.T) { 463 var instance compute.Instance 464 var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10)) 465 var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10)) 466 var imageName = fmt.Sprintf("instance-testi-%s", acctest.RandString(10)) 467 var familyName = fmt.Sprintf("instance-testf-%s", acctest.RandString(10)) 468 469 resource.Test(t, resource.TestCase{ 470 PreCheck: func() { testAccPreCheck(t) }, 471 Providers: testAccProviders, 472 CheckDestroy: testAccCheckComputeInstanceDestroy, 473 Steps: []resource.TestStep{ 474 resource.TestStep{ 475 Config: testAccComputeInstance_private_image_family(diskName, imageName, familyName, instanceName), 476 Check: resource.ComposeTestCheckFunc( 477 testAccCheckComputeInstanceExists( 478 "google_compute_instance.foobar", &instance), 479 ), 480 }, 481 }, 482 }) 483 } 484 485 func testAccCheckComputeInstanceDestroy(s *terraform.State) error { 486 config := testAccProvider.Meta().(*Config) 487 488 for _, rs := range s.RootModule().Resources { 489 if rs.Type != "google_compute_instance" { 490 continue 491 } 492 493 _, err := config.clientCompute.Instances.Get( 494 config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do() 495 if err == nil { 496 return fmt.Errorf("Instance still exists") 497 } 498 } 499 500 return nil 501 } 502 503 func testAccCheckComputeInstanceExists(n string, instance *compute.Instance) resource.TestCheckFunc { 504 return func(s *terraform.State) error { 505 rs, ok := s.RootModule().Resources[n] 506 if !ok { 507 return fmt.Errorf("Not found: %s", n) 508 } 509 510 if rs.Primary.ID == "" { 511 return fmt.Errorf("No ID is set") 512 } 513 514 config := testAccProvider.Meta().(*Config) 515 516 found, err := config.clientCompute.Instances.Get( 517 config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do() 518 if err != nil { 519 return err 520 } 521 522 if found.Name != rs.Primary.ID { 523 return fmt.Errorf("Instance not found") 524 } 525 526 *instance = *found 527 528 return nil 529 } 530 } 531 532 func testAccCheckComputeInstanceMetadata( 533 instance *compute.Instance, 534 k string, v string) resource.TestCheckFunc { 535 return func(s *terraform.State) error { 536 if instance.Metadata == nil { 537 return fmt.Errorf("no metadata") 538 } 539 540 for _, item := range instance.Metadata.Items { 541 if k != item.Key { 542 continue 543 } 544 545 if item.Value != nil && v == *item.Value { 546 return nil 547 } 548 549 return fmt.Errorf("bad value for %s: %s", k, *item.Value) 550 } 551 552 return fmt.Errorf("metadata not found: %s", k) 553 } 554 } 555 556 func testAccCheckComputeInstanceAccessConfig(instance *compute.Instance) resource.TestCheckFunc { 557 return func(s *terraform.State) error { 558 for _, i := range instance.NetworkInterfaces { 559 if len(i.AccessConfigs) == 0 { 560 return fmt.Errorf("no access_config") 561 } 562 } 563 564 return nil 565 } 566 } 567 568 func testAccCheckComputeInstanceAccessConfigHasIP(instance *compute.Instance) resource.TestCheckFunc { 569 return func(s *terraform.State) error { 570 for _, i := range instance.NetworkInterfaces { 571 for _, c := range i.AccessConfigs { 572 if c.NatIP == "" { 573 return fmt.Errorf("no NAT IP") 574 } 575 } 576 } 577 578 return nil 579 } 580 } 581 582 func testAccCheckComputeInstanceDisk(instance *compute.Instance, source string, delete bool, boot bool) resource.TestCheckFunc { 583 return func(s *terraform.State) error { 584 if instance.Disks == nil { 585 return fmt.Errorf("no disks") 586 } 587 588 for _, disk := range instance.Disks { 589 if strings.LastIndex(disk.Source, "/"+source) == len(disk.Source)-len(source)-1 && disk.AutoDelete == delete && disk.Boot == boot { 590 return nil 591 } 592 } 593 594 return fmt.Errorf("Disk not found: %s", source) 595 } 596 } 597 598 func testAccCheckComputeInstanceTag(instance *compute.Instance, n string) resource.TestCheckFunc { 599 return func(s *terraform.State) error { 600 if instance.Tags == nil { 601 return fmt.Errorf("no tags") 602 } 603 604 for _, k := range instance.Tags.Items { 605 if k == n { 606 return nil 607 } 608 } 609 610 return fmt.Errorf("tag not found: %s", n) 611 } 612 } 613 614 func testAccCheckComputeInstanceServiceAccount(instance *compute.Instance, scope string) resource.TestCheckFunc { 615 return func(s *terraform.State) error { 616 if count := len(instance.ServiceAccounts); count != 1 { 617 return fmt.Errorf("Wrong number of ServiceAccounts: expected 1, got %d", count) 618 } 619 620 for _, val := range instance.ServiceAccounts[0].Scopes { 621 if val == scope { 622 return nil 623 } 624 } 625 626 return fmt.Errorf("Scope not found: %s", scope) 627 } 628 } 629 630 func testAccCheckComputeInstanceHasSubnet(instance *compute.Instance) resource.TestCheckFunc { 631 return func(s *terraform.State) error { 632 for _, i := range instance.NetworkInterfaces { 633 if i.Subnetwork == "" { 634 return fmt.Errorf("no subnet") 635 } 636 } 637 638 return nil 639 } 640 } 641 642 func testAccCheckComputeInstanceHasAnyAddress(instance *compute.Instance) resource.TestCheckFunc { 643 return func(s *terraform.State) error { 644 for _, i := range instance.NetworkInterfaces { 645 if i.NetworkIP == "" { 646 return fmt.Errorf("no address") 647 } 648 } 649 650 return nil 651 } 652 } 653 654 func testAccCheckComputeInstanceHasAddress(instance *compute.Instance, address string) resource.TestCheckFunc { 655 return func(s *terraform.State) error { 656 for _, i := range instance.NetworkInterfaces { 657 if i.NetworkIP != address { 658 return fmt.Errorf("Wrong address found: expected %v, got %v", address, i.NetworkIP) 659 } 660 } 661 662 return nil 663 } 664 } 665 666 func testAccComputeInstance_basic_deprecated_network(instance string) string { 667 return fmt.Sprintf(` 668 resource "google_compute_instance" "foobar" { 669 name = "%s" 670 machine_type = "n1-standard-1" 671 zone = "us-central1-a" 672 can_ip_forward = false 673 tags = ["foo", "bar"] 674 675 disk { 676 image = "debian-8-jessie-v20160803" 677 } 678 679 network { 680 source = "default" 681 } 682 683 metadata { 684 foo = "bar" 685 } 686 }`, instance) 687 } 688 689 func testAccComputeInstance_update_deprecated_network(instance string) string { 690 return fmt.Sprintf(` 691 resource "google_compute_instance" "foobar" { 692 name = "%s" 693 machine_type = "n1-standard-1" 694 zone = "us-central1-a" 695 tags = ["baz"] 696 697 disk { 698 image = "debian-8-jessie-v20160803" 699 } 700 701 network { 702 source = "default" 703 } 704 705 metadata { 706 bar = "baz" 707 } 708 }`, instance) 709 } 710 711 func testAccComputeInstance_basic(instance string) string { 712 return fmt.Sprintf(` 713 resource "google_compute_instance" "foobar" { 714 name = "%s" 715 machine_type = "n1-standard-1" 716 zone = "us-central1-a" 717 can_ip_forward = false 718 tags = ["foo", "bar"] 719 720 disk { 721 image = "debian-8-jessie-v20160803" 722 } 723 724 network_interface { 725 network = "default" 726 } 727 728 metadata { 729 foo = "bar" 730 baz = "qux" 731 } 732 733 metadata_startup_script = "echo Hello" 734 }`, instance) 735 } 736 737 func testAccComputeInstance_basic2(instance string) string { 738 return fmt.Sprintf(` 739 resource "google_compute_instance" "foobar" { 740 name = "%s" 741 machine_type = "n1-standard-1" 742 zone = "us-central1-a" 743 can_ip_forward = false 744 tags = ["foo", "bar"] 745 746 disk { 747 image = "debian-8" 748 } 749 750 network_interface { 751 network = "default" 752 } 753 754 metadata { 755 foo = "bar" 756 } 757 }`, instance) 758 } 759 760 func testAccComputeInstance_basic3(instance string) string { 761 return fmt.Sprintf(` 762 resource "google_compute_instance" "foobar" { 763 name = "%s" 764 machine_type = "n1-standard-1" 765 zone = "us-central1-a" 766 can_ip_forward = false 767 tags = ["foo", "bar"] 768 769 disk { 770 image = "debian-cloud/debian-8-jessie-v20160803" 771 } 772 773 network_interface { 774 network = "default" 775 } 776 777 778 metadata { 779 foo = "bar" 780 } 781 }`, instance) 782 } 783 784 func testAccComputeInstance_basic4(instance string) string { 785 return fmt.Sprintf(` 786 resource "google_compute_instance" "foobar" { 787 name = "%s" 788 machine_type = "n1-standard-1" 789 zone = "us-central1-a" 790 can_ip_forward = false 791 tags = ["foo", "bar"] 792 793 disk { 794 image = "debian-cloud/debian-8" 795 } 796 797 network_interface { 798 network = "default" 799 } 800 801 802 metadata { 803 foo = "bar" 804 } 805 }`, instance) 806 } 807 808 func testAccComputeInstance_basic5(instance string) string { 809 return fmt.Sprintf(` 810 resource "google_compute_instance" "foobar" { 811 name = "%s" 812 machine_type = "n1-standard-1" 813 zone = "us-central1-a" 814 can_ip_forward = false 815 tags = ["foo", "bar"] 816 817 disk { 818 image = "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20160803" 819 } 820 821 network_interface { 822 network = "default" 823 } 824 825 metadata { 826 foo = "bar" 827 } 828 }`, instance) 829 } 830 831 // Update zone to ForceNew, and change metadata k/v entirely 832 // Generates diff mismatch 833 func testAccComputeInstance_forceNewAndChangeMetadata(instance string) string { 834 return fmt.Sprintf(` 835 resource "google_compute_instance" "foobar" { 836 name = "%s" 837 machine_type = "n1-standard-1" 838 zone = "us-central1-a" 839 zone = "us-central1-b" 840 tags = ["baz"] 841 842 disk { 843 image = "debian-8-jessie-v20160803" 844 } 845 846 network_interface { 847 network = "default" 848 access_config { } 849 } 850 851 metadata { 852 qux = "true" 853 } 854 }`, instance) 855 } 856 857 // Update metadata, tags, and network_interface 858 func testAccComputeInstance_update(instance string) string { 859 return fmt.Sprintf(` 860 resource "google_compute_instance" "foobar" { 861 name = "%s" 862 machine_type = "n1-standard-1" 863 zone = "us-central1-a" 864 tags = ["baz"] 865 866 disk { 867 image = "debian-8-jessie-v20160803" 868 } 869 870 network_interface { 871 network = "default" 872 access_config { } 873 } 874 875 metadata { 876 bar = "baz" 877 } 878 }`, instance) 879 } 880 881 func testAccComputeInstance_ip(ip, instance string) string { 882 return fmt.Sprintf(` 883 resource "google_compute_address" "foo" { 884 name = "%s" 885 } 886 887 resource "google_compute_instance" "foobar" { 888 name = "%s" 889 machine_type = "n1-standard-1" 890 zone = "us-central1-a" 891 tags = ["foo", "bar"] 892 893 disk { 894 image = "debian-8-jessie-v20160803" 895 } 896 897 network_interface { 898 network = "default" 899 access_config { 900 nat_ip = "${google_compute_address.foo.address}" 901 } 902 } 903 904 metadata { 905 foo = "bar" 906 } 907 }`, ip, instance) 908 } 909 910 func testAccComputeInstance_disks(disk, instance string, autodelete bool) string { 911 return fmt.Sprintf(` 912 resource "google_compute_disk" "foobar" { 913 name = "%s" 914 size = 10 915 type = "pd-ssd" 916 zone = "us-central1-a" 917 } 918 919 resource "google_compute_instance" "foobar" { 920 name = "%s" 921 machine_type = "n1-standard-1" 922 zone = "us-central1-a" 923 924 disk { 925 image = "debian-8-jessie-v20160803" 926 } 927 928 disk { 929 disk = "${google_compute_disk.foobar.name}" 930 auto_delete = %v 931 } 932 933 network_interface { 934 network = "default" 935 } 936 937 metadata { 938 foo = "bar" 939 } 940 }`, disk, instance, autodelete) 941 } 942 943 func testAccComputeInstance_local_ssd(instance string) string { 944 return fmt.Sprintf(` 945 resource "google_compute_instance" "local-ssd" { 946 name = "%s" 947 machine_type = "n1-standard-1" 948 zone = "us-central1-a" 949 950 disk { 951 image = "debian-8-jessie-v20160803" 952 } 953 954 disk { 955 type = "local-ssd" 956 scratch = true 957 } 958 959 network_interface { 960 network = "default" 961 } 962 963 }`, instance) 964 } 965 966 func testAccComputeInstance_service_account(instance string) string { 967 return fmt.Sprintf(` 968 resource "google_compute_instance" "foobar" { 969 name = "%s" 970 machine_type = "n1-standard-1" 971 zone = "us-central1-a" 972 973 disk { 974 image = "debian-8-jessie-v20160803" 975 } 976 977 network_interface { 978 network = "default" 979 } 980 981 service_account { 982 scopes = [ 983 "userinfo-email", 984 "compute-ro", 985 "storage-ro", 986 ] 987 } 988 }`, instance) 989 } 990 991 func testAccComputeInstance_scheduling(instance string) string { 992 return fmt.Sprintf(` 993 resource "google_compute_instance" "foobar" { 994 name = "%s" 995 machine_type = "n1-standard-1" 996 zone = "us-central1-a" 997 998 disk { 999 image = "debian-8-jessie-v20160803" 1000 } 1001 1002 network_interface { 1003 network = "default" 1004 } 1005 1006 scheduling { 1007 } 1008 }`, instance) 1009 } 1010 1011 func testAccComputeInstance_subnet_auto(instance string) string { 1012 return fmt.Sprintf(` 1013 resource "google_compute_network" "inst-test-network" { 1014 name = "inst-test-network-%s" 1015 auto_create_subnetworks = true 1016 } 1017 1018 resource "google_compute_instance" "foobar" { 1019 name = "%s" 1020 machine_type = "n1-standard-1" 1021 zone = "us-central1-a" 1022 1023 disk { 1024 image = "debian-8-jessie-v20160803" 1025 } 1026 1027 network_interface { 1028 network = "${google_compute_network.inst-test-network.name}" 1029 access_config { } 1030 } 1031 1032 }`, acctest.RandString(10), instance) 1033 } 1034 1035 func testAccComputeInstance_subnet_custom(instance string) string { 1036 return fmt.Sprintf(` 1037 resource "google_compute_network" "inst-test-network" { 1038 name = "inst-test-network-%s" 1039 auto_create_subnetworks = false 1040 } 1041 1042 resource "google_compute_subnetwork" "inst-test-subnetwork" { 1043 name = "inst-test-subnetwork-%s" 1044 ip_cidr_range = "10.0.0.0/16" 1045 region = "us-central1" 1046 network = "${google_compute_network.inst-test-network.self_link}" 1047 } 1048 1049 resource "google_compute_instance" "foobar" { 1050 name = "%s" 1051 machine_type = "n1-standard-1" 1052 zone = "us-central1-a" 1053 1054 disk { 1055 image = "debian-8-jessie-v20160803" 1056 } 1057 1058 network_interface { 1059 subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}" 1060 access_config { } 1061 } 1062 1063 }`, acctest.RandString(10), acctest.RandString(10), instance) 1064 } 1065 1066 func testAccComputeInstance_address_auto(instance string) string { 1067 return fmt.Sprintf(` 1068 resource "google_compute_network" "inst-test-network" { 1069 name = "inst-test-network-%s" 1070 } 1071 resource "google_compute_subnetwork" "inst-test-subnetwork" { 1072 name = "inst-test-subnetwork-%s" 1073 ip_cidr_range = "10.0.0.0/16" 1074 region = "us-central1" 1075 network = "${google_compute_network.inst-test-network.self_link}" 1076 } 1077 resource "google_compute_instance" "foobar" { 1078 name = "%s" 1079 machine_type = "n1-standard-1" 1080 zone = "us-central1-a" 1081 1082 disk { 1083 image = "debian-8-jessie-v20160803" 1084 } 1085 1086 network_interface { 1087 subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}" 1088 access_config { } 1089 } 1090 1091 }`, acctest.RandString(10), acctest.RandString(10), instance) 1092 } 1093 1094 func testAccComputeInstance_address_custom(instance, address string) string { 1095 return fmt.Sprintf(` 1096 resource "google_compute_network" "inst-test-network" { 1097 name = "inst-test-network-%s" 1098 } 1099 resource "google_compute_subnetwork" "inst-test-subnetwork" { 1100 name = "inst-test-subnetwork-%s" 1101 ip_cidr_range = "10.0.0.0/16" 1102 region = "us-central1" 1103 network = "${google_compute_network.inst-test-network.self_link}" 1104 } 1105 resource "google_compute_instance" "foobar" { 1106 name = "%s" 1107 machine_type = "n1-standard-1" 1108 zone = "us-central1-a" 1109 1110 disk { 1111 image = "debian-8-jessie-v20160803" 1112 } 1113 1114 network_interface { 1115 subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}" 1116 address = "%s" 1117 access_config { } 1118 } 1119 1120 }`, acctest.RandString(10), acctest.RandString(10), instance, address) 1121 } 1122 1123 func testAccComputeInstance_private_image_family(disk, image, family, instance string) string { 1124 return fmt.Sprintf(` 1125 resource "google_compute_disk" "foobar" { 1126 name = "%s" 1127 zone = "us-central1-a" 1128 image = "debian-8-jessie-v20160803" 1129 } 1130 1131 resource "google_compute_image" "foobar" { 1132 name = "%s" 1133 source_disk = "${google_compute_disk.foobar.self_link}" 1134 family = "%s" 1135 } 1136 1137 resource "google_compute_instance" "foobar" { 1138 name = "%s" 1139 machine_type = "n1-standard-1" 1140 zone = "us-central1-a" 1141 1142 disk { 1143 image = "${google_compute_image.foobar.family}" 1144 } 1145 1146 network_interface { 1147 network = "default" 1148 } 1149 1150 metadata { 1151 foo = "bar" 1152 } 1153 }`, disk, image, family, instance) 1154 }