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