diff --git a/doc/api_samples/versions/versions-get-resp.json b/doc/api_samples/versions/versions-get-resp.json index 97d5f8cf3a2e..e20a39d5c488 100644 --- a/doc/api_samples/versions/versions-get-resp.json +++ b/doc/api_samples/versions/versions-get-resp.json @@ -22,7 +22,7 @@ } ], "status": "CURRENT", - "version": "2.4", + "version": "2.5", "min_version": "2.1", "updated": "2013-07-23T11:33:21Z" } diff --git a/nova/api/openstack/api_version_request.py b/nova/api/openstack/api_version_request.py index 8868980bf2a5..a5e7369c4e70 100644 --- a/nova/api/openstack/api_version_request.py +++ b/nova/api/openstack/api_version_request.py @@ -43,6 +43,7 @@ REST_API_VERSION_HISTORY = """REST API Version History: * 2.3 - Exposes additional os-extended-server-attributes Exposes delete_on_termination for os-extended-volumes * 2.4 - Exposes reserved field in os-fixed-ips. + * 2.5 - Allow server search option ip6 for non-admin """ # The minimum and maximum versions of the API supported @@ -51,7 +52,7 @@ REST_API_VERSION_HISTORY = """REST API Version History: # Note(cyeoh): This only applies for the v2.1 API once microversions # support is fully merged. It does not affect the V2 API. _MIN_API_VERSION = "2.1" -_MAX_API_VERSION = "2.4" +_MAX_API_VERSION = "2.5" DEFAULT_API_VERSION = _MIN_API_VERSION diff --git a/nova/api/openstack/compute/plugins/v3/servers.py b/nova/api/openstack/compute/plugins/v3/servers.py index 60384d743147..0fba3c860034 100644 --- a/nova/api/openstack/compute/plugins/v3/servers.py +++ b/nova/api/openstack/compute/plugins/v3/servers.py @@ -28,6 +28,7 @@ import stevedore import webob from webob import exc +from nova.api.openstack import api_version_request from nova.api.openstack import common from nova.api.openstack.compute.schemas.v3 import servers as schema_servers from nova.api.openstack.compute.views import servers as views_servers @@ -273,7 +274,7 @@ class ServersController(wsgi.Controller): context = req.environ['nova.context'] remove_invalid_options(context, search_opts, - self._get_server_search_options()) + self._get_server_search_options(req)) # Verify search by 'status' contains a valid status. # Convert it to filter by vm_state or task_state for compute_api. @@ -1077,10 +1078,14 @@ class ServersController(wsgi.Controller): password = utils.generate_password() return password - def _get_server_search_options(self): + def _get_server_search_options(self, req): """Return server search options allowed by non-admin.""" - return ('reservation_id', 'name', 'status', 'image', 'flavor', - 'ip', 'changes-since', 'all_tenants') + opt_list = ('reservation_id', 'name', 'status', 'image', 'flavor', + 'ip', 'changes-since', 'all_tenants') + req_ver = req.api_version_request + if req_ver > api_version_request.APIVersionRequest("2.4"): + opt_list += ('ip6',) + return opt_list def _get_instance(self, context, instance_uuid): try: diff --git a/nova/api/openstack/rest_api_version_history.rst b/nova/api/openstack/rest_api_version_history.rst index 7cd5cf3af226..916839edc575 100644 --- a/nova/api/openstack/rest_api_version_history.rst +++ b/nova/api/openstack/rest_api_version_history.rst @@ -56,3 +56,11 @@ user documentation. Show the ``reserved`` status on a ``FixedIP`` object in the ``os-fixed-ips`` API extension. The extension allows one to ``reserve`` and ``unreserve`` a fixed IP but the show method does not report the current status. + +2.5 +--- + + Before version 2.5, the command ``nova list --ip6 xxx`` returns all servers + for non-admins, as the filter option is silently discarded. There is no + reason to treat ip6 different from ip, though, so we just add this + option to the allowed list. diff --git a/nova/tests/functional/api_samples/versions/versions-get-resp.json.tpl b/nova/tests/functional/api_samples/versions/versions-get-resp.json.tpl index 97d5f8cf3a2e..e20a39d5c488 100644 --- a/nova/tests/functional/api_samples/versions/versions-get-resp.json.tpl +++ b/nova/tests/functional/api_samples/versions/versions-get-resp.json.tpl @@ -22,7 +22,7 @@ } ], "status": "CURRENT", - "version": "2.4", + "version": "2.5", "min_version": "2.1", "updated": "2013-07-23T11:33:21Z" } diff --git a/nova/tests/unit/api/openstack/compute/plugins/v3/test_servers.py b/nova/tests/unit/api/openstack/compute/plugins/v3/test_servers.py index 1e42f569e8d1..ed3d97ea7dbb 100644 --- a/nova/tests/unit/api/openstack/compute/plugins/v3/test_servers.py +++ b/nova/tests/unit/api/openstack/compute/plugins/v3/test_servers.py @@ -32,6 +32,7 @@ import six.moves.urllib.parse as urlparse import testtools import webob +from nova.api.openstack import api_version_request from nova.api.openstack import common from nova.api.openstack import compute from nova.api.openstack.compute import plugins @@ -1243,6 +1244,31 @@ class ServersControllerTest(ControllerTest): self.assertEqual(len(servers), 1) self.assertEqual(servers[0]['id'], server_uuid) + def test_get_servers_allows_ip6_with_new_version(self): + """Test getting servers by ip6 with new version requested + and no admin context + """ + server_uuid = str(uuid.uuid4()) + + def fake_get_all(compute_self, context, search_opts=None, + limit=None, marker=None, want_objects=False, + expected_attrs=None, sort_keys=None, sort_dirs=None): + self.assertIsNotNone(search_opts) + self.assertIn('ip6', search_opts) + self.assertEqual(search_opts['ip6'], 'ffff.*') + db_list = [fakes.stub_instance(100, uuid=server_uuid)] + return instance_obj._make_instance_list( + context, objects.InstanceList(), db_list, FIELDS) + + self.stubs.Set(compute_api.API, 'get_all', fake_get_all) + + req = fakes.HTTPRequestV3.blank('/servers?ip6=ffff.*') + req.api_version_request = api_version_request.APIVersionRequest('2.5') + servers = self.controller.index(req)['servers'] + + self.assertEqual(len(servers), 1) + self.assertEqual(servers[0]['id'], server_uuid) + def test_get_all_server_details(self): expected_flavor = { "id": "1", diff --git a/nova/tests/unit/api/openstack/compute/test_versions.py b/nova/tests/unit/api/openstack/compute/test_versions.py index 246acbc0384e..2b1e7a99f5c1 100644 --- a/nova/tests/unit/api/openstack/compute/test_versions.py +++ b/nova/tests/unit/api/openstack/compute/test_versions.py @@ -65,7 +65,7 @@ EXP_VERSIONS = { "v2.1": { "id": "v2.1", "status": "CURRENT", - "version": "2.4", + "version": "2.5", "min_version": "2.1", "updated": "2013-07-23T11:33:21Z", "links": [ @@ -114,7 +114,7 @@ class VersionsTestV20(test.NoDBTestCase): { "id": "v2.1", "status": "CURRENT", - "version": "2.4", + "version": "2.5", "min_version": "2.1", "updated": "2013-07-23T11:33:21Z", "links": [