From 22269b6057eae2fa883d9a2852baf3e86e165a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Thu, 18 Jan 2024 16:18:26 +0100 Subject: [PATCH] Yanger: Implement ietf-hardware Wrap all VPD data and show them as components in ietf-hardware. --- board/netconf/rootfs/libexec/infix/yanger | 52 ++++++++++++++++++++++- src/confd/bin/bootstrap | 2 + 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/board/netconf/rootfs/libexec/infix/yanger b/board/netconf/rootfs/libexec/infix/yanger index e0083a9f..8c3cca04 100755 --- a/board/netconf/rootfs/libexec/infix/yanger +++ b/board/netconf/rootfs/libexec/infix/yanger @@ -4,6 +4,7 @@ import subprocess import json import sys # (built-in module) import argparse +from datetime import datetime def json_get_yang_type(iface_in): if iface_in['link_type'] == "loopback": @@ -117,6 +118,49 @@ def iface_is_dsa(iface_in): return False return True +def get_vpd_vendor_extensions(data): + vendor_extensions=[] + for ext in data: + vendor_extension = {} + vendor_extension["iana-enterprise-number"] = ext[0] + vendor_extension["extension-data"] = ext[1] + vendor_extensions.append(vendor_extension) + return vendor_extensions + +def get_vpd_data(vpd): + component={} + component["name"]=vpd.get("board") + component["infix-hardware:vpd-data"] = {} + + if vpd.get("data"): + if vpd["data"].get("manufacture-date"): + component["mfg-date"]=datetime.strptime(vpd["data"]["manufacture-date"],"%m/%d/%Y %H:%M:%S").strftime("%Y-%m-%-dT%H:%M:%SZ") + if vpd["data"].get("manufacter"): + component["mfg-name"]=vpd["data"]["manufacturer"] + if vpd["data"].get("product-name"): + component["model-name"]=vpd["data"]["product-name"] + if vpd["data"].get("serial-number"): + component["serial-num"]=vpd["data"]["serial-number"] + + # Set VPD-data entrys + for k,v in vpd["data"].items(): + if vpd["data"].get(k): + if k != "vendor-extension": + component["infix-hardware:vpd-data"][k] = v + else: + vendor_extensions=get_vpd_vendor_extensions(v) + component["infix-hardware:vpd-data"]["infix-hardware:vendor-extension"] = vendor_extensions + return component + +def add_hardware(hw_out, test): + cmd = ['cat', "/run/system.json"] + data = run_json_cmd(cmd) + components=[] + for _,vpd in data.get("vpd").items(): + component=get_vpd_data(vpd) + components.append(component) + insert(hw_out, "component", components) + def get_routes(routes, proto, data): out={} out["route"] = [] @@ -560,7 +604,7 @@ if __name__ == "__main__": add_ipv4_route(ipv4routes, args.test) add_ipv6_route(ipv6routes, args.test) elif (args.model == 'ietf-ospf'): - yang_data= { + yang_data = { "ietf-routing:routing": { "control-plane-protocols": { "control-plane-protocol": [ @@ -577,6 +621,12 @@ if __name__ == "__main__": } } add_ospf(yang_data['ietf-routing:routing']['control-plane-protocols']['control-plane-protocol'][0]["ietf-ospf:ospf"]) + elif (args.model == 'ietf-hardware'): + yang_data = { + "ietf-hardware:hardware": { + } + } + add_hardware(yang_data["ietf-hardware:hardware"], args.test) else: print(f"Unsupported model {args.model}", file=sys.stderr) sys.exit(1) diff --git a/src/confd/bin/bootstrap b/src/confd/bin/bootstrap index ddcf8903..faa22c63 100755 --- a/src/confd/bin/bootstrap +++ b/src/confd/bin/bootstrap @@ -210,6 +210,8 @@ sysrepoctl -s $SEARCH \ -e bfd \ -e explicit-router-id \ -i iana-if-type@2023-01-26.yang -g wheel -p 0660 \ + -i iana-hardware@2018-03-13.yang -g wheel -p 0660 \ + -i ietf-hardware@2018-03-13.yang -g wheel -p 0660 \ -i ieee802-dot1q-types@2022-10-29.yang -g wheel -p 0660 \ -i infix-ip@2023-09-14.yang -g wheel -p 0660 \ -i infix-if-type@2023-08-21.yang -g wheel -p 0660 \