|
14 | 14 | # See the License for the specific language governing permissions and
|
15 | 15 | # limitations under the License.
|
16 | 16 |
|
17 |
| -import configparser |
18 | 17 | import os
|
19 | 18 | import time
|
20 | 19 |
|
21 | 20 | from create_test_config import set_test_config
|
| 21 | +from google.api_core import datetime_helpers |
22 | 22 | from google.api_core.exceptions import AlreadyExists, ResourceExhausted
|
23 | 23 | from google.cloud.spanner_v1 import Client
|
24 | 24 | from google.cloud.spanner_v1.instance import Instance
|
| 25 | +from google.cloud.spanner_v1.database import Database |
25 | 26 |
|
26 | 27 |
|
27 | 28 | USE_EMULATOR = os.getenv("SPANNER_EMULATOR_HOST") is not None
|
@@ -66,43 +67,62 @@ def delete_stale_test_instances():
|
66 | 67 | )
|
67 | 68 |
|
68 | 69 |
|
69 |
| -def create_test_instance(): |
70 |
| - configs = list(CLIENT.list_instance_configs()) |
71 |
| - if not USE_EMULATOR: |
72 |
| - # Filter out non "us" locations |
73 |
| - configs = [config for config in configs if "asia-southeast1" in config.name] |
| 70 | +def delete_stale_test_databases(): |
| 71 | + """Delete test databases that are older than four hours.""" |
| 72 | + cutoff = (int(time.time()) - 4 * 60 * 60) * 1000 |
| 73 | + instance = CLIENT.instance("sqlalchemy-dialect-test") |
| 74 | + if not instance.exists(): |
| 75 | + return |
| 76 | + database_pbs = instance.list_databases() |
| 77 | + for database_pb in database_pbs: |
| 78 | + database = Database.from_pb(database_pb, instance) |
| 79 | + # The emulator does not return a create_time for databases. |
| 80 | + if database.create_time is None: |
| 81 | + continue |
| 82 | + create_time = datetime_helpers.to_milliseconds(database_pb.create_time) |
| 83 | + if create_time > cutoff: |
| 84 | + continue |
| 85 | + try: |
| 86 | + database.drop() |
| 87 | + except ResourceExhausted: |
| 88 | + print( |
| 89 | + "Unable to drop stale database '{}'. May need manual delete.".format( |
| 90 | + database.database_id |
| 91 | + ) |
| 92 | + ) |
74 | 93 |
|
75 |
| - instance_config = configs[0].name |
76 |
| - create_time = str(int(time.time())) |
77 |
| - unique_resource_id = "%s%d" % ("-", 1000 * time.time()) |
78 |
| - instance_id = ( |
79 |
| - "sqlalchemy-dialect-test" |
80 |
| - if USE_EMULATOR |
81 |
| - else "sqlalchemy-test" + unique_resource_id |
82 |
| - ) |
83 |
| - labels = {"python-spanner-sqlalchemy-systest": "true", "created": create_time} |
84 | 94 |
|
85 |
| - instance = CLIENT.instance(instance_id, instance_config, labels=labels) |
| 95 | +def create_test_instance(): |
| 96 | + instance_id = "sqlalchemy-dialect-test" |
| 97 | + instance = CLIENT.instance(instance_id) |
| 98 | + if not instance.exists(): |
| 99 | + instance_config = f"projects/{PROJECT}/instanceConfigs/regional-us-east1" |
| 100 | + if USE_EMULATOR: |
| 101 | + configs = list(CLIENT.list_instance_configs()) |
| 102 | + instance_config = configs[0].name |
| 103 | + create_time = str(int(time.time())) |
| 104 | + labels = {"python-spanner-sqlalchemy-systest": "true", "created": create_time} |
| 105 | + |
| 106 | + instance = CLIENT.instance(instance_id, instance_config, labels=labels) |
86 | 107 |
|
87 |
| - try: |
88 |
| - created_op = instance.create() |
89 |
| - created_op.result(1800) # block until completion |
90 |
| - except AlreadyExists: |
91 |
| - pass # instance was already created |
| 108 | + try: |
| 109 | + created_op = instance.create() |
| 110 | + created_op.result(1800) # block until completion |
| 111 | + except AlreadyExists: |
| 112 | + pass # instance was already created |
92 | 113 |
|
93 |
| - if USE_EMULATOR: |
94 |
| - database = instance.database("compliance-test") |
95 |
| - database.drop() |
| 114 | + unique_resource_id = "%s%d" % ("-", 1000 * time.time()) |
| 115 | + database_id = "sqlalchemy-test" + unique_resource_id |
96 | 116 |
|
97 | 117 | try:
|
98 |
| - database = instance.database("compliance-test") |
| 118 | + database = instance.database(database_id) |
99 | 119 | created_op = database.create()
|
100 | 120 | created_op.result(1800)
|
101 | 121 | except AlreadyExists:
|
102 |
| - pass # instance was already created |
| 122 | + pass # database was already created |
103 | 123 |
|
104 |
| - set_test_config(PROJECT, instance_id) |
| 124 | + set_test_config(PROJECT, instance_id, database_id) |
105 | 125 |
|
106 | 126 |
|
107 |
| -delete_stale_test_instances() |
| 127 | +delete_stale_test_databases() |
108 | 128 | create_test_instance()
|
0 commit comments