yanger: handle all frr uptime formats

FRR prints uptime different based on how long it is. Prior to this
commit yanger expected uptime to be on the format HH:MM:SS which it is
as long as it's shorter than a day. If it's longer the format changes,
this commit handles this.

The commit also adds unit test data triggering the different formats
(<day, <week, >week).

Side note:
cli-pretty could be made to represent the data on "FRR format" again,
which is perhaps more human friendly.

Signed-off-by: Richard Alpe <richard@bit42.se>
This commit is contained in:
Richard Alpe
2024-10-08 10:06:32 +02:00
parent 3e8e8a2e99
commit 950e868eb3
3 changed files with 36 additions and 8 deletions
+30 -2
View File
@@ -6,6 +6,7 @@ import json
import sys # (built-in module)
import os
import argparse
from re import match
from datetime import datetime, timedelta, timezone
TESTPATH = ""
@@ -235,8 +236,35 @@ def add_hardware(hw_out):
def uptime2datetime(uptime):
"""Convert uptime (HH:MM:SS) to YANG format (YYYY-MM-DDTHH:MM:SS+00:00)"""
h, m, s = map(int, uptime.split(':'))
"""
Convert uptime to YANG format (YYYY-MM-DDTHH:MM:SS+00:00)
Handles the following input formats (frrtime):
HH:MM:SS
XdXXhXXm
XXwXdXXh
"""
h = m = s = 0
# Format HH:MM:SS
if match(r'^\d{2}:\d{2}:\d{2}$', uptime):
h, m, s = map(int, uptime.split(':'))
# Format XdXXhXXm (days, hours, minutes)
elif match(r'^\d+d\d{2}h\d{2}m$', uptime):
days = int(uptime.split('d')[0])
h = int(uptime.split('d')[1].split('h')[0])
m = int(uptime.split('h')[1].split('m')[0])
h += days * 24
# Format XwXdXXh (weeks, days, hours)
elif match(r'^\d{2}w\d{1}d\d{2}h$', uptime):
weeks = int(uptime.split('w')[0])
days = int(uptime.split('w')[1].split('d')[0])
h = int(uptime.split('d')[1].split('h')[0])
h += weeks * 7 * 24
h += days * 24
uptime_delta = timedelta(hours=h, minutes=m, seconds=s)
current_time = datetime_now()
last_updated = current_time - uptime_delta
@@ -6,6 +6,6 @@
10.0.13.0/30 110/2000 e5 ospfv2 0h0m0s
>* 10.0.13.0/30 0/0 e5 direct 0h0m0s
10.0.23.0/30 110/1 e6 ospfv2 0h0m0s
>* 10.0.23.0/30 0/0 e6 direct 0h0m0s
192.168.3.0/24 110/1 e2 ospfv2 0h0m0s
>* 192.168.3.0/24 0/0 e2 direct 0h0m0s
>* 10.0.23.0/30 0/0 e6 direct 20h10m5s
192.168.3.0/24 110/1 e2 ospfv2 133h5m0s
>* 192.168.3.0/24 0/0 e2 direct 205h0m0s
@@ -228,7 +228,7 @@
"internalNextHopActiveNum":1,
"nexthopGroupId":23,
"installedNexthopGroupId":23,
"uptime":"00:00:00",
"uptime":"20:10:05",
"nexthops":[
{
"flags":3,
@@ -256,7 +256,7 @@
"internalNextHopNum":1,
"internalNextHopActiveNum":1,
"nexthopGroupId":33,
"uptime":"00:00:00",
"uptime":"5d13h05m",
"nexthops":[
{
"flags":1,
@@ -286,7 +286,7 @@
"internalNextHopActiveNum":1,
"nexthopGroupId":17,
"installedNexthopGroupId":17,
"uptime":"00:00:00",
"uptime":"01w1d13h",
"nexthops":[
{
"flags":3,