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  }