github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/google/resource_compute_instance_group_manager_test.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"strings"
     7  	"testing"
     8  
     9  	"google.golang.org/api/compute/v1"
    10  
    11  	"github.com/hashicorp/terraform/helper/acctest"
    12  	"github.com/hashicorp/terraform/helper/resource"
    13  	"github.com/hashicorp/terraform/terraform"
    14  )
    15  
    16  func TestAccInstanceGroupManager_basic(t *testing.T) {
    17  	var manager compute.InstanceGroupManager
    18  
    19  	template := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    20  	target := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    21  	igm1 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    22  	igm2 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    23  
    24  	resource.Test(t, resource.TestCase{
    25  		PreCheck:     func() { testAccPreCheck(t) },
    26  		Providers:    testAccProviders,
    27  		CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
    28  		Steps: []resource.TestStep{
    29  			resource.TestStep{
    30  				Config: testAccInstanceGroupManager_basic(template, target, igm1, igm2),
    31  				Check: resource.ComposeTestCheckFunc(
    32  					testAccCheckInstanceGroupManagerExists(
    33  						"google_compute_instance_group_manager.igm-basic", &manager),
    34  					testAccCheckInstanceGroupManagerExists(
    35  						"google_compute_instance_group_manager.igm-no-tp", &manager),
    36  				),
    37  			},
    38  		},
    39  	})
    40  }
    41  
    42  func TestAccInstanceGroupManager_update(t *testing.T) {
    43  	var manager compute.InstanceGroupManager
    44  
    45  	template1 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    46  	target := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    47  	template2 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    48  	igm := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    49  
    50  	resource.Test(t, resource.TestCase{
    51  		PreCheck:     func() { testAccPreCheck(t) },
    52  		Providers:    testAccProviders,
    53  		CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
    54  		Steps: []resource.TestStep{
    55  			resource.TestStep{
    56  				Config: testAccInstanceGroupManager_update(template1, target, igm),
    57  				Check: resource.ComposeTestCheckFunc(
    58  					testAccCheckInstanceGroupManagerExists(
    59  						"google_compute_instance_group_manager.igm-update", &manager),
    60  					testAccCheckInstanceGroupManagerNamedPorts(
    61  						"google_compute_instance_group_manager.igm-update",
    62  						map[string]int64{"customhttp": 8080},
    63  						&manager),
    64  				),
    65  			},
    66  			resource.TestStep{
    67  				Config: testAccInstanceGroupManager_update2(template1, target, template2, igm),
    68  				Check: resource.ComposeTestCheckFunc(
    69  					testAccCheckInstanceGroupManagerExists(
    70  						"google_compute_instance_group_manager.igm-update", &manager),
    71  					testAccCheckInstanceGroupManagerUpdated(
    72  						"google_compute_instance_group_manager.igm-update", 3,
    73  						"google_compute_target_pool.igm-update", template2),
    74  					testAccCheckInstanceGroupManagerNamedPorts(
    75  						"google_compute_instance_group_manager.igm-update",
    76  						map[string]int64{"customhttp": 8080, "customhttps": 8443},
    77  						&manager),
    78  				),
    79  			},
    80  		},
    81  	})
    82  }
    83  
    84  func TestAccInstanceGroupManager_updateLifecycle(t *testing.T) {
    85  	var manager compute.InstanceGroupManager
    86  
    87  	tag1 := "tag1"
    88  	tag2 := "tag2"
    89  	igm := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    90  
    91  	resource.Test(t, resource.TestCase{
    92  		PreCheck:     func() { testAccPreCheck(t) },
    93  		Providers:    testAccProviders,
    94  		CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
    95  		Steps: []resource.TestStep{
    96  			resource.TestStep{
    97  				Config: testAccInstanceGroupManager_updateLifecycle(tag1, igm),
    98  				Check: resource.ComposeTestCheckFunc(
    99  					testAccCheckInstanceGroupManagerExists(
   100  						"google_compute_instance_group_manager.igm-update", &manager),
   101  				),
   102  			},
   103  			resource.TestStep{
   104  				Config: testAccInstanceGroupManager_updateLifecycle(tag2, igm),
   105  				Check: resource.ComposeTestCheckFunc(
   106  					testAccCheckInstanceGroupManagerExists(
   107  						"google_compute_instance_group_manager.igm-update", &manager),
   108  					testAccCheckInstanceGroupManagerTemplateTags(
   109  						"google_compute_instance_group_manager.igm-update", []string{tag2}),
   110  				),
   111  			},
   112  		},
   113  	})
   114  }
   115  
   116  func TestAccInstanceGroupManager_updateStrategy(t *testing.T) {
   117  	var manager compute.InstanceGroupManager
   118  	igm := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
   119  
   120  	resource.Test(t, resource.TestCase{
   121  		PreCheck:     func() { testAccPreCheck(t) },
   122  		Providers:    testAccProviders,
   123  		CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
   124  		Steps: []resource.TestStep{
   125  			resource.TestStep{
   126  				Config: testAccInstanceGroupManager_updateStrategy(igm),
   127  				Check: resource.ComposeTestCheckFunc(
   128  					testAccCheckInstanceGroupManagerExists(
   129  						"google_compute_instance_group_manager.igm-update-strategy", &manager),
   130  					testAccCheckInstanceGroupManagerUpdateStrategy(
   131  						"google_compute_instance_group_manager.igm-update-strategy", "NONE"),
   132  				),
   133  			},
   134  		},
   135  	})
   136  }
   137  
   138  func TestAccInstanceGroupManager_separateRegions(t *testing.T) {
   139  	var manager compute.InstanceGroupManager
   140  
   141  	igm1 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
   142  	igm2 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
   143  
   144  	resource.Test(t, resource.TestCase{
   145  		PreCheck:     func() { testAccPreCheck(t) },
   146  		Providers:    testAccProviders,
   147  		CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
   148  		Steps: []resource.TestStep{
   149  			resource.TestStep{
   150  				Config: testAccInstanceGroupManager_separateRegions(igm1, igm2),
   151  				Check: resource.ComposeTestCheckFunc(
   152  					testAccCheckInstanceGroupManagerExists(
   153  						"google_compute_instance_group_manager.igm-basic", &manager),
   154  					testAccCheckInstanceGroupManagerExists(
   155  						"google_compute_instance_group_manager.igm-basic-2", &manager),
   156  				),
   157  			},
   158  		},
   159  	})
   160  }
   161  
   162  func testAccCheckInstanceGroupManagerDestroy(s *terraform.State) error {
   163  	config := testAccProvider.Meta().(*Config)
   164  
   165  	for _, rs := range s.RootModule().Resources {
   166  		if rs.Type != "google_compute_instance_group_manager" {
   167  			continue
   168  		}
   169  		_, err := config.clientCompute.InstanceGroupManagers.Get(
   170  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   171  		if err == nil {
   172  			return fmt.Errorf("InstanceGroupManager still exists")
   173  		}
   174  	}
   175  
   176  	return nil
   177  }
   178  
   179  func testAccCheckInstanceGroupManagerExists(n string, manager *compute.InstanceGroupManager) resource.TestCheckFunc {
   180  	return func(s *terraform.State) error {
   181  		rs, ok := s.RootModule().Resources[n]
   182  		if !ok {
   183  			return fmt.Errorf("Not found: %s", n)
   184  		}
   185  
   186  		if rs.Primary.ID == "" {
   187  			return fmt.Errorf("No ID is set")
   188  		}
   189  
   190  		config := testAccProvider.Meta().(*Config)
   191  
   192  		found, err := config.clientCompute.InstanceGroupManagers.Get(
   193  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   194  		if err != nil {
   195  			return err
   196  		}
   197  
   198  		if found.Name != rs.Primary.ID {
   199  			return fmt.Errorf("InstanceGroupManager not found")
   200  		}
   201  
   202  		*manager = *found
   203  
   204  		return nil
   205  	}
   206  }
   207  
   208  func testAccCheckInstanceGroupManagerUpdated(n string, size int64, targetPool string, template string) resource.TestCheckFunc {
   209  	return func(s *terraform.State) error {
   210  		rs, ok := s.RootModule().Resources[n]
   211  		if !ok {
   212  			return fmt.Errorf("Not found: %s", n)
   213  		}
   214  
   215  		if rs.Primary.ID == "" {
   216  			return fmt.Errorf("No ID is set")
   217  		}
   218  
   219  		config := testAccProvider.Meta().(*Config)
   220  
   221  		manager, err := config.clientCompute.InstanceGroupManagers.Get(
   222  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   223  		if err != nil {
   224  			return err
   225  		}
   226  
   227  		// Cannot check the target pool as the instance creation is asynchronous.  However, can
   228  		// check the target_size.
   229  		if manager.TargetSize != size {
   230  			return fmt.Errorf("instance count incorrect")
   231  		}
   232  
   233  		// check that the instance template updated
   234  		instanceTemplate, err := config.clientCompute.InstanceTemplates.Get(
   235  			config.Project, template).Do()
   236  		if err != nil {
   237  			return fmt.Errorf("Error reading instance template: %s", err)
   238  		}
   239  
   240  		if instanceTemplate.Name != template {
   241  			return fmt.Errorf("instance template not updated")
   242  		}
   243  
   244  		return nil
   245  	}
   246  }
   247  
   248  func testAccCheckInstanceGroupManagerNamedPorts(n string, np map[string]int64, instanceGroupManager *compute.InstanceGroupManager) resource.TestCheckFunc {
   249  	return func(s *terraform.State) error {
   250  		rs, ok := s.RootModule().Resources[n]
   251  		if !ok {
   252  			return fmt.Errorf("Not found: %s", n)
   253  		}
   254  
   255  		if rs.Primary.ID == "" {
   256  			return fmt.Errorf("No ID is set")
   257  		}
   258  
   259  		config := testAccProvider.Meta().(*Config)
   260  
   261  		manager, err := config.clientCompute.InstanceGroupManagers.Get(
   262  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   263  		if err != nil {
   264  			return err
   265  		}
   266  
   267  		var found bool
   268  		for _, namedPort := range manager.NamedPorts {
   269  			found = false
   270  			for name, port := range np {
   271  				if namedPort.Name == name && namedPort.Port == port {
   272  					found = true
   273  				}
   274  			}
   275  			if !found {
   276  				return fmt.Errorf("named port incorrect")
   277  			}
   278  		}
   279  
   280  		return nil
   281  	}
   282  }
   283  
   284  func testAccCheckInstanceGroupManagerTemplateTags(n string, tags []string) resource.TestCheckFunc {
   285  	return func(s *terraform.State) error {
   286  		rs, ok := s.RootModule().Resources[n]
   287  		if !ok {
   288  			return fmt.Errorf("Not found: %s", n)
   289  		}
   290  
   291  		if rs.Primary.ID == "" {
   292  			return fmt.Errorf("No ID is set")
   293  		}
   294  
   295  		config := testAccProvider.Meta().(*Config)
   296  
   297  		manager, err := config.clientCompute.InstanceGroupManagers.Get(
   298  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   299  		if err != nil {
   300  			return err
   301  		}
   302  
   303  		// check that the instance template updated
   304  		instanceTemplate, err := config.clientCompute.InstanceTemplates.Get(
   305  			config.Project, resourceSplitter(manager.InstanceTemplate)).Do()
   306  		if err != nil {
   307  			return fmt.Errorf("Error reading instance template: %s", err)
   308  		}
   309  
   310  		if !reflect.DeepEqual(instanceTemplate.Properties.Tags.Items, tags) {
   311  			return fmt.Errorf("instance template not updated")
   312  		}
   313  
   314  		return nil
   315  	}
   316  }
   317  
   318  func testAccCheckInstanceGroupManagerUpdateStrategy(n, strategy string) resource.TestCheckFunc {
   319  	return func(s *terraform.State) error {
   320  		rs, ok := s.RootModule().Resources[n]
   321  		if !ok {
   322  			return fmt.Errorf("Not found: %s", n)
   323  		}
   324  
   325  		if rs.Primary.ID == "" {
   326  			return fmt.Errorf("No ID is set")
   327  		}
   328  
   329  		if rs.Primary.Attributes["update_strategy"] != strategy {
   330  			return fmt.Errorf("Expected strategy to be %s, got %s",
   331  				strategy, rs.Primary.Attributes["update_strategy"])
   332  		}
   333  		return nil
   334  	}
   335  }
   336  
   337  func testAccInstanceGroupManager_basic(template, target, igm1, igm2 string) string {
   338  	return fmt.Sprintf(`
   339  	resource "google_compute_instance_template" "igm-basic" {
   340  		name = "%s"
   341  		machine_type = "n1-standard-1"
   342  		can_ip_forward = false
   343  		tags = ["foo", "bar"]
   344  
   345  		disk {
   346  			source_image = "debian-cloud/debian-8-jessie-v20160803"
   347  			auto_delete = true
   348  			boot = true
   349  		}
   350  
   351  		network_interface {
   352  			network = "default"
   353  		}
   354  
   355  		metadata {
   356  			foo = "bar"
   357  		}
   358  
   359  		service_account {
   360  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   361  		}
   362  	}
   363  
   364  	resource "google_compute_target_pool" "igm-basic" {
   365  		description = "Resource created for Terraform acceptance testing"
   366  		name = "%s"
   367  		session_affinity = "CLIENT_IP_PROTO"
   368  	}
   369  
   370  	resource "google_compute_instance_group_manager" "igm-basic" {
   371  		description = "Terraform test instance group manager"
   372  		name = "%s"
   373  		instance_template = "${google_compute_instance_template.igm-basic.self_link}"
   374  		target_pools = ["${google_compute_target_pool.igm-basic.self_link}"]
   375  		base_instance_name = "igm-basic"
   376  		zone = "us-central1-c"
   377  		target_size = 2
   378  	}
   379  
   380  	resource "google_compute_instance_group_manager" "igm-no-tp" {
   381  		description = "Terraform test instance group manager"
   382  		name = "%s"
   383  		instance_template = "${google_compute_instance_template.igm-basic.self_link}"
   384  		base_instance_name = "igm-no-tp"
   385  		zone = "us-central1-c"
   386  		target_size = 2
   387  	}
   388  	`, template, target, igm1, igm2)
   389  }
   390  
   391  func testAccInstanceGroupManager_update(template, target, igm string) string {
   392  	return fmt.Sprintf(`
   393  	resource "google_compute_instance_template" "igm-update" {
   394  		name = "%s"
   395  		machine_type = "n1-standard-1"
   396  		can_ip_forward = false
   397  		tags = ["foo", "bar"]
   398  
   399  		disk {
   400  			source_image = "debian-cloud/debian-8-jessie-v20160803"
   401  			auto_delete = true
   402  			boot = true
   403  		}
   404  
   405  		network_interface {
   406  			network = "default"
   407  		}
   408  
   409  		metadata {
   410  			foo = "bar"
   411  		}
   412  
   413  		service_account {
   414  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   415  		}
   416  	}
   417  
   418  	resource "google_compute_target_pool" "igm-update" {
   419  		description = "Resource created for Terraform acceptance testing"
   420  		name = "%s"
   421  		session_affinity = "CLIENT_IP_PROTO"
   422  	}
   423  
   424  	resource "google_compute_instance_group_manager" "igm-update" {
   425  		description = "Terraform test instance group manager"
   426  		name = "%s"
   427  		instance_template = "${google_compute_instance_template.igm-update.self_link}"
   428  		target_pools = ["${google_compute_target_pool.igm-update.self_link}"]
   429  		base_instance_name = "igm-update"
   430  		zone = "us-central1-c"
   431  		target_size = 2
   432  		named_port {
   433  			name = "customhttp"
   434  			port = 8080
   435  		}
   436  	}`, template, target, igm)
   437  }
   438  
   439  // Change IGM's instance template and target size
   440  func testAccInstanceGroupManager_update2(template1, target, template2, igm string) string {
   441  	return fmt.Sprintf(`
   442  	resource "google_compute_instance_template" "igm-update" {
   443  		name = "%s"
   444  		machine_type = "n1-standard-1"
   445  		can_ip_forward = false
   446  		tags = ["foo", "bar"]
   447  
   448  		disk {
   449  			source_image = "debian-cloud/debian-8-jessie-v20160803"
   450  			auto_delete = true
   451  			boot = true
   452  		}
   453  
   454  		network_interface {
   455  			network = "default"
   456  		}
   457  
   458  		metadata {
   459  			foo = "bar"
   460  		}
   461  
   462  		service_account {
   463  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   464  		}
   465  	}
   466  
   467  	resource "google_compute_target_pool" "igm-update" {
   468  		description = "Resource created for Terraform acceptance testing"
   469  		name = "%s"
   470  		session_affinity = "CLIENT_IP_PROTO"
   471  	}
   472  
   473  	resource "google_compute_instance_template" "igm-update2" {
   474  		name = "%s"
   475  		machine_type = "n1-standard-1"
   476  		can_ip_forward = false
   477  		tags = ["foo", "bar"]
   478  
   479  		disk {
   480  			source_image = "debian-cloud/debian-8-jessie-v20160803"
   481  			auto_delete = true
   482  			boot = true
   483  		}
   484  
   485  		network_interface {
   486  			network = "default"
   487  		}
   488  
   489  		metadata {
   490  			foo = "bar"
   491  		}
   492  
   493  		service_account {
   494  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   495  		}
   496  	}
   497  
   498  	resource "google_compute_instance_group_manager" "igm-update" {
   499  		description = "Terraform test instance group manager"
   500  		name = "%s"
   501  		instance_template = "${google_compute_instance_template.igm-update2.self_link}"
   502  		target_pools = ["${google_compute_target_pool.igm-update.self_link}"]
   503  		base_instance_name = "igm-update"
   504  		zone = "us-central1-c"
   505  		target_size = 3
   506  		named_port {
   507  			name = "customhttp"
   508  			port = 8080
   509  		}
   510  		named_port {
   511  			name = "customhttps"
   512  			port = 8443
   513  		}
   514  	}`, template1, target, template2, igm)
   515  }
   516  
   517  func testAccInstanceGroupManager_updateLifecycle(tag, igm string) string {
   518  	return fmt.Sprintf(`
   519  	resource "google_compute_instance_template" "igm-update" {
   520  		machine_type = "n1-standard-1"
   521  		can_ip_forward = false
   522  		tags = ["%s"]
   523  
   524  		disk {
   525  			source_image = "debian-cloud/debian-8-jessie-v20160803"
   526  			auto_delete = true
   527  			boot = true
   528  		}
   529  
   530  		network_interface {
   531  			network = "default"
   532  		}
   533  
   534  		service_account {
   535  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   536  		}
   537  
   538  		lifecycle {
   539  			create_before_destroy = true
   540  		}
   541  	}
   542  
   543  	resource "google_compute_instance_group_manager" "igm-update" {
   544  		description = "Terraform test instance group manager"
   545  		name = "%s"
   546  		instance_template = "${google_compute_instance_template.igm-update.self_link}"
   547  		base_instance_name = "igm-update"
   548  		zone = "us-central1-c"
   549  		target_size = 2
   550  		named_port {
   551  			name = "customhttp"
   552  			port = 8080
   553  		}
   554  	}`, tag, igm)
   555  }
   556  
   557  func testAccInstanceGroupManager_updateStrategy(igm string) string {
   558  	return fmt.Sprintf(`
   559  	resource "google_compute_instance_template" "igm-update-strategy" {
   560  		machine_type = "n1-standard-1"
   561  		can_ip_forward = false
   562  		tags = ["terraform-testing"]
   563  
   564  		disk {
   565  			source_image = "debian-cloud/debian-8-jessie-v20160803"
   566  			auto_delete = true
   567  			boot = true
   568  		}
   569  
   570  		network_interface {
   571  			network = "default"
   572  		}
   573  
   574  		service_account {
   575  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   576  		}
   577  
   578  		lifecycle {
   579  			create_before_destroy = true
   580  		}
   581  	}
   582  
   583  	resource "google_compute_instance_group_manager" "igm-update-strategy" {
   584  		description = "Terraform test instance group manager"
   585  		name = "%s"
   586  		instance_template = "${google_compute_instance_template.igm-update-strategy.self_link}"
   587  		base_instance_name = "igm-update-strategy"
   588  		zone = "us-central1-c"
   589  		target_size = 2
   590  		update_strategy = "NONE"
   591  		named_port {
   592  			name = "customhttp"
   593  			port = 8080
   594  		}
   595  	}`, igm)
   596  }
   597  
   598  func testAccInstanceGroupManager_separateRegions(igm1, igm2 string) string {
   599  	return fmt.Sprintf(`
   600  	resource "google_compute_instance_template" "igm-basic" {
   601  		machine_type = "n1-standard-1"
   602  		can_ip_forward = false
   603  		tags = ["foo", "bar"]
   604  
   605  		disk {
   606  			source_image = "debian-cloud/debian-8-jessie-v20160803"
   607  			auto_delete = true
   608  			boot = true
   609  		}
   610  
   611  		network_interface {
   612  			network = "default"
   613  		}
   614  
   615  		metadata {
   616  			foo = "bar"
   617  		}
   618  
   619  		service_account {
   620  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   621  		}
   622  	}
   623  
   624  	resource "google_compute_instance_group_manager" "igm-basic" {
   625  		description = "Terraform test instance group manager"
   626  		name = "%s"
   627  		instance_template = "${google_compute_instance_template.igm-basic.self_link}"
   628  		base_instance_name = "igm-basic"
   629  		zone = "us-central1-c"
   630  		target_size = 2
   631  	}
   632  
   633  	resource "google_compute_instance_group_manager" "igm-basic-2" {
   634  		description = "Terraform test instance group manager"
   635  		name = "%s"
   636  		instance_template = "${google_compute_instance_template.igm-basic.self_link}"
   637  		base_instance_name = "igm-basic-2"
   638  		zone = "us-west1-b"
   639  		target_size = 2
   640  	}
   641  	`, igm1, igm2)
   642  }
   643  
   644  func resourceSplitter(resource string) string {
   645  	splits := strings.Split(resource, "/")
   646  
   647  	return splits[len(splits)-1]
   648  }