github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/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-v20160301" 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-v20160301" 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-v20160301" 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-v20160301" 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 }