openConsole.RestDataSource.create({
ID:"topology_brokersDS",
fields:[
{name:"brokerId", title:"ID", primaryKey:true},
{name:"brokerParentId", title:"Parent", foreignKey:"brokerId"}
],
dataURL:"/broker_registry_query"
});
var topology_brokersListPane = openConsole.TreeGrid.create({
ID: "topology_brokersTree",
dataSource: "topology_brokersDS",
nodeIcon: "/public/images/service.png",
folderIcon: "/public/images/service.png",
emptyMessage: "No broker list returned by the fabric.",
dataProperties: {discardParentlessNodes: true},
canResizeFields: true,
canSort: false,
showSortArrow: "none",
showConnectors: true,
selectionUpdated : "update_selected_broker(record)",
fields: [
{name: "hostname", title: "Hostname", isOpen: true},
{name: "brokerId", title: "ID", isOpen: true}
]
});
openConsole.DetailViewer.create({
ID: "topology_broker_details",
overflow: "auto",
dataSource: topology_brokersDS,
emptyMessage: "No broker selected.",
fields:[
{name:"brokerId", title:"ID", primaryKey:true},
{name:"hostname", title:"Hostname", type: "string"},
{name:"policyHostname", title:"Hostname Override", type: "string"},
{name:"policyIpAddress", title:"IP Address", type: "string"},
{name:"policyHub", title:"Hub", type: "string"},
{name:"port", title:"Port", type: "string"},
{name:"webSocketPort", title:"WebSocket Port", type: "string"},
{name:"version", title:"Version", type: "string"},
{name:"startTime", title:"Start Time", type: "string"},
{name:"bridges", title:"Bridged Brokers", type: "string"},
{name:"bridgeChildren", title:"Parent Broker", type: "string"},
{name:"connectionLimit", title:"Client Connection Limit", type: "string"},
{name:"epoName", title:"Managing ePO", type: "string",
showIf:"valueList && valueList.localData && valueList.localData[0].epoName"},
{name:"ttlMins", title:"Broker Keep-alive Interval(minutes)", type: "string"}
],
formatCellValue: function formatCellValue(value, record, field) {
if(value != null) {
if(field.name === "bridgeChildren" || field.name === "bridges") {
return value.join(",
");
} else if(field.name === "startTime") {
var startDate = new Date(value * 1000);
return startDate.toLocaleString();
}
}
return value;
}
});
var topology_serviceDS = openConsole.RestDataSource.create({
ID:"topology_serviceDS",
fields:[
{name:"itemId", title:"ID", primaryKey:true},
{name:"serviceType", title:"Service Type", type: "string"},
{name:"brokerGuid", title:"Broker ID", type: "string"},
{name:"clientGuid", title:"Client ID", type: "string"},
{name:"managed", title:"Managed", type: "string"},
{name:"registrationTime", title:"Registration Time", type: "string"},
{name:"ttlMins", title:"TTL(min)", type: "string"},
{name:"requestTopics", title:"Request Topics", type: "string"},
{name:"unauthorizedTopics", title:"Unauthorized Topics", type: "string"},
{name:"certificates", title:"Certificates", type: "string"},
{name:"metaData", title:"Metadata", type: "string"}
],
dataURL:"/update_services"
});
openConsole.DetailViewer.create({
ID: "topology_service_details",
overflow: "auto",
dataSource: topology_serviceDS,
emptyMessage: "No local services.",
fields:[
{name:"itemId", title:"Service ID", primaryKey:true},
{name:"serviceType", title:"Service Type", type: "string"},
{name:"brokerGuid", title:"Broker ID", type: "string"},
{name:"clientGuid", title:"Client ID", type: "string"},
{name:"managed", title:"Managed", type: "string"},
{name:"registrationTime", title:"Registration Time", type: "string"},
{name:"ttlMins", title:"TTL(min)", type: "string"},
{name:"requestChannels", title:"Request Topics", type: "string"},
{name:"unauthorizedTopics", title:"Unauthorized Topics", type: "string"},
{name:"certificates", title:"Certificates", type: "string"},
{name:"metaData", title:"Metadata", type: "string"}
],
formatCellValue: function formatCellValue(value, record, field) {
if(value != null) {
if(field.name === "requestChannels" || field.name === "certificates") {
if(Array.isArray(value))
return value.join(",
");
} else if(field.name === "unauthorizedTopics") {
return "" + value.join(",
") + "";
} else if(field.name === "registrationTime") {
var registrationDate = new Date(value * 1000);
return registrationDate.toLocaleString();
}
}
return value;
}
});
openConsole.Form.VLayout.create({
ID: "broker_details_stack",
width: "100%",
height: "100%",
members: [
topology_broker_details,
topology_service_details
]
});
openConsole.HLayout.create({
ID: "topology_content_layout",
members: [
openConsole.SectionStack.create({
width: 325,
sections: [
{title: "Services", expanded: true, showHeader: false, items: [ "topology_brokersTree" ]},
]
}),
openConsole.SectionStack.create({
ID: "topology_broker_section_stack",
showResizeBar: false,
sections: [
{title: "Broker Information", expanded: true, items: [
isc.VLayout.create({
members: [
"topology_broker_details"
]
})
]},
{ID:"local_service_stack", title: "Local Services", expanded: true, items: [ "topology_service_details" ]}
]
})
]
});
openConsole.ModuleWindow.create({
ID: "topology_layout",
title: "Fabric Topology",
items: ["topology_content_layout"]
});
topology_brokersListPane.fetchData();
topology_firstLoad = true;
function update_selected_broker( broker )
{
if(broker)
{
topology_broker_details.fetchData({id:broker.brokerId});
topology_service_details.fetchData( null,
function( dsResponse, data ) {
// Remove services that are not local to this broker
var broker_services = data.filter(service => service.brokerGuid == topology_brokersTree.getSelectedRecord().brokerId);
topology_service_details.setData(broker_services);
//topology_broker_section_stack.expandSection("local_service_stack");
}, { showPrompt: false }
);
}
else
{
topology_broker_details.setData(null);
//topology_broker_section_stack.collapseSection("local_service_stack");
topology_service_details.setData(null);
}
}
function topology_fetch_broker_data()
{
topology_brokersDS.fetchData( null,
function( dsResponse, data ) {
var openState = topology_brokersListPane.getOpenState();
var selectedPaths = topology_brokersListPane.getSelectedState();
var gridData = topology_brokersListPane.getData();
gridData.reportCollisions = false;
var dataMap = data.reduce(function(map, broker) {
map[broker.brokerId] = broker;
return map;
}, {});
// Remove nodes from the tree that are not in the data
Object.keys(gridData.nodeIndex).filter(k => !dataMap.hasOwnProperty(k)).forEach(function(key) {
gridData.remove(gridData.nodeIndex[key]);
})
// Find newly added nodes and store both them and their parents to be expanded after updating the tree
var nodesToOpen = []
Object.keys(dataMap).filter(k => !gridData.nodeIndex.hasOwnProperty(k)).forEach(function(key) {
nodesToOpen.push(dataMap[key]);
if(dataMap[key].brokerParentId && gridData.nodeIndex[dataMap[key].brokerParentId])
nodesToOpen.push(dataMap[dataMap[key].brokerParentId]);
})
gridData.linkNodes(Object.values(dataMap));
topology_brokersListPane.setOpenState(openState);
topology_brokersListPane.setSelectedState(selectedPaths);
topology_brokersListPane.resort();
gridData.openFolders(nodesToOpen);
if(topology_firstLoad)
{
topology_brokersListPane.getData().openAll();
topology_firstLoad = false;
}
}, { showPrompt: false }
);
}
topology_fetch_broker_data();
function topologyWSHandler(message)
{
if(message.includes("brokersUpdated"))
topology_fetch_broker_data();
else if(message.includes("serviceUpdates"))
update_selected_broker(topology_brokersListPane.getSelectedRecord());
}
$(document).ready(function() {
ws.addHandler(topologyWSHandler);
});