github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/builtin/providers/google/resource_compute_instance_template_test.go (about) 1 package google 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/hashicorp/terraform/helper/acctest" 8 "github.com/hashicorp/terraform/helper/resource" 9 "github.com/hashicorp/terraform/terraform" 10 "google.golang.org/api/compute/v1" 11 ) 12 13 func TestAccComputeInstanceTemplate_basic(t *testing.T) { 14 var instanceTemplate compute.InstanceTemplate 15 16 resource.Test(t, resource.TestCase{ 17 PreCheck: func() { testAccPreCheck(t) }, 18 Providers: testAccProviders, 19 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 20 Steps: []resource.TestStep{ 21 resource.TestStep{ 22 Config: testAccComputeInstanceTemplate_basic, 23 Check: resource.ComposeTestCheckFunc( 24 testAccCheckComputeInstanceTemplateExists( 25 "google_compute_instance_template.foobar", &instanceTemplate), 26 testAccCheckComputeInstanceTemplateTag(&instanceTemplate, "foo"), 27 testAccCheckComputeInstanceTemplateMetadata(&instanceTemplate, "foo", "bar"), 28 testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140814", true, true), 29 ), 30 }, 31 }, 32 }) 33 } 34 35 func TestAccComputeInstanceTemplate_IP(t *testing.T) { 36 var instanceTemplate compute.InstanceTemplate 37 38 resource.Test(t, resource.TestCase{ 39 PreCheck: func() { testAccPreCheck(t) }, 40 Providers: testAccProviders, 41 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 42 Steps: []resource.TestStep{ 43 resource.TestStep{ 44 Config: testAccComputeInstanceTemplate_ip, 45 Check: resource.ComposeTestCheckFunc( 46 testAccCheckComputeInstanceTemplateExists( 47 "google_compute_instance_template.foobar", &instanceTemplate), 48 testAccCheckComputeInstanceTemplateNetwork(&instanceTemplate), 49 ), 50 }, 51 }, 52 }) 53 } 54 55 func TestAccComputeInstanceTemplate_disks(t *testing.T) { 56 var instanceTemplate compute.InstanceTemplate 57 58 resource.Test(t, resource.TestCase{ 59 PreCheck: func() { testAccPreCheck(t) }, 60 Providers: testAccProviders, 61 CheckDestroy: testAccCheckComputeInstanceTemplateDestroy, 62 Steps: []resource.TestStep{ 63 resource.TestStep{ 64 Config: testAccComputeInstanceTemplate_disks, 65 Check: resource.ComposeTestCheckFunc( 66 testAccCheckComputeInstanceTemplateExists( 67 "google_compute_instance_template.foobar", &instanceTemplate), 68 testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140814", true, true), 69 testAccCheckComputeInstanceTemplateDisk(&instanceTemplate, "terraform-test-foobar", false, false), 70 ), 71 }, 72 }, 73 }) 74 } 75 76 func testAccCheckComputeInstanceTemplateDestroy(s *terraform.State) error { 77 config := testAccProvider.Meta().(*Config) 78 79 for _, rs := range s.RootModule().Resources { 80 if rs.Type != "google_compute_instance_template" { 81 continue 82 } 83 84 _, err := config.clientCompute.InstanceTemplates.Get( 85 config.Project, rs.Primary.ID).Do() 86 if err == nil { 87 return fmt.Errorf("Instance template still exists") 88 } 89 } 90 91 return nil 92 } 93 94 func testAccCheckComputeInstanceTemplateExists(n string, instanceTemplate *compute.InstanceTemplate) resource.TestCheckFunc { 95 return func(s *terraform.State) error { 96 rs, ok := s.RootModule().Resources[n] 97 if !ok { 98 return fmt.Errorf("Not found: %s", n) 99 } 100 101 if rs.Primary.ID == "" { 102 return fmt.Errorf("No ID is set") 103 } 104 105 config := testAccProvider.Meta().(*Config) 106 107 found, err := config.clientCompute.InstanceTemplates.Get( 108 config.Project, rs.Primary.ID).Do() 109 if err != nil { 110 return err 111 } 112 113 if found.Name != rs.Primary.ID { 114 return fmt.Errorf("Instance template not found") 115 } 116 117 *instanceTemplate = *found 118 119 return nil 120 } 121 } 122 123 func testAccCheckComputeInstanceTemplateMetadata( 124 instanceTemplate *compute.InstanceTemplate, 125 k string, v string) resource.TestCheckFunc { 126 return func(s *terraform.State) error { 127 if instanceTemplate.Properties.Metadata == nil { 128 return fmt.Errorf("no metadata") 129 } 130 131 for _, item := range instanceTemplate.Properties.Metadata.Items { 132 if k != item.Key { 133 continue 134 } 135 136 if item.Value != nil && v == *item.Value { 137 return nil 138 } 139 140 return fmt.Errorf("bad value for %s: %s", k, *item.Value) 141 } 142 143 return fmt.Errorf("metadata not found: %s", k) 144 } 145 } 146 147 func testAccCheckComputeInstanceTemplateNetwork(instanceTemplate *compute.InstanceTemplate) resource.TestCheckFunc { 148 return func(s *terraform.State) error { 149 for _, i := range instanceTemplate.Properties.NetworkInterfaces { 150 for _, c := range i.AccessConfigs { 151 if c.NatIP == "" { 152 return fmt.Errorf("no NAT IP") 153 } 154 } 155 } 156 157 return nil 158 } 159 } 160 161 func testAccCheckComputeInstanceTemplateDisk(instanceTemplate *compute.InstanceTemplate, source string, delete bool, boot bool) resource.TestCheckFunc { 162 return func(s *terraform.State) error { 163 if instanceTemplate.Properties.Disks == nil { 164 return fmt.Errorf("no disks") 165 } 166 167 for _, disk := range instanceTemplate.Properties.Disks { 168 if disk.InitializeParams == nil { 169 // Check disk source 170 if disk.Source == source { 171 if disk.AutoDelete == delete && disk.Boot == boot { 172 return nil 173 } 174 } 175 } else { 176 // Check source image 177 if disk.InitializeParams.SourceImage == source { 178 if disk.AutoDelete == delete && disk.Boot == boot { 179 return nil 180 } 181 } 182 } 183 } 184 185 return fmt.Errorf("Disk not found: %s", source) 186 } 187 } 188 189 func testAccCheckComputeInstanceTemplateTag(instanceTemplate *compute.InstanceTemplate, n string) resource.TestCheckFunc { 190 return func(s *terraform.State) error { 191 if instanceTemplate.Properties.Tags == nil { 192 return fmt.Errorf("no tags") 193 } 194 195 for _, k := range instanceTemplate.Properties.Tags.Items { 196 if k == n { 197 return nil 198 } 199 } 200 201 return fmt.Errorf("tag not found: %s", n) 202 } 203 } 204 205 var testAccComputeInstanceTemplate_basic = fmt.Sprintf(` 206 resource "google_compute_instance_template" "foobar" { 207 name = "instancet-test-%s" 208 machine_type = "n1-standard-1" 209 can_ip_forward = false 210 tags = ["foo", "bar"] 211 212 disk { 213 source_image = "debian-7-wheezy-v20140814" 214 auto_delete = true 215 boot = true 216 } 217 218 network_interface { 219 network = "default" 220 } 221 222 scheduling { 223 preemptible = false 224 automatic_restart = true 225 } 226 227 metadata { 228 foo = "bar" 229 } 230 231 service_account { 232 scopes = ["userinfo-email", "compute-ro", "storage-ro"] 233 } 234 }`, acctest.RandString(10)) 235 236 var testAccComputeInstanceTemplate_ip = fmt.Sprintf(` 237 resource "google_compute_address" "foo" { 238 name = "instancet-test-%s" 239 } 240 241 resource "google_compute_instance_template" "foobar" { 242 name = "instancet-test-%s" 243 machine_type = "n1-standard-1" 244 tags = ["foo", "bar"] 245 246 disk { 247 source_image = "debian-7-wheezy-v20140814" 248 } 249 250 network_interface { 251 network = "default" 252 access_config { 253 nat_ip = "${google_compute_address.foo.address}" 254 } 255 } 256 257 metadata { 258 foo = "bar" 259 } 260 }`, acctest.RandString(10), acctest.RandString(10)) 261 262 var testAccComputeInstanceTemplate_disks = fmt.Sprintf(` 263 resource "google_compute_disk" "foobar" { 264 name = "instancet-test-%s" 265 image = "debian-7-wheezy-v20140814" 266 size = 10 267 type = "pd-ssd" 268 zone = "us-central1-a" 269 } 270 271 resource "google_compute_instance_template" "foobar" { 272 name = "instancet-test-%s" 273 machine_type = "n1-standard-1" 274 275 disk { 276 source_image = "debian-7-wheezy-v20140814" 277 auto_delete = true 278 disk_size_gb = 100 279 boot = true 280 } 281 282 disk { 283 source = "terraform-test-foobar" 284 auto_delete = false 285 boot = false 286 } 287 288 network_interface { 289 network = "default" 290 } 291 292 metadata { 293 foo = "bar" 294 } 295 }`, acctest.RandString(10), acctest.RandString(10))