func testAccCheckComputeV2InstanceBootVolumeAttachment( instance *servers.Server) resource.TestCheckFunc { return func(s *terraform.State) error { var attachments []volumeattach.VolumeAttachment config := testAccProvider.Meta().(*Config) computeClient, err := config.computeV2Client(OS_REGION_NAME) if err != nil { return err } err = volumeattach.List(computeClient, instance.ID).EachPage(func(page pagination.Page) (bool, error) { actual, err := volumeattach.ExtractVolumeAttachments(page) if err != nil { return false, fmt.Errorf("Unable to lookup attachment: %s", err) } attachments = actual return true, nil }) if len(attachments) == 1 { return nil } return fmt.Errorf("No attached volume found.") } }
func testAccCheckComputeV2InstanceVolumeAttachment( instance *servers.Server, volume *volumes.Volume) resource.TestCheckFunc { return func(s *terraform.State) error { var attachments []volumeattach.VolumeAttachment config := testAccProvider.Meta().(*Config) computeClient, err := config.computeV2Client(OS_REGION_NAME) if err != nil { return err } err = volumeattach.List(computeClient, instance.ID).EachPage(func(page pagination.Page) (bool, error) { actual, err := volumeattach.ExtractVolumeAttachments(page) if err != nil { return false, fmt.Errorf("Unable to lookup attachment: %s", err) } attachments = actual return true, nil }) for _, attachment := range attachments { if attachment.VolumeID == volume.ID { return nil } } return fmt.Errorf("Volume not found: %s", volume.ID) } }
func TestList(t *testing.T) { th.SetupHTTP() defer th.TeardownHTTP() HandleListSuccessfully(t) serverID := "4d8c3732-a248-40ed-bebc-539a6ffd25c0" count := 0 err := volumeattach.List(client.ServiceClient(), serverID).EachPage(func(page pagination.Page) (bool, error) { count++ actual, err := volumeattach.ExtractVolumeAttachments(page) th.AssertNoErr(t, err) th.CheckDeepEquals(t, ExpectedVolumeAttachmentSlice, actual) return true, nil }) th.AssertNoErr(t, err) th.CheckEquals(t, 1, count) }
func testAccCheckComputeV2InstanceVolumeDetached(instance *servers.Server, volume_id string) resource.TestCheckFunc { return func(s *terraform.State) error { var attachments []volumeattach.VolumeAttachment rs, ok := s.RootModule().Resources[volume_id] if !ok { return fmt.Errorf("Not found: %s", volume_id) } if rs.Primary.ID == "" { return fmt.Errorf("No ID is set") } config := testAccProvider.Meta().(*Config) computeClient, err := config.computeV2Client(OS_REGION_NAME) if err != nil { return err } err = volumeattach.List(computeClient, instance.ID).EachPage( func(page pagination.Page) (bool, error) { actual, err := volumeattach.ExtractVolumeAttachments(page) if err != nil { return false, fmt.Errorf("Unable to lookup attachment: %s", err) } attachments = actual return true, nil }) for _, attachment := range attachments { if attachment.VolumeID == rs.Primary.ID { return fmt.Errorf("Volume is still attached.") } } return nil } }
func getVolumeAttachments(computeClient *gophercloud.ServiceClient, d *schema.ResourceData) error { var vols []map[string]interface{} allPages, err := volumeattach.List(computeClient, d.Id()).AllPages() if err != nil { return err } allVolumeAttachments, err := volumeattach.ExtractVolumeAttachments(allPages) if err != nil { return err } if v, ok := d.GetOk("volume"); ok { volumes := v.(*schema.Set).List() for _, volume := range volumes { if volumeMap, ok := volume.(map[string]interface{}); ok { if v, ok := volumeMap["volume_id"].(string); ok { for _, volumeAttachment := range allVolumeAttachments { if v == volumeAttachment.ID { vol := make(map[string]interface{}) vol["id"] = volumeAttachment.ID vol["volume_id"] = volumeAttachment.VolumeID vol["device"] = volumeAttachment.Device vols = append(vols, vol) } } } } } } log.Printf("[INFO] Volume attachments: %v", vols) d.Set("volume", vols) return nil }