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