summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingxian Kong <anlin.kong@gmail.com>2021-07-12 10:41:21 +1200
committerLingxian Kong <anlin.kong@gmail.com>2021-07-13 16:04:14 +1200
commit24fc4a53dcf1140349e0ae32386046ff597e416b (patch)
treea118e3a6ee99299b7efe52f37147e954545ce699
parent7b4631181752be749092add04d5f0ecd57057c73 (diff)
downloadtrove-24fc4a53dcf1140349e0ae32386046ff597e416b.tar.gz
Allow admin user to get instances attached with any configuration
Change-Id: I5e5f0b99f79ba78c82cbb12482b9167ec69e50f7
-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])