def backup(self, backup_id, database="", expire_time=None): """Factory to create a backup within this instance. :type backup_id: str :param backup_id: The ID of the backup. :type database: :class:`~google.cloud.spanner_v1.database.Database` :param database: Optional. The database that will be used when creating the backup. Required if the create method needs to be called. :type expire_time: :class:`datetime.datetime` :param expire_time: Optional. The expire time that will be used when creating the backup. Required if the create method needs to be called. """ try: return Backup(backup_id, self, database=database.name, expire_time=expire_time) except AttributeError: return Backup(backup_id, self, database=database, expire_time=expire_time)
def backup( self, backup_id, database="", expire_time=None, version_time=None, encryption_config=None, ): """Factory to create a backup within this instance. :type backup_id: str :param backup_id: The ID of the backup. :type database: :class:`~google.cloud.spanner_v1.database.Database` :param database: Optional. The database that will be used when creating the backup. Required if the create method needs to be called. :type expire_time: :class:`datetime.datetime` :param expire_time: Optional. The expire time that will be used when creating the backup. Required if the create method needs to be called. :type version_time: :class:`datetime.datetime` :param version_time: Optional. The version time that will be used to create the externally consistent copy of the database. If not present, it is the same as the `create_time` of the backup. :type encryption_config: :class:`~google.cloud.spanner_admin_database_v1.types.CreateBackupEncryptionConfig` or :class:`dict` :param encryption_config: (Optional) Encryption configuration for the backup. If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.spanner_admin_database_v1.types.CreateBackupEncryptionConfig` :rtype: :class:`~google.cloud.spanner_v1.backup.Backup` :returns: a backup owned by this instance. """ try: return Backup( backup_id, self, database=database.name, expire_time=expire_time, version_time=version_time, encryption_config=encryption_config, ) except AttributeError: return Backup( backup_id, self, database=database, expire_time=expire_time, version_time=version_time, encryption_config=encryption_config, )
def copy_backup( self, backup_id, source_backup, expire_time=None, encryption_config=None, ): """Factory to create a copy backup within this instance. :type backup_id: str :param backup_id: The ID of the backup copy. :type source_backup: str :param source_backup_id: The full path of the source backup to be copied. :type expire_time: :class:`datetime.datetime` :param expire_time: Optional. The expire time that will be used when creating the copy backup. Required if the create method needs to be called. :type encryption_config: :class:`~google.cloud.spanner_admin_database_v1.types.CopyBackupEncryptionConfig` or :class:`dict` :param encryption_config: (Optional) Encryption configuration for the backup. If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.spanner_admin_database_v1.types.CopyBackupEncryptionConfig` :rtype: :class:`~google.cloud.spanner_v1.backup.Backup` :returns: a copy backup owned by this instance. """ return Backup( backup_id, self, source_backup=source_backup, expire_time=expire_time, encryption_config=encryption_config, )
def test_create_already_exists(self): from google.cloud.exceptions import Conflict from google.cloud.spanner_admin_database_v1 import Backup client = _Client() api = client.database_admin_api = self._make_database_admin_api() api.create_backup.side_effect = Conflict("testing") instance = _Instance(self.INSTANCE_NAME, client=client) timestamp = self._make_timestamp() backup = self._make_one(self.BACKUP_ID, instance, database=self.DATABASE_NAME, expire_time=timestamp) backup_pb = Backup( database=self.DATABASE_NAME, expire_time=timestamp, ) with self.assertRaises(Conflict): backup.create() api.create_backup.assert_called_once_with( parent=self.INSTANCE_NAME, backup_id=self.BACKUP_ID, backup=backup_pb, metadata=[("google-cloud-resource-prefix", backup.name)], )
def test_create_instance_not_found(self): from google.cloud.exceptions import NotFound from google.cloud.spanner_admin_database_v1 import Backup from google.cloud.spanner_admin_database_v1 import CreateBackupRequest client = _Client() api = client.database_admin_api = self._make_database_admin_api() api.create_backup.side_effect = NotFound("testing") instance = _Instance(self.INSTANCE_NAME, client=client) timestamp = self._make_timestamp() backup = self._make_one( self.BACKUP_ID, instance, database=self.DATABASE_NAME, expire_time=timestamp ) backup_pb = Backup( database=self.DATABASE_NAME, expire_time=timestamp, ) with self.assertRaises(NotFound): backup.create() request = CreateBackupRequest( parent=self.INSTANCE_NAME, backup_id=self.BACKUP_ID, backup=backup_pb, ) api.create_backup.assert_called_once_with( request=request, metadata=[("google-cloud-resource-prefix", backup.name)], )
def test_create_success(self): from google.cloud.spanner_admin_database_v1 import Backup op_future = object() client = _Client() api = client.database_admin_api = self._make_database_admin_api() api.create_backup.return_value = op_future instance = _Instance(self.INSTANCE_NAME, client=client) timestamp = self._make_timestamp() backup = self._make_one(self.BACKUP_ID, instance, database=self.DATABASE_NAME, expire_time=timestamp) backup_pb = Backup( database=self.DATABASE_NAME, expire_time=timestamp, ) future = backup.create() self.assertIs(future, op_future) api.create_backup.assert_called_once_with( parent=self.INSTANCE_NAME, backup_id=self.BACKUP_ID, backup=backup_pb, metadata=[("google-cloud-resource-prefix", backup.name)], )
def test_reload_success(self): from google.cloud.spanner_admin_database_v1 import Backup timestamp = self._make_timestamp() client = _Client() backup_pb = Backup( name=self.BACKUP_NAME, database=self.DATABASE_NAME, expire_time=timestamp, create_time=timestamp, size_bytes=10, state=1, referencing_databases=[], ) api = client.database_admin_api = self._make_database_admin_api() api.get_backup.return_value = backup_pb instance = _Instance(self.INSTANCE_NAME, client=client) backup = self._make_one(self.BACKUP_ID, instance) backup.reload() self.assertEqual(backup.name, self.BACKUP_NAME) self.assertEqual(backup.database, self.DATABASE_NAME) self.assertEqual(backup.expire_time, timestamp) self.assertEqual(backup.create_time, timestamp) self.assertEqual(backup.size_bytes, 10) self.assertEqual(backup.state, Backup.State.CREATING) self.assertEqual(backup.referencing_databases, []) api.get_backup.assert_called_once_with( name=self.BACKUP_NAME, metadata=[("google-cloud-resource-prefix", backup.name)], )
def test_from_pb_invalid_name(self): from google.cloud.spanner_admin_database_v1 import Backup client = _Client() instance = _Instance(self.INSTANCE_NAME, client) backup_pb = Backup(name="invalid_format") backup_class = self._get_target_class() with self.assertRaises(ValueError): backup_class.from_pb(backup_pb, instance)
def test_update_expire_time_success(self): from google.cloud.spanner_admin_database_v1 import Backup client = _Client() api = client.database_admin_api = self._make_database_admin_api() api.update_backup.return_type = Backup(name=self.BACKUP_NAME) instance = _Instance(self.INSTANCE_NAME, client=client) backup = self._make_one(self.BACKUP_ID, instance) expire_time = self._make_timestamp() backup.update_expire_time(expire_time) backup_update = Backup(name=self.BACKUP_NAME, expire_time=expire_time,) update_mask = {"paths": ["expire_time"]} api.update_backup.assert_called_once_with( backup=backup_update, update_mask=update_mask, metadata=[("google-cloud-resource-prefix", backup.name)], )
def backup(self, backup_id, database="", expire_time=None, version_time=None): """Factory to create a backup within this instance. :type backup_id: str :param backup_id: The ID of the backup. :type database: :class:`~google.cloud.spanner_v1.database.Database` :param database: Optional. The database that will be used when creating the backup. Required if the create method needs to be called. :type expire_time: :class:`datetime.datetime` :param expire_time: Optional. The expire time that will be used when creating the backup. Required if the create method needs to be called. :type version_time: :class:`datetime.datetime` :param version_time: Optional. The version time that will be used to create the externally consistent copy of the database. If not present, it is the same as the `create_time` of the backup. """ try: return Backup( backup_id, self, database=database.name, expire_time=expire_time, version_time=version_time, ) except AttributeError: return Backup( backup_id, self, database=database, expire_time=expire_time, version_time=version_time, )
def test_from_pb_instance_mismatch(self): from google.cloud.spanner_admin_database_v1 import Backup ALT_INSTANCE = "/projects/%s/instances/ALT-INSTANCE" % (self.PROJECT_ID,) client = _Client() instance = _Instance(ALT_INSTANCE, client) backup_pb = Backup(name=self.BACKUP_NAME) backup_class = self._get_target_class() with self.assertRaises(ValueError): backup_class.from_pb(backup_pb, instance)
def test_from_pb_project_mismatch(self): from google.cloud.spanner_admin_database_v1 import Backup ALT_PROJECT = "ALT_PROJECT" client = _Client(project=ALT_PROJECT) instance = _Instance(self.INSTANCE_NAME, client) backup_pb = Backup(name=self.BACKUP_NAME) backup_class = self._get_target_class() with self.assertRaises(ValueError): backup_class.from_pb(backup_pb, instance)
def _item_to_backup(self, iterator, backup_pb): """Convert a backup protobuf to the native object. :type iterator: :class:`~google.api_core.page_iterator.Iterator` :param iterator: The iterator that is currently in use. :type backup_pb: :class:`~google.spanner.admin.database.v1.Backup` :param backup_pb: A backup returned from the API. :rtype: :class:`~google.cloud.spanner_v1.backup.Backup` :returns: The next backup in the page. """ return Backup.from_pb(backup_pb, self)
def test_create_success(self): from google.cloud.spanner_admin_database_v1 import Backup from google.cloud.spanner_admin_database_v1 import CreateBackupRequest from google.cloud.spanner_admin_database_v1 import CreateBackupEncryptionConfig from datetime import datetime from datetime import timedelta from pytz import UTC op_future = object() client = _Client() api = client.database_admin_api = self._make_database_admin_api() api.create_backup.return_value = op_future instance = _Instance(self.INSTANCE_NAME, client=client) version_timestamp = datetime.utcnow() - timedelta(minutes=5) version_timestamp = version_timestamp.replace(tzinfo=UTC) expire_timestamp = self._make_timestamp() encryption_config = {"encryption_type": 3, "kms_key_name": "key_name"} backup = self._make_one( self.BACKUP_ID, instance, database=self.DATABASE_NAME, expire_time=expire_timestamp, version_time=version_timestamp, encryption_config=encryption_config, ) backup_pb = Backup( database=self.DATABASE_NAME, expire_time=expire_timestamp, version_time=version_timestamp, ) future = backup.create() self.assertIs(future, op_future) expected_encryption_config = CreateBackupEncryptionConfig( **encryption_config) request = CreateBackupRequest( parent=self.INSTANCE_NAME, backup_id=self.BACKUP_ID, backup=backup_pb, encryption_config=expected_encryption_config, ) api.create_backup.assert_called_once_with( request=request, metadata=[("google-cloud-resource-prefix", backup.name)], )
def test_from_pb_success(self): from google.cloud.spanner_admin_database_v1 import Backup client = _Client() instance = _Instance(self.INSTANCE_NAME, client) backup_pb = Backup(name=self.BACKUP_NAME) backup_class = self._get_target_class() backup = backup_class.from_pb(backup_pb, instance) self.assertIsInstance(backup, backup_class) self.assertEqual(backup._instance, instance) self.assertEqual(backup.backup_id, self.BACKUP_ID) self.assertEqual(backup._database, "") self.assertIsNone(backup._expire_time)
def test_exists_success(self): from google.cloud.spanner_admin_database_v1 import Backup client = _Client() backup_pb = Backup(name=self.BACKUP_NAME) api = client.database_admin_api = self._make_database_admin_api() api.get_backup.return_value = backup_pb instance = _Instance(self.INSTANCE_NAME, client=client) backup = self._make_one(self.BACKUP_ID, instance) self.assertTrue(backup.exists()) api.get_backup.assert_called_once_with( name=self.BACKUP_NAME, metadata=[("google-cloud-resource-prefix", backup.name)], )
def test_update_expire_time_not_found(self): from google.api_core.exceptions import NotFound from google.cloud.spanner_admin_database_v1 import Backup client = _Client() api = client.database_admin_api = self._make_database_admin_api() api.update_backup.side_effect = NotFound("testing") instance = _Instance(self.INSTANCE_NAME, client=client) backup = self._make_one(self.BACKUP_ID, instance) expire_time = self._make_timestamp() with self.assertRaises(NotFound): backup.update_expire_time(expire_time) backup_update = Backup(name=self.BACKUP_NAME, expire_time=expire_time,) update_mask = {"paths": ["expire_time"]} api.update_backup.assert_called_once_with( backup=backup_update, update_mask=update_mask, metadata=[("google-cloud-resource-prefix", backup.name)], )