bgp_parsed = {
const bgp = {'initial_peers': 0, 'update_msg': [], 'visibility': [], 'po_vis': {}};
const peer_state = new Set();
const po_state = new Object;
for (const idx in bgp_raw.data.initial_state) {
const init_state = bgp_raw.data.initial_state[ idx ];
peer_state.add( init_state.source_id );
var po = init_state.target_prefix + " " + init_state.path[ init_state.path.length - 1 ];
if (! po_state.hasOwnProperty( po ) ) {
po_state[ po ] = new Set();
}
po_state[ po ].add( init_state.source_id );
bgp.initial_peers += 1;
}
bgp.visibility.push({'ts': bgp_raw.data.query_starttime, 'cnt': peer_state.size});
for ( var po in po_state ) {
bgp.po_vis[ po ] = [];
bgp.po_vis[ po ].push({'ts': bgp_raw.data.query_starttime, 'cnt': po_state[po].size})
}
for (var idx in bgp_raw.data.events) {
const msg = bgp_raw.data.events[ idx ];
const ts = msg.timestamp;
if( msg.type == 'A' ) {
peer_state.add( msg.attrs.source_id );
var po = msg.attrs.target_prefix + " " + msg.attrs.path[ msg.attrs.path.length - 1 ];
if (! po_state.hasOwnProperty( po ) ) {
po_state[ po ] = new Set();
}
po_state[ po ].add( msg.attrs.source_id )
}
if( msg.type == 'W' ) {
for ( var po in po_state ) {
po_state[ po ].delete( msg.attrs.source_id )
}
peer_state.delete( msg.attrs.source_id )
}
if ( peer_state.size != bgp.visibility[ bgp.visibility.length - 1 ]['cnt'] ) {
if ( msg.timestamp != bgp.visibility[ bgp.visibility.length - 1]['ts'] ) { // only chance once per ts granularity (seconds) # need to keep as string for this to work
bgp.visibility.push({'ts': ts, 'cnt': peer_state.size});
}
}
bgp.update_msg.push({'ts': parseTimeStat( msg['timestamp'] )
})
// update the per prefix/origin visibility timelines
for ( var po in po_state ) {
if (! bgp.po_vis.hasOwnProperty( po ) ) {
bgp.po_vis[ po ] = [];
bgp.po_vis[ po ].push({'ts': ts, 'cnt': po_state[ po ].size });
} else {
var old_rec = bgp.po_vis[ po ][ bgp.po_vis[ po ].length - 1 ];
if ( old_rec['ts'] != ts && old_rec['cnt'] != po_state[ po ].size ) {
bgp.po_vis[ po ].push({'ts': ts, 'cnt': po_state[ po ].size });
}
}
}
} // end processing each event
// put a stopper at the end
bgp.visibility.push({'ts': bgp_raw.data.query_endtime, 'cnt': peer_state.size});
for ( var po in bgp.po_vis ) {
const cnt = bgp.po_vis[ po ][ bgp.po_vis[po].length - 1 ]['cnt'];
bgp.po_vis[ po ].push({'ts': bgp_raw.data.query_endtime, 'cnt': cnt });
}
return bgp
}