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