provider/openstack: Convert block_device from TypeSet to TypeList
This change better reflects how block devices are passed to the Nova API and allows for future enablement of block_device features. It also resolves an interpolation bug.
This commit is contained in:
parent
0a73c2e629
commit
4716451617
|
@ -176,12 +176,7 @@ func resourceComputeInstanceV2() *schema.Resource {
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
"block_device": &schema.Schema{
|
"block_device": &schema.Schema{
|
||||||
// TODO: This is a set because we don't support singleton
|
Type: schema.TypeList,
|
||||||
// sub-resources today. We'll enforce that the set only ever has
|
|
||||||
// length zero or one below. When TF gains support for
|
|
||||||
// sub-resources this can be converted.
|
|
||||||
// As referenced in resource_aws_instance.go
|
|
||||||
Type: schema.TypeSet,
|
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Elem: &schema.Resource{
|
Elem: &schema.Resource{
|
||||||
|
@ -213,10 +208,6 @@ func resourceComputeInstanceV2() *schema.Resource {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Set: func(v interface{}) int {
|
|
||||||
// there can only be one bootable block device; no need to hash anything
|
|
||||||
return 0
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"volume": &schema.Schema{
|
"volume": &schema.Schema{
|
||||||
Type: schema.TypeSet,
|
Type: schema.TypeSet,
|
||||||
|
@ -352,9 +343,8 @@ func resourceComputeInstanceV2Create(d *schema.ResourceData, meta interface{}) e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, ok := d.GetOk("block_device"); ok {
|
if vL, ok := d.GetOk("block_device"); ok {
|
||||||
vL := v.(*schema.Set).List()
|
for _, v := range vL.([]interface{}) {
|
||||||
for _, v := range vL {
|
|
||||||
blockDeviceRaw := v.(map[string]interface{})
|
blockDeviceRaw := v.(map[string]interface{})
|
||||||
blockDevice := resourceInstanceBlockDeviceV2(d, blockDeviceRaw)
|
blockDevice := resourceInstanceBlockDeviceV2(d, blockDeviceRaw)
|
||||||
createOpts = &bootfromvolume.CreateOptsExt{
|
createOpts = &bootfromvolume.CreateOptsExt{
|
||||||
|
@ -1239,9 +1229,8 @@ func checkVolumeConfig(d *schema.ResourceData) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, ok := d.GetOk("block_device"); ok {
|
if vL, ok := d.GetOk("block_device"); ok {
|
||||||
vL := v.(*schema.Set).List()
|
if len(vL.([]interface{})) > 1 {
|
||||||
if len(vL) > 1 {
|
|
||||||
return fmt.Errorf("Can only specify one block device to boot from.")
|
return fmt.Errorf("Can only specify one block device to boot from.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -253,9 +253,9 @@ func TestAccComputeV2Instance_multi_secgroups(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAccComputeV2Instance_bootFromVolume(t *testing.T) {
|
func TestAccComputeV2Instance_bootFromVolumeImage(t *testing.T) {
|
||||||
var instance servers.Server
|
var instance servers.Server
|
||||||
var testAccComputeV2Instance_bootFromVolume = fmt.Sprintf(`
|
var testAccComputeV2Instance_bootFromVolumeImage = fmt.Sprintf(`
|
||||||
resource "openstack_compute_instance_v2" "foo" {
|
resource "openstack_compute_instance_v2" "foo" {
|
||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
security_groups = ["default"]
|
security_groups = ["default"]
|
||||||
|
@ -276,7 +276,46 @@ func TestAccComputeV2Instance_bootFromVolume(t *testing.T) {
|
||||||
CheckDestroy: testAccCheckComputeV2InstanceDestroy,
|
CheckDestroy: testAccCheckComputeV2InstanceDestroy,
|
||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
resource.TestStep{
|
resource.TestStep{
|
||||||
Config: testAccComputeV2Instance_bootFromVolume,
|
Config: testAccComputeV2Instance_bootFromVolumeImage,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance),
|
||||||
|
testAccCheckComputeV2InstanceBootVolumeAttachment(&instance),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAccComputeV2Instance_bootFromVolumeVolume(t *testing.T) {
|
||||||
|
var instance servers.Server
|
||||||
|
var testAccComputeV2Instance_bootFromVolumeVolume = fmt.Sprintf(`
|
||||||
|
resource "openstack_blockstorage_volume_v1" "foo" {
|
||||||
|
name = "terraform-test"
|
||||||
|
size = 5
|
||||||
|
image_id = "%s"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_compute_instance_v2" "foo" {
|
||||||
|
name = "terraform-test"
|
||||||
|
security_groups = ["default"]
|
||||||
|
block_device {
|
||||||
|
uuid = "${openstack_blockstorage_volume_v1.foo.id}"
|
||||||
|
source_type = "volume"
|
||||||
|
volume_size = 5
|
||||||
|
boot_index = 0
|
||||||
|
destination_type = "volume"
|
||||||
|
delete_on_termination = true
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
os.Getenv("OS_IMAGE_ID"))
|
||||||
|
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckComputeV2InstanceDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccComputeV2Instance_bootFromVolumeVolume,
|
||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance),
|
testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance),
|
||||||
testAccCheckComputeV2InstanceBootVolumeAttachment(&instance),
|
testAccCheckComputeV2InstanceBootVolumeAttachment(&instance),
|
||||||
|
|
Loading…
Reference in New Issue