Skip to content

Commit

Permalink
Merge pull request #906 from kernelkit/fix-yanger
Browse files Browse the repository at this point in the history
Yanger and CLI pretty fixes
  • Loading branch information
mattiaswal authored Jan 24, 2025
2 parents a225773 + 3f8fae2 commit dedab8c
Show file tree
Hide file tree
Showing 58 changed files with 1,063 additions and 646 deletions.
105 changes: 91 additions & 14 deletions src/statd/python/cli_pretty/cli_pretty.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,7 @@ def __init__(self, data):
self.stp_state = get_json_data('', self.data, 'infix-interfaces:bridge-port', 'stp-state')
self.containers = get_json_data('', self.data, 'infix-interfaces:container-network', 'containers')


if data.get('statistics'):
self.in_octets = data.get('statistics').get('in-octets', '')
self.out_octets = data.get('statistics').get('out-octets', '')
Expand All @@ -304,8 +305,8 @@ def __init__(self, data):
else:
self.ipv6_addr = []

if self.data.get('infix-interfaces:gre'):
self.gre = self.data['infix-interfaces:gre']
self.gre = self.data.get('infix-interfaces:gre')
self.vxlan = self.data.get('infix-interfaces:vxlan')

if self.data.get('infix-interfaces:vlan'):
self.lower_if = self.data.get('infix-interfaces:vlan', None).get('lower-layer-if',None)
Expand All @@ -325,9 +326,14 @@ def is_bridge(self):
def is_veth(self):
return self.data['type'] == "infix-if-type:veth"

def is_vxlan(self):
return self.data['type'] == "infix-if-type:vxlan"

def is_gre(self):
return self.data['type'] == "infix-if-type:gre" or self.data['type'] == "infix-if-type:gretap"
return self.data['type'] == "infix-if-type:gre"

def is_gretap(self):
return self.data['type'] == "infix-if-type:gretap"
def oper(self, detail=False):
"""Remap in brief overview to fit column widths."""
if not detail and self.oper_status == "lower-layer-down":
Expand Down Expand Up @@ -355,15 +361,47 @@ def pr_proto_ipv6(self, pipe=''):
row += f"{'':<{Pad.state}}{addr['ip']}/{addr['prefix-length']} {origin}"
print(row)

def pr_proto_eth(self, pipe=''):
def _pr_proto_common(self, name, phys_address, pipe=''):
row = ""
if len(pipe) > 0:
row = f"{pipe:<{Pad.iface}}"

row += f"{'ethernet':<{Pad.proto}}"
row += f"{name:<{Pad.proto}}"
dec = Decore.green if self.oper() == "up" else Decore.red
row += dec(f"{self.oper().upper():<{Pad.state}}")
row += f"{self.phys_address:<{Pad.data}}"
if phys_address:
row += f"{self.phys_address:<{Pad.data}}"
return row

def pr_proto_eth(self, pipe=''):
row = self._pr_proto_common("ethernet", True, pipe);
print(row)

def pr_proto_veth(self, pipe=''):
row = self._pr_proto_common("veth", True, pipe);

if self.lower_if:
row = f"{'':<{Pad.iface}}"
row += f"{'veth':<{Pad.proto}}"
row += f"{'':<{Pad.state}}"
row += f"peer:{self.lower_if}"

print(row)

def pr_proto_gretap(self, pipe=''):
row = self._pr_proto_common("gretap", True, pipe);
print(row)

def pr_proto_gre(self, pipe=''):
row = self._pr_proto_common("gre", False, pipe);
print(row)

def pr_proto_vxlan(self, pipe=''):
row = self._pr_proto_common("vxlan", True, pipe);
print(row)

def pr_proto_loopack(self, pipe=''):
row = self._pr_proto_common("loopback", False, pipe);
print(row)

def pr_proto_br(self, br_vlans):
Expand Down Expand Up @@ -423,17 +461,33 @@ def pr_bridge(self, _ifaces):
lower.pr_name(pipe)
lower.pr_proto_br(self.br_vlans)

def pr_loopback(self):
self.pr_name(pipe="")
self.pr_proto_loopack()
self.pr_proto_ipv4()
self.pr_proto_ipv6()

def pr_veth(self, _ifaces):
self.pr_name(pipe="")
self.pr_proto_eth()
self.pr_proto_veth()
self.pr_proto_ipv4()
self.pr_proto_ipv6()

if self.lower_if:
row = f"{'':<{Pad.iface}}"
row += f"{'veth':<{Pad.proto}}"
row += f"{'':<{Pad.state}}"
row += f"peer:{self.lower_if}"
print(row)
def pr_gre(self):
self.pr_name(pipe="")
self.pr_proto_gre()
self.pr_proto_ipv4()
self.pr_proto_ipv6()

def pr_gretap(self):
self.pr_name(pipe="")
self.pr_proto_gretap()
self.pr_proto_ipv4()
self.pr_proto_ipv6()

def pr_vxlan(self):
self.pr_name(pipe="")
self.pr_proto_vxlan()
self.pr_proto_ipv4()
self.pr_proto_ipv6()

Expand Down Expand Up @@ -469,7 +523,9 @@ def pr_iface(self):
print(Decore.gray_bg(f"{'owned by container':<{20}}: {', ' . join(self.containers)}"))

print(f"{'name':<{20}}: {self.name}")
print(f"{'type':<{20}}: {self.type.split(':')[1]}")
print(f"{'index':<{20}}: {self.index}")

if self.mtu:
print(f"{'mtu':<{20}}: {self.mtu}")
if self.oper():
Expand Down Expand Up @@ -518,6 +574,15 @@ def pr_iface(self):
else:
print(f"{'ipv6 addresses':<{20}}:")

if self.gre:
print(f"{'local address':<{20}}: {self.gre['local']}")
print(f"{'remote address':<{20}}: {self.gre['remote']}")

if self.vxlan:
print(f"{'local address':<{20}}: {self.vxlan['local']}")
print(f"{'remote address':<{20}}: {self.vxlan['remote']}")
print(f"{'VxLAN id':<{20}}: {self.vxlan['vni']}")

if self.in_octets and self.out_octets:
print(f"{'in-octets':<{20}}: {self.in_octets}")
print(f"{'out-octets':<{20}}: {self.out_octets}")
Expand Down Expand Up @@ -589,7 +654,7 @@ def pr_interface_list(json):
key=version_sort)
iface = find_iface(ifaces, "lo")
if iface:
print_interface(iface)
iface.pr_loopback()

for iface in [Iface(data) for data in ifaces]:
if iface.name == "lo":
Expand All @@ -607,6 +672,18 @@ def pr_interface_list(json):
iface.pr_veth(ifaces)
continue

if iface.is_gre():
iface.pr_gre()
continue

if iface.is_gretap():
iface.pr_gretap()
continue

if iface.is_vxlan():
iface.pr_vxlan()
continue

if iface.is_vlan():
iface.pr_vlan(ifaces)
continue
Expand Down
2 changes: 1 addition & 1 deletion src/statd/python/yanger/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def dirpath(path):
rrparser.add_argument("-r", "--replay", type=dirpath, metavar="DIR",
help="Generate output based on recorded system commands from DIR, " +
"rather than querying the local system")
rrparser.add_argument("-c", "--capture", type=dirpath, metavar="DIR",
rrparser.add_argument("-c", "--capture", metavar="DIR",
help="Capture system command output in DIR, such that the current system " +
"state can be recreated offline (with --replay) for testing purposes")

Expand Down
5 changes: 5 additions & 0 deletions src/statd/python/yanger/ietf_interfaces/link.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ def iplink2yang_type(iplink):
return "infix-if-type:dummy"
case "gretap"|"ip6gretap":
return "infix-if-type:gretap"
case "vxlan":
return "infix-if-type:vxlan"
case "veth":
return "infix-if-type:veth"
case "vlan":
Expand Down Expand Up @@ -121,6 +123,9 @@ def interface(iplink, ipaddr):
case "infix-if-type:ethernet":
if eth := ethernet.ethernet(iplink):
interface["ieee802-ethernet-interface:ethernet"] = eth
case "infix-if-type:vxlan":
if vxlan := tun.vxlan(iplink):
interface["infix-interfaces:vxlan"] = vxlan
case "infix-if-type:gre"|"infix-if-type:gretap":
if gre := tun.gre(iplink):
interface["infix-interfaces:gre"] = gre
Expand Down
17 changes: 13 additions & 4 deletions src/statd/python/yanger/ietf_interfaces/tun.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
def _get_local_remote(info):
return {
"local": info.get("local") or info.get("local6"),
"remote": info.get("remote") or info.get("remote6"),
}
def gre(iplink):
info=iplink.get("linkinfo", {}).get("info_data", {})

return {
"local": info["local"],
"remote": info["remote"],
}
return _get_local_remote(info)

def vxlan(iplink):
info=iplink.get("linkinfo", {}).get("info_data", {})
data=_get_local_remote(info)
data.update({"vni": info["id"]})

return data
Loading

0 comments on commit dedab8c

Please sign in to comment.