github.com/bfallik/terraform@v0.7.1-0.20160814101525-d3a4714efbf5/builtin/providers/openstack/resource_openstack_compute_instance_v2_test.go (about) 1 package openstack 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 8 "github.com/hashicorp/terraform/helper/resource" 9 "github.com/hashicorp/terraform/terraform" 10 11 "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes" 12 "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip" 13 "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/secgroups" 14 "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach" 15 "github.com/rackspace/gophercloud/openstack/compute/v2/servers" 16 "github.com/rackspace/gophercloud/pagination" 17 ) 18 19 func TestAccComputeV2Instance_basic(t *testing.T) { 20 var instance servers.Server 21 var testAccComputeV2Instance_basic = fmt.Sprintf(` 22 resource "openstack_compute_instance_v2" "foo" { 23 name = "terraform-test" 24 security_groups = ["default"] 25 network { 26 uuid = "%s" 27 } 28 metadata { 29 foo = "bar" 30 } 31 }`, 32 os.Getenv("OS_NETWORK_ID")) 33 34 resource.Test(t, resource.TestCase{ 35 PreCheck: func() { testAccPreCheck(t) }, 36 Providers: testAccProviders, 37 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 38 Steps: []resource.TestStep{ 39 resource.TestStep{ 40 Config: testAccComputeV2Instance_basic, 41 Check: resource.ComposeTestCheckFunc( 42 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 43 testAccCheckComputeV2InstanceMetadata(&instance, "foo", "bar"), 44 ), 45 }, 46 }, 47 }) 48 } 49 50 func TestAccComputeV2Instance_volumeAttach(t *testing.T) { 51 var instance servers.Server 52 var volume volumes.Volume 53 54 var testAccComputeV2Instance_volumeAttach = fmt.Sprintf(` 55 resource "openstack_blockstorage_volume_v1" "myvol" { 56 name = "myvol" 57 size = 1 58 } 59 60 resource "openstack_compute_instance_v2" "foo" { 61 name = "terraform-test" 62 security_groups = ["default"] 63 volume { 64 volume_id = "${openstack_blockstorage_volume_v1.myvol.id}" 65 } 66 }`) 67 68 resource.Test(t, resource.TestCase{ 69 PreCheck: func() { testAccPreCheck(t) }, 70 Providers: testAccProviders, 71 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 72 Steps: []resource.TestStep{ 73 resource.TestStep{ 74 Config: testAccComputeV2Instance_volumeAttach, 75 Check: resource.ComposeTestCheckFunc( 76 testAccCheckBlockStorageV1VolumeExists(t, "openstack_blockstorage_volume_v1.myvol", &volume), 77 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 78 testAccCheckComputeV2InstanceVolumeAttachment(&instance, &volume), 79 ), 80 }, 81 }, 82 }) 83 } 84 85 func TestAccComputeV2Instance_volumeAttachPostCreation(t *testing.T) { 86 var instance servers.Server 87 var volume volumes.Volume 88 89 var testAccComputeV2Instance_volumeAttachPostCreationInstance = fmt.Sprintf(` 90 resource "openstack_compute_instance_v2" "foo" { 91 name = "terraform-test" 92 security_groups = ["default"] 93 }`) 94 95 var testAccComputeV2Instance_volumeAttachPostCreationInstanceAndVolume = fmt.Sprintf(` 96 resource "openstack_blockstorage_volume_v1" "myvol" { 97 name = "myvol" 98 size = 1 99 } 100 101 resource "openstack_compute_instance_v2" "foo" { 102 name = "terraform-test" 103 security_groups = ["default"] 104 volume { 105 volume_id = "${openstack_blockstorage_volume_v1.myvol.id}" 106 } 107 }`) 108 109 resource.Test(t, resource.TestCase{ 110 PreCheck: func() { testAccPreCheck(t) }, 111 Providers: testAccProviders, 112 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 113 Steps: []resource.TestStep{ 114 resource.TestStep{ 115 Config: testAccComputeV2Instance_volumeAttachPostCreationInstance, 116 Check: resource.ComposeTestCheckFunc( 117 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 118 ), 119 }, 120 resource.TestStep{ 121 Config: testAccComputeV2Instance_volumeAttachPostCreationInstanceAndVolume, 122 Check: resource.ComposeTestCheckFunc( 123 testAccCheckBlockStorageV1VolumeExists(t, "openstack_blockstorage_volume_v1.myvol", &volume), 124 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 125 testAccCheckComputeV2InstanceVolumeAttachment(&instance, &volume), 126 ), 127 }, 128 }, 129 }) 130 } 131 132 func TestAccComputeV2Instance_volumeDetachPostCreation(t *testing.T) { 133 var instance servers.Server 134 var volume volumes.Volume 135 136 var testAccComputeV2Instance_volumeDetachPostCreationInstanceAndVolume = fmt.Sprintf(` 137 resource "openstack_blockstorage_volume_v1" "myvol" { 138 name = "myvol" 139 size = 1 140 } 141 142 resource "openstack_compute_instance_v2" "foo" { 143 name = "terraform-test" 144 security_groups = ["default"] 145 volume { 146 volume_id = "${openstack_blockstorage_volume_v1.myvol.id}" 147 } 148 }`) 149 150 var testAccComputeV2Instance_volumeDetachPostCreationInstance = fmt.Sprintf(` 151 resource "openstack_compute_instance_v2" "foo" { 152 name = "terraform-test" 153 security_groups = ["default"] 154 }`) 155 156 resource.Test(t, resource.TestCase{ 157 PreCheck: func() { testAccPreCheck(t) }, 158 Providers: testAccProviders, 159 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 160 Steps: []resource.TestStep{ 161 resource.TestStep{ 162 Config: testAccComputeV2Instance_volumeDetachPostCreationInstanceAndVolume, 163 Check: resource.ComposeTestCheckFunc( 164 testAccCheckBlockStorageV1VolumeExists(t, "openstack_blockstorage_volume_v1.myvol", &volume), 165 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 166 testAccCheckComputeV2InstanceVolumeAttachment(&instance, &volume), 167 ), 168 }, 169 resource.TestStep{ 170 Config: testAccComputeV2Instance_volumeDetachPostCreationInstance, 171 Check: resource.ComposeTestCheckFunc( 172 testAccCheckBlockStorageV1VolumeDoesNotExist(t, "openstack_blockstorage_volume_v1.myvol", &volume), 173 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 174 testAccCheckComputeV2InstanceVolumesDetached(&instance), 175 ), 176 }, 177 }, 178 }) 179 } 180 181 func TestAccComputeV2Instance_additionalVolumeDetachPostCreation(t *testing.T) { 182 var instance servers.Server 183 var volume volumes.Volume 184 185 var testAccComputeV2Instance_volumeDetachPostCreationInstanceAndAdditionalVolume = fmt.Sprintf(` 186 187 resource "openstack_blockstorage_volume_v1" "root_volume" { 188 name = "root_volume" 189 size = 1 190 image_id = "%s" 191 } 192 193 resource "openstack_blockstorage_volume_v1" "additional_volume" { 194 name = "additional_volume" 195 size = 1 196 } 197 198 resource "openstack_compute_instance_v2" "foo" { 199 name = "terraform-test" 200 security_groups = ["default"] 201 202 block_device { 203 uuid = "${openstack_blockstorage_volume_v1.root_volume.id}" 204 source_type = "volume" 205 boot_index = 0 206 destination_type = "volume" 207 delete_on_termination = false 208 } 209 210 volume { 211 volume_id = "${openstack_blockstorage_volume_v1.additional_volume.id}" 212 } 213 }`, 214 os.Getenv("OS_IMAGE_ID")) 215 216 var testAccComputeV2Instance_volumeDetachPostCreationInstance = fmt.Sprintf(` 217 218 resource "openstack_blockstorage_volume_v1" "root_volume" { 219 name = "root_volume" 220 size = 1 221 image_id = "%s" 222 } 223 224 resource "openstack_blockstorage_volume_v1" "additional_volume" { 225 name = "additional_volume" 226 size = 1 227 } 228 229 resource "openstack_compute_instance_v2" "foo" { 230 name = "terraform-test" 231 security_groups = ["default"] 232 233 block_device { 234 uuid = "${openstack_blockstorage_volume_v1.root_volume.id}" 235 source_type = "volume" 236 boot_index = 0 237 destination_type = "volume" 238 delete_on_termination = false 239 } 240 }`, 241 os.Getenv("OS_IMAGE_ID")) 242 243 resource.Test(t, resource.TestCase{ 244 PreCheck: func() { testAccPreCheck(t) }, 245 Providers: testAccProviders, 246 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 247 Steps: []resource.TestStep{ 248 resource.TestStep{ 249 Config: testAccComputeV2Instance_volumeDetachPostCreationInstanceAndAdditionalVolume, 250 Check: resource.ComposeTestCheckFunc( 251 testAccCheckBlockStorageV1VolumeExists(t, "openstack_blockstorage_volume_v1.root_volume", &volume), 252 testAccCheckBlockStorageV1VolumeExists(t, "openstack_blockstorage_volume_v1.additional_volume", &volume), 253 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 254 testAccCheckComputeV2InstanceVolumeAttachment(&instance, &volume), 255 testAccCheckComputeV2InstanceVolumeAttachment(&instance, &volume), 256 ), 257 }, 258 resource.TestStep{ 259 Config: testAccComputeV2Instance_volumeDetachPostCreationInstance, 260 Check: resource.ComposeTestCheckFunc( 261 testAccCheckBlockStorageV1VolumeExists(t, "openstack_blockstorage_volume_v1.root_volume", &volume), 262 testAccCheckBlockStorageV1VolumeExists(t, "openstack_blockstorage_volume_v1.additional_volume", &volume), 263 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 264 testAccCheckComputeV2InstanceVolumeAttachment(&instance, &volume), 265 testAccCheckComputeV2InstanceVolumeDetached(&instance, "openstack_blockstorage_volume_v1.additional_volume"), 266 ), 267 }, 268 }, 269 }) 270 } 271 272 func TestAccComputeV2Instance_floatingIPAttachGlobally(t *testing.T) { 273 var instance servers.Server 274 var fip floatingip.FloatingIP 275 var testAccComputeV2Instance_floatingIPAttachGlobally = fmt.Sprintf(` 276 resource "openstack_compute_floatingip_v2" "myip" { 277 } 278 279 resource "openstack_compute_instance_v2" "foo" { 280 name = "terraform-test" 281 security_groups = ["default"] 282 floating_ip = "${openstack_compute_floatingip_v2.myip.address}" 283 284 network { 285 uuid = "%s" 286 } 287 }`, 288 os.Getenv("OS_NETWORK_ID")) 289 290 resource.Test(t, resource.TestCase{ 291 PreCheck: func() { testAccPreCheck(t) }, 292 Providers: testAccProviders, 293 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 294 Steps: []resource.TestStep{ 295 resource.TestStep{ 296 Config: testAccComputeV2Instance_floatingIPAttachGlobally, 297 Check: resource.ComposeTestCheckFunc( 298 testAccCheckComputeV2FloatingIPExists(t, "openstack_compute_floatingip_v2.myip", &fip), 299 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 300 testAccCheckComputeV2InstanceFloatingIPAttach(&instance, &fip), 301 ), 302 }, 303 }, 304 }) 305 } 306 307 func TestAccComputeV2Instance_floatingIPAttachToNetwork(t *testing.T) { 308 var instance servers.Server 309 var fip floatingip.FloatingIP 310 var testAccComputeV2Instance_floatingIPAttachToNetwork = fmt.Sprintf(` 311 resource "openstack_compute_floatingip_v2" "myip" { 312 } 313 314 resource "openstack_compute_instance_v2" "foo" { 315 name = "terraform-test" 316 security_groups = ["default"] 317 318 network { 319 uuid = "%s" 320 floating_ip = "${openstack_compute_floatingip_v2.myip.address}" 321 access_network = true 322 } 323 }`, 324 os.Getenv("OS_NETWORK_ID")) 325 326 resource.Test(t, resource.TestCase{ 327 PreCheck: func() { testAccPreCheck(t) }, 328 Providers: testAccProviders, 329 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 330 Steps: []resource.TestStep{ 331 resource.TestStep{ 332 Config: testAccComputeV2Instance_floatingIPAttachToNetwork, 333 Check: resource.ComposeTestCheckFunc( 334 testAccCheckComputeV2FloatingIPExists(t, "openstack_compute_floatingip_v2.myip", &fip), 335 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 336 testAccCheckComputeV2InstanceFloatingIPAttach(&instance, &fip), 337 ), 338 }, 339 }, 340 }) 341 } 342 343 func TestAccComputeV2Instance_floatingIPAttachAndChange(t *testing.T) { 344 var instance servers.Server 345 var fip floatingip.FloatingIP 346 var testAccComputeV2Instance_floatingIPAttachToNetwork_1 = fmt.Sprintf(` 347 resource "openstack_compute_floatingip_v2" "myip_1" { 348 } 349 350 resource "openstack_compute_floatingip_v2" "myip_2" { 351 } 352 353 resource "openstack_compute_instance_v2" "foo" { 354 name = "terraform-test" 355 security_groups = ["default"] 356 357 network { 358 uuid = "%s" 359 floating_ip = "${openstack_compute_floatingip_v2.myip_1.address}" 360 access_network = true 361 } 362 }`, 363 os.Getenv("OS_NETWORK_ID")) 364 365 var testAccComputeV2Instance_floatingIPAttachToNetwork_2 = fmt.Sprintf(` 366 resource "openstack_compute_floatingip_v2" "myip_1" { 367 } 368 369 resource "openstack_compute_floatingip_v2" "myip_2" { 370 } 371 372 resource "openstack_compute_instance_v2" "foo" { 373 name = "terraform-test" 374 security_groups = ["default"] 375 376 network { 377 uuid = "%s" 378 floating_ip = "${openstack_compute_floatingip_v2.myip_2.address}" 379 access_network = true 380 } 381 }`, 382 os.Getenv("OS_NETWORK_ID")) 383 384 resource.Test(t, resource.TestCase{ 385 PreCheck: func() { testAccPreCheck(t) }, 386 Providers: testAccProviders, 387 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 388 Steps: []resource.TestStep{ 389 resource.TestStep{ 390 Config: testAccComputeV2Instance_floatingIPAttachToNetwork_1, 391 Check: resource.ComposeTestCheckFunc( 392 testAccCheckComputeV2FloatingIPExists(t, "openstack_compute_floatingip_v2.myip_1", &fip), 393 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 394 testAccCheckComputeV2InstanceFloatingIPAttach(&instance, &fip), 395 ), 396 }, 397 resource.TestStep{ 398 Config: testAccComputeV2Instance_floatingIPAttachToNetwork_2, 399 Check: resource.ComposeTestCheckFunc( 400 testAccCheckComputeV2FloatingIPExists(t, "openstack_compute_floatingip_v2.myip_2", &fip), 401 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 402 testAccCheckComputeV2InstanceFloatingIPAttach(&instance, &fip), 403 ), 404 }, 405 }, 406 }) 407 } 408 409 func TestAccComputeV2Instance_multi_secgroups(t *testing.T) { 410 var instance_1 servers.Server 411 var secgroup_1 secgroups.SecurityGroup 412 var testAccComputeV2Instance_multi_secgroups = fmt.Sprintf(` 413 resource "openstack_compute_secgroup_v2" "secgroup_1" { 414 name = "secgroup_1" 415 description = "a security group" 416 rule { 417 from_port = 22 418 to_port = 22 419 ip_protocol = "tcp" 420 cidr = "0.0.0.0/0" 421 } 422 } 423 424 resource "openstack_compute_instance_v2" "instance_1" { 425 name = "instance_1" 426 security_groups = ["default", "${openstack_compute_secgroup_v2.secgroup_1.name}"] 427 network { 428 uuid = "%s" 429 } 430 }`, 431 os.Getenv("OS_NETWORK_ID")) 432 433 resource.Test(t, resource.TestCase{ 434 PreCheck: func() { testAccPreCheck(t) }, 435 Providers: testAccProviders, 436 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 437 Steps: []resource.TestStep{ 438 resource.TestStep{ 439 Config: testAccComputeV2Instance_multi_secgroups, 440 Check: resource.ComposeTestCheckFunc( 441 testAccCheckComputeV2SecGroupExists(t, "openstack_compute_secgroup_v2.secgroup_1", &secgroup_1), 442 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance_1), 443 ), 444 }, 445 }, 446 }) 447 } 448 449 func TestAccComputeV2Instance_multi_secgroups_update(t *testing.T) { 450 var instance_1 servers.Server 451 var secgroup_1, secgroup_2 secgroups.SecurityGroup 452 var testAccComputeV2Instance_multi_secgroups_update_1 = fmt.Sprintf(` 453 resource "openstack_compute_secgroup_v2" "secgroup_1" { 454 name = "secgroup_1" 455 description = "a security group" 456 rule { 457 from_port = 22 458 to_port = 22 459 ip_protocol = "tcp" 460 cidr = "0.0.0.0/0" 461 } 462 } 463 464 resource "openstack_compute_secgroup_v2" "secgroup_2" { 465 name = "secgroup_2" 466 description = "another security group" 467 rule { 468 from_port = 80 469 to_port = 80 470 ip_protocol = "tcp" 471 cidr = "0.0.0.0/0" 472 } 473 } 474 475 resource "openstack_compute_instance_v2" "instance_1" { 476 name = "instance_1" 477 security_groups = ["default"] 478 }`) 479 480 var testAccComputeV2Instance_multi_secgroups_update_2 = fmt.Sprintf(` 481 resource "openstack_compute_secgroup_v2" "secgroup_1" { 482 name = "secgroup_1" 483 description = "a security group" 484 rule { 485 from_port = 22 486 to_port = 22 487 ip_protocol = "tcp" 488 cidr = "0.0.0.0/0" 489 } 490 } 491 492 resource "openstack_compute_secgroup_v2" "secgroup_2" { 493 name = "secgroup_2" 494 description = "another security group" 495 rule { 496 from_port = 80 497 to_port = 80 498 ip_protocol = "tcp" 499 cidr = "0.0.0.0/0" 500 } 501 } 502 503 resource "openstack_compute_instance_v2" "instance_1" { 504 name = "instance_1" 505 security_groups = ["default", "${openstack_compute_secgroup_v2.secgroup_1.name}", "${openstack_compute_secgroup_v2.secgroup_2.name}"] 506 }`) 507 508 resource.Test(t, resource.TestCase{ 509 PreCheck: func() { testAccPreCheck(t) }, 510 Providers: testAccProviders, 511 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 512 Steps: []resource.TestStep{ 513 resource.TestStep{ 514 Config: testAccComputeV2Instance_multi_secgroups_update_1, 515 Check: resource.ComposeTestCheckFunc( 516 testAccCheckComputeV2SecGroupExists(t, "openstack_compute_secgroup_v2.secgroup_1", &secgroup_1), 517 testAccCheckComputeV2SecGroupExists(t, "openstack_compute_secgroup_v2.secgroup_2", &secgroup_2), 518 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance_1), 519 ), 520 }, 521 resource.TestStep{ 522 Config: testAccComputeV2Instance_multi_secgroups_update_2, 523 Check: resource.ComposeTestCheckFunc( 524 testAccCheckComputeV2SecGroupExists(t, "openstack_compute_secgroup_v2.secgroup_1", &secgroup_1), 525 testAccCheckComputeV2SecGroupExists(t, "openstack_compute_secgroup_v2.secgroup_2", &secgroup_2), 526 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance_1), 527 ), 528 }, 529 }, 530 }) 531 } 532 533 func TestAccComputeV2Instance_bootFromVolumeImage(t *testing.T) { 534 var instance servers.Server 535 var testAccComputeV2Instance_bootFromVolumeImage = fmt.Sprintf(` 536 resource "openstack_compute_instance_v2" "foo" { 537 name = "terraform-test" 538 security_groups = ["default"] 539 block_device { 540 uuid = "%s" 541 source_type = "image" 542 volume_size = 5 543 boot_index = 0 544 destination_type = "volume" 545 delete_on_termination = true 546 } 547 }`, 548 os.Getenv("OS_IMAGE_ID")) 549 550 resource.Test(t, resource.TestCase{ 551 PreCheck: func() { testAccPreCheck(t) }, 552 Providers: testAccProviders, 553 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 554 Steps: []resource.TestStep{ 555 resource.TestStep{ 556 Config: testAccComputeV2Instance_bootFromVolumeImage, 557 Check: resource.ComposeTestCheckFunc( 558 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 559 testAccCheckComputeV2InstanceBootVolumeAttachment(&instance), 560 ), 561 }, 562 }, 563 }) 564 } 565 566 func TestAccComputeV2Instance_bootFromVolumeImageWithAttachedVolume(t *testing.T) { 567 var instance servers.Server 568 var testAccComputeV2Instance_bootFromVolumeImageWithAttachedVolume = fmt.Sprintf(` 569 resource "openstack_blockstorage_volume_v1" "volume_1" { 570 name = "volume_1" 571 size = 1 572 } 573 574 resource "openstack_compute_instance_v2" "instance_1" { 575 name = "instance_1" 576 security_groups = ["default"] 577 block_device { 578 uuid = "%s" 579 source_type = "image" 580 volume_size = 2 581 boot_index = 0 582 destination_type = "volume" 583 delete_on_termination = true 584 } 585 586 volume { 587 volume_id = "${openstack_blockstorage_volume_v1.volume_1.id}" 588 } 589 }`, 590 os.Getenv("OS_IMAGE_ID")) 591 592 resource.Test(t, resource.TestCase{ 593 PreCheck: func() { testAccPreCheck(t) }, 594 Providers: testAccProviders, 595 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 596 Steps: []resource.TestStep{ 597 resource.TestStep{ 598 Config: testAccComputeV2Instance_bootFromVolumeImageWithAttachedVolume, 599 Check: resource.ComposeTestCheckFunc( 600 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance), 601 ), 602 }, 603 }, 604 }) 605 } 606 607 func TestAccComputeV2Instance_bootFromVolumeVolume(t *testing.T) { 608 var instance servers.Server 609 var testAccComputeV2Instance_bootFromVolumeVolume = fmt.Sprintf(` 610 resource "openstack_blockstorage_volume_v1" "foo" { 611 name = "terraform-test" 612 size = 5 613 image_id = "%s" 614 } 615 616 resource "openstack_compute_instance_v2" "foo" { 617 name = "terraform-test" 618 security_groups = ["default"] 619 block_device { 620 uuid = "${openstack_blockstorage_volume_v1.foo.id}" 621 source_type = "volume" 622 boot_index = 0 623 destination_type = "volume" 624 delete_on_termination = true 625 } 626 }`, 627 os.Getenv("OS_IMAGE_ID")) 628 629 resource.Test(t, resource.TestCase{ 630 PreCheck: func() { testAccPreCheck(t) }, 631 Providers: testAccProviders, 632 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 633 Steps: []resource.TestStep{ 634 resource.TestStep{ 635 Config: testAccComputeV2Instance_bootFromVolumeVolume, 636 Check: resource.ComposeTestCheckFunc( 637 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 638 testAccCheckComputeV2InstanceBootVolumeAttachment(&instance), 639 ), 640 }, 641 }, 642 }) 643 } 644 645 func TestAccComputeV2Instance_bootFromVolumeForceNew(t *testing.T) { 646 var instance1_1 servers.Server 647 var instance1_2 servers.Server 648 var testAccComputeV2Instance_bootFromVolumeForceNew_1 = fmt.Sprintf(` 649 resource "openstack_compute_instance_v2" "instance_1" { 650 name = "instance_1" 651 security_groups = ["default"] 652 block_device { 653 uuid = "%s" 654 source_type = "image" 655 volume_size = 5 656 boot_index = 0 657 destination_type = "volume" 658 delete_on_termination = true 659 } 660 }`, 661 os.Getenv("OS_IMAGE_ID")) 662 663 var testAccComputeV2Instance_bootFromVolumeForceNew_2 = fmt.Sprintf(` 664 resource "openstack_compute_instance_v2" "instance_1" { 665 name = "instance_1" 666 security_groups = ["default"] 667 block_device { 668 uuid = "%s" 669 source_type = "image" 670 volume_size = 4 671 boot_index = 0 672 destination_type = "volume" 673 delete_on_termination = true 674 } 675 }`, 676 os.Getenv("OS_IMAGE_ID")) 677 678 resource.Test(t, resource.TestCase{ 679 PreCheck: func() { testAccPreCheck(t) }, 680 Providers: testAccProviders, 681 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 682 Steps: []resource.TestStep{ 683 resource.TestStep{ 684 Config: testAccComputeV2Instance_bootFromVolumeForceNew_1, 685 Check: resource.ComposeTestCheckFunc( 686 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance1_1), 687 ), 688 }, 689 resource.TestStep{ 690 Config: testAccComputeV2Instance_bootFromVolumeForceNew_2, 691 Check: resource.ComposeTestCheckFunc( 692 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance1_2), 693 testAccCheckComputeV2InstanceInstanceIDsDoNotMatch(&instance1_1, &instance1_2), 694 ), 695 }, 696 }, 697 }) 698 } 699 700 // TODO: verify the personality really exists on the instance. 701 func TestAccComputeV2Instance_personality(t *testing.T) { 702 var instance servers.Server 703 var testAccComputeV2Instance_personality = fmt.Sprintf(` 704 resource "openstack_compute_instance_v2" "foo" { 705 name = "terraform-test" 706 security_groups = ["default"] 707 personality { 708 file = "/tmp/foobar.txt" 709 content = "happy" 710 } 711 personality { 712 file = "/tmp/barfoo.txt" 713 content = "angry" 714 } 715 }`) 716 717 resource.Test(t, resource.TestCase{ 718 PreCheck: func() { testAccPreCheck(t) }, 719 Providers: testAccProviders, 720 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 721 Steps: []resource.TestStep{ 722 resource.TestStep{ 723 Config: testAccComputeV2Instance_personality, 724 Check: resource.ComposeTestCheckFunc( 725 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 726 ), 727 }, 728 }, 729 }) 730 } 731 732 func TestAccComputeV2Instance_multiEphemeral(t *testing.T) { 733 var instance servers.Server 734 var testAccComputeV2Instance_multiEphemeral = fmt.Sprintf(` 735 resource "openstack_compute_instance_v2" "foo" { 736 name = "terraform-test" 737 security_groups = ["default"] 738 block_device { 739 boot_index = 0 740 delete_on_termination = true 741 destination_type = "local" 742 source_type = "image" 743 uuid = "%s" 744 } 745 block_device { 746 boot_index = -1 747 delete_on_termination = true 748 destination_type = "local" 749 source_type = "blank" 750 volume_size = 1 751 } 752 block_device { 753 boot_index = -1 754 delete_on_termination = true 755 destination_type = "local" 756 source_type = "blank" 757 volume_size = 1 758 } 759 }`, 760 os.Getenv("OS_IMAGE_ID")) 761 762 resource.Test(t, resource.TestCase{ 763 PreCheck: func() { testAccPreCheck(t) }, 764 Providers: testAccProviders, 765 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 766 Steps: []resource.TestStep{ 767 resource.TestStep{ 768 Config: testAccComputeV2Instance_multiEphemeral, 769 Check: resource.ComposeTestCheckFunc( 770 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 771 ), 772 }, 773 }, 774 }) 775 } 776 777 func TestAccComputeV2Instance_accessIPv4(t *testing.T) { 778 var instance servers.Server 779 var testAccComputeV2Instance_accessIPv4 = fmt.Sprintf(` 780 resource "openstack_compute_floatingip_v2" "myip" { 781 } 782 783 resource "openstack_networking_network_v2" "network_1" { 784 name = "network_1" 785 } 786 787 resource "openstack_networking_subnet_v2" "subnet_1" { 788 name = "subnet_1" 789 network_id = "${openstack_networking_network_v2.network_1.id}" 790 cidr = "192.168.1.0/24" 791 ip_version = 4 792 enable_dhcp = true 793 no_gateway = true 794 } 795 796 resource "openstack_compute_instance_v2" "instance_1" { 797 depends_on = ["openstack_networking_subnet_v2.subnet_1"] 798 799 name = "instance_1" 800 security_groups = ["default"] 801 floating_ip = "${openstack_compute_floatingip_v2.myip.address}" 802 803 network { 804 uuid = "%s" 805 } 806 807 network { 808 uuid = "${openstack_networking_network_v2.network_1.id}" 809 fixed_ip_v4 = "192.168.1.100" 810 access_network = true 811 } 812 }`, os.Getenv("OS_NETWORK_ID")) 813 814 resource.Test(t, resource.TestCase{ 815 PreCheck: func() { testAccPreCheck(t) }, 816 Providers: testAccProviders, 817 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 818 Steps: []resource.TestStep{ 819 resource.TestStep{ 820 Config: testAccComputeV2Instance_accessIPv4, 821 Check: resource.ComposeTestCheckFunc( 822 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance), 823 resource.TestCheckResourceAttr( 824 "openstack_compute_instance_v2.instance_1", "access_ip_v4", "192.168.1.100"), 825 ), 826 }, 827 }, 828 }) 829 } 830 831 func TestAccComputeV2Instance_ChangeFixedIP(t *testing.T) { 832 var instance1_1 servers.Server 833 var instance1_2 servers.Server 834 var testAccComputeV2Instance_ChangeFixedIP_1 = fmt.Sprintf(` 835 resource "openstack_compute_instance_v2" "instance_1" { 836 name = "instance_1" 837 security_groups = ["default"] 838 network { 839 uuid = "%s" 840 fixed_ip_v4 = "10.0.0.24" 841 } 842 }`, 843 os.Getenv("OS_NETWORK_ID")) 844 845 var testAccComputeV2Instance_ChangeFixedIP_2 = fmt.Sprintf(` 846 resource "openstack_compute_instance_v2" "instance_1" { 847 name = "instance_1" 848 security_groups = ["default"] 849 network { 850 uuid = "%s" 851 fixed_ip_v4 = "10.0.0.25" 852 } 853 }`, 854 os.Getenv("OS_NETWORK_ID")) 855 856 resource.Test(t, resource.TestCase{ 857 PreCheck: func() { testAccPreCheck(t) }, 858 Providers: testAccProviders, 859 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 860 Steps: []resource.TestStep{ 861 resource.TestStep{ 862 Config: testAccComputeV2Instance_ChangeFixedIP_1, 863 Check: resource.ComposeTestCheckFunc( 864 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance1_1), 865 ), 866 }, 867 resource.TestStep{ 868 Config: testAccComputeV2Instance_ChangeFixedIP_2, 869 Check: resource.ComposeTestCheckFunc( 870 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.instance_1", &instance1_2), 871 testAccCheckComputeV2InstanceInstanceIDsDoNotMatch(&instance1_1, &instance1_2), 872 ), 873 }, 874 }, 875 }) 876 } 877 878 func testAccCheckComputeV2InstanceDestroy(s *terraform.State) error { 879 config := testAccProvider.Meta().(*Config) 880 computeClient, err := config.computeV2Client(OS_REGION_NAME) 881 if err != nil { 882 return fmt.Errorf("(testAccCheckComputeV2InstanceDestroy) Error creating OpenStack compute client: %s", err) 883 } 884 885 for _, rs := range s.RootModule().Resources { 886 if rs.Type != "openstack_compute_instance_v2" { 887 continue 888 } 889 890 _, err := servers.Get(computeClient, rs.Primary.ID).Extract() 891 if err == nil { 892 return fmt.Errorf("Instance still exists") 893 } 894 } 895 896 return nil 897 } 898 899 func testAccCheckComputeV2InstanceExists(t *testing.T, n string, instance *servers.Server) resource.TestCheckFunc { 900 return func(s *terraform.State) error { 901 rs, ok := s.RootModule().Resources[n] 902 if !ok { 903 return fmt.Errorf("Not found: %s", n) 904 } 905 906 if rs.Primary.ID == "" { 907 return fmt.Errorf("No ID is set") 908 } 909 910 config := testAccProvider.Meta().(*Config) 911 computeClient, err := config.computeV2Client(OS_REGION_NAME) 912 if err != nil { 913 return fmt.Errorf("(testAccCheckComputeV2InstanceExists) Error creating OpenStack compute client: %s", err) 914 } 915 916 found, err := servers.Get(computeClient, rs.Primary.ID).Extract() 917 if err != nil { 918 return err 919 } 920 921 if found.ID != rs.Primary.ID { 922 return fmt.Errorf("Instance not found") 923 } 924 925 *instance = *found 926 927 return nil 928 } 929 } 930 931 func testAccCheckComputeV2InstanceMetadata( 932 instance *servers.Server, k string, v string) resource.TestCheckFunc { 933 return func(s *terraform.State) error { 934 if instance.Metadata == nil { 935 return fmt.Errorf("No metadata") 936 } 937 938 for key, value := range instance.Metadata { 939 if k != key { 940 continue 941 } 942 943 if v == value.(string) { 944 return nil 945 } 946 947 return fmt.Errorf("Bad value for %s: %s", k, value) 948 } 949 950 return fmt.Errorf("Metadata not found: %s", k) 951 } 952 } 953 954 func testAccCheckComputeV2InstanceVolumeAttachment( 955 instance *servers.Server, volume *volumes.Volume) resource.TestCheckFunc { 956 return func(s *terraform.State) error { 957 var attachments []volumeattach.VolumeAttachment 958 959 config := testAccProvider.Meta().(*Config) 960 computeClient, err := config.computeV2Client(OS_REGION_NAME) 961 if err != nil { 962 return err 963 } 964 err = volumeattach.List(computeClient, instance.ID).EachPage(func(page pagination.Page) (bool, error) { 965 actual, err := volumeattach.ExtractVolumeAttachments(page) 966 if err != nil { 967 return false, fmt.Errorf("Unable to lookup attachment: %s", err) 968 } 969 970 attachments = actual 971 return true, nil 972 }) 973 974 for _, attachment := range attachments { 975 if attachment.VolumeID == volume.ID { 976 return nil 977 } 978 } 979 980 return fmt.Errorf("Volume not found: %s", volume.ID) 981 } 982 } 983 984 func testAccCheckComputeV2InstanceVolumesDetached(instance *servers.Server) resource.TestCheckFunc { 985 return func(s *terraform.State) error { 986 var attachments []volumeattach.VolumeAttachment 987 988 config := testAccProvider.Meta().(*Config) 989 computeClient, err := config.computeV2Client(OS_REGION_NAME) 990 if err != nil { 991 return err 992 } 993 err = volumeattach.List(computeClient, instance.ID).EachPage(func(page pagination.Page) (bool, error) { 994 actual, err := volumeattach.ExtractVolumeAttachments(page) 995 if err != nil { 996 return false, fmt.Errorf("Unable to lookup attachment: %s", err) 997 } 998 999 attachments = actual 1000 return true, nil 1001 }) 1002 1003 if len(attachments) > 0 { 1004 return fmt.Errorf("Volumes are still attached.") 1005 } 1006 1007 return nil 1008 } 1009 } 1010 1011 func testAccCheckComputeV2InstanceBootVolumeAttachment( 1012 instance *servers.Server) resource.TestCheckFunc { 1013 return func(s *terraform.State) error { 1014 var attachments []volumeattach.VolumeAttachment 1015 1016 config := testAccProvider.Meta().(*Config) 1017 computeClient, err := config.computeV2Client(OS_REGION_NAME) 1018 if err != nil { 1019 return err 1020 } 1021 err = volumeattach.List(computeClient, instance.ID).EachPage(func(page pagination.Page) (bool, error) { 1022 actual, err := volumeattach.ExtractVolumeAttachments(page) 1023 if err != nil { 1024 return false, fmt.Errorf("Unable to lookup attachment: %s", err) 1025 } 1026 1027 attachments = actual 1028 return true, nil 1029 }) 1030 1031 if len(attachments) == 1 { 1032 return nil 1033 } 1034 1035 return fmt.Errorf("No attached volume found.") 1036 } 1037 } 1038 1039 func testAccCheckComputeV2InstanceFloatingIPAttach( 1040 instance *servers.Server, fip *floatingip.FloatingIP) resource.TestCheckFunc { 1041 return func(s *terraform.State) error { 1042 if fip.InstanceID == instance.ID { 1043 return nil 1044 } 1045 1046 return fmt.Errorf("Floating IP %s was not attached to instance %s", fip.ID, instance.ID) 1047 } 1048 } 1049 func testAccCheckComputeV2InstanceInstanceIDsDoNotMatch( 1050 instance1, instance2 *servers.Server) resource.TestCheckFunc { 1051 return func(s *terraform.State) error { 1052 if instance1.ID == instance2.ID { 1053 return fmt.Errorf("Instance was not recreated.") 1054 } 1055 1056 return nil 1057 } 1058 } 1059 1060 func TestAccComputeV2Instance_stop_before_destroy(t *testing.T) { 1061 var instance servers.Server 1062 var testAccComputeV2Instance_stop_before_destroy = fmt.Sprintf(` 1063 resource "openstack_compute_instance_v2" "foo" { 1064 name = "terraform-test" 1065 security_groups = ["default"] 1066 network { 1067 uuid = "%s" 1068 } 1069 stop_before_destroy = true 1070 }`, 1071 os.Getenv("OS_NETWORK_ID")) 1072 1073 resource.Test(t, resource.TestCase{ 1074 PreCheck: func() { testAccPreCheck(t) }, 1075 Providers: testAccProviders, 1076 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 1077 Steps: []resource.TestStep{ 1078 resource.TestStep{ 1079 Config: testAccComputeV2Instance_stop_before_destroy, 1080 Check: resource.ComposeTestCheckFunc( 1081 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 1082 ), 1083 }, 1084 }, 1085 }) 1086 } 1087 1088 func testAccCheckComputeV2InstanceVolumeDetached(instance *servers.Server, volume_id string) resource.TestCheckFunc { 1089 return func(s *terraform.State) error { 1090 var attachments []volumeattach.VolumeAttachment 1091 1092 rs, ok := s.RootModule().Resources[volume_id] 1093 if !ok { 1094 return fmt.Errorf("Not found: %s", volume_id) 1095 } 1096 1097 if rs.Primary.ID == "" { 1098 return fmt.Errorf("No ID is set") 1099 } 1100 1101 config := testAccProvider.Meta().(*Config) 1102 computeClient, err := config.computeV2Client(OS_REGION_NAME) 1103 if err != nil { 1104 return err 1105 } 1106 err = volumeattach.List(computeClient, instance.ID).EachPage(func(page pagination.Page) (bool, error) { 1107 actual, err := volumeattach.ExtractVolumeAttachments(page) 1108 if err != nil { 1109 return false, fmt.Errorf("Unable to lookup attachment: %s", err) 1110 } 1111 1112 attachments = actual 1113 return true, nil 1114 }) 1115 1116 for _, attachment := range attachments { 1117 if attachment.VolumeID == rs.Primary.ID { 1118 return fmt.Errorf("Volume is still attached.") 1119 } 1120 } 1121 1122 return nil 1123 } 1124 }