Exemple #1
0
    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)
Exemple #2
0
    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,
            )
Exemple #3
0
    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)],
        )
Exemple #10
0
    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,
            )
Exemple #11
0
    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)
Exemple #12
0
    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)
Exemple #13
0
    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)
Exemple #14
0
    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)],
        )
Exemple #15
0
    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)
Exemple #16
0
    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)],
        )