github.com/nov1n/terraform@v0.7.9-0.20161103151050-bf6852f38e28/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  
   462  func TestAccComputeInstance_private_image_family(t *testing.T) {
   463  	var instance compute.Instance
   464  	var instanceName = fmt.Sprintf("instance-test-%s", acctest.RandString(10))
   465  	var diskName = fmt.Sprintf("instance-testd-%s", acctest.RandString(10))
   466  	var imageName = fmt.Sprintf("instance-testi-%s", acctest.RandString(10))
   467  	var familyName = fmt.Sprintf("instance-testf-%s", acctest.RandString(10))
   468  
   469  	resource.Test(t, resource.TestCase{
   470  		PreCheck:     func() { testAccPreCheck(t) },
   471  		Providers:    testAccProviders,
   472  		CheckDestroy: testAccCheckComputeInstanceDestroy,
   473  		Steps: []resource.TestStep{
   474  			resource.TestStep{
   475  				Config: testAccComputeInstance_private_image_family(diskName, imageName, familyName, instanceName),
   476  				Check: resource.ComposeTestCheckFunc(
   477  					testAccCheckComputeInstanceExists(
   478  						"google_compute_instance.foobar", &instance),
   479  				),
   480  			},
   481  		},
   482  	})
   483  }
   484  
   485  func testAccCheckComputeInstanceDestroy(s *terraform.State) error {
   486  	config := testAccProvider.Meta().(*Config)
   487  
   488  	for _, rs := range s.RootModule().Resources {
   489  		if rs.Type != "google_compute_instance" {
   490  			continue
   491  		}
   492  
   493  		_, err := config.clientCompute.Instances.Get(
   494  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   495  		if err == nil {
   496  			return fmt.Errorf("Instance still exists")
   497  		}
   498  	}
   499  
   500  	return nil
   501  }
   502  
   503  func testAccCheckComputeInstanceExists(n string, instance *compute.Instance) resource.TestCheckFunc {
   504  	return func(s *terraform.State) error {
   505  		rs, ok := s.RootModule().Resources[n]
   506  		if !ok {
   507  			return fmt.Errorf("Not found: %s", n)
   508  		}
   509  
   510  		if rs.Primary.ID == "" {
   511  			return fmt.Errorf("No ID is set")
   512  		}
   513  
   514  		config := testAccProvider.Meta().(*Config)
   515  
   516  		found, err := config.clientCompute.Instances.Get(
   517  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   518  		if err != nil {
   519  			return err
   520  		}
   521  
   522  		if found.Name != rs.Primary.ID {
   523  			return fmt.Errorf("Instance not found")
   524  		}
   525  
   526  		*instance = *found
   527  
   528  		return nil
   529  	}
   530  }
   531  
   532  func testAccCheckComputeInstanceMetadata(
   533  	instance *compute.Instance,
   534  	k string, v string) resource.TestCheckFunc {
   535  	return func(s *terraform.State) error {
   536  		if instance.Metadata == nil {
   537  			return fmt.Errorf("no metadata")
   538  		}
   539  
   540  		for _, item := range instance.Metadata.Items {
   541  			if k != item.Key {
   542  				continue
   543  			}
   544  
   545  			if item.Value != nil && v == *item.Value {
   546  				return nil
   547  			}
   548  
   549  			return fmt.Errorf("bad value for %s: %s", k, *item.Value)
   550  		}
   551  
   552  		return fmt.Errorf("metadata not found: %s", k)
   553  	}
   554  }
   555  
   556  func testAccCheckComputeInstanceAccessConfig(instance *compute.Instance) resource.TestCheckFunc {
   557  	return func(s *terraform.State) error {
   558  		for _, i := range instance.NetworkInterfaces {
   559  			if len(i.AccessConfigs) == 0 {
   560  				return fmt.Errorf("no access_config")
   561  			}
   562  		}
   563  
   564  		return nil
   565  	}
   566  }
   567  
   568  func testAccCheckComputeInstanceAccessConfigHasIP(instance *compute.Instance) resource.TestCheckFunc {
   569  	return func(s *terraform.State) error {
   570  		for _, i := range instance.NetworkInterfaces {
   571  			for _, c := range i.AccessConfigs {
   572  				if c.NatIP == "" {
   573  					return fmt.Errorf("no NAT IP")
   574  				}
   575  			}
   576  		}
   577  
   578  		return nil
   579  	}
   580  }
   581  
   582  func testAccCheckComputeInstanceDisk(instance *compute.Instance, source string, delete bool, boot bool) resource.TestCheckFunc {
   583  	return func(s *terraform.State) error {
   584  		if instance.Disks == nil {
   585  			return fmt.Errorf("no disks")
   586  		}
   587  
   588  		for _, disk := range instance.Disks {
   589  			if strings.LastIndex(disk.Source, "/"+source) == len(disk.Source)-len(source)-1 && disk.AutoDelete == delete && disk.Boot == boot {
   590  				return nil
   591  			}
   592  		}
   593  
   594  		return fmt.Errorf("Disk not found: %s", source)
   595  	}
   596  }
   597  
   598  func testAccCheckComputeInstanceTag(instance *compute.Instance, n string) resource.TestCheckFunc {
   599  	return func(s *terraform.State) error {
   600  		if instance.Tags == nil {
   601  			return fmt.Errorf("no tags")
   602  		}
   603  
   604  		for _, k := range instance.Tags.Items {
   605  			if k == n {
   606  				return nil
   607  			}
   608  		}
   609  
   610  		return fmt.Errorf("tag not found: %s", n)
   611  	}
   612  }
   613  
   614  func testAccCheckComputeInstanceServiceAccount(instance *compute.Instance, scope string) resource.TestCheckFunc {
   615  	return func(s *terraform.State) error {
   616  		if count := len(instance.ServiceAccounts); count != 1 {
   617  			return fmt.Errorf("Wrong number of ServiceAccounts: expected 1, got %d", count)
   618  		}
   619  
   620  		for _, val := range instance.ServiceAccounts[0].Scopes {
   621  			if val == scope {
   622  				return nil
   623  			}
   624  		}
   625  
   626  		return fmt.Errorf("Scope not found: %s", scope)
   627  	}
   628  }
   629  
   630  func testAccCheckComputeInstanceHasSubnet(instance *compute.Instance) resource.TestCheckFunc {
   631  	return func(s *terraform.State) error {
   632  		for _, i := range instance.NetworkInterfaces {
   633  			if i.Subnetwork == "" {
   634  				return fmt.Errorf("no subnet")
   635  			}
   636  		}
   637  
   638  		return nil
   639  	}
   640  }
   641  
   642  func testAccCheckComputeInstanceHasAnyAddress(instance *compute.Instance) resource.TestCheckFunc {
   643  	return func(s *terraform.State) error {
   644  		for _, i := range instance.NetworkInterfaces {
   645  			if i.NetworkIP == "" {
   646  				return fmt.Errorf("no address")
   647  			}
   648  		}
   649  
   650  		return nil
   651  	}
   652  }
   653  
   654  func testAccCheckComputeInstanceHasAddress(instance *compute.Instance, address string) resource.TestCheckFunc {
   655  	return func(s *terraform.State) error {
   656  		for _, i := range instance.NetworkInterfaces {
   657  			if i.NetworkIP != address {
   658  				return fmt.Errorf("Wrong address found: expected %v, got %v", address, i.NetworkIP)
   659  			}
   660  		}
   661  
   662  		return nil
   663  	}
   664  }
   665  
   666  func testAccComputeInstance_basic_deprecated_network(instance string) string {
   667  	return fmt.Sprintf(`
   668  	resource "google_compute_instance" "foobar" {
   669  		name = "%s"
   670  		machine_type = "n1-standard-1"
   671  		zone = "us-central1-a"
   672  		can_ip_forward = false
   673  		tags = ["foo", "bar"]
   674  
   675  		disk {
   676  			image = "debian-8-jessie-v20160803"
   677  		}
   678  
   679  		network {
   680  			source = "default"
   681  		}
   682  
   683  		metadata {
   684  			foo = "bar"
   685  		}
   686  	}`, instance)
   687  }
   688  
   689  func testAccComputeInstance_update_deprecated_network(instance string) string {
   690  	return fmt.Sprintf(`
   691  	resource "google_compute_instance" "foobar" {
   692  		name = "%s"
   693  		machine_type = "n1-standard-1"
   694  		zone = "us-central1-a"
   695  		tags = ["baz"]
   696  
   697  		disk {
   698  			image = "debian-8-jessie-v20160803"
   699  		}
   700  
   701  		network {
   702  			source = "default"
   703  		}
   704  
   705  		metadata {
   706  			bar = "baz"
   707  		}
   708  	}`, instance)
   709  }
   710  
   711  func testAccComputeInstance_basic(instance string) string {
   712  	return fmt.Sprintf(`
   713  	resource "google_compute_instance" "foobar" {
   714  		name = "%s"
   715  		machine_type = "n1-standard-1"
   716  		zone = "us-central1-a"
   717  		can_ip_forward = false
   718  		tags = ["foo", "bar"]
   719  
   720  		disk {
   721  			image = "debian-8-jessie-v20160803"
   722  		}
   723  
   724  		network_interface {
   725  			network = "default"
   726  		}
   727  
   728  		metadata {
   729  			foo = "bar"
   730  			baz = "qux"
   731  		}
   732  
   733  		metadata_startup_script = "echo Hello"
   734  	}`, instance)
   735  }
   736  
   737  func testAccComputeInstance_basic2(instance string) string {
   738  	return fmt.Sprintf(`
   739  	resource "google_compute_instance" "foobar" {
   740  		name = "%s"
   741  		machine_type = "n1-standard-1"
   742  		zone = "us-central1-a"
   743  		can_ip_forward = false
   744  		tags = ["foo", "bar"]
   745  
   746  		disk {
   747  			image = "debian-8"
   748  		}
   749  
   750  		network_interface {
   751  			network = "default"
   752  		}
   753  
   754  		metadata {
   755  			foo = "bar"
   756  		}
   757  	}`, instance)
   758  }
   759  
   760  func testAccComputeInstance_basic3(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-jessie-v20160803"
   771  		}
   772  
   773  		network_interface {
   774  			network = "default"
   775  		}
   776  
   777  
   778  		metadata {
   779  			foo = "bar"
   780  		}
   781  	}`, instance)
   782  }
   783  
   784  func testAccComputeInstance_basic4(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 = "debian-cloud/debian-8"
   795  		}
   796  
   797  		network_interface {
   798  			network = "default"
   799  		}
   800  
   801  
   802  		metadata {
   803  			foo = "bar"
   804  		}
   805  	}`, instance)
   806  }
   807  
   808  func testAccComputeInstance_basic5(instance string) string {
   809  	return fmt.Sprintf(`
   810  	resource "google_compute_instance" "foobar" {
   811  		name = "%s"
   812  		machine_type = "n1-standard-1"
   813  		zone = "us-central1-a"
   814  		can_ip_forward = false
   815  		tags = ["foo", "bar"]
   816  
   817  		disk {
   818  			image = "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20160803"
   819  		}
   820  
   821  		network_interface {
   822  			network = "default"
   823  		}
   824  
   825  		metadata {
   826  			foo = "bar"
   827  		}
   828  	}`, instance)
   829  }
   830  
   831  // Update zone to ForceNew, and change metadata k/v entirely
   832  // Generates diff mismatch
   833  func testAccComputeInstance_forceNewAndChangeMetadata(instance string) string {
   834  	return fmt.Sprintf(`
   835  	resource "google_compute_instance" "foobar" {
   836  		name = "%s"
   837  		machine_type = "n1-standard-1"
   838  		zone = "us-central1-a"
   839  		zone = "us-central1-b"
   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  			qux = "true"
   853  		}
   854  	}`, instance)
   855  }
   856  
   857  // Update metadata, tags, and network_interface
   858  func testAccComputeInstance_update(instance string) string {
   859  	return fmt.Sprintf(`
   860  	resource "google_compute_instance" "foobar" {
   861  		name = "%s"
   862  		machine_type = "n1-standard-1"
   863  		zone = "us-central1-a"
   864  		tags = ["baz"]
   865  
   866  		disk {
   867  			image = "debian-8-jessie-v20160803"
   868  		}
   869  
   870  		network_interface {
   871  			network = "default"
   872  			access_config { }
   873  		}
   874  
   875  		metadata {
   876  			bar = "baz"
   877  		}
   878  	}`, instance)
   879  }
   880  
   881  func testAccComputeInstance_ip(ip, instance string) string {
   882  	return fmt.Sprintf(`
   883  	resource "google_compute_address" "foo" {
   884  		name = "%s"
   885  	}
   886  
   887  	resource "google_compute_instance" "foobar" {
   888  		name = "%s"
   889  		machine_type = "n1-standard-1"
   890  		zone = "us-central1-a"
   891  		tags = ["foo", "bar"]
   892  
   893  		disk {
   894  			image = "debian-8-jessie-v20160803"
   895  		}
   896  
   897  		network_interface {
   898  			network = "default"
   899  			access_config {
   900  				nat_ip = "${google_compute_address.foo.address}"
   901  			}
   902  		}
   903  
   904  		metadata {
   905  			foo = "bar"
   906  		}
   907  	}`, ip, instance)
   908  }
   909  
   910  func testAccComputeInstance_disks(disk, instance string, autodelete bool) string {
   911  	return fmt.Sprintf(`
   912  	resource "google_compute_disk" "foobar" {
   913  		name = "%s"
   914  		size = 10
   915  		type = "pd-ssd"
   916  		zone = "us-central1-a"
   917  	}
   918  
   919  	resource "google_compute_instance" "foobar" {
   920  		name = "%s"
   921  		machine_type = "n1-standard-1"
   922  		zone = "us-central1-a"
   923  
   924  		disk {
   925  			image = "debian-8-jessie-v20160803"
   926  		}
   927  
   928  		disk {
   929  			disk = "${google_compute_disk.foobar.name}"
   930  			auto_delete = %v
   931  		}
   932  
   933  		network_interface {
   934  			network = "default"
   935  		}
   936  
   937  		metadata {
   938  			foo = "bar"
   939  		}
   940  	}`, disk, instance, autodelete)
   941  }
   942  
   943  func testAccComputeInstance_local_ssd(instance string) string {
   944  	return fmt.Sprintf(`
   945  	resource "google_compute_instance" "local-ssd" {
   946  		name = "%s"
   947  		machine_type = "n1-standard-1"
   948  		zone = "us-central1-a"
   949  
   950  		disk {
   951  			image = "debian-8-jessie-v20160803"
   952  		}
   953  
   954  		disk {
   955  			type = "local-ssd"
   956  			scratch = true
   957  		}
   958  
   959  		network_interface {
   960  			network = "default"
   961  		}
   962  
   963  	}`, instance)
   964  }
   965  
   966  func testAccComputeInstance_service_account(instance string) string {
   967  	return fmt.Sprintf(`
   968  	resource "google_compute_instance" "foobar" {
   969  		name = "%s"
   970  		machine_type = "n1-standard-1"
   971  		zone = "us-central1-a"
   972  
   973  		disk {
   974  			image = "debian-8-jessie-v20160803"
   975  		}
   976  
   977  		network_interface {
   978  			network = "default"
   979  		}
   980  
   981  		service_account {
   982  			scopes = [
   983  				"userinfo-email",
   984  				"compute-ro",
   985  				"storage-ro",
   986  			]
   987  		}
   988  	}`, instance)
   989  }
   990  
   991  func testAccComputeInstance_scheduling(instance string) string {
   992  	return fmt.Sprintf(`
   993  	resource "google_compute_instance" "foobar" {
   994  		name = "%s"
   995  		machine_type = "n1-standard-1"
   996  		zone = "us-central1-a"
   997  
   998  		disk {
   999  			image = "debian-8-jessie-v20160803"
  1000  		}
  1001  
  1002  		network_interface {
  1003  			network = "default"
  1004  		}
  1005  
  1006  		scheduling {
  1007  		}
  1008  	}`, instance)
  1009  }
  1010  
  1011  func testAccComputeInstance_subnet_auto(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 = true
  1016  	}
  1017  
  1018  	resource "google_compute_instance" "foobar" {
  1019  		name = "%s"
  1020  		machine_type = "n1-standard-1"
  1021  		zone = "us-central1-a"
  1022  
  1023  		disk {
  1024  			image = "debian-8-jessie-v20160803"
  1025  		}
  1026  
  1027  		network_interface {
  1028  			network = "${google_compute_network.inst-test-network.name}"
  1029  			access_config {	}
  1030  		}
  1031  
  1032  	}`, acctest.RandString(10), instance)
  1033  }
  1034  
  1035  func testAccComputeInstance_subnet_custom(instance string) string {
  1036  	return fmt.Sprintf(`
  1037  	resource "google_compute_network" "inst-test-network" {
  1038  		name = "inst-test-network-%s"
  1039  		auto_create_subnetworks = false
  1040  	}
  1041  
  1042  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1043  		name = "inst-test-subnetwork-%s"
  1044  		ip_cidr_range = "10.0.0.0/16"
  1045  		region = "us-central1"
  1046  		network = "${google_compute_network.inst-test-network.self_link}"
  1047  	}
  1048  
  1049  	resource "google_compute_instance" "foobar" {
  1050  		name = "%s"
  1051  		machine_type = "n1-standard-1"
  1052  		zone = "us-central1-a"
  1053  
  1054  		disk {
  1055  			image = "debian-8-jessie-v20160803"
  1056  		}
  1057  
  1058  		network_interface {
  1059  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1060  			access_config {	}
  1061  		}
  1062  
  1063  	}`, acctest.RandString(10), acctest.RandString(10), instance)
  1064  }
  1065  
  1066  func testAccComputeInstance_address_auto(instance string) string {
  1067  	return fmt.Sprintf(`
  1068  	resource "google_compute_network" "inst-test-network" {
  1069  		name = "inst-test-network-%s"
  1070  	}
  1071  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1072  		name = "inst-test-subnetwork-%s"
  1073  		ip_cidr_range = "10.0.0.0/16"
  1074  		region = "us-central1"
  1075  		network = "${google_compute_network.inst-test-network.self_link}"
  1076  	}
  1077  	resource "google_compute_instance" "foobar" {
  1078  		name = "%s"
  1079  		machine_type = "n1-standard-1"
  1080  		zone = "us-central1-a"
  1081  
  1082  		disk {
  1083  			image = "debian-8-jessie-v20160803"
  1084  		}
  1085  
  1086  		network_interface {
  1087  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1088  			access_config {	}
  1089  		}
  1090  
  1091  	}`, acctest.RandString(10), acctest.RandString(10), instance)
  1092  }
  1093  
  1094  func testAccComputeInstance_address_custom(instance, address string) string {
  1095  	return fmt.Sprintf(`
  1096  	resource "google_compute_network" "inst-test-network" {
  1097  		name = "inst-test-network-%s"
  1098  	}
  1099  	resource "google_compute_subnetwork" "inst-test-subnetwork" {
  1100  		name = "inst-test-subnetwork-%s"
  1101  		ip_cidr_range = "10.0.0.0/16"
  1102  		region = "us-central1"
  1103  		network = "${google_compute_network.inst-test-network.self_link}"
  1104  	}
  1105  	resource "google_compute_instance" "foobar" {
  1106  		name = "%s"
  1107  		machine_type = "n1-standard-1"
  1108  		zone = "us-central1-a"
  1109  
  1110  		disk {
  1111  			image = "debian-8-jessie-v20160803"
  1112  		}
  1113  
  1114  		network_interface {
  1115  			subnetwork = "${google_compute_subnetwork.inst-test-subnetwork.name}"
  1116  		    address = "%s"
  1117  			access_config {	}
  1118  		}
  1119  
  1120  	}`, acctest.RandString(10), acctest.RandString(10), instance, address)
  1121  }
  1122  
  1123  func testAccComputeInstance_private_image_family(disk, image, family, instance string) string {
  1124  	return fmt.Sprintf(`
  1125  		resource "google_compute_disk" "foobar" {
  1126  			name = "%s"
  1127  			zone = "us-central1-a"
  1128  			image = "debian-8-jessie-v20160803"
  1129  		}
  1130  
  1131  		resource "google_compute_image" "foobar" {
  1132  			name = "%s"
  1133  			source_disk = "${google_compute_disk.foobar.self_link}"
  1134  			family = "%s"
  1135  		}
  1136  
  1137  		resource "google_compute_instance" "foobar" {
  1138  			name = "%s"
  1139  			machine_type = "n1-standard-1"
  1140  			zone = "us-central1-a"
  1141  
  1142  			disk {
  1143  				image = "${google_compute_image.foobar.family}"
  1144  			}
  1145  
  1146  			network_interface {
  1147  				network = "default"
  1148  			}
  1149  
  1150  			metadata {
  1151  				foo = "bar"
  1152  			}
  1153  		}`, disk, image, family, instance)
  1154  }