github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/google/resource_compute_project_metadata_test.go (about) 1 package google 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 8 "github.com/hashicorp/terraform/helper/acctest" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 "google.golang.org/api/compute/v1" 12 ) 13 14 // Add two key value pairs 15 func TestAccComputeProjectMetadata_basic(t *testing.T) { 16 skipIfEnvNotSet(t, 17 []string{ 18 "GOOGLE_ORG", 19 "GOOGLE_BILLING_ACCOUNT", 20 }..., 21 ) 22 23 billingId := os.Getenv("GOOGLE_BILLING_ACCOUNT") 24 var project compute.Project 25 projectID := "terrafom-test-" + acctest.RandString(10) 26 27 resource.Test(t, resource.TestCase{ 28 PreCheck: func() { testAccPreCheck(t) }, 29 Providers: testAccProviders, 30 CheckDestroy: testAccCheckComputeProjectMetadataDestroy, 31 Steps: []resource.TestStep{ 32 resource.TestStep{ 33 Config: testAccComputeProject_basic0_metadata(projectID, pname, org, billingId), 34 Check: resource.ComposeTestCheckFunc( 35 testAccCheckComputeProjectExists( 36 "google_compute_project_metadata.fizzbuzz", projectID, &project), 37 testAccCheckComputeProjectMetadataContains(projectID, "banana", "orange"), 38 testAccCheckComputeProjectMetadataContains(projectID, "sofa", "darwinism"), 39 testAccCheckComputeProjectMetadataSize(projectID, 2), 40 ), 41 }, 42 }, 43 }) 44 } 45 46 // Add three key value pairs, then replace one and modify a second 47 func TestAccComputeProjectMetadata_modify_1(t *testing.T) { 48 skipIfEnvNotSet(t, 49 []string{ 50 "GOOGLE_ORG", 51 "GOOGLE_BILLING_ACCOUNT", 52 }..., 53 ) 54 55 billingId := os.Getenv("GOOGLE_BILLING_ACCOUNT") 56 var project compute.Project 57 projectID := "terrafom-test-" + acctest.RandString(10) 58 59 resource.Test(t, resource.TestCase{ 60 PreCheck: func() { testAccPreCheck(t) }, 61 Providers: testAccProviders, 62 CheckDestroy: testAccCheckComputeProjectMetadataDestroy, 63 Steps: []resource.TestStep{ 64 resource.TestStep{ 65 Config: testAccComputeProject_modify0_metadata(projectID, pname, org, billingId), 66 Check: resource.ComposeTestCheckFunc( 67 testAccCheckComputeProjectExists( 68 "google_compute_project_metadata.fizzbuzz", projectID, &project), 69 testAccCheckComputeProjectMetadataContains(projectID, "paper", "pen"), 70 testAccCheckComputeProjectMetadataContains(projectID, "genghis_khan", "french bread"), 71 testAccCheckComputeProjectMetadataContains(projectID, "happy", "smiling"), 72 testAccCheckComputeProjectMetadataSize(projectID, 3), 73 ), 74 }, 75 76 resource.TestStep{ 77 Config: testAccComputeProject_modify1_metadata(projectID, pname, org, billingId), 78 Check: resource.ComposeTestCheckFunc( 79 testAccCheckComputeProjectExists( 80 "google_compute_project_metadata.fizzbuzz", projectID, &project), 81 testAccCheckComputeProjectMetadataContains(projectID, "paper", "pen"), 82 testAccCheckComputeProjectMetadataContains(projectID, "paris", "french bread"), 83 testAccCheckComputeProjectMetadataContains(projectID, "happy", "laughing"), 84 testAccCheckComputeProjectMetadataSize(projectID, 3), 85 ), 86 }, 87 }, 88 }) 89 } 90 91 // Add two key value pairs, and replace both 92 func TestAccComputeProjectMetadata_modify_2(t *testing.T) { 93 skipIfEnvNotSet(t, 94 []string{ 95 "GOOGLE_ORG", 96 "GOOGLE_BILLING_ACCOUNT", 97 }..., 98 ) 99 100 billingId := os.Getenv("GOOGLE_BILLING_ACCOUNT") 101 var project compute.Project 102 projectID := "terraform-test-" + acctest.RandString(10) 103 104 resource.Test(t, resource.TestCase{ 105 PreCheck: func() { testAccPreCheck(t) }, 106 Providers: testAccProviders, 107 CheckDestroy: testAccCheckComputeProjectMetadataDestroy, 108 Steps: []resource.TestStep{ 109 resource.TestStep{ 110 Config: testAccComputeProject_basic0_metadata(projectID, pname, org, billingId), 111 Check: resource.ComposeTestCheckFunc( 112 testAccCheckComputeProjectExists( 113 "google_compute_project_metadata.fizzbuzz", projectID, &project), 114 testAccCheckComputeProjectMetadataContains(projectID, "banana", "orange"), 115 testAccCheckComputeProjectMetadataContains(projectID, "sofa", "darwinism"), 116 testAccCheckComputeProjectMetadataSize(projectID, 2), 117 ), 118 }, 119 120 resource.TestStep{ 121 Config: testAccComputeProject_basic1_metadata(projectID, pname, org, billingId), 122 Check: resource.ComposeTestCheckFunc( 123 testAccCheckComputeProjectExists( 124 "google_compute_project_metadata.fizzbuzz", projectID, &project), 125 testAccCheckComputeProjectMetadataContains(projectID, "kiwi", "papaya"), 126 testAccCheckComputeProjectMetadataContains(projectID, "finches", "darwinism"), 127 testAccCheckComputeProjectMetadataSize(projectID, 2), 128 ), 129 }, 130 }, 131 }) 132 } 133 134 func testAccCheckComputeProjectMetadataDestroy(s *terraform.State) error { 135 config := testAccProvider.Meta().(*Config) 136 137 for _, rs := range s.RootModule().Resources { 138 if rs.Type != "google_compute_project_metadata" { 139 continue 140 } 141 142 project, err := config.clientCompute.Projects.Get(rs.Primary.ID).Do() 143 if err == nil && len(project.CommonInstanceMetadata.Items) > 0 { 144 return fmt.Errorf("Error, metadata items still exist in %s", rs.Primary.ID) 145 } 146 } 147 148 return nil 149 } 150 151 func testAccCheckComputeProjectExists(n, projectID string, project *compute.Project) resource.TestCheckFunc { 152 return func(s *terraform.State) error { 153 rs, ok := s.RootModule().Resources[n] 154 if !ok { 155 return fmt.Errorf("Not found: %s", n) 156 } 157 158 if rs.Primary.ID == "" { 159 return fmt.Errorf("No ID is set") 160 } 161 162 config := testAccProvider.Meta().(*Config) 163 164 found, err := config.clientCompute.Projects.Get(projectID).Do() 165 if err != nil { 166 return err 167 } 168 169 if "common_metadata" != rs.Primary.ID { 170 return fmt.Errorf("Common metadata not found, found %s", rs.Primary.ID) 171 } 172 173 *project = *found 174 175 return nil 176 } 177 } 178 179 func testAccCheckComputeProjectMetadataContains(projectID, key, value string) resource.TestCheckFunc { 180 return func(s *terraform.State) error { 181 config := testAccProvider.Meta().(*Config) 182 project, err := config.clientCompute.Projects.Get(projectID).Do() 183 if err != nil { 184 return fmt.Errorf("Error, failed to load project service for %s: %s", config.Project, err) 185 } 186 187 for _, kv := range project.CommonInstanceMetadata.Items { 188 if kv.Key == key { 189 if kv.Value != nil && *kv.Value == value { 190 return nil 191 } else { 192 return fmt.Errorf("Error, key value mismatch, wanted (%s, %s), got (%s, %s)", 193 key, value, kv.Key, *kv.Value) 194 } 195 } 196 } 197 198 return fmt.Errorf("Error, key %s not present in %s", key, project.SelfLink) 199 } 200 } 201 202 func testAccCheckComputeProjectMetadataSize(projectID string, size int) resource.TestCheckFunc { 203 return func(s *terraform.State) error { 204 config := testAccProvider.Meta().(*Config) 205 project, err := config.clientCompute.Projects.Get(projectID).Do() 206 if err != nil { 207 return fmt.Errorf("Error, failed to load project service for %s: %s", config.Project, err) 208 } 209 210 if size > len(project.CommonInstanceMetadata.Items) { 211 return fmt.Errorf("Error, expected at least %d metadata items, got %d", size, 212 len(project.CommonInstanceMetadata.Items)) 213 } 214 215 return nil 216 } 217 } 218 219 func testAccComputeProject_basic0_metadata(projectID, name, org, billing string) string { 220 return fmt.Sprintf(` 221 resource "google_project" "project" { 222 project_id = "%s" 223 name = "%s" 224 org_id = "%s" 225 billing_account = "%s" 226 } 227 228 resource "google_project_services" "services" { 229 project = "${google_project.project.project_id}" 230 services = ["compute-component.googleapis.com"] 231 } 232 233 resource "google_compute_project_metadata" "fizzbuzz" { 234 project = "${google_project.project.project_id}" 235 metadata { 236 banana = "orange" 237 sofa = "darwinism" 238 } 239 depends_on = ["google_project_services.services"] 240 }`, projectID, name, org, billing) 241 } 242 243 func testAccComputeProject_basic1_metadata(projectID, name, org, billing string) string { 244 return fmt.Sprintf(` 245 resource "google_project" "project" { 246 project_id = "%s" 247 name = "%s" 248 org_id = "%s" 249 billing_account = "%s" 250 } 251 252 resource "google_project_services" "services" { 253 project = "${google_project.project.project_id}" 254 services = ["compute-component.googleapis.com"] 255 } 256 257 resource "google_compute_project_metadata" "fizzbuzz" { 258 project = "${google_project.project.project_id}" 259 metadata { 260 kiwi = "papaya" 261 finches = "darwinism" 262 } 263 depends_on = ["google_project_services.services"] 264 }`, projectID, name, org, billing) 265 } 266 267 func testAccComputeProject_modify0_metadata(projectID, name, org, billing string) string { 268 return fmt.Sprintf(` 269 resource "google_project" "project" { 270 project_id = "%s" 271 name = "%s" 272 org_id = "%s" 273 billing_account = "%s" 274 } 275 276 resource "google_project_services" "services" { 277 project = "${google_project.project.project_id}" 278 services = ["compute-component.googleapis.com"] 279 } 280 281 resource "google_compute_project_metadata" "fizzbuzz" { 282 project = "${google_project.project.project_id}" 283 metadata { 284 paper = "pen" 285 genghis_khan = "french bread" 286 happy = "smiling" 287 } 288 depends_on = ["google_project_services.services"] 289 }`, projectID, name, org, billing) 290 } 291 292 func testAccComputeProject_modify1_metadata(projectID, name, org, billing string) string { 293 return fmt.Sprintf(` 294 resource "google_project" "project" { 295 project_id = "%s" 296 name = "%s" 297 org_id = "%s" 298 billing_account = "%s" 299 } 300 301 resource "google_project_services" "services" { 302 project = "${google_project.project.project_id}" 303 services = ["compute-component.googleapis.com"] 304 } 305 306 resource "google_compute_project_metadata" "fizzbuzz" { 307 project = "${google_project.project.project_id}" 308 metadata { 309 paper = "pen" 310 paris = "french bread" 311 happy = "laughing" 312 } 313 depends_on = ["google_project_services.services"] 314 }`, projectID, name, org, billing) 315 }