8000 feat: add support for Point In Time Recovery (PITR) (#148) · googleapis/python-spanner@a082e5d · GitHub
[go: up one dir, main page]

Skip to content

Commit a082e5d

Browse files
larkeezoercai
andauthored
feat: add support for Point In Time Recovery (PITR) (#148)
* feat: add PITR-lite support * fix: remove unneeded conversion for earliest_version_time * test: fix list_databases list comprehension * feat: add support for PITR-lite backups (#1) * Backup changes * Basic tests * Add system tests * Fix system tests * Add retention period to backup systests * style: fix lint errors * test: fix failing backup system tests (#2) * Remove unnecessary retention period setting * Fix systests * Review changes (#3) * Remove unnecessary retention period setting * Fix systests * Review changes * style: fix lint Co-authored-by: larkee <larkee@users.noreply.github.com> Co-authored-by: Zoe <zoc@google.com>
1 parent 36b12a7 commit a082e5d

File tree

6 files changed

+318
-11
lines changed

6 files changed

+318
-11
lines changed

google/cloud/spanner_v1/backup.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,23 @@ class Backup(object):
5151 :param expire_time: (Optional) The expire time that will be used to
5252
create the backup. Required if the create method
5353
needs to be called.
54+
55+
:type version_time: :class:`datetime.datetime`
56+
:param version_time: (Optional) The version time that was specified for
57+
the externally consistent copy of the database. If
58+
not present, it is the same as the `create_time` of
59+
the backup.
5460
"""
5561

56-
def __init__(self, backup_id, instance, database="", expire_time=None):
62+
def __init__(
63+
self, backup_id, instance, database="", expire_time=None, version_time=None
64+
):
5765
self.backup_id = backup_id
5866
self._instance = instance
5967
self._database = database
6068
self._expire_time = expire_time
6169
self._create_time = None
70+
self._version_time = version_time
6271
self._size_bytes = None
6372
self._state = None
6473
self._referencing_databases = None
@@ -109,6 +118,16 @@ def create_time(self):
109118
"""
110119
return self._create_time
111120

121+
@property
122+
def version_time(self):
123+
"""Version time of this backup.
124+
125+
:rtype: :class:`datetime.datetime`
126+
:returns: a datetime object representing the version time of
127+
this backup
128+
"""
129+
return self._version_time
130+
112131
@property
113132
def size_bytes(self):
114133
"""Size of this backup in bytes.
@@ -190,7 +209,11 @@ def create(self):
190209
raise ValueError("database not set")
191210
api = self._instance._client.database_admin_api
192211
metadata = _metadata_with_prefix(self.name)
193-
backup = BackupPB(database=self._database, expire_time=self.expire_time,)
212+
backup = BackupPB(
213+
database=self._database,
214+
expire_time=self.expire_time,
215+
version_time=self.version_time,
216+
)
194217

195218
future = api.create_backup(
196219
parent=self._instance.name,
@@ -228,6 +251,7 @@ def reload(self):
228251
self._database = pb.database
229252
self._expire_time = pb.expire_time
230253
self._create_time = pb.create_time
254+
self._version_time = pb.version_time
231255
self._size_bytes = pb.size_bytes
232256
self._state = BackupPB.State(pb.state)
233257
self._referencing_databases = pb.referencing_databases

google/cloud/spanner_v1/database.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ def __init__(self, database_id, instance, ddl_statements=(), pool=None):
107107
self._state = None
108108
self._create_time = None
109109
self._restore_info = None
110+
self._version_retention_period = None
111+
self._earliest_version_time = None
110112

111113
if pool is None:
112114
pool = BurstyPool()
@@ -204,6 +206,25 @@ def restore_info(self):
204206
"""
205207
return self._restore_info
206208

209+
@property
210+
def version_retention_period(self):
211+
"""The period in which Cloud Spanner retains all versions of data
212+
for the database.
213+
214+
:rtype: str
215+
:returns: a string representing the duration of the version retention period
216+
"""
217+
return self._version_retention_period
218+
219+
@property
220+
def earliest_version_time(self):
221+
"""The earliest time at which older versions of the data can be read.
222+
223+
:rtype: :class:`datetime.datetime`
224+
:returns: a datetime object representing the earliest version time
225+
"""
226+
return self._earliest_version_time
227+
207228
@property
208229
def ddl_statements(self):
209230
"""DDL Statements used to define database schema.
@@ -313,6 +334,8 @@ def reload(self):
313334
self._state = DatabasePB.State(response.state)
314335
self._create_time = response.create_time
315336
self._restore_info = response.restore_info
337+
self._version_retention_period = response.version_retention_period
338+
self._earliest_version_time = response.earliest_version_time
316339

317340
def update_ddl(self, ddl_statements, operation_id=""):
318341
"""Update DDL for this database.

google/cloud/spanner_v1/instance.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ def list_databases(self, page_size=None):
400400
)
401401
return page_iter
402402

403-
def backup(self, backup_id, database="", expire_time=None):
403+
def backup(self, backup_id, database="", expire_time=None, version_time=None):
404404
"""Factory to create a backup within this instance.
405405
406406
:type backup_id: str
@@ -415,13 +415,29 @@ def backup(self, backup_id, database="", expire_time=None):
415415
:param expire_time:
416416
Optional. The expire time that will be used when creating the backup.
417417
Required if the create method needs to be called.
418+
419+
:type version_time: :class:`datetime.datetime`
420+
:param version_time:
421+
Optional. The version time that will be used to create the externally
422+
consistent copy of the database. If not present, it is the same as
423+
the `create_time` of the backup.
418424
"""
419425
try:
420426
return Backup(
421-
backup_id, self, database=database.name, expire_time=expire_time
427+
backup_id,
428+
self,
429+
database=database.name,
430+
expire_time=expire_time,
431+
version_time=version_time,
422432
)
423433
except AttributeError:
424-
return Backup(backup_id, self, database=database, expire_time=expire_time)
434+
return Backup(
435+
backup_id,
436+
self,
437+
database=database,
438+
expire_time=expire_time,
439+
version_time=version_time,
440+
)
425441

426442
def list_backups(self, filter_="", page_size=None):
427443
"""List backups for the instance.

0 commit comments

Comments
 (0)
0