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