diff --git a/src/sunstone/public/app/tabs/provision-tab.js b/src/sunstone/public/app/tabs/provision-tab.js
index 19a38e4f83..2c91d3fd95 100644
--- a/src/sunstone/public/app/tabs/provision-tab.js
+++ b/src/sunstone/public/app/tabs/provision-tab.js
@@ -17,6 +17,7 @@ define(function(require) {
var Graphs = require('utils/graphs');
var RangeSlider = require('utils/range-slider');
var DisksResize = require('utils/disks-resize');
+ var NicsSection = require('utils/nics-section');
var ProvisionQuotaWidget = require('./provision-tab/users/quota-widget');
@@ -477,204 +478,6 @@ define(function(require) {
}
}
- var provision_nic_accordion_id = 0;
- var provision_nic_accordion_dd_id = 0;
-
- function generate_provision_network_table(context, nic, vnet_attr){
- context.off();
- var nic_span;
-
- if (nic) {
- nic_span = ''+
- '' + Locale.tr("INTERFACE") + " " +
- '' + (nic.NETWORK||nic.NETWORK_ID) + "" +
- ''+
- ''+
- ''+
- ''+
- ''+
- ''+
- '';
- } else if (vnet_attr) {
- nic_span = '' + vnet_attr.description + "
"+
- ''+
- '' + Locale.tr("INTERFACE") + " " +
- '' + Locale.tr("Select a Network") + "" +
- ''+
- ''+
- Locale.tr("Select a Network for this interface")+
- ''+
- ''+
- ''+
- '';
- } else {
- nic_span =
- ''+
- '' + Locale.tr("INTERFACE") + " " +
- '' + Locale.tr("Select a Network") + "" +
- ''+
- ''+
- Locale.tr("Select a Network for this interface")+
- ''+
- ''+
- ''+
- ''+
- ''+
- ''+
- '';
- }
-
- var dd_context = $('
'+
'
'+
@@ -1426,13 +1193,6 @@ define(function(require) {
var template_id = $(this).attr("opennebula_id");
var template_json = $(this).data("opennebula");
- var template_nic = template_json.VMTEMPLATE.TEMPLATE.NIC
- var nics = []
- if ($.isArray(template_nic))
- nics = template_nic
- else if (!$.isEmptyObject(template_nic))
- nics = [template_nic]
-
$(".provision_accordion_template .selected_template").show();
$(".provision_accordion_template .select_template").hide();
$(".provision_accordion_template .selected_template_name").html(template_json.VMTEMPLATE.NAME)
@@ -1455,15 +1215,8 @@ define(function(require) {
disksContext.html("");
}
- if (Config.provision.create_vm.isEnabled("network_select") && (template_json.VMTEMPLATE.TEMPLATE.SUNSTONE_NETWORK_SELECT != "NO")) {
- generate_provision_network_accordion(
- $(".provision_network_selector", create_vm_context));
-
- $.each(nics, function(index, nic){
- generate_provision_network_table(
- $(".provision_nic_accordion", create_vm_context),
- nic);
- })
+ if (Config.provision.create_vm.isEnabled("network_select")) {
+ NicsSection.insert(template_json, create_vm_context);
} else {
$(".provision_network_selector", create_vm_context).html("");
}
@@ -1490,36 +1243,17 @@ define(function(require) {
$("#provision_create_vm").submit(function(){
var context = $(this);
- var vm_name = $("#vm_name", context).val();
var template_id = $(".tabs-content .content.active .selected", context).attr("opennebula_id");
-
- var nics = [];
- var nic;
- $(".selected_network", context).each(function(){
- if ($(this).attr("template_nic")) {
- nic = JSON.parse($(this).attr("template_nic"))
- } else if ($(this).attr("opennebula_id")) {
- nic = {
- 'network_id': $(this).attr("opennebula_id")
- }
- } else {
- nic = undefined;
- }
-
- if (nic) {
- nics.push(nic);
- }
- });
-
- var disks = DisksResize.retrieve($(".provision_disk_selector", context));
-
- var instance_type = $(".provision_instance_types_ul .selected", context);
-
if (!template_id) {
$(".alert-box-error", context).fadeIn().html(Locale.tr("You must select at least a template configuration"));
return false;
}
+ var vm_name = $("#vm_name", context).val();
+ var nics = NicsSection.retrieve(context);
+ var disks = DisksResize.retrieve($(".provision_disk_selector", context));
+ var instance_type = $(".provision_instance_types_ul .selected", context);
+
var extra_info = {
'vm_name' : vm_name,
'template': {
diff --git a/src/sunstone/public/app/utils/nics-section.js b/src/sunstone/public/app/utils/nics-section.js
new file mode 100644
index 0000000000..e3a3aad92d
--- /dev/null
+++ b/src/sunstone/public/app/utils/nics-section.js
@@ -0,0 +1,285 @@
+define(function(require) {
+ var Locale = require('utils/locale');
+ var Notifier = require('utils/notifier');
+ var OpenNebula = require('opennebula');
+
+ var provision_nic_accordion_id = 0;
+ var provision_nic_accordion_dd_id = 0;
+
+ return {
+ 'insert': _insert,
+ 'retrieve': _retrieve
+ }
+
+ function _insert(template_json, context) {
+ if (template_json.VMTEMPLATE.TEMPLATE.SUNSTONE_NETWORK_SELECT != "NO") {
+ var template_nic = template_json.VMTEMPLATE.TEMPLATE.NIC
+ var nics = []
+ if ($.isArray(template_nic))
+ nics = template_nic
+ else if (!$.isEmptyObject(template_nic))
+ nics = [template_nic]
+
+ generate_provision_network_accordion(
+ $(".provision_network_selector", context));
+
+ $.each(nics, function(index, nic) {
+ generate_provision_network_table(
+ $(".provision_nic_accordion", context),
+ nic);
+ })
+ }
+ }
+
+ function _retrieve(context) {
+ var nics = [];
+ var nic;
+ $(".selected_network", context).each(function() {
+ if ($(this).attr("template_nic")) {
+ nic = JSON.parse($(this).attr("template_nic"))
+ } else if ($(this).attr("opennebula_id")) {
+ nic = {
+ 'network_id': $(this).attr("opennebula_id")
+ }
+ } else {
+ nic = undefined;
+ }
+
+ if (nic) {
+ nics.push(nic);
+ }
+ });
+
+ return nics
+ }
+
+ function generate_provision_network_table(context, nic, vnet_attr) {
+ context.off();
+ var nic_span;
+
+ if (nic) {
+ nic_span = '' +
+ '' + Locale.tr("INTERFACE") + " " +
+ '' + (nic.NETWORK || nic.NETWORK_ID) + "" +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '';
+ } else if (vnet_attr) {
+ nic_span = '' + vnet_attr.description + "
" +
+ '' +
+ '' + Locale.tr("INTERFACE") + " " +
+ '' + Locale.tr("Select a Network") + "" +
+ '' +
+ '' +
+ Locale.tr("Select a Network for this interface") +
+ '' +
+ '' +
+ '' +
+ '';
+ } else {
+ nic_span =
+ '' +
+ '' + Locale.tr("INTERFACE") + " " +
+ '' + Locale.tr("Select a Network") + "" +
+ '' +
+ '' +
+ Locale.tr("Select a Network for this interface") +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '';
+ }
+
+ var dd_context = $('' +
+ '' +
+ nic_span +
+ '' +
+ '' +
+ '
' +
+ '
' +
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '' +
+ '' +
+ '' + Locale.tr("ID") + ' | ' +
+ '' + Locale.tr("Name") + ' | ' +
+ '
' +
+ '' +
+ '' +
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '').appendTo(context);
+
+ provision_nic_accordion_dd_id += 1;
+
+ var provision_networks_datatable = $('.provision_networks_table', dd_context).dataTable({
+ "iDisplayLength": 6,
+ "sDom" : '<"H">t<"F"lp>',
+ "aLengthMenu": [[6, 12, 36, 72], [6, 12, 36, 72]],
+ "aoColumnDefs": [
+ {"bVisible": false, "aTargets": ["all"]}
+ ],
+ "aoColumns": [
+ {"mDataProp": "VNET.ID"},
+ {"mDataProp": "VNET.NAME"}
+ ],
+ "fnPreDrawCallback": function (oSettings) {
+ // create a thumbs container if it doesn't exist. put it in the dataTables_scrollbody div
+ if (this.$('tr', {"filter": "applied"}).length == 0) {
+ this.html('' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '
' +
+ '
' +
+ '' +
+ Locale.tr("There are no networks available. Please contact your cloud administrator") +
+ '' +
+ '
');
+ } else {
+ $(".provision_networks_table", dd_context).html(
+ '');
+ }
+
+ return true;
+ },
+ "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
+ var data = aData.VNET;
+ $(".provision_networks_ul", dd_context).append(
+ '' +
+ '' +
+ '- ' +
+ data.NAME +
+ '
' +
+ '- ' +
+ '' +
+ '
' +
+ '- ' +
+ (data.TEMPLATE.DESCRIPTION || '...') +
+ '
' +
+ '
' +
+ '');
+
+ return nRow;
+ }
+ });
+
+ $('.provision-search-input', dd_context).on('input', function() {
+ provision_networks_datatable.fnFilter($(this).val());
+ })
+
+ dd_context.on("click", ".provision-pricing-table.more-than-one" , function() {
+ $(".selected_network", dd_context).html(
+ '' + Locale.tr("INTERFACE") + " " +
+ '' + $(this).attr("opennebula_name") + "");
+
+ $(".selected_network", dd_context).attr("opennebula_id", $(this).attr("opennebula_id"))
+ $(".selected_network", dd_context).removeAttr("template_nic")
+
+ $('a', dd_context).first().trigger("click");
+ })
+
+ dd_context.on("click", ".provision_remove_nic" , function() {
+ dd_context.remove();
+ return false;
+ });
+
+ if (!nic && !vnet_attr) {
+ $('a', dd_context).trigger("click");
+ }
+
+ update_provision_networks_datatable(provision_networks_datatable);
+ }
+
+ function generate_provision_network_accordion(context, hide_add_button) {
+ context.off();
+ context.html(
+ '
' +
+ '' +
+ '
' +
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ '' +
+ '
')
+
+ provision_nic_accordion_id += 1;
+
+ $(".provision_add_network_interface", context).on("click", function() {
+ generate_provision_network_table($(".accordion", context));
+ })
+
+ $(document).foundation();
+ }
+
+ function update_provision_networks_datatable(datatable) {
+ datatable.html('' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '
' +
+ '
' +
+ '' +
+ '' +
+ '
');
+
+ OpenNebula.Network.list({
+ timeout: true,
+ success: function (request, item_list) {
+ datatable.fnClearTable(true);
+ if (item_list.length == 0) {
+ datatable.html('' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '
' +
+ '
' +
+ '' +
+ Locale.tr("There are no networks available.") +
+ '' +
+ '
');
+ } else {
+ datatable.fnAddData(item_list);
+ }
+ },
+ error: Notifier.onError
+ });
+ }
+})