github.com/erriapo/terraform@v0.6.12-0.20160203182612-0340ea72354f/builtin/providers/google/resource_compute_instance_group_manager_test.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"google.golang.org/api/compute/v1"
     8  
     9  	"github.com/hashicorp/terraform/helper/acctest"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  )
    13  
    14  func TestAccInstanceGroupManager_basic(t *testing.T) {
    15  	var manager compute.InstanceGroupManager
    16  
    17  	template := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    18  	target := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    19  	igm1 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    20  	igm2 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    21  
    22  	resource.Test(t, resource.TestCase{
    23  		PreCheck:     func() { testAccPreCheck(t) },
    24  		Providers:    testAccProviders,
    25  		CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
    26  		Steps: []resource.TestStep{
    27  			resource.TestStep{
    28  				Config: testAccInstanceGroupManager_basic(template, target, igm1, igm2),
    29  				Check: resource.ComposeTestCheckFunc(
    30  					testAccCheckInstanceGroupManagerExists(
    31  						"google_compute_instance_group_manager.igm-basic", &manager),
    32  					testAccCheckInstanceGroupManagerExists(
    33  						"google_compute_instance_group_manager.igm-no-tp", &manager),
    34  				),
    35  			},
    36  		},
    37  	})
    38  }
    39  
    40  func TestAccInstanceGroupManager_update(t *testing.T) {
    41  	var manager compute.InstanceGroupManager
    42  
    43  	template1 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    44  	target := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    45  	template2 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    46  	igm := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
    47  
    48  	resource.Test(t, resource.TestCase{
    49  		PreCheck:     func() { testAccPreCheck(t) },
    50  		Providers:    testAccProviders,
    51  		CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
    52  		Steps: []resource.TestStep{
    53  			resource.TestStep{
    54  				Config: testAccInstanceGroupManager_update(template1, target, igm),
    55  				Check: resource.ComposeTestCheckFunc(
    56  					testAccCheckInstanceGroupManagerExists(
    57  						"google_compute_instance_group_manager.igm-update", &manager),
    58  					testAccCheckInstanceGroupManagerNamedPorts(
    59  						"google_compute_instance_group_manager.igm-update",
    60  						map[string]int64{"customhttp": 8080},
    61  						&manager),
    62  				),
    63  			},
    64  			resource.TestStep{
    65  				Config: testAccInstanceGroupManager_update2(template1, target, template2, igm),
    66  				Check: resource.ComposeTestCheckFunc(
    67  					testAccCheckInstanceGroupManagerExists(
    68  						"google_compute_instance_group_manager.igm-update", &manager),
    69  					testAccCheckInstanceGroupManagerUpdated(
    70  						"google_compute_instance_group_manager.igm-update", 3,
    71  						"google_compute_target_pool.igm-update", template2),
    72  					testAccCheckInstanceGroupManagerNamedPorts(
    73  						"google_compute_instance_group_manager.igm-update",
    74  						map[string]int64{"customhttp": 8080, "customhttps": 8443},
    75  						&manager),
    76  				),
    77  			},
    78  		},
    79  	})
    80  }
    81  
    82  func testAccCheckInstanceGroupManagerDestroy(s *terraform.State) error {
    83  	config := testAccProvider.Meta().(*Config)
    84  
    85  	for _, rs := range s.RootModule().Resources {
    86  		if rs.Type != "google_compute_instance_group_manager" {
    87  			continue
    88  		}
    89  		_, err := config.clientCompute.InstanceGroupManagers.Get(
    90  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
    91  		if err == nil {
    92  			return fmt.Errorf("InstanceGroupManager still exists")
    93  		}
    94  	}
    95  
    96  	return nil
    97  }
    98  
    99  func testAccCheckInstanceGroupManagerExists(n string, manager *compute.InstanceGroupManager) resource.TestCheckFunc {
   100  	return func(s *terraform.State) error {
   101  		rs, ok := s.RootModule().Resources[n]
   102  		if !ok {
   103  			return fmt.Errorf("Not found: %s", n)
   104  		}
   105  
   106  		if rs.Primary.ID == "" {
   107  			return fmt.Errorf("No ID is set")
   108  		}
   109  
   110  		config := testAccProvider.Meta().(*Config)
   111  
   112  		found, err := config.clientCompute.InstanceGroupManagers.Get(
   113  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   114  		if err != nil {
   115  			return err
   116  		}
   117  
   118  		if found.Name != rs.Primary.ID {
   119  			return fmt.Errorf("InstanceGroupManager not found")
   120  		}
   121  
   122  		*manager = *found
   123  
   124  		return nil
   125  	}
   126  }
   127  
   128  func testAccCheckInstanceGroupManagerUpdated(n string, size int64, targetPool string, template string) resource.TestCheckFunc {
   129  	return func(s *terraform.State) error {
   130  		rs, ok := s.RootModule().Resources[n]
   131  		if !ok {
   132  			return fmt.Errorf("Not found: %s", n)
   133  		}
   134  
   135  		if rs.Primary.ID == "" {
   136  			return fmt.Errorf("No ID is set")
   137  		}
   138  
   139  		config := testAccProvider.Meta().(*Config)
   140  
   141  		manager, err := config.clientCompute.InstanceGroupManagers.Get(
   142  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   143  		if err != nil {
   144  			return err
   145  		}
   146  
   147  		// Cannot check the target pool as the instance creation is asynchronous.  However, can
   148  		// check the target_size.
   149  		if manager.TargetSize != size {
   150  			return fmt.Errorf("instance count incorrect")
   151  		}
   152  
   153  		// check that the instance template updated
   154  		instanceTemplate, err := config.clientCompute.InstanceTemplates.Get(
   155  			config.Project, template).Do()
   156  		if err != nil {
   157  			return fmt.Errorf("Error reading instance template: %s", err)
   158  		}
   159  
   160  		if instanceTemplate.Name != template {
   161  			return fmt.Errorf("instance template not updated")
   162  		}
   163  
   164  		return nil
   165  	}
   166  }
   167  
   168  func testAccCheckInstanceGroupManagerNamedPorts(n string, np map[string]int64, instanceGroupManager *compute.InstanceGroupManager) resource.TestCheckFunc {
   169  	return func(s *terraform.State) error {
   170  		rs, ok := s.RootModule().Resources[n]
   171  		if !ok {
   172  			return fmt.Errorf("Not found: %s", n)
   173  		}
   174  
   175  		if rs.Primary.ID == "" {
   176  			return fmt.Errorf("No ID is set")
   177  		}
   178  
   179  		config := testAccProvider.Meta().(*Config)
   180  
   181  		manager, err := config.clientCompute.InstanceGroupManagers.Get(
   182  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   183  		if err != nil {
   184  			return err
   185  		}
   186  
   187  		var found bool
   188  		for _, namedPort := range manager.NamedPorts {
   189  			found = false
   190  			for name, port := range np {
   191  				if namedPort.Name == name && namedPort.Port == port {
   192  					found = true
   193  				}
   194  			}
   195  			if !found {
   196  				return fmt.Errorf("named port incorrect")
   197  			}
   198  		}
   199  
   200  		return nil
   201  	}
   202  }
   203  
   204  func testAccInstanceGroupManager_basic(template, target, igm1, igm2 string) string {
   205  	return fmt.Sprintf(`
   206  	resource "google_compute_instance_template" "igm-basic" {
   207  		name = "%s"
   208  		machine_type = "n1-standard-1"
   209  		can_ip_forward = false
   210  		tags = ["foo", "bar"]
   211  
   212  		disk {
   213  			source_image = "debian-cloud/debian-7-wheezy-v20140814"
   214  			auto_delete = true
   215  			boot = true
   216  		}
   217  
   218  		network_interface {
   219  			network = "default"
   220  		}
   221  
   222  		metadata {
   223  			foo = "bar"
   224  		}
   225  
   226  		service_account {
   227  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   228  		}
   229  	}
   230  
   231  	resource "google_compute_target_pool" "igm-basic" {
   232  		description = "Resource created for Terraform acceptance testing"
   233  		name = "%s"
   234  		session_affinity = "CLIENT_IP_PROTO"
   235  	}
   236  
   237  	resource "google_compute_instance_group_manager" "igm-basic" {
   238  		description = "Terraform test instance group manager"
   239  		name = "%s"
   240  		instance_template = "${google_compute_instance_template.igm-basic.self_link}"
   241  		target_pools = ["${google_compute_target_pool.igm-basic.self_link}"]
   242  		base_instance_name = "igm-basic"
   243  		zone = "us-central1-c"
   244  		target_size = 2
   245  	}
   246  
   247  	resource "google_compute_instance_group_manager" "igm-no-tp" {
   248  		description = "Terraform test instance group manager"
   249  		name = "%s"
   250  		instance_template = "${google_compute_instance_template.igm-basic.self_link}"
   251  		base_instance_name = "igm-no-tp"
   252  		zone = "us-central1-c"
   253  		target_size = 2
   254  	}
   255  	`, template, target, igm1, igm2)
   256  }
   257  
   258  func testAccInstanceGroupManager_update(template, target, igm string) string {
   259  	return fmt.Sprintf(`
   260  	resource "google_compute_instance_template" "igm-update" {
   261  		name = "%s"
   262  		machine_type = "n1-standard-1"
   263  		can_ip_forward = false
   264  		tags = ["foo", "bar"]
   265  
   266  		disk {
   267  			source_image = "debian-cloud/debian-7-wheezy-v20140814"
   268  			auto_delete = true
   269  			boot = true
   270  		}
   271  
   272  		network_interface {
   273  			network = "default"
   274  		}
   275  
   276  		metadata {
   277  			foo = "bar"
   278  		}
   279  
   280  		service_account {
   281  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   282  		}
   283  	}
   284  
   285  	resource "google_compute_target_pool" "igm-update" {
   286  		description = "Resource created for Terraform acceptance testing"
   287  		name = "%s"
   288  		session_affinity = "CLIENT_IP_PROTO"
   289  	}
   290  
   291  	resource "google_compute_instance_group_manager" "igm-update" {
   292  		description = "Terraform test instance group manager"
   293  		name = "%s"
   294  		instance_template = "${google_compute_instance_template.igm-update.self_link}"
   295  		target_pools = ["${google_compute_target_pool.igm-update.self_link}"]
   296  		base_instance_name = "igm-update"
   297  		zone = "us-central1-c"
   298  		target_size = 2
   299  		named_port {
   300  			name = "customhttp"
   301  			port = 8080
   302  		}
   303  	}`, template, target, igm)
   304  }
   305  
   306  // Change IGM's instance template and target size
   307  func testAccInstanceGroupManager_update2(template1, target, template2, igm string) string {
   308  	return fmt.Sprintf(`
   309  	resource "google_compute_instance_template" "igm-update" {
   310  		name = "%s"
   311  		machine_type = "n1-standard-1"
   312  		can_ip_forward = false
   313  		tags = ["foo", "bar"]
   314  
   315  		disk {
   316  			source_image = "debian-cloud/debian-7-wheezy-v20140814"
   317  			auto_delete = true
   318  			boot = true
   319  		}
   320  
   321  		network_interface {
   322  			network = "default"
   323  		}
   324  
   325  		metadata {
   326  			foo = "bar"
   327  		}
   328  
   329  		service_account {
   330  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   331  		}
   332  	}
   333  
   334  	resource "google_compute_target_pool" "igm-update" {
   335  		description = "Resource created for Terraform acceptance testing"
   336  		name = "%s"
   337  		session_affinity = "CLIENT_IP_PROTO"
   338  	}
   339  
   340  	resource "google_compute_instance_template" "igm-update2" {
   341  		name = "%s"
   342  		machine_type = "n1-standard-1"
   343  		can_ip_forward = false
   344  		tags = ["foo", "bar"]
   345  
   346  		disk {
   347  			source_image = "debian-cloud/debian-7-wheezy-v20140814"
   348  			auto_delete = true
   349  			boot = true
   350  		}
   351  
   352  		network_interface {
   353  			network = "default"
   354  		}
   355  
   356  		metadata {
   357  			foo = "bar"
   358  		}
   359  
   360  		service_account {
   361  			scopes = ["userinfo-email", "compute-ro", "storage-ro"]
   362  		}
   363  	}
   364  
   365  	resource "google_compute_instance_group_manager" "igm-update" {
   366  		description = "Terraform test instance group manager"
   367  		name = "%s"
   368  		instance_template = "${google_compute_instance_template.igm-update2.self_link}"
   369  		target_pools = ["${google_compute_target_pool.igm-update.self_link}"]
   370  		base_instance_name = "igm-update"
   371  		zone = "us-central1-c"
   372  		target_size = 3
   373  		named_port {
   374  			name = "customhttp"
   375  			port = 8080
   376  		}
   377  		named_port {
   378  			name = "customhttps"
   379  			port = 8443
   380  		}
   381  	}`, template1, target, template2, igm)
   382  }