diff --git a/src/sunstone/public/app/opennebula/vm.js b/src/sunstone/public/app/opennebula/vm.js
index bc72ab17bf..758c6bbecc 100644
--- a/src/sunstone/public/app/opennebula/vm.js
+++ b/src/sunstone/public/app/opennebula/vm.js
@@ -398,7 +398,8 @@ define(function(require) {
"IP6_ULA",
"VROUTER_IP",
"VROUTER_IP6_GLOBAL",
- "VROUTER_IP6_ULA"
+ "VROUTER_IP6_ULA",
+ "EXTERNAL_IP",
];
var EXTERNAL_NETWORK_ATTRIBUTES = [
@@ -924,17 +925,20 @@ define(function(require) {
// Return the IP or several IPs of a VM
function ipsStr(element, divider, groupStrFunction) {
+ var defaultValue = '--'
var divider = divider || "
";
var nics = getNICs(element);
var ips = [];
var monitoring = element && element.MONITORING;
+
if (monitoring) {
- var externalIP;
- $.each(EXTERNAL_IP_ATTRS, function(index, IPAttr) {
- externalIP = monitoring[IPAttr];
+ $.each(EXTERNAL_IP_ATTRS, function(_, IPAttr) {
+ var externalIP = monitoring[IPAttr];
+
if (externalIP) {
var splitArr = externalIP.split(",");
- $.each(splitArr, function(i,ip){
+
+ $.each(splitArr, function(_,ip){
if (ip && ($.inArray(ip, ips) == -1)) {
ips.push(ip);
}
@@ -944,26 +948,21 @@ define(function(require) {
}
// infoextended: alias will be group by nic
- return Config.isExtendedVmInfo
- ? (groupStrFunction !== null && typeof groupStrFunction === "function"? groupStrFunction(element, nics) : groupByIpsStr(element, nics))
- : (ips.length == 0 && nics && nics.length > 0)
- ? $.map(nics, function(nic) {
- if (nic["IP"]) {
- return nic["IP"];
- }
- else{
- var ipv6 = "";
- if (nic["IP6_ULA"]){
- ipv6 += nic["IP6_ULA"];
- }
- if (nic["IP6_GLOBAL"]){
- ipv6 = (ipv6 == "") ? "" : ipv6 + "
";
- ipv6 += nic["IP6_GLOBAL"];
- }
- return ipv6;
- }
- }).join(divider)
- : "--";
+ if (Config.isExtendedVmInfo) {
+ return typeof groupStrFunction === "function"
+ ? groupStrFunction(element, nics)
+ : groupByIpsStr(element, nics)
+ }
+
+ return (ips.length === 0 && nics && nics.length > 0) ? (
+ $.map(nics, function(nic) {
+ return $.map(NIC_ALIAS_IP_ATTRS, function(attribute) {
+ return nic[attribute]
+ })
+ }).join(divider)
+ ) : (
+ defaultValue
+ )
};
// Return a dropdown with all the
@@ -975,7 +974,7 @@ define(function(require) {
// If its generated by groupByIpsDropdown
if (~ipsStr.indexOf("li")){
ips = [];
- $.each($.parseHTML(ipsStr), function( index ) {
+ $.each($.parseHTML(ipsStr), function() {
ips.push($( this ).text());
});
ipsStr = "
";
@@ -1005,30 +1004,45 @@ define(function(require) {
};
function groupByIpsDropdown(element = {}, nics = []) {
-
// Show the first IP two times for the dropdown.
var copy_nics = Object.assign([], nics);
+
var first_nic = Object.assign({}, nics[0]);
+ delete first_nic["EXTERNAL_IP"];
delete first_nic["ALIAS_IDS"];
copy_nics.unshift(first_nic);
return copy_nics.reduce(function(column, nic) {
- identation = " ";
- var ip = (nic.IP) ? nic.IP : nic.IP6_ULA + "
" + identation + nic.IP6_GLOBAL;
- var nicSection = nic.NIC_ID ? $("").append($("").css("color", "gray").html(nic.NIC_ID + ": " + ip)) : $("").append("").html("-") ;
+ var identation = " ";
+ var ip = nic.IP || nic.IP6_ULA + "
" + identation + nic.IP6_GLOBAL;
+
+ var nicSection = nic.NIC_ID
+ ? $("").append($("").css("color", "gray").html(nic.NIC_ID + ": " + ip))
+ : $("").append("").html("-") ;
+
+ if (String(nic.EXTERNAL_IP).toLowerCase() !== 'yes') {
+ var externalIp = "
" + nic.NIC_ID + ": " + nic.EXTERNAL_IP
+ nicSection.append($("").append($("").css("color", "gray").html(externalIp)))
+ }
if (nic.ALIAS_IDS) {
nic.ALIAS_IDS.split(",").forEach(function(aliasId) {
var templateAlias = Array.isArray(element.TEMPLATE.NIC_ALIAS)
- ? element.TEMPLATE.NIC_ALIAS : [element.TEMPLATE.NIC_ALIAS];
- var alias = templateAlias.find(function(alias) { return alias.NIC_ID === aliasId; });
+ ? element.TEMPLATE.NIC_ALIAS
+ : [element.TEMPLATE.NIC_ALIAS];
+
+ var alias = templateAlias.find(function(alias) {
+ return alias.NIC_ID === aliasId;
+ });
if (alias) {
- var alias_ip = alias.IP ? alias.IP : alias.IP6_ULA + "
" + identation + "> " + alias.IP6_GLOBAL;
+ var alias_ip = alias.IP || alias.IP6_ULA + "
" + identation + "> " + alias.IP6_GLOBAL;
+
nicSection.append($("").append($("").css({
"color": "gray",
"font-style": "italic",
- }).html(identation + "> " + alias_ip))); }
+ }).html(identation + "> " + alias_ip)));
+ }
});
}
@@ -1037,28 +1051,40 @@ define(function(require) {
};
function groupByIpsStr(element = {}, nics = []) {
- identation = " ";
- return nics.reduce(function(column, nic) {
- var ip = (nic.IP) ? nic.IP : nic.IP6_ULA + "
" + identation + nic.IP6_GLOBAL;
- var nicSection = $("").css("margin-bottom", 0).html(nic.NIC_ID + ": " + ip);
+ var identation = " ";
+
+ var res = nics.reduce(function(column, nic) {
+ var ip = nic.IP || nic.IP6_ULA + "
" + identation + nic.IP6_GLOBAL
+
+ column.append($("
").css("margin-bottom", 0).html(nic.NIC_ID + ": " + ip))
+
+ if (String(nic.EXTERNAL_IP).toLowerCase() !== 'yes') {
+ var externalIp = nic.NIC_ID + ": " + nic.EXTERNAL_IP
+
+ column.append($("").css("margin-bottom", 0).html(externalIp))
+ }
if (nic.ALIAS_IDS) {
-
nic.ALIAS_IDS.split(",").forEach(function(aliasId) {
var templateAlias = Array.isArray(element.TEMPLATE.NIC_ALIAS)
- ? element.TEMPLATE.NIC_ALIAS : [element.TEMPLATE.NIC_ALIAS];
+ ? element.TEMPLATE.NIC_ALIAS
+ : [element.TEMPLATE.NIC_ALIAS];
+
var alias = templateAlias.find(function(alias) { return alias.NIC_ID === aliasId; });
if (alias) {
- var alias_ip = alias.IP ? alias.IP : alias.IP6_ULA + "
" + identation + "> " + alias.IP6_GLOBAL;
- nicSection.append($("").css({
+ var alias_ip = identation + "> " + alias.IP ||
+ alias.IP6_ULA + "
" + identation + "> " + alias.IP6_GLOBAL;
+
+ column.append($("").css({
"margin-bottom": 0,
- "font-style": "italic",
- }).html(identation + "> " + alias_ip)); }
+ "font-style": "italic"
+ }).html(alias_ip));
+ }
});
}
- return column.append(nicSection);
+ return column;
}, $("")).html();
};
diff --git a/src/sunstone/public/app/tabs/vms-tab/datatable.js b/src/sunstone/public/app/tabs/vms-tab/datatable.js
index fd2adc67c9..777c69f0e0 100644
--- a/src/sunstone/public/app/tabs/vms-tab/datatable.js
+++ b/src/sunstone/public/app/tabs/vms-tab/datatable.js
@@ -64,13 +64,14 @@ define(function(require) {
"bSortClasses" : false,
"bDeferRender": true,
"aoColumnDefs": [
- {"sType": "ip-address", "aTargets": [0]},
- {"sType": "num", "aTargets": [1]},
- {"sType": "date-euro", "aTargets": [ 10 ]},
- {"bSortable": false, "aTargets": ["check", 11]},
- {"sWidth": "35px", "aTargets": [0]},
- {"bVisible": true, "aTargets": SunstoneConfig.tabTableColumns(TAB_NAME)},
- {"bVisible": false, "aTargets": ['_all']}
+ {"sType": "ip-address", "aTargets": [0]},
+ {"sType": "num", "aTargets": [1]},
+ {"sType": "date-euro", "aTargets": [ 10 ]},
+ {"bSortable": false, "aTargets": ["check", 11]},
+ {"sWidth": "35px", "aTargets": [0]},
+ {"bVisible": true, "aTargets": SunstoneConfig.tabTableColumns(TAB_NAME)},
+ {"bVisible": false, "aTargets": ['_all']},
+ {"sClass": "middle", "aTargets": ['_all']}
]
};
diff --git a/src/sunstone/public/app/tabs/vms-tab/panels/network.js b/src/sunstone/public/app/tabs/vms-tab/panels/network.js
index 5d7242a058..7131a10440 100644
--- a/src/sunstone/public/app/tabs/vms-tab/panels/network.js
+++ b/src/sunstone/public/app/tabs/vms-tab/panels/network.js
@@ -225,22 +225,30 @@ define(function(require) {
return html;
}
- function _ipTr(nic, attr){
- var v = "--";
- if(nic && attr){
- if(!Array.isArray(attr)){
- attr = [attr];
- }
- attr.map(function(attr){
- if(nic[attr]){
- v = nic[attr];
- if (nic["VROUTER_"+attr] != undefined){
- v += ("
" + nic["VROUTER_"+attr] + Locale.tr(" (VRouter)"));
- }
- }
- });
+ function _ipTr(nic, attributes) {
+ var ips = [];
+ var defaultValue = '--'
+
+ if (!nic || !attributes) return defaultValue
+
+ if (!Array.isArray(attributes)) {
+ attributes = [attributes];
}
- return v;
+
+ attributes.map(function(attribute) {
+ if (nic[attribute]) {
+ // filter attributes with dual value: YES or
+ if (String(nic[attribute]).toLowerCase() !== 'yes') {
+ ips.push(nic[attribute])
+ }
+
+ if (nic["VROUTER_" + attribute] !== undefined) {
+ ips.push(nic["VROUTER_" + attribute] + Locale.tr(" (VRouter)"));
+ }
+ }
+ });
+
+ return ips.length === 0 ? defaultValue : ips.join('
');
}
function _setup(context) {
@@ -347,9 +355,9 @@ define(function(require) {
var pci_address = is_pci ? nic.ADDRESS : "";
- var ipStr = "IP";
+ var ipAttribute = "IP";
if (nic.IP6 !== undefined){
- ipStr = "IP6";
+ ipAttribute = "IP6";
}
var nic_alias = [];
@@ -369,7 +377,7 @@ define(function(require) {
nic_dt_data.push({
NIC_ID : nic.NIC_ID,
NETWORK : Navigation.link(nic.NETWORK, "vnets-tab", nic.NETWORK_ID),
- IP : _ipTr(nic, [ipStr, "IP"]),
+ IP : _ipTr(nic, [ipAttribute, 'EXTERNAL_IP']),
NIC_ALIAS : nic_alias,
MAC : nic.MAC,
PCI_ADDRESS: pci_address,
@@ -429,29 +437,39 @@ define(function(require) {
if(row.data().NIC_ALIAS.length > 0) {
var html = "";
- $.each(row.data().NIC_ALIAS, function(index, elem) {
+ $.each(row.data().NIC_ALIAS, function() {
var new_div = "" +
"" + "- Alias-" + this.ALIAS_ID + ":" + "";
+
if(this.IP !== undefined) {
- new_div += " " + this.IP;
+ new_div += " " + this.IP;
}
+
+ if(String(this.EXTERNAL_IP).toLowerCase() !== 'yes') {
+ new_div += " " + this.EXTERNAL_IP;
+ }
+
if(this.IP6 !== undefined) {
- new_div += " " + this.IP6;
+ new_div += " " + this.IP6;
}
+
new_div += " " + this.MAC;
+
if(this.IP6_ULA !== undefined) {
- new_div += " ULA " + this.IP6_ULA;
+ new_div += " ULA " + this.IP6_ULA;
}
+
if(this.IP6_GLOBAL !== undefined) {
- new_div += " Global " + this.IP6_GLOBAL;
+ new_div += " Global " + this.IP6_GLOBAL;
}
+
new_div += " " + this.ACTIONS + "
";
html += new_div;
if (Config.isTabActionEnabled("vms-tab", "VM.detachnic")) {
- context.off("click", ".detachnic");
- context.on("click", ".detachnic", {element_id: that.element.ID}, detach_alias);
+ context.off("click", ".detachnic");
+ context.on("click", ".detachnic", {element_id: that.element.ID}, detach_alias);
}
});
} else {
diff --git a/src/sunstone/public/scss/_table.scss b/src/sunstone/public/scss/_table.scss
index 9a310b47e3..5efefb76f1 100644
--- a/src/sunstone/public/scss/_table.scss
+++ b/src/sunstone/public/scss/_table.scss
@@ -43,6 +43,10 @@ table {
}
}
+ &.middle {
+ vertical-align: middle;
+ }
+
.cpu{
margin: 0px;
padding: 0px;