github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/builtin/providers/google/resource_compute_disk_test.go (about) 1 package google 2 3 import ( 4 "fmt" 5 "os" 6 "strconv" 7 "testing" 8 9 "github.com/hashicorp/terraform/helper/acctest" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 "google.golang.org/api/compute/v1" 13 ) 14 15 func TestAccComputeDisk_basic(t *testing.T) { 16 diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 17 var disk compute.Disk 18 19 resource.Test(t, resource.TestCase{ 20 PreCheck: func() { testAccPreCheck(t) }, 21 Providers: testAccProviders, 22 CheckDestroy: testAccCheckComputeDiskDestroy, 23 Steps: []resource.TestStep{ 24 resource.TestStep{ 25 Config: testAccComputeDisk_basic(diskName), 26 Check: resource.ComposeTestCheckFunc( 27 testAccCheckComputeDiskExists( 28 "google_compute_disk.foobar", &disk), 29 ), 30 }, 31 }, 32 }) 33 } 34 35 func TestAccComputeDisk_fromSnapshotURI(t *testing.T) { 36 diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 37 firstDiskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 38 snapshotName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 39 var xpn_host = os.Getenv("GOOGLE_XPN_HOST_PROJECT") 40 41 var disk compute.Disk 42 43 resource.Test(t, resource.TestCase{ 44 PreCheck: func() { testAccPreCheck(t) }, 45 Providers: testAccProviders, 46 CheckDestroy: testAccCheckComputeDiskDestroy, 47 Steps: []resource.TestStep{ 48 resource.TestStep{ 49 Config: testAccComputeDisk_fromSnapshotURI(firstDiskName, snapshotName, diskName, xpn_host), 50 Check: resource.ComposeTestCheckFunc( 51 testAccCheckComputeDiskExists( 52 "google_compute_disk.seconddisk", &disk), 53 ), 54 }, 55 }, 56 }) 57 } 58 59 func TestAccComputeDisk_encryption(t *testing.T) { 60 diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 61 var disk compute.Disk 62 63 resource.Test(t, resource.TestCase{ 64 PreCheck: func() { testAccPreCheck(t) }, 65 Providers: testAccProviders, 66 CheckDestroy: testAccCheckComputeDiskDestroy, 67 Steps: []resource.TestStep{ 68 resource.TestStep{ 69 Config: testAccComputeDisk_encryption(diskName), 70 Check: resource.ComposeTestCheckFunc( 71 testAccCheckComputeDiskExists( 72 "google_compute_disk.foobar", &disk), 73 testAccCheckEncryptionKey( 74 "google_compute_disk.foobar", &disk), 75 ), 76 }, 77 }, 78 }) 79 } 80 81 func TestAccComputeDisk_deleteDetach(t *testing.T) { 82 diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 83 instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 84 var disk compute.Disk 85 86 resource.Test(t, resource.TestCase{ 87 PreCheck: func() { testAccPreCheck(t) }, 88 Providers: testAccProviders, 89 CheckDestroy: testAccCheckComputeDiskDestroy, 90 Steps: []resource.TestStep{ 91 resource.TestStep{ 92 Config: testAccComputeDisk_deleteDetach(instanceName, diskName), 93 Check: resource.ComposeTestCheckFunc( 94 testAccCheckComputeDiskExists( 95 "google_compute_disk.foo", &disk), 96 ), 97 }, 98 // this needs to be a second step so we refresh and see the instance 99 // listed as attached to the disk; the instance is created after the 100 // disk. and the disk's properties aren't refreshed unless there's 101 // another step 102 resource.TestStep{ 103 Config: testAccComputeDisk_deleteDetach(instanceName, diskName), 104 Check: resource.ComposeTestCheckFunc( 105 testAccCheckComputeDiskExists( 106 "google_compute_disk.foo", &disk), 107 testAccCheckComputeDiskInstances( 108 "google_compute_disk.foo", &disk), 109 ), 110 }, 111 }, 112 }) 113 } 114 115 func testAccCheckComputeDiskDestroy(s *terraform.State) error { 116 config := testAccProvider.Meta().(*Config) 117 118 for _, rs := range s.RootModule().Resources { 119 if rs.Type != "google_compute_disk" { 120 continue 121 } 122 123 _, err := config.clientCompute.Disks.Get( 124 config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do() 125 if err == nil { 126 return fmt.Errorf("Disk still exists") 127 } 128 } 129 130 return nil 131 } 132 133 func testAccCheckComputeDiskExists(n string, disk *compute.Disk) resource.TestCheckFunc { 134 return func(s *terraform.State) error { 135 rs, ok := s.RootModule().Resources[n] 136 if !ok { 137 return fmt.Errorf("Not found: %s", n) 138 } 139 140 if rs.Primary.ID == "" { 141 return fmt.Errorf("No ID is set") 142 } 143 144 config := testAccProvider.Meta().(*Config) 145 146 found, err := config.clientCompute.Disks.Get( 147 config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do() 148 if err != nil { 149 return err 150 } 151 152 if found.Name != rs.Primary.ID { 153 return fmt.Errorf("Disk not found") 154 } 155 156 *disk = *found 157 158 return nil 159 } 160 } 161 162 func testAccCheckEncryptionKey(n string, disk *compute.Disk) resource.TestCheckFunc { 163 return func(s *terraform.State) error { 164 rs, ok := s.RootModule().Resources[n] 165 if !ok { 166 return fmt.Errorf("Not found: %s", n) 167 } 168 169 attr := rs.Primary.Attributes["disk_encryption_key_sha256"] 170 if disk.DiskEncryptionKey == nil && attr != "" { 171 return fmt.Errorf("Disk %s has mismatched encryption key.\nTF State: %+v\nGCP State: <empty>", n, attr) 172 } 173 174 if attr != disk.DiskEncryptionKey.Sha256 { 175 return fmt.Errorf("Disk %s has mismatched encryption key.\nTF State: %+v.\nGCP State: %+v", 176 n, attr, disk.DiskEncryptionKey.Sha256) 177 } 178 return nil 179 } 180 } 181 182 func testAccCheckComputeDiskInstances(n string, disk *compute.Disk) resource.TestCheckFunc { 183 return func(s *terraform.State) error { 184 rs, ok := s.RootModule().Resources[n] 185 if !ok { 186 return fmt.Errorf("Not found: %s", n) 187 } 188 189 attr := rs.Primary.Attributes["users.#"] 190 if strconv.Itoa(len(disk.Users)) != attr { 191 return fmt.Errorf("Disk %s has mismatched users.\nTF State: %+v\nGCP State: %+v", n, rs.Primary.Attributes["users"], disk.Users) 192 } 193 194 for pos, user := range disk.Users { 195 if rs.Primary.Attributes["users."+strconv.Itoa(pos)] != user { 196 return fmt.Errorf("Disk %s has mismatched users.\nTF State: %+v.\nGCP State: %+v", 197 n, rs.Primary.Attributes["users"], disk.Users) 198 } 199 } 200 return nil 201 } 202 } 203 204 func testAccComputeDisk_basic(diskName string) string { 205 return fmt.Sprintf(` 206 resource "google_compute_disk" "foobar" { 207 name = "%s" 208 image = "debian-8-jessie-v20160803" 209 size = 50 210 type = "pd-ssd" 211 zone = "us-central1-a" 212 }`, diskName) 213 } 214 215 func testAccComputeDisk_fromSnapshotURI(firstDiskName, snapshotName, diskName, xpn_host string) string { 216 return fmt.Sprintf(` 217 resource "google_compute_disk" "foobar" { 218 name = "%s" 219 image = "debian-8-jessie-v20160803" 220 size = 50 221 type = "pd-ssd" 222 zone = "us-central1-a" 223 project = "%s" 224 } 225 226 resource "google_compute_snapshot" "snapdisk" { 227 name = "%s" 228 source_disk = "${google_compute_disk.foobar.name}" 229 zone = "us-central1-a" 230 project = "%s" 231 } 232 resource "google_compute_disk" "seconddisk" { 233 name = "%s" 234 snapshot = "${google_compute_snapshot.snapdisk.self_link}" 235 type = "pd-ssd" 236 zone = "us-central1-a" 237 }`, firstDiskName, xpn_host, snapshotName, xpn_host, diskName) 238 } 239 240 func testAccComputeDisk_encryption(diskName string) string { 241 return fmt.Sprintf(` 242 resource "google_compute_disk" "foobar" { 243 name = "%s" 244 image = "debian-8-jessie-v20160803" 245 size = 50 246 type = "pd-ssd" 247 zone = "us-central1-a" 248 disk_encryption_key_raw = "SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0=" 249 }`, diskName) 250 } 251 252 func testAccComputeDisk_deleteDetach(instanceName, diskName string) string { 253 return fmt.Sprintf(` 254 resource "google_compute_disk" "foo" { 255 name = "%s" 256 image = "debian-8" 257 size = 50 258 type = "pd-ssd" 259 zone = "us-central1-a" 260 } 261 262 resource "google_compute_instance" "bar" { 263 name = "%s" 264 machine_type = "n1-standard-1" 265 zone = "us-central1-a" 266 267 disk { 268 image = "debian-8" 269 } 270 271 disk { 272 disk = "${google_compute_disk.foo.name}" 273 auto_delete = false 274 } 275 276 network_interface { 277 network = "default" 278 } 279 }`, diskName, instanceName) 280 }