diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index a5fc979ca3..91c2a221d4 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -323,6 +323,11 @@ class ServersController(wsgi.Controller): context.can(server_policies.SERVERS % 'index:get_all_tenants') elevated = context.elevated() else: + # As explained in lp:#1185290, if `all_tenants` is not passed + # we must ignore the `tenant_id` search option. As explained + # in a above code comment, any change to this behavior would + # require a microversion bump. + search_opts.pop('tenant_id', None) if context.project_id: search_opts['project_id'] = context.project_id else: diff --git a/nova/tests/unit/api/openstack/compute/test_serversV21.py b/nova/tests/unit/api/openstack/compute/test_serversV21.py index 60f5001a79..65e4749f78 100644 --- a/nova/tests/unit/api/openstack/compute/test_serversV21.py +++ b/nova/tests/unit/api/openstack/compute/test_serversV21.py @@ -779,6 +779,7 @@ class ServersControllerTest(ControllerTest): def test_tenant_id_filter_no_admin_context(self): def fake_get_all(context, search_opts=None, **kwargs): self.assertIsNotNone(search_opts) + self.assertNotIn('tenant_id', search_opts) self.assertEqual(search_opts['project_id'], 'fake') return [fakes.stub_instance_obj(100)] @@ -788,6 +789,21 @@ class ServersControllerTest(ControllerTest): servers = self.controller.index(req)['servers'] self.assertEqual(len(servers), 1) + def test_tenant_id_filter_admin_context(self): + """"Test tenant_id search opt is dropped if all_tenants is not set.""" + def fake_get_all(context, search_opts=None, **kwargs): + self.assertIsNotNone(search_opts) + self.assertNotIn('tenant_id', search_opts) + self.assertEqual('fake', search_opts['project_id']) + return [fakes.stub_instance_obj(100)] + + req = self.req('/fake/servers?tenant_id=newfake', + use_admin_context=True) + with mock.patch.object(compute_api.API, 'get_all') as mock_get: + mock_get.side_effect = fake_get_all + servers = self.controller.index(req)['servers'] + self.assertEqual(len(servers), 1) + def test_all_tenants_param_normal(self): def fake_get_all(context, search_opts=None, **kwargs): self.assertNotIn('project_id', search_opts)