diff --git a/src/sunstone/public/app/tabs/datastores-tab/panels/info.js b/src/sunstone/public/app/tabs/datastores-tab/panels/info.js index e967aab9c6..5147d5a738 100644 --- a/src/sunstone/public/app/tabs/datastores-tab/panels/info.js +++ b/src/sunstone/public/app/tabs/datastores-tab/panels/info.js @@ -70,7 +70,10 @@ define(function(require) { var strippedTemplate = {}; var strippedTemplateVcenter = {}; $.each(this.element.TEMPLATE, function(key, value) { - if (key.match(/^VCENTER_*/)){ + if (!key.match(/^VCENTER_HOST$/) && + !key.match(/^VCENTER_USER$/) && + !key.match(/^VCENTER_PASSWORD$/) && + key.match(/^VCENTER_*/)){ strippedTemplateVcenter[key] = value; } else { diff --git a/src/sunstone/public/app/tabs/hosts-tab/panels/info.js b/src/sunstone/public/app/tabs/hosts-tab/panels/info.js index 50270e425c..4de0eca0fa 100644 --- a/src/sunstone/public/app/tabs/hosts-tab/panels/info.js +++ b/src/sunstone/public/app/tabs/hosts-tab/panels/info.js @@ -73,7 +73,7 @@ define(function(require) { if ($.inArray(key, unshownKeys) > -1) { that.unshownTemplate[key] = value; } - else if (key.match(/^VCENTER_*/)){ + else if (!key.match(/^VCENTER_RESOURCE_POOL$/) && key.match(/^VCENTER_*/)){ that.strippedTemplateVcenter[key] = value; } else { @@ -134,7 +134,7 @@ define(function(require) { document.getElementById('change_bar_cpu_hosts').value = parseInt(document.getElementById('textInput_reserved_cpu_hosts').value); document.getElementById('textInput_reserved_cpu_hosts').value = document.getElementById('change_bar_cpu_hosts').value; } - + function changeInputMEM(){ document.getElementById('change_bar_mem_hosts').value = Humanize.sizeToMB(document.getElementById('textInput_reserved_mem_hosts').value); document.getElementById('textInput_reserved_mem_hosts').value = Humanize.size(document.getElementById('change_bar_mem_hosts').value); @@ -155,9 +155,9 @@ define(function(require) { //.off and .on prevent multiple clicks events $(document).off('click', '.update_reserved_hosts').on("click", '.update_reserved', function(){ - var reservedCPU = parseInt(document.getElementById('change_bar_cpu_hosts').value); + var reservedCPU = parseInt(document.getElementById('change_bar_cpu_hosts').value); var CPU = parseInt(that.element.HOST_SHARE.FREE_CPU); - var reservedMem = parseInt(document.getElementById('change_bar_mem_hosts').value); + var reservedMem = parseInt(document.getElementById('change_bar_mem_hosts').value); var MEM = parseInt(that.element.HOST_SHARE.FREE_MEM); if(parseInt(that.element.HOST_SHARE.USED_CPU) > 0) CPU += parseInt(that.element.HOST_SHARE.USED_CPU); @@ -167,9 +167,9 @@ define(function(require) { reservedMem = MEM - reservedMem; var obj = {RESERVED_CPU: reservedCPU, RESERVED_MEM: reservedMem}; - Sunstone.runAction("Host.append_template", that.element.ID, TemplateUtils.templateToString(obj)); + Sunstone.runAction("Host.append_template", that.element.ID, TemplateUtils.templateToString(obj)); }); - + document.getElementById("change_bar_cpu_hosts").addEventListener("change", function(){ if(parseInt(document.getElementById('change_bar_cpu_hosts').value) > that.element.HOST_SHARE.TOTAL_CPU) document.getElementById('textInput_reserved_cpu_hosts').style.backgroundColor = 'rgba(111, 220, 111,0.5)'; diff --git a/src/sunstone/public/app/tabs/hosts-tab/panels/wilds.js b/src/sunstone/public/app/tabs/hosts-tab/panels/wilds.js index 89ea9fed32..a393b09ecf 100644 --- a/src/sunstone/public/app/tabs/hosts-tab/panels/wilds.js +++ b/src/sunstone/public/app/tabs/hosts-tab/panels/wilds.js @@ -25,6 +25,9 @@ define(function(require) { var CanImportWilds = require('../utils/can-import-wilds'); var OpenNebulaHost = require('opennebula/host'); var OpenNebulaAction = require('opennebula/action'); + var OpenNebulaNetwork = require('opennebula/network'); + var OpenNebulaImage = require('opennebula/image'); + var OpenNebulaError = require('opennebula/error'); var Sunstone = require('sunstone'); var Notifier = require('utils/notifier'); var Navigation = require('utils/navigation'); @@ -65,6 +68,189 @@ define(function(require) { FUNCTION DEFINITIONS */ + function rollback_nics_and_disk(error_message, vmName, rollback_items, that, context, wild_row) { + var rollback_index = 0; + + function nextRollback() { + + if (rollback_items.length == rollback_index) { + var msg = Locale.tr("Could not import the wild VM " + vmName + " due to " + error_message + ". A rollback has been applied."); + Notifier.notifyError(msg); + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + + } else { + if (rollback_items[rollback_index].type === "NETWORK") { + var path = '/vcenter/network_rollback/' + rollback_items[rollback_index].id; + $.ajax({ + url: path, + type: "POST", + data: {timeout: false}, + dataType: "json", + success: function(response){ + ++rollback_index; + nextRollback(); + }, + error: function(response){ + var msg = OpenNebulaError(response).error.message; + Notifier.notifyError(msg); + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); } + }); + } + + if (rollback_items[rollback_index].type === "IMAGE") { + var path = '/vcenter/image_rollback/' + rollback_items[rollback_index].id; + $.ajax({ + url: path, + type: "POST", + data: {timeout: false}, + dataType: "json", + success: function(response){ + ++rollback_index; + nextRollback(); + }, + error: function(response){ + var msg = OpenNebulaError(response).error.message; + Notifier.notifyError(msg); + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + } + }); + } + } + } + + nextRollback(); + } + + + function import_images_and_nets(disks_and_nets, importHostId, vmName, that, context, wild_row) { + var index = 0; + var template = ""; + var rollback = []; + + function getNext() { + + // Update the template + if (disks_and_nets.length == index) { + + // Create the VM in OpenNebula + var dataJSON = { + 'id': importHostId, + 'extra_param': { + 'name': vmName + } + }; + + OpenNebulaHost.import_wild({ + timeout: true, + data: dataJSON, + success: function(request, response) { + OpenNebulaAction.clear_cache("VM"); + Notifier.notifyCustom(Locale.tr("VM imported"), + Navigation.link(" ID: " + response.VM.ID, "vms-tab", response.VM.ID), + false); + + // Delete row (shouldn't be there in next monitorization) + that.dataTableWildHosts.fnDeleteRow(wild_row); + + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + }, + error: function (request, error_json) { + rollback_nics_and_disk(error_json.error.message, vmName, rollback, that, context, wild_row); + } + }); + + } else { + + if (disks_and_nets[index].type === "NEW_DISK") { + + var image_json = { + "image": { + "image_raw": disks_and_nets[index].image_tmpl + }, + "ds_id" : disks_and_nets[index].ds_id + }; + + OpenNebulaImage.create({ + timeout: true, + data: image_json, + success: function(request, response) { + var image_id = response.IMAGE.ID; + var image_uname = response.IMAGE.UNAME; + ++index; + var rollback_info = { type: "IMAGE", id: image_id}; + rollback.push(rollback_info); + getNext(); + }, + error: function (request, error_json) { + var error_message_str = error_json.error.message; + + // Rollback + var msg = (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")); + Notifier.notifyError(msg); + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + + rollback_nics_and_disk(error_json.error.message, vmName, rollback, that, context, wild_row); + } + }); + } + + if (disks_and_nets[index].type === "EXISTING_DISK") { + template += disks_and_nets[index].image_tmpl; + ++index; + getNext(); + } + + if (disks_and_nets[index].type === "NEW_NIC") { + + var vnet_json = { + "vnet": { + "vnet_raw": disks_and_nets[index].network_tmpl + } + }; + + var one_cluster_id = disks_and_nets[index].one_cluster_id; + + OpenNebulaNetwork.create({ + timeout: true, + data: vnet_json, + success: function(request, response) { + var network_id = response.VNET.ID; + if (one_cluster_id != -1) { + Sunstone.runAction("Cluster.addvnet",one_cluster_id,response.VNET.ID); + } + ++index; + var rollback_info = { type: "NETWORK", id: network_id}; + rollback.push(rollback_info); + getNext(); + }, + error: function (request, error_json) { + // Rollback + var msg = (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")); + Notifier.notifyError(msg); + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + + //rollback_nics_and_disk(error_json.error.message, template_id, rollback, row_context); + } + }); + } + + if (disks_and_nets[index].type == "EXISTING_NIC") { + template += disks_and_nets[index].network_tmpl; + ++index; + getNext(); + } + + } + } + getNext(); + } + function _html() { return TemplateWilds(); } @@ -140,44 +326,79 @@ define(function(require) { var aData = that.dataTableWildHosts.fnGetData(wild_row); var vmName = aData[1]; + var remoteID = aData[2]; + if (remoteID.startsWith("vm-")) { - var dataJSON = { - 'id': importHostId, - 'extra_param': { - 'name': vmName - } - }; + var path = '/vcenter/wild/' + remoteID; + $.ajax({ + url: path, + type: "GET", + data: {timeout: false}, + headers: { + "X-VCENTER-USER": that.element.TEMPLATE.VCENTER_USER, + "X-VCENTER-PASSWORD": that.element.TEMPLATE.VCENTER_PASSWORD, + "X-VCENTER-HOST": that.element.TEMPLATE.VCENTER_HOST + }, + dataType: "json", + success: function(response){ + var disks_and_nets = response.disks.concat(response.nics) + import_images_and_nets(disks_and_nets, importHostId, vmName, that, context, wild_row); + }, + error: function(response){ + var msg; + if (error_json.error.message){ + msg = error_json.error.message; + } else { + msg = Locale.tr("Cannot contact server: is it running and reachable?"); + } - // Create the VM in OpenNebula - OpenNebulaHost.import_wild({ - timeout: true, - data: dataJSON, - success: function(request, response) { - OpenNebulaAction.clear_cache("VM"); - Notifier.notifyCustom(Locale.tr("VM imported"), - Navigation.link(" ID: " + response.VM.ID, "vms-tab", response.VM.ID), - false); + Notifier.notifyError(msg); - // Delete row (shouldn't be there in next monitorization) - that.dataTableWildHosts.fnDeleteRow(wild_row); + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + } + }); - $("#import_wilds", context).removeAttr("disabled").off("click.disable"); - $("#import_wilds", context).html(Locale.tr("Import Wilds")); - }, - error: function (request, error_json) { - var msg; - if (error_json.error.message){ - msg = error_json.error.message; - } else { - msg = Locale.tr("Cannot contact server: is it running and reachable?"); + } else { + + var dataJSON = { + 'id': importHostId, + 'extra_param': { + 'name': vmName } + }; - Notifier.notifyError(msg); + // Create the VM in OpenNebula + OpenNebulaHost.import_wild({ + timeout: true, + data: dataJSON, + success: function(request, response) { + OpenNebulaAction.clear_cache("VM"); + Notifier.notifyCustom(Locale.tr("VM imported"), + Navigation.link(" ID: " + response.VM.ID, "vms-tab", response.VM.ID), + false); - $("#import_wilds", context).removeAttr("disabled").off("click.disable"); - $("#import_wilds", context).html(Locale.tr("Import Wilds")); - } - }); + // Delete row (shouldn't be there in next monitorization) + that.dataTableWildHosts.fnDeleteRow(wild_row); + + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + }, + error: function (request, error_json) { + var msg; + if (error_json.error.message){ + msg = error_json.error.message; + } else { + msg = Locale.tr("Cannot contact server: is it running and reachable?"); + } + + Notifier.notifyError(msg); + + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + } + }); + } }); }); diff --git a/src/sunstone/public/app/tabs/vnets-tab/form-panels/create.js b/src/sunstone/public/app/tabs/vnets-tab/form-panels/create.js index e4d25f964a..71c2354504 100644 --- a/src/sunstone/public/app/tabs/vnets-tab/form-panels/create.js +++ b/src/sunstone/public/app/tabs/vnets-tab/form-panels/create.js @@ -29,6 +29,7 @@ define(function(require) { var SecurityGroupsTable = require('tabs/secgroups-tab/datatable'); var TemplateUtils = require('utils/template-utils'); var WizardFields = require('utils/wizard-fields'); + var ResourceSelect = require('utils/resource-select'); /* TEMPLATES @@ -128,6 +129,7 @@ define(function(require) { $('input#vn_mad', context).removeAttr('required'); $('input#vn_mad', context).removeAttr('value'); $('#vcenter_switch_name', context).removeAttr('required'); + $('#vcenter_cluster_id', context).removeAttr('required'); switch ($(this).val()) { case "dummy": $("div.mode_param.dummy", context).show(); @@ -170,6 +172,19 @@ define(function(require) { $("div.mode_param.vcenter [wizard_field]", context).prop('wizard_field_disabled', false); $('input#bridge', context).attr('value', $('#name', context).val()); $('#vcenter_switch_name', context).attr('required', ''); + ResourceSelect.insert({ + context: $('#vcenter_cluster_id', context), + resourceName: 'Host', + emptyValue: true, + nameValues: false, + filterKey: 'VM_MAD', + filterValue: 'vcenter', + required: true, + callback: function(element){ + element.attr('wizard_field', 'VCENTER_ONE_HOST_ID'); + } + }); + $('input#vn_mad', context).attr('required', ''); $('input#vn_mad', context).attr('value', 'vcenter'); diff --git a/src/sunstone/public/app/tabs/vnets-tab/form-panels/create/wizard.hbs b/src/sunstone/public/app/tabs/vnets-tab/form-panels/create/wizard.hbs index f45d7d1d62..4582eb190a 100644 --- a/src/sunstone/public/app/tabs/vnets-tab/form-panels/create/wizard.hbs +++ b/src/sunstone/public/app/tabs/vnets-tab/form-panels/create/wizard.hbs @@ -202,6 +202,12 @@ +