Add API for getting Cinder Extensions
Adding API services for getting cinder extensions Change-Id: Ib4b757637b6f97349c92580f3bfaa89d4c61df67 Partially-Implements: blueprint cinder-extensions.service
This commit is contained in:
parent
1f29e5cd67
commit
20bacf9545
@ -73,3 +73,31 @@ class VolumeSnapshots(generic.View):
|
|||||||
search_opts=rest_utils.parse_filters_kwargs(request)[0]
|
search_opts=rest_utils.parse_filters_kwargs(request)[0]
|
||||||
)
|
)
|
||||||
return {'items': [u.to_dict() for u in result]}
|
return {'items': [u.to_dict() for u in result]}
|
||||||
|
|
||||||
|
|
||||||
|
@urls.register
|
||||||
|
class Extensions(generic.View):
|
||||||
|
"""API for cinder extensions.
|
||||||
|
"""
|
||||||
|
url_regex = r'cinder/extensions/$'
|
||||||
|
|
||||||
|
@rest_utils.ajax()
|
||||||
|
def get(self, request):
|
||||||
|
"""Get a list of extensions.
|
||||||
|
|
||||||
|
The listing result is an object with property "items". Each item is
|
||||||
|
an extension.
|
||||||
|
|
||||||
|
Example GET:
|
||||||
|
http://localhost/api/cinder/extensions
|
||||||
|
"""
|
||||||
|
result = api.cinder.list_extensions(request)
|
||||||
|
return {'items': [{
|
||||||
|
'alias': e.alias,
|
||||||
|
'description': e.description,
|
||||||
|
'links': e.links,
|
||||||
|
'name': e.name,
|
||||||
|
'namespace': e.namespace,
|
||||||
|
'updated': e.updated
|
||||||
|
|
||||||
|
} for e in result]}
|
||||||
|
@ -33,7 +33,8 @@
|
|||||||
function cinderAPI(apiService, toastService) {
|
function cinderAPI(apiService, toastService) {
|
||||||
var service = {
|
var service = {
|
||||||
getVolumes: getVolumes,
|
getVolumes: getVolumes,
|
||||||
getVolumeSnapshots: getVolumeSnapshots
|
getVolumeSnapshots: getVolumeSnapshots,
|
||||||
|
getExtensions: getExtensions
|
||||||
};
|
};
|
||||||
|
|
||||||
return service;
|
return service;
|
||||||
@ -92,5 +93,37 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cinder Extensions
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name horizon.app.core.openstack-service-api.cinder.getExtensions
|
||||||
|
* @description
|
||||||
|
* Returns a list of enabled extensions.
|
||||||
|
*
|
||||||
|
* The listing result is an object with property "items". Each item is
|
||||||
|
* an extension.
|
||||||
|
* @example
|
||||||
|
* The following is an example response:
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* "items": [
|
||||||
|
* {
|
||||||
|
* "alias": "NMN",
|
||||||
|
* "description": "Multiple network support.",
|
||||||
|
* "links": [],
|
||||||
|
* "name": "Multinic",
|
||||||
|
* "namespace": "http://docs.openstack.org/compute/ext/multinic/api/v1.1",
|
||||||
|
* "updated": "2011-06-09T00:00:00Z"
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
function getExtensions(config) {
|
||||||
|
return apiService.get('/api/cinder/extensions/', config)
|
||||||
|
.error(function () {
|
||||||
|
toastService.add('error', gettext('Unable to retrieve the extensions.'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}());
|
}());
|
||||||
|
@ -40,31 +40,47 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
var tests = [
|
var tests = [
|
||||||
{ func: 'getVolumes',
|
{
|
||||||
|
func: 'getVolumes',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
path: '/api/cinder/volumes/',
|
path: '/api/cinder/volumes/',
|
||||||
data: { params: 'config' },
|
data: { params: 'config' },
|
||||||
error: 'Unable to retrieve the volumes.',
|
error: 'Unable to retrieve the volumes.',
|
||||||
testInput: [ 'config' ] },
|
testInput: [ 'config' ]
|
||||||
|
},
|
||||||
{ func: 'getVolumes',
|
{
|
||||||
|
func: 'getVolumes',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
path: '/api/cinder/volumes/',
|
path: '/api/cinder/volumes/',
|
||||||
data: {},
|
data: {},
|
||||||
error: 'Unable to retrieve the volumes.' },
|
error: 'Unable to retrieve the volumes.'
|
||||||
|
},
|
||||||
{ func: 'getVolumeSnapshots',
|
{
|
||||||
|
'func': 'getExtensions',
|
||||||
|
'method': 'get',
|
||||||
|
'path': '/api/cinder/extensions/',
|
||||||
|
'data': 'config',
|
||||||
|
'error': 'Unable to retrieve the extensions.',
|
||||||
|
'testInput': [
|
||||||
|
'config'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func: 'getVolumeSnapshots',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
path: '/api/cinder/volumesnapshots/',
|
path: '/api/cinder/volumesnapshots/',
|
||||||
data: {},
|
data: {},
|
||||||
error: 'Unable to retrieve the volume snapshots.' },
|
error: 'Unable to retrieve the volume snapshots.'
|
||||||
|
},
|
||||||
{ func: 'getVolumeSnapshots',
|
{
|
||||||
|
func: 'getVolumeSnapshots',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
path: '/api/cinder/volumesnapshots/',
|
path: '/api/cinder/volumesnapshots/',
|
||||||
data: { params: 'config' },
|
data: { params: 'config' },
|
||||||
error: 'Unable to retrieve the volume snapshots.',
|
error: 'Unable to retrieve the volume snapshots.',
|
||||||
testInput: [ 'config' ] } ] ;
|
testInput: [ 'config' ]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
// Iterate through the defined tests and apply as Jasmine specs.
|
// Iterate through the defined tests and apply as Jasmine specs.
|
||||||
angular.forEach(tests, function(params) {
|
angular.forEach(tests, function(params) {
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
from openstack_dashboard.api.rest import cinder
|
from openstack_dashboard.api.rest import cinder
|
||||||
from openstack_dashboard.test import helpers as test
|
from openstack_dashboard.test import helpers as test
|
||||||
|
|
||||||
@ -77,3 +79,22 @@ class CinderRestTestCase(test.TestCase):
|
|||||||
{"items": [{"id": "one"}, {"id": "two"}]})
|
{"items": [{"id": "one"}, {"id": "two"}]})
|
||||||
cc.volume_snapshot_list.assert_called_once_with(request,
|
cc.volume_snapshot_list.assert_called_once_with(request,
|
||||||
search_opts=filters)
|
search_opts=filters)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Extensions
|
||||||
|
#
|
||||||
|
@mock.patch.object(cinder.api, 'cinder')
|
||||||
|
@mock.patch.object(settings,
|
||||||
|
'OPENSTACK_CINDER_EXTENSIONS_BLACKLIST', ['baz'])
|
||||||
|
def _test_extension_list(self, cc):
|
||||||
|
request = self.mock_rest_request()
|
||||||
|
cc.list_extensions.return_value = [
|
||||||
|
mock.Mock(**{'to_dict.return_value': {'name': 'foo'}}),
|
||||||
|
mock.Mock(**{'to_dict.return_value': {'name': 'bar'}}),
|
||||||
|
mock.Mock(**{'to_dict.return_value': {'name': 'baz'}}),
|
||||||
|
]
|
||||||
|
response = cinder.Extensions().get(request)
|
||||||
|
self.assertStatusCode(response, 200)
|
||||||
|
self.assertEqual(response.content,
|
||||||
|
'{"items": [{"name": "foo"}, {"name": "bar"}]}')
|
||||||
|
cc.list_extensions.assert_called_once_with(request)
|
||||||
|
Loading…
Reference in New Issue
Block a user