The data used for the assignment is from work. My team designs automation tools for telecommunication systems. Currently that means software to maintain legacy network infrastructure. Massive global internet usage growth coupled with supply chain issues over the last few years means every piece of hardware needs to be operating at max efficiency.
Unfortunately, some of the older networking hardware is not really maintenance friendly - but hey that’s why I have a job :)
Due to this unfriendly nature the team has been tasked with automating various aspects including Upgrades. Upgrades for network infrastructure hardware is a bit more involved then letting your phone update over 20-30min. It requires maintenance windows, on-site operators, network traffic has to be redirected, etc; there are a lot of moving peaces logistically before our software can even run.
While the Upgrades are preformed what we call Key-Performance-Indicators (KPI, i.e. important things) are logged before and after the Upgrade and then compared as a final check. For example the version of the hardware should change over the course of the upgrade so something such as “
A quick note is some of the language in the data is rather verbose. This is by design as this information is used by on site operators identify issues. Sometimes the hardware is so out of wack it’s just better to let a human fix it instead of any semi-smart program. The naming of the data is also generated as a function of how Network Engineers program the Upgrades as our tool can be thought of as a very high level programming language. So while the wording can be verbose it has precise meaning.
Really what operators need to be able to identity are KPIs that did not pass their checks. Again if the check is something like “
Our operators work on headless servers (OS has no GUI- just a terminal) so in practice there are some techniques we use to help navigate data.
For this assignment I wanted to look at how we can generate after-action reports. While our operators use terminals it would be nice to collect information about the upgrade for the Network Engineering Mangers in a more human friendly manor.
To this main I wanted to be able to cleanly display all KPIs are allow readers to quickly verify the status of all KPIs.
Again this comes back to allowing the readers to view information quickly so decisions can be made quickly. Below there are two different styles of the data: a simpler table that would look good in a PDF report and a second move involved table that would go well for an emailed report.
In both styles the goal was simple and easy to read. The data used for this assignment is maybe 60% of what the final list will be. Project spec is the these reports have to be generated in the order seen below so readability was long lists was key (data is in the order the KPI is generated so its easy to go down a check-list for verification - the number at the front of the KPI name is a long story but it has to be there too).
For the first table (PDF report) was given the stripped pattern just to make life easier. The second table (email report) keeps to project spec but adds a search bar. I thought that was a good middle ground.
# load libs and data
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.1.2
library(knitr)
library(sparkline)
## Warning: package 'sparkline' was built under R version 4.1.2
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.3 ✓ dplyr 1.0.8
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 2.0.0 ✓ forcats 0.5.1
## Warning: package 'dplyr' was built under R version 4.1.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::group_rows() masks kableExtra::group_rows()
## x dplyr::lag() masks stats::lag()
library(DT)
## Warning: package 'DT' was built under R version 4.1.2
data = read.csv("/Users/brendo/repos/tables-brendo61-byte/data.csv")
table = data %>%
select(KPI, Result, Indicator.Name, Pre.Check.Value, Post.Check.Value, Operation, Logic.ID) %>%
kbl(
col.names = c(
"KPI",
"Result",
"Indicator Name",
"Pre-Check Value",
"Post Check Value",
"Operation",
"Logic ID"
),
align = c("l","c","l","l","l","c","c")) %>%
kable_styling(font_size=12, fixed_thead = TRUE) %>%
kable_paper(lightable_options = "striped", html_font = "sans-serif", full_width = TRUE)
table
KPI | Result | Indicator Name | Pre-Check Value | Post Check Value | Operation | Logic ID |
---|---|---|---|---|---|---|
1_Show_Running_Config | TRUE | 0/LC0 | 0/LC0 | 0/LC0 | equals | 1 |
1_Show_Running_Config | TRUE | GCC10/10/0/0 | GCC10/10/0/0 | GCC10/10/0/0 | equals | 1 |
1_Show_Running_Config | TRUE | 0/LC1 | 0/LC1 | 0/LC1 | equals | 1 |
1_Show_Running_Config | TRUE | TenGigE0/0/0/6/0 | TenGigE0/0/0/6/0 | TenGigE0/0/0/6/0 | equals | 1 |
1_Show_Running_Config | TRUE | TenGigE0/4/0/11 | TenGigE0/4/0/11 | TenGigE0/4/0/11 | equals | 1 |
1_Show_Running_Config | TRUE | TenGigE0/4/0/61.1 | TenGigE0/4/0/61.1 | TenGigE0/4/0/61.1 | equals | 1 |
1_Show_Running_Config | TRUE | Optics0/2/0/0 | Optics0/2/0/0 | Optics0/2/0/0 | equals | 1 |
1_Show_Running_Config | TRUE | Optics0/2/0/1 | Optics0/2/0/1 | Optics0/2/0/1 | equals | 1 |
1_Show_Running_Config | TRUE | ODU40/6/0/1 | ODU40/6/0/1 | ODU40/6/0/1 | equals | 1 |
1_Show_Running_Config | TRUE | HundredGigE0/0/0/6 | HundredGigE0/0/0/6 | HundredGigE0/0/0/6 | equals | 1 |
1_Show_Running_Config | TRUE | HundredGigE0/0/0/6.4001 | HundredGigE0/0/0/6.4001 | HundredGigE0/0/0/6.4001 | equals | 1 |
1_Show_Running_Config | TRUE | GCC10/6/0/1 | GCC10/6/0/1 | GCC10/6/0/1 | equals | 1 |
1_Show_Running_Config | TRUE | HundredGigE0/8/0/111 | HundredGigE0/8/0/111 | HundredGigE0/8/0/111 | equals | 1 |
1_Show_Running_Config | TRUE | GCC10/10/0/1 | GCC10/10/0/1 | GCC10/10/0/1 | equals | 1 |
1_Show_Running_Config | TRUE | HundredGigE0/12/0/6 | HundredGigE0/12/0/6 | HundredGigE0/12/0/6 | equals | 1 |
1_Show_Running_Config | TRUE | HundredGigE0/12/0/6.4001 | HundredGigE0/12/0/6.4001 | HundredGigE0/12/0/6.4001 | equals | 1 |
1_Show_Running_Config | TRUE | GCC10/14/0/0 | GCC10/14/0/0 | GCC10/14/0/0 | equals | 1 |
1_Show_Running_Config | TRUE | GCC10/14/0/1 | GCC10/14/0/1 | GCC10/14/0/1 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface HundredGigE0/8/0/10.4001 | interface HundredGigE0/8/0/10.4001 | interface HundredGigE0/8/0/10.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface FortyGigE0/4/0/1.4001 | interface FortyGigE0/4/0/1.4001 | interface FortyGigE0/4/0/1.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface FortyGigE0/4/0/6.4001 | interface FortyGigE0/4/0/6.4001 | interface FortyGigE0/4/0/6.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface FortyGigE0/8/0/1.4001 | interface FortyGigE0/8/0/1.4001 | interface FortyGigE0/8/0/1.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface FortyGigE0/8/0/6.4001 | interface FortyGigE0/8/0/6.4001 | interface FortyGigE0/8/0/6.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface HundredGigE0/3/0/10.4001 | interface HundredGigE0/3/0/10.4001 | interface HundredGigE0/3/0/10.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface HundredGigE0/8/0/11.4001 | interface HundredGigE0/8/0/11.4001 | interface HundredGigE0/8/0/11.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface HundredGigE0/12/0/10.4001 | interface HundredGigE0/12/0/10.4001 | interface HundredGigE0/12/0/10.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface HundredGigE0/12/0/11.4001 | interface HundredGigE0/12/0/11.4001 | interface HundredGigE0/12/0/11.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface HundredGigE0/4/0/11.4001 | interface HundredGigE0/4/0/11.4001 | interface HundredGigE0/4/0/11.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface HundredGigE0/0/0/10/2.4001 | interface HundredGigE0/0/0/10/2.4001 | interface HundredGigE0/0/0/10/2.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface None.4001 | interface None.4001 | interface None.4001 | equals | 1 |
36_Verify_NCS4K_Frr_Enabled_On_MPLS_TE_Ports | TRUE | interface HundredGigE0/4/0/10.4001 | interface HundredGigE0/4/0/10.4001 | interface HundredGigE0/4/0/10.4001 | equals | 1 |
48_Show_IS_IS_Neighbors | TRUE | BE205.4001 | Up | Up | equals | 1 |
48_Show_IS_IS_Neighbors | TRUE | Fo0/4/0/6.4001 | Up | Up | equals | 1 |
48_Show_IS_IS_Neighbors | TRUE | Fo0/8/0/6.4001 | Up | Up | equals | 1 |
48_Show_IS_IS_Neighbors | TRUE | BE105.4001 | Up | Up | equals | 1 |
48_Show_IS_IS_Neighbors | TRUE | Fo0/4/0/1.4001 | Up | Up | equals | 1 |
48_Show_IS_IS_Neighbors | TRUE | Fo0/8/0/1.4001 | Up | Up | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.254.161 | Established | Established | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.254.11 | Established | Established | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.254.12 | Established | Established | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.254.160 | Established | Established | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.252.1 | Active | Active | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.252.5 | Idle | Idle | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 2004:192:168:252::1 | Idle | Idle | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 2004:192:168:252::5 | Idle | Idle | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.251.1 | Idle | Idle | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.251.5 | Idle | Idle | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 2004:192:168:251::1 | Idle | Idle | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 2004:192:168:251::5 | Idle | Idle | equals | 1 |
49_Show_BGP_Neighbor | TRUE | 192.168.254.165 | Idle | Idle | equals | 1 |
50_Show_Interfaces | TRUE | Nu0 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Lo0 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Lo200 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Lo300 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Lo400 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | ti0 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Gi0/0/0/1 | admin-down admin-down | admin-down admin-down | equals | 1 |
50_Show_Interfaces | TRUE | Te0/0/0/2 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Te0/0/0/30 | admin-down admin-down | admin-down admin-down | equals | 1 |
50_Show_Interfaces | TRUE | Te0/0/0/32.200 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Te0/0/0/32.202 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Hu0/0/1/3 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Mg0/RP0/CPU0/0 | up up | up up | equals | 1 |
50_Show_Interfaces | TRUE | Gi0/0/0/0 | down down | down down | equals | 1 |
51_Show_BGP_Neighbor | TRUE | 10.201.1.105 | up | up | equals | 1 |
51_Show_BGP_Neighbor | TRUE | 10.201.1.105 | 1 | 1 | equals | 2 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | MIX1_12411_NAUSSAU | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_Brooklynn_M4_4K_t65513_Hu0_4_0_11.4001_11.102.0. | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_Brooklynn_M4_4K_t65497_Hu0_12_0_10.4001_11.103.0 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_Brooklynn_M4_4K_t65484_Hu0_8_0_11.4001_11.102.0. | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_Weschester_M3_4K_t65469_Hu0_15_0_10.4001_11.101. | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_SUFFORK_M2_4K_t60704_Hu0_4_0_10.4001_11.103.0.10 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_Weschester_M3_4K_t65269_Hu0_8_0_10.4001_11.102.0 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_Weschester_M3_4K_t65437_Hu0_2_0_10.4001_11.101.0 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | GMPLS_UNI_Optics0/14/0/11 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_HUBMC_4P3_4K_t60856_Hu0_8_0_10.4001_11.103.0.108 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | GMPLS_UNI_Optics0/12/0/11 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | *tunnel_te60406 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | autob_HUBMC_4P3_4K_t60857_Hu0_8_0_10.4001_11.103.0.108 | up up | up up | equals | 1 |
52_Show_MPLS_Traffic_Eng_Tunnels_Brief | TRUE | GMPLS_UNI_Optics0/8/0/11 | up up | up up | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC3/7 | UP 2 12 1 F1/FC3/7 3/FC2/5 | UP 2 12 1 F1/FC3/7 3/FC2/5 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F0/FC4/6 | DN 0 12 1 F0/FC4/6 3/FC0/2 | DN 0 12 1 F0/FC4/6 3/FC0/2 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC2/7 | DN 2 12 12 F1/FC2/7 3/FC2/1 | DN 2 12 12 F1/FC2/7 3/FC2/1 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC6/2 | UP 2 12 7 F1/FC6/2 1/FC2/2 | UP 2 12 7 F1/FC6/2 1/FC2/2 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC5/2 | UP 3 12 7 F2/FC5/2 1/FC3/2 | UP 3 12 7 F2/FC5/2 1/FC3/2 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC6/4 | UP 2 12 7 F1/FC6/4 2/FC2/2 | UP 2 12 7 F1/FC6/4 2/FC2/2 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC6/5 | UP 2 12 7 F1/FC6/5 2/FC2/3 | UP 2 12 7 F1/FC6/5 2/FC2/3 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC6/6 | UP 2 12 7 F1/FC6/6 3/FC2/2 | UP 2 12 7 F1/FC6/6 3/FC2/2 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC6/7 | UP 2 12 7 F1/FC6/7 3/FC2/3 | UP 2 12 7 F1/FC6/7 3/FC2/3 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC7/0 | UP 2 12 1 F1/FC7/0 0/FC2/6 | UP 2 12 1 F1/FC7/0 0/FC2/6 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC3/4 | DN 3 12 12 F2/FC3/4 2/FC3/8 | DN 3 12 12 F2/FC3/4 2/FC3/8 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC5/0 | UP 3 12 7 F2/FC5/0 0/FC3/2 | UP 3 12 7 F2/FC5/0 0/FC3/2 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC5/1 | UP 3 12 7 F2/FC5/1 0/FC3/3 | UP 3 12 7 F2/FC5/1 0/FC3/3 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC5/6 | UP 1 12 1 F1/FC5/6 3/FC1/10 | UP 1 12 1 F1/FC5/6 3/FC1/10 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC5/3 | UP 3 12 7 F2/FC5/3 1/FC3/3 | UP 3 12 7 F2/FC5/3 1/FC3/3 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC5/5 | UP 3 12 7 F2/FC5/5 2/FC3/3 | UP 3 12 7 F2/FC5/5 2/FC3/3 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC5/6 | UP 3 12 7 F2/FC5/6 3/FC3/2 | UP 3 12 7 F2/FC5/6 3/FC3/2 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC5/7 | UP 3 12 7 F2/FC5/7 3/FC3/3 | UP 3 12 7 F2/FC5/7 3/FC3/3 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC6/7 | UP 3 12 1 F2/FC6/7 3/FC3/7 | UP 3 12 1 F2/FC6/7 3/FC3/7 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F1/FC6/3 | UP 2 12 7 F1/FC6/3 1/FC2/3 | UP 2 12 7 F1/FC6/3 1/FC2/3 | equals | 1 |
56_Admin_Show_Controller_Fabric_Bundle | TRUE | F2/FC5/4 | UP 3 12 7 F2/FC5/4 2/FC3/2 | UP 3 12 7 F2/FC5/4 2/FC3/2 | equals | 1 |
62a_Show_L2vpn_Xconnect_Location | TRUE | M4_to_HMC_tag | UP Te0/0/0/6/1.179 UP 11.101.0.144 179 UP | UP Te0/0/0/6/1.179 UP 11.101.0.144 179 UP | equals | 1 |
62a_Show_L2vpn_Xconnect_Location | TRUE | PW_PingTest_ME | UP BE999.1999 UP 11.103.0.83 99999 UP | UP BE999.1999 UP 11.103.0.83 99999 UP | equals | 1 |
62a_Show_L2vpn_Xconnect_Location | TRUE | BROOK_HUB3_INTER | UR Hu0/0/0/1.999 UR 11.104.0.179 999 DN | UR Hu0/0/0/1.999 UR 11.104.0.179 999 DN | equals | 1 |
62a_Show_L2vpn_Xconnect_Location | TRUE | EPNM_Bro_VS05_T2T | UP Te0/0/0/6/1.2 UP 11.101.0.174 200 UP | UP Te0/0/0/6/1.2 UP 11.101.0.174 200 UP | equals | 1 |
62a_Show_L2vpn_Xconnect_Location | TRUE | CE4_Brooklyn_10022 | UR Hu0/0/0/1.100 UR 11.101.0.80 10022 DN | UR Hu0/0/0/1.100 UR 11.101.0.80 10022 DN | equals | 1 |
62a_Show_L2vpn_Xconnect_Location | TRUE | macsec_2000 | DN Te0/7/0/6/2.2000 UP 11.108.0.99 2000 DN | DN Te0/7/0/6/2.2000 UP 11.108.0.99 2000 DN | equals | 1 |
62a_Show_L2vpn_Xconnect_Location | TRUE | vlan10 | UP Te0/0/0/6/1.10 UP Hu0/7/0/1.10 UP | UP Te0/0/0/6/1.10 UP Hu0/7/0/1.10 UP | equals | 1 |
69_Show_L2VPN_Xconnect_Brief | TRUE | DOWN | 1 | 1 | equals | 1 |
69_Show_L2VPN_Xconnect_Brief | TRUE | UNRESOLVED | 2 | 2 | equals | 1 |
69_Show_L2VPN_Xconnect_Brief | TRUE | UP | 4 | 4 | equals | 1 |
datatable(data = data, class = 'cell-border hover', rownames = FALSE,
caption = htmltools::tags$caption(
style = 'caption-side: bottom; text-align: center;',
'KPI Report: ', htmltools::em(Sys.Date())
)
)