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  }