github.com/pmcatominey/terraform@v0.7.0-rc2.0.20160708105029-1401a52a5cc5/builtin/providers/openstack/resource_openstack_blockstorage_volume_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" 12 "github.com/rackspace/gophercloud/openstack/blockstorage/v2/volumes" 13 ) 14 15 func TestAccBlockStorageV2Volume_basic(t *testing.T) { 16 var volume volumes.Volume 17 18 var testAccBlockStorageV2Volume_basic = fmt.Sprintf(` 19 resource "openstack_blockstorage_volume_v2" "volume_1" { 20 name = "volume_1" 21 description = "first test volume" 22 metadata { 23 foo = "bar" 24 } 25 size = 1 26 }`) 27 28 var testAccBlockStorageV2Volume_update = fmt.Sprintf(` 29 resource "openstack_blockstorage_volume_v2" "volume_1" { 30 name = "volume_1-updated" 31 description = "first test volume" 32 metadata { 33 foo = "bar" 34 } 35 size = 1 36 }`) 37 38 resource.Test(t, resource.TestCase{ 39 PreCheck: func() { testAccPreCheck(t) }, 40 Providers: testAccProviders, 41 CheckDestroy: testAccCheckBlockStorageV2VolumeDestroy, 42 Steps: []resource.TestStep{ 43 resource.TestStep{ 44 Config: testAccBlockStorageV2Volume_basic, 45 Check: resource.ComposeTestCheckFunc( 46 testAccCheckBlockStorageV2VolumeExists(t, "openstack_blockstorage_volume_v2.volume_1", &volume), 47 resource.TestCheckResourceAttr("openstack_blockstorage_volume_v2.volume_1", "name", "volume_1"), 48 testAccCheckBlockStorageV2VolumeMetadata(&volume, "foo", "bar"), 49 ), 50 }, 51 resource.TestStep{ 52 Config: testAccBlockStorageV2Volume_update, 53 Check: resource.ComposeTestCheckFunc( 54 testAccCheckBlockStorageV2VolumeExists(t, "openstack_blockstorage_volume_v2.volume_1", &volume), 55 resource.TestCheckResourceAttr("openstack_blockstorage_volume_v2.volume_1", "name", "volume_1-updated"), 56 testAccCheckBlockStorageV2VolumeMetadata(&volume, "foo", "bar"), 57 ), 58 }, 59 }, 60 }) 61 } 62 63 func TestAccBlockStorageV2Volume_bootable(t *testing.T) { 64 var volume volumes.Volume 65 66 var testAccBlockStorageV2Volume_bootable = fmt.Sprintf(` 67 resource "openstack_blockstorage_volume_v2" "volume_1" { 68 name = "volume_1-bootable" 69 size = 5 70 image_id = "%s" 71 }`, 72 os.Getenv("OS_IMAGE_ID")) 73 74 resource.Test(t, resource.TestCase{ 75 PreCheck: func() { testAccPreCheck(t) }, 76 Providers: testAccProviders, 77 CheckDestroy: testAccCheckBlockStorageV2VolumeDestroy, 78 Steps: []resource.TestStep{ 79 resource.TestStep{ 80 Config: testAccBlockStorageV2Volume_bootable, 81 Check: resource.ComposeTestCheckFunc( 82 testAccCheckBlockStorageV2VolumeExists(t, "openstack_blockstorage_volume_v2.volume_1", &volume), 83 resource.TestCheckResourceAttr("openstack_blockstorage_volume_v2.volume_1", "name", "volume_1-bootable"), 84 ), 85 }, 86 }, 87 }) 88 } 89 90 func testAccCheckBlockStorageV2VolumeDestroy(s *terraform.State) error { 91 config := testAccProvider.Meta().(*Config) 92 blockStorageClient, err := config.blockStorageV2Client(OS_REGION_NAME) 93 if err != nil { 94 return fmt.Errorf("Error creating OpenStack block storage client: %s", err) 95 } 96 97 for _, rs := range s.RootModule().Resources { 98 if rs.Type != "openstack_blockstorage_volume_v2" { 99 continue 100 } 101 102 _, err := volumes.Get(blockStorageClient, rs.Primary.ID).Extract() 103 if err == nil { 104 return fmt.Errorf("Volume still exists") 105 } 106 } 107 108 return nil 109 } 110 111 func testAccCheckBlockStorageV2VolumeExists(t *testing.T, n string, volume *volumes.Volume) resource.TestCheckFunc { 112 return func(s *terraform.State) error { 113 rs, ok := s.RootModule().Resources[n] 114 if !ok { 115 return fmt.Errorf("Not found: %s", n) 116 } 117 118 if rs.Primary.ID == "" { 119 return fmt.Errorf("No ID is set") 120 } 121 122 config := testAccProvider.Meta().(*Config) 123 blockStorageClient, err := config.blockStorageV2Client(OS_REGION_NAME) 124 if err != nil { 125 return fmt.Errorf("Error creating OpenStack block storage client: %s", err) 126 } 127 128 found, err := volumes.Get(blockStorageClient, rs.Primary.ID).Extract() 129 if err != nil { 130 return err 131 } 132 133 if found.ID != rs.Primary.ID { 134 return fmt.Errorf("Volume not found") 135 } 136 137 *volume = *found 138 139 return nil 140 } 141 } 142 143 func testAccCheckBlockStorageV2VolumeDoesNotExist(t *testing.T, n string, volume *volumes.Volume) resource.TestCheckFunc { 144 return func(s *terraform.State) error { 145 config := testAccProvider.Meta().(*Config) 146 blockStorageClient, err := config.blockStorageV2Client(OS_REGION_NAME) 147 if err != nil { 148 return fmt.Errorf("Error creating OpenStack block storage client: %s", err) 149 } 150 151 _, err = volumes.Get(blockStorageClient, volume.ID).Extract() 152 if err != nil { 153 errCode, ok := err.(*gophercloud.UnexpectedResponseCodeError) 154 if !ok { 155 return err 156 } 157 if errCode.Actual == 404 { 158 return nil 159 } 160 return err 161 } 162 163 return fmt.Errorf("Volume still exists") 164 } 165 } 166 167 func testAccCheckBlockStorageV2VolumeMetadata( 168 volume *volumes.Volume, k string, v string) resource.TestCheckFunc { 169 return func(s *terraform.State) error { 170 if volume.Metadata == nil { 171 return fmt.Errorf("No metadata") 172 } 173 174 for key, value := range volume.Metadata { 175 if k != key { 176 continue 177 } 178 179 if v == value { 180 return nil 181 } 182 183 return fmt.Errorf("Bad value for %s: %s", k, value) 184 } 185 186 return fmt.Errorf("Metadata not found: %s", k) 187 } 188 }