diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/port-details.html b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/port-details.html new file mode 100644 index 0000000000..ae8d829973 --- /dev/null +++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/port-details.html @@ -0,0 +1,18 @@ +
+
+
ID
+
{$ item.id $}
+
Project ID
+
{$ item.tenant_id $}
+
Network ID
+
{$ item.network_id $}
+
Network
+
{$ item.network_name $}
+
VNIC type
+
{$ item['binding:vnic_type'] | decode:ctrl.vnicTypes $}
+
+
Host ID
+
{$ item['binding:host_id'] $}
+
+
+
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js index 1a4cc4dd0e..462a8573e4 100644 --- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js +++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js @@ -27,11 +27,12 @@ .controller('LaunchInstanceNetworkPortController', LaunchInstanceNetworkPortController); LaunchInstanceNetworkPortController.$inject = [ - '$scope', + 'horizon.dashboard.project.workflow.launch-instance.basePath', + 'launchInstanceModel', 'horizon.framework.widgets.action-list.button-tooltip.row-warning.service' ]; - function LaunchInstanceNetworkPortController($scope, tooltipService) { + function LaunchInstanceNetworkPortController(basePath, launchInstanceModel, tooltipService) { var ctrl = this; ctrl.portStatuses = { @@ -53,25 +54,96 @@ 'virtio-forwarder': gettext('Virtio Forwarder') }; + function getPortStatus(status) { + return ctrl.portStatuses[status]; + } + + function getPortAdminState(state) { + return ctrl.portAdminStates[state]; + } + + var portsArr = launchInstanceModel.ports; + ctrl.portsObj = {}; + ctrl.isPortsObjGenerated = false; + + function getNameOrID(id) { + ctrl.portsObj = ctrl.getPortsObj(portsArr); + var port = ctrl.portsObj[id]; + return ctrl.nameOrID(port); + } + + function getPortFixedIPs(id) { + var port = ctrl.portsObj[id]; + var fixedIPs = ''; + for (var ip in port.subnet_names) { + fixedIPs += ip + ' on subnet ' + port.subnet_names[ip] + '\n'; + } + return fixedIPs; + } + ctrl.tableDataMulti = { - available: $scope.model.ports, - allocated: $scope.model.newInstanceSpec.ports, - displayedAvailable: [], - displayedAllocated: [] + available: launchInstanceModel.ports, + allocated: launchInstanceModel.newInstanceSpec.ports }; + ctrl.availableTableConfig = { + selectAll: false, + trackId: 'id', + detailsTemplateUrl: basePath + 'networkports/port-details.html', + columns: [ + {id: 'id', title: gettext('Name'), priority: 1, filters: [getNameOrID]}, + {id: 'id', title: gettext('IP'), priority: 2, filters: [getPortFixedIPs]}, + {id: 'admin_state', title: gettext('Admin State'), priority: 2, + filters: [getPortAdminState]}, + {id: 'status', title: gettext('Status'), priority: 2, filters: [getPortStatus]} + ] + }; + + ctrl.allocatedTableConfig = angular.copy(ctrl.availableTableConfig); + + ctrl.tableHelpText = { + allocHelpText: gettext('Select ports from those listed below.'), + availHelpText: gettext('Select one or more ports') + }; + + ctrl.filterFacets = [{ + label: gettext('Name'), + name: 'name', + singleton: true + }, { + label: gettext('ID'), + name: 'id', + singleton: true + }, { + label: gettext('Admin State'), + name: 'admin_state', + singleton: true + }, { + label: gettext('Status'), + name: 'status', + singleton: true + }]; + ctrl.tableLimits = { maxAllocation: -1 }; - ctrl.tableHelpText = { - allocHelpText: gettext('Select ports from those listed below.') - }; - ctrl.tooltipModel = tooltipService; ctrl.nameOrID = function nameOrId(data) { return angular.isDefined(data.name) && data.name !== '' ? data.name : data.id; }; + + ctrl.getPortsObj = function (data) { + if (!ctrl.isPortsObjGenerated) { + var ports = data.reduce(function (acc, cur) { + acc[cur.id] = cur; + return acc; + }, {}); + ctrl.isPortsObjGenerated = true; + return ports; + } + else { return ctrl.portsObj; } + }; } })(); diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.html b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.html index a315416b56..9cce91105d 100644 --- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.html +++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.html @@ -3,160 +3,13 @@ Ports provide extra communication channels to your instances. You can select ports instead of networks or a mix of both.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameIPAdmin StateStatus
-
- Select an item from Available items below -
-
- - {$ $index + 1 $} - - - {$ ctrl.nameOrID(item) $} -
- - {$ address $} on subnet {$ subnet $} - -
-
{$ item.admin_state | decode:ctrl.portAdminStates $}{$ item.status | decode:ctrl.portStatuses $} - - - - - -
-
-
ID
-
{$ item.id $}
-
Project ID
-
{$ item.tenant_id $}
-
Network ID
-
{$ item.network_id $}
-
Network
-
{$ item.network_name $}
-
VNIC type
-
{$ item['binding:vnic_type'] | decode:ctrl.vnicTypes $}
-
-
Host ID
-
{$ item['binding:host_id'] $}
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
NameIPAdmin StateStatus
-
- No available items -
-
- - {$ ctrl.nameOrID(item) $} -
- - {$ address $} on subnet {$ subnet $} - -
-
{$ item.admin_state | decode:ctrl.portAdminStates $}{$ item.status | decode:ctrl.portStatuses $} - - - - - -
-
-
ID
-
{$ item.id $}
-
Project ID
-
{$ item.tenant_id $}
-
Network ID
-
{$ item.network_id $}
-
Network
-
{$ item.network_name $}
-
VNIC type
-
{$ item['binding:vnic_type'] | decode:ctrl.vnicTypes $}
-
-
Host ID
-
{$ item['binding:host_id'] $}
-
-
-
-
-
+ + + + diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js index 0e25313c2b..da5611aa18 100644 --- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js +++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js @@ -23,20 +23,19 @@ beforeEach(module('horizon.dashboard.project.workflow.launch-instance')); describe('LaunchInstanceNetworkPortController', function() { - var scope, ctrl; + var ctrl; + var port = {name: 'test_name', id: 'test_id'}; beforeEach(inject(function($controller) { - scope = { - model: { - newInstanceSpec: { - ports: ['port-a'] - }, - ports: ['port-a', 'port-b'] - } + var model = { + newInstanceSpec: { + ports: ['port-a'] + }, + ports: ['port-a', 'port-b'] }; - ctrl = $controller('LaunchInstanceNetworkPortController', { - $scope: scope - }); + + ctrl = $controller('LaunchInstanceNetworkPortController', + { launchInstanceModel: model }); })); it('has correct ports statuses', function() { @@ -63,25 +62,35 @@ expect(ctrl.tableHelpText.allocHelpText).toBeDefined(); }); - it('nameOrId return the name', function() { - var obj = {name: 'test_name', id: 'test_id'}; + it('nameOrID returns the name', function() { expect(ctrl.nameOrID).toBeDefined(); - expect(ctrl.nameOrID(obj)).toBe('test_name'); + expect(ctrl.nameOrID(port)).toBe('test_name'); }); - it('nameOrId return the id if the name is missing', function() { + it('nameOrID returns the id if the name is missing', function() { expect(ctrl.nameOrID).toBeDefined(); expect(ctrl.nameOrID({'id': 'testid'})).toBe('testid'); }); + it('getPortsObj returns generated ports object', function() { + expect(ctrl.getPortsObj).toBeDefined(); + expect(ctrl.isPortsObjGenerated).toBe(false); + expect(ctrl.getPortsObj([port])).toEqual({'test_id': port}); + expect(ctrl.isPortsObjGenerated).toBe(true); + }); + + it('getPortsObj returns existing ports object', function() { + ctrl.portsObj = {'test_id': port}; + ctrl.isPortsObjGenerated = true; + expect(ctrl.getPortsObj).toBeDefined(); + expect(ctrl.getPortsObj([port])).toEqual({'test_id': port}); + }); + it('uses scope to set table data', function() { expect(ctrl.tableDataMulti).toBeDefined(); expect(ctrl.tableDataMulti.available).toEqual(['port-a', 'port-b']); expect(ctrl.tableDataMulti.allocated).toEqual(['port-a']); - expect(ctrl.tableDataMulti.displayedAllocated).toEqual([]); - expect(ctrl.tableDataMulti.displayedAvailable).toEqual([]); }); }); - }); })();