1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-13 12:58:17 +03:00

F #4913: Changes and fixes in Sunstone for vcenter (importer, allow some VCENTER_ attributes edition

This commit is contained in:
mcabrerizo 2017-06-11 19:33:23 +02:00
parent 03b52f4b28
commit d0e16dc79e
15 changed files with 676 additions and 134 deletions

View File

@ -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 {

View File

@ -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)';

View File

@ -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"));
}
});
}
});
});

View File

@ -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');

View File

@ -202,6 +202,12 @@
</label>
</div>
</div>
<div class="row">
<div class="medium-6 columns left mode_param vcenter">
<label for="vcenter_cluster_id">{{tr "OpenNebula's Host ID"}}</label>
<div id="vcenter_cluster_id" name="vcenter_cluster_id"></div>
</div>
</div>
</div>
<div class="tabs-panel" id="vnetCreateARTab">
<div class="row collapse" id="vnetCreateARTabCreate">

View File

@ -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 : [
'<input type="checkbox" class="check_all"/>',
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 = '<select class="select_rp"><option></option>';
if(cluster.rp_list.length > 0){
for(var i = 0; i < cluster.rp_list.length; i++){
@ -109,7 +113,7 @@ define(function(require) {
}
}
rp_list += '</select>';
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?"))
});
}
});
});
});
}

View File

@ -19,6 +19,7 @@
<input type="checkbox" class="check_item"/>
</td>
<td>{{name}}</td>
<td>{{location}}</td>
<td>
<span class="vcenter_import_result">
</span>&nbsp;

View File

@ -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 : [
'<input type="checkbox" class="check_all"/>',
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) {

View File

@ -19,6 +19,8 @@
<input type="checkbox" class="check_item"/>
</td>
<td>{{name}}</td>
<td>{{total_mb}}</td>
<td>{{free_mb}}</td>
<td>{{cluster}}</td>
<td>
<span class="vcenter_import_result">

View File

@ -93,8 +93,9 @@ define(function(require) {
toggleAdvanced : false,
columns : [
'<input type="checkbox" class="check_all"/>',
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);

View File

@ -19,7 +19,8 @@
<input type="checkbox" class="check_item"/>
</td>
<td>{{name}}</td>
<td>{{humanizeSize "KB" size}}</td>
<td>{{humanizeSize "MB" size}}</td>
<td>{{type}}</td>
<td>
<span class="vcenter_import_result">
</span>&nbsp;

View File

@ -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({

View File

@ -27,6 +27,9 @@
</a>
{{data.name}}
- <i>{{data.type}}</i>
- Cluster: <i>{{data.cluster}}</i>
- Location: <i>{{data.cluster_location}}</i>
- OpenNebula Cluster ID: <i>{{data.one_cluster_id}}</i>
{{#if data.vlan}} - <i>VLAN: <span class="vlaninfo">{{data.vlan}}</span></i>{{/if}}
</label>
</div>

View File

@ -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": {

View File

@ -25,7 +25,7 @@
<label class="inline">
<a href="#{{data.vcenter_ref}}Advanced" class="accordion_advanced_toggle"> <i class="fa fa-fw fa-chevron-down"/><i class="fa fa-fw fa-chevron-up"/>
</a>
{{data.name}}
{{data.sunstone_template_name}}
</label>
</div>
</div>