github.com/aspring/terraform@v0.8.2-0.20161216122603-6a8619a5db2e/builtin/providers/google/resource_compute_instance_template_test.go (about) 1 package google 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/hashicorp/terraform/helper/acctest" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 "google.golang.org/api/compute/v1" 12 ) 13 14 func TestAccComputeInstanceTemplate_basic(t *testing.T) { 15 var instanceTemplate compute.InstanceTemplate 16 17 resource.Test(t, resource.TestCase{ 18 PreCheck: func() { testAccPreCheck(t) }, 19 Providers: testAccProviders, 20 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 21 Steps: []resource.TestStep{ 22 resource.TestStep{ 23 Config: testAccComputeInstanceTemplate_basic, 24 Check: resource.ComposeTestCheckFunc( 25 testAccCheckComputeInstanceTemplateExists( 26 "google_compute_instance_template.foobar", &instanceTemplate), 27 testAccCheckComputeInstanceTemplateTag(&instanceTemplate, "foo"), 28 testAccCheckComputeInstanceTemplateMetadata(&instanceTemplate, "foo", "bar"), 29 testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20160803", true, true), 30 ), 31 }, 32 }, 33 }) 34 } 35 36 func TestAccComputeInstanceTemplate_IP(t *testing.T) { 37 var instanceTemplate compute.InstanceTemplate 38 39 resource.Test(t, resource.TestCase{ 40 PreCheck: func() { testAccPreCheck(t) }, 41 Providers: testAccProviders, 42 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 43 Steps: []resource.TestStep{ 44 resource.TestStep{ 45 Config: testAccComputeInstanceTemplate_ip, 46 Check: resource.ComposeTestCheckFunc( 47 testAccCheckComputeInstanceTemplateExists( 48 "google_compute_instance_template.foobar", &instanceTemplate), 49 testAccCheckComputeInstanceTemplateNetwork(&instanceTemplate), 50 ), 51 }, 52 }, 53 }) 54 } 55 56 func TestAccComputeInstanceTemplate_disks(t *testing.T) { 57 var instanceTemplate compute.InstanceTemplate 58 59 resource.Test(t, resource.TestCase{ 60 PreCheck: func() { testAccPreCheck(t) }, 61 Providers: testAccProviders, 62 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 63 Steps: []resource.TestStep{ 64 resource.TestStep{ 65 Config: testAccComputeInstanceTemplate_disks, 66 Check: resource.ComposeTestCheckFunc( 67 testAccCheckComputeInstanceTemplateExists( 68 "google_compute_instance_template.foobar", &instanceTemplate), 69 testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20160803", true, true), 70 testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "terraform-test-foobar", false, false), 71 ), 72 }, 73 }, 74 }) 75 } 76 77 func TestAccComputeInstanceTemplate_subnet_auto(t *testing.T) { 78 var instanceTemplate compute.InstanceTemplate 79 network := "network-" + acctest.RandString(10) 80 81 resource.Test(t, resource.TestCase{ 82 PreCheck: func() { testAccPreCheck(t) }, 83 Providers: testAccProviders, 84 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 85 Steps: []resource.TestStep{ 86 resource.TestStep{ 87 Config: testAccComputeInstanceTemplate_subnet_auto(network), 88 Check: resource.ComposeTestCheckFunc( 89 testAccCheckComputeInstanceTemplateExists( 90 "google_compute_instance_template.foobar", &instanceTemplate), 91 testAccCheckComputeInstanceTemplateNetworkName(&instanceTemplate, network), 92 ), 93 }, 94 }, 95 }) 96 } 97 98 func TestAccComputeInstanceTemplate_subnet_custom(t *testing.T) { 99 var instanceTemplate compute.InstanceTemplate 100 101 resource.Test(t, resource.TestCase{ 102 PreCheck: func() { testAccPreCheck(t) }, 103 Providers: testAccProviders, 104 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 105 Steps: []resource.TestStep{ 106 resource.TestStep{ 107 Config: testAccComputeInstanceTemplate_subnet_custom, 108 Check: resource.ComposeTestCheckFunc( 109 testAccCheckComputeInstanceTemplateExists( 110 "google_compute_instance_template.foobar", &instanceTemplate), 111 testAccCheckComputeInstanceTemplateSubnetwork(&instanceTemplate), 112 ), 113 }, 114 }, 115 }) 116 } 117 118 func TestAccComputeInstanceTemplate_metadata_startup_script(t *testing.T) { 119 var instanceTemplate compute.InstanceTemplate 120 121 resource.Test(t, resource.TestCase{ 122 PreCheck: func() { testAccPreCheck(t) }, 123 Providers: testAccProviders, 124 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 125 Steps: []resource.TestStep{ 126 resource.TestStep{ 127 Config: testAccComputeInstanceTemplate_startup_script, 128 Check: resource.ComposeTestCheckFunc( 129 testAccCheckComputeInstanceTemplateExists( 130 "google_compute_instance_template.foobar", &instanceTemplate), 131 testAccCheckComputeInstanceTemplateStartupScript(&instanceTemplate, "echo 'Hello'"), 132 ), 133 }, 134 }, 135 }) 136 } 137 138 func testAccCheckComputeInstanceTemplateDestroy(s *terraform.State) error { 139 config := testAccProvider.Meta().(*Config) 140 141 for _, rs := range s.RootModule().Resources { 142 if rs.Type != "google_compute_instance_template" { 143 continue 144 } 145 146 _, err := config.clientCompute.InstanceTemplates.Get( 147 config.Project, rs.Primary.ID).Do() 148 if err == nil { 149 return fmt.Errorf("Instance template still exists") 150 } 151 } 152 153 return nil 154 } 155 156 func testAccCheckComputeInstanceTemplateExists(n string, instanceTemplate *compute.InstanceTemplate) resource.TestCheckFunc { 157 return func(s *terraform.State) error { 158 rs, ok := s.RootModule().Resources[n] 159 if !ok { 160 return fmt.Errorf("Not found: %s", n) 161 } 162 163 if rs.Primary.ID == "" { 164 return fmt.Errorf("No ID is set") 165 } 166 167 config := testAccProvider.Meta().(*Config) 168 169 found, err := config.clientCompute.InstanceTemplates.Get( 170 config.Project, rs.Primary.ID).Do() 171 if err != nil { 172 return err 173 } 174 175 if found.Name != rs.Primary.ID { 176 return fmt.Errorf("Instance template not found") 177 } 178 179 *instanceTemplate = *found 180 181 return nil 182 } 183 } 184 185 func testAccCheckComputeInstanceTemplateMetadata( 186 instanceTemplate *compute.InstanceTemplate, 187 k string, v string) resource.TestCheckFunc { 188 return func(s *terraform.State) error { 189 if instanceTemplate.Properties.Metadata == nil { 190 return fmt.Errorf("no metadata") 191 } 192 193 for _, item := range instanceTemplate.Properties.Metadata.Items { 194 if k != item.Key { 195 continue 196 } 197 198 if item.Value != nil && v == *item.Value { 199 return nil 200 } 201 202 return fmt.Errorf("bad value for %s: %s", k, *item.Value) 203 } 204 205 return fmt.Errorf("metadata not found: %s", k) 206 } 207 } 208 209 func testAccCheckComputeInstanceTemplateNetwork(instanceTemplate *compute.InstanceTemplate) resource.TestCheckFunc { 210 return func(s *terraform.State) error { 211 for _, i := range instanceTemplate.Properties.NetworkInterfaces { 212 for _, c := range i.AccessConfigs { 213 if c.NatIP == "" { 214 return fmt.Errorf("no NAT IP") 215 } 216 } 217 } 218 219 return nil 220 } 221 } 222 223 func testAccCheckComputeInstanceTemplateNetworkName(instanceTemplate *compute.InstanceTemplate, network string) resource.TestCheckFunc { 224 return func(s *terraform.State) error { 225 for _, i := range instanceTemplate.Properties.NetworkInterfaces { 226 if !strings.Contains(i.Network, network) { 227 return fmt.Errorf("Network doesn't match expected value, Expected: %s Actual: %s", network, i.Network[strings.LastIndex("/", i.Network)+1:]) 228 } 229 } 230 231 return nil 232 } 233 } 234 235 func testAccCheckComputeInstanceTemplateDisk(instanceTemplate *compute.InstanceTemplate, source string, delete bool, boot bool) resource.TestCheckFunc { 236 return func(s *terraform.State) error { 237 if instanceTemplate.Properties.Disks == nil { 238 return fmt.Errorf("no disks") 239 } 240 241 for _, disk := range instanceTemplate.Properties.Disks { 242 if disk.InitializeParams == nil { 243 // Check disk source 244 if disk.Source == source { 245 if disk.AutoDelete == delete && disk.Boot == boot { 246 return nil 247 } 248 } 249 } else { 250 // Check source image 251 if disk.InitializeParams.SourceImage == source { 252 if disk.AutoDelete == delete && disk.Boot == boot { 253 return nil 254 } 255 } 256 } 257 } 258 259 return fmt.Errorf("Disk not found: %s", source) 260 } 261 } 262 263 func testAccCheckComputeInstanceTemplateSubnetwork(instanceTemplate *compute.InstanceTemplate) resource.TestCheckFunc { 264 return func(s *terraform.State) error { 265 for _, i := range instanceTemplate.Properties.NetworkInterfaces { 266 if i.Subnetwork == "" { 267 return fmt.Errorf("no subnet") 268 } 269 } 270 271 return nil 272 } 273 } 274 275 func testAccCheckComputeInstanceTemplateTag(instanceTemplate *compute.InstanceTemplate, n string) resource.TestCheckFunc { 276 return func(s *terraform.State) error { 277 if instanceTemplate.Properties.Tags == nil { 278 return fmt.Errorf("no tags") 279 } 280 281 for _, k := range instanceTemplate.Properties.Tags.Items { 282 if k == n { 283 return nil 284 } 285 } 286 287 return fmt.Errorf("tag not found: %s", n) 288 } 289 } 290 291 func testAccCheckComputeInstanceTemplateStartupScript(instanceTemplate *compute.InstanceTemplate, n string) resource.TestCheckFunc { 292 return func(s *terraform.State) error { 293 if instanceTemplate.Properties.Metadata == nil && n == "" { 294 return nil 295 } else if instanceTemplate.Properties.Metadata == nil && n != "" { 296 return fmt.Errorf("Expected metadata.startup-script to be '%s', metadata wasn't set at all", n) 297 } 298 for _, item := range instanceTemplate.Properties.Metadata.Items { 299 if item.Key != "startup-script" { 300 continue 301 } 302 if item.Value != nil && *item.Value == n { 303 return nil 304 } else if item.Value == nil && n == "" { 305 return nil 306 } else if item.Value == nil && n != "" { 307 return fmt.Errorf("Expected metadata.startup-script to be '%s', wasn't set", n) 308 } else if *item.Value != n { 309 return fmt.Errorf("Expected metadata.startup-script to be '%s', got '%s'", n, *item.Value) 310 } 311 } 312 return fmt.Errorf("This should never be reached.") 313 } 314 } 315 316 var testAccComputeInstanceTemplate_basic = fmt.Sprintf(` 317 resource "google_compute_instance_template" "foobar" { 318 name = "instancet-test-%s" 319 machine_type = "n1-standard-1" 320 can_ip_forward = false 321 tags = ["foo", "bar"] 322 323 disk { 324 source_image = "debian-8-jessie-v20160803" 325 auto_delete = true 326 boot = true 327 } 328 329 network_interface { 330 network = "default" 331 } 332 333 scheduling { 334 preemptible = false 335 automatic_restart = true 336 } 337 338 metadata { 339 foo = "bar" 340 } 341 342 service_account { 343 scopes = ["userinfo-email", "compute-ro", "storage-ro"] 344 } 345 }`, acctest.RandString(10)) 346 347 var testAccComputeInstanceTemplate_ip = fmt.Sprintf(` 348 resource "google_compute_address" "foo" { 349 name = "instancet-test-%s" 350 } 351 352 resource "google_compute_instance_template" "foobar" { 353 name = "instancet-test-%s" 354 machine_type = "n1-standard-1" 355 tags = ["foo", "bar"] 356 357 disk { 358 source_image = "debian-8-jessie-v20160803" 359 } 360 361 network_interface { 362 network = "default" 363 access_config { 364 nat_ip = "${google_compute_address.foo.address}" 365 } 366 } 367 368 metadata { 369 foo = "bar" 370 } 371 }`, acctest.RandString(10), acctest.RandString(10)) 372 373 var testAccComputeInstanceTemplate_disks = fmt.Sprintf(` 374 resource "google_compute_disk" "foobar" { 375 name = "instancet-test-%s" 376 image = "debian-8-jessie-v20160803" 377 size = 10 378 type = "pd-ssd" 379 zone = "us-central1-a" 380 } 381 382 resource "google_compute_instance_template" "foobar" { 383 name = "instancet-test-%s" 384 machine_type = "n1-standard-1" 385 386 disk { 387 source_image = "debian-8-jessie-v20160803" 388 auto_delete = true 389 disk_size_gb = 100 390 boot = true 391 } 392 393 disk { 394 source = "terraform-test-foobar" 395 auto_delete = false 396 boot = false 397 } 398 399 network_interface { 400 network = "default" 401 } 402 403 metadata { 404 foo = "bar" 405 } 406 }`, acctest.RandString(10), acctest.RandString(10)) 407 408 func testAccComputeInstanceTemplate_subnet_auto(network string) string { 409 return fmt.Sprintf(` 410 resource "google_compute_network" "auto-network" { 411 name = "%s" 412 auto_create_subnetworks = true 413 } 414 415 resource "google_compute_instance_template" "foobar" { 416 name = "instance-tpl-%s" 417 machine_type = "n1-standard-1" 418 419 disk { 420 source_image = "debian-8-jessie-v20160803" 421 auto_delete = true 422 disk_size_gb = 10 423 boot = true 424 } 425 426 network_interface { 427 network = "${google_compute_network.auto-network.name}" 428 } 429 430 metadata { 431 foo = "bar" 432 } 433 }`, network, acctest.RandString(10)) 434 } 435 436 var testAccComputeInstanceTemplate_subnet_custom = fmt.Sprintf(` 437 resource "google_compute_network" "network" { 438 name = "network-%s" 439 auto_create_subnetworks = false 440 } 441 442 resource "google_compute_subnetwork" "subnetwork" { 443 name = "subnetwork-%s" 444 ip_cidr_range = "10.0.0.0/24" 445 region = "us-central1" 446 network = "${google_compute_network.network.self_link}" 447 } 448 449 resource "google_compute_instance_template" "foobar" { 450 name = "instance-test-%s" 451 machine_type = "n1-standard-1" 452 region = "us-central1" 453 454 disk { 455 source_image = "debian-8-jessie-v20160803" 456 auto_delete = true 457 disk_size_gb = 10 458 boot = true 459 } 460 461 network_interface { 462 subnetwork = "${google_compute_subnetwork.subnetwork.name}" 463 } 464 465 metadata { 466 foo = "bar" 467 } 468 }`, acctest.RandString(10), acctest.RandString(10), acctest.RandString(10)) 469 470 var testAccComputeInstanceTemplate_startup_script = fmt.Sprintf(` 471 resource "google_compute_instance_template" "foobar" { 472 name = "instance-test-%s" 473 machine_type = "n1-standard-1" 474 475 disk { 476 source_image = "debian-8-jessie-v20160803" 477 auto_delete = true 478 disk_size_gb = 10 479 boot = true 480 } 481 482 metadata { 483 foo = "bar" 484 } 485 486 network_interface{ 487 network = "default" 488 } 489 490 metadata_startup_script = "echo 'Hello'" 491 }`, acctest.RandString(10))