github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/digitalocean/datasource_digitalocean_image_test.go (about)

     1  package digitalocean
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"log"
     7  	"regexp"
     8  	"testing"
     9  
    10  	"github.com/digitalocean/godo"
    11  	"github.com/hashicorp/terraform/helper/acctest"
    12  	"github.com/hashicorp/terraform/helper/resource"
    13  	"github.com/hashicorp/terraform/terraform"
    14  )
    15  
    16  func TestAccDigitalOceanImage_Basic(t *testing.T) {
    17  	var droplet godo.Droplet
    18  	var snapshotsId []int
    19  	rInt := acctest.RandInt()
    20  
    21  	resource.Test(t, resource.TestCase{
    22  		PreCheck:     func() { testAccPreCheck(t) },
    23  		Providers:    testAccProviders,
    24  		CheckDestroy: testAccCheckDigitalOceanDropletDestroy,
    25  		Steps: []resource.TestStep{
    26  			{
    27  				Config: testAccCheckDigitalOceanDropletConfig_basic(rInt),
    28  				Check: resource.ComposeTestCheckFunc(
    29  					testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet),
    30  					takeSnapshotsOfDroplet(rInt, &droplet, &snapshotsId),
    31  				),
    32  			},
    33  			{
    34  				Config: testAccCheckDigitalOceanImageConfig_basic(rInt, 1),
    35  				Check: resource.ComposeTestCheckFunc(
    36  					resource.TestCheckResourceAttr(
    37  						"data.digitalocean_image.foobar", "name", fmt.Sprintf("snap-%d-1", rInt)),
    38  					resource.TestCheckResourceAttr(
    39  						"data.digitalocean_image.foobar", "min_disk_size", "20"),
    40  					resource.TestCheckResourceAttr(
    41  						"data.digitalocean_image.foobar", "private", "true"),
    42  					resource.TestCheckResourceAttr(
    43  						"data.digitalocean_image.foobar", "type", "snapshot"),
    44  				),
    45  			},
    46  			{
    47  				Config:      testAccCheckDigitalOceanImageConfig_basic(rInt, 0),
    48  				ExpectError: regexp.MustCompile(`.*too many user images found with name snap-.*\ .found 2, expected 1.`),
    49  			},
    50  			{
    51  				Config:      testAccCheckDigitalOceanImageConfig_nonexisting(rInt),
    52  				Destroy:     false,
    53  				ExpectError: regexp.MustCompile(`.*no user image found with name snap-.*-nonexisting`),
    54  			},
    55  			{
    56  				Config: " ",
    57  				Check: resource.ComposeTestCheckFunc(
    58  					deleteSnapshots(&snapshotsId),
    59  				),
    60  			},
    61  		},
    62  	})
    63  }
    64  
    65  func takeSnapshotsOfDroplet(rInt int, droplet *godo.Droplet, snapshotsId *[]int) resource.TestCheckFunc {
    66  	return func(s *terraform.State) error {
    67  		client := testAccProvider.Meta().(*godo.Client)
    68  		for i := 0; i < 3; i++ {
    69  			err := takeSnapshotOfDroplet(rInt, i%2, droplet)
    70  			if err != nil {
    71  				return err
    72  			}
    73  		}
    74  		retrieveDroplet, _, err := client.Droplets.Get(context.Background(), (*droplet).ID)
    75  		if err != nil {
    76  			return err
    77  		}
    78  		*snapshotsId = retrieveDroplet.SnapshotIDs
    79  		return nil
    80  	}
    81  }
    82  
    83  func takeSnapshotOfDroplet(rInt, sInt int, droplet *godo.Droplet) error {
    84  	client := testAccProvider.Meta().(*godo.Client)
    85  	action, _, err := client.DropletActions.Snapshot(context.Background(), (*droplet).ID, fmt.Sprintf("snap-%d-%d", rInt, sInt))
    86  	if err != nil {
    87  		return err
    88  	}
    89  	waitForAction(client, action)
    90  	return nil
    91  }
    92  
    93  func deleteSnapshots(snapshotsId *[]int) resource.TestCheckFunc {
    94  	return func(s *terraform.State) error {
    95  		log.Printf("XXX Deleting snaps")
    96  		client := testAccProvider.Meta().(*godo.Client)
    97  		snapshots := *snapshotsId
    98  		for _, value := range snapshots {
    99  			log.Printf("XXX Deleting %d", value)
   100  			_, err := client.Images.Delete(context.Background(), value)
   101  			if err != nil {
   102  				return err
   103  			}
   104  		}
   105  		return nil
   106  	}
   107  }
   108  
   109  func testAccCheckDigitalOceanImageConfig_basic(rInt, sInt int) string {
   110  	return fmt.Sprintf(`
   111  data "digitalocean_image" "foobar" {
   112    name               = "snap-%d-%d"
   113  }
   114  `, rInt, sInt)
   115  }
   116  
   117  func testAccCheckDigitalOceanImageConfig_nonexisting(rInt int) string {
   118  	return fmt.Sprintf(`
   119  data "digitalocean_image" "foobar" {
   120    name               = "snap-%d-nonexisting"
   121  }
   122  `, rInt)
   123  }