From 84099d8ea1ae3e3d520b11dc359aaa3a6b623202 Mon Sep 17 00:00:00 2001 From: Abel Coronado Date: Fri, 5 Oct 2018 13:43:33 +0200 Subject: [PATCH] F #2140: Refactor JS code and added wild route F #2140: Multiple wild importation [Sunstone] F #2140: Added host to ajax data F #2140: Added feedback [Sunstone] F #2140: Better feedback [Sunstone] --- .../public/app/tabs/hosts-tab/panels/wilds.js | 118 ++++++++++++------ src/sunstone/routes/vcenter.rb | 14 +-- 2 files changed, 79 insertions(+), 53 deletions(-) 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 cec4ee0b7a..5de81cc757 100644 --- a/src/sunstone/public/app/tabs/hosts-tab/panels/wilds.js +++ b/src/sunstone/public/app/tabs/hosts-tab/panels/wilds.js @@ -25,12 +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'); + var VCenterCommon = require('utils/vcenter/vcenter-common'); /* TEMPLATES @@ -113,6 +110,7 @@ define(function(require) { ]; that.dataTableWildHosts.fnAddData(wilds_list_array); + $(".import_wild_checker.import_" + index, context).data("import_data", elem); } }); } @@ -138,54 +136,92 @@ define(function(require) { $("#import_wilds", context).attr("disabled", "disabled").on("click.disable", function(e) { return false; }); $("#import_wilds", context).html(''); - $(".import_wild_checker:checked", "#datatable_host_wilds").each(function() { - var importHostId = that.element.ID; - var wild_row = $(this).closest('tr'); + if (that.element.TEMPLATE.HYPERVISOR === "vcenter"){ + var path = "/vcenter/wild"; + var resource = "Wild"; + var vcenter_refs = []; + var opts = {}; + $(".import_wild_checker:checked", "#datatable_host_wilds").each(function() { + var wild_obj = $(this).data("import_data"); + var ref = wild_obj.DEPLOY_ID; + vcenter_refs.push(ref); + opts[ref] = wild_obj; + }); - var aData = that.dataTableWildHosts.fnGetData(wild_row); - var vmName = aData[1]; - var remoteID = aData[2]; - - var dataJSON = { - 'id': importHostId, - 'extra_param': { - 'name': vmName - } - }; - - // 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); - - // 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")); + $.ajax({ + url: path, + type: "POST", + data: { + wilds: vcenter_refs.join(","), + opts: opts, + host: that.element.ID, + timeout: false + }, + dataType: "json", + success: function(response){ + $.each(response.success, function(key, value){ + Notifier.notifyCustom(Locale.tr("VM imported"), + Navigation.link(" ID: " + value, "vms-tab", value), false); + }); + VCenterCommon.jGrowlFailure({error : response.error, resource : resource}); }, error: function (request, error_json) { - var msg; - if (error_json.error.message){ - msg = error_json.error.message; + if (request.responseJSON === undefined){ + Notifier.notifyError("Empty response received from server. Check your setup to avoid timeouts"); } else { - msg = Locale.tr("Cannot contact server: is it running and reachable?"); + Notifier.notifyError(request.responseJSON.error.message); } - - Notifier.notifyError(msg); - + }, + complete: function (data) { $("#import_wilds", context).removeAttr("disabled").off("click.disable"); $("#import_wilds", context).html(Locale.tr("Import Wilds")); } }); - }); + } else { + $(".import_wild_checker:checked", "#datatable_host_wilds").each(function() { + var wild_row = $(this).closest('tr'); + var aData = that.dataTableWildHosts.fnGetData(wild_row); + + var dataJSON = { + 'id': that.element.ID, + 'extra_param': { + 'name': aData[1] + } + }; + + // 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); + // Delete row (shouldn't be there in next monitorization) + that.dataTableWildHosts.fnDeleteRow(wild_row); + }, + error: function (request, error_json) { + wildsError(error_json, context); + }, + complete: function (data) { + $("#import_wilds", context).removeAttr("disabled").off("click.disable"); + $("#import_wilds", context).html(Locale.tr("Import Wilds")); + } + }); + }); + } }); return false; } + + function wildsError(error_json, context){ + 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); + } }); diff --git a/src/sunstone/routes/vcenter.rb b/src/sunstone/routes/vcenter.rb index df7d39701f..0d8bfc8d2c 100644 --- a/src/sunstone/routes/vcenter.rb +++ b/src/sunstone/routes/vcenter.rb @@ -230,21 +230,11 @@ post '/vcenter/images' do end end -post '/vcenter/wild_rollback/:vm_id' do +post '/vcenter/wild' do begin - vm_id = params[:vm_id] - one_vm = VCenterDriver::VIHelper.one_item(OpenNebula::VirtualMachine, vm_id.to_s, false) - if OpenNebula.is_error?(one_vm) - raise "Error finding VM #{vm_id}: #{rc.message}\n" - end - rc = one_vm.delete - if OpenNebula.is_error?(rc) - raise "Error deleting VM #{vm_id}: #{rc.message}\n" - end - - [200, "VM #{vm_id} deleted in rollback.".to_json] + [200, $importer.output.to_json] rescue Exception => e logger.error("[vCenter] " + e.message) error = Error.new(e.message)