diff --git a/src/sunstone/public/app/tabs/clusters-tab/datatable.js b/src/sunstone/public/app/tabs/clusters-tab/datatable.js index 892cf91b6b..a3a6bc5eeb 100644 --- a/src/sunstone/public/app/tabs/clusters-tab/datatable.js +++ b/src/sunstone/public/app/tabs/clusters-tab/datatable.js @@ -32,8 +32,15 @@ define(function(require) { var RESOURCE = "Cluster"; var XML_ROOT = "CLUSTER"; var TAB_NAME = require('./tabId'); - var LABELS_COLUMN = 6; var TEMPLATE_ATTR = 'TEMPLATE'; + var COLUMNS = { + ID: 1, + NAME: 2, + HOSTS: 3, + VNETS: 4, + DATASTORES: 5, + LABELS: 6 + } /* CONSTRUCTOR @@ -45,7 +52,7 @@ define(function(require) { this.dataTableId = dataTableId; this.resource = RESOURCE; this.xmlRoot = XML_ROOT; - this.labelsColumn = LABELS_COLUMN; + this.labelsColumn = COLUMNS.LABELS; this.dataTableOptions = { "bAutoWidth": false, @@ -88,7 +95,7 @@ define(function(require) { Table.prototype.elementArray = _elementArray; Table.prototype.preUpdateView = _preUpdateView; Table.prototype.postUpdateView = _postUpdateView; - Table.prototype.isOpenNebulaResourceInCluster = _isOpenNebulaResourceInCluster; + Table.prototype.columnsIndex = COLUMNS; return Table; @@ -130,26 +137,4 @@ define(function(require) { function _postUpdateView() { $(".total_clusters").text(this.totalClusters); } - - /** - * Checks that a OpenNebula resource is in the selected clusters. - * - * @param {object} resource - OpenNebula resource: Datastore, VM, etc - * @param {function(object):string|string[]} [fnGetResourceCluster] - * - Function to get Clusters ids from resource - * @returns `true` if selected Clusters contain the resource - */ - function _isOpenNebulaResourceInCluster(resource, fnGetResourceCluster) { - var clusters = typeof fnGetResourceCluster === 'function' - ? fnGetResourceCluster(resource) - : resource.CLUSTERS.ID - - var ensuredClusters = Array.isArray(clusters) ? clusters : [clusters]; - var selectedClusterIds = this.retrieveResourceTableSelect(); - - return selectedClusterIds.length === 0 || - ensuredClusters.some(function (cluster) { - return selectedClusterIds.includes(cluster) - }); - } }); diff --git a/src/sunstone/public/app/tabs/hosts-tab/datatable.js b/src/sunstone/public/app/tabs/hosts-tab/datatable.js index e5ccd8bb92..fc951a69ec 100644 --- a/src/sunstone/public/app/tabs/hosts-tab/datatable.js +++ b/src/sunstone/public/app/tabs/hosts-tab/datatable.js @@ -46,9 +46,20 @@ define(function(require) { var RESOURCE = "Host"; var XML_ROOT = "HOST"; var TAB_NAME = require("./tabId"); - var LABELS_COLUMN = 10; - var SEARCH_COLUMN = 11; var TEMPLATE_ATTR = "TEMPLATE"; + var COLUMNS = { + ID: 1, + NAME: 2, + CLUSTER: 3, + RVMS: 4, + ALLOCATED_CPU: 5, + ALLOCATED_MEM: 6, + STATUS: 7, + IM_MAD: 8, + VM_MAD: 9, + LABELS: 10, + SEARCH: 10, + } /* CONSTRUCTOR @@ -60,7 +71,7 @@ define(function(require) { this.dataTableId = dataTableId; this.resource = RESOURCE; this.xmlRoot = XML_ROOT; - this.labelsColumn = LABELS_COLUMN; + this.labelsColumn = COLUMNS.LABELS; this.dataTableOptions = { "bAutoWidth": false, @@ -109,7 +120,7 @@ define(function(require) { this.allocatedMemory = 0; this.conf.searchDropdownHTML = SearchDropdown({tableId: this.dataTableId}); - this.searchColumn = SEARCH_COLUMN; + this.searchColumn = COLUMNS.SEARCH; TabDataTable.call(this); }; @@ -119,7 +130,7 @@ define(function(require) { Table.prototype.elementArray = _elementArray; Table.prototype.preUpdateView = _preUpdateView; Table.prototype.postUpdateView = _postUpdateView; - Table.prototype.isOpenNebulaResourceInHost = _isOpenNebulaResourceInHost; + Table.prototype.columnsIndex = COLUMNS; return Table; @@ -289,32 +300,4 @@ define(function(require) { "" + ""; } - - /** - * Checks that a OpenNebula resource is in the selected hosts. - * - * @param {object} resource - OpenNebula resource: Datastore, VM, etc - * @param {function(object):string|string[]} [fnGetResourceCluster] - * - Function to get Clusters ids from resource - * @returns `true` if selected Hosts and the resource are in same cluster - */ - function _isOpenNebulaResourceInHost(resource, fnGetResourceCluster) { - var clusters = typeof fnGetResourceCluster === 'function' - ? fnGetResourceCluster(resource) - : resource.CLUSTERS.ID - - var ensuredClusters = Array.isArray(clusters) ? clusters : [clusters]; - var selectedHostIds = this.retrieveResourceTableSelect(); - var allHosts = this.dataTable.fnGetData(); - var id_index = this.selectOptions.id_index; - - var selectedClusters = !Array.isArray(allHosts) ? [] : allHosts - .filter(function(host) { return selectedHostIds.includes(host[id_index]) }) - .map(function(host) { return host[3] }); // cluster column => 3 - - return selectedClusters.length === 0 || - ensuredClusters.some(function (cluster) { - return selectedClusters.includes(cluster) - }); - } }); diff --git a/src/sunstone/public/app/tabs/templates-tab/form-panels/create-common.js b/src/sunstone/public/app/tabs/templates-tab/form-panels/create-common.js index 1fa615cc9e..da13386967 100644 --- a/src/sunstone/public/app/tabs/templates-tab/form-panels/create-common.js +++ b/src/sunstone/public/app/tabs/templates-tab/form-panels/create-common.js @@ -39,24 +39,39 @@ define(function(require) { CONSTANTS */ + var general = require("./create/wizard-tabs/general") + var storage = require("./create/wizard-tabs/storage") + var network = require("./create/wizard-tabs/network") + var os = require("./create/wizard-tabs/os") + var io = require("./create/wizard-tabs/io") + var actions = require("./create/wizard-tabs/actions") + var context = require("./create/wizard-tabs/context") + var scheduling = require("./create/wizard-tabs/scheduling") + var hybrid = require("./create/wizard-tabs/hybrid") + var vmgroup = require("./create/wizard-tabs/vmgroup") + var other = require("./create/wizard-tabs/other") + var numa = require("./create/wizard-tabs/numa") + var WIZARD_TABS = [ - require("./create/wizard-tabs/general"), - require("./create/wizard-tabs/storage"), - require("./create/wizard-tabs/network"), - require("./create/wizard-tabs/os"), - require("./create/wizard-tabs/io"), - require("./create/wizard-tabs/actions"), - require("./create/wizard-tabs/context"), - require("./create/wizard-tabs/scheduling"), - require("./create/wizard-tabs/hybrid"), - require("./create/wizard-tabs/vmgroup"), - require("./create/wizard-tabs/other"), - require("./create/wizard-tabs/numa") + general, + storage, + network, + os, + io, + actions, + context, + scheduling, + hybrid, + vmgroup, + other, + numa ]; var TEMPLATES_TAB_ID = require("tabs/templates-tab/tabId"); var VROUTER_TEMPLATES_TAB_ID = require("tabs/vrouter-templates-tab/tabId"); + var in_progress = false + /* CONSTRUCTOR */ @@ -145,9 +160,17 @@ define(function(require) { } function _setup(context) { - $.each(this.wizardTabs, function(index, wizardTab) { - wizardTab.setup($("#" + wizardTab.wizardTabId, context)); - }); + $.each( + [].concat(this.wizardTabs).sort(function(a, b) { + var setupOrderA = a.setupOrder === undefined ? -1 : a.setupOrder + var setupOrderB = b.setupOrder === undefined ? -1 : b.setupOrder + + return setupOrderB - setupOrderA + }), + function(index, wizardTab) { + wizardTab.setup($("#" + wizardTab.wizardTabId, context)); + } + ); Foundation.reflow(context, "tabs"); Tips.setup(context); @@ -402,7 +425,16 @@ define(function(require) { this.notify(); } - var in_progress = false; + function insertAt(array, index, element) { + array.splice(index, 0, element); + } + + function insertAt2(array, index, element) { + return array + .slice(0, index) + .concat(element) + .concat(array.slice(index)); + } function _notify() { var that = this; diff --git a/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/network.js b/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/network.js index 9961a103b7..20f3f7d775 100644 --- a/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/network.js +++ b/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/network.js @@ -106,6 +106,8 @@ define(function(require) { return false; }); + that.addNicTab(context); + if(that.listener != undefined){ $(context).on("change", "input", function(){ that.listener.notify(); @@ -194,19 +196,17 @@ define(function(require) { }); } - nics.length === 0 - ? that.addNicTab(context) - : $.each(nics, function(nicId, nicJSON) { - that.addNicTab(context); + $.each(nics, function(nicId, nicJSON) { + nicId > 0 && that.addNicTab(context); - var nicTab = that.nicTabObjects[that.numberOfNics]; - var nicContext = $('#' + nicTab.nicTabId, context); - nicTab.fill(nicContext, nicJSON); + var nicTab = that.nicTabObjects[that.numberOfNics]; + var nicContext = $('#' + nicTab.nicTabId, context); + nicTab.fill(nicContext, nicJSON); - if (nicJSON.PARENT) { - nicTab.fill_alias(nicJSON.PARENT, nicJSON.EXTERNAL); - } - }); + if (nicJSON.PARENT) { + nicTab.fill_alias(nicJSON.PARENT, nicJSON.EXTERNAL); + } + }); that.renameTabLinks(context); that.enableRDP(context); diff --git a/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/network/nic-tab.js b/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/network/nic-tab.js index 72b628a854..d8f23fb8d2 100644 --- a/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/network/nic-tab.js +++ b/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/network/nic-tab.js @@ -121,23 +121,37 @@ define(function(require) { $(".only_create", context).hide(); } + var isInHostOrClusterTable = function(vnet){ + if (!options.hostsTable || !options.clustersTable) return true; + + var clusters = vnet.CLUSTERS.ID; + var ensuredClusters = Array.isArray(clusters) ? clusters : [clusters]; + + var hostClusterIndex = options.hostsTable.columnsIndex.CLUSTER + var hostClustersIds = options.hostsTable.getColumnDataInSelectedRows(hostClusterIndex) + var clustersIds = options.clustersTable.getColumnDataInSelectedRows() + + return ( + (hostClustersIds.length === 0 && clustersIds.length === 0) || + hostClustersIds + .concat(clustersIds) + .some(function(id) { return ensuredClusters.includes(id) }) + ) + } + that.vnetsTable.initialize({ 'selectOptions': { filter_fn: function(vnet) { - if (!options.hostsTable || !options.clustersTable) return true; + const filterResource = isInHostOrClusterTable(vnet) - var inHostOrCluster = $("input[name='req_select']:checked").val() === "host_select" - ? options.hostsTable.isOpenNebulaResourceInHost(vnet) - : options.clustersTable.isOpenNebulaResourceInCluster(vnet) - - if (!inHostOrCluster && $('#NETWORK', context).val() === vnet.NAME) { + if (!filterResource && $('#NETWORK', context).val() === vnet.NAME) { that.secgroupsTable.selectResourceTableSelect({ ids: [] }); $.each(['NETWORK_ID', 'NETWORK', 'NETWORK_UNAME', 'NETWORK_UID'], function() { $('#' + this, context).val(''); }) } - return inHostOrCluster + return filterResource }, select_callback: function(aData, options) { // If the net is selected by Id, avoid overwriting it with name+uname @@ -177,11 +191,7 @@ define(function(require) { that.vnetsTableAuto.initialize({ selectOptions: { filter_fn: function(vnet) { - if (!options.hostsTable || !options.clustersTable) return true; - - return $("input[name='req_select']:checked").val() === "host_select" - ? options.hostsTable.isOpenNebulaResourceInHost(vnet) - : options.clustersTable.isOpenNebulaResourceInCluster(vnet) + return isInHostOrClusterTable(vnet) }, select_callback: function(aData, options) { that.generateRequirements(context) diff --git a/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/scheduling.js b/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/scheduling.js index d705ceb15f..048c6a46bf 100644 --- a/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/scheduling.js +++ b/src/sunstone/public/app/tabs/templates-tab/form-panels/create/wizard-tabs/scheduling.js @@ -69,6 +69,7 @@ define(function(require) { WizardTab.prototype.constructor = WizardTab; WizardTab.prototype.html = _html; WizardTab.prototype.setup = _setup; + WizardTab.prototype.setupOrder = 1; WizardTab.prototype.onShow = _onShow; WizardTab.prototype.retrieve = _retrieve; WizardTab.prototype.fill = _fill; @@ -143,9 +144,19 @@ define(function(require) { filter_fn: function(ds) { if (!that.hostsTable || !that.clustersTable) return true; - return $("input[name='req_select']:checked").val() === "host_select" - ? that.hostsTable.isOpenNebulaResourceInHost(ds) - : that.clustersTable.isOpenNebulaResourceInCluster(ds) + var clusters = ds.CLUSTERS.ID; + var ensuredClusters = Array.isArray(clusters) ? clusters : [clusters]; + + var hostClusterIndex = that.hostsTable.columnsIndex.CLUSTER + var hostClustersIds = that.hostsTable.getColumnDataInSelectedRows(hostClusterIndex) + var clustersIds = that.clustersTable.getColumnDataInSelectedRows() + + return ( + (hostClustersIds.length === 0 && clustersIds.length === 0) || + hostClustersIds + .concat(clustersIds) + .some(function(id) { return ensuredClusters.includes(id) }) + ) } }) }); @@ -184,18 +195,11 @@ define(function(require) { clusters.push(match[1]) } - var selectedResources = { - ids : hosts - } + this.hostsTable.selectResourceTableSelect({ ids: hosts }); + this.clustersTable.selectResourceTableSelect({ ids: clusters }); - this.hostsTable.selectResourceTableSelect(selectedResources); - - - var selectedResources = { - ids : clusters - } - - this.clustersTable.selectResourceTableSelect(selectedResources); + this.datastoresTable.updateFn(); + this.datastoresTable.deselectHiddenResources(); } var dsReqJSON = templateJSON['SCHED_DS_REQUIREMENTS']; diff --git a/src/sunstone/public/app/tabs/templates-tab/form-panels/instantiate.js b/src/sunstone/public/app/tabs/templates-tab/form-panels/instantiate.js index 2098969f92..ad628082c9 100644 --- a/src/sunstone/public/app/tabs/templates-tab/form-panels/instantiate.js +++ b/src/sunstone/public/app/tabs/templates-tab/form-panels/instantiate.js @@ -530,7 +530,15 @@ define(function(require) { filter_fn: function(ds) { if (!that.hostsTable.dataTable) return true; - return that.hostsTable.isOpenNebulaResourceInHost(ds) + var clusters = ds.CLUSTERS.ID; + var ensuredClusters = Array.isArray(clusters) ? clusters : [clusters]; + var hostClusterIndex = that.hostsTable.columnsIndex.CLUSTER + var hostClustersIds = that.hostsTable.getColumnDataInSelectedRows(hostClusterIndex) + + return hostClustersIds.length === 0 || + hostClustersIds.some(function(id) { + return ensuredClusters.includes(id) + }) }, select_callback: function(aData, options) { var hostTable = $(".provision_host_selector" + template_json.VMTEMPLATE.ID, context).data("hostsTable"); diff --git a/src/sunstone/public/app/utils/nics-section.js b/src/sunstone/public/app/utils/nics-section.js index 5c692a18b0..1bb67c057b 100644 --- a/src/sunstone/public/app/utils/nics-section.js +++ b/src/sunstone/public/app/utils/nics-section.js @@ -345,7 +345,15 @@ define(function(require) { filter_fn: function(vnet) { if (!options.hostsTable) return true; - return options.hostsTable.isOpenNebulaResourceInHost(vnet) + var clusters = vnet.CLUSTERS.ID; + var ensuredClusters = Array.isArray(clusters) ? clusters : [clusters]; + var hostClusterIndex = options.hostsTable.columnsIndex.CLUSTER + var hostClustersIds = options.hostsTable.getColumnDataInSelectedRows(hostClusterIndex) + + return hostClustersIds.length === 0 || + hostClustersIds.some(function(id) { + return ensuredClusters.includes(id) + }) }, "select_callback": function(aData, options) { var req_string=[]; @@ -585,7 +593,15 @@ define(function(require) { filter_fn: function(vnet) { if (!options.hostsTable) return true; - return options.hostsTable.isOpenNebulaResourceInHost(vnet) + var clusters = vnet.CLUSTERS.ID; + var ensuredClusters = Array.isArray(clusters) ? clusters : [clusters]; + var hostClusterIndex = options.hostsTable.columnsIndex.CLUSTER + var hostClustersIds = options.hostsTable.getColumnDataInSelectedRows(hostClusterIndex) + + return hostClustersIds.length === 0 || + hostClustersIds.some(function(id) { + return ensuredClusters.includes(id) + }) }, } }); diff --git a/src/sunstone/public/app/utils/tab-datatable.js b/src/sunstone/public/app/utils/tab-datatable.js index 1c78d8cf2d..6272d04dee 100644 --- a/src/sunstone/public/app/utils/tab-datatable.js +++ b/src/sunstone/public/app/utils/tab-datatable.js @@ -170,6 +170,7 @@ define(function(require) { "clearLabelsFilter": _clearLabelsFilter, "getLabelsFilter": _getLabelsFilter, "deselectHiddenResources": _deselectHiddenResources, + "getColumnDataInSelectedRows": _getColumnDataInSelectedRows, }; return TabDatatable; @@ -1276,4 +1277,22 @@ define(function(require) { return ids } + + /** + * Returns the selected data from a column by index. + * + * @param {number} columnIndex - Column index + * @returns {any[]} List of column data + */ + function _getColumnDataInSelectedRows(columnIndex) { + var selectedRowIds = this.retrieveResourceTableSelect(); + var allRows = this.dataTable.fnGetData(); + var id_index = this.selectOptions.id_index; + + var columnData = !Array.isArray(allRows) ? [] : allRows + .filter(function(row) { return selectedRowIds.includes(row[id_index]) }) + .map(function(row) { return row[(columnIndex || id_index)] }); + + return columnData; + } });