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

feature #3748: Add vm helpers

This commit is contained in:
Daniel Molina 2015-06-09 11:50:51 +02:00
parent c6d99700c7
commit 9b5ac36fc4
4 changed files with 206 additions and 98 deletions

View File

@ -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 || "<br>"
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;
})

View File

@ -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 = '<a class="vnc" href="#" vm_id="' + element.ID + '"><i class="fa fa-desktop"/></a>';
} else if (OpenNebulaVM.isSPICESupported(element)) {
vncIcon = '<a class="spice" href="#" vm_id="' + element.ID + '"><i class="fa fa-desktop"/></a>';
} else {
vncIcon = '';
}
return [
'<input class="check_item" type="checkbox" id="' + RESOURCE.toLowerCase() + '_' +
element.ID + '" name="selected_items" value="' +
@ -124,10 +132,10 @@ define(function(require) {
state,
element.CPU,
Humanize.size(element.MEMORY),
hostname,
Humanize.ipsStr(element),
OpenNebulaVM.hostnameStr(element),
OpenNebulaVM.ipsStr(element),
Humanize.prettyTime(element.STIME),
VncSpiceUtils.vncIcon(element),
vncIcon,
TemplateUtils.templateToString(element)
];
}

View File

@ -10,7 +10,6 @@ define(function(require) {
var TemplateTable = require('utils/panel/template-table');
var OpenNebulaVM = require('opennebula/vm');
var StateActions = require('../utils/state-actions');
var VncSpiceUtils = require('../utils/vnc-spice-utils');
/*
TEMPLATES
@ -83,16 +82,16 @@ define(function(require) {
StateActions.disableAllStateActions();
StateActions.enableStateActions(this.element.STATE, this.element.LCM_STATE);
// Enable / disable vnc button
if (!VncSpiceUtils.VNCEnabled(this.element)) {
$(".vnc-right-info").hide();
if (OpenNebulaVM.isVNCSupported(this.element)) {
$(".vnc-right-info").show();
} else {
$(".vnc-right-info").show();
$(".vnc-right-info").hide();
}
if (!VncSpiceUtils.SPICEEnabled(this.element)) {
$(".spice-right-info").hide();
if (OpenNebulaVM.isSPICESupported(this.element)) {
$(".spice-right-info").show()
} else {
$(".spice-right-info").show();
$(".spice-right-info").hide();;
}
RenameTr.setup(RESOURCE, this.element.ID, context);

View File

@ -1,62 +0,0 @@
define(function(require) {
var OpenNebulaVm = require('opennebula/vm');
var VNC_STATES = [
OpenNebulaVm.lcm_state.RUNNING,
OpenNebulaVm.lcm_state.SHUTDOWN,
OpenNebulaVm.lcm_state.SHUTDOWN_POWEROFF,
OpenNebulaVm.lcm_state.UNKNOWN,
OpenNebulaVm.lcm_state.HOTPLUG,
OpenNebulaVm.lcm_state.CANCEL,
OpenNebulaVm.lcm_state.MIGRATE,
OpenNebulaVm.lcm_state.HOTPLUG_SNAPSHOT,
OpenNebulaVm.lcm_state.HOTPLUG_NIC,
OpenNebulaVm.lcm_state.HOTPLUG_SAVEAS,
OpenNebulaVm.lcm_state.HOTPLUG_SAVEAS_POWEROFF,
OpenNebulaVm.lcm_state.HOTPLUG_SAVEAS_SUSPENDED,
OpenNebulaVm.lcm_state.SHUTDOWN_UNDEPLOY
];
return {
'VNCEnabled': _VNCEnabled,
'SPICEEnabled': _SPICEEnabled,
'vncIcon': _vncIcon
}
function _VNCEnabled(vm) {
var graphics = vm.TEMPLATE.GRAPHICS;
var state = parseInt(vm.LCM_STATE);
return (graphics &&
graphics.TYPE &&
graphics.TYPE.toLowerCase() == "vnc" &&
$.inArray(state, VNC_STATES) != -1);
}
function _SPICEEnabled(vm) {
var graphics = vm.TEMPLATE.GRAPHICS;
var state = parseInt(vm.LCM_STATE);
return (graphics &&
graphics.TYPE &&
graphics.TYPE.toLowerCase() == "spice" &&
$.inArray(state, VNC_STATES) != -1);
}
function _vncIcon(vm) {
var gr_icon;
if (_VNCEnabled(vm)) {
gr_icon = '<a class="vnc" href="#" vm_id="' + vm.ID + '">';
gr_icon += '<i class="fa fa-desktop" style="color: rgb(111, 111, 111)"/>';
} else if (_SPICEEnabled(vm)) {
gr_icon = '<a class="spice" href="#" vm_id="' + vm.ID + '">';
gr_icon += '<i class="fa fa-desktop" style="color: rgb(111, 111, 111)"/>';
} else {
gr_icon = '';
}
gr_icon += '</a>'
return gr_icon;
}
})