|
68 | 68 | INSTANCE_ID = os.environ.get(
|
69 | 69 | "GOOGLE_CLOUD_TESTS_SPANNER_INSTANCE", "google-cloud-python-systest"
|
70 | 70 | )
|
| 71 | +MULTI_REGION_INSTANCE_ID = "multi-region" + unique_resource_id("-") |
71 | 72 | EXISTING_INSTANCES = []
|
72 | 73 | COUNTERS_TABLE = "counters"
|
73 | 74 | COUNTERS_COLUMNS = ("name", "value")
|
@@ -353,9 +354,25 @@ def setUpClass(cls):
|
353 | 354 | SPANNER_OPERATION_TIMEOUT_IN_SECONDS
|
354 | 355 | ) # raises on failure / timeout.
|
355 | 356 |
|
| 357 | + # Create a multi-region instance |
| 358 | + multi_region_config = "nam3" |
| 359 | + config_name = "{}/instanceConfigs/{}".format( |
| 360 | + Config.CLIENT.project_name, multi_region_config |
| 361 | + ) |
| 362 | + create_time = str(int(time.time())) |
| 363 | + labels = {"python-spanner-systests": "true", "created": create_time} |
| 364 | + cls._instance = Config.CLIENT.instance( |
| 365 | + instance_id=MULTI_REGION_INSTANCE_ID, |
| 366 | + configuration_name=config_name, |
| 367 | + labels=labels, |
| 368 | + ) |
| 369 | + operation = cls._instance.create() |
| 370 | + operation.result(SPANNER_OPERATION_TIMEOUT_IN_SECONDS) |
| 371 | + |
356 | 372 | @classmethod
|
357 | 373 | def tearDownClass(cls):
|
358 | 374 | cls._db.drop()
|
| 375 | + cls._instance.delete() |
359 | 376 |
|
360 | 377 | def setUp(self):
|
361 | 378 | self.to_delete = []
|
@@ -443,6 +460,42 @@ def test_create_database_pitr_success(self):
|
443 | 460 | for result in results:
|
444 | 461 | self.assertEqual(result[0], retention_period)
|
445 | 462 |
|
| 463 | + @unittest.skipIf( |
| 464 | + USE_EMULATOR, "Default leader setting is not supported by the emulator" |
| 465 | + ) |
| 466 | + def test_create_database_with_default_leader_success(self): |
| 467 | + pool = BurstyPool(labels={"testcase": "create_database_default_leader"}) |
| 468 | + |
| 469 | + temp_db_id = "temp_db" + unique_resource_id("_") |
| 470 | + default_leader = "us-east4" |
| 471 | + ddl_statements = [ |
| 472 | + "ALTER DATABASE {}" |
| 473 | + " SET OPTIONS (default_leader = '{}')".format(temp_db_id, default_leader) |
| 474 | + ] |
| 475 | + temp_db = self._instance.database( |
| 476 | + temp_db_id, pool=pool, ddl_statements=ddl_statements |
| 477 | + ) |
| 478 | + operation = temp_db.create() |
| 479 | + self.to_delete.append(temp_db) |
| 480 | + |
| 481 | + # We want to make sure the operation completes. |
| 482 | + operation.result(30) # raises on failure / timeout. |
| 483 | + |
| 484 | + database_ids = [database.name for database in self._instance.list_databases()] |
| 485 | + self.assertIn(temp_db.name, database_ids) |
| 486 | + |
| 487 | + temp_db.reload() |
| 488 | + self.assertEqual(temp_db.default_leader, default_leader) |
| 489 | + |
| 490 | + with temp_db.snapshot() as snapshot: |
| 491 | + results = snapshot.execute_sql( |
| 492 | + "SELECT OPTION_VALUE AS default_leader " |
| 493 | + "FROM INFORMATION_SCHEMA.DATABASE_OPTIONS " |
| 494 | + "WHERE SCHEMA_NAME = '' AND OPTION_NAME = 'default_leader'" |
| 495 | + ) |
| 496 | + for result in results: |
| 497 | + self.assertEqual(result[0], default_leader) |
| 498 | + |
446 | 499 | def test_table_not_found(self):
|
447 | 500 | temp_db_id = "temp_db" + unique_resource_id("_")
|
448 | 501 |
|
@@ -551,6 +604,36 @@ def test_update_database_ddl_pitr_success(self):
|
551 | 604 | self.assertEqual(temp_db.version_retention_period, retention_period)
|
552 | 605 | self.assertEqual(len(temp_db.ddl_statements), len(ddl_statements))
|
553 | 606 |
|
| 607 | + @unittest.skipIf( |
| 608 | + USE_EMULATOR, "Default leader update is not supported by the emulator" |
| 609 | + ) |
| 610 | + def test_update_database_ddl_default_leader_success(self): |
| 611 | + pool = BurstyPool(labels={"testcase": "update_database_ddl_default_leader"}) |
| 612 | + |
| 613 | + temp_db_id = "temp_db" + unique_resource_id("_") |
| 614 | + default_leader = "us-east4" |
| 615 | + temp_db = self._instance.database(temp_db_id, pool=pool) |
| 616 | + create_op = temp_db.create() |
| 617 | + self.to_delete.append(temp_db) |
| 618 | + |
| 619 | + # We want to make sure the operation completes. |
| 620 | + create_op.result(240) # raises on failure / timeout. |
| 621 | + |
| 622 | + self.assertIsNone(temp_db.default_leader) |
| 623 | + |
| 624 | + ddl_statements = DDL_STATEMENTS + [ |
| 625 | + "ALTER DATABASE {}" |
| 626 | + " SET OPTIONS (default_leader = '{}')".format(temp_db_id, default_leader) |
| 627 | + ] |
| 628 | + operation = temp_db.update_ddl(ddl_statements) |
| 629 | + |
| 630 | + # We want to make sure the operation completes. |
| 631 | + operation.result(240) # raises on failure / timeout. |
| 632 | + |
| 633 | + temp_db.reload() |
| 634 | + self.assertEqual(temp_db.default_leader, default_leader) |
| 635 | + self.assertEqual(len(temp_db.ddl_statements), len(ddl_statements)) |
| 636 | + |
554 | 637 | def test_db_batch_insert_then_db_snapshot_read(self):
|
555 | 638 | retry = RetryInstanceState(_has_all_ddl)
|
556 | 639 | retry(self._db.reload)()
|
|
0 commit comments