Data Source

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 “ != ” might be a KPI check.

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.

Convey in the Table

Really what operators need to be able to identity are KPIs that did not pass their checks. Again if the check is something like “ != ” and these two variables equal each other that’s bad and that operators needs to be able to find this info.

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.

Functionality

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.

Formatting

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())
            )
          )