diff options
author | Zuul <zuul@review.opendev.org> | 2021-07-13 09:42:00 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2021-07-13 09:42:00 +0000 |
commit | 437d594e86b3efd9a797ab4462681404b31b41e8 (patch) | |
tree | 233717ec550e093f92d27e7ef07c970647c3cef8 /trove | |
parent | ce8014eca92961bd9ca2ced297c1c21dce31e8a4 (diff) | |
parent | 24fc4a53dcf1140349e0ae32386046ff597e416b (diff) | |
download | trove-437d594e86b3efd9a797ab4462681404b31b41e8.tar.gz |
Merge "Allow admin user to get instances attached with any configuration"
Diffstat (limited to 'trove')
-rw-r--r-- | trove/configuration/service.py | 24 | ||||
-rw-r--r-- | trove/tests/unittests/configuration/test_service.py | 52 |
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]) |