github.com/tarrant/terraform@v0.3.8-0.20150402012457-f68c9eee638e/builtin/providers/openstack/resource_openstack_compute_instance_v2_test.go (about) 1 package openstack 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/hashicorp/terraform/helper/resource" 8 "github.com/hashicorp/terraform/terraform" 9 10 "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes" 11 "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach" 12 "github.com/rackspace/gophercloud/openstack/compute/v2/servers" 13 "github.com/rackspace/gophercloud/pagination" 14 ) 15 16 func TestAccComputeV2Instance_basic(t *testing.T) { 17 var instance servers.Server 18 19 resource.Test(t, resource.TestCase{ 20 PreCheck: func() { testAccPreCheck(t) }, 21 Providers: testAccProviders, 22 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 23 Steps: []resource.TestStep{ 24 resource.TestStep{ 25 Config: testAccComputeV2Instance_basic, 26 Check: resource.ComposeTestCheckFunc( 27 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 28 testAccCheckComputeV2InstanceMetadata(&instance, "foo", "bar"), 29 ), 30 }, 31 }, 32 }) 33 } 34 35 func TestAccComputeV2Instance_volumeAttach(t *testing.T) { 36 var instance servers.Server 37 var volume volumes.Volume 38 39 resource.Test(t, resource.TestCase{ 40 PreCheck: func() { testAccPreCheck(t) }, 41 Providers: testAccProviders, 42 CheckDestroy: testAccCheckComputeV2InstanceDestroy, 43 Steps: []resource.TestStep{ 44 resource.TestStep{ 45 Config: testAccComputeV2Instance_volumeAttach, 46 Check: resource.ComposeTestCheckFunc( 47 testAccCheckBlockStorageV1VolumeExists(t, "openstack_blockstorage_volume_v1.myvol", &volume), 48 testAccCheckComputeV2InstanceExists(t, "openstack_compute_instance_v2.foo", &instance), 49 testAccCheckComputeV2InstanceVolumeAttachment(&instance, &volume), 50 ), 51 }, 52 }, 53 }) 54 } 55 56 func testAccCheckComputeV2InstanceDestroy(s *terraform.State) error { 57 config := testAccProvider.Meta().(*Config) 58 computeClient, err := config.computeV2Client(OS_REGION_NAME) 59 if err != nil { 60 return fmt.Errorf("(testAccCheckComputeV2InstanceDestroy) Error creating OpenStack compute client: %s", err) 61 } 62 63 for _, rs := range s.RootModule().Resources { 64 if rs.Type != "openstack_compute_instance_v2" { 65 continue 66 } 67 68 _, err := servers.Get(computeClient, rs.Primary.ID).Extract() 69 if err == nil { 70 return fmt.Errorf("Instance still exists") 71 } 72 } 73 74 return nil 75 } 76 77 func testAccCheckComputeV2InstanceExists(t *testing.T, n string, instance *servers.Server) resource.TestCheckFunc { 78 return func(s *terraform.State) error { 79 rs, ok := s.RootModule().Resources[n] 80 if !ok { 81 return fmt.Errorf("Not found: %s", n) 82 } 83 84 if rs.Primary.ID == "" { 85 return fmt.Errorf("No ID is set") 86 } 87 88 config := testAccProvider.Meta().(*Config) 89 computeClient, err := config.computeV2Client(OS_REGION_NAME) 90 if err != nil { 91 return fmt.Errorf("(testAccCheckComputeV2InstanceExists) Error creating OpenStack compute client: %s", err) 92 } 93 94 found, err := servers.Get(computeClient, rs.Primary.ID).Extract() 95 if err != nil { 96 return err 97 } 98 99 if found.ID != rs.Primary.ID { 100 return fmt.Errorf("Instance not found") 101 } 102 103 *instance = *found 104 105 return nil 106 } 107 } 108 109 func testAccCheckComputeV2InstanceMetadata( 110 instance *servers.Server, k string, v string) resource.TestCheckFunc { 111 return func(s *terraform.State) error { 112 if instance.Metadata == nil { 113 return fmt.Errorf("No metadata") 114 } 115 116 for key, value := range instance.Metadata { 117 if k != key { 118 continue 119 } 120 121 if v == value.(string) { 122 return nil 123 } 124 125 return fmt.Errorf("Bad value for %s: %s", k, value) 126 } 127 128 return fmt.Errorf("Metadata not found: %s", k) 129 } 130 } 131 132 func testAccCheckComputeV2InstanceVolumeAttachment( 133 instance *servers.Server, volume *volumes.Volume) resource.TestCheckFunc { 134 return func(s *terraform.State) error { 135 var attachments []volumeattach.VolumeAttachment 136 137 config := testAccProvider.Meta().(*Config) 138 computeClient, err := config.computeV2Client(OS_REGION_NAME) 139 if err != nil { 140 return err 141 } 142 err = volumeattach.List(computeClient, instance.ID).EachPage(func(page pagination.Page) (bool, error) { 143 actual, err := volumeattach.ExtractVolumeAttachments(page) 144 if err != nil { 145 return false, fmt.Errorf("Unable to lookup attachment: %s", err) 146 } 147 148 attachments = actual 149 return true, nil 150 }) 151 152 for _, attachment := range attachments { 153 if attachment.VolumeID == volume.ID { 154 return nil 155 } 156 } 157 158 return fmt.Errorf("Volume not found: %s", volume.ID) 159 } 160 } 161 162 var testAccComputeV2Instance_basic = fmt.Sprintf(` 163 resource "openstack_compute_instance_v2" "foo" { 164 region = "%s" 165 name = "terraform-test" 166 metadata { 167 foo = "bar" 168 } 169 }`, 170 OS_REGION_NAME) 171 172 var testAccComputeV2Instance_volumeAttach = fmt.Sprintf(` 173 resource "openstack_blockstorage_volume_v1" "myvol" { 174 name = "myvol" 175 size = 1 176 } 177 178 resource "openstack_compute_instance_v2" "foo" { 179 region = "%s" 180 name = "terraform-test" 181 volume { 182 volume_id = "${openstack_blockstorage_volume_v1.myvol.id}" 183 } 184 }`, 185 OS_REGION_NAME)