github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/builtin/providers/google/resource_sql_database_instance_test.go (about) 1 package google 2 3 /** 4 * Note! You must run these tests once at a time. Google Cloud SQL does 5 * not allow you to reuse a database for a short time after you reserved it, 6 * and for this reason the tests will fail if the same config is used serveral 7 * times in short succession. 8 */ 9 10 import ( 11 "fmt" 12 "strconv" 13 "testing" 14 15 "github.com/hashicorp/terraform/helper/resource" 16 "github.com/hashicorp/terraform/terraform" 17 18 "google.golang.org/api/sqladmin/v1beta4" 19 ) 20 21 func TestAccGoogleSqlDatabaseInstance_basic(t *testing.T) { 22 var instance sqladmin.DatabaseInstance 23 databaseID := genRandInt() 24 25 resource.Test(t, resource.TestCase{ 26 PreCheck: func() { testAccPreCheck(t) }, 27 Providers: testAccProviders, 28 CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy, 29 Steps: []resource.TestStep{ 30 resource.TestStep{ 31 Config: fmt.Sprintf( 32 testGoogleSqlDatabaseInstance_basic, databaseID), 33 Check: resource.ComposeTestCheckFunc( 34 testAccCheckGoogleSqlDatabaseInstanceExists( 35 "google_sql_database_instance.instance", &instance), 36 testAccCheckGoogleSqlDatabaseInstanceEquals( 37 "google_sql_database_instance.instance", &instance), 38 ), 39 }, 40 }, 41 }) 42 } 43 44 func TestAccGoogleSqlDatabaseInstance_basic2(t *testing.T) { 45 var instance sqladmin.DatabaseInstance 46 47 resource.Test(t, resource.TestCase{ 48 PreCheck: func() { testAccPreCheck(t) }, 49 Providers: testAccProviders, 50 CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy, 51 Steps: []resource.TestStep{ 52 resource.TestStep{ 53 Config: testGoogleSqlDatabaseInstance_basic2, 54 Check: resource.ComposeTestCheckFunc( 55 testAccCheckGoogleSqlDatabaseInstanceExists( 56 "google_sql_database_instance.instance", &instance), 57 testAccCheckGoogleSqlDatabaseInstanceEquals( 58 "google_sql_database_instance.instance", &instance), 59 ), 60 }, 61 }, 62 }) 63 } 64 65 func TestAccGoogleSqlDatabaseInstance_settings_basic(t *testing.T) { 66 var instance sqladmin.DatabaseInstance 67 databaseID := genRandInt() 68 69 resource.Test(t, resource.TestCase{ 70 PreCheck: func() { testAccPreCheck(t) }, 71 Providers: testAccProviders, 72 CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy, 73 Steps: []resource.TestStep{ 74 resource.TestStep{ 75 Config: fmt.Sprintf( 76 testGoogleSqlDatabaseInstance_settings, databaseID), 77 Check: resource.ComposeTestCheckFunc( 78 testAccCheckGoogleSqlDatabaseInstanceExists( 79 "google_sql_database_instance.instance", &instance), 80 testAccCheckGoogleSqlDatabaseInstanceEquals( 81 "google_sql_database_instance.instance", &instance), 82 ), 83 }, 84 }, 85 }) 86 } 87 88 func TestAccGoogleSqlDatabaseInstance_settings_upgrade(t *testing.T) { 89 var instance sqladmin.DatabaseInstance 90 databaseID := genRandInt() 91 92 resource.Test(t, resource.TestCase{ 93 PreCheck: func() { testAccPreCheck(t) }, 94 Providers: testAccProviders, 95 CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy, 96 Steps: []resource.TestStep{ 97 resource.TestStep{ 98 Config: fmt.Sprintf( 99 testGoogleSqlDatabaseInstance_basic, databaseID), 100 Check: resource.ComposeTestCheckFunc( 101 testAccCheckGoogleSqlDatabaseInstanceExists( 102 "google_sql_database_instance.instance", &instance), 103 testAccCheckGoogleSqlDatabaseInstanceEquals( 104 "google_sql_database_instance.instance", &instance), 105 ), 106 }, 107 resource.TestStep{ 108 Config: fmt.Sprintf( 109 testGoogleSqlDatabaseInstance_settings, databaseID), 110 Check: resource.ComposeTestCheckFunc( 111 testAccCheckGoogleSqlDatabaseInstanceExists( 112 "google_sql_database_instance.instance", &instance), 113 testAccCheckGoogleSqlDatabaseInstanceEquals( 114 "google_sql_database_instance.instance", &instance), 115 ), 116 }, 117 }, 118 }) 119 } 120 121 func TestAccGoogleSqlDatabaseInstance_settings_downgrade(t *testing.T) { 122 var instance sqladmin.DatabaseInstance 123 databaseID := genRandInt() 124 125 resource.Test(t, resource.TestCase{ 126 PreCheck: func() { testAccPreCheck(t) }, 127 Providers: testAccProviders, 128 CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy, 129 Steps: []resource.TestStep{ 130 resource.TestStep{ 131 Config: fmt.Sprintf( 132 testGoogleSqlDatabaseInstance_settings, databaseID), 133 Check: resource.ComposeTestCheckFunc( 134 testAccCheckGoogleSqlDatabaseInstanceExists( 135 "google_sql_database_instance.instance", &instance), 136 testAccCheckGoogleSqlDatabaseInstanceEquals( 137 "google_sql_database_instance.instance", &instance), 138 ), 139 }, 140 resource.TestStep{ 141 Config: fmt.Sprintf( 142 testGoogleSqlDatabaseInstance_basic, databaseID), 143 Check: resource.ComposeTestCheckFunc( 144 testAccCheckGoogleSqlDatabaseInstanceExists( 145 "google_sql_database_instance.instance", &instance), 146 testAccCheckGoogleSqlDatabaseInstanceEquals( 147 "google_sql_database_instance.instance", &instance), 148 ), 149 }, 150 }, 151 }) 152 } 153 154 func testAccCheckGoogleSqlDatabaseInstanceEquals(n string, 155 instance *sqladmin.DatabaseInstance) resource.TestCheckFunc { 156 return func(s *terraform.State) error { 157 rs, ok := s.RootModule().Resources[n] 158 if !ok { 159 return fmt.Errorf("Not found: %s", n) 160 } 161 attributes := rs.Primary.Attributes 162 163 server := instance.Name 164 local := attributes["name"] 165 if server != local { 166 return fmt.Errorf("Error name mismatch, (%s, %s)", server, local) 167 } 168 169 server = instance.Settings.Tier 170 local = attributes["settings.0.tier"] 171 if server != local { 172 return fmt.Errorf("Error settings.tier mismatch, (%s, %s)", server, local) 173 } 174 175 server = instance.MasterInstanceName 176 local = attributes["master_instance_name"] 177 if server != local && len(server) > 0 && len(local) > 0 { 178 return fmt.Errorf("Error master_instance_name mismatch, (%s, %s)", server, local) 179 } 180 181 server = instance.Settings.ActivationPolicy 182 local = attributes["settings.0.activation_policy"] 183 if server != local && len(server) > 0 && len(local) > 0 { 184 return fmt.Errorf("Error settings.activation_policy mismatch, (%s, %s)", server, local) 185 } 186 187 if instance.Settings.BackupConfiguration != nil { 188 server = strconv.FormatBool(instance.Settings.BackupConfiguration.BinaryLogEnabled) 189 local = attributes["settings.0.backup_configuration.0.binary_log_enabled"] 190 if server != local && len(server) > 0 && len(local) > 0 { 191 return fmt.Errorf("Error settings.backup_configuration.binary_log_enabled mismatch, (%s, %s)", server, local) 192 } 193 194 server = strconv.FormatBool(instance.Settings.BackupConfiguration.Enabled) 195 local = attributes["settings.0.backup_configuration.0.enabled"] 196 if server != local && len(server) > 0 && len(local) > 0 { 197 return fmt.Errorf("Error settings.backup_configuration.enabled mismatch, (%s, %s)", server, local) 198 } 199 200 server = instance.Settings.BackupConfiguration.StartTime 201 local = attributes["settings.0.backup_configuration.0.start_time"] 202 if server != local && len(server) > 0 && len(local) > 0 { 203 return fmt.Errorf("Error settings.backup_configuration.start_time mismatch, (%s, %s)", server, local) 204 } 205 } 206 207 server = strconv.FormatBool(instance.Settings.CrashSafeReplicationEnabled) 208 local = attributes["settings.0.crash_safe_replication"] 209 if server != local && len(server) > 0 && len(local) > 0 { 210 return fmt.Errorf("Error settings.crash_safe_replication mismatch, (%s, %s)", server, local) 211 } 212 213 if instance.Settings.IpConfiguration != nil { 214 server = strconv.FormatBool(instance.Settings.IpConfiguration.Ipv4Enabled) 215 local = attributes["settings.0.ip_configuration.0.ipv4_enabled"] 216 if server != local && len(server) > 0 && len(local) > 0 { 217 return fmt.Errorf("Error settings.ip_configuration.ipv4_enabled mismatch, (%s, %s)", server, local) 218 } 219 220 server = strconv.FormatBool(instance.Settings.IpConfiguration.RequireSsl) 221 local = attributes["settings.0.ip_configuration.0.require_ssl"] 222 if server != local && len(server) > 0 && len(local) > 0 { 223 return fmt.Errorf("Error settings.ip_configuration.require_ssl mismatch, (%s, %s)", server, local) 224 } 225 } 226 227 if instance.Settings.LocationPreference != nil { 228 server = instance.Settings.LocationPreference.FollowGaeApplication 229 local = attributes["settings.0.location_preference.0.follow_gae_application"] 230 if server != local && len(server) > 0 && len(local) > 0 { 231 return fmt.Errorf("Error settings.location_preference.follow_gae_application mismatch, (%s, %s)", server, local) 232 } 233 234 server = instance.Settings.LocationPreference.Zone 235 local = attributes["settings.0.location_preference.0.zone"] 236 if server != local && len(server) > 0 && len(local) > 0 { 237 return fmt.Errorf("Error settings.location_preference.zone mismatch, (%s, %s)", server, local) 238 } 239 } 240 241 server = instance.Settings.PricingPlan 242 local = attributes["settings.0.pricing_plan"] 243 if server != local && len(server) > 0 && len(local) > 0 { 244 return fmt.Errorf("Error settings.pricing_plan mismatch, (%s, %s)", server, local) 245 } 246 247 if instance.ReplicaConfiguration != nil && 248 instance.ReplicaConfiguration.MysqlReplicaConfiguration != nil { 249 server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.CaCertificate 250 local = attributes["replica_configuration.0.ca_certificate"] 251 if server != local && len(server) > 0 && len(local) > 0 { 252 return fmt.Errorf("Error replica_configuration.ca_certificate mismatch, (%s, %s)", server, local) 253 } 254 255 server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.ClientCertificate 256 local = attributes["replica_configuration.0.client_certificate"] 257 if server != local && len(server) > 0 && len(local) > 0 { 258 return fmt.Errorf("Error replica_configuration.client_certificate mismatch, (%s, %s)", server, local) 259 } 260 261 server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.ClientKey 262 local = attributes["replica_configuration.0.client_key"] 263 if server != local && len(server) > 0 && len(local) > 0 { 264 return fmt.Errorf("Error replica_configuration.client_key mismatch, (%s, %s)", server, local) 265 } 266 267 server = strconv.FormatInt(instance.ReplicaConfiguration.MysqlReplicaConfiguration.ConnectRetryInterval, 10) 268 local = attributes["replica_configuration.0.connect_retry_interval"] 269 if server != local && len(server) > 0 && len(local) > 0 { 270 return fmt.Errorf("Error replica_configuration.connect_retry_interval mismatch, (%s, %s)", server, local) 271 } 272 273 server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.DumpFilePath 274 local = attributes["replica_configuration.0.dump_file_path"] 275 if server != local && len(server) > 0 && len(local) > 0 { 276 return fmt.Errorf("Error replica_configuration.dump_file_path mismatch, (%s, %s)", server, local) 277 } 278 279 server = strconv.FormatInt(instance.ReplicaConfiguration.MysqlReplicaConfiguration.MasterHeartbeatPeriod, 10) 280 local = attributes["replica_configuration.0.master_heartbeat_period"] 281 if server != local && len(server) > 0 && len(local) > 0 { 282 return fmt.Errorf("Error replica_configuration.master_heartbeat_period mismatch, (%s, %s)", server, local) 283 } 284 285 server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.Password 286 local = attributes["replica_configuration.0.password"] 287 if server != local && len(server) > 0 && len(local) > 0 { 288 return fmt.Errorf("Error replica_configuration.password mismatch, (%s, %s)", server, local) 289 } 290 291 server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.SslCipher 292 local = attributes["replica_configuration.0.ssl_cipher"] 293 if server != local && len(server) > 0 && len(local) > 0 { 294 return fmt.Errorf("Error replica_configuration.ssl_cipher mismatch, (%s, %s)", server, local) 295 } 296 297 server = instance.ReplicaConfiguration.MysqlReplicaConfiguration.Username 298 local = attributes["replica_configuration.0.username"] 299 if server != local && len(server) > 0 && len(local) > 0 { 300 return fmt.Errorf("Error replica_configuration.username mismatch, (%s, %s)", server, local) 301 } 302 303 server = strconv.FormatBool(instance.ReplicaConfiguration.MysqlReplicaConfiguration.VerifyServerCertificate) 304 local = attributes["replica_configuration.0.verify_server_certificate"] 305 if server != local && len(server) > 0 && len(local) > 0 { 306 return fmt.Errorf("Error replica_configuration.verify_server_certificate mismatch, (%s, %s)", server, local) 307 } 308 } 309 310 return nil 311 } 312 } 313 314 func testAccCheckGoogleSqlDatabaseInstanceExists(n string, 315 instance *sqladmin.DatabaseInstance) resource.TestCheckFunc { 316 return func(s *terraform.State) error { 317 config := testAccProvider.Meta().(*Config) 318 rs, ok := s.RootModule().Resources[n] 319 if !ok { 320 return fmt.Errorf("Not found: %s", n) 321 } 322 323 found, err := config.clientSqlAdmin.Instances.Get(config.Project, 324 rs.Primary.Attributes["name"]).Do() 325 326 *instance = *found 327 328 if err != nil { 329 return fmt.Errorf("Not found: %s", n) 330 } 331 332 return nil 333 } 334 } 335 336 func testAccGoogleSqlDatabaseInstanceDestroy(s *terraform.State) error { 337 for _, rs := range s.RootModule().Resources { 338 config := testAccProvider.Meta().(*Config) 339 if rs.Type != "google_sql_database_instance" { 340 continue 341 } 342 343 _, err := config.clientSqlAdmin.Instances.Get(config.Project, 344 rs.Primary.Attributes["name"]).Do() 345 if err == nil { 346 return fmt.Errorf("Database Instance still exists") 347 } 348 } 349 350 return nil 351 } 352 353 var testGoogleSqlDatabaseInstance_basic = ` 354 resource "google_sql_database_instance" "instance" { 355 name = "tf-lw-%d" 356 region = "us-central" 357 settings { 358 tier = "D0" 359 crash_safe_replication = false 360 } 361 } 362 ` 363 364 var testGoogleSqlDatabaseInstance_basic2 = ` 365 resource "google_sql_database_instance" "instance" { 366 region = "us-central" 367 settings { 368 tier = "D0" 369 crash_safe_replication = false 370 } 371 } 372 ` 373 374 var testGoogleSqlDatabaseInstance_settings = ` 375 resource "google_sql_database_instance" "instance" { 376 name = "tf-lw-%d" 377 region = "us-central" 378 settings { 379 tier = "D0" 380 crash_safe_replication = false 381 replication_type = "ASYNCHRONOUS" 382 location_preference { 383 zone = "us-central1-f" 384 } 385 386 ip_configuration { 387 ipv4_enabled = "true" 388 authorized_networks { 389 value = "108.12.12.12" 390 name = "misc" 391 expiration_time = "2017-11-15T16:19:00.094Z" 392 } 393 } 394 395 backup_configuration { 396 enabled = "true" 397 start_time = "19:19" 398 } 399 400 activation_policy = "ON_DEMAND" 401 } 402 } 403 ` 404 405 // Note - this test is not feasible to run unless we generate 406 // backups first. 407 var testGoogleSqlDatabaseInstance_replica = ` 408 resource "google_sql_database_instance" "instance_master" { 409 name = "tf-lw-%d" 410 database_version = "MYSQL_5_6" 411 region = "us-east1" 412 413 settings { 414 tier = "D0" 415 crash_safe_replication = true 416 417 backup_configuration { 418 enabled = true 419 start_time = "00:00" 420 binary_log_enabled = true 421 } 422 } 423 } 424 425 resource "google_sql_database_instance" "instance" { 426 name = "tf-lw-%d" 427 database_version = "MYSQL_5_6" 428 region = "us-central" 429 430 settings { 431 tier = "D0" 432 } 433 434 master_instance_name = "${google_sql_database_instance.instance_master.name}" 435 436 replica_configuration { 437 ca_certificate = "${file("~/tmp/fake.pem")}" 438 client_certificate = "${file("~/tmp/fake.pem")}" 439 client_key = "${file("~/tmp/fake.pem")}" 440 connect_retry_interval = 100 441 master_heartbeat_period = 10000 442 password = "password" 443 username = "username" 444 ssl_cipher = "ALL" 445 verify_server_certificate = false 446 } 447 } 448 `