diff --git a/src/sunstone/public/app/tabs/vnets-tab.js b/src/sunstone/public/app/tabs/vnets-tab.js
index f8f0eb102e..1c76a04be1 100644
--- a/src/sunstone/public/app/tabs/vnets-tab.js
+++ b/src/sunstone/public/app/tabs/vnets-tab.js
@@ -21,8 +21,9 @@ define(function(require) {
];
var _formPanels = [
- require('./vnets-tab/form-panels/create')
- ]
+ require('./vnets-tab/form-panels/create'),
+ require('./vnets-tab/form-panels/import')
+ ];
var VNetsTab = {
tabId: TAB_ID,
diff --git a/src/sunstone/public/app/tabs/vnets-tab/actions.js b/src/sunstone/public/app/tabs/vnets-tab/actions.js
index bfcabb05ac..5bc414353c 100644
--- a/src/sunstone/public/app/tabs/vnets-tab/actions.js
+++ b/src/sunstone/public/app/tabs/vnets-tab/actions.js
@@ -12,6 +12,7 @@ define(function(require) {
var ADD_AR_DIALOG_ID = require('./dialogs/add-ar/dialogId');
var UPDATE_AR_DIALOG_ID = require('./dialogs/update-ar/dialogId');
var RESERVE_DIALOG_ID = require('./dialogs/reserve/dialogId');
+ var IMPORT_DIALOG_ID = require('./form-panels/import/formPanelId');
var _actions = {
"Network.create" : {
@@ -36,15 +37,12 @@ define(function(require) {
}
},
- // TODO
- /*
"Network.import_dialog" : {
- type: "create",
- call: function(){
- popUpNetworkImportDialog();
+ type: "custom",
+ call: function() {
+ Sunstone.showFormPanel(TAB_ID, IMPORT_DIALOG_ID, "import");
}
},
- */
"Network.list" : {
type: "list",
diff --git a/src/sunstone/public/app/tabs/vnets-tab/form-panels/import.js b/src/sunstone/public/app/tabs/vnets-tab/form-panels/import.js
new file mode 100644
index 0000000000..79bc71d47f
--- /dev/null
+++ b/src/sunstone/public/app/tabs/vnets-tab/form-panels/import.js
@@ -0,0 +1,104 @@
+define(function(require) {
+ /*
+ DEPENDENCIES
+ */
+
+ require('foundation.tab');
+ var BaseFormPanel = require('utils/form-panels/form-panel');
+ var Sunstone = require('sunstone');
+ var Locale = require('utils/locale');
+ var VCenterNetworks = require('utils/vcenter/networks');
+
+ /*
+ TEMPLATES
+ */
+
+ var TemplateHTML = require('hbs!./import/html');
+
+ /*
+ CONSTANTS
+ */
+
+ var FORM_PANEL_ID = require('./import/formPanelId');
+ var TAB_ID = require('../tabId');
+
+ /*
+ CONSTRUCTOR
+ */
+
+ function FormPanel() {
+ this.formPanelId = FORM_PANEL_ID;
+ this.tabId = TAB_ID;
+ this.actions = {
+ 'import': {
+ 'title': Locale.tr("Import vCenter Networks"),
+ 'buttonText': Locale.tr("Import"),
+ 'resetButton': true
+ }
+ };
+
+ this.vCenterNetworks = new VCenterNetworks();
+
+ BaseFormPanel.call(this);
+ }
+
+ FormPanel.FORM_PANEL_ID = FORM_PANEL_ID;
+ FormPanel.prototype = Object.create(BaseFormPanel.prototype);
+ FormPanel.prototype.constructor = FormPanel;
+ FormPanel.prototype.htmlWizard = _htmlWizard;
+ FormPanel.prototype.submitWizard = _submitWizard;
+ FormPanel.prototype.onShow = _onShow;
+ FormPanel.prototype.setup = _setup;
+
+ return FormPanel;
+
+ /*
+ FUNCTION DEFINITIONS
+ */
+
+ function _htmlWizard() {
+ return TemplateHTML({
+ 'formPanelId': this.formPanelId,
+ 'vcenterNetworksHTML': this.vCenterNetworks.html()
+ });
+ }
+
+ function _setup(context) {
+ var that = this;
+
+ Sunstone.disableFormPanelSubmit(TAB_ID);
+
+ $("#get_vcenter_networks", context).on("click", function(){
+ Sunstone.enableFormPanelSubmit(TAB_ID);
+
+ var vcenter_user = $("#vcenter_user", context).val();
+ var vcenter_password = $("#vcenter_password", context).val();
+ var vcenter_host = $("#vcenter_host", context).val();
+
+ that.vCenterNetworks.insert({
+ container: context,
+ vcenter_user: vcenter_user,
+ vcenter_password: vcenter_password,
+ vcenter_host: vcenter_host
+ });
+
+ return false;
+ });
+
+ return false;
+ }
+
+ function _submitWizard(context) {
+ var that = this;
+
+ Sunstone.hideFormPanelLoading(TAB_ID);
+ Sunstone.disableFormPanelSubmit(TAB_ID);
+
+ this.vCenterNetworks.import();
+
+ return false;
+ }
+
+ function _onShow(context) {
+ }
+});
diff --git a/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/advanced.hbs b/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/advanced.hbs
new file mode 100644
index 0000000000..451477cf0b
--- /dev/null
+++ b/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/advanced.hbs
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/formPanelId.js b/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/formPanelId.js
new file mode 100644
index 0000000000..27a3b233c0
--- /dev/null
+++ b/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/formPanelId.js
@@ -0,0 +1,3 @@
+define(function(require){
+ return 'importVNetForm';
+});
\ No newline at end of file
diff --git a/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/html.hbs b/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/html.hbs
new file mode 100644
index 0000000000..b39c57a89f
--- /dev/null
+++ b/src/sunstone/public/app/tabs/vnets-tab/form-panels/import/html.hbs
@@ -0,0 +1,29 @@
+
\ No newline at end of file
diff --git a/src/sunstone/public/app/utils/vcenter/networks.js b/src/sunstone/public/app/utils/vcenter/networks.js
new file mode 100644
index 0000000000..5a146375e7
--- /dev/null
+++ b/src/sunstone/public/app/utils/vcenter/networks.js
@@ -0,0 +1,305 @@
+define(function(require) {
+ // Dependencies
+ var Locale = require('utils/locale');
+ var OpenNebulaNetwork = require('opennebula/network');
+ var OpenNebulaError = require('opennebula/error');
+
+ var TemplateHTML = require('hbs!./networks/html');
+
+ function VCenterNetworks() {
+ return this;
+ }
+
+ VCenterNetworks.prototype = {
+ 'html': _html,
+ 'insert': _fillVCenterNetworks,
+ 'import': _import
+ };
+ VCenterNetworks.prototype.constructor = VCenterNetworks;
+
+ return VCenterNetworks;
+
+ function _html() {
+ return '
';
+ }
+
+ /*
+ Retrieve the list of networks from vCenter and fill the container with them
+
+ opts = {
+ datacenter: "Datacenter Name",
+ cluster: "Cluster Name",
+ container: Jquery div to inject the html,
+ vcenter_user: vCenter Username,
+ vcenter_password: vCenter Password,
+ vcenter_host: vCenter Host
+ }
+ */
+ function _fillVCenterNetworks(opts) {
+ var path = '/vcenter/networks';
+
+ var context = $(".vcenter_networks", opts.container);
+
+ context.html( TemplateHTML({}) );
+
+ context.show();
+
+ $(".accordion_advanced_toggle", context).trigger("click");
+
+ $.ajax({
+ url: path,
+ type: "GET",
+ data: {timeout: false},
+ dataType: "json",
+ headers: {
+ "X_VCENTER_USER": opts.vcenter_user,
+ "X_VCENTER_PASSWORD": opts.vcenter_password,
+ "X_VCENTER_HOST": opts.vcenter_host
+ },
+ success: function(response){
+ $(".content", context).html("");
+
+ $('
' +
+ '
' +
+ '
' + Locale.tr("Please select the vCenter Networks to be imported to OpenNebula.") + '
' +
+ '
' +
+ '
').appendTo($(".content", context))
+
+ $.each(response, function(datacenter_name, networks){
+ $('
' +
+ '
' +
+ '
' +
+ datacenter_name + ' ' + Locale.tr("DataCenter") +
+ '
' +
+ '' +
+ '
').appendTo($(".content", context))
+
+ if (networks.length == 0) {
+ $('
' +
+ '
' +
+ '' +
+ '
' +
+ '
').appendTo($(".content", context))
+ } else {
+ $.each(networks, function(id, network){
+ var netname = network.name.replace(" ","_");
+ var vlan_info = ""
+
+ if (network.vlan) {
+ var vlan_info = '
' +
+ '
'+
+ ''+
+ '
'+
+ '
';
+ }
+
+ var trow = $('
' +
+ '
' +
+ '
' +
+ '
' +
+ '' +
+ '
'+
+ '
'+
+ '' +
+ '
'+
+ '
'+
+ '' +
+ '
'+
+ '
' +
+ '
'+
+ ''+
+ '
'+
+ '
'+
+ vlan_info +
+ '
'+
+ '
'+
+ '
' +
+ '
'+
+ '
'+
+ '
'+
+ '
').appendTo($(".content", context))
+
+
+ $('.type_select', trow).on("change",function(){
+ var network_context = $(this).closest(".vcenter_network");
+ var type = $(this).val();
+
+ var net_form_str = ''
+
+ switch(type) {
+ case 'ETHER':
+ net_form_str =
+ '
'+
+ ''+
+ '
';
+ break;
+ case 'IP4':
+ net_form_str =
+ '
'+
+ ''+
+ '
'+
+ '
'+
+ ''+
+ '
';
+ break;
+ case 'IP6':
+ net_form_str =
+ '
'+
+ ''+
+ '
'+
+ '
'+
+ ''+
+ '
'+
+ '
'+
+ ''+
+ '
';
+ break;
+ }
+
+ $('.net_options', network_context).html(net_form_str);
+ });
+
+ $(".network_name", trow).data("network_name", netname)
+ $(".network_name", trow).data("one_network", network.one)
+ });
+ };
+ });
+ },
+ error: function(response){
+ context.hide();
+ Notifier.onError({}, OpenNebulaError(response));
+ }
+ });
+ }
+
+ function _import(context) {
+ $.each($(".network_name:checked", context), function() {
+ var network_context = $(this).closest(".vcenter_network");
+
+ $(".vcenter_network_result:not(.success)", network_context).html(
+ '
' +
+ '' +
+ '' +
+ '');
+
+ var network_size = $(".netsize", network_context).val();
+ var network_tmpl = $(this).data("one_network");
+ var netname = $(this).data("network_name");
+ var type = $('.type_select', network_context).val();
+
+ var ar_array = [];
+ ar_array.push("TYPE=" + type);
+ ar_array.push("SIZE=" + network_size);
+
+ switch (type) {
+ case 'ETHER':
+ var mac = $('.eth_mac_net', network_context).val();
+
+ if (mac) {
+ ar_array.push("MAC=" + mac);
+ }
+
+ break;
+ case 'IP4':
+ var mac = $('.four_mac_net', network_context).val();
+ var ip = $('.four_ip_net', network_context).val();
+
+ if (mac) {
+ ar_array.push("MAC=" + mac);
+ }
+ if (ip) {
+ ar_array.push("IP=" + ip);
+ }
+
+ break;
+ case 'IP6':
+ var mac = $('.six_mac_net', network_context).val();
+ var gp = $('.six_global_net', network_context).val();
+ var ula = $('.six_mac_net', network_context).val();
+
+ if (mac) {
+ ar_array.push("MAC=" + mac);
+ }
+ if (gp) {
+ ar_array.push("GLOBAL_PREFIX=" + gp);
+ }
+ if (ula) {
+ ar_array.push("ULA_PREFIX=" + ula);
+ }
+
+ break;
+ }
+
+ network_tmpl += "\nAR=["
+ network_tmpl += ar_array.join(",\n")
+ network_tmpl += "]"
+
+ if ($(".vlaninfo", network_context)) {
+ network_tmpl += "VLAN=\"YES\"\n";
+ network_tmpl += "VLAN_ID=" + $(".vlaninfo", network_context).val() + "\n";
+ }
+
+ var vnet_json = {
+ "vnet": {
+ "vnet_raw": network_tmpl
+ }
+ };
+
+ OpenNebulaNetwork.create({
+ timeout: true,
+ data: vnet_json,
+ success: function(request, response) {
+ $(".vcenter_network_result", network_context).addClass("success").html(
+ '
' +
+ '' +
+ '' +
+ '');
+
+ $(".vcenter_network_response", network_context).html('
' +
+ Locale.tr("Virtual Network created successfully") + ' ID:' + response.VNET.ID +
+ '
');
+ },
+ error: function (request, error_json) {
+ $(".vcenter_network_result", network_context).html('
' +
+ '' +
+ '' +
+ '');
+
+ $(".vcenter_network_response", network_context).html('
' +
+ (error_json.error.message || Locale.tr("Cannot contact server: is it running and reachable?")) +
+ '
');
+ }
+ });
+ });
+
+ }
+});
\ No newline at end of file
diff --git a/src/sunstone/public/app/utils/vcenter/networks/html.hbs b/src/sunstone/public/app/utils/vcenter/networks/html.hbs
new file mode 100644
index 0000000000..7cd79dddfc
--- /dev/null
+++ b/src/sunstone/public/app/utils/vcenter/networks/html.hbs
@@ -0,0 +1,6 @@
+{{#advancedSection (tr "Networks") }}
+
+
+
+
+{{/advancedSection}}