Skip to content
This repository was archived by the owner on Mar 31, 2026. It is now read-only.

Commit ef7eff8

Browse files
committed
Fix utcnow deprecations in samples and improve backup test reliability
1 parent 737c69e commit ef7eff8

File tree

8 files changed

+90
-55
lines changed

8 files changed

+90
-55
lines changed

samples/samples/archived/backup_snippet.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"""
2020

2121
import time
22-
from datetime import datetime, timedelta
22+
from datetime import datetime, timedelta, timezone
23+
import time
2324

2425
from google.cloud import spanner
2526

@@ -30,7 +31,7 @@ def cancel_backup(instance_id, database_id, backup_id):
3031
instance = spanner_client.instance(instance_id)
3132
database = instance.database(database_id)
3233

33-
expire_time = datetime.utcnow() + timedelta(days=30)
34+
expire_time = datetime.now(timezone.utc) + timedelta(days=30)
3435

3536
# Create a backup.
3637
backup = instance.backup(backup_id, database=database, expire_time=expire_time)
@@ -63,14 +64,14 @@ def copy_backup(instance_id, backup_id, source_backup_path):
6364
instance = spanner_client.instance(instance_id)
6465

6566
# Create a backup object and wait for copy backup operation to complete.
66-
expire_time = datetime.utcnow() + timedelta(days=14)
67+
expire_time = datetime.now(timezone.utc) + timedelta(days=14)
6768
copy_backup = instance.copy_backup(
6869
backup_id=backup_id, source_backup=source_backup_path, expire_time=expire_time
6970
)
7071
operation = copy_backup.create()
7172

7273
# Wait for copy backup operation to complete.
73-
operation.result(2100)
74+
operation.result(3600)
7475

7576
# Verify that the copy backup is ready.
7677
copy_backup.reload()
@@ -97,14 +98,14 @@ def create_backup(instance_id, database_id, backup_id, version_time):
9798
database = instance.database(database_id)
9899

99100
# Create a backup
100-
expire_time = datetime.utcnow() + timedelta(days=14)
101+
expire_time = datetime.now(timezone.utc) + timedelta(days=14)
101102
backup = instance.backup(
102103
backup_id, database=database, expire_time=expire_time, version_time=version_time
103104
)
104105
operation = backup.create()
105106

106107
# Wait for backup operation to complete.
107-
operation.result(2100)
108+
operation.result(3600)
108109

109110
# Verify that the backup is ready.
110111
backup.reload()
@@ -127,15 +128,14 @@ def create_backup_with_encryption_key(
127128
instance_id, database_id, backup_id, kms_key_name
128129
):
129130
"""Creates a backup for a database using a Customer Managed Encryption Key (CMEK)."""
130-
from google.cloud.spanner_admin_database_v1 import \
131-
CreateBackupEncryptionConfig
131+
from google.cloud.spanner_admin_database_v1 import CreateBackupEncryptionConfig
132132

133133
spanner_client = spanner.Client()
134134
instance = spanner_client.instance(instance_id)
135135
database = instance.database(database_id)
136136

137137
# Create a backup
138-
expire_time = datetime.utcnow() + timedelta(days=14)
138+
expire_time = datetime.now(timezone.utc) + timedelta(days=14)
139139
encryption_config = {
140140
"encryption_type": CreateBackupEncryptionConfig.EncryptionType.CUSTOMER_MANAGED_ENCRYPTION,
141141
"kms_key_name": kms_key_name,
@@ -149,7 +149,7 @@ def create_backup_with_encryption_key(
149149
operation = backup.create()
150150

151151
# Wait for backup operation to complete.
152-
operation.result(2100)
152+
operation.result(3600)
153153

154154
# Verify that the backup is ready.
155155
backup.reload()
@@ -295,7 +295,7 @@ def list_backups(instance_id, database_id, backup_id):
295295
print(backup.name)
296296

297297
# List all backups that expire before a timestamp.
298-
expire_time = datetime.utcnow().replace(microsecond=0) + timedelta(days=30)
298+
expire_time = datetime.now(timezone.utc).replace(microsecond=0) + timedelta(days=30)
299299
print(
300300
'All backups with expire_time before "{}-{}-{}T{}:{}:{}Z":'.format(
301301
*expire_time.timetuple()
@@ -312,7 +312,7 @@ def list_backups(instance_id, database_id, backup_id):
312312
print(backup.name)
313313

314314
# List backups that were created after a timestamp that are also ready.
315-
create_time = datetime.utcnow().replace(microsecond=0) - timedelta(days=1)
315+
create_time = datetime.now(timezone.utc).replace(microsecond=0) - timedelta(days=1)
316316
print(
317317
'All backups created after "{}-{}-{}T{}:{}:{}Z" and are READY:'.format(
318318
*create_time.timetuple()
@@ -396,8 +396,7 @@ def restore_database_with_encryption_key(
396396
instance_id, new_database_id, backup_id, kms_key_name
397397
):
398398
"""Restores a database from a backup using a Customer Managed Encryption Key (CMEK)."""
399-
from google.cloud.spanner_admin_database_v1 import \
400-
RestoreDatabaseEncryptionConfig
399+
from google.cloud.spanner_admin_database_v1 import RestoreDatabaseEncryptionConfig
401400

402401
spanner_client = spanner.Client()
403402
instance = spanner_client.instance(instance_id)

samples/samples/archived/backup_snippet_test.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ def unique_backup_id():
4141
RETENTION_DATABASE_ID = unique_database_id()
4242
RETENTION_PERIOD = "7d"
4343
COPY_BACKUP_ID = unique_backup_id()
44+
CMEK_DATABASE_ID = unique_database_id()
45+
46+
47+
@pytest.fixture(scope="module")
48+
def cmek_database(spanner_client, sample_instance, database_dialect):
49+
from conftest import create_sample_database
50+
51+
yield from create_sample_database(
52+
spanner_client, sample_instance, CMEK_DATABASE_ID, [], database_dialect
53+
)
4454

4555

4656
@pytest.mark.dependency(name="create_backup")
@@ -77,12 +87,12 @@ def test_copy_backup(capsys, instance_id, spanner_client):
7787
def test_create_backup_with_encryption_key(
7888
capsys,
7989
instance_id,
80-
sample_database,
90+
cmek_database,
8191
kms_key_name,
8292
):
8393
backup_snippet.create_backup_with_encryption_key(
8494
instance_id,
85-
sample_database.database_id,
95+
cmek_database.database_id,
8696
CMEK_BACKUP_ID,
8797
kms_key_name,
8898
)
@@ -91,8 +101,10 @@ def test_create_backup_with_encryption_key(
91101
assert kms_key_name in out
92102

93103

94-
@pytest.mark.skip(reason="same test passes on unarchived test suite, "
95-
"but fails here. Needs investigation")
104+
@pytest.mark.skip(
105+
reason="same test passes on unarchived test suite, "
106+
"but fails here. Needs investigation"
107+
)
96108
@pytest.mark.dependency(depends=["create_backup"])
97109
@RetryErrors(exception=DeadlineExceeded, max_tries=2)
98110
def test_restore_database(capsys, instance_id, sample_database):
@@ -103,21 +115,23 @@ def test_restore_database(capsys, instance_id, sample_database):
103115
assert BACKUP_ID in out
104116

105117

106-
@pytest.mark.skip(reason="same test passes on unarchived test suite, "
107-
"but fails here. Needs investigation")
118+
@pytest.mark.skip(
119+
reason="same test passes on unarchived test suite, "
120+
"but fails here. Needs investigation"
121+
)
108122
@pytest.mark.dependency(depends=["create_backup_with_encryption_key"])
109123
@RetryErrors(exception=DeadlineExceeded, max_tries=2)
110124
def test_restore_database_with_encryption_key(
111125
capsys,
112126
instance_id,
113-
sample_database,
127+
cmek_database,
114128
kms_key_name,
115129
):
116130
backup_snippet.restore_database_with_encryption_key(
117131
instance_id, CMEK_RESTORE_DB_ID, CMEK_BACKUP_ID, kms_key_name
118132
)
119133
out, _ = capsys.readouterr()
120-
assert (sample_database.database_id + " restored to ") in out
134+
assert (cmek_database.database_id + " restored to ") in out
121135
assert (CMEK_RESTORE_DB_ID + " from backup ") in out
122136
assert CMEK_BACKUP_ID in out
123137
assert kms_key_name in out

samples/samples/backup_sample.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"""
2020

2121
import argparse
22-
from datetime import datetime, timedelta
22+
from datetime import datetime, timedelta, timezone
2323
import time
2424

2525
from google.api_core import protobuf_helpers
@@ -37,7 +37,7 @@ def create_backup(instance_id, database_id, backup_id, version_time):
3737
database_admin_api = spanner_client.database_admin_api
3838

3939
# Create a backup
40-
expire_time = datetime.utcnow() + timedelta(days=14)
40+
expire_time = datetime.now(timezone.utc) + timedelta(days=14)
4141

4242
request = backup_pb.CreateBackupRequest(
4343
parent=database_admin_api.instance_path(spanner_client.project, instance_id),
@@ -54,7 +54,7 @@ def create_backup(instance_id, database_id, backup_id, version_time):
5454
operation = database_admin_api.create_backup(request)
5555

5656
# Wait for backup operation to complete.
57-
backup = operation.result(2100)
57+
backup = operation.result(3600)
5858

5959
# Verify that the backup is ready.
6060
assert backup.state == backup_pb.Backup.State.READY
@@ -82,7 +82,7 @@ def create_backup_with_encryption_key(
8282
database_admin_api = spanner_client.database_admin_api
8383

8484
# Create a backup
85-
expire_time = datetime.utcnow() + timedelta(days=14)
85+
expire_time = datetime.now(timezone.utc) + timedelta(days=14)
8686
encryption_config = {
8787
"encryption_type": CreateBackupEncryptionConfig.EncryptionType.CUSTOMER_MANAGED_ENCRYPTION,
8888
"kms_key_name": kms_key_name,
@@ -101,7 +101,7 @@ def create_backup_with_encryption_key(
101101
operation = database_admin_api.create_backup(request)
102102

103103
# Wait for backup operation to complete.
104-
backup = operation.result(2100)
104+
backup = operation.result(3600)
105105

106106
# Verify that the backup is ready.
107107
assert backup.state == backup_pb.Backup.State.READY
@@ -130,7 +130,7 @@ def create_backup_with_multiple_kms_keys(
130130
database_admin_api = spanner_client.database_admin_api
131131

132132
# Create a backup
133-
expire_time = datetime.utcnow() + timedelta(days=14)
133+
expire_time = datetime.now(timezone.utc) + timedelta(days=14)
134134
encryption_config = {
135135
"encryption_type": CreateBackupEncryptionConfig.EncryptionType.CUSTOMER_MANAGED_ENCRYPTION,
136136
"kms_key_names": kms_key_names,
@@ -149,7 +149,7 @@ def create_backup_with_multiple_kms_keys(
149149
operation = database_admin_api.create_backup(request)
150150

151151
# Wait for backup operation to complete.
152-
backup = operation.result(2100)
152+
backup = operation.result(3600)
153153

154154
# Verify that the backup is ready.
155155
assert backup.state == backup_pb.Backup.State.READY
@@ -302,7 +302,7 @@ def cancel_backup(instance_id, database_id, backup_id):
302302
spanner_client = spanner.Client()
303303
database_admin_api = spanner_client.database_admin_api
304304

305-
expire_time = datetime.utcnow() + timedelta(days=30)
305+
expire_time = datetime.now(timezone.utc) + timedelta(days=30)
306306

307307
# Create a backup.
308308
request = backup_pb.CreateBackupRequest(
@@ -473,7 +473,7 @@ def list_backups(instance_id, database_id, backup_id):
473473
print(backup.name)
474474

475475
# List all backups that expire before a timestamp.
476-
expire_time = datetime.utcnow().replace(microsecond=0) + timedelta(days=30)
476+
expire_time = datetime.now(timezone.utc).replace(microsecond=0) + timedelta(days=30)
477477
print(
478478
'All backups with expire_time before "{}-{}-{}T{}:{}:{}Z":'.format(
479479
*expire_time.timetuple()
@@ -498,7 +498,7 @@ def list_backups(instance_id, database_id, backup_id):
498498
print(backup.name)
499499

500500
# List backups that were created after a timestamp that are also ready.
501-
create_time = datetime.utcnow().replace(microsecond=0) - timedelta(days=1)
501+
create_time = datetime.now(timezone.utc).replace(microsecond=0) - timedelta(days=1)
502502
print(
503503
'All backups created after "{}-{}-{}T{}:{}:{}Z" and are READY:'.format(
504504
*create_time.timetuple()
@@ -671,7 +671,7 @@ def copy_backup(instance_id, backup_id, source_backup_path):
671671
database_admin_api = spanner_client.database_admin_api
672672

673673
# Create a backup object and wait for copy backup operation to complete.
674-
expire_time = datetime.utcnow() + timedelta(days=14)
674+
expire_time = datetime.now(timezone.utc) + timedelta(days=14)
675675
request = backup_pb.CopyBackupRequest(
676676
parent=database_admin_api.instance_path(spanner_client.project, instance_id),
677677
backup_id=backup_id,
@@ -682,7 +682,7 @@ def copy_backup(instance_id, backup_id, source_backup_path):
682682
operation = database_admin_api.copy_backup(request)
683683

684684
# Wait for backup operation to complete.
685-
copy_backup = operation.result(2100)
685+
copy_backup = operation.result(3600)
686686

687687
# Verify that the copy backup is ready.
688688
assert copy_backup.state == backup_pb.Backup.State.READY
@@ -718,7 +718,7 @@ def copy_backup_with_multiple_kms_keys(
718718
}
719719

720720
# Create a backup object and wait for copy backup operation to complete.
721-
expire_time = datetime.utcnow() + timedelta(days=14)
721+
expire_time = datetime.now(timezone.utc) + timedelta(days=14)
722722
request = backup_pb.CopyBackupRequest(
723723
parent=database_admin_api.instance_path(spanner_client.project, instance_id),
724724
backup_id=backup_id,
@@ -730,7 +730,7 @@ def copy_backup_with_multiple_kms_keys(
730730
operation = database_admin_api.copy_backup(request)
731731

732732
# Wait for backup operation to complete.
733-
copy_backup = operation.result(2100)
733+
copy_backup = operation.result(3600)
734734

735735
# Verify that the copy backup is ready.
736736
assert copy_backup.state == backup_pb.Backup.State.READY

samples/samples/backup_sample_test.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ def unique_backup_id():
4242
RETENTION_DATABASE_ID = unique_database_id()
4343
RETENTION_PERIOD = "7d"
4444
COPY_BACKUP_ID = unique_backup_id()
45+
CMEK_DATABASE_ID = unique_database_id()
46+
47+
48+
@pytest.fixture(scope="module")
49+
def cmek_database(spanner_client, sample_instance, database_dialect):
50+
from conftest import create_sample_database
51+
52+
yield from create_sample_database(
53+
spanner_client, sample_instance, CMEK_DATABASE_ID, [], database_dialect
54+
)
4555

4656

4757
@pytest.mark.dependency(name="create_backup")
@@ -79,12 +89,12 @@ def test_copy_backup(capsys, instance_id, spanner_client):
7989
def test_create_backup_with_encryption_key(
8090
capsys,
8191
instance_id,
82-
sample_database,
92+
cmek_database,
8393
kms_key_name,
8494
):
8595
backup_sample.create_backup_with_encryption_key(
8696
instance_id,
87-
sample_database.database_id,
97+
cmek_database.database_id,
8898
CMEK_BACKUP_ID,
8999
kms_key_name,
90100
)
@@ -149,14 +159,14 @@ def test_restore_database(capsys, instance_id, sample_database):
149159
def test_restore_database_with_encryption_key(
150160
capsys,
151161
instance_id,
152-
sample_database,
162+
cmek_database,
153163
kms_key_name,
154164
):
155165
backup_sample.restore_database_with_encryption_key(
156166
instance_id, CMEK_RESTORE_DB_ID, CMEK_BACKUP_ID, kms_key_name
157167
)
158168
out, _ = capsys.readouterr()
159-
assert (sample_database.database_id + " restored to ") in out
169+
assert (cmek_database.database_id + " restored to ") in out
160170
assert (CMEK_RESTORE_DB_ID + " from backup ") in out
161171
assert CMEK_BACKUP_ID in out
162172
assert kms_key_name in out

samples/samples/conftest.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ def scrub_instance_ignore_not_found(to_scrub):
6565
for backup_pb in to_scrub.list_backups():
6666
backup.Backup.from_pb(backup_pb, to_scrub).delete()
6767

68+
for database_pb in to_scrub.list_databases():
69+
database.Database.from_pb(database_pb, to_scrub).drop()
70+
6871
retry_429(to_scrub.delete)()
6972
except exceptions.NotFound:
7073
pass
@@ -154,12 +157,12 @@ def sample_instance(
154157

155158
yield sample_instance
156159

157-
for database_pb in sample_instance.list_databases():
158-
database.Database.from_pb(database_pb, sample_instance).drop()
159-
160160
for backup_pb in sample_instance.list_backups():
161161
backup.Backup.from_pb(backup_pb, sample_instance).delete()
162162

163+
for database_pb in sample_instance.list_databases():
164+
database.Database.from_pb(database_pb, sample_instance).drop()
165+
163166
sample_instance.delete()
164167

165168

@@ -189,12 +192,12 @@ def multi_region_instance(
189192

190193
yield multi_region_instance
191194

192-
for database_pb in multi_region_instance.list_databases():
193-
database.Database.from_pb(database_pb, multi_region_instance).drop()
194-
195195
for backup_pb in multi_region_instance.list_backups():
196196
backup.Backup.from_pb(backup_pb, multi_region_instance).delete()
197197

198+
for database_pb in multi_region_instance.list_databases():
199+
database.Database.from_pb(database_pb, multi_region_instance).drop()
200+
198201
multi_region_instance.delete()
199202

200203

0 commit comments

Comments
 (0)