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:
parent
03b52f4b28
commit
d0e16dc79e
@ -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 {
|
||||
|
@ -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)';
|
||||
|
@ -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"));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -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');
|
||||
|
||||
|
@ -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">
|
||||
|
@ -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?"))
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -19,6 +19,7 @@
|
||||
<input type="checkbox" class="check_item"/>
|
||||
</td>
|
||||
<td>{{name}}</td>
|
||||
<td>{{location}}</td>
|
||||
<td>
|
||||
<span class="vcenter_import_result">
|
||||
</span>
|
||||
|
@ -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) {
|
||||
|
@ -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">
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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({
|
||||
|
@ -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>
|
||||
|
@ -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": {
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user