github.com/keshavdv/terraform@v0.7.0-rc2.0.20160711232630-d69256dcb425/builtin/providers/google/resource_compute_instance_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 TestAccComputeInstance_basic_deprecated_network(t *testing.T) {
    15  	var instance compute.Instance
    16  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
    17  
    18  	resource.Test(t, resource.TestCase{
    19  		PreCheck:     func() { testAccPreCheck(t) },
    20  		Providers:    testAccProviders,
    21  		CheckDestroy: testAccCheckComputeInstanceDestroy,
    22  		Steps: []resource.TestStep{
    23  			resource.TestStep{
    24  				Config: testAccComputeInstance_basic_deprecated_network(instanceName),
    25  				Check: resource.ComposeTestCheckFunc(
    26  					testAccCheckComputeInstanceExists(
    27  						"google_compute_instance.foobar", &instance),
    28  					testAccCheckComputeInstanceTag(&instance, "foo"),
    29  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
    30  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
    31  				),
    32  			},
    33  		},
    34  	})
    35  }
    36  
    37  func TestAccComputeInstance_basic1(t *testing.T) {
    38  	var instance compute.Instance
    39  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
    40  
    41  	resource.Test(t, resource.TestCase{
    42  		PreCheck:     func() { testAccPreCheck(t) },
    43  		Providers:    testAccProviders,
    44  		CheckDestroy: testAccCheckComputeInstanceDestroy,
    45  		Steps: []resource.TestStep{
    46  			resource.TestStep{
    47  				Config: testAccComputeInstance_basic(instanceName),
    48  				Check: resource.ComposeTestCheckFunc(
    49  					testAccCheckComputeInstanceExists(
    50  						"google_compute_instance.foobar", &instance),
    51  					testAccCheckComputeInstanceTag(&instance, "foo"),
    52  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
    53  					testAccCheckComputeInstanceMetadata(&instance, "baz", "qux"),
    54  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
    55  				),
    56  			},
    57  		},
    58  	})
    59  }
    60  
    61  func TestAccComputeInstance_basic2(t *testing.T) {
    62  	var instance compute.Instance
    63  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
    64  
    65  	resource.Test(t, resource.TestCase{
    66  		PreCheck:     func() { testAccPreCheck(t) },
    67  		Providers:    testAccProviders,
    68  		CheckDestroy: testAccCheckComputeInstanceDestroy,
    69  		Steps: []resource.TestStep{
    70  			resource.TestStep{
    71  				Config: testAccComputeInstance_basic2(instanceName),
    72  				Check: resource.ComposeTestCheckFunc(
    73  					testAccCheckComputeInstanceExists(
    74  						"google_compute_instance.foobar", &instance),
    75  					testAccCheckComputeInstanceTag(&instance, "foo"),
    76  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
    77  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
    78  				),
    79  			},
    80  		},
    81  	})
    82  }
    83  
    84  func TestAccComputeInstance_basic3(t *testing.T) {
    85  	var instance compute.Instance
    86  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
    87  
    88  	resource.Test(t, resource.TestCase{
    89  		PreCheck:     func() { testAccPreCheck(t) },
    90  		Providers:    testAccProviders,
    91  		CheckDestroy: testAccCheckComputeInstanceDestroy,
    92  		Steps: []resource.TestStep{
    93  			resource.TestStep{
    94  				Config: testAccComputeInstance_basic3(instanceName),
    95  				Check: resource.ComposeTestCheckFunc(
    96  					testAccCheckComputeInstanceExists(
    97  						"google_compute_instance.foobar", &instance),
    98  					testAccCheckComputeInstanceTag(&instance, "foo"),
    99  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
   100  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   101  				),
   102  			},
   103  		},
   104  	})
   105  }
   106  
   107  func TestAccComputeInstance_IP(t *testing.T) {
   108  	var instance compute.Instance
   109  	var ipName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   110  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   111  
   112  	resource.Test(t, resource.TestCase{
   113  		PreCheck:     func() { testAccPreCheck(t) },
   114  		Providers:    testAccProviders,
   115  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   116  		Steps: []resource.TestStep{
   117  			resource.TestStep{
   118  				Config: testAccComputeInstance_ip(ipName, instanceName),
   119  				Check: resource.ComposeTestCheckFunc(
   120  					testAccCheckComputeInstanceExists(
   121  						"google_compute_instance.foobar", &instance),
   122  					testAccCheckComputeInstanceAccessConfigHasIP(&instance),
   123  				),
   124  			},
   125  		},
   126  	})
   127  }
   128  
   129  func TestAccComputeInstance_disksWithoutAutodelete(t *testing.T) {
   130  	var instance compute.Instance
   131  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   132  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   133  
   134  	resource.Test(t, resource.TestCase{
   135  		PreCheck:     func() { testAccPreCheck(t) },
   136  		Providers:    testAccProviders,
   137  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   138  		Steps: []resource.TestStep{
   139  			resource.TestStep{
   140  				Config: testAccComputeInstance_disks(diskName, instanceName, false),
   141  				Check: resource.ComposeTestCheckFunc(
   142  					testAccCheckComputeInstanceExists(
   143  						"google_compute_instance.foobar", &instance),
   144  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   145  					testAccCheckComputeInstanceDisk(&instance, diskName, false, false),
   146  				),
   147  			},
   148  		},
   149  	})
   150  }
   151  
   152  func TestAccComputeInstance_disksWithAutodelete(t *testing.T) {
   153  	var instance compute.Instance
   154  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   155  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   156  
   157  	resource.Test(t, resource.TestCase{
   158  		PreCheck:     func() { testAccPreCheck(t) },
   159  		Providers:    testAccProviders,
   160  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   161  		Steps: []resource.TestStep{
   162  			resource.TestStep{
   163  				Config: testAccComputeInstance_disks(diskName, instanceName, true),
   164  				Check: resource.ComposeTestCheckFunc(
   165  					testAccCheckComputeInstanceExists(
   166  						"google_compute_instance.foobar", &instance),
   167  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   168  					testAccCheckComputeInstanceDisk(&instance, diskName, true, false),
   169  				),
   170  			},
   171  		},
   172  	})
   173  }
   174  
   175  func TestAccComputeInstance_local_ssd(t *testing.T) {
   176  	var instance compute.Instance
   177  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   178  
   179  	resource.Test(t, resource.TestCase{
   180  		PreCheck:     func() { testAccPreCheck(t) },
   181  		Providers:    testAccProviders,
   182  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   183  		Steps: []resource.TestStep{
   184  			resource.TestStep{
   185  				Config: testAccComputeInstance_local_ssd(instanceName),
   186  				Check: resource.ComposeTestCheckFunc(
   187  					testAccCheckComputeInstanceExists(
   188  						"google_compute_instance.local-ssd", &instance),
   189  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   190  				),
   191  			},
   192  		},
   193  	})
   194  }
   195  
   196  func TestAccComputeInstance_update_deprecated_network(t *testing.T) {
   197  	var instance compute.Instance
   198  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   199  
   200  	resource.Test(t, resource.TestCase{
   201  		PreCheck:     func() { testAccPreCheck(t) },
   202  		Providers:    testAccProviders,
   203  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   204  		Steps: []resource.TestStep{
   205  			resource.TestStep{
   206  				Config: testAccComputeInstance_basic_deprecated_network(instanceName),
   207  				Check: resource.ComposeTestCheckFunc(
   208  					testAccCheckComputeInstanceExists(
   209  						"google_compute_instance.foobar", &instance),
   210  				),
   211  			},
   212  			resource.TestStep{
   213  				Config: testAccComputeInstance_update_deprecated_network(instanceName),
   214  				Check: resource.ComposeTestCheckFunc(
   215  					testAccCheckComputeInstanceExists(
   216  						"google_compute_instance.foobar", &instance),
   217  					testAccCheckComputeInstanceMetadata(
   218  						&instance, "bar", "baz"),
   219  					testAccCheckComputeInstanceTag(&instance, "baz"),
   220  				),
   221  			},
   222  		},
   223  	})
   224  }
   225  
   226  func TestAccComputeInstance_forceNewAndChangeMetadata(t *testing.T) {
   227  	var instance compute.Instance
   228  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   229  
   230  	resource.Test(t, resource.TestCase{
   231  		PreCheck:     func() { testAccPreCheck(t) },
   232  		Providers:    testAccProviders,
   233  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   234  		Steps: []resource.TestStep{
   235  			resource.TestStep{
   236  				Config: testAccComputeInstance_basic(instanceName),
   237  				Check: resource.ComposeTestCheckFunc(
   238  					testAccCheckComputeInstanceExists(
   239  						"google_compute_instance.foobar", &instance),
   240  				),
   241  			},
   242  			resource.TestStep{
   243  				Config: testAccComputeInstance_forceNewAndChangeMetadata(instanceName),
   244  				Check: resource.ComposeTestCheckFunc(
   245  					testAccCheckComputeInstanceExists(
   246  						"google_compute_instance.foobar", &instance),
   247  					testAccCheckComputeInstanceMetadata(
   248  						&instance, "qux", "true"),
   249  				),
   250  			},
   251  		},
   252  	})
   253  }
   254  
   255  func TestAccComputeInstance_update(t *testing.T) {
   256  	var instance compute.Instance
   257  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   258  
   259  	resource.Test(t, resource.TestCase{
   260  		PreCheck:     func() { testAccPreCheck(t) },
   261  		Providers:    testAccProviders,
   262  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   263  		Steps: []resource.TestStep{
   264  			resource.TestStep{
   265  				Config: testAccComputeInstance_basic(instanceName),
   266  				Check: resource.ComposeTestCheckFunc(
   267  					testAccCheckComputeInstanceExists(
   268  						"google_compute_instance.foobar", &instance),
   269  				),
   270  			},
   271  			resource.TestStep{
   272  				Config: testAccComputeInstance_update(instanceName),
   273  				Check: resource.ComposeTestCheckFunc(
   274  					testAccCheckComputeInstanceExists(
   275  						"google_compute_instance.foobar", &instance),
   276  					testAccCheckComputeInstanceMetadata(
   277  						&instance, "bar", "baz"),
   278  					testAccCheckComputeInstanceTag(&instance, "baz"),
   279  					testAccCheckComputeInstanceAccessConfig(&instance),
   280  				),
   281  			},
   282  		},
   283  	})
   284  }
   285  
   286  func TestAccComputeInstance_service_account(t *testing.T) {
   287  	var instance compute.Instance
   288  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   289  
   290  	resource.Test(t, resource.TestCase{
   291  		PreCheck:     func() { testAccPreCheck(t) },
   292  		Providers:    testAccProviders,
   293  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   294  		Steps: []resource.TestStep{
   295  			resource.TestStep{
   296  				Config: testAccComputeInstance_service_account(instanceName),
   297  				Check: resource.ComposeTestCheckFunc(
   298  					testAccCheckComputeInstanceExists(
   299  						"google_compute_instance.foobar", &instance),
   300  					testAccCheckComputeInstanceServiceAccount(&instance,
   301  						"https://www.googleapis.com/auth/compute.readonly"),
   302  					testAccCheckComputeInstanceServiceAccount(&instance,
   303  						"https://www.googleapis.com/auth/devstorage.read_only"),
   304  					testAccCheckComputeInstanceServiceAccount(&instance,
   305  						"https://www.googleapis.com/auth/userinfo.email"),
   306  				),
   307  			},
   308  		},
   309  	})
   310  }
   311  
   312  func TestAccComputeInstance_scheduling(t *testing.T) {
   313  	var instance compute.Instance
   314  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   315  
   316  	resource.Test(t, resource.TestCase{
   317  		PreCheck:     func() { testAccPreCheck(t) },
   318  		Providers:    testAccProviders,
   319  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   320  		Steps: []resource.TestStep{
   321  			resource.TestStep{
   322  				Config: testAccComputeInstance_scheduling(instanceName),
   323  				Check: resource.ComposeTestCheckFunc(
   324  					testAccCheckComputeInstanceExists(
   325  						"google_compute_instance.foobar", &instance),
   326  				),
   327  			},
   328  		},
   329  	})
   330  }
   331  
   332  func TestAccComputeInstance_subnet_auto(t *testing.T) {
   333  	var instance compute.Instance
   334  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   335  
   336  	resource.Test(t, resource.TestCase{
   337  		PreCheck:     func() { testAccPreCheck(t) },
   338  		Providers:    testAccProviders,
   339  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   340  		Steps: []resource.TestStep{
   341  			resource.TestStep{
   342  				Config: testAccComputeInstance_subnet_auto(instanceName),
   343  				Check: resource.ComposeTestCheckFunc(
   344  					testAccCheckComputeInstanceExists(
   345  						"google_compute_instance.foobar", &instance),
   346  					testAccCheckComputeInstanceHasSubnet(&instance),
   347  				),
   348  			},
   349  		},
   350  	})
   351  }
   352  
   353  func TestAccComputeInstance_subnet_custom(t *testing.T) {
   354  	var instance compute.Instance
   355  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   356  
   357  	resource.Test(t, resource.TestCase{
   358  		PreCheck:     func() { testAccPreCheck(t) },
   359  		Providers:    testAccProviders,
   360  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   361  		Steps: []resource.TestStep{
   362  			resource.TestStep{
   363  				Config: testAccComputeInstance_subnet_custom(instanceName),
   364  				Check: resource.ComposeTestCheckFunc(
   365  					testAccCheckComputeInstanceExists(
   366  						"google_compute_instance.foobar", &instance),
   367  					testAccCheckComputeInstanceHasSubnet(&instance),
   368  				),
   369  			},
   370  		},
   371  	})
   372  }
   373  
   374  func testAccCheckComputeInstanceDestroy(s *terraform.State) error {
   375  	config := testAccProvider.Meta().(*Config)
   376  
   377  	for _, rs := range s.RootModule().Resources {
   378  		if rs.Type != "google_compute_instance" {
   379  			continue
   380  		}
   381  
   382  		_, err := config.clientCompute.Instances.Get(
   383  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   384  		if err == nil {
   385  			return fmt.Errorf("Instance still exists")
   386  		}
   387  	}
   388  
   389  	return nil
   390  }
   391  
   392  func testAccCheckComputeInstanceExists(n string, instance *compute.Instance) resource.TestCheckFunc {
   393  	return func(s *terraform.State) error {
   394  		rs, ok := s.RootModule().Resources[n]
   395  		if !ok {
   396  			return fmt.Errorf("Not found: %s", n)
   397  		}
   398  
   399  		if rs.Primary.ID == "" {
   400  			return fmt.Errorf("No ID is set")
   401  		}
   402  
   403  		config := testAccProvider.Meta().(*Config)
   404  
   405  		found, err := config.clientCompute.Instances.Get(
   406  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   407  		if err != nil {
   408  			return err
   409  		}
   410  
   411  		if found.Name != rs.Primary.ID {
   412  			return fmt.Errorf("Instance not found")
   413  		}
   414  
   415  		*instance = *found
   416  
   417  		return nil
   418  	}
   419  }
   420  
   421  func testAccCheckComputeInstanceMetadata(
   422  	instance *compute.Instance,
   423  	k string, v string) resource.TestCheckFunc {
   424  	return func(s *terraform.State) error {
   425  		if instance.Metadata == nil {
   426  			return fmt.Errorf("no metadata")
   427  		}
   428  
   429  		for _, item := range instance.Metadata.Items {
   430  			if k != item.Key {
   431  				continue
   432  			}
   433  
   434  			if item.Value != nil && v == *item.Value {
   435  				return nil
   436  			}
   437  
   438  			return fmt.Errorf("bad value for %s: %s", k, *item.Value)
   439  		}
   440  
   441  		return fmt.Errorf("metadata not found: %s", k)
   442  	}
   443  }
   444  
   445  func testAccCheckComputeInstanceAccessConfig(instance *compute.Instance) resource.TestCheckFunc {
   446  	return func(s *terraform.State) error {
   447  		for _, i := range instance.NetworkInterfaces {
   448  			if len(i.AccessConfigs) == 0 {
   449  				return fmt.Errorf("no access_config")
   450  			}
   451  		}
   452  
   453  		return nil
   454  	}
   455  }
   456  
   457  func testAccCheckComputeInstanceAccessConfigHasIP(instance *compute.Instance) resource.TestCheckFunc {
   458  	return func(s *terraform.State) error {
   459  		for _, i := range instance.NetworkInterfaces {
   460  			for _, c := range i.AccessConfigs {
   461  				if c.NatIP == "" {
   462  					return fmt.Errorf("no NAT IP")
   463  				}
   464  			}
   465  		}
   466  
   467  		return nil
   468  	}
   469  }
   470  
   471  func testAccCheckComputeInstanceDisk(instance *compute.Instance, source string, delete bool, boot bool) resource.TestCheckFunc {
   472  	return func(s *terraform.State) error {
   473  		if instance.Disks == nil {
   474  			return fmt.Errorf("no disks")
   475  		}
   476  
   477  		for _, disk := range instance.Disks {
   478  			if strings.LastIndex(disk.Source, "/"+source) == len(disk.Source)-len(source)-1 && disk.AutoDelete == delete && disk.Boot == boot {
   479  				return nil
   480  			}
   481  		}
   482  
   483  		return fmt.Errorf("Disk not found: %s", source)
   484  	}
   485  }
   486  
   487  func testAccCheckComputeInstanceTag(instance *compute.Instance, n string) resource.TestCheckFunc {
   488  	return func(s *terraform.State) error {
   489  		if instance.Tags == nil {
   490  			return fmt.Errorf("no tags")
   491  		}
   492  
   493  		for _, k := range instance.Tags.Items {
   494  			if k == n {
   495  				return nil
   496  			}
   497  		}
   498  
   499  		return fmt.Errorf("tag not found: %s", n)
   500  	}
   501  }
   502  
   503  func testAccCheckComputeInstanceServiceAccount(instance *compute.Instance, scope string) resource.TestCheckFunc {
   504  	return func(s *terraform.State) error {
   505  		if count := len(instance.ServiceAccounts); count != 1 {
   506  			return fmt.Errorf("Wrong number of ServiceAccounts: expected 1, got %d", count)
   507  		}
   508  
   509  		for _, val := range instance.ServiceAccounts[0].Scopes {
   510  			if val == scope {
   511  				return nil
   512  			}
   513  		}
   514  
   515  		return fmt.Errorf("Scope not found: %s", scope)
   516  	}
   517  }
   518  
   519  func testAccCheckComputeInstanceHasSubnet(instance *compute.Instance) resource.TestCheckFunc {
   520  	return func(s *terraform.State) error {
   521  		for _, i := range instance.NetworkInterfaces {
   522  			if i.Subnetwork == "" {
   523  				return fmt.Errorf("no subnet")
   524  			}
   525  		}
   526  
   527  		return nil
   528  	}
   529  }
   530  
   531  func testAccComputeInstance_basic_deprecated_network(instance string) string {
   532  	return fmt.Sprintf(`
   533  	resource "google_compute_instance" "foobar" {
   534  		name = "%s"
   535  		machine_type = "n1-standard-1"
   536  		zone = "us-central1-a"
   537  		can_ip_forward = false
   538  		tags = ["foo", "bar"]
   539  
   540  		disk {
   541  			image = "debian-7-wheezy-v20160301"
   542  		}
   543  
   544  		network {
   545  			source = "default"
   546  		}
   547  
   548  		metadata {
   549  			foo = "bar"
   550  		}
   551  	}`, instance)
   552  }
   553  
   554  func testAccComputeInstance_update_deprecated_network(instance string) string {
   555  	return fmt.Sprintf(`
   556  	resource "google_compute_instance" "foobar" {
   557  		name = "%s"
   558  		machine_type = "n1-standard-1"
   559  		zone = "us-central1-a"
   560  		tags = ["baz"]
   561  
   562  		disk {
   563  			image = "debian-7-wheezy-v20160301"
   564  		}
   565  
   566  		network {
   567  			source = "default"
   568  		}
   569  
   570  		metadata {
   571  			bar = "baz"
   572  		}
   573  	}`, instance)
   574  }
   575  
   576  func testAccComputeInstance_basic(instance string) string {
   577  	return fmt.Sprintf(`
   578  	resource "google_compute_instance" "foobar" {
   579  		name = "%s"
   580  		machine_type = "n1-standard-1"
   581  		zone = "us-central1-a"
   582  		can_ip_forward = false
   583  		tags = ["foo", "bar"]
   584  
   585  		disk {
   586  			image = "debian-7-wheezy-v20160301"
   587  		}
   588  
   589  		network_interface {
   590  			network = "default"
   591  		}
   592  
   593  		metadata {
   594  			foo = "bar"
   595  			baz = "qux"
   596  		}
   597  
   598  		metadata_startup_script = "echo Hello"
   599  	}`, instance)
   600  }
   601  
   602  func testAccComputeInstance_basic2(instance string) string {
   603  	return fmt.Sprintf(`
   604  	resource "google_compute_instance" "foobar" {
   605  		name = "%s"
   606  		machine_type = "n1-standard-1"
   607  		zone = "us-central1-a"
   608  		can_ip_forward = false
   609  		tags = ["foo", "bar"]
   610  
   611  		disk {
   612  			image = "debian-cloud/debian-7-wheezy-v20160301"
   613  		}
   614  
   615  		network_interface {
   616  			network = "default"
   617  		}
   618  
   619  
   620  		metadata {
   621  			foo = "bar"
   622  		}
   623  	}`, instance)
   624  }
   625  
   626  func testAccComputeInstance_basic3(instance string) string {
   627  	return fmt.Sprintf(`
   628  	resource "google_compute_instance" "foobar" {
   629  		name = "%s"
   630  		machine_type = "n1-standard-1"
   631  		zone = "us-central1-a"
   632  		can_ip_forward = false
   633  		tags = ["foo", "bar"]
   634  
   635  		disk {
   636  			image = "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20160301"
   637  		}
   638  
   639  		network_interface {
   640  			network = "default"
   641  		}
   642  
   643  		metadata {
   644  			foo = "bar"
   645  		}
   646  	}`, instance)
   647  }
   648  
   649  // Update zone to ForceNew, and change metadata k/v entirely
   650  // Generates diff mismatch
   651  func testAccComputeInstance_forceNewAndChangeMetadata(instance string) string {
   652  	return fmt.Sprintf(`
   653  	resource "google_compute_instance" "foobar" {
   654  		name = "%s"
   655  		machine_type = "n1-standard-1"
   656  		zone = "us-central1-a"
   657  		zone = "us-central1-b"
   658  		tags = ["baz"]
   659  
   660  		disk {
   661  			image = "debian-7-wheezy-v20160301"
   662  		}
   663  
   664  		network_interface {
   665  			network = "default"
   666  			access_config { }
   667  		}
   668  
   669  		metadata {
   670  			qux = "true"
   671  		}
   672  	}`, instance)
   673  }
   674  
   675  // Update metadata, tags, and network_interface
   676  func testAccComputeInstance_update(instance string) string {
   677  	return fmt.Sprintf(`
   678  	resource "google_compute_instance" "foobar" {
   679  		name = "%s"
   680  		machine_type = "n1-standard-1"
   681  		zone = "us-central1-a"
   682  		tags = ["baz"]
   683  
   684  		disk {
   685  			image = "debian-7-wheezy-v20160301"
   686  		}
   687  
   688  		network_interface {
   689  			network = "default"
   690  			access_config { }
   691  		}
   692  
   693  		metadata {
   694  			bar = "baz"
   695  		}
   696  	}`, instance)
   697  }
   698  
   699  func testAccComputeInstance_ip(ip, instance string) string {
   700  	return fmt.Sprintf(`
   701  	resource "google_compute_address" "foo" {
   702  		name = "%s"
   703  	}
   704  
   705  	resource "google_compute_instance" "foobar" {
   706  		name = "%s"
   707  		machine_type = "n1-standard-1"
   708  		zone = "us-central1-a"
   709  		tags = ["foo", "bar"]
   710  
   711  		disk {
   712  			image = "debian-7-wheezy-v20160301"
   713  		}
   714  
   715  		network_interface {
   716  			network = "default"
   717  			access_config {
   718  				nat_ip = "${google_compute_address.foo.address}"
   719  			}
   720  		}
   721  
   722  		metadata {
   723  			foo = "bar"
   724  		}
   725  	}`, ip, instance)
   726  }
   727  
   728  func testAccComputeInstance_disks(disk, instance string, autodelete bool) string {
   729  	return fmt.Sprintf(`
   730  	resource "google_compute_disk" "foobar" {
   731  		name = "%s"
   732  		size = 10
   733  		type = "pd-ssd"
   734  		zone = "us-central1-a"
   735  	}
   736  
   737  	resource "google_compute_instance" "foobar" {
   738  		name = "%s"
   739  		machine_type = "n1-standard-1"
   740  		zone = "us-central1-a"
   741  
   742  		disk {
   743  			image = "debian-7-wheezy-v20160301"
   744  		}
   745  
   746  		disk {
   747  			disk = "${google_compute_disk.foobar.name}"
   748  			auto_delete = %v
   749  		}
   750  
   751  		network_interface {
   752  			network = "default"
   753  		}
   754  
   755  		metadata {
   756  			foo = "bar"
   757  		}
   758  	}`, disk, instance, autodelete)
   759  }
   760  
   761  func testAccComputeInstance_local_ssd(instance string) string {
   762  	return fmt.Sprintf(`
   763  	resource "google_compute_instance" "local-ssd" {
   764  		name = "%s"
   765  		machine_type = "n1-standard-1"
   766  		zone = "us-central1-a"
   767  
   768  		disk {
   769  			image = "debian-7-wheezy-v20160301"
   770  		}
   771  
   772  		disk {
   773  			type = "local-ssd"
   774  			scratch = true
   775  		}
   776  
   777  		network_interface {
   778  			network = "default"
   779  		}
   780  
   781  	}`, instance)
   782  }
   783  
   784  func testAccComputeInstance_service_account(instance string) string {
   785  	return fmt.Sprintf(`
   786  	resource "google_compute_instance" "foobar" {
   787  		name = "%s"
   788  		machine_type = "n1-standard-1"
   789  		zone = "us-central1-a"
   790  
   791  		disk {
   792  			image = "debian-7-wheezy-v20160301"
   793  		}
   794  
   795  		network_interface {
   796  			network = "default"
   797  		}
   798  
   799  		service_account {
   800  			scopes = [
   801  				"userinfo-email",
   802  				"compute-ro",
   803  				"storage-ro",
   804  			]
   805  		}
   806  	}`, instance)
   807  }
   808  
   809  func testAccComputeInstance_scheduling(instance string) string {
   810  	return fmt.Sprintf(`
   811  	resource "google_compute_instance" "foobar" {
   812  		name = "%s"
   813  		machine_type = "n1-standard-1"
   814  		zone = "us-central1-a"
   815  
   816  		disk {
   817  			image = "debian-7-wheezy-v20160301"
   818  		}
   819  
   820  		network_interface {
   821  			network = "default"
   822  		}
   823  
   824  		scheduling {
   825  		}
   826  	}`, instance)
   827  }
   828  
   829  func testAccComputeInstance_subnet_auto(instance string) string {
   830  	return fmt.Sprintf(`
   831  	resource "google_compute_network" "inst-test-network" {
   832  		name = "inst-test-network-%s"
   833  		auto_create_subnetworks = true
   834  	}
   835  
   836  	resource "google_compute_instance" "foobar" {
   837  		name = "%s"
   838  		machine_type = "n1-standard-1"
   839  		zone = "us-central1-a"
   840  
   841  		disk {
   842  			image = "debian-7-wheezy-v20160301"
   843  		}
   844  
   845  		network_interface {
   846  			network = "${google_compute_network.inst-test-network.name}"
   847  			access_config {	}
   848  		}
   849  
   850  	}`, acctest.RandString(10), instance)
   851  }
   852  
   853  func testAccComputeInstance_subnet_custom(instance string) string {
   854  	return fmt.Sprintf(`
   855  	resource "google_compute_network" "inst-test-network" {
   856  		name = "inst-test-network-%s"
   857  		auto_create_subnetworks = false
   858  	}
   859  
   860  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
   861  		name = "inst-test-subnetwork-%s"
   862  		ip_cidr_range = "10.0.0.0/16"
   863  		region = "us-central1"
   864  		network = "${google_compute_network.inst-test-network.self_link}"
   865  	}
   866  
   867  	resource "google_compute_instance" "foobar" {
   868  		name = "%s"
   869  		machine_type = "n1-standard-1"
   870  		zone = "us-central1-a"
   871  
   872  		disk {
   873  			image = "debian-7-wheezy-v20160301"
   874  		}
   875  
   876  		network_interface {
   877  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
   878  			access_config {	}
   879  		}
   880  
   881  	}`, acctest.RandString(10), acctest.RandString(10), instance)
   882  }