diff --git a/src/sunstone/public/app/opennebula/vm.js b/src/sunstone/public/app/opennebula/vm.js index 7ce8c67daa..dd1c90d8d0 100644 --- a/src/sunstone/public/app/opennebula/vm.js +++ b/src/sunstone/public/app/opennebula/vm.js @@ -855,7 +855,8 @@ define(function(require) { "detachsg" : function(params) { var action_obj = params.data.extra_param; OpenNebulaAction.simple_action(params, RESOURCE, "sg_detach", action_obj); - } + }, + "getHypervisor": getHypervisor, }; function hostnameStr(element, navigationLink = false) { @@ -1362,5 +1363,25 @@ define(function(require) { return rtn; } + /** + * This functions gets the VM hypervisor based on the VM history. + * + * @param {Object} template: VM template + * @returns {String} VM hypervisor based on HISTORY. + */ + function getHypervisor(template) { + var history = template.HISTORY_RECORDS && template.HISTORY_RECORDS.HISTORY; + + if (!Array.isArray(history)){ + history = [history]; + } + + currentHistory = history.reduce(function(prev, current) { + return (prev.SEQ > current.SEQ) ? prev : current; + }); + + return currentHistory.VM_MAD; + } + return VM; }); diff --git a/src/sunstone/public/app/tabs/vms-tab/dialogs/migrate.js b/src/sunstone/public/app/tabs/vms-tab/dialogs/migrate.js index ceaa640066..a22d128c1d 100644 --- a/src/sunstone/public/app/tabs/vms-tab/dialogs/migrate.js +++ b/src/sunstone/public/app/tabs/vms-tab/dialogs/migrate.js @@ -19,28 +19,28 @@ define(function(require) { DEPENDENCIES */ - var BaseDialog = require('utils/dialogs/dialog'); - var Config = require('sunstone-config'); - var DatastoresTable = require('tabs/datastores-tab/datatable'); - var HostsTable = require('tabs/hosts-tab/datatable'); - var Locale = require('utils/locale'); - var Notifier = require('utils/notifier'); - var OpenNebulaVM = require('opennebula/vm'); - var Sunstone = require('sunstone'); - var Tips = require('utils/tips'); - + var BaseDialog = require("utils/dialogs/dialog"); + var Config = require("sunstone-config"); + var DatastoresTable = require("tabs/datastores-tab/datatable"); + var HostsTable = require("tabs/hosts-tab/datatable"); + var Locale = require("utils/locale"); + var Notifier = require("utils/notifier"); + var OpenNebulaVM = require("opennebula/vm"); + var Sunstone = require("sunstone"); + var Tips = require("utils/tips"); + /* TEMPLATES */ - var TemplateHTML = require('hbs!./migrate/html'); + var TemplateHTML = require("hbs!./migrate/html"); /* CONSTANTS */ - var DIALOG_ID = require('./migrate/dialogId'); - var TAB_ID = require('../tabId'); + var DIALOG_ID = require("./migrate/dialogId"); + var TAB_ID = require("../tabId"); /* CONSTRUCTOR @@ -49,11 +49,11 @@ define(function(require) { function Dialog() { this.dialogId = DIALOG_ID; - this.hostsTable = new HostsTable('migrate_vm', {'select': true}); - this.datastoresTable = new DatastoresTable('migrate_vm_ds', { - 'select': true, - 'selectOptions': { - 'filter_fn': function(ds) { return ds.TYPE == 1; } // Show system DS only + this.hostsTable = new HostsTable("migrate_vm", {"select": true}); + this.datastoresTable = new DatastoresTable("migrate_vm_ds", { + "select": true, + "selectOptions": { + "filter_fn": function(ds) { return ds.TYPE == 1; } // Show system DS only } }); @@ -77,9 +77,9 @@ define(function(require) { function _html() { return TemplateHTML({ - 'dialogId': this.dialogId, - 'hostsTableHTML': this.hostsTable.dataTableHTML, - 'datastoresTableHTML': this.datastoresTable.dataTableHTML + "dialogId": this.dialogId, + "hostsTableHTML": this.hostsTable.dataTableHTML, + "datastoresTableHTML": this.datastoresTable.dataTableHTML }); } @@ -93,18 +93,18 @@ define(function(require) { $("#enforce", context).attr("checked", Config.isFeatureEnabled("migrate_enforce")); - $('#' + DIALOG_ID + 'Form', context).submit(function() { + $("#" + DIALOG_ID + "Form", context).submit(function() { var extra_info = {}; if ($("#selected_resource_id_migrate_vm", context).val()) { - extra_info['host_id'] = $("#selected_resource_id_migrate_vm", context).val(); + extra_info["host_id"] = $("#selected_resource_id_migrate_vm", context).val(); } else { Notifier.notifyError(Locale.tr("You have not selected a host")); return false; } - extra_info['ds_id'] = $("#selected_resource_id_migrate_vm_ds", context).val() || -1; - extra_info['enforce'] = $("#enforce", context).is(":checked"); + extra_info["ds_id"] = $("#selected_resource_id_migrate_vm_ds", context).val() || -1; + extra_info["enforce"] = $("#enforce", context).is(":checked"); $.each(Sunstone.getDataTable(TAB_ID).elements(), function(index, elem) { if (that.live) { @@ -130,25 +130,26 @@ define(function(require) { this.datastoresTable.resetResourceTableSelect(); this.hostsTable.resetResourceTableSelect(); var vmTemplate = Sunstone.getElementRightInfo(TAB_ID); - var migrateWithDsSelection = true + var migrateWithDsSelection = true; + var vmHypervisor = OpenNebulaVM.getHypervisor(vmTemplate); if ( this.live && - vmTemplate && - vmTemplate.USER_TEMPLATE && - vmTemplate.USER_TEMPLATE.HYPERVISOR && - Config && Config.onedConf && Config.onedConf.VM_MAD && Array.isArray(Config.onedConf.VM_MAD) + Config && + Config.onedConf && + Config.onedConf.VM_MAD && + Array.isArray(Config.onedConf.VM_MAD) ) { var hypervisor = $.grep(Config.onedConf.VM_MAD, function(n,i) { - return n.NAME && n.NAME === vmTemplate.USER_TEMPLATE.HYPERVISOR; - }) - + return n.NAME && n.NAME === vmHypervisor; + }); + if ( !hypervisor[0] || !hypervisor[0].DS_LIVE_MIGRATION || hypervisor[0].DS_LIVE_MIGRATION !== "yes" ) { - migrateWithDsSelection = false + migrateWithDsSelection = false; $(".migrate_vm_ds_selection", context).hide(); } } @@ -166,19 +167,19 @@ define(function(require) { var hostname = OpenNebulaVM.hostnameStr(element); var datastore = OpenNebulaVM.datastoreStr(element); - var hostnameHtml = $('').css('font-weight', '600').text(hostname) - var datastoreHtml = $('').css('font-weight', '600').text(datastore) + var hostnameHtml = $("").css("font-weight", "600").text(hostname); + var datastoreHtml = $("").css("font-weight", "600").text(datastore); - var label = $('', { class: 'radius secondary label' }) - .append(Locale.tr("VM") + ' ' + element.ID + ' ' + element.NAME + ' ' + - Locale.tr("is currently running on Host") + ' ') - .append(hostnameHtml) + var label = $("", { class: "radius secondary label" }) + .append(Locale.tr("VM") + " " + element.ID + " " + element.NAME + " " + + Locale.tr("is currently running on Host") + " ") + .append(hostnameHtml); migrateWithDsSelection && label - .append(' ' + Locale.tr("and Datastore") + ' ') - .append(datastoreHtml) + .append(" " + Locale.tr("and Datastore") + " ") + .append(datastoreHtml); - $('.confirm-resources-header', context).append(label) + $(".confirm-resources-header", context).append(label); } }); });