diff --git a/src/sunstone/public/app/opennebula/vm.js b/src/sunstone/public/app/opennebula/vm.js
index 4e516f704d..67ea078705 100644
--- a/src/sunstone/public/app/opennebula/vm.js
+++ b/src/sunstone/public/app/opennebula/vm.js
@@ -126,6 +126,40 @@ define(function(require) {
"FAILURE" // PROLOG_UNDEPLOY_FAILURE
]
+ var VNC_STATES = [
+ 3, // VM.lcm_state.RUNNING,
+ 4, // VM.lcm_state.MIGRATE,
+ 12, // VM.lcm_state.SHUTDOWN,
+ 13, // VM.lcm_state.CANCEL,
+ 16, // VM.lcm_state.UNKNOWN,
+ 17, // VM.lcm_state.HOTPLUG,
+ 18, // VM.lcm_state.SHUTDOWN_POWEROFF,
+ 24, // VM.lcm_state.HOTPLUG_SNAPSHOT,
+ 25, // VM.lcm_state.HOTPLUG_NIC,
+ 26, // VM.lcm_state.HOTPLUG_SAVEAS,
+ 27, // VM.lcm_state.HOTPLUG_SAVEAS_POWEROFF,
+ 28, // VM.lcm_state.HOTPLUG_SAVEAS_SUSPENDED,
+ 29, // VM.lcm_state.SHUTDOWN_UNDEPLOY
+ ];
+
+ var EXTERNAL_IP_ATTRS = [
+ 'GUEST_IP',
+ 'AWS_IP_ADDRESS',
+ 'AZ_IPADDRESS',
+ 'SL_PRIMARYIPADDRESS'
+ ]
+
+ var EXTERNAL_NETWORK_ATTRIBUTES = [
+ 'GUEST_IP',
+ 'AWS_IP_ADDRESS',
+ 'AWS_DNS_NAME',
+ 'AWS_PRIVATE_IP_ADDRESS',
+ 'AWS_PRIVATE_DNS_NAME',
+ 'AWS_SECURITY_GROUPS',
+ 'AZ_IPADDRESS',
+ 'SL_PRIMARYIPADDRESS'
+ ]
+
var VM = {
"resource": RESOURCE,
"state": {
@@ -140,7 +174,6 @@ define(function(require) {
"POWEROFF" : 8,
"UNDEPLOYED": 9
},
-
"lcm_state": {
"LCM_INIT" : 0,
"PROLOG" : 1,
@@ -194,29 +227,6 @@ define(function(require) {
"PROLOG_RESUME_FAILURE" : 49,
"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];
- },
- "hostnameStr": function(element) {
- var state = STATES[element.STATE];
- var hostname = "--";
- if (state == "ACTIVE" || state == "SUSPENDED" || state == "POWEROFF") {
- if (element.HISTORY_RECORDS.HISTORY.constructor == Array) {
- hostname = element.HISTORY_RECORDS.HISTORY[element.HISTORY_RECORDS.HISTORY.length - 1].HOSTNAME;
- } else {
- hostname = element.HISTORY_RECORDS.HISTORY.HOSTNAME;
- };
- };
-
- return hostname;
- },
"create": function(params) {
OpenNebulaAction.create(params, RESOURCE);
},
@@ -399,8 +409,161 @@ define(function(require) {
"save_as_template": function(params) {
var action_obj = params.data.extra_param;
OpenNebula.Action.simple_action(params, RESOURCE, "save_as_template", action_obj);
+ },
+ "stateStr": function(stateId) {
+ return STATES[stateId];
+ },
+ "lcmStateStr": function(stateId) {
+ return LCM_STATES[stateId];
+ },
+ "shortLcmStateStr": function(stateId) {
+ return SHORT_LCM_STATES[stateId];
+ },
+ "hostnameStr": function(element) {
+ var state = STATES[element.STATE];
+ var hostname = "--";
+ if (state == "ACTIVE" || state == "SUSPENDED" || state == "POWEROFF") {
+ var history = retrieveLastHistoryRecord(element)
+ if (history) {
+ hostname = history.HOSTNAME;
+ };
+ };
+
+ return hostname;
+ },
+ "ipsStr": ipsStr,
+ "retrieveExternalIPs": retrieveExternalIPs,
+ "retrieveExternalNetworkAttrs": retrieveExternalNetworkAttrs,
+ "isNICGraphsSupported": isNICGraphsSupported,
+ "isNICAttachSupported": isNICAttachSupported,
+ "isVNCSupported": isVNCSupported,
+ "isSPICESupported": isSPICESupported,
+ }
+
+ function retrieveLastHistoryRecord(element) {
+ if (element.HISTORY_RECORDS && element.HISTORY_RECORDS.HISTORY) {
+ var history = element.HISTORY_RECORDS.HISTORY;
+ if (history.constructor == Array) {
+ return history[history.length - 1];
+ } else {
+ return history;
+ };
+ } else {
+ return null;
}
}
+ // Return true if the VM has a hybrid section
+ function isNICGraphsSupported(element) {
+ var history = retrieveLastHistoryRecord(element)
+ if (history) {
+ return $.inArray(history.VMMMAD, ['vcenter', 'ec2', 'az', 'sl']) == -1;
+ } else {
+ return false;
+ }
+ }
+
+ function isNICAttachSupported(element) {
+ var history = retrieveLastHistoryRecord(element)
+ if (history) {
+ return $.inArray(history.VMMMAD, ['ec2', 'az', 'sl']) == -1;
+ } else {
+ return false;
+ }
+ }
+
+ function retrieveExternalIPs(element) {
+ var template = element.TEMPLATE;
+ var ips = {};
+ var externalIP;
+
+ $.each(EXTERNAL_IP_ATTRS, function(index, IPAttr) {
+ externalIP = template[IPAttr];
+ if (externalIP) {
+ ips[IPAttr] = externalIP;
+ }
+ });
+
+ return ips;
+ }
+
+ function retrieveExternalNetworkAttrs(element) {
+ var template = element.TEMPLATE;
+ var ips = {};
+ var externalAttr;
+
+ $.each(EXTERNAL_NETWORK_ATTRIBUTES, function(index, attr) {
+ externalAttr = template[attr];
+ if (externalAttr) {
+ ips[attr] = externalAttr;
+ }
+ });
+
+ return ips;
+ }
+
+ // Return the IP or several IPs of a VM
+ function ipsStr(element, divider) {
+ var divider = divider || "
"
+ var nic = element.TEMPLATE.NIC;
+ var ips = [];
+
+ if (nic != undefined) {
+ if (!$.isArray(nic)) {
+ nic = [nic];
+ }
+
+ $.each(nic, function(index, value) {
+ if (value.IP) {
+ ips.push(value.IP);
+ }
+
+ if (value.IP6_GLOBAL) {
+ ips.push(value.IP6_GLOBAL);
+ }
+
+ if (value.IP6_ULA) {
+ ips.push(value.IP6_ULA);
+ }
+ });
+ }
+
+ var template = element.TEMPLATE;
+ var externalIP;
+ $.each(EXTERNAL_IP_ATTRS, function(index, IPAttr) {
+ externalIP = template[IPAttr];
+ if (externalIP && ($.inArray(externalIP, ips) == -1)) {
+ ips.push(externalIP);
+ }
+ })
+
+ if (ips.length > 0) {
+ return ips.join(divider);
+ } else {
+ return '--';
+ }
+ };
+
+ // returns true if the vnc button should be enabled
+ function isVNCSupported(element) {
+ var graphics = element.TEMPLATE.GRAPHICS;
+ var state = parseInt(element.LCM_STATE);
+
+ return (graphics &&
+ graphics.TYPE &&
+ graphics.TYPE.toLowerCase() == "vnc" &&
+ $.inArray(state, VNC_STATES) != -1);
+ }
+
+ function isSPICESupported(element) {
+ var graphics = element.TEMPLATE.GRAPHICS;
+ var state = parseInt(element.LCM_STATE);
+
+ return (graphics &&
+ graphics.TYPE &&
+ graphics.TYPE.toLowerCase() == "spice" &&
+ $.inArray(state, VNC_STATES) != -1);
+ }
+
return VM;
})
diff --git a/src/sunstone/public/app/tabs/vms-tab/datatable.js b/src/sunstone/public/app/tabs/vms-tab/datatable.js
index 010aa04646..73c4ec95dc 100644
--- a/src/sunstone/public/app/tabs/vms-tab/datatable.js
+++ b/src/sunstone/public/app/tabs/vms-tab/datatable.js
@@ -9,7 +9,6 @@ define(function(require) {
var Humanize = require('utils/humanize');
var TemplateUtils = require('utils/template-utils');
var OpenNebulaVM = require('opennebula/vm');
- var VncSpiceUtils = require('./utils/vnc-spice-utils');
var StateActions = require('./utils/state-actions');
/*
@@ -85,7 +84,6 @@ define(function(require) {
var element = element_json[XML_ROOT];
var state = OpenNebulaVM.stateStr(element.STATE);
- var hostname = OpenNebulaVM.hostnameStr(element);
/* TODO
switch (state) {
@@ -113,6 +111,16 @@ define(function(require) {
state = OpenNebulaVM.shortLcmStateStr(element.LCM_STATE);
};
+ // VNC icon
+ var vncIcon;
+ if (OpenNebulaVM.isVNCSupported(element)) {
+ vncIcon = '';
+ } else if (OpenNebulaVM.isSPICESupported(element)) {
+ vncIcon = '';
+ } else {
+ vncIcon = '';
+ }
+
return [
'';
- gr_icon += '';
- } else if (_SPICEEnabled(vm)) {
- gr_icon = '';
- gr_icon += '';
- } else {
- gr_icon = '';
- }
-
- gr_icon += ''
- return gr_icon;
- }
-})