github.com/minamijoyo/terraform@v0.7.8-0.20161029001309-18b3736ba44b/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_basic4(t *testing.T) {
   108  	var instance compute.Instance
   109  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   110  
   111  	resource.Test(t, resource.TestCase{
   112  		PreCheck:     func() { testAccPreCheck(t) },
   113  		Providers:    testAccProviders,
   114  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   115  		Steps: []resource.TestStep{
   116  			resource.TestStep{
   117  				Config: testAccComputeInstance_basic4(instanceName),
   118  				Check: resource.ComposeTestCheckFunc(
   119  					testAccCheckComputeInstanceExists(
   120  						"google_compute_instance.foobar", &instance),
   121  					testAccCheckComputeInstanceTag(&instance, "foo"),
   122  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
   123  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   124  				),
   125  			},
   126  		},
   127  	})
   128  }
   129  
   130  func TestAccComputeInstance_basic5(t *testing.T) {
   131  	var instance compute.Instance
   132  	var instanceName = fmt.Sprintf("instance-test-%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_basic5(instanceName),
   141  				Check: resource.ComposeTestCheckFunc(
   142  					testAccCheckComputeInstanceExists(
   143  						"google_compute_instance.foobar", &instance),
   144  					testAccCheckComputeInstanceTag(&instance, "foo"),
   145  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
   146  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   147  				),
   148  			},
   149  		},
   150  	})
   151  }
   152  
   153  func TestAccComputeInstance_IP(t *testing.T) {
   154  	var instance compute.Instance
   155  	var ipName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   156  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   157  
   158  	resource.Test(t, resource.TestCase{
   159  		PreCheck:     func() { testAccPreCheck(t) },
   160  		Providers:    testAccProviders,
   161  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   162  		Steps: []resource.TestStep{
   163  			resource.TestStep{
   164  				Config: testAccComputeInstance_ip(ipName, instanceName),
   165  				Check: resource.ComposeTestCheckFunc(
   166  					testAccCheckComputeInstanceExists(
   167  						"google_compute_instance.foobar", &instance),
   168  					testAccCheckComputeInstanceAccessConfigHasIP(&instance),
   169  				),
   170  			},
   171  		},
   172  	})
   173  }
   174  
   175  func TestAccComputeInstance_disksWithoutAutodelete(t *testing.T) {
   176  	var instance compute.Instance
   177  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   178  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   179  
   180  	resource.Test(t, resource.TestCase{
   181  		PreCheck:     func() { testAccPreCheck(t) },
   182  		Providers:    testAccProviders,
   183  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   184  		Steps: []resource.TestStep{
   185  			resource.TestStep{
   186  				Config: testAccComputeInstance_disks(diskName, instanceName, false),
   187  				Check: resource.ComposeTestCheckFunc(
   188  					testAccCheckComputeInstanceExists(
   189  						"google_compute_instance.foobar", &instance),
   190  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   191  					testAccCheckComputeInstanceDisk(&instance, diskName, false, false),
   192  				),
   193  			},
   194  		},
   195  	})
   196  }
   197  
   198  func TestAccComputeInstance_disksWithAutodelete(t *testing.T) {
   199  	var instance compute.Instance
   200  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   201  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   202  
   203  	resource.Test(t, resource.TestCase{
   204  		PreCheck:     func() { testAccPreCheck(t) },
   205  		Providers:    testAccProviders,
   206  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   207  		Steps: []resource.TestStep{
   208  			resource.TestStep{
   209  				Config: testAccComputeInstance_disks(diskName, instanceName, true),
   210  				Check: resource.ComposeTestCheckFunc(
   211  					testAccCheckComputeInstanceExists(
   212  						"google_compute_instance.foobar", &instance),
   213  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   214  					testAccCheckComputeInstanceDisk(&instance, diskName, true, false),
   215  				),
   216  			},
   217  		},
   218  	})
   219  }
   220  
   221  func TestAccComputeInstance_local_ssd(t *testing.T) {
   222  	var instance compute.Instance
   223  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   224  
   225  	resource.Test(t, resource.TestCase{
   226  		PreCheck:     func() { testAccPreCheck(t) },
   227  		Providers:    testAccProviders,
   228  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   229  		Steps: []resource.TestStep{
   230  			resource.TestStep{
   231  				Config: testAccComputeInstance_local_ssd(instanceName),
   232  				Check: resource.ComposeTestCheckFunc(
   233  					testAccCheckComputeInstanceExists(
   234  						"google_compute_instance.local-ssd", &instance),
   235  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   236  				),
   237  			},
   238  		},
   239  	})
   240  }
   241  
   242  func TestAccComputeInstance_update_deprecated_network(t *testing.T) {
   243  	var instance compute.Instance
   244  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   245  
   246  	resource.Test(t, resource.TestCase{
   247  		PreCheck:     func() { testAccPreCheck(t) },
   248  		Providers:    testAccProviders,
   249  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   250  		Steps: []resource.TestStep{
   251  			resource.TestStep{
   252  				Config: testAccComputeInstance_basic_deprecated_network(instanceName),
   253  				Check: resource.ComposeTestCheckFunc(
   254  					testAccCheckComputeInstanceExists(
   255  						"google_compute_instance.foobar", &instance),
   256  				),
   257  			},
   258  			resource.TestStep{
   259  				Config: testAccComputeInstance_update_deprecated_network(instanceName),
   260  				Check: resource.ComposeTestCheckFunc(
   261  					testAccCheckComputeInstanceExists(
   262  						"google_compute_instance.foobar", &instance),
   263  					testAccCheckComputeInstanceMetadata(
   264  						&instance, "bar", "baz"),
   265  					testAccCheckComputeInstanceTag(&instance, "baz"),
   266  				),
   267  			},
   268  		},
   269  	})
   270  }
   271  
   272  func TestAccComputeInstance_forceNewAndChangeMetadata(t *testing.T) {
   273  	var instance compute.Instance
   274  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   275  
   276  	resource.Test(t, resource.TestCase{
   277  		PreCheck:     func() { testAccPreCheck(t) },
   278  		Providers:    testAccProviders,
   279  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   280  		Steps: []resource.TestStep{
   281  			resource.TestStep{
   282  				Config: testAccComputeInstance_basic(instanceName),
   283  				Check: resource.ComposeTestCheckFunc(
   284  					testAccCheckComputeInstanceExists(
   285  						"google_compute_instance.foobar", &instance),
   286  				),
   287  			},
   288  			resource.TestStep{
   289  				Config: testAccComputeInstance_forceNewAndChangeMetadata(instanceName),
   290  				Check: resource.ComposeTestCheckFunc(
   291  					testAccCheckComputeInstanceExists(
   292  						"google_compute_instance.foobar", &instance),
   293  					testAccCheckComputeInstanceMetadata(
   294  						&instance, "qux", "true"),
   295  				),
   296  			},
   297  		},
   298  	})
   299  }
   300  
   301  func TestAccComputeInstance_update(t *testing.T) {
   302  	var instance compute.Instance
   303  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   304  
   305  	resource.Test(t, resource.TestCase{
   306  		PreCheck:     func() { testAccPreCheck(t) },
   307  		Providers:    testAccProviders,
   308  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   309  		Steps: []resource.TestStep{
   310  			resource.TestStep{
   311  				Config: testAccComputeInstance_basic(instanceName),
   312  				Check: resource.ComposeTestCheckFunc(
   313  					testAccCheckComputeInstanceExists(
   314  						"google_compute_instance.foobar", &instance),
   315  				),
   316  			},
   317  			resource.TestStep{
   318  				Config: testAccComputeInstance_update(instanceName),
   319  				Check: resource.ComposeTestCheckFunc(
   320  					testAccCheckComputeInstanceExists(
   321  						"google_compute_instance.foobar", &instance),
   322  					testAccCheckComputeInstanceMetadata(
   323  						&instance, "bar", "baz"),
   324  					testAccCheckComputeInstanceTag(&instance, "baz"),
   325  					testAccCheckComputeInstanceAccessConfig(&instance),
   326  				),
   327  			},
   328  		},
   329  	})
   330  }
   331  
   332  func TestAccComputeInstance_service_account(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_service_account(instanceName),
   343  				Check: resource.ComposeTestCheckFunc(
   344  					testAccCheckComputeInstanceExists(
   345  						"google_compute_instance.foobar", &instance),
   346  					testAccCheckComputeInstanceServiceAccount(&instance,
   347  						"https://www.googleapis.com/auth/compute.readonly"),
   348  					testAccCheckComputeInstanceServiceAccount(&instance,
   349  						"https://www.googleapis.com/auth/devstorage.read_only"),
   350  					testAccCheckComputeInstanceServiceAccount(&instance,
   351  						"https://www.googleapis.com/auth/userinfo.email"),
   352  				),
   353  			},
   354  		},
   355  	})
   356  }
   357  
   358  func TestAccComputeInstance_scheduling(t *testing.T) {
   359  	var instance compute.Instance
   360  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   361  
   362  	resource.Test(t, resource.TestCase{
   363  		PreCheck:     func() { testAccPreCheck(t) },
   364  		Providers:    testAccProviders,
   365  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   366  		Steps: []resource.TestStep{
   367  			resource.TestStep{
   368  				Config: testAccComputeInstance_scheduling(instanceName),
   369  				Check: resource.ComposeTestCheckFunc(
   370  					testAccCheckComputeInstanceExists(
   371  						"google_compute_instance.foobar", &instance),
   372  				),
   373  			},
   374  		},
   375  	})
   376  }
   377  
   378  func TestAccComputeInstance_subnet_auto(t *testing.T) {
   379  	var instance compute.Instance
   380  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   381  
   382  	resource.Test(t, resource.TestCase{
   383  		PreCheck:     func() { testAccPreCheck(t) },
   384  		Providers:    testAccProviders,
   385  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   386  		Steps: []resource.TestStep{
   387  			resource.TestStep{
   388  				Config: testAccComputeInstance_subnet_auto(instanceName),
   389  				Check: resource.ComposeTestCheckFunc(
   390  					testAccCheckComputeInstanceExists(
   391  						"google_compute_instance.foobar", &instance),
   392  					testAccCheckComputeInstanceHasSubnet(&instance),
   393  				),
   394  			},
   395  		},
   396  	})
   397  }
   398  
   399  func TestAccComputeInstance_subnet_custom(t *testing.T) {
   400  	var instance compute.Instance
   401  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   402  
   403  	resource.Test(t, resource.TestCase{
   404  		PreCheck:     func() { testAccPreCheck(t) },
   405  		Providers:    testAccProviders,
   406  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   407  		Steps: []resource.TestStep{
   408  			resource.TestStep{
   409  				Config: testAccComputeInstance_subnet_custom(instanceName),
   410  				Check: resource.ComposeTestCheckFunc(
   411  					testAccCheckComputeInstanceExists(
   412  						"google_compute_instance.foobar", &instance),
   413  					testAccCheckComputeInstanceHasSubnet(&instance),
   414  				),
   415  			},
   416  		},
   417  	})
   418  }
   419  
   420  func TestAccComputeInstance_address_auto(t *testing.T) {
   421  	var instance compute.Instance
   422  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   423  
   424  	resource.Test(t, resource.TestCase{
   425  		PreCheck:     func() { testAccPreCheck(t) },
   426  		Providers:    testAccProviders,
   427  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   428  		Steps: []resource.TestStep{
   429  			resource.TestStep{
   430  				Config: testAccComputeInstance_address_auto(instanceName),
   431  				Check: resource.ComposeTestCheckFunc(
   432  					testAccCheckComputeInstanceExists(
   433  						"google_compute_instance.foobar", &instance),
   434  					testAccCheckComputeInstanceHasAnyAddress(&instance),
   435  				),
   436  			},
   437  		},
   438  	})
   439  }
   440  
   441  func TestAccComputeInstance_address_custom(t *testing.T) {
   442  	var instance compute.Instance
   443  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   444  	var address = "10.0.200.200"
   445  	resource.Test(t, resource.TestCase{
   446  		PreCheck:     func() { testAccPreCheck(t) },
   447  		Providers:    testAccProviders,
   448  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   449  		Steps: []resource.TestStep{
   450  			resource.TestStep{
   451  				Config: testAccComputeInstance_address_custom(instanceName, address),
   452  				Check: resource.ComposeTestCheckFunc(
   453  					testAccCheckComputeInstanceExists(
   454  						"google_compute_instance.foobar", &instance),
   455  					testAccCheckComputeInstanceHasAddress(&instance, address),
   456  				),
   457  			},
   458  		},
   459  	})
   460  }
   461  func testAccCheckComputeInstanceDestroy(s *terraform.State) error {
   462  	config := testAccProvider.Meta().(*Config)
   463  
   464  	for _, rs := range s.RootModule().Resources {
   465  		if rs.Type != "google_compute_instance" {
   466  			continue
   467  		}
   468  
   469  		_, err := config.clientCompute.Instances.Get(
   470  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   471  		if err == nil {
   472  			return fmt.Errorf("Instance still exists")
   473  		}
   474  	}
   475  
   476  	return nil
   477  }
   478  
   479  func testAccCheckComputeInstanceExists(n string, instance *compute.Instance) resource.TestCheckFunc {
   480  	return func(s *terraform.State) error {
   481  		rs, ok := s.RootModule().Resources[n]
   482  		if !ok {
   483  			return fmt.Errorf("Not found: %s", n)
   484  		}
   485  
   486  		if rs.Primary.ID == "" {
   487  			return fmt.Errorf("No ID is set")
   488  		}
   489  
   490  		config := testAccProvider.Meta().(*Config)
   491  
   492  		found, err := config.clientCompute.Instances.Get(
   493  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   494  		if err != nil {
   495  			return err
   496  		}
   497  
   498  		if found.Name != rs.Primary.ID {
   499  			return fmt.Errorf("Instance not found")
   500  		}
   501  
   502  		*instance = *found
   503  
   504  		return nil
   505  	}
   506  }
   507  
   508  func testAccCheckComputeInstanceMetadata(
   509  	instance *compute.Instance,
   510  	k string, v string) resource.TestCheckFunc {
   511  	return func(s *terraform.State) error {
   512  		if instance.Metadata == nil {
   513  			return fmt.Errorf("no metadata")
   514  		}
   515  
   516  		for _, item := range instance.Metadata.Items {
   517  			if k != item.Key {
   518  				continue
   519  			}
   520  
   521  			if item.Value != nil && v == *item.Value {
   522  				return nil
   523  			}
   524  
   525  			return fmt.Errorf("bad value for %s: %s", k, *item.Value)
   526  		}
   527  
   528  		return fmt.Errorf("metadata not found: %s", k)
   529  	}
   530  }
   531  
   532  func testAccCheckComputeInstanceAccessConfig(instance *compute.Instance) resource.TestCheckFunc {
   533  	return func(s *terraform.State) error {
   534  		for _, i := range instance.NetworkInterfaces {
   535  			if len(i.AccessConfigs) == 0 {
   536  				return fmt.Errorf("no access_config")
   537  			}
   538  		}
   539  
   540  		return nil
   541  	}
   542  }
   543  
   544  func testAccCheckComputeInstanceAccessConfigHasIP(instance *compute.Instance) resource.TestCheckFunc {
   545  	return func(s *terraform.State) error {
   546  		for _, i := range instance.NetworkInterfaces {
   547  			for _, c := range i.AccessConfigs {
   548  				if c.NatIP == "" {
   549  					return fmt.Errorf("no NAT IP")
   550  				}
   551  			}
   552  		}
   553  
   554  		return nil
   555  	}
   556  }
   557  
   558  func testAccCheckComputeInstanceDisk(instance *compute.Instance, source string, delete bool, boot bool) resource.TestCheckFunc {
   559  	return func(s *terraform.State) error {
   560  		if instance.Disks == nil {
   561  			return fmt.Errorf("no disks")
   562  		}
   563  
   564  		for _, disk := range instance.Disks {
   565  			if strings.LastIndex(disk.Source, "/"+source) == len(disk.Source)-len(source)-1 && disk.AutoDelete == delete && disk.Boot == boot {
   566  				return nil
   567  			}
   568  		}
   569  
   570  		return fmt.Errorf("Disk not found: %s", source)
   571  	}
   572  }
   573  
   574  func testAccCheckComputeInstanceTag(instance *compute.Instance, n string) resource.TestCheckFunc {
   575  	return func(s *terraform.State) error {
   576  		if instance.Tags == nil {
   577  			return fmt.Errorf("no tags")
   578  		}
   579  
   580  		for _, k := range instance.Tags.Items {
   581  			if k == n {
   582  				return nil
   583  			}
   584  		}
   585  
   586  		return fmt.Errorf("tag not found: %s", n)
   587  	}
   588  }
   589  
   590  func testAccCheckComputeInstanceServiceAccount(instance *compute.Instance, scope string) resource.TestCheckFunc {
   591  	return func(s *terraform.State) error {
   592  		if count := len(instance.ServiceAccounts); count != 1 {
   593  			return fmt.Errorf("Wrong number of ServiceAccounts: expected 1, got %d", count)
   594  		}
   595  
   596  		for _, val := range instance.ServiceAccounts[0].Scopes {
   597  			if val == scope {
   598  				return nil
   599  			}
   600  		}
   601  
   602  		return fmt.Errorf("Scope not found: %s", scope)
   603  	}
   604  }
   605  
   606  func testAccCheckComputeInstanceHasSubnet(instance *compute.Instance) resource.TestCheckFunc {
   607  	return func(s *terraform.State) error {
   608  		for _, i := range instance.NetworkInterfaces {
   609  			if i.Subnetwork == "" {
   610  				return fmt.Errorf("no subnet")
   611  			}
   612  		}
   613  
   614  		return nil
   615  	}
   616  }
   617  
   618  func testAccCheckComputeInstanceHasAnyAddress(instance *compute.Instance) resource.TestCheckFunc {
   619  	return func(s *terraform.State) error {
   620  		for _, i := range instance.NetworkInterfaces {
   621  			if i.NetworkIP == "" {
   622  				return fmt.Errorf("no address")
   623  			}
   624  		}
   625  
   626  		return nil
   627  	}
   628  }
   629  
   630  func testAccCheckComputeInstanceHasAddress(instance *compute.Instance, address string) resource.TestCheckFunc {
   631  	return func(s *terraform.State) error {
   632  		for _, i := range instance.NetworkInterfaces {
   633  			if i.NetworkIP != address {
   634  				return fmt.Errorf("Wrong address found: expected %v, got %v", address, i.NetworkIP)
   635  			}
   636  		}
   637  
   638  		return nil
   639  	}
   640  }
   641  
   642  func testAccComputeInstance_basic_deprecated_network(instance string) string {
   643  	return fmt.Sprintf(`
   644  	resource "google_compute_instance" "foobar" {
   645  		name = "%s"
   646  		machine_type = "n1-standard-1"
   647  		zone = "us-central1-a"
   648  		can_ip_forward = false
   649  		tags = ["foo", "bar"]
   650  
   651  		disk {
   652  			image = "debian-8-jessie-v20160803"
   653  		}
   654  
   655  		network {
   656  			source = "default"
   657  		}
   658  
   659  		metadata {
   660  			foo = "bar"
   661  		}
   662  	}`, instance)
   663  }
   664  
   665  func testAccComputeInstance_update_deprecated_network(instance string) string {
   666  	return fmt.Sprintf(`
   667  	resource "google_compute_instance" "foobar" {
   668  		name = "%s"
   669  		machine_type = "n1-standard-1"
   670  		zone = "us-central1-a"
   671  		tags = ["baz"]
   672  
   673  		disk {
   674  			image = "debian-8-jessie-v20160803"
   675  		}
   676  
   677  		network {
   678  			source = "default"
   679  		}
   680  
   681  		metadata {
   682  			bar = "baz"
   683  		}
   684  	}`, instance)
   685  }
   686  
   687  func testAccComputeInstance_basic(instance string) string {
   688  	return fmt.Sprintf(`
   689  	resource "google_compute_instance" "foobar" {
   690  		name = "%s"
   691  		machine_type = "n1-standard-1"
   692  		zone = "us-central1-a"
   693  		can_ip_forward = false
   694  		tags = ["foo", "bar"]
   695  
   696  		disk {
   697  			image = "debian-8-jessie-v20160803"
   698  		}
   699  
   700  		network_interface {
   701  			network = "default"
   702  		}
   703  
   704  		metadata {
   705  			foo = "bar"
   706  			baz = "qux"
   707  		}
   708  
   709  		metadata_startup_script = "echo Hello"
   710  	}`, instance)
   711  }
   712  
   713  func testAccComputeInstance_basic2(instance string) string {
   714  	return fmt.Sprintf(`
   715  	resource "google_compute_instance" "foobar" {
   716  		name = "%s"
   717  		machine_type = "n1-standard-1"
   718  		zone = "us-central1-a"
   719  		can_ip_forward = false
   720  		tags = ["foo", "bar"]
   721  
   722  		disk {
   723  			image = "debian-8"
   724  		}
   725  
   726  		network_interface {
   727  			network = "default"
   728  		}
   729  
   730  		metadata {
   731  			foo = "bar"
   732  		}
   733  	}`, instance)
   734  }
   735  
   736  func testAccComputeInstance_basic3(instance string) string {
   737  	return fmt.Sprintf(`
   738  	resource "google_compute_instance" "foobar" {
   739  		name = "%s"
   740  		machine_type = "n1-standard-1"
   741  		zone = "us-central1-a"
   742  		can_ip_forward = false
   743  		tags = ["foo", "bar"]
   744  
   745  		disk {
   746  			image = "debian-cloud/debian-8-jessie-v20160803"
   747  		}
   748  
   749  		network_interface {
   750  			network = "default"
   751  		}
   752  
   753  
   754  		metadata {
   755  			foo = "bar"
   756  		}
   757  	}`, instance)
   758  }
   759  
   760  func testAccComputeInstance_basic4(instance string) string {
   761  	return fmt.Sprintf(`
   762  	resource "google_compute_instance" "foobar" {
   763  		name = "%s"
   764  		machine_type = "n1-standard-1"
   765  		zone = "us-central1-a"
   766  		can_ip_forward = false
   767  		tags = ["foo", "bar"]
   768  
   769  		disk {
   770  			image = "debian-cloud/debian-8"
   771  		}
   772  
   773  		network_interface {
   774  			network = "default"
   775  		}
   776  
   777  
   778  		metadata {
   779  			foo = "bar"
   780  		}
   781  	}`, instance)
   782  }
   783  
   784  func testAccComputeInstance_basic5(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  		can_ip_forward = false
   791  		tags = ["foo", "bar"]
   792  
   793  		disk {
   794  			image = "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20160803"
   795  		}
   796  
   797  		network_interface {
   798  			network = "default"
   799  		}
   800  
   801  		metadata {
   802  			foo = "bar"
   803  		}
   804  	}`, instance)
   805  }
   806  
   807  // Update zone to ForceNew, and change metadata k/v entirely
   808  // Generates diff mismatch
   809  func testAccComputeInstance_forceNewAndChangeMetadata(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  		zone = "us-central1-b"
   816  		tags = ["baz"]
   817  
   818  		disk {
   819  			image = "debian-8-jessie-v20160803"
   820  		}
   821  
   822  		network_interface {
   823  			network = "default"
   824  			access_config { }
   825  		}
   826  
   827  		metadata {
   828  			qux = "true"
   829  		}
   830  	}`, instance)
   831  }
   832  
   833  // Update metadata, tags, and network_interface
   834  func testAccComputeInstance_update(instance string) string {
   835  	return fmt.Sprintf(`
   836  	resource "google_compute_instance" "foobar" {
   837  		name = "%s"
   838  		machine_type = "n1-standard-1"
   839  		zone = "us-central1-a"
   840  		tags = ["baz"]
   841  
   842  		disk {
   843  			image = "debian-8-jessie-v20160803"
   844  		}
   845  
   846  		network_interface {
   847  			network = "default"
   848  			access_config { }
   849  		}
   850  
   851  		metadata {
   852  			bar = "baz"
   853  		}
   854  	}`, instance)
   855  }
   856  
   857  func testAccComputeInstance_ip(ip, instance string) string {
   858  	return fmt.Sprintf(`
   859  	resource "google_compute_address" "foo" {
   860  		name = "%s"
   861  	}
   862  
   863  	resource "google_compute_instance" "foobar" {
   864  		name = "%s"
   865  		machine_type = "n1-standard-1"
   866  		zone = "us-central1-a"
   867  		tags = ["foo", "bar"]
   868  
   869  		disk {
   870  			image = "debian-8-jessie-v20160803"
   871  		}
   872  
   873  		network_interface {
   874  			network = "default"
   875  			access_config {
   876  				nat_ip = "${google_compute_address.foo.address}"
   877  			}
   878  		}
   879  
   880  		metadata {
   881  			foo = "bar"
   882  		}
   883  	}`, ip, instance)
   884  }
   885  
   886  func testAccComputeInstance_disks(disk, instance string, autodelete bool) string {
   887  	return fmt.Sprintf(`
   888  	resource "google_compute_disk" "foobar" {
   889  		name = "%s"
   890  		size = 10
   891  		type = "pd-ssd"
   892  		zone = "us-central1-a"
   893  	}
   894  
   895  	resource "google_compute_instance" "foobar" {
   896  		name = "%s"
   897  		machine_type = "n1-standard-1"
   898  		zone = "us-central1-a"
   899  
   900  		disk {
   901  			image = "debian-8-jessie-v20160803"
   902  		}
   903  
   904  		disk {
   905  			disk = "${google_compute_disk.foobar.name}"
   906  			auto_delete = %v
   907  		}
   908  
   909  		network_interface {
   910  			network = "default"
   911  		}
   912  
   913  		metadata {
   914  			foo = "bar"
   915  		}
   916  	}`, disk, instance, autodelete)
   917  }
   918  
   919  func testAccComputeInstance_local_ssd(instance string) string {
   920  	return fmt.Sprintf(`
   921  	resource "google_compute_instance" "local-ssd" {
   922  		name = "%s"
   923  		machine_type = "n1-standard-1"
   924  		zone = "us-central1-a"
   925  
   926  		disk {
   927  			image = "debian-8-jessie-v20160803"
   928  		}
   929  
   930  		disk {
   931  			type = "local-ssd"
   932  			scratch = true
   933  		}
   934  
   935  		network_interface {
   936  			network = "default"
   937  		}
   938  
   939  	}`, instance)
   940  }
   941  
   942  func testAccComputeInstance_service_account(instance string) string {
   943  	return fmt.Sprintf(`
   944  	resource "google_compute_instance" "foobar" {
   945  		name = "%s"
   946  		machine_type = "n1-standard-1"
   947  		zone = "us-central1-a"
   948  
   949  		disk {
   950  			image = "debian-8-jessie-v20160803"
   951  		}
   952  
   953  		network_interface {
   954  			network = "default"
   955  		}
   956  
   957  		service_account {
   958  			scopes = [
   959  				"userinfo-email",
   960  				"compute-ro",
   961  				"storage-ro",
   962  			]
   963  		}
   964  	}`, instance)
   965  }
   966  
   967  func testAccComputeInstance_scheduling(instance string) string {
   968  	return fmt.Sprintf(`
   969  	resource "google_compute_instance" "foobar" {
   970  		name = "%s"
   971  		machine_type = "n1-standard-1"
   972  		zone = "us-central1-a"
   973  
   974  		disk {
   975  			image = "debian-8-jessie-v20160803"
   976  		}
   977  
   978  		network_interface {
   979  			network = "default"
   980  		}
   981  
   982  		scheduling {
   983  		}
   984  	}`, instance)
   985  }
   986  
   987  func testAccComputeInstance_subnet_auto(instance string) string {
   988  	return fmt.Sprintf(`
   989  	resource "google_compute_network" "inst-test-network" {
   990  		name = "inst-test-network-%s"
   991  		auto_create_subnetworks = true
   992  	}
   993  
   994  	resource "google_compute_instance" "foobar" {
   995  		name = "%s"
   996  		machine_type = "n1-standard-1"
   997  		zone = "us-central1-a"
   998  
   999  		disk {
  1000  			image = "debian-8-jessie-v20160803"
  1001  		}
  1002  
  1003  		network_interface {
  1004  			network = "${google_compute_network.inst-test-network.name}"
  1005  			access_config {	}
  1006  		}
  1007  
  1008  	}`, acctest.RandString(10), instance)
  1009  }
  1010  
  1011  func testAccComputeInstance_subnet_custom(instance string) string {
  1012  	return fmt.Sprintf(`
  1013  	resource "google_compute_network" "inst-test-network" {
  1014  		name = "inst-test-network-%s"
  1015  		auto_create_subnetworks = false
  1016  	}
  1017  
  1018  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1019  		name = "inst-test-subnetwork-%s"
  1020  		ip_cidr_range = "10.0.0.0/16"
  1021  		region = "us-central1"
  1022  		network = "${google_compute_network.inst-test-network.self_link}"
  1023  	}
  1024  
  1025  	resource "google_compute_instance" "foobar" {
  1026  		name = "%s"
  1027  		machine_type = "n1-standard-1"
  1028  		zone = "us-central1-a"
  1029  
  1030  		disk {
  1031  			image = "debian-8-jessie-v20160803"
  1032  		}
  1033  
  1034  		network_interface {
  1035  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1036  			access_config {	}
  1037  		}
  1038  
  1039  	}`, acctest.RandString(10), acctest.RandString(10), instance)
  1040  }
  1041  
  1042  func testAccComputeInstance_address_auto(instance string) string {
  1043  	return fmt.Sprintf(`
  1044  	resource "google_compute_network" "inst-test-network" {
  1045  		name = "inst-test-network-%s"
  1046  	}
  1047  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1048  		name = "inst-test-subnetwork-%s"
  1049  		ip_cidr_range = "10.0.0.0/16"
  1050  		region = "us-central1"
  1051  		network = "${google_compute_network.inst-test-network.self_link}"
  1052  	}
  1053  	resource "google_compute_instance" "foobar" {
  1054  		name = "%s"
  1055  		machine_type = "n1-standard-1"
  1056  		zone = "us-central1-a"
  1057  
  1058  		disk {
  1059  			image = "debian-8-jessie-v20160803"
  1060  		}
  1061  
  1062  		network_interface {
  1063  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1064  			access_config {	}
  1065  		}
  1066  
  1067  	}`, acctest.RandString(10), acctest.RandString(10), instance)
  1068  }
  1069  
  1070  func testAccComputeInstance_address_custom(instance, address string) string {
  1071  	return fmt.Sprintf(`
  1072  	resource "google_compute_network" "inst-test-network" {
  1073  		name = "inst-test-network-%s"
  1074  	}
  1075  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1076  		name = "inst-test-subnetwork-%s"
  1077  		ip_cidr_range = "10.0.0.0/16"
  1078  		region = "us-central1"
  1079  		network = "${google_compute_network.inst-test-network.self_link}"
  1080  	}
  1081  	resource "google_compute_instance" "foobar" {
  1082  		name = "%s"
  1083  		machine_type = "n1-standard-1"
  1084  		zone = "us-central1-a"
  1085  
  1086  		disk {
  1087  			image = "debian-8-jessie-v20160803"
  1088  		}
  1089  
  1090  		network_interface {
  1091  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1092  		    address = "%s"
  1093  			access_config {	}
  1094  		}
  1095  
  1096  	}`, acctest.RandString(10), acctest.RandString(10), instance, address)
  1097  }