1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

feature #3748: Add VNC dialog

This commit is contained in:
Daniel Molina 2015-06-10 15:49:58 +02:00
parent 709d57cc0a
commit 1d339c8b20
7 changed files with 175 additions and 128 deletions

View File

@ -375,7 +375,7 @@ define(function(require) {
var action = OpenNebulaHelper.action(method);
var request = OpenNebulaHelper.request(resource, method, id);
$.ajax({
url: "vm/" + id + "/" + method,
url: "vm/" + id + "/startvnc",
type: "POST",
dataType: "json",
success: function(response) {
@ -387,9 +387,6 @@ define(function(require) {
}
});
},
"startvnc" : function(params) {
OpenNebula.VM.vnc(params, "startvnc");
},
"update": function(params) {
var action_obj = {"template_raw" : params.data.extra_param};
OpenNebulaAction.simple_action(params, RESOURCE, "update", action_obj);

View File

@ -3,7 +3,7 @@ define(function(require) {
var Buttons = require('./vms-tab/buttons');
var Actions = require('./vms-tab/actions');
var Table = require('./vms-tab/datatable');
require('utils/vnc');
var TAB_ID = require('./vms-tab/tabId');
var DATATABLE_ID = "dataTableVms";
@ -13,7 +13,8 @@ define(function(require) {
require('./vms-tab/dialogs/resize'),
require('./vms-tab/dialogs/attach-disk'),
require('./vms-tab/dialogs/attach-nic'),
require('./vms-tab/dialogs/snapshot')
require('./vms-tab/dialogs/snapshot'),
require('./vms-tab/dialogs/vnc')
];
var _panels = [

View File

@ -4,11 +4,13 @@ define(function(require) {
var Locale = require('utils/locale');
var OpenNebulaVM = require('opennebula/vm');
var CommonActions = require('utils/common-actions');
var Vnc = require('utils/vnc');
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 XML_ROOT = "VM";
var RESOURCE = "VM";
@ -58,13 +60,13 @@ define(function(require) {
"VM.create_dialog" : {
type: "custom",
call: function(){
call: function() {
Sunstone.showFormPanel(TAB_ID, CREATE_DIALOG_ID, "create");
}
},
"VM.deploy" : {
type: "custom",
call: function(){
call: function() {
Sunstone.getDialog(DEPLOY_DIALOG_ID).show();
}
},
@ -84,6 +86,50 @@ define(function(require) {
dialog.show();
}
},
"VM.startvnc" : {
type: "custom",
call: function() {
$.each(Sunstone.getDataTable(TAB_ID).elements(), function(index, elem) {
if (!Vnc.lockStatus()) {
Vnc.lock();
Sunstone.runAction("VM.startvnc_action", elem);
} else {
Notifier.notifyError(Locale.tr("VNC Connection in progress"))
return false;
}
});
}
},
"VM.startvnc_action" : {
type: "single",
call: OpenNebulaVM.vnc,
callback: function(request, response) {
var dialog = Sunstone.getDialog(VNC_DIALOG_ID);
dialog.setElement(response);
dialog.show();
},
error: function(req, resp) {
Notifier.onError(req, resp);
Vnc.unlock();
},
notify: true
},
//"VM.startspice" : {
// type: "custom",
// call: function() {
// popUpSPICE();
// }
//},
//"VM.startspice_action" : {
// type: "single",
// call: OpenNebula.VM.startvnc,
// callback: spiceCallback,
// error: function(req, resp) {
// onError(req, resp);
// spice_lock = false;
// },
// notify: true
//},
/*"VM.create" : {
type: "custom",
call: function(id, name) {
@ -129,127 +175,8 @@ define(function(require) {
notify: true
},
"VM.log" : {
type: "single",
call: OpenNebula.VM.log,
callback: function(req, res) {
//after calling VM.log we process the answer
//update the tab and pop it up again
res = res['vm_log'];
var log_lines = res.split("\n");
var colored_log = '';
for (var i = 0; i < log_lines.length; i++) {
var line = log_lines[i];
if (line.match(/\[E\]/)) {
line = '<span class="vm_log_error">' + line + '</span>';
}
colored_log += line + "<br>";
}
$('#vm_log_tab').html('<div class="row"><div class="large-11 small-centered columns log-tab">' + colored_log + '</div></div>')
},
error: function(request, error_json) {
$("#vm_log pre").html('');
onError(request, error_json);
}
},
"VM.startvnc" : {
type: "custom",
call: function() {
popUpVnc();
}
},
"VM.startspice" : {
type: "custom",
call: function() {
popUpSPICE();
}
},
"VM.startvnc_action" : {
type: "single",
call: OpenNebula.VM.startvnc,
callback: vncCallback,
error: function(req, resp) {
onError(req, resp);
vnc_lock = false;
},
notify: true
},
"VM.startspice_action" : {
type: "single",
call: OpenNebula.VM.startvnc,
callback: spiceCallback,
error: function(req, resp) {
onError(req, resp);
spice_lock = false;
},
notify: true
},
"VM.monitor" : {
type: "monitor",
call : OpenNebula.VM.monitor,
callback: function(req, response) {
var vm_graphs = [
{
monitor_resources : "CPU",
labels : "Real CPU",
humanize_figures : false,
div_graph : $(".vm_cpu_graph")
},
{
monitor_resources : "MEMORY",
labels : "Real MEM",
humanize_figures : true,
div_graph : $(".vm_memory_graph")
},
{labels : "Network reception",
monitor_resources : "NET_RX",
humanize_figures : true,
convert_from_bytes : true,
div_graph : $("#vm_net_rx_graph")
},
{labels : "Network transmission",
monitor_resources : "NET_TX",
humanize_figures : true,
convert_from_bytes : true,
div_graph : $("#vm_net_tx_graph")
},
{labels : "Network reception speed",
monitor_resources : "NET_RX",
humanize_figures : true,
convert_from_bytes : true,
y_sufix : "B/s",
derivative : true,
div_graph : $("#vm_net_rx_speed_graph")
},
{labels : "Network transmission speed",
monitor_resources : "NET_TX",
humanize_figures : true,
convert_from_bytes : true,
y_sufix : "B/s",
derivative : true,
div_graph : $("#vm_net_tx_speed_graph")
}
];
// The network speed graphs require the derivative of the data,
// and this process is done in place. They must be the last
// graphs to be processed
for (var i = 0; i < vm_graphs.length; i++) {
plot_graph(
response,
vm_graphs[i]
);
}
},
error: vmMonitorError
},
*/
};

View File

@ -10,6 +10,9 @@ define(function(require) {
var TemplateUtils = require('utils/template-utils');
var OpenNebulaVM = require('opennebula/vm');
var StateActions = require('./utils/state-actions');
var Sunstone = require('sunstone');
var Vnc = require('utils/vnc');
var Notifier = require('utils/notifier');
/*
CONSTANTS
@ -19,6 +22,7 @@ define(function(require) {
var XML_ROOT = "VM";
var TAB_NAME = require('./tabId');
/*
CONSTRUCTOR
*/
@ -73,6 +77,7 @@ define(function(require) {
Table.prototype.constructor = Table;
Table.prototype.elementArray = _elementArray;
Table.prototype.onUpdateView = _onUpdateView;
Table.prototype.initialize = _initialize;
return Table;
@ -143,4 +148,21 @@ define(function(require) {
function _onUpdateView() {
StateActions.resetStateButtons();
}
function _initialize(opts) {
TabDataTable.prototype.initialize.call(this, opts);
$('#' + this.dataTableId).on("click", '.vnc', function() {
var vmId = $(this).attr('vm_id');
if (!Vnc.lockStatus()) {
Vnc.lock();
Sunstone.runAction("VM.startvnc_action", vmId);
} else {
Notifier.notifyError(tr("VNC Connection in progress"))
}
return false;
});
}
});

View File

@ -0,0 +1,79 @@
define(function(require) {
/*
DEPENDENCIES
*/
var BaseDialog = require('utils/dialogs/dialog');
var TemplateHTML = require('hbs!./vnc/html');
var Sunstone = require('sunstone');
var Vnc = require('utils/vnc');
/*
CONSTANTS
*/
var DIALOG_ID = require('./vnc/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", context).on("click", function() {
var dialog = Sunstone.getDialog(DIALOG_ID);
dialog.hide();
});
$('#sendCtrlAltDelButton', context).click(function() {
Vnc.sendCtrlAltDel();
return false;
});
return false;
}
function _onShow(context) {
Vnc.vncCallback(this.element);
return false;
}
function _onClose(context) {
Vnc.disconnect();
Vnc.unlock();
return false;
}
function _setElement(element) {
this.element = element
}
});

View File

@ -0,0 +1,3 @@
define(function(require) {
return 'vncVMDialog';
});

View File

@ -0,0 +1,18 @@
<div id="{{dialogId}}" class="reveal-modal large max-height" style="width:auto; max-width:70%" data-reveal >
<div class="row">
<div class="large-12 columns">
<h3 class="subheader" id="vnc_dialog">
{{tr "VNC"}}
<span id="VNC_status">{{tr "Loading"}}</span>
<a id="open_in_a_new_window" href="" target="_blank" title="{{tr "Open in a new window"}}"> <i class="fa fa-external-link detach-vnc-icon"/></a>
<span id="VNC_buttons" class="right">
<input type="button" value="Send CtrlAltDel" id="sendCtrlAltDelButton"></span>
</h3>
</div>
</div>
<div class="reveal-body" style="width:100%; overflow-x:overlay">
<canvas id="VNC_canvas" width="640px">{{tr "Canvas not supported."}}</canvas>
<div id="VNC_status_bar" class="VNC_status_bar"></div>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>