Skip to content
Snippets Groups Projects
Commit 7b2ee4da authored by Saket Agrahari's avatar Saket Agrahari
Browse files

[COMP-340] : Passive-monitoring

parent 35e84392
No related branches found
No related tags found
1 merge request!105[COMP-340] : Passive-monitoring
...@@ -22,6 +22,7 @@ import ConnectedUserPage from "./pages/ConnectedUser"; ...@@ -22,6 +22,7 @@ import ConnectedUserPage from "./pages/ConnectedUser";
import FibreLightPage from "./pages/FibreLight"; import FibreLightPage from "./pages/FibreLight";
import MonitoringToolsPage from "./pages/MonitoringTools"; import MonitoringToolsPage from "./pages/MonitoringTools";
import NetworkPertTeam from "./pages/NetworkPertTeam"; import NetworkPertTeam from "./pages/NetworkPertTeam";
import PassiveMonitoringPage from "./pages/PaasiveMonitoring";
const router = createBrowserRouter([ const router = createBrowserRouter([
{ path: "/budget", element: <BudgetPage /> }, { path: "/budget", element: <BudgetPage /> },
...@@ -55,6 +56,7 @@ const router = createBrowserRouter([ ...@@ -55,6 +56,7 @@ const router = createBrowserRouter([
{ path: "/fibre-light", element: <FibreLightPage /> }, { path: "/fibre-light", element: <FibreLightPage /> },
{ path: "/monitoring-tools", element: <MonitoringToolsPage /> }, { path: "/monitoring-tools", element: <MonitoringToolsPage /> },
{ path: "/pert-team", element: <NetworkPertTeam /> }, { path: "/pert-team", element: <NetworkPertTeam /> },
{ path: "/passive-monitoring", element: <PassiveMonitoringPage /> },
{ path: "*", element: <Landing /> }, { path: "*", element: <Landing /> },
]); ]);
......
...@@ -41,6 +41,11 @@ export interface FibreLight extends NrenAndYearDatapoint { ...@@ -41,6 +41,11 @@ export interface FibreLight extends NrenAndYearDatapoint {
light_description: (string | null) light_description: (string | null)
} }
export interface PassiveMonitoring extends NrenAndYearDatapoint {
monitoring: boolean,
method: (string | null)
}
export interface PertTeam extends NrenAndYearDatapoint { export interface PertTeam extends NrenAndYearDatapoint {
pert_team: (string | null) pert_team: (string | null)
} }
......
...@@ -27,6 +27,11 @@ const NetworkSidebar = () => { ...@@ -27,6 +27,11 @@ const NetworkSidebar = () => {
<span>NRENs with Performance Enhancement Response Teams</span> <span>NRENs with Performance Enhancement Response Teams</span>
</Link> </Link>
</Row> </Row>
<Row>
<Link to="/passive-monitoring" className="link-text-underline">
<span>Methods for Passively Monitoring International Traffic</span>
</Link>
</Row>
</Sidebar> </Sidebar>
) )
} }
......
...@@ -157,7 +157,12 @@ function CompendiumData(): ReactElement { ...@@ -157,7 +157,12 @@ function CompendiumData(): ReactElement {
<Link to="/pert-team" className="link-text-underline"> <Link to="/pert-team" className="link-text-underline">
<span>NRENs with Performance Enhancement Response Teams</span> <span>NRENs with Performance Enhancement Response Teams</span>
</Link> </Link>
</Row> </Row>
<Row>
<Link to="/passive-monitoring" className="link-text-underline">
<span>Methods for Passively Monitoring International Traffic</span>
</Link>
</Row>
</div> </div>
</CollapsibleBox> </CollapsibleBox>
<CollapsibleBox title={Sections.Services} startCollapsed> <CollapsibleBox title={Sections.Services} startCollapsed>
......
import React, { useContext } from "react";
import { Table } from "react-bootstrap";
import { FibreLight, PassiveMonitoring } from "../Schema";
import { createMatrixDataLookup } from "../helpers/dataconversion";
import ColorPill from "../components/ColorPill";
import DataPage from "../components/DataPage";
import Filter from "../components/graphing/Filter";
import { Sections } from "../helpers/constants";
import { FilterSelectionContext } from "../helpers/FilterSelectionProvider";
import ChartContainer from "../components/graphing/ChartContainer";
import { useData } from "../helpers/useData";
function PassiveMonitoringPage(): React.ReactElement {
const { filterSelection, setFilterSelection } = useContext(FilterSelectionContext);
const { data: passiveMonitoringData, years, nrens } = useData<PassiveMonitoring>('/api/network/passive-monitoring', setFilterSelection);
const selectedData = (passiveMonitoringData).filter(data =>
filterSelection.selectedYears.includes(data.year) && filterSelection.selectedNrens.includes(data.nren)
);
const dataLookup = createMatrixDataLookup(selectedData, 'monitoring');
const filterNode = <Filter
filterOptions={{ availableYears: [...years], availableNrens: [...nrens.values()] }}
filterSelection={filterSelection}
setFilterSelection={setFilterSelection}
coloredYears
/>
const showYears = [...filterSelection.selectedYears.filter(year => years.has(year))].sort();
return (
<DataPage title="Methods for Passively Monitoring International Traffic"
description="The table below shows the methods NRENs use for the passive monitoring of international traffic."
category={Sections.Network} filter={filterNode}
data={selectedData} filename="passive_monitoring_nrens_per_year">
<>
<ChartContainer>
<Table className="charging-struct-table" striped bordered responsive>
<colgroup>
<col span={1} style={{ width: "12%" }} />
<col span={1} style={{ width: "22%" }} />
<col span={1} style={{ width: "22%" }} />
<col span={1} style={{ width: "22%" }} />
<col span={1} style={{ width: "22%" }} />
</colgroup>
<thead>
<tr>
<th></th>
<th>No monitoring occurs</th>
<th>SPAN ports</th>
<th>Passive optical TAPS</th>
<th>Both SPAN ports and passive optical TAPS</th>
</tr>
</thead>
<tbody>
{Array.from(dataLookup.entries()).map(([nren, nrenMap]) => (
<tr key={nren}>
<td>{nren}</td>
{["False", "True"].map(column_key => (
<React.Fragment key={column_key}>
{column_key === "False" && nrenMap.has(column_key) ? (
<>
<td key={`${column_key}`}>
{/* Display ColorPill components for the "False" case */}
{showYears.map(year => (
<ColorPill key={year} year={year} active={nrenMap.get(column_key)!.has(year)} tooltip={""} />
))}
{/* Add additional <td> elements after the ColorPill components for placeholder */}
</td>
<td></td>
<td></td>
<td></td>
</>
):
null}
</React.Fragment>
))}
{nrenMap.has("True") ? (
<>
<td></td>
{// Above td is placeholder, If nrenMap has "True", iterate over ["taps", "span_ports", "both"]
["taps", "span_ports", "both"].map(method => (
<td key={`True-${method}`}>
{
showYears.map(year => {
const chargingYears = nrenMap.get("True")!;
const yearData = chargingYears.get(year);
// console.log(yearData?.nren, ' yearData-->', yearData?.method , ' ==',method,' <--method')
if (yearData && yearData.method === method) {
return (
<ColorPill key={year} year={year} active={chargingYears.has(year)} tooltip={""} />
);
} else {
return null; // If condition is not met, return null
}
})}
</td>
))}
</>
) : null}
</tr>
))}
</tbody>
</Table>
</ChartContainer>
</>
</DataPage>
);
}
export default PassiveMonitoringPage;
from typing import Any from typing import Any
from compendium_v2.db.presentation_models import PertTeam from compendium_v2.db.presentation_models import PertTeam, PassiveMonitoring
from compendium_v2.routes import common from compendium_v2.routes import common
from flask import Blueprint, jsonify from flask import Blueprint, jsonify
...@@ -25,6 +25,26 @@ PERT_TEAM_RESPONSE_SCHEMA = { ...@@ -25,6 +25,26 @@ PERT_TEAM_RESPONSE_SCHEMA = {
'items': {'$ref': '#/definitions/pert_team'} 'items': {'$ref': '#/definitions/pert_team'}
} }
PASSIVE_MONITORING_RESPONSE_SCHEMA = {
'$schema': 'http://json-schema.org/draft-07/schema#',
'definitions': {
'pert_team': {
'type': 'object',
'properties': {
'nren': {'type': 'string'},
'nren_country': {'type': 'string'},
'year': {'type': 'integer'},
'monitoring': {'type': 'string'},
"method" : {'type': 'string'},
},
'required': ['nren', 'nren_country', 'year', 'pert_team'],
'additionalProperties': False
}
},
'type': 'array',
'items': {'$ref': '#/definitions/pert_team'}
}
def pert_team_extract_data(pert_team: PertTeam) -> dict: def pert_team_extract_data(pert_team: PertTeam) -> dict:
return { return {
...@@ -59,3 +79,42 @@ def pert_team_view() -> Any: ...@@ -59,3 +79,42 @@ def pert_team_view() -> Any:
entries.append(pert_team_extract_data(entry)) entries.append(pert_team_extract_data(entry))
return jsonify(entries) return jsonify(entries)
def passive_monitoring_extract_data(passive_monitoring: PassiveMonitoring) -> dict:
return {
'nren': passive_monitoring.nren.name,
'nren_country': passive_monitoring.nren.country,
'year': int(passive_monitoring.year),
'monitoring': str(passive_monitoring.monitoring),
'method': passive_monitoring.method.value
if passive_monitoring.method is not None else None,
}
@routes.route('/passive-monitoring', methods=['GET'])
@common.require_accepts_json
def passive_monitoring_view() -> Any:
"""
handler for /api/network/pert-team requests
Endpoint for getting the fibre operation models the NREN.
This endpoint retrieves fibre operation model that of the NREN.
response will be formatted as:
.. asjson::
compendium_v2.routes.monitoring_tools.PERT_TEAM_RESPONSE_SCHEMA
:return:
"""
entries = []
records = common.get_data(PassiveMonitoring)
for entry in records:
entries.append(passive_monitoring_extract_data(entry))
return jsonify(entries)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment