summaryrefslogtreecommitdiff
path: root/trove
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2021-07-13 09:42:00 +0000
committerGerrit Code Review <review@openstack.org>2021-07-13 09:42:00 +0000
commit437d594e86b3efd9a797ab4462681404b31b41e8 (patch)
tree233717ec550e093f92d27e7ef07c970647c3cef8 /trove
parentce8014eca92961bd9ca2ced297c1c21dce31e8a4 (diff)
parent24fc4a53dcf1140349e0ae32386046ff597e416b (diff)
downloadtrove-437d594e86b3efd9a797ab4462681404b31b41e8.tar.gz
Merge "Allow admin user to get instances attached with any configuration"
Diffstat (limited to 'trove')
-rw-r--r--trove/configuration/service.py24
-rw-r--r--trove/tests/unittests/configuration/test_service.py52
2 files changed, 68 insertions, 8 deletions
diff --git a/trove/configuration/service.py b/trove/configuration/service.py
index 7cd6576d..48f705a0 100644
--- a/trove/configuration/service.py
+++ b/trove/configuration/service.py
@@ -64,10 +64,15 @@ class ConfigurationsController(wsgi.Controller):
self.authorize_config_action(context, 'show', configuration)
configuration_items = models.Configuration.load_items(context, id)
+ find_instance = {
+ 'configuration_id': configuration.id,
+ 'deleted': False
+ }
+ if not context.is_admin:
+ find_instance['tenant_id'] = context.project_id
+
configuration.instance_count = instances_models.DBInstance.find_all(
- tenant_id=context.project_id,
- configuration_id=configuration.id,
- deleted=False).count()
+ **find_instance).count()
return wsgi.Result(views.DetailedConfigurationView(
configuration,
@@ -77,10 +82,15 @@ class ConfigurationsController(wsgi.Controller):
context = req.environ[wsgi.CONTEXT_KEY]
configuration = models.Configuration.load(context, id)
self.authorize_config_action(context, 'instances', configuration)
- instances = instances_models.DBInstance.find_all(
- tenant_id=context.tenant,
- configuration_id=configuration.id,
- deleted=False)
+
+ kwargs = {
+ 'configuration_id': configuration.id,
+ 'deleted': False
+ }
+ if not context.is_admin:
+ kwargs['tenant_id'] = context.tenant
+ instances = instances_models.DBInstance.find_all(**kwargs)
+
limit = int(context.limit or CONF.instances_page_size)
if limit > CONF.instances_page_size:
limit = CONF.instances_page_size
diff --git a/trove/tests/unittests/configuration/test_service.py b/trove/tests/unittests/configuration/test_service.py
index 55bd905c..6f0b0d08 100644
--- a/trove/tests/unittests/configuration/test_service.py
+++ b/trove/tests/unittests/configuration/test_service.py
@@ -18,6 +18,7 @@ from trove.common import wsgi
from trove.configuration import models as config_models
from trove.configuration import service
from trove.datastore import models as ds_models
+from trove.instance import models as ins_models
from trove.tests.unittests import trove_testtools
from trove.tests.unittests.util import util
@@ -62,9 +63,13 @@ class TestConfigurationsController(trove_testtools.TestCase):
def test_show(self):
req_mock = mock.MagicMock(
environ={
- wsgi.CONTEXT_KEY: mock.MagicMock(project_id=self.tenant_id)
+ wsgi.CONTEXT_KEY: mock.MagicMock(
+ project_id=self.tenant_id,
+ is_admin=False
+ )
}
)
+
result = self.controller.show(req_mock, self.tenant_id,
self.config_id)
data = result.data(None).get('configuration')
@@ -81,3 +86,48 @@ class TestConfigurationsController(trove_testtools.TestCase):
}
self.assertDictContains(data, expected)
+
+ def test_instances_admin(self):
+ """Admin user can get instances of specified config.
+
+ Even the instance belongs to other user.
+ """
+ admin_project_id = self.random_uuid()
+ req_mock = mock.MagicMock(
+ environ={
+ wsgi.CONTEXT_KEY: mock.MagicMock(
+ project_id=admin_project_id,
+ is_admin=True,
+ limit=None,
+ marker=None
+ )
+ }
+ )
+
+ # Create a config
+ config = config_models.Configuration.create(
+ self.random_name('configuration'),
+ '', self.tenant_id, None,
+ self.ds_version.id)
+
+ # Create an instance
+ ins_name = self.random_name('instance')
+ instance = ins_models.DBInstance.create(
+ name=ins_name,
+ flavor_id=self.random_uuid(),
+ tenant_id=self.tenant_id,
+ volume_size=1,
+ datastore_version_id=self.ds_version.id,
+ task_status=ins_models.InstanceTasks.NONE,
+ compute_instance_id=self.random_uuid(),
+ server_status='ACTIVE',
+ configuration_id=config.id
+ )
+
+ result = self.controller.instances(req_mock, admin_project_id,
+ config.id)
+
+ self.assertEqual(200, result.status)
+ instances = result.data(None)['instances']
+ self.assertEqual(1, len(instances))
+ self.assertEqual({'id': instance.id, 'name': ins_name}, instances[0])