summaryrefslogtreecommitdiff
path: root/trove
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-09-13 22:32:16 +0000
committerGerrit Code Review <review@openstack.org>2020-09-13 22:32:16 +0000
commit2cd5bb6f831f7bee44d698ecacaa7006b12f0ec0 (patch)
tree68f7025e7c2996f47743215debf9676b07cbe7e0 /trove
parente6feda698f64f894c8b63b6e93a106514fbeaebb (diff)
parentf79bb53a39b137f5a836210707f3e351b177f6d0 (diff)
downloadtrove-2cd5bb6f831f7bee44d698ecacaa7006b12f0ec0.tar.gz
Merge "Support getting backups of a specific project"
Diffstat (limited to 'trove')
-rw-r--r--trove/backup/models.py7
-rw-r--r--trove/backup/service.py4
-rw-r--r--trove/tests/unittests/backup/test_backup_controller.py66
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))