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:
parent
c6d99700c7
commit
9b5ac36fc4
@ -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;
|
||||
})
|
||||
|
@ -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)
|
||||
];
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
})
|
Loading…
x
Reference in New Issue
Block a user