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 }