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.
-
-
-
-
-
- |
- |
- Name |
- IP |
- Admin State |
- Status |
- |
-
-
-
-
-
-
- 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'] $}
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
- |
- Name |
- IP |
- Admin State |
- Status |
- |
-
-
-
-
-
-
- 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([]);
});
});
-
});
})();