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