Skip to content

Commit 8c1c404

Browse files
committed
feat: changes as per review, adding shared_backup
1 parent 22fb08e commit 8c1c404

File tree

4 files changed

+64
-35
lines changed

4 files changed

+64
-35
lines changed

google/cloud/spanner_v1/backup.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ def __init__(
7676
backup_id,
7777
instance,
7878
database="",
79-
source_backup=None,
8079
expire_time=None,
8180
version_time=None,
8281
encryption_config=None,
82+
source_backup=None,
8383
):
8484
self.backup_id = backup_id
8585
self._instance = instance
@@ -92,6 +92,8 @@ def __init__(
9292
self._state = None
9393
self._referencing_databases = None
9494
self._encryption_info = None
95+
self._max_expire_time = None
96+
self._referencing_backups = None
9597
if type(encryption_config) == dict:
9698
if source_backup:
9799
self._encryption_config = CopyBackupEncryptionConfig(
@@ -196,6 +198,26 @@ def encryption_info(self):
196198
"""
197199
return self._encryption_info
198200

201+
@property
202+
def max_expire_time(self):
203+
"""The max allowed expiration time of the backup.
204+
205+
:rtype: :class:`datetime.datetime`
206+
:returns: a datetime object representing the max expire time of
207+
this backup
208+
"""
209+
return self._max_expire_time
210+
211+
@property
212+
def referencing_backups(self):
213+
"""The names of the destination backups being created by copying this source backup.
214+
215+
:rtype: list of strings
216+
:returns: a list of backup path strings which specify the backups that are
217+
referencing this copy backup
218+
"""
219+
return self._referencing_backups
220+
199221
@classmethod
200222
def from_pb(cls, backup_pb, instance):
201223
"""Create an instance of this class from a protobuf message.
@@ -330,6 +352,8 @@ def reload(self):
330352
self._state = BackupPB.State(pb.state)
331353
self._referencing_databases = pb.referencing_databases
332354
self._encryption_info = pb.encryption_info
355+
self._max_expire_time = pb.max_expire_time
356+
self._referencing_backups = pb.referencing_backups
333357

334358
def update_expire_time(self, new_expire_time):
335359
"""Update the expire time of this backup.

tests/system/_helpers.py

100644100755
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
DATABASE_OPERATION_TIMEOUT_IN_SECONDS = int(
4040
os.getenv("SPANNER_DATABASE_OPERATION_TIMEOUT_IN_SECONDS", 60)
4141
)
42+
BACKUP_OPERATION_TIMEOUT_IN_SECONDS = int(
43+
os.getenv("SPANNER_BACKUP_OPERATION_TIMEOUT_IN_SECONDS", 1200)
44+
)
4245

4346
USE_EMULATOR_ENVVAR = "SPANNER_EMULATOR_HOST"
4447
USE_EMULATOR = os.getenv(USE_EMULATOR_ENVVAR) is not None

tests/system/conftest.py

100644100755
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import datetime
1516
import time
17+
from google.cloud.spanner_admin_database_v1.types.backup import CreateBackupEncryptionConfig
1618

1719
import pytest
1820

@@ -66,6 +68,10 @@ def instance_operation_timeout():
6668
def database_operation_timeout():
6769
return _helpers.DATABASE_OPERATION_TIMEOUT_IN_SECONDS
6870

71+
@pytest.fixture(scope="session")
72+
def backup_operation_timeout():
73+
return _helpers.BACKUP_OPERATION_TIMEOUT_IN_SECONDS
74+
6975

7076
@pytest.fixture(scope="session")
7177
def shared_instance_id():
@@ -148,6 +154,30 @@ def shared_database(shared_instance, database_operation_timeout):
148154
database.drop()
149155

150156

157+
@pytest.fixture(scope="session")
158+
def shared_backup(shared_instance, shared_database, backup_operation_timeout):
159+
backup_name = _helpers.unique_id("test_backup")
160+
expire_time = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(
161+
days=3
162+
)
163+
source_encryption_enum = CreateBackupEncryptionConfig.EncryptionType
164+
source_encryption_config = CreateBackupEncryptionConfig(
165+
encryption_type=source_encryption_enum.GOOGLE_DEFAULT_ENCRYPTION,
166+
)
167+
backup = shared_instance.backup(
168+
backup_name,
169+
database=shared_database,
170+
expire_time=expire_time,
171+
encryption_config=source_encryption_config,
172+
)
173+
operation = backup.create()
174+
operation.result(backup_operation_timeout) # raises on failure / timeout.
175+
176+
yield backup
177+
178+
backup.delete()
179+
180+
151181
@pytest.fixture(scope="function")
152182
def databases_to_delete():
153183
to_delete = []

tests/system/test_backup_api.py

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ def test_backup_workflow(
200200

201201

202202
def test_copy_backup_workflow(
203-
shared_instance, shared_database, database_version_time, backups_to_delete,
203+
shared_instance, shared_backup, backups_to_delete,
204204
):
205205
from google.cloud.spanner_admin_database_v1 import (
206206
CreateBackupEncryptionConfig,
@@ -209,7 +209,6 @@ def test_copy_backup_workflow(
209209
)
210210

211211
backup_id = _helpers.unique_id("backup_id", separator="_")
212-
source_backup_id = _helpers.unique_id("source_backup_id", separator="_")
213212
expire_time = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(
214213
days=3
215214
)
@@ -218,27 +217,12 @@ def test_copy_backup_workflow(
218217
encryption_type=copy_encryption_enum.GOOGLE_DEFAULT_ENCRYPTION,
219218
)
220219

221-
source_encryption_enum = CreateBackupEncryptionConfig.EncryptionType
222-
source_encryption_config = CreateBackupEncryptionConfig(
223-
encryption_type=source_encryption_enum.GOOGLE_DEFAULT_ENCRYPTION,
224-
)
225-
226220
# Create backup.
227-
source_backup = shared_instance.backup(
228-
source_backup_id,
229-
database=shared_database,
230-
expire_time=expire_time,
231-
version_time=database_version_time,
232-
encryption_config=source_encryption_config,
233-
)
234-
operation = source_backup.create()
235-
backups_to_delete.append(source_backup)
236-
operation.result() # blocks indefinitely
237-
221+
shared_backup.reload()
238222
# Create a copy backup
239223
copy_backup = shared_instance.copy_backup(
240224
backup_id=backup_id,
241-
source_backup=source_backup.name,
225+
source_backup=shared_backup.name,
242226
expire_time=expire_time,
243227
encryption_config=copy_encryption_config,
244228
)
@@ -268,7 +252,6 @@ def test_copy_backup_workflow(
268252
copy_backup.update_expire_time(valid_expire_time)
269253
assert valid_expire_time == copy_backup.expire_time
270254

271-
source_backup.delete()
272255
copy_backup.delete()
273256
assert not copy_backup.exists()
274257

@@ -364,34 +347,23 @@ def test_backup_create_w_invalid_version_time_future(
364347

365348

366349
def test_copy_backup_create_w_invalid_expire_time(
367-
shared_instance, shared_database, backups_to_delete,
350+
shared_instance, shared_backup,
368351
):
369352
backup_id = _helpers.unique_id("backup_id", separator="_")
370-
source_backup_id = _helpers.unique_id("source_backup_id", separator="_")
371-
valid_expire_time = datetime.datetime.now(
372-
datetime.timezone.utc
373-
) + datetime.timedelta(days=7)
374353
invalid_expire_time = datetime.datetime.now(datetime.timezone.utc)
375354

376-
source_backup = shared_instance.backup(
377-
source_backup_id, database=shared_database, expire_time=valid_expire_time
378-
)
379-
op = source_backup.create()
380-
op.result() # blocks indefinitely
381-
backups_to_delete.append(source_backup)
355+
shared_backup.reload()
382356

383357
copy_backup = shared_instance.copy_backup(
384358
backup_id=backup_id,
385-
source_backup=source_backup.name,
359+
source_backup=shared_backup.name,
386360
expire_time=invalid_expire_time,
387361
)
388362

389363
with pytest.raises(exceptions.InvalidArgument):
390364
operation = copy_backup.create()
391365
operation.result() # blocks indefinitely
392366

393-
source_backup.delete()
394-
395367

396368
def test_database_restore_to_diff_instance(
397369
shared_instance,

0 commit comments

Comments
 (0)