diff --git a/src/sunstone/public/app/app.js b/src/sunstone/public/app/app.js
index e5ca9b99d9..41581a1b21 100644
--- a/src/sunstone/public/app/app.js
+++ b/src/sunstone/public/app/app.js
@@ -13,6 +13,7 @@ define(function(require) {
require('tabs/templates-tab'),
require('tabs/images-tab'),
require('tabs/files-tab'),
+ require('tabs/vms-tab'),
require('tabs/infra-tab'),
require('tabs/clusters-tab'),
require('tabs/hosts-tab'),
diff --git a/src/sunstone/public/app/opennebula/vm.js b/src/sunstone/public/app/opennebula/vm.js
index 9ff9fc7f13..1e50de1c15 100644
--- a/src/sunstone/public/app/opennebula/vm.js
+++ b/src/sunstone/public/app/opennebula/vm.js
@@ -5,6 +5,127 @@ define(function(require) {
var RESOURCE = "VM";
+ var STATES = [
+ "INIT",
+ "PENDING",
+ "HOLD",
+ "ACTIVE",
+ "STOPPED",
+ "SUSPENDED",
+ "DONE",
+ "FAILED",
+ "POWEROFF",
+ "UNDEPLOYED"
+ ]
+
+ var LCM_STATES = [
+ "LCM_INIT",
+ "PROLOG",
+ "BOOT",
+ "RUNNING",
+ "MIGRATE",
+ "SAVE_STOP",
+ "SAVE_SUSPEND",
+ "SAVE_MIGRATE",
+ "PROLOG_MIGRATE",
+ "PROLOG_RESUME",
+ "EPILOG_STOP",
+ "EPILOG",
+ "SHUTDOWN",
+ "CANCEL",
+ "FAILURE",
+ "CLEANUP_RESUBMIT",
+ "UNKNOWN",
+ "HOTPLUG",
+ "SHUTDOWN_POWEROFF",
+ "BOOT_UNKNOWN",
+ "BOOT_POWEROFF",
+ "BOOT_SUSPENDED",
+ "BOOT_STOPPED",
+ "CLEANUP_DELETE",
+ "HOTPLUG_SNAPSHOT",
+ "HOTPLUG_NIC",
+ "HOTPLUG_SAVEAS",
+ "HOTPLUG_SAVEAS_POWEROFF",
+ "HOTPLUG_SAVEAS_SUSPENDED",
+ "SHUTDOWN_UNDEPLOY",
+ "EPILOG_UNDEPLOY",
+ "PROLOG_UNDEPLOY",
+ "BOOT_UNDEPLOY",
+ "HOTPLUG_PROLOG_POWEROFF",
+ "HOTPLUG_EPILOG_POWEROFF",
+ "BOOT_MIGRATE",
+ "BOOT_FAILURE",
+ "BOOT_MIGRATE_FAILURE",
+ "PROLOG_MIGRATE_FAILURE",
+ "PROLOG_FAILURE",
+ "EPILOG_FAILURE",
+ "EPILOG_STOP_FAILURE",
+ "EPILOG_UNDEPLOY_FAILURE",
+ "PROLOG_MIGRATE_POWEROFF",
+ "PROLOG_MIGRATE_POWEROFF_FAILURE",
+ "PROLOG_MIGRATE_SUSPEND",
+ "PROLOG_MIGRATE_SUSPEND_FAILURE",
+ "BOOT_UNDEPLOY_FAILURE",
+ "BOOT_STOPPED_FAILURE",
+ "PROLOG_RESUME_FAILURE",
+ "PROLOG_UNDEPLOY_FAILURE"
+ ]
+
+ var SHORT_LCM_STATES = [
+ "LCM_INIT", // LCM_INIT
+ "PROLOG", // PROLOG
+ "BOOT", // BOOT
+ "RUNNING", // RUNNING
+ "MIGRATE", // MIGRATE
+ "SAVE", // SAVE_STOP
+ "SAVE", // SAVE_SUSPEND
+ "SAVE", // SAVE_MIGRATE
+ "MIGRATE", // PROLOG_MIGRATE
+ "PROLOG", // PROLOG_RESUME
+ "EPILOG", // EPILOG_STOP
+ "EPILOG", // EPILOG
+ "SHUTDOWN", // SHUTDOWN
+ "SHUTDOWN", // CANCEL
+ "FAILURE", // FAILURE
+ "CLEANUP", // CLEANUP_RESUBMIT
+ "UNKNOWN", // UNKNOWN
+ "HOTPLUG", // HOTPLUG
+ "SHUTDOWN", // SHUTDOWN_POWEROFF
+ "BOOT", // BOOT_UNKNOWN
+ "BOOT", // BOOT_POWEROFF
+ "BOOT", // BOOT_SUSPENDED
+ "BOOT", // BOOT_STOPPED
+ "CLEANUP", // CLEANUP_DELETE
+ "SNAPSHOT", // HOTPLUG_SNAPSHOT
+ "HOTPLUG", // HOTPLUG_NIC
+ "HOTPLUG", // HOTPLUG_SAVEAS
+ "HOTPLUG", // HOTPLUG_SAVEAS_POWEROFF
+ "HOTPLUG", // HOTPLUG_SAVEAS_SUSPENDED
+ "SHUTDOWN", // SHUTDOWN_UNDEPLOY
+ "EPILOG", // EPILOG_UNDEPLOY
+ "PROLOG", // PROLOG_UNDEPLOY
+ "BOOT", // BOOT_UNDEPLOY
+ "HOTPLUG", // HOTPLUG_PROLOG_POWEROFF
+ "HOTPLUG", // HOTPLUG_EPILOG_POWEROFF
+ "BOOT", // BOOT_MIGRATE
+ "FAILURE", // BOOT_FAILURE
+ "FAILURE", // BOOT_MIGRATE_FAILURE
+ "FAILURE", // PROLOG_MIGRATE_FAILURE
+ "FAILURE", // PROLOG_FAILURE
+ "FAILURE", // EPILOG_FAILURE
+ "FAILURE", // EPILOG_STOP_FAILURE
+ "FAILURE", // EPILOG_UNDEPLOY_FAILURE
+ "MIGRATE", // PROLOG_MIGRATE_POWEROFF
+ "FAILURE", // PROLOG_MIGRATE_POWEROFF_FAILURE
+ "MIGRATE", // PROLOG_MIGRATE_SUSPEND
+ "FAILURE", // PROLOG_MIGRATE_SUSPEND_FAILURE
+ "FAILURE", // BOOT_UNDEPLOY_FAILURE
+ "FAILURE", // BOOT_STOPPED_FAILURE
+ "FAILURE", // PROLOG_RESUME_FAILURE
+ "FAILURE" // PROLOG_UNDEPLOY_FAILURE
+ ]
+
var VM = {
"resource": RESOURCE,
"state": {
@@ -74,6 +195,15 @@ define(function(require) {
"PROLOG_UNDEPLOY_FAILURE" : 50
},
+ "stateStr": function(stateId) {
+ return STATES[stateId];
+ },
+ "lcmStateStr": function(stateId) {
+ return LCM_STATES[stateId];
+ },
+ "shortLcmStateStr": function(stateId) {
+ return SHORT_LCM_STATES[stateId];
+ },
"create": function(params) {
OpenNebulaAction.create(params, RESOURCE);
},
diff --git a/src/sunstone/public/app/tabs/vms-tab.js b/src/sunstone/public/app/tabs/vms-tab.js
new file mode 100644
index 0000000000..a0f4dca17f
--- /dev/null
+++ b/src/sunstone/public/app/tabs/vms-tab.js
@@ -0,0 +1,46 @@
+define(function(require) {
+ var Locale = require('utils/locale');
+ var Buttons = require('./vms-tab/buttons');
+ var Actions = require('./vms-tab/actions');
+ var Table = require('./vms-tab/datatable');
+
+ var TAB_ID = require('./vms-tab/tabId');
+ var DATATABLE_ID = "dataTableVms";
+
+ //var _dialogs = [
+ // require('./vms-tab/dialogs/clone'),
+ // require('./vms-tab/dialogs/instantiate')
+ //];
+
+ //var _panels = [
+ // require('./vms-tab/panels/info'),
+ // require('./vms-tab/panels/template')
+ //];
+
+ //var _formPanels = [
+ // require('./vms-tab/form-panels/create')
+ //]
+
+ var Tab = {
+ tabId: TAB_ID,
+ title: Locale.tr("Virtual Machines"),
+ tabClass: "subTab",
+ parentTab: "vresources-tab",
+ listHeader: ' ' + Locale.tr("Virtual Machines"),
+ infoHeader: ' ' + Locale.tr("VM"),
+ subheader: ' ' + Locale.tr("TOTAL") + ' \
+ ' + Locale.tr("ACTIVE") + ' \
+ ' + Locale.tr("OFF") + ' \
+ ' + Locale.tr("PENDING") + ' \
+ ' + Locale.tr("FAILED") + '',
+ resource: 'VM',
+ buttons: Buttons,
+ actions: Actions,
+ dataTable: new Table(DATATABLE_ID, {actions: true, info: true}),
+ //panels: _panels,
+ //formPanels: _formPanels,
+ //dialogs: _dialogs
+ };
+
+ return Tab;
+});
diff --git a/src/sunstone/public/app/tabs/vms-tab/actions.js b/src/sunstone/public/app/tabs/vms-tab/actions.js
new file mode 100644
index 0000000000..979892053f
--- /dev/null
+++ b/src/sunstone/public/app/tabs/vms-tab/actions.js
@@ -0,0 +1,532 @@
+define(function(require) {
+ var Sunstone = require('sunstone');
+ var Notifier = require('utils/notifier');
+ var Locale = require('utils/locale');
+ var OpenNebulaVM = require('opennebula/vm');
+ var CommonActions = require('utils/common-actions');
+
+ var TAB_ID = require('./tabId');
+ //var CREATE_DIALOG_ID = require('./form-panels/create/formPanelId');
+ //var CLONE_DIALOG_ID = require('./dialogs/clone/dialogId');
+ //var INSTANTIATE_DIALOG_ID = require('./dialogs/instantiate/dialogId');
+ var XML_ROOT = "VM";
+ var RESOURCE = "VM";
+
+ var _commonActions = new CommonActions(OpenNebulaVM, RESOURCE, TAB_ID);
+
+ var _actions = {
+ "VM.list": _commonActions.list(),
+ "VM.show": _commonActions.show(),
+ "VM.refresh": _commonActions.refresh(),
+ "VM.delete": _commonActions.delete(),
+
+ /*"VM.create" : {
+ type: "custom",
+ call: function(id, name) {
+ Sunstone.runAction("Template.instantiate", [id], name);
+ Sunstone.runAction("VM.list");
+ },
+ callback: function(request, response) {
+ //Sunstone.resetFormPanel(TAB_ID, CREATE_DIALOG_ID);
+ //Sunstone.hideFormPanel(TAB_ID);
+ Sunstone.getDataTable(TAB_ID).addElement(request, response);
+ },
+ error: onError
+ },
+ "VM.create_dialog" : {
+ type: "custom",
+ call: function(){
+ //Sunstone.getDialog(CREATE_DIALOG_ID).show();
+ }
+ },
+ "VM.deploy" : {
+ type: "custom",
+ call: function() {
+ popUpDeployVMDialog();
+ }
+ },
+
+ "VM.deploy_action" : {
+ type: "single",
+ call: OpenNebula.VM.deploy,
+ callback: vmShow,
+ error: onError,
+ notify: true
+ },
+
+ "VM.silent_deploy_action" : {
+ type: "single",
+ call: OpenNebula.VM.deploy,
+ error: onError
+ },
+
+ "VM.migrate" : {
+ type: "custom",
+ call: function() {
+ popUpMigrateVMDialog(false);
+ }
+ },
+
+ "VM.migrate_action" : {
+ type: "single",
+ call: OpenNebula.VM.migrate,
+ callback: vmShow,
+ error: onError,
+ notify: true
+ },
+
+ "VM.migrate_live" : {
+ type: "custom",
+ call: function() {
+ popUpMigrateVMDialog(true);
+ }
+ },
+
+ "VM.migrate_live_action" : {
+ type: "single",
+ call: OpenNebula.VM.livemigrate,
+ callback: vmShow,
+ error: onError,
+ notify: true
+ },
+
+ "VM.hold" : {
+ type: "multiple",
+ call: OpenNebula.VM.hold,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.release" : {
+ type: "multiple",
+ call: OpenNebula.VM.release,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.suspend" : {
+ type: "multiple",
+ call: OpenNebula.VM.suspend,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.resume" : {
+ type: "multiple",
+ call: OpenNebula.VM.resume,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.stop" : {
+ type: "multiple",
+ call: OpenNebula.VM.stop,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.reboot_hard" : {
+ type: "multiple",
+ call: OpenNebula.VM.reset,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.delete_recreate" : {
+ type: "multiple",
+ call: OpenNebula.VM.resubmit,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.reboot" : {
+ type: "multiple",
+ call: OpenNebula.VM.reboot,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.poweroff" : {
+ type: "multiple",
+ call: OpenNebula.VM.poweroff,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.poweroff_hard" : {
+ type: "multiple",
+ call: OpenNebula.VM.poweroff_hard,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.undeploy" : {
+ type: "multiple",
+ call: OpenNebula.VM.undeploy,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.undeploy_hard" : {
+ type: "multiple",
+ call: OpenNebula.VM.undeploy_hard,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.saveas" : {
+ type: "single",
+ call: OpenNebula.VM.saveas,
+ callback: function(request) {
+ Sunstone.runAction("VM.show", request.request.data[0]);
+ OpenNebula.Helper.clear_cache("IMAGE");
+ },
+ error:onError,
+ notify: true
+ },
+
+ "VM.disk_snapshot_cancel" : {
+ type: "single",
+ call: OpenNebula.VM.disk_snapshot_cancel,
+ callback: function(request) {
+ Sunstone.runAction("VM.show", request.request.data[0]);
+ OpenNebula.Helper.clear_cache("IMAGE");
+ },
+ error:onError,
+ notify: true
+ },
+
+ "VM.snapshot_create" : {
+ type: "single",
+ call: OpenNebula.VM.snapshot_create,
+ callback: function(request) {
+ Sunstone.runAction("VM.show", request.request.data[0]);
+ },
+ error:onError,
+ notify: true
+ },
+ "VM.snapshot_revert" : {
+ type: "single",
+ call: OpenNebula.VM.snapshot_revert,
+ callback: function(request) {
+ Sunstone.runAction("VM.show", request.request.data[0]);
+ },
+ error:onError,
+ notify: true
+ },
+ "VM.snapshot_delete" : {
+ type: "single",
+ call: OpenNebula.VM.snapshot_delete,
+ callback: function(request) {
+ Sunstone.runAction("VM.show", request.request.data[0]);
+ },
+ error:onError,
+ notify: true
+ },
+
+ "VM.shutdown" : {
+ type: "multiple",
+ call: OpenNebula.VM.shutdown,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.shutdown_hard" : {
+ type: "multiple",
+ call: OpenNebula.VM.cancel,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+
+ "VM.recover" : {
+ type: "multiple",
+ call: OpenNebula.VM.recover,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.resched" : {
+ type: "multiple",
+ call: OpenNebula.VM.resched,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ notify: true
+ },
+
+ "VM.unresched" : {
+ type: "multiple",
+ call: OpenNebula.VM.unresched,
+ callback: vmShow,
+ elements: vmElements,
+ error: onError,
+ 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 = '' + line + '';
+ }
+ colored_log += line + "
";
+ }
+
+ $('#vm_log_tab').html('