diff --git a/horizon/static/horizon/js/angular/services/hz.api.glance.js b/horizon/static/horizon/js/angular/services/hz.api.glance.js index 66b0224c07..0c7076831d 100644 --- a/horizon/static/horizon/js/angular/services/hz.api.glance.js +++ b/horizon/static/horizon/js/angular/services/hz.api.glance.js @@ -103,6 +103,9 @@ limitations under the License. * @param {Object} params * Query parameters. Optional. * + * @param {string} params.resource_type + * Namespace resource type. + * * @param {boolean} params.paginate * True to paginate automatically. * @@ -134,20 +137,6 @@ limitations under the License. }); }; - /** - * @name hz.api.glanceAPI.getImages - * @description - * Get a specific namespace. - * - * http://docs.openstack.org/developer/glance/metadefs-concepts.html - */ - this.getNamespace = function(namespace) { - return apiService.get('/api/glance/metadefs/namespaces/' + namespace) - .error(function () { - horizon.alert('error', gettext('Unable to retrieve namespace.')); - }); - }; - } // Register it with the API module so that anybody using the diff --git a/openstack_dashboard/api/glance.py b/openstack_dashboard/api/glance.py index 5cd48a23e9..91fa8839f1 100644 --- a/openstack_dashboard/api/glance.py +++ b/openstack_dashboard/api/glance.py @@ -199,6 +199,7 @@ class Namespace(BaseGlanceMetadefAPIResourceWrapper): return False +@memoized def metadefs_namespace_get(request, namespace, resource_type=None, wrap=False): namespace = glanceclient(request, '2').\ metadefs_namespace.get(namespace, resource_type=resource_type) @@ -279,6 +280,18 @@ def metadefs_namespace_list(request, return namespaces, has_more_data, has_prev_data +def metadefs_namespace_full_list(request, resource_type, filters={}, + *args, **kwargs): + filters['resource_types'] = [resource_type] + namespaces, has_more_data, has_prev_data = metadefs_namespace_list( + request, filters, *args, **kwargs + ) + return [ + metadefs_namespace_get(request, x.namespace, resource_type) + for x in namespaces + ], has_more_data, has_prev_data + + def metadefs_namespace_create(request, namespace): return glanceclient(request, '2').metadefs_namespace.create(**namespace) diff --git a/openstack_dashboard/api/rest/glance.py b/openstack_dashboard/api/rest/glance.py index be6674eece..bf3d5c9538 100644 --- a/openstack_dashboard/api/rest/glance.py +++ b/openstack_dashboard/api/rest/glance.py @@ -15,6 +15,7 @@ """API for the glance service. """ +from itertools import izip from django.views import generic from openstack_dashboard import api @@ -22,7 +23,7 @@ from openstack_dashboard.api.rest import utils as rest_utils from openstack_dashboard.api.rest import urls -CLIENT_KEYWORDS = {'marker', 'sort_dir', 'sort_key', 'paginate'} +CLIENT_KEYWORDS = {'resource_type', 'marker', 'sort_dir', 'sort_key', 'paginate'} @urls.register @@ -88,26 +89,6 @@ class Images(generic.View): } -@urls.register -class MetadefsNamespace(generic.View): - """API for Glance Metadata Definitions. - - http://docs.openstack.org/developer/glance/metadefs-concepts.html - """ - url_regex = r'glance/metadefs/namespaces/(?P.+|default)$' - - @rest_utils.ajax() - def get(self, request, namespace): - """Get a specific metadata definition namespaces. - - Returns the namespace. GET params are passed through. - - Example GET: - http://localhost/api/glance/metadefs/namespaces/OS::Compute::Watchdog - """ - return api.glance.metadefs_namespace_get(request, namespace) - - @urls.register class MetadefsNamespaces(generic.View): """API for Single Glance Metadata Definitions. @@ -129,6 +110,9 @@ class MetadefsNamespaces(generic.View): The following get parameters may be passed in the GET request: + :param resource_type: Namespace resource type. + If specified returned namespace properties will have prefixes + proper for selected resource type. :param paginate: If true will perform pagination based on settings. :param marker: Specifies the namespace of the last-seen namespace. The typical pattern of limit and marker is to make an @@ -147,14 +131,11 @@ class MetadefsNamespaces(generic.View): filters. """ - filters, kwargs = rest_utils.parse_filters_kwargs(request, - CLIENT_KEYWORDS) + filters, kwargs = rest_utils.parse_filters_kwargs( + request, CLIENT_KEYWORDS + ) - namespaces, has_more, has_prev = api.glance.metadefs_namespace_list( - request, filters=filters, **kwargs) - - return { - 'items': [n.to_dict() for n in namespaces], - 'has_more_data': has_more, - 'has_prev_data': has_prev, - } + names = ('items', 'has_more_data', 'has_prev_data') + return dict(izip(names, api.glance.metadefs_namespace_full_list( + request, filters=filters, **kwargs + ))) diff --git a/openstack_dashboard/test/api_tests/glance_rest_tests.py b/openstack_dashboard/test/api_tests/glance_rest_tests.py index 0ba83386a9..b8e56b052c 100644 --- a/openstack_dashboard/test/api_tests/glance_rest_tests.py +++ b/openstack_dashboard/test/api_tests/glance_rest_tests.py @@ -56,19 +56,18 @@ class ImagesRestTestCase(test.TestCase): @mock.patch.object(glance.api, 'glance') def test_namespace_get_list(self, gc): request = self.mock_rest_request(**{'GET': {}}) - gc.metadefs_namespace_list.return_value = ([ - mock.Mock(**{'to_dict.return_value': {'namespace': '1'}}), - mock.Mock(**{'to_dict.return_value': {'namespace': '2'}}) - ], False, False) + gc.metadefs_namespace_full_list.return_value = ( + [{'namespace': '1'}, {'namespace': '2'}], False, False + ) response = glance.MetadefsNamespaces().get(request) self.assertStatusCode(response, 200) self.assertEqual(response.content, '{"items": [{"namespace": "1"}, {"namespace": "2"}]' ', "has_more_data": false, "has_prev_data": false}') - gc.metadefs_namespace_list.assert_called_once_with(request, - filters={}, - **{}) + gc.metadefs_namespace_full_list.assert_called_once_with( + request, filters={} + ) @mock.patch.object(glance.api, 'glance') def test_namespace_get_list_kwargs_and_filters(self, gc): @@ -81,28 +80,15 @@ class ImagesRestTestCase(test.TestCase): filters = {'resource_types': 'type'} request = self.mock_rest_request( **{'GET': dict(kwargs, **filters)}) - gc.metadefs_namespace_list.return_value = ([ - mock.Mock(**{'to_dict.return_value': {'namespace': '1'}}), - mock.Mock(**{'to_dict.return_value': {'namespace': '2'}}) - ], False, False) + gc.metadefs_namespace_full_list.return_value = ( + [{'namespace': '1'}, {'namespace': '2'}], False, False + ) response = glance.MetadefsNamespaces().get(request) self.assertStatusCode(response, 200) self.assertEqual(response.content, '{"items": [{"namespace": "1"}, {"namespace": "2"}]' ', "has_more_data": false, "has_prev_data": false}') - gc.metadefs_namespace_list.assert_called_once_with(request, - filters=filters, - **kwargs) - - @mock.patch.object(glance.api, 'glance') - def test_namespace_get_namespace(self, gc): - kwargs = {'resource_type': ['OS::Nova::Flavor']} - request = self.mock_rest_request(**{'GET': dict(kwargs)}) - gc.metadefs_namespace_get.return_value\ - .to_dict.return_value = {'namespace': '1'} - - response = glance.MetadefsNamespace().get(request, "1") - self.assertStatusCode(response, 200) - gc.metadefs_namespace_get.assert_called_once_with(request, - "1") + gc.metadefs_namespace_full_list.assert_called_once_with( + request, filters=filters, **kwargs + )