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 = $('
'+ - ''+ - nic_span + - ''+ - '
'+ - '
'+ - '
'+ - '

'+ - ''+ - '

'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
').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( - '
    '+ - '
    '+ - '
    '+ - '

    '+ - ''+ - ' '+ - Locale.tr("Network")+ - ''+ - '

    '+ - '
    '+ - '
    '+ - '
    '+ - '
    '+ - ''+ - '
    '+ - '
    ') - - provision_nic_accordion_id += 1; - - $(".provision_add_network_interface", context).on("click", function(){ - generate_provision_network_table($(".accordion", context)); - }) - - $(document).foundation(); - } - function show_provision_dashboard() { $(".section_content").hide(); $("#provision_dashboard").fadeIn(); @@ -1096,42 +899,6 @@ define(function(require) { } } - 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 - }); - } - function update_provision_flow_templates_datatable(datatable, timeout) { datatable.html('
    '+ ''+ @@ -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 + + '' + + '
    ' + + '
    ' + + '
    ' + + '

    ' + + '' + + '

    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ').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( + '
    ' + + '
    ' + + '
    ' + + '

    ' + + '' + + ' ' + + Locale.tr("Network") + + '' + + '

    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '' + + '
    ' + + '
    ') + + 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 + }); + } +})