github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/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 ), 59 }, 60 resource.TestStep{ 61 Config: testAccInstanceGroupManager_update2(template1, target, template2, igm), 62 Check: resource.ComposeTestCheckFunc( 63 testAccCheckInstanceGroupManagerExists( 64 "google_compute_instance_group_manager.igm-update", &manager), 65 testAccCheckInstanceGroupManagerUpdated( 66 "google_compute_instance_group_manager.igm-update", 3, 67 "google_compute_target_pool.igm-update", template2), 68 ), 69 }, 70 }, 71 }) 72 } 73 74 func testAccCheckInstanceGroupManagerDestroy(s *terraform.State) error { 75 config := testAccProvider.Meta().(*Config) 76 77 for _, rs := range s.RootModule().Resources { 78 if rs.Type != "google_compute_instance_group_manager" { 79 continue 80 } 81 _, err := config.clientCompute.InstanceGroupManagers.Get( 82 config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do() 83 if err == nil { 84 return fmt.Errorf("InstanceGroupManager still exists") 85 } 86 } 87 88 return nil 89 } 90 91 func testAccCheckInstanceGroupManagerExists(n string, manager *compute.InstanceGroupManager) resource.TestCheckFunc { 92 return func(s *terraform.State) error { 93 rs, ok := s.RootModule().Resources[n] 94 if !ok { 95 return fmt.Errorf("Not found: %s", n) 96 } 97 98 if rs.Primary.ID == "" { 99 return fmt.Errorf("No ID is set") 100 } 101 102 config := testAccProvider.Meta().(*Config) 103 104 found, err := config.clientCompute.InstanceGroupManagers.Get( 105 config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do() 106 if err != nil { 107 return err 108 } 109 110 if found.Name != rs.Primary.ID { 111 return fmt.Errorf("InstanceGroupManager not found") 112 } 113 114 *manager = *found 115 116 return nil 117 } 118 } 119 120 func testAccCheckInstanceGroupManagerUpdated(n string, size int64, targetPool string, template string) resource.TestCheckFunc { 121 return func(s *terraform.State) error { 122 rs, ok := s.RootModule().Resources[n] 123 if !ok { 124 return fmt.Errorf("Not found: %s", n) 125 } 126 127 if rs.Primary.ID == "" { 128 return fmt.Errorf("No ID is set") 129 } 130 131 config := testAccProvider.Meta().(*Config) 132 133 manager, err := config.clientCompute.InstanceGroupManagers.Get( 134 config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do() 135 if err != nil { 136 return err 137 } 138 139 // Cannot check the target pool as the instance creation is asynchronous. However, can 140 // check the target_size. 141 if manager.TargetSize != size { 142 return fmt.Errorf("instance count incorrect") 143 } 144 145 // check that the instance template updated 146 instanceTemplate, err := config.clientCompute.InstanceTemplates.Get( 147 config.Project, template).Do() 148 if err != nil { 149 return fmt.Errorf("Error reading instance template: %s", err) 150 } 151 152 if instanceTemplate.Name != template { 153 return fmt.Errorf("instance template not updated") 154 } 155 156 return nil 157 } 158 } 159 160 func testAccInstanceGroupManager_basic(template, target, igm1, igm2 string) string { 161 return fmt.Sprintf(` 162 resource "google_compute_instance_template" "igm-basic" { 163 name = "%s" 164 machine_type = "n1-standard-1" 165 can_ip_forward = false 166 tags = ["foo", "bar"] 167 168 disk { 169 source_image = "debian-cloud/debian-7-wheezy-v20140814" 170 auto_delete = true 171 boot = true 172 } 173 174 network_interface { 175 network = "default" 176 } 177 178 metadata { 179 foo = "bar" 180 } 181 182 service_account { 183 scopes = ["userinfo-email", "compute-ro", "storage-ro"] 184 } 185 } 186 187 resource "google_compute_target_pool" "igm-basic" { 188 description = "Resource created for Terraform acceptance testing" 189 name = "%s" 190 session_affinity = "CLIENT_IP_PROTO" 191 } 192 193 resource "google_compute_instance_group_manager" "igm-basic" { 194 description = "Terraform test instance group manager" 195 name = "%s" 196 instance_template = "${google_compute_instance_template.igm-basic.self_link}" 197 target_pools = ["${google_compute_target_pool.igm-basic.self_link}"] 198 base_instance_name = "igm-basic" 199 zone = "us-central1-c" 200 target_size = 2 201 } 202 203 resource "google_compute_instance_group_manager" "igm-no-tp" { 204 description = "Terraform test instance group manager" 205 name = "%s" 206 instance_template = "${google_compute_instance_template.igm-basic.self_link}" 207 base_instance_name = "igm-no-tp" 208 zone = "us-central1-c" 209 target_size = 2 210 } 211 `, template, target, igm1, igm2) 212 } 213 214 func testAccInstanceGroupManager_update(template, target, igm string) string { 215 return fmt.Sprintf(` 216 resource "google_compute_instance_template" "igm-update" { 217 name = "%s" 218 machine_type = "n1-standard-1" 219 can_ip_forward = false 220 tags = ["foo", "bar"] 221 222 disk { 223 source_image = "debian-cloud/debian-7-wheezy-v20140814" 224 auto_delete = true 225 boot = true 226 } 227 228 network_interface { 229 network = "default" 230 } 231 232 metadata { 233 foo = "bar" 234 } 235 236 service_account { 237 scopes = ["userinfo-email", "compute-ro", "storage-ro"] 238 } 239 } 240 241 resource "google_compute_target_pool" "igm-update" { 242 description = "Resource created for Terraform acceptance testing" 243 name = "%s" 244 session_affinity = "CLIENT_IP_PROTO" 245 } 246 247 resource "google_compute_instance_group_manager" "igm-update" { 248 description = "Terraform test instance group manager" 249 name = "%s" 250 instance_template = "${google_compute_instance_template.igm-update.self_link}" 251 target_pools = ["${google_compute_target_pool.igm-update.self_link}"] 252 base_instance_name = "igm-update" 253 zone = "us-central1-c" 254 target_size = 2 255 }`, template, target, igm) 256 } 257 258 // Change IGM's instance template and target size 259 func testAccInstanceGroupManager_update2(template1, target, template2, igm string) string { 260 return fmt.Sprintf(` 261 resource "google_compute_instance_template" "igm-update" { 262 name = "%s" 263 machine_type = "n1-standard-1" 264 can_ip_forward = false 265 tags = ["foo", "bar"] 266 267 disk { 268 source_image = "debian-cloud/debian-7-wheezy-v20140814" 269 auto_delete = true 270 boot = true 271 } 272 273 network_interface { 274 network = "default" 275 } 276 277 metadata { 278 foo = "bar" 279 } 280 281 service_account { 282 scopes = ["userinfo-email", "compute-ro", "storage-ro"] 283 } 284 } 285 286 resource "google_compute_target_pool" "igm-update" { 287 description = "Resource created for Terraform acceptance testing" 288 name = "%s" 289 session_affinity = "CLIENT_IP_PROTO" 290 } 291 292 resource "google_compute_instance_template" "igm-update2" { 293 name = "%s" 294 machine_type = "n1-standard-1" 295 can_ip_forward = false 296 tags = ["foo", "bar"] 297 298 disk { 299 source_image = "debian-cloud/debian-7-wheezy-v20140814" 300 auto_delete = true 301 boot = true 302 } 303 304 network_interface { 305 network = "default" 306 } 307 308 metadata { 309 foo = "bar" 310 } 311 312 service_account { 313 scopes = ["userinfo-email", "compute-ro", "storage-ro"] 314 } 315 } 316 317 resource "google_compute_instance_group_manager" "igm-update" { 318 description = "Terraform test instance group manager" 319 name = "%s" 320 instance_template = "${google_compute_instance_template.igm-update2.self_link}" 321 target_pools = ["${google_compute_target_pool.igm-update.self_link}"] 322 base_instance_name = "igm-update" 323 zone = "us-central1-c" 324 target_size = 3 325 }`, template1, target, template2, igm) 326 }