diff --git a/octavia_dashboard/api/rest/lbaasv2.py b/octavia_dashboard/api/rest/lbaasv2.py index c4444a01..a0c89b2f 100644 --- a/octavia_dashboard/api/rest/lbaasv2.py +++ b/octavia_dashboard/api/rest/lbaasv2.py @@ -126,29 +126,23 @@ def poll_loadbalancer_status(request, loadbalancer_id, callback, def create_loadbalancer(request): data = request.DATA - flavor_id = data['loadbalancer'].get('flavor_id') - conn = _get_sdk_connection(request) + build_kwargs = dict( + project_id=request.user.project_id, + vip_subnet_id=data['loadbalancer']['vip_subnet_id'], + name=data['loadbalancer'].get('name'), + description=data['loadbalancer'].get('description'), + vip_address=data['loadbalancer'].get('vip_address'), + admin_state_up=data['loadbalancer'].get('admin_state_up'), + ) + flavor_id = data['loadbalancer'].get('flavor_id') if flavor_id: - loadbalancer = conn.load_balancer.create_load_balancer( - project_id=request.user.project_id, - vip_subnet_id=data['loadbalancer']['vip_subnet_id'], - name=data['loadbalancer'].get('name'), - description=data['loadbalancer'].get('description'), - vip_address=data['loadbalancer'].get('vip_address'), - admin_state_up=data['loadbalancer'].get('admin_state_up'), - flavor_id=flavor_id - ) - else: - loadbalancer = conn.load_balancer.create_load_balancer( - project_id=request.user.project_id, - vip_subnet_id=data['loadbalancer']['vip_subnet_id'], - name=data['loadbalancer'].get('name'), - description=data['loadbalancer'].get('description'), - vip_address=data['loadbalancer'].get('vip_address'), - admin_state_up=data['loadbalancer'].get('admin_state_up'), - ) + build_kwargs['flavor_id'] = flavor_id + availability_zone = data['loadbalancer'].get('availability_zone') + if availability_zone: + build_kwargs['availability_zone'] = availability_zone + loadbalancer = conn.load_balancer.create_load_balancer(**build_kwargs) if data.get('listener'): # There is work underway to add a new API to LBaaS v2 that will # allow us to pass in all information at once. Until that is @@ -1396,3 +1390,24 @@ class FlavorProfile(generic.View): """ update_flavor_profile(request) + + +@urls.register +class AvailabilityZones(generic.View): + """API for load balancer availability zones. + + """ + url_regex = r'lbaas/availabilityzones/$' + + @rest_utils.ajax() + def get(self, request): + """List of availability zones for the current project. + + The listing result is an object with property "items". + """ + conn = _get_sdk_connection(request) + availability_zone_list = _sdk_object_to_list( + conn.load_balancer.availability_zones() + ) + + return {'items': availability_zone_list} diff --git a/octavia_dashboard/static/app/core/openstack-service-api/lbaasv2.service.js b/octavia_dashboard/static/app/core/openstack-service-api/lbaasv2.service.js index 390c71ef..71fdf63a 100644 --- a/octavia_dashboard/static/app/core/openstack-service-api/lbaasv2.service.js +++ b/octavia_dashboard/static/app/core/openstack-service-api/lbaasv2.service.js @@ -71,6 +71,7 @@ createHealthMonitor: createHealthMonitor, editHealthMonitor: editHealthMonitor, updateMemberList: updateMemberList, + getAvailabilityZones: getAvailabilityZones, getFlavors: getFlavors, getFlavor: getFlavor, deleteFlavor: deleteFlavor, @@ -895,5 +896,24 @@ }); } + // Availability Zones + + /** + * @name horizon.app.core.openstack-service-api.lbaasv2.getAvailabilityZones + * @description + * Get the list of availability zones. + * + * The listing result is an object with property "items". Each item is + * an availability zone. + */ + + function getAvailabilityZones() { + var params = {params: {}}; + return apiService.get('/api/lbaas/availabilityzones/', params) + .error(function () { + toastService.add('error', gettext('Unable to retrieve availability zones.')); + }); + } + } }()); diff --git a/octavia_dashboard/static/app/core/openstack-service-api/lbaasv2.service.spec.js b/octavia_dashboard/static/app/core/openstack-service-api/lbaasv2.service.spec.js index fd9d826f..64d6d066 100644 --- a/octavia_dashboard/static/app/core/openstack-service-api/lbaasv2.service.spec.js +++ b/octavia_dashboard/static/app/core/openstack-service-api/lbaasv2.service.spec.js @@ -329,6 +329,14 @@ error: 'Unable to delete flavor profile.', testInput: [ '1234' ] }, + { + func: 'getAvailabilityZones', + method: 'get', + path: '/api/lbaas/availabilityzones/', + error: 'Unable to retrieve availability zones.', + testInput: [], + data: { params: {} } + }, { func: 'createLoadBalancer', method: 'post', diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/loadbalancers/details/detail.html b/octavia_dashboard/static/dashboard/project/lbaasv2/loadbalancers/details/detail.html index 415d84c1..935d89b0 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/loadbalancers/details/detail.html +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/loadbalancers/details/detail.html @@ -12,6 +12,10 @@ IP Address {$ ::ctrl.loadbalancer.vip_address $} +