diff --git a/src/sunstone/public/app/tabs/vms-tab.js b/src/sunstone/public/app/tabs/vms-tab.js index 4554886d82..9b51ec0734 100644 --- a/src/sunstone/public/app/tabs/vms-tab.js +++ b/src/sunstone/public/app/tabs/vms-tab.js @@ -14,7 +14,8 @@ define(function(require) { require('./vms-tab/dialogs/attach-disk'), require('./vms-tab/dialogs/attach-nic'), require('./vms-tab/dialogs/snapshot'), - require('./vms-tab/dialogs/vnc') + require('./vms-tab/dialogs/vnc'), + require('./vms-tab/dialogs/spice') ]; var _panels = [ diff --git a/src/sunstone/public/app/tabs/vms-tab/actions.js b/src/sunstone/public/app/tabs/vms-tab/actions.js index 2c182d5b7e..244a0b7984 100644 --- a/src/sunstone/public/app/tabs/vms-tab/actions.js +++ b/src/sunstone/public/app/tabs/vms-tab/actions.js @@ -5,12 +5,14 @@ define(function(require) { var OpenNebulaVM = require('opennebula/vm'); var CommonActions = require('utils/common-actions'); var Vnc = require('utils/vnc'); + var Vnc = require('utils/spice'); var TAB_ID = require('./tabId'); var CREATE_DIALOG_ID = require('./form-panels/create/formPanelId'); var DEPLOY_DIALOG_ID = require('./dialogs/deploy/dialogId'); var MIGRATE_DIALOG_ID = require('./dialogs/migrate/dialogId'); var VNC_DIALOG_ID = require('./dialogs/vnc/dialogId'); + var SPICE_DIALOG_ID = require('./dialogs/spice/dialogId'); var XML_ROOT = "VM"; var RESOURCE = "VM"; @@ -114,6 +116,34 @@ define(function(require) { }, notify: true }, + "VM.startspice" : { + type: "custom", + call: function() { + $.each(Sunstone.getDataTable(TAB_ID).elements(), function(index, elem) { + if (!Vnc.lockStatus()) { + Spice.lock(); + Sunstone.runAction("VM.startspice_action", elem); + } else { + Notifier.notifyError(Locale.tr("VNC Connection in progress")) + return false; + } + }); + } + }, + "VM.startspice_action" : { + type: "single", + call: OpenNebulaVM.vnc, + callback: function(request, response) { + var dialog = Sunstone.getDialog(SPICE_DIALOG_ID); + dialog.setElement(response); + dialog.show(); + }, + error: function(req, resp) { + Notifier.onError(req, resp); + Spice.unlock(); + }, + notify: true + }, //"VM.startspice" : { // type: "custom", // call: function() { diff --git a/src/sunstone/public/app/tabs/vms-tab/datatable.js b/src/sunstone/public/app/tabs/vms-tab/datatable.js index bb67d297f6..5993c246dd 100644 --- a/src/sunstone/public/app/tabs/vms-tab/datatable.js +++ b/src/sunstone/public/app/tabs/vms-tab/datatable.js @@ -12,6 +12,7 @@ define(function(require) { var StateActions = require('./utils/state-actions'); var Sunstone = require('sunstone'); var Vnc = require('utils/vnc'); + var Spice = require('utils/spice'); var Notifier = require('utils/notifier'); /* @@ -156,7 +157,7 @@ define(function(require) { var vmId = $(this).attr('vm_id'); if (!Vnc.lockStatus()) { - Vnc.lock(); + Spice.lock(); Sunstone.runAction("VM.startvnc_action", vmId); } else { Notifier.notifyError(tr("VNC Connection in progress")) @@ -164,5 +165,18 @@ define(function(require) { return false; }); + + $('#' + this.dataTableId).on("click", '.spice', function() { + var vmId = $(this).attr('vm_id'); + + if (!Spice.lockStatus()) { + Spice.lock(); + Sunstone.runAction("VM.startspice_action", vmId); + } else { + Notifier.notifyError(tr("SPICE Connection in progress")) + } + + return false; + }); } }); diff --git a/src/sunstone/public/app/tabs/vms-tab/dialogs/spice.js b/src/sunstone/public/app/tabs/vms-tab/dialogs/spice.js new file mode 100644 index 0000000000..2b1429ef93 --- /dev/null +++ b/src/sunstone/public/app/tabs/vms-tab/dialogs/spice.js @@ -0,0 +1,74 @@ +define(function(require) { + /* + DEPENDENCIES + */ + + var BaseDialog = require('utils/dialogs/dialog'); + var TemplateHTML = require('hbs!./spice/html'); + var Sunstone = require('sunstone'); + var Spice = require('utils/spice'); + + /* + CONSTANTS + */ + + var DIALOG_ID = require('./spice/dialogId'); + var TAB_ID = require('../tabId') + + /* + CONSTRUCTOR + */ + + function Dialog() { + this.dialogId = DIALOG_ID; + + BaseDialog.call(this); + }; + + Dialog.DIALOG_ID = DIALOG_ID; + Dialog.prototype = Object.create(BaseDialog.prototype); + Dialog.prototype.constructor = Dialog; + Dialog.prototype.html = _html; + Dialog.prototype.onShow = _onShow; + Dialog.prototype.onClose = _onClose; + Dialog.prototype.setup = _setup; + Dialog.prototype.setElement = _setElement; + + return Dialog; + + /* + FUNCTION DEFINITIONS + */ + + function _html() { + return TemplateHTML({ + 'dialogId': this.dialogId + }); + } + + function _setup(context) { + var that = this; + + $("#open_in_a_new_window_spice", context).on("click", function() { + var dialog = Sunstone.getDialog(DIALOG_ID); + dialog.hide(); + }); + + return false; + } + + function _onShow(context) { + Spice.spiceCallback(this.element); + return false; + } + + function _onClose(context) { + Spice.disconnect(); + Spice.unlock(); + return false; + } + + function _setElement(element) { + this.element = element + } +}); diff --git a/src/sunstone/public/app/tabs/vms-tab/dialogs/spice/dialogId.js b/src/sunstone/public/app/tabs/vms-tab/dialogs/spice/dialogId.js new file mode 100644 index 0000000000..4ecd362c10 --- /dev/null +++ b/src/sunstone/public/app/tabs/vms-tab/dialogs/spice/dialogId.js @@ -0,0 +1,3 @@ +define(function(require) { + return 'spiceVMDialog'; +}); diff --git a/src/sunstone/public/app/tabs/vms-tab/dialogs/spice/html.hbs b/src/sunstone/public/app/tabs/vms-tab/dialogs/spice/html.hbs new file mode 100644 index 0000000000..84814697b9 --- /dev/null +++ b/src/sunstone/public/app/tabs/vms-tab/dialogs/spice/html.hbs @@ -0,0 +1,19 @@ +
\ No newline at end of file