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))