diff options
author | Zuul <zuul@review.opendev.org> | 2020-09-13 22:32:16 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2020-09-13 22:32:16 +0000 |
commit | 2cd5bb6f831f7bee44d698ecacaa7006b12f0ec0 (patch) | |
tree | 68f7025e7c2996f47743215debf9676b07cbe7e0 /trove | |
parent | e6feda698f64f894c8b63b6e93a106514fbeaebb (diff) | |
parent | f79bb53a39b137f5a836210707f3e351b177f6d0 (diff) | |
download | trove-2cd5bb6f831f7bee44d698ecacaa7006b12f0ec0.tar.gz |
Merge "Support getting backups of a specific project"
Diffstat (limited to 'trove')
-rw-r--r-- | trove/backup/models.py | 7 | ||||
-rw-r--r-- | trove/backup/service.py | 4 | ||||
-rw-r--r-- | trove/tests/unittests/backup/test_backup_controller.py | 66 |
3 files changed, 73 insertions, 4 deletions
diff --git a/trove/backup/models.py b/trove/backup/models.py index 95d8683f..10c58ad2 100644 --- a/trove/backup/models.py +++ b/trove/backup/models.py @@ -186,13 +186,16 @@ class Backup(object): return query.all(), marker @classmethod - def list(cls, context, datastore=None, instance_id=None, + def list(cls, context, datastore=None, instance_id=None, project_id=None, all_projects=False): query = DBBackup.query() filters = [DBBackup.deleted == 0] - if not all_projects: + if project_id: + filters.append(DBBackup.tenant_id == project_id) + elif not all_projects: filters.append(DBBackup.tenant_id == context.project_id) + if instance_id: filters.append(DBBackup.instance_id == instance_id) diff --git a/trove/backup/service.py b/trove/backup/service.py index 095ee9c9..ed783199 100644 --- a/trove/backup/service.py +++ b/trove/backup/service.py @@ -44,10 +44,11 @@ class BackupController(wsgi.Controller): LOG.debug("Listing backups for tenant %s", tenant_id) datastore = req.GET.get('datastore') instance_id = req.GET.get('instance_id') + project_id = req.GET.get('project_id') all_projects = strutils.bool_from_string(req.GET.get('all_projects')) context = req.environ[wsgi.CONTEXT_KEY] - if all_projects: + if project_id or all_projects: policy.authorize_on_tenant(context, 'backup:index:all_projects') else: policy.authorize_on_tenant(context, 'backup:index') @@ -56,6 +57,7 @@ class BackupController(wsgi.Controller): context, datastore=datastore, instance_id=instance_id, + project_id=project_id, all_projects=all_projects ) view = views.BackupViews(backups) diff --git a/trove/tests/unittests/backup/test_backup_controller.py b/trove/tests/unittests/backup/test_backup_controller.py index d1f73a4b..cf6a8802 100644 --- a/trove/tests/unittests/backup/test_backup_controller.py +++ b/trove/tests/unittests/backup/test_backup_controller.py @@ -13,20 +13,36 @@ # License for the specific language governing permissions and limitations # under the License. # +from unittest import mock +import uuid + import jsonschema from testtools.matchers import Equals + +from trove.backup import models +from trove.backup import state from trove.backup.service import BackupController from trove.common import apischema +from trove.common import context +from trove.common import wsgi from trove.tests.unittests import trove_testtools +from trove.tests.unittests.util import util class TestBackupController(trove_testtools.TestCase): - def setUp(self): super(TestBackupController, self).setUp() self.uuid = "d6338c9c-3cc8-4313-b98f-13cc0684cf15" self.invalid_uuid = "ead-edsa-e23-sdf-23" self.controller = BackupController() + self.context = context.TroveContext(project_id=str(uuid.uuid4())) + util.init_db() + + def tearDown(self): + super(TestBackupController, self).tearDown() + backups = models.DBBackup.find_all(tenant_id=self.context.project_id) + for backup in backups: + backup.delete() def test_validate_create_complete(self): body = {"backup": {"instance": self.uuid, @@ -87,3 +103,51 @@ class TestBackupController(trove_testtools.TestCase): self.assertThat(errors[0].message, Equals("'%s' does not match '%s'" % (self.invalid_uuid, apischema.uuid['pattern']))) + + def test_list_by_project(self): + req = mock.MagicMock(GET={'project_id': self.context.project_id}, + environ={wsgi.CONTEXT_KEY: self.context}, + url='http://localhost') + instance_id = str(uuid.uuid4()) + backup_name = str(uuid.uuid4()) + location = 'https://object-storage.com/tenant/database_backups/backup' + models.DBBackup.create(tenant_id=self.context.project_id, + name=backup_name, + state=state.BackupState.NEW, + instance_id=instance_id, + deleted=False, + size=2.0, + location=location) + + res = self.controller.index(req, 'fake_tenant_id') + + self.assertEqual(200, res.status) + backups = res.data(None)['backups'] + self.assertGreaterEqual(len(backups), 1) + our_backup = None + for backup in backups: + if backup['name'] == backup_name: + our_backup = backup + break + self.assertIsNotNone(our_backup) + expected = { + 'name': backup_name, + 'locationRef': location, + 'instance_id': instance_id, + 'size': 2.0, + 'status': 'NEW', + } + self.assertTrue( + set(expected.items()).issubset(set(our_backup.items())) + ) + + # Get backups of unknown project + req = mock.MagicMock(GET={'project_id': str(uuid.uuid4())}, + environ={wsgi.CONTEXT_KEY: self.context}, + url='http://localhost') + + res = self.controller.index(req, 'fake_tenant_id') + + self.assertEqual(200, res.status) + backups = res.data(None)['backups'] + self.assertEqual(0, len(backups)) |