github.com/pbthorste/terraform@v0.8.6-0.20170127005045-deb56bd93da2/builtin/providers/google/resource_compute_instance_test.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"regexp"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/hashicorp/terraform/helper/acctest"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  	"google.golang.org/api/compute/v1"
    14  )
    15  
    16  func TestAccComputeInstance_basic_deprecated_network(t *testing.T) {
    17  	var instance compute.Instance
    18  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
    19  
    20  	resource.Test(t, resource.TestCase{
    21  		PreCheck:     func() { testAccPreCheck(t) },
    22  		Providers:    testAccProviders,
    23  		CheckDestroy: testAccCheckComputeInstanceDestroy,
    24  		Steps: []resource.TestStep{
    25  			resource.TestStep{
    26  				Config: testAccComputeInstance_basic_deprecated_network(instanceName),
    27  				Check: resource.ComposeTestCheckFunc(
    28  					testAccCheckComputeInstanceExists(
    29  						"google_compute_instance.foobar", &instance),
    30  					testAccCheckComputeInstanceTag(&instance, "foo"),
    31  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
    32  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
    33  				),
    34  			},
    35  		},
    36  	})
    37  }
    38  
    39  func TestAccComputeInstance_basic1(t *testing.T) {
    40  	var instance compute.Instance
    41  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
    42  
    43  	resource.Test(t, resource.TestCase{
    44  		PreCheck:     func() { testAccPreCheck(t) },
    45  		Providers:    testAccProviders,
    46  		CheckDestroy: testAccCheckComputeInstanceDestroy,
    47  		Steps: []resource.TestStep{
    48  			resource.TestStep{
    49  				Config: testAccComputeInstance_basic(instanceName),
    50  				Check: resource.ComposeTestCheckFunc(
    51  					testAccCheckComputeInstanceExists(
    52  						"google_compute_instance.foobar", &instance),
    53  					testAccCheckComputeInstanceTag(&instance, "foo"),
    54  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
    55  					testAccCheckComputeInstanceMetadata(&instance, "baz", "qux"),
    56  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
    57  				),
    58  			},
    59  		},
    60  	})
    61  }
    62  
    63  func TestAccComputeInstance_basic2(t *testing.T) {
    64  	var instance compute.Instance
    65  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
    66  
    67  	resource.Test(t, resource.TestCase{
    68  		PreCheck:     func() { testAccPreCheck(t) },
    69  		Providers:    testAccProviders,
    70  		CheckDestroy: testAccCheckComputeInstanceDestroy,
    71  		Steps: []resource.TestStep{
    72  			resource.TestStep{
    73  				Config: testAccComputeInstance_basic2(instanceName),
    74  				Check: resource.ComposeTestCheckFunc(
    75  					testAccCheckComputeInstanceExists(
    76  						"google_compute_instance.foobar", &instance),
    77  					testAccCheckComputeInstanceTag(&instance, "foo"),
    78  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
    79  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
    80  				),
    81  			},
    82  		},
    83  	})
    84  }
    85  
    86  func TestAccComputeInstance_basic3(t *testing.T) {
    87  	var instance compute.Instance
    88  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
    89  
    90  	resource.Test(t, resource.TestCase{
    91  		PreCheck:     func() { testAccPreCheck(t) },
    92  		Providers:    testAccProviders,
    93  		CheckDestroy: testAccCheckComputeInstanceDestroy,
    94  		Steps: []resource.TestStep{
    95  			resource.TestStep{
    96  				Config: testAccComputeInstance_basic3(instanceName),
    97  				Check: resource.ComposeTestCheckFunc(
    98  					testAccCheckComputeInstanceExists(
    99  						"google_compute_instance.foobar", &instance),
   100  					testAccCheckComputeInstanceTag(&instance, "foo"),
   101  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
   102  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   103  				),
   104  			},
   105  		},
   106  	})
   107  }
   108  
   109  func TestAccComputeInstance_basic4(t *testing.T) {
   110  	var instance compute.Instance
   111  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   112  
   113  	resource.Test(t, resource.TestCase{
   114  		PreCheck:     func() { testAccPreCheck(t) },
   115  		Providers:    testAccProviders,
   116  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   117  		Steps: []resource.TestStep{
   118  			resource.TestStep{
   119  				Config: testAccComputeInstance_basic4(instanceName),
   120  				Check: resource.ComposeTestCheckFunc(
   121  					testAccCheckComputeInstanceExists(
   122  						"google_compute_instance.foobar", &instance),
   123  					testAccCheckComputeInstanceTag(&instance, "foo"),
   124  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
   125  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   126  				),
   127  			},
   128  		},
   129  	})
   130  }
   131  
   132  func TestAccComputeInstance_basic5(t *testing.T) {
   133  	var instance compute.Instance
   134  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   135  
   136  	resource.Test(t, resource.TestCase{
   137  		PreCheck:     func() { testAccPreCheck(t) },
   138  		Providers:    testAccProviders,
   139  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   140  		Steps: []resource.TestStep{
   141  			resource.TestStep{
   142  				Config: testAccComputeInstance_basic5(instanceName),
   143  				Check: resource.ComposeTestCheckFunc(
   144  					testAccCheckComputeInstanceExists(
   145  						"google_compute_instance.foobar", &instance),
   146  					testAccCheckComputeInstanceTag(&instance, "foo"),
   147  					testAccCheckComputeInstanceMetadata(&instance, "foo", "bar"),
   148  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   149  				),
   150  			},
   151  		},
   152  	})
   153  }
   154  
   155  func TestAccComputeInstance_IP(t *testing.T) {
   156  	var instance compute.Instance
   157  	var ipName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   158  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   159  
   160  	resource.Test(t, resource.TestCase{
   161  		PreCheck:     func() { testAccPreCheck(t) },
   162  		Providers:    testAccProviders,
   163  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   164  		Steps: []resource.TestStep{
   165  			resource.TestStep{
   166  				Config: testAccComputeInstance_ip(ipName, instanceName),
   167  				Check: resource.ComposeTestCheckFunc(
   168  					testAccCheckComputeInstanceExists(
   169  						"google_compute_instance.foobar", &instance),
   170  					testAccCheckComputeInstanceAccessConfigHasIP(&instance),
   171  				),
   172  			},
   173  		},
   174  	})
   175  }
   176  
   177  func TestAccComputeInstance_disksWithoutAutodelete(t *testing.T) {
   178  	var instance compute.Instance
   179  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   180  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   181  
   182  	resource.Test(t, resource.TestCase{
   183  		PreCheck:     func() { testAccPreCheck(t) },
   184  		Providers:    testAccProviders,
   185  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   186  		Steps: []resource.TestStep{
   187  			resource.TestStep{
   188  				Config: testAccComputeInstance_disks(diskName, instanceName, false),
   189  				Check: resource.ComposeTestCheckFunc(
   190  					testAccCheckComputeInstanceExists(
   191  						"google_compute_instance.foobar", &instance),
   192  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   193  					testAccCheckComputeInstanceDisk(&instance, diskName, false, false),
   194  				),
   195  			},
   196  		},
   197  	})
   198  }
   199  
   200  func TestAccComputeInstance_disksWithAutodelete(t *testing.T) {
   201  	var instance compute.Instance
   202  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   203  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   204  
   205  	resource.Test(t, resource.TestCase{
   206  		PreCheck:     func() { testAccPreCheck(t) },
   207  		Providers:    testAccProviders,
   208  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   209  		Steps: []resource.TestStep{
   210  			resource.TestStep{
   211  				Config: testAccComputeInstance_disks(diskName, instanceName, true),
   212  				Check: resource.ComposeTestCheckFunc(
   213  					testAccCheckComputeInstanceExists(
   214  						"google_compute_instance.foobar", &instance),
   215  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   216  					testAccCheckComputeInstanceDisk(&instance, diskName, true, false),
   217  				),
   218  			},
   219  		},
   220  	})
   221  }
   222  
   223  func TestAccComputeInstance_diskEncryption(t *testing.T) {
   224  	var instance compute.Instance
   225  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   226  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   227  
   228  	resource.Test(t, resource.TestCase{
   229  		PreCheck:     func() { testAccPreCheck(t) },
   230  		Providers:    testAccProviders,
   231  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   232  		Steps: []resource.TestStep{
   233  			resource.TestStep{
   234  				Config: testAccComputeInstance_disks_encryption(diskName, instanceName),
   235  				Check: resource.ComposeTestCheckFunc(
   236  					testAccCheckComputeInstanceExists(
   237  						"google_compute_instance.foobar", &instance),
   238  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   239  					testAccCheckComputeInstanceDisk(&instance, diskName, true, false),
   240  					testAccCheckComputeInstanceDiskEncryptionKey("google_compute_instance.foobar", &instance),
   241  				),
   242  			},
   243  		},
   244  	})
   245  }
   246  
   247  func TestAccComputeInstance_local_ssd(t *testing.T) {
   248  	var instance compute.Instance
   249  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   250  
   251  	resource.Test(t, resource.TestCase{
   252  		PreCheck:     func() { testAccPreCheck(t) },
   253  		Providers:    testAccProviders,
   254  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   255  		Steps: []resource.TestStep{
   256  			resource.TestStep{
   257  				Config: testAccComputeInstance_local_ssd(instanceName),
   258  				Check: resource.ComposeTestCheckFunc(
   259  					testAccCheckComputeInstanceExists(
   260  						"google_compute_instance.local-ssd", &instance),
   261  					testAccCheckComputeInstanceDisk(&instance, instanceName, true, true),
   262  				),
   263  			},
   264  		},
   265  	})
   266  }
   267  
   268  func TestAccComputeInstance_update_deprecated_network(t *testing.T) {
   269  	var instance compute.Instance
   270  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   271  
   272  	resource.Test(t, resource.TestCase{
   273  		PreCheck:     func() { testAccPreCheck(t) },
   274  		Providers:    testAccProviders,
   275  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   276  		Steps: []resource.TestStep{
   277  			resource.TestStep{
   278  				Config: testAccComputeInstance_basic_deprecated_network(instanceName),
   279  				Check: resource.ComposeTestCheckFunc(
   280  					testAccCheckComputeInstanceExists(
   281  						"google_compute_instance.foobar", &instance),
   282  				),
   283  			},
   284  			resource.TestStep{
   285  				Config: testAccComputeInstance_update_deprecated_network(instanceName),
   286  				Check: resource.ComposeTestCheckFunc(
   287  					testAccCheckComputeInstanceExists(
   288  						"google_compute_instance.foobar", &instance),
   289  					testAccCheckComputeInstanceMetadata(
   290  						&instance, "bar", "baz"),
   291  					testAccCheckComputeInstanceTag(&instance, "baz"),
   292  				),
   293  			},
   294  		},
   295  	})
   296  }
   297  
   298  func TestAccComputeInstance_forceNewAndChangeMetadata(t *testing.T) {
   299  	var instance compute.Instance
   300  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   301  
   302  	resource.Test(t, resource.TestCase{
   303  		PreCheck:     func() { testAccPreCheck(t) },
   304  		Providers:    testAccProviders,
   305  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   306  		Steps: []resource.TestStep{
   307  			resource.TestStep{
   308  				Config: testAccComputeInstance_basic(instanceName),
   309  				Check: resource.ComposeTestCheckFunc(
   310  					testAccCheckComputeInstanceExists(
   311  						"google_compute_instance.foobar", &instance),
   312  				),
   313  			},
   314  			resource.TestStep{
   315  				Config: testAccComputeInstance_forceNewAndChangeMetadata(instanceName),
   316  				Check: resource.ComposeTestCheckFunc(
   317  					testAccCheckComputeInstanceExists(
   318  						"google_compute_instance.foobar", &instance),
   319  					testAccCheckComputeInstanceMetadata(
   320  						&instance, "qux", "true"),
   321  				),
   322  			},
   323  		},
   324  	})
   325  }
   326  
   327  func TestAccComputeInstance_update(t *testing.T) {
   328  	var instance compute.Instance
   329  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   330  
   331  	resource.Test(t, resource.TestCase{
   332  		PreCheck:     func() { testAccPreCheck(t) },
   333  		Providers:    testAccProviders,
   334  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   335  		Steps: []resource.TestStep{
   336  			resource.TestStep{
   337  				Config: testAccComputeInstance_basic(instanceName),
   338  				Check: resource.ComposeTestCheckFunc(
   339  					testAccCheckComputeInstanceExists(
   340  						"google_compute_instance.foobar", &instance),
   341  				),
   342  			},
   343  			resource.TestStep{
   344  				Config: testAccComputeInstance_update(instanceName),
   345  				Check: resource.ComposeTestCheckFunc(
   346  					testAccCheckComputeInstanceExists(
   347  						"google_compute_instance.foobar", &instance),
   348  					testAccCheckComputeInstanceMetadata(
   349  						&instance, "bar", "baz"),
   350  					testAccCheckComputeInstanceTag(&instance, "baz"),
   351  					testAccCheckComputeInstanceAccessConfig(&instance),
   352  				),
   353  			},
   354  		},
   355  	})
   356  }
   357  
   358  func TestAccComputeInstance_service_account(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_service_account(instanceName),
   369  				Check: resource.ComposeTestCheckFunc(
   370  					testAccCheckComputeInstanceExists(
   371  						"google_compute_instance.foobar", &instance),
   372  					testAccCheckComputeInstanceServiceAccount(&instance,
   373  						"https://www.googleapis.com/auth/compute.readonly"),
   374  					testAccCheckComputeInstanceServiceAccount(&instance,
   375  						"https://www.googleapis.com/auth/devstorage.read_only"),
   376  					testAccCheckComputeInstanceServiceAccount(&instance,
   377  						"https://www.googleapis.com/auth/userinfo.email"),
   378  				),
   379  			},
   380  		},
   381  	})
   382  }
   383  
   384  func TestAccComputeInstance_scheduling(t *testing.T) {
   385  	var instance compute.Instance
   386  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   387  
   388  	resource.Test(t, resource.TestCase{
   389  		PreCheck:     func() { testAccPreCheck(t) },
   390  		Providers:    testAccProviders,
   391  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   392  		Steps: []resource.TestStep{
   393  			resource.TestStep{
   394  				Config: testAccComputeInstance_scheduling(instanceName),
   395  				Check: resource.ComposeTestCheckFunc(
   396  					testAccCheckComputeInstanceExists(
   397  						"google_compute_instance.foobar", &instance),
   398  				),
   399  			},
   400  		},
   401  	})
   402  }
   403  
   404  func TestAccComputeInstance_subnet_auto(t *testing.T) {
   405  	var instance compute.Instance
   406  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   407  
   408  	resource.Test(t, resource.TestCase{
   409  		PreCheck:     func() { testAccPreCheck(t) },
   410  		Providers:    testAccProviders,
   411  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   412  		Steps: []resource.TestStep{
   413  			resource.TestStep{
   414  				Config: testAccComputeInstance_subnet_auto(instanceName),
   415  				Check: resource.ComposeTestCheckFunc(
   416  					testAccCheckComputeInstanceExists(
   417  						"google_compute_instance.foobar", &instance),
   418  					testAccCheckComputeInstanceHasSubnet(&instance),
   419  				),
   420  			},
   421  		},
   422  	})
   423  }
   424  
   425  func TestAccComputeInstance_subnet_custom(t *testing.T) {
   426  	var instance compute.Instance
   427  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   428  
   429  	resource.Test(t, resource.TestCase{
   430  		PreCheck:     func() { testAccPreCheck(t) },
   431  		Providers:    testAccProviders,
   432  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   433  		Steps: []resource.TestStep{
   434  			resource.TestStep{
   435  				Config: testAccComputeInstance_subnet_custom(instanceName),
   436  				Check: resource.ComposeTestCheckFunc(
   437  					testAccCheckComputeInstanceExists(
   438  						"google_compute_instance.foobar", &instance),
   439  					testAccCheckComputeInstanceHasSubnet(&instance),
   440  				),
   441  			},
   442  		},
   443  	})
   444  }
   445  
   446  func TestAccComputeInstance_subnet_xpn(t *testing.T) {
   447  	var instance compute.Instance
   448  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   449  	var xpn_host = os.Getenv("GOOGLE_XPN_HOST_PROJECT")
   450  
   451  	resource.Test(t, resource.TestCase{
   452  		PreCheck:     func() { testAccPreCheck(t) },
   453  		Providers:    testAccProviders,
   454  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   455  		Steps: []resource.TestStep{
   456  			resource.TestStep{
   457  				Config: testAccComputeInstance_subnet_xpn(instanceName, xpn_host),
   458  				Check: resource.ComposeTestCheckFunc(
   459  					testAccCheckComputeInstanceExists(
   460  						"google_compute_instance.foobar", &instance),
   461  					testAccCheckComputeInstanceHasSubnet(&instance),
   462  				),
   463  			},
   464  		},
   465  	})
   466  }
   467  
   468  func TestAccComputeInstance_address_auto(t *testing.T) {
   469  	var instance compute.Instance
   470  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   471  
   472  	resource.Test(t, resource.TestCase{
   473  		PreCheck:     func() { testAccPreCheck(t) },
   474  		Providers:    testAccProviders,
   475  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   476  		Steps: []resource.TestStep{
   477  			resource.TestStep{
   478  				Config: testAccComputeInstance_address_auto(instanceName),
   479  				Check: resource.ComposeTestCheckFunc(
   480  					testAccCheckComputeInstanceExists(
   481  						"google_compute_instance.foobar", &instance),
   482  					testAccCheckComputeInstanceHasAnyAddress(&instance),
   483  				),
   484  			},
   485  		},
   486  	})
   487  }
   488  
   489  func TestAccComputeInstance_address_custom(t *testing.T) {
   490  	var instance compute.Instance
   491  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   492  	var address = "10.0.200.200"
   493  	resource.Test(t, resource.TestCase{
   494  		PreCheck:     func() { testAccPreCheck(t) },
   495  		Providers:    testAccProviders,
   496  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   497  		Steps: []resource.TestStep{
   498  			resource.TestStep{
   499  				Config: testAccComputeInstance_address_custom(instanceName, address),
   500  				Check: resource.ComposeTestCheckFunc(
   501  					testAccCheckComputeInstanceExists(
   502  						"google_compute_instance.foobar", &instance),
   503  					testAccCheckComputeInstanceHasAddress(&instance, address),
   504  				),
   505  			},
   506  		},
   507  	})
   508  }
   509  
   510  func TestAccComputeInstance_private_image_family(t *testing.T) {
   511  	var instance compute.Instance
   512  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   513  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   514  	var imageName = fmt.Sprintf("instance-testi-%s", acctest.RandString(10))
   515  	var familyName = fmt.Sprintf("instance-testf-%s", acctest.RandString(10))
   516  
   517  	resource.Test(t, resource.TestCase{
   518  		PreCheck:     func() { testAccPreCheck(t) },
   519  		Providers:    testAccProviders,
   520  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   521  		Steps: []resource.TestStep{
   522  			resource.TestStep{
   523  				Config: testAccComputeInstance_private_image_family(diskName, imageName, familyName, instanceName),
   524  				Check: resource.ComposeTestCheckFunc(
   525  					testAccCheckComputeInstanceExists(
   526  						"google_compute_instance.foobar", &instance),
   527  				),
   528  			},
   529  		},
   530  	})
   531  }
   532  
   533  func TestAccComputeInstance_invalid_disk(t *testing.T) {
   534  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   535  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   536  
   537  	resource.Test(t, resource.TestCase{
   538  		PreCheck:     func() { testAccPreCheck(t) },
   539  		Providers:    testAccProviders,
   540  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   541  		Steps: []resource.TestStep{
   542  			resource.TestStep{
   543  				Config:      testAccComputeInstance_invalid_disk(diskName, instanceName),
   544  				ExpectError: regexp.MustCompile("Error: cannot define both disk and type."),
   545  			},
   546  		},
   547  	})
   548  }
   549  
   550  func testAccCheckComputeInstanceDestroy(s *terraform.State) error {
   551  	config := testAccProvider.Meta().(*Config)
   552  
   553  	for _, rs := range s.RootModule().Resources {
   554  		if rs.Type != "google_compute_instance" {
   555  			continue
   556  		}
   557  
   558  		_, err := config.clientCompute.Instances.Get(
   559  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   560  		if err == nil {
   561  			return fmt.Errorf("Instance still exists")
   562  		}
   563  	}
   564  
   565  	return nil
   566  }
   567  
   568  func testAccCheckComputeInstanceExists(n string, instance *compute.Instance) resource.TestCheckFunc {
   569  	return func(s *terraform.State) error {
   570  		rs, ok := s.RootModule().Resources[n]
   571  		if !ok {
   572  			return fmt.Errorf("Not found: %s", n)
   573  		}
   574  
   575  		if rs.Primary.ID == "" {
   576  			return fmt.Errorf("No ID is set")
   577  		}
   578  
   579  		config := testAccProvider.Meta().(*Config)
   580  
   581  		found, err := config.clientCompute.Instances.Get(
   582  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   583  		if err != nil {
   584  			return err
   585  		}
   586  
   587  		if found.Name != rs.Primary.ID {
   588  			return fmt.Errorf("Instance not found")
   589  		}
   590  
   591  		*instance = *found
   592  
   593  		return nil
   594  	}
   595  }
   596  
   597  func testAccCheckComputeInstanceMetadata(
   598  	instance *compute.Instance,
   599  	k string, v string) resource.TestCheckFunc {
   600  	return func(s *terraform.State) error {
   601  		if instance.Metadata == nil {
   602  			return fmt.Errorf("no metadata")
   603  		}
   604  
   605  		for _, item := range instance.Metadata.Items {
   606  			if k != item.Key {
   607  				continue
   608  			}
   609  
   610  			if item.Value != nil && v == *item.Value {
   611  				return nil
   612  			}
   613  
   614  			return fmt.Errorf("bad value for %s: %s", k, *item.Value)
   615  		}
   616  
   617  		return fmt.Errorf("metadata not found: %s", k)
   618  	}
   619  }
   620  
   621  func testAccCheckComputeInstanceAccessConfig(instance *compute.Instance) resource.TestCheckFunc {
   622  	return func(s *terraform.State) error {
   623  		for _, i := range instance.NetworkInterfaces {
   624  			if len(i.AccessConfigs) == 0 {
   625  				return fmt.Errorf("no access_config")
   626  			}
   627  		}
   628  
   629  		return nil
   630  	}
   631  }
   632  
   633  func testAccCheckComputeInstanceAccessConfigHasIP(instance *compute.Instance) resource.TestCheckFunc {
   634  	return func(s *terraform.State) error {
   635  		for _, i := range instance.NetworkInterfaces {
   636  			for _, c := range i.AccessConfigs {
   637  				if c.NatIP == "" {
   638  					return fmt.Errorf("no NAT IP")
   639  				}
   640  			}
   641  		}
   642  
   643  		return nil
   644  	}
   645  }
   646  
   647  func testAccCheckComputeInstanceDisk(instance *compute.Instance, source string, delete bool, boot bool) resource.TestCheckFunc {
   648  	return func(s *terraform.State) error {
   649  		if instance.Disks == nil {
   650  			return fmt.Errorf("no disks")
   651  		}
   652  
   653  		for _, disk := range instance.Disks {
   654  			if strings.LastIndex(disk.Source, "/"+source) == len(disk.Source)-len(source)-1 && disk.AutoDelete == delete && disk.Boot == boot {
   655  				return nil
   656  			}
   657  		}
   658  
   659  		return fmt.Errorf("Disk not found: %s", source)
   660  	}
   661  }
   662  
   663  func testAccCheckComputeInstanceDiskEncryptionKey(n string, instance *compute.Instance) resource.TestCheckFunc {
   664  	return func(s *terraform.State) error {
   665  		rs, ok := s.RootModule().Resources[n]
   666  		if !ok {
   667  			return fmt.Errorf("Not found: %s", n)
   668  		}
   669  
   670  		for i, disk := range instance.Disks {
   671  			attr := rs.Primary.Attributes[fmt.Sprintf("disk.%d.disk_encryption_key_sha256", i)]
   672  			if disk.DiskEncryptionKey == nil && attr != "" {
   673  				return fmt.Errorf("Disk %d has mismatched encryption key.\nTF State: %+v\nGCP State: <empty>", i, attr)
   674  			}
   675  			if disk.DiskEncryptionKey != nil && attr != disk.DiskEncryptionKey.Sha256 {
   676  				return fmt.Errorf("Disk %d has mismatched encryption key.\nTF State: %+v\nGCP State: %+v",
   677  					i, attr, disk.DiskEncryptionKey.Sha256)
   678  			}
   679  		}
   680  		return nil
   681  	}
   682  }
   683  
   684  func testAccCheckComputeInstanceTag(instance *compute.Instance, n string) resource.TestCheckFunc {
   685  	return func(s *terraform.State) error {
   686  		if instance.Tags == nil {
   687  			return fmt.Errorf("no tags")
   688  		}
   689  
   690  		for _, k := range instance.Tags.Items {
   691  			if k == n {
   692  				return nil
   693  			}
   694  		}
   695  
   696  		return fmt.Errorf("tag not found: %s", n)
   697  	}
   698  }
   699  
   700  func testAccCheckComputeInstanceServiceAccount(instance *compute.Instance, scope string) resource.TestCheckFunc {
   701  	return func(s *terraform.State) error {
   702  		if count := len(instance.ServiceAccounts); count != 1 {
   703  			return fmt.Errorf("Wrong number of ServiceAccounts: expected 1, got %d", count)
   704  		}
   705  
   706  		for _, val := range instance.ServiceAccounts[0].Scopes {
   707  			if val == scope {
   708  				return nil
   709  			}
   710  		}
   711  
   712  		return fmt.Errorf("Scope not found: %s", scope)
   713  	}
   714  }
   715  
   716  func testAccCheckComputeInstanceHasSubnet(instance *compute.Instance) resource.TestCheckFunc {
   717  	return func(s *terraform.State) error {
   718  		for _, i := range instance.NetworkInterfaces {
   719  			if i.Subnetwork == "" {
   720  				return fmt.Errorf("no subnet")
   721  			}
   722  		}
   723  
   724  		return nil
   725  	}
   726  }
   727  
   728  func testAccCheckComputeInstanceHasAnyAddress(instance *compute.Instance) resource.TestCheckFunc {
   729  	return func(s *terraform.State) error {
   730  		for _, i := range instance.NetworkInterfaces {
   731  			if i.NetworkIP == "" {
   732  				return fmt.Errorf("no address")
   733  			}
   734  		}
   735  
   736  		return nil
   737  	}
   738  }
   739  
   740  func testAccCheckComputeInstanceHasAddress(instance *compute.Instance, address string) resource.TestCheckFunc {
   741  	return func(s *terraform.State) error {
   742  		for _, i := range instance.NetworkInterfaces {
   743  			if i.NetworkIP != address {
   744  				return fmt.Errorf("Wrong address found: expected %v, got %v", address, i.NetworkIP)
   745  			}
   746  		}
   747  
   748  		return nil
   749  	}
   750  }
   751  
   752  func testAccComputeInstance_basic_deprecated_network(instance string) string {
   753  	return fmt.Sprintf(`
   754  	resource "google_compute_instance" "foobar" {
   755  		name = "%s"
   756  		machine_type = "n1-standard-1"
   757  		zone = "us-central1-a"
   758  		can_ip_forward = false
   759  		tags = ["foo", "bar"]
   760  
   761  		disk {
   762  			image = "debian-8-jessie-v20160803"
   763  		}
   764  
   765  		network {
   766  			source = "default"
   767  		}
   768  
   769  		metadata {
   770  			foo = "bar"
   771  		}
   772  	}`, instance)
   773  }
   774  
   775  func testAccComputeInstance_update_deprecated_network(instance string) string {
   776  	return fmt.Sprintf(`
   777  	resource "google_compute_instance" "foobar" {
   778  		name = "%s"
   779  		machine_type = "n1-standard-1"
   780  		zone = "us-central1-a"
   781  		tags = ["baz"]
   782  
   783  		disk {
   784  			image = "debian-8-jessie-v20160803"
   785  		}
   786  
   787  		network {
   788  			source = "default"
   789  		}
   790  
   791  		metadata {
   792  			bar = "baz"
   793  		}
   794  	}`, instance)
   795  }
   796  
   797  func testAccComputeInstance_basic(instance string) string {
   798  	return fmt.Sprintf(`
   799  	resource "google_compute_instance" "foobar" {
   800  		name = "%s"
   801  		machine_type = "n1-standard-1"
   802  		zone = "us-central1-a"
   803  		can_ip_forward = false
   804  		tags = ["foo", "bar"]
   805  
   806  		disk {
   807  			image = "debian-8-jessie-v20160803"
   808  		}
   809  
   810  		network_interface {
   811  			network = "default"
   812  		}
   813  
   814  		metadata {
   815  			foo = "bar"
   816  			baz = "qux"
   817  		}
   818  
   819  		create_timeout = 5
   820  
   821  		metadata_startup_script = "echo Hello"
   822  	}`, instance)
   823  }
   824  
   825  func testAccComputeInstance_basic2(instance string) string {
   826  	return fmt.Sprintf(`
   827  	resource "google_compute_instance" "foobar" {
   828  		name = "%s"
   829  		machine_type = "n1-standard-1"
   830  		zone = "us-central1-a"
   831  		can_ip_forward = false
   832  		tags = ["foo", "bar"]
   833  
   834  		disk {
   835  			image = "debian-8"
   836  		}
   837  
   838  		network_interface {
   839  			network = "default"
   840  		}
   841  
   842  		metadata {
   843  			foo = "bar"
   844  		}
   845  	}`, instance)
   846  }
   847  
   848  func testAccComputeInstance_basic3(instance string) string {
   849  	return fmt.Sprintf(`
   850  	resource "google_compute_instance" "foobar" {
   851  		name = "%s"
   852  		machine_type = "n1-standard-1"
   853  		zone = "us-central1-a"
   854  		can_ip_forward = false
   855  		tags = ["foo", "bar"]
   856  
   857  		disk {
   858  			image = "debian-cloud/debian-8-jessie-v20160803"
   859  		}
   860  
   861  		network_interface {
   862  			network = "default"
   863  		}
   864  
   865  
   866  		metadata {
   867  			foo = "bar"
   868  		}
   869  	}`, instance)
   870  }
   871  
   872  func testAccComputeInstance_basic4(instance string) string {
   873  	return fmt.Sprintf(`
   874  	resource "google_compute_instance" "foobar" {
   875  		name = "%s"
   876  		machine_type = "n1-standard-1"
   877  		zone = "us-central1-a"
   878  		can_ip_forward = false
   879  		tags = ["foo", "bar"]
   880  
   881  		disk {
   882  			image = "debian-cloud/debian-8"
   883  		}
   884  
   885  		network_interface {
   886  			network = "default"
   887  		}
   888  
   889  
   890  		metadata {
   891  			foo = "bar"
   892  		}
   893  	}`, instance)
   894  }
   895  
   896  func testAccComputeInstance_basic5(instance string) string {
   897  	return fmt.Sprintf(`
   898  	resource "google_compute_instance" "foobar" {
   899  		name = "%s"
   900  		machine_type = "n1-standard-1"
   901  		zone = "us-central1-a"
   902  		can_ip_forward = false
   903  		tags = ["foo", "bar"]
   904  
   905  		disk {
   906  			image = "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20160803"
   907  		}
   908  
   909  		network_interface {
   910  			network = "default"
   911  		}
   912  
   913  		metadata {
   914  			foo = "bar"
   915  		}
   916  	}`, instance)
   917  }
   918  
   919  // Update zone to ForceNew, and change metadata k/v entirely
   920  // Generates diff mismatch
   921  func testAccComputeInstance_forceNewAndChangeMetadata(instance string) string {
   922  	return fmt.Sprintf(`
   923  	resource "google_compute_instance" "foobar" {
   924  		name = "%s"
   925  		machine_type = "n1-standard-1"
   926  		zone = "us-central1-a"
   927  		zone = "us-central1-b"
   928  		tags = ["baz"]
   929  
   930  		disk {
   931  			image = "debian-8-jessie-v20160803"
   932  		}
   933  
   934  		network_interface {
   935  			network = "default"
   936  			access_config { }
   937  		}
   938  
   939  		metadata {
   940  			qux = "true"
   941  		}
   942  	}`, instance)
   943  }
   944  
   945  // Update metadata, tags, and network_interface
   946  func testAccComputeInstance_update(instance string) string {
   947  	return fmt.Sprintf(`
   948  	resource "google_compute_instance" "foobar" {
   949  		name = "%s"
   950  		machine_type = "n1-standard-1"
   951  		zone = "us-central1-a"
   952  		tags = ["baz"]
   953  
   954  		disk {
   955  			image = "debian-8-jessie-v20160803"
   956  		}
   957  
   958  		network_interface {
   959  			network = "default"
   960  			access_config { }
   961  		}
   962  
   963  		metadata {
   964  			bar = "baz"
   965  		}
   966  	}`, instance)
   967  }
   968  
   969  func testAccComputeInstance_ip(ip, instance string) string {
   970  	return fmt.Sprintf(`
   971  	resource "google_compute_address" "foo" {
   972  		name = "%s"
   973  	}
   974  
   975  	resource "google_compute_instance" "foobar" {
   976  		name = "%s"
   977  		machine_type = "n1-standard-1"
   978  		zone = "us-central1-a"
   979  		tags = ["foo", "bar"]
   980  
   981  		disk {
   982  			image = "debian-8-jessie-v20160803"
   983  		}
   984  
   985  		network_interface {
   986  			network = "default"
   987  			access_config {
   988  				nat_ip = "${google_compute_address.foo.address}"
   989  			}
   990  		}
   991  
   992  		metadata {
   993  			foo = "bar"
   994  		}
   995  	}`, ip, instance)
   996  }
   997  
   998  func testAccComputeInstance_disks(disk, instance string, autodelete bool) string {
   999  	return fmt.Sprintf(`
  1000  	resource "google_compute_disk" "foobar" {
  1001  		name = "%s"
  1002  		size = 10
  1003  		type = "pd-ssd"
  1004  		zone = "us-central1-a"
  1005  	}
  1006  
  1007  	resource "google_compute_instance" "foobar" {
  1008  		name = "%s"
  1009  		machine_type = "n1-standard-1"
  1010  		zone = "us-central1-a"
  1011  
  1012  		disk {
  1013  			image = "debian-8-jessie-v20160803"
  1014  		}
  1015  
  1016  		disk {
  1017  			disk = "${google_compute_disk.foobar.name}"
  1018  			auto_delete = %v
  1019  		}
  1020  
  1021  		network_interface {
  1022  			network = "default"
  1023  		}
  1024  
  1025  		metadata {
  1026  			foo = "bar"
  1027  		}
  1028  	}`, disk, instance, autodelete)
  1029  }
  1030  
  1031  func testAccComputeInstance_disks_encryption(disk, instance string) string {
  1032  	return fmt.Sprintf(`
  1033  	resource "google_compute_disk" "foobar" {
  1034  		name = "%s"
  1035  		size = 10
  1036  		type = "pd-ssd"
  1037  		zone = "us-central1-a"
  1038  	}
  1039  
  1040  	resource "google_compute_instance" "foobar" {
  1041  		name = "%s"
  1042  		machine_type = "n1-standard-1"
  1043  		zone = "us-central1-a"
  1044  
  1045  		disk {
  1046  			image = "debian-8-jessie-v20160803"
  1047  			disk_encryption_key_raw = "SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0="
  1048  		}
  1049  
  1050  		disk {
  1051  			disk = "${google_compute_disk.foobar.name}"
  1052  		}
  1053  
  1054  		network_interface {
  1055  			network = "default"
  1056  		}
  1057  
  1058  		metadata {
  1059  			foo = "bar"
  1060  		}
  1061  	}`, disk, instance)
  1062  }
  1063  
  1064  func testAccComputeInstance_local_ssd(instance string) string {
  1065  	return fmt.Sprintf(`
  1066  	resource "google_compute_instance" "local-ssd" {
  1067  		name = "%s"
  1068  		machine_type = "n1-standard-1"
  1069  		zone = "us-central1-a"
  1070  
  1071  		disk {
  1072  			image = "debian-8-jessie-v20160803"
  1073  		}
  1074  
  1075  		disk {
  1076  			type = "local-ssd"
  1077  			scratch = true
  1078  		}
  1079  
  1080  		network_interface {
  1081  			network = "default"
  1082  		}
  1083  
  1084  	}`, instance)
  1085  }
  1086  
  1087  func testAccComputeInstance_service_account(instance string) string {
  1088  	return fmt.Sprintf(`
  1089  	resource "google_compute_instance" "foobar" {
  1090  		name = "%s"
  1091  		machine_type = "n1-standard-1"
  1092  		zone = "us-central1-a"
  1093  
  1094  		disk {
  1095  			image = "debian-8-jessie-v20160803"
  1096  		}
  1097  
  1098  		network_interface {
  1099  			network = "default"
  1100  		}
  1101  
  1102  		service_account {
  1103  			scopes = [
  1104  				"userinfo-email",
  1105  				"compute-ro",
  1106  				"storage-ro",
  1107  			]
  1108  		}
  1109  	}`, instance)
  1110  }
  1111  
  1112  func testAccComputeInstance_scheduling(instance string) string {
  1113  	return fmt.Sprintf(`
  1114  	resource "google_compute_instance" "foobar" {
  1115  		name = "%s"
  1116  		machine_type = "n1-standard-1"
  1117  		zone = "us-central1-a"
  1118  
  1119  		disk {
  1120  			image = "debian-8-jessie-v20160803"
  1121  		}
  1122  
  1123  		network_interface {
  1124  			network = "default"
  1125  		}
  1126  
  1127  		scheduling {
  1128  		}
  1129  	}`, instance)
  1130  }
  1131  
  1132  func testAccComputeInstance_subnet_auto(instance string) string {
  1133  	return fmt.Sprintf(`
  1134  	resource "google_compute_network" "inst-test-network" {
  1135  		name = "inst-test-network-%s"
  1136  		auto_create_subnetworks = true
  1137  	}
  1138  
  1139  	resource "google_compute_instance" "foobar" {
  1140  		name = "%s"
  1141  		machine_type = "n1-standard-1"
  1142  		zone = "us-central1-a"
  1143  
  1144  		disk {
  1145  			image = "debian-8-jessie-v20160803"
  1146  		}
  1147  
  1148  		network_interface {
  1149  			network = "${google_compute_network.inst-test-network.name}"
  1150  			access_config {	}
  1151  		}
  1152  
  1153  	}`, acctest.RandString(10), instance)
  1154  }
  1155  
  1156  func testAccComputeInstance_subnet_custom(instance string) string {
  1157  	return fmt.Sprintf(`
  1158  	resource "google_compute_network" "inst-test-network" {
  1159  		name = "inst-test-network-%s"
  1160  		auto_create_subnetworks = false
  1161  	}
  1162  
  1163  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1164  		name = "inst-test-subnetwork-%s"
  1165  		ip_cidr_range = "10.0.0.0/16"
  1166  		region = "us-central1"
  1167  		network = "${google_compute_network.inst-test-network.self_link}"
  1168  	}
  1169  
  1170  	resource "google_compute_instance" "foobar" {
  1171  		name = "%s"
  1172  		machine_type = "n1-standard-1"
  1173  		zone = "us-central1-a"
  1174  
  1175  		disk {
  1176  			image = "debian-8-jessie-v20160803"
  1177  		}
  1178  
  1179  		network_interface {
  1180  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1181  			access_config {	}
  1182  		}
  1183  
  1184  	}`, acctest.RandString(10), acctest.RandString(10), instance)
  1185  }
  1186  
  1187  func testAccComputeInstance_subnet_xpn(instance, xpn_host string) string {
  1188  	return fmt.Sprintf(`
  1189  	resource "google_compute_network" "inst-test-network" {
  1190  		name = "inst-test-network-%s"
  1191  		auto_create_subnetworks = false
  1192  		project = "%s"
  1193  	}
  1194  
  1195  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1196  		name = "inst-test-subnetwork-%s"
  1197  		ip_cidr_range = "10.0.0.0/16"
  1198  		region = "us-central1"
  1199  		network = "${google_compute_network.inst-test-network.self_link}"
  1200  		project = "%s"
  1201  	}
  1202  
  1203  	resource "google_compute_instance" "foobar" {
  1204  		name = "%s"
  1205  		machine_type = "n1-standard-1"
  1206  		zone = "us-central1-a"
  1207  
  1208  		disk {
  1209  			image = "debian-8-jessie-v20160803"
  1210  		}
  1211  
  1212  		network_interface {
  1213  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1214  			subnetwork_project = "${google_compute_subnetwork.inst-test-subnetwork.project}"
  1215  			access_config {	}
  1216  		}
  1217  
  1218  	}`, acctest.RandString(10), xpn_host, acctest.RandString(10), xpn_host, instance)
  1219  }
  1220  
  1221  func testAccComputeInstance_address_auto(instance string) string {
  1222  	return fmt.Sprintf(`
  1223  	resource "google_compute_network" "inst-test-network" {
  1224  		name = "inst-test-network-%s"
  1225  	}
  1226  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1227  		name = "inst-test-subnetwork-%s"
  1228  		ip_cidr_range = "10.0.0.0/16"
  1229  		region = "us-central1"
  1230  		network = "${google_compute_network.inst-test-network.self_link}"
  1231  	}
  1232  	resource "google_compute_instance" "foobar" {
  1233  		name = "%s"
  1234  		machine_type = "n1-standard-1"
  1235  		zone = "us-central1-a"
  1236  
  1237  		disk {
  1238  			image = "debian-8-jessie-v20160803"
  1239  		}
  1240  
  1241  		network_interface {
  1242  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1243  			access_config {	}
  1244  		}
  1245  
  1246  	}`, acctest.RandString(10), acctest.RandString(10), instance)
  1247  }
  1248  
  1249  func testAccComputeInstance_address_custom(instance, address string) string {
  1250  	return fmt.Sprintf(`
  1251  	resource "google_compute_network" "inst-test-network" {
  1252  		name = "inst-test-network-%s"
  1253  	}
  1254  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1255  		name = "inst-test-subnetwork-%s"
  1256  		ip_cidr_range = "10.0.0.0/16"
  1257  		region = "us-central1"
  1258  		network = "${google_compute_network.inst-test-network.self_link}"
  1259  	}
  1260  	resource "google_compute_instance" "foobar" {
  1261  		name = "%s"
  1262  		machine_type = "n1-standard-1"
  1263  		zone = "us-central1-a"
  1264  
  1265  		disk {
  1266  			image = "debian-8-jessie-v20160803"
  1267  		}
  1268  
  1269  		network_interface {
  1270  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1271  		    address = "%s"
  1272  			access_config {	}
  1273  		}
  1274  
  1275  	}`, acctest.RandString(10), acctest.RandString(10), instance, address)
  1276  }
  1277  
  1278  func testAccComputeInstance_private_image_family(disk, image, family, instance string) string {
  1279  	return fmt.Sprintf(`
  1280  		resource "google_compute_disk" "foobar" {
  1281  			name = "%s"
  1282  			zone = "us-central1-a"
  1283  			image = "debian-8-jessie-v20160803"
  1284  		}
  1285  
  1286  		resource "google_compute_image" "foobar" {
  1287  			name = "%s"
  1288  			source_disk = "${google_compute_disk.foobar.self_link}"
  1289  			family = "%s"
  1290  		}
  1291  
  1292  		resource "google_compute_instance" "foobar" {
  1293  			name = "%s"
  1294  			machine_type = "n1-standard-1"
  1295  			zone = "us-central1-a"
  1296  
  1297  			disk {
  1298  				image = "${google_compute_image.foobar.family}"
  1299  			}
  1300  
  1301  			network_interface {
  1302  				network = "default"
  1303  			}
  1304  
  1305  			metadata {
  1306  				foo = "bar"
  1307  			}
  1308  		}`, disk, image, family, instance)
  1309  }
  1310  
  1311  func testAccComputeInstance_invalid_disk(disk, instance string) string {
  1312  	return fmt.Sprintf(`
  1313  		resource "google_compute_instance" "foobar" {
  1314  		  name         = "%s"
  1315  		  machine_type = "f1-micro"
  1316  		  zone         = "us-central1-a"
  1317  
  1318  		  disk {
  1319  		    image = "ubuntu-os-cloud/ubuntu-1604-lts"
  1320  		    type  = "pd-standard"
  1321  		  }
  1322  
  1323  		  disk {
  1324  		    disk        = "${google_compute_disk.foobar.name}"
  1325  		    type        = "pd-standard"
  1326  		    device_name = "xvdb"
  1327  		  }
  1328  
  1329  		  network_interface {
  1330  		    network = "default"
  1331  		  }
  1332  		}
  1333  
  1334  		resource "google_compute_disk" "foobar" {
  1335  		  name = "%s"
  1336  		  zone = "us-central1-a"
  1337  		  type = "pd-standard"
  1338  		  size = "1"
  1339  		}`, instance, disk)
  1340  }