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)