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 @@ +
+
+ +
+
+
diff --git a/src/sunstone/public/app/utils/vcenter/clusters.js b/src/sunstone/public/app/utils/vcenter/clusters.js index 682c5845be..1806a0b066 100644 --- a/src/sunstone/public/app/utils/vcenter/clusters.js +++ b/src/sunstone/public/app/utils/vcenter/clusters.js @@ -19,6 +19,7 @@ define(function(require) { var Locale = require('utils/locale'); var Sunstone = require('sunstone'); var OpenNebulaHost = require('opennebula/host'); + var OpenNebulaCluster = require('opennebula/cluster'); var OpenNebulaError = require('opennebula/error'); var DomDataTable = require('utils/dom-datatable'); var Notifier = require('utils/notifier'); @@ -92,7 +93,8 @@ define(function(require) { toggleAdvanced : false, columns : [ '', - Locale.tr("Name"), + Locale.tr("Cluster"), + Locale.tr("Location"), "" ] }); @@ -101,7 +103,9 @@ define(function(require) { var tbody = $('#' + tableId + ' tbody', context); $.each(elements, function(id, cluster) { - var cluster_name = cluster.cluster_name; + var cluster_name = cluster.simple_name; + var cluster_location = cluster.cluster_location; + var cluster_hash = cluster.cluster_hash; var rp_list = ''; - var opts = { name: cluster_name }; + var opts = { name: cluster_name, location: cluster_location, hash: cluster_hash }; var trow = $(RowTemplate(opts)).appendTo(tbody); $(".check_item", trow).data("cluster", cluster); @@ -135,12 +139,12 @@ define(function(require) { elementsTable.initialize(); - $("a.vcenter-table-select-all").text(Locale.tr("Select all %1$s DataCenters", elements.length)); + $("a.vcenter-table-select-all").text(Locale.tr("Select all %1$s Clusters", elements.length)); VCenterCommon.setupTable({ context : newdiv, - allSelected : Locale.tr("All %1$s DataCenters selected."), - selected: Locale.tr("%1$s DataCenters selected.") + allSelected : Locale.tr("All %1$s Clusters selected."), + selected: Locale.tr("%1$s Clusters selected.") }); context.off('click', '.clear_imported'); @@ -171,46 +175,110 @@ define(function(require) { VCenterCommon.importLoading({context : row_context}); - var host_json = { - "host": { - "name": $(this).data("cluster").cluster_name, - "vm_mad": "vcenter", - "vnm_mad": "dummy", - "im_mad": "vcenter", - "cluster_id": cluster_id - } - }; - var cluster_ref = $(this).data("cluster").cluster_ref; var vcenter_uuid = $(this).data("cluster").vcenter_uuid; var vcenter_version = $(this).data("cluster").vcenter_version; + var cluster_name = $(this).data("cluster").cluster_name; - OpenNebulaHost.create({ - timeout: true, - data: host_json, - success: function(request, response) { - VCenterCommon.importSuccess({ - context : row_context, - message : Locale.tr("Host created successfully. ID: %1$s", response.HOST.ID) + if (cluster_id == 0) { + + var cluster_json = { + "cluster": { + "name": cluster_name + } + }; + + OpenNebulaCluster.create({ + timeout: true, + data: cluster_json, + success: function(request, response) { + + var host_json = { + "host": { + "name": cluster_name, + "vm_mad": "vcenter", + "vnm_mad": "dummy", + "im_mad": "vcenter", + "cluster_id": response.CLUSTER.ID + } + }; + + OpenNebulaHost.create({ + timeout: true, + data: host_json, + success: function(request, response) { + VCenterCommon.importSuccess({ + context : row_context, + message : Locale.tr("Host created successfully. ID: %1$s", response.HOST.ID) + }); + + var template_raw = + "VCENTER_USER=\"" + that.opts.vcenter_user + "\"\n" + + "VCENTER_PASSWORD=\"" + that.opts.vcenter_password + "\"\n" + + "VCENTER_HOST=\"" + that.opts.vcenter_host + "\"\n" + + "VCENTER_INSTANCE_ID=\"" + vcenter_uuid + "\"\n" + + "VCENTER_CCR_REF=\"" + cluster_ref + "\"\n" + + "VCENTER_VERSION=\"" + vcenter_version + "\"\n"; + + Sunstone.runAction("Host.update_template", response.HOST.ID, template_raw); + }, + error: function (request, error_json) { + VCenterCommon.importFailure({ + context : row_context, + message : (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")) + }); + } + }); + }, + error: function (request, error_json) { + VCenterCommon.importFailure({ + context : row_context, + message : (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")) + }); + } + }); + + + } else { + + var host_json = { + "host": { + "name": cluster_name, + "vm_mad": "vcenter", + "vnm_mad": "dummy", + "im_mad": "vcenter", + "cluster_id": cluster_id + } + }; + + OpenNebulaHost.create({ + timeout: true, + data: host_json, + success: function(request, response) { + VCenterCommon.importSuccess({ + context : row_context, + message : Locale.tr("Host created successfully. ID: %1$s", response.HOST.ID) + }); + + var template_raw = + "VCENTER_USER=\"" + that.opts.vcenter_user + "\"\n" + + "VCENTER_PASSWORD=\"" + that.opts.vcenter_password + "\"\n" + + "VCENTER_HOST=\"" + that.opts.vcenter_host + "\"\n" + + "VCENTER_INSTANCE_ID=\"" + vcenter_uuid + "\"\n" + + "VCENTER_CCR_REF=\"" + cluster_ref + "\"\n" + + "VCENTER_VERSION=\"" + vcenter_version + "\"\n"; + + Sunstone.runAction("Host.update_template", response.HOST.ID, template_raw); + }, + error: function (request, error_json) { + VCenterCommon.importFailure({ + context : row_context, + message : (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")) + }); + } }); + } - var template_raw = - "VCENTER_USER=\"" + that.opts.vcenter_user + "\"\n" + - "VCENTER_PASSWORD=\"" + that.opts.vcenter_password + "\"\n" + - "VCENTER_HOST=\"" + that.opts.vcenter_host + "\"\n" + - "VCENTER_INSTANCE_ID=\"" + vcenter_uuid + "\"\n" + - "VCENTER_CCR_REF=\"" + cluster_ref + "\"\n" + - "VCENTER_VERSION=\"" + vcenter_version + "\"\n"; - - Sunstone.runAction("Host.update_template", response.HOST.ID, template_raw); - }, - error: function (request, error_json) { - VCenterCommon.importFailure({ - context : row_context, - message : (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")) - }); - } - }); }); }); } diff --git a/src/sunstone/public/app/utils/vcenter/clusters/row.hbs b/src/sunstone/public/app/utils/vcenter/clusters/row.hbs index c1a5e2a2e9..b7a09db0b5 100644 --- a/src/sunstone/public/app/utils/vcenter/clusters/row.hbs +++ b/src/sunstone/public/app/utils/vcenter/clusters/row.hbs @@ -19,6 +19,7 @@ {{name}} + {{location}}   diff --git a/src/sunstone/public/app/utils/vcenter/datastores.js b/src/sunstone/public/app/utils/vcenter/datastores.js index c34ac5c860..d89dcacb17 100644 --- a/src/sunstone/public/app/utils/vcenter/datastores.js +++ b/src/sunstone/public/app/utils/vcenter/datastores.js @@ -23,6 +23,7 @@ define(function(require) { var Notifier = require('utils/notifier'); var UniqueId = require('utils/unique-id'); var VCenterCommon = require('./vcenter-common'); + var Sunstone = require('sunstone'); var TemplateHTML = require('hbs!./common/html'); var RowTemplate = require('hbs!./datastores/row'); @@ -55,6 +56,7 @@ define(function(require) { } */ function _fillVCenterDatastores(opts) { + this.opts = opts; var path = '/vcenter/datastores'; var context = $(".vcenter_import", opts.container); @@ -94,7 +96,9 @@ define(function(require) { columns : [ '', Locale.tr("Name"), - Locale.tr("Cluster"), + Locale.tr("Total MB"), + Locale.tr("Free MB"), + Locale.tr("OpenNebula Cluster IDs"), "" ] }); @@ -103,10 +107,11 @@ define(function(require) { var tbody = $('#' + tableId + ' tbody', context); $.each(elements, function(id, element){ - var opts = { name: element.name, cluster: element.cluster }; + var opts = { name: element.simple_name, cluster: element.cluster, free_mb: element.free_mb, total_mb: element.total_mb }; var trow = $(RowTemplate(opts)).appendTo(tbody); $(".check_item", trow).data("one_template", element.ds) + $(".check_item", trow).data("one_clusters", element.cluster) }); var elementsTable = new DomDataTable( @@ -154,12 +159,15 @@ define(function(require) { } function _import(context) { + var that = this; $.each($("table.vcenter_import_table", context), function() { $.each($(this).DataTable().$(".check_item:checked"), function() { var row_context = $(this).closest("tr"); VCenterCommon.importLoading({context : row_context}); - var one_template = $(this).data("one_template"); + var one_template = $(this).data("one_template"); + var one_clusters = $(this).data("one_clusters"); + var datastore_ids = []; $.each(one_template, function(id, element){ var datastore_json = { "datastore": { @@ -171,9 +179,21 @@ define(function(require) { timeout: true, data: datastore_json, success: function(request, response) { + datastore_ids.push(response.DATASTORE.ID); VCenterCommon.importSuccess({ context : row_context, - message : Locale.tr("Datastore created successfully. ID: %1$s", response.DATASTORE.ID) + message : Locale.tr("Datastores created successfully. IDs: %1$s", datastore_ids.join()) + }); + + var datastore_raw = + "VCENTER_USER=\"" + that.opts.vcenter_user + "\"\n" + + "VCENTER_PASSWORD=\"" + that.opts.vcenter_password + "\"\n" + + "VCENTER_HOST=\"" + that.opts.vcenter_host + "\"\n"; + + Sunstone.runAction("Datastore.append_template", response.DATASTORE.ID, datastore_raw); + + $.each(one_clusters, function(index, cluster_id){ + Sunstone.runAction("Cluster.adddatastore",cluster_id,response.DATASTORE.ID); }); }, error: function (request, error_json) { diff --git a/src/sunstone/public/app/utils/vcenter/datastores/row.hbs b/src/sunstone/public/app/utils/vcenter/datastores/row.hbs index 0baa24fb40..1cf29e98cb 100644 --- a/src/sunstone/public/app/utils/vcenter/datastores/row.hbs +++ b/src/sunstone/public/app/utils/vcenter/datastores/row.hbs @@ -19,6 +19,8 @@ {{name}} + {{total_mb}} + {{free_mb}} {{cluster}} diff --git a/src/sunstone/public/app/utils/vcenter/images.js b/src/sunstone/public/app/utils/vcenter/images.js index 97fdc94f04..48c22a050d 100644 --- a/src/sunstone/public/app/utils/vcenter/images.js +++ b/src/sunstone/public/app/utils/vcenter/images.js @@ -93,8 +93,9 @@ define(function(require) { toggleAdvanced : false, columns : [ '', - Locale.tr("Name"), + Locale.tr("Path"), Locale.tr("Size"), + Locale.tr("Type"), "" ] }); @@ -103,7 +104,7 @@ define(function(require) { var tbody = $('#' + tableId + ' tbody', context); $.each(response, function(id, element) { - var opts = { name: element.name, size: element.size }; + var opts = { name: element.path, size: element.size, type: element.type }; var trow = $(RowTemplate(opts)).appendTo(tbody); $(".check_item", trow).data("datastore_id", element.dsid); diff --git a/src/sunstone/public/app/utils/vcenter/images/row.hbs b/src/sunstone/public/app/utils/vcenter/images/row.hbs index 91096f3418..c1fd9c2866 100644 --- a/src/sunstone/public/app/utils/vcenter/images/row.hbs +++ b/src/sunstone/public/app/utils/vcenter/images/row.hbs @@ -19,7 +19,8 @@ {{name}} - {{humanizeSize "KB" size}} + {{humanizeSize "MB" size}} + {{type}}   diff --git a/src/sunstone/public/app/utils/vcenter/networks.js b/src/sunstone/public/app/utils/vcenter/networks.js index 72047bf19f..30f84688eb 100644 --- a/src/sunstone/public/app/utils/vcenter/networks.js +++ b/src/sunstone/public/app/utils/vcenter/networks.js @@ -23,6 +23,7 @@ define(function(require) { var Notifier = require('utils/notifier'); var UniqueId = require('utils/unique-id'); var VCenterCommon = require('./vcenter-common'); + var Sunstone = require('sunstone'); var TemplateHTML = require('hbs!./common/html'); var RowTemplate = require('hbs!./networks/row'); @@ -302,6 +303,8 @@ define(function(require) { } }; + var one_cluster_id = $(this).data("import_data").one_cluster_id; + OpenNebulaNetwork.create({ timeout: true, data: vnet_json, @@ -310,6 +313,10 @@ define(function(require) { context : row_context, message : Locale.tr("Virtual Network created successfully. ID: %1$s", response.VNET.ID) }); + + if (one_cluster_id != -1) { + Sunstone.runAction("Cluster.addvnet",one_cluster_id,response.VNET.ID); + } }, error: function (request, error_json) { VCenterCommon.importFailure({ diff --git a/src/sunstone/public/app/utils/vcenter/networks/row.hbs b/src/sunstone/public/app/utils/vcenter/networks/row.hbs index d350f4c1c9..ea810601b5 100644 --- a/src/sunstone/public/app/utils/vcenter/networks/row.hbs +++ b/src/sunstone/public/app/utils/vcenter/networks/row.hbs @@ -27,6 +27,9 @@ {{data.name}} - {{data.type}} + - Cluster: {{data.cluster}} + - Location: {{data.cluster_location}} + - OpenNebula Cluster ID: {{data.one_cluster_id}} {{#if data.vlan}} - VLAN: {{data.vlan}}{{/if}}
diff --git a/src/sunstone/public/app/utils/vcenter/templates.js b/src/sunstone/public/app/utils/vcenter/templates.js index e1612e523c..a8e90f0796 100644 --- a/src/sunstone/public/app/utils/vcenter/templates.js +++ b/src/sunstone/public/app/utils/vcenter/templates.js @@ -18,12 +18,15 @@ define(function(require) { // Dependencies var Locale = require('utils/locale'); var OpenNebulaTemplate = require('opennebula/template'); + var OpenNebulaNetwork = require('opennebula/network'); + var OpenNebulaImage = require('opennebula/image'); var OpenNebulaError = require('opennebula/error'); var DomDataTable = require('utils/dom-datatable'); var UserInputs = require('utils/user-inputs'); var Notifier = require('utils/notifier'); var UniqueId = require('utils/unique-id'); var VCenterCommon = require('./vcenter-common'); + var Sunstone = require('sunstone'); var TemplateHTML = require('hbs!./common/html'); var RowTemplate = require('hbs!./templates/row'); @@ -103,24 +106,23 @@ define(function(require) { $.each(elements, function(id, element) { var opts = {}; - if (element.rp && element.rp !== '') { - opts.resourcePool = UserInputs.unmarshall(element.rp); - } - opts.data = element; - opts.resourcePool.params = opts.resourcePool.params.split(","); opts.id = UniqueId.id(); - var trow = $(RowTemplate(opts)).appendTo(tbody); - - $.each(opts.resourcePool.params, function(){ - $("#available_rps_" + opts.id + " [value ='" + this + "']").mousedown(function(e) { - e.preventDefault(); - $(this).prop('selected', !$(this).prop('selected')); - return false; + if (element.rp && element.rp !== '') { + opts.resourcePool = UserInputs.unmarshall(element.rp); + opts.resourcePool.params = opts.resourcePool.params.split(","); + $.each(opts.resourcePool.params, function(){ + $("#available_rps_" + opts.id + " [value ='" + this + "']").mousedown(function(e) { + e.preventDefault(); + $(this).prop('selected', !$(this).prop('selected')); + return false; + }); }); - }); - + } + + var trow = $(RowTemplate(opts)).appendTo(tbody); + $('.check_item', trow).data("import_data", element); }); @@ -166,6 +168,198 @@ define(function(require) { }); } + function rollback_nics_and_disk(error_message, template_id, rollback_items, row_context) { + var rollback_index = 0; + + function nextRollback() { + + if (rollback_items.length == rollback_index) { + var path = '/vcenter/template_rollback/' + template_id; + $.ajax({ + url: path, + type: "POST", + data: {timeout: false}, + dataType: "json", + success: function(response){ + VCenterCommon.importFailure({ + context : row_context, + message : Locale.tr("Could not import the template due to " + error_message + ". A rollback has been applied.") + }); + }, + error: function(response){ + VCenterCommon.importFailure({ + context : row_context, + message : OpenNebulaError(response).error.message + }); + } + }); + } 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){ + VCenterCommon.importFailure({ + context : row_context, + message : OpenNebulaError(response).error.message + }); + Notifier.onError({}, OpenNebulaError(response)); + } + }); + } + + 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){ + VCenterCommon.importFailure({ + context : row_context, + message : OpenNebulaError(response).error.message + }); + Notifier.onError({}, OpenNebulaError(response)); + } + }); + } + } + } + + nextRollback(); + } + + function import_images_and_nets(disks_and_nets, row_context, template_id) { + var index = 0; + var template = ""; + var rollback = []; + + function getNext() { + + // Update the template + if (disks_and_nets.length == index) { + var template_json = { + "extra_param": template + }; + + Sunstone.runAction('Template.append_template', template_id, template); + + VCenterCommon.importSuccess({ + context : row_context, + message : Locale.tr("Template created successfully. ID: %1$s", template_id) + }); + + } 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; + template += "DISK=[\n"; + template += "IMAGE_ID=\"" + image_id + "\",\n"; + template += "IMAGE_UNAME=\"" + image_uname + "\",\n"; + template += "OPENNEBULA_MANAGED=\"NO\"\n"; + template += "]\n"; + + 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 + VCenterCommon.importFailure({ + context : row_context, + message : (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")) + }); + + rollback_nics_and_disk(error_json.error.message, template_id, rollback, row_context); + } + }); + } + + 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; + template += "NIC=[\n"; + template += "NETWORK_ID=\"" + network_id + "\",\n"; + template += "OPENNEBULA_MANAGED=\"NO\"\n"; + template += "]\n"; + var rollback_info = { type: "NETWORK", id: network_id}; + rollback.push(rollback_info); + getNext(); + }, + error: function (request, error_json) { + // Rollback + VCenterCommon.importFailure({ + context : row_context, + message : (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")) + }); + + 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 _import(context) { that = this; $.each($(".vcenter_import_table", context), function() { @@ -214,35 +408,44 @@ define(function(require) { } if($(this).data("import_data").import_disks_and_nics){ - VCenterCommon.importLoading({ - context : row_context, - message : Locale.tr("Importing images and vnets associated to template disks and nics...") - }); - var path = '/vcenter/template/' + $(this).data("import_data").vcenter_ref; - $.ajax({ - url: path, - type: "GET", - data: {timeout: false}, - headers: { - "X-VCENTER-USER": that.opts.vcenter_user, - "X-VCENTER-PASSWORD": that.opts.vcenter_password, - "X-VCENTER-HOST": that.opts.vcenter_host - }, - dataType: "json", - success: function(response){ - template += "\n" + response.one; var template_json = { - "vmtemplate": { - "template_raw": template - } + "vmtemplate": { "template_raw": template } }; + + var vcenter_ref = $(this).data("import_data").vcenter_ref; + OpenNebulaTemplate.create({ timeout: true, data: template_json, success: function(request, response) { - VCenterCommon.importSuccess({ - context : row_context, - message : Locale.tr("Template created successfully. ID: %1$s", response.VMTEMPLATE.ID) + VCenterCommon.importLoading({ + context : row_context, + message : Locale.tr("Importing images and vnets associated to template disks and nics...") + }); + template_id = response.VMTEMPLATE.ID; + var path = '/vcenter/template/' + vcenter_ref + '/' + template_id; + + $.ajax({ + url: path, + type: "GET", + data: {timeout: false}, + headers: { + "X-VCENTER-USER": that.opts.vcenter_user, + "X-VCENTER-PASSWORD": that.opts.vcenter_password, + "X-VCENTER-HOST": that.opts.vcenter_host + }, + dataType: "json", + success: function(response){ + var disks_and_nets = response.disks.concat(response.nics) + import_images_and_nets(disks_and_nets, row_context, template_id) + }, + error: function(response){ + VCenterCommon.importFailure({ + context : row_context, + message : OpenNebulaError(response).error.message + }); + Notifier.onError({}, OpenNebulaError(response)); + } }); }, error: function (request, error_json) { @@ -251,17 +454,8 @@ define(function(require) { message : (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")) }); } - }); - }, - error: function(response){ - VCenterCommon.importFailure({ - context : row_context, - message : OpenNebulaError(response).error.message - }); - Notifier.onError({}, OpenNebulaError(response)); - } - }); - } + }); + } else { var template_json = { "vmtemplate": { diff --git a/src/sunstone/public/app/utils/vcenter/templates/row.hbs b/src/sunstone/public/app/utils/vcenter/templates/row.hbs index 5e6c3e12b7..77c7591257 100644 --- a/src/sunstone/public/app/utils/vcenter/templates/row.hbs +++ b/src/sunstone/public/app/utils/vcenter/templates/row.hbs @@ -25,7 +25,7 @@