added type hinting for core.nodes

This commit is contained in:
Blake Harnden 2020-01-13 14:08:49 -08:00
parent 4e71759ac9
commit c0fcc91d10
10 changed files with 534 additions and 360 deletions

View file

@ -2,30 +2,17 @@
Clients for dealing with bridge/interface commands.
"""
import json
from typing import Callable
from core.constants import ETHTOOL_BIN, IP_BIN, OVS_BIN, TC_BIN
def get_net_client(use_ovs, run):
"""
Retrieve desired net client for running network commands.
:param bool use_ovs: True for OVS bridges, False for Linux bridges
:param func run: function used to run net client commands
:return: net client class
"""
if use_ovs:
return OvsNetClient(run)
else:
return LinuxNetClient(run)
class LinuxNetClient:
"""
Client for creating Linux bridges and ip interfaces for nodes.
"""
def __init__(self, run):
def __init__(self, run: Callable) -> None:
"""
Create LinuxNetClient instance.
@ -33,7 +20,7 @@ class LinuxNetClient:
"""
self.run = run
def set_hostname(self, name):
def set_hostname(self, name: str) -> None:
"""
Set network hostname.
@ -42,7 +29,7 @@ class LinuxNetClient:
"""
self.run(f"hostname {name}")
def create_route(self, route, device):
def create_route(self, route: str, device: str) -> None:
"""
Create a new route for a device.
@ -52,7 +39,7 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} route add {route} dev {device}")
def device_up(self, device):
def device_up(self, device: str) -> None:
"""
Bring a device up.
@ -61,7 +48,7 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} link set {device} up")
def device_down(self, device):
def device_down(self, device: str) -> None:
"""
Bring a device down.
@ -70,7 +57,7 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} link set {device} down")
def device_name(self, device, name):
def device_name(self, device: str, name: str) -> None:
"""
Set a device name.
@ -80,7 +67,7 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} link set {device} name {name}")
def device_show(self, device):
def device_show(self, device: str) -> str:
"""
Show information for a device.
@ -90,7 +77,7 @@ class LinuxNetClient:
"""
return self.run(f"{IP_BIN} link show {device}")
def get_mac(self, device):
def get_mac(self, device: str) -> str:
"""
Retrieve MAC address for a given device.
@ -100,7 +87,7 @@ class LinuxNetClient:
"""
return self.run(f"cat /sys/class/net/{device}/address")
def get_ifindex(self, device):
def get_ifindex(self, device: str) -> str:
"""
Retrieve ifindex for a given device.
@ -110,7 +97,7 @@ class LinuxNetClient:
"""
return self.run(f"cat /sys/class/net/{device}/ifindex")
def device_ns(self, device, namespace):
def device_ns(self, device: str, namespace: str) -> None:
"""
Set netns for a device.
@ -120,7 +107,7 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} link set {device} netns {namespace}")
def device_flush(self, device):
def device_flush(self, device: str) -> None:
"""
Flush device addresses.
@ -132,7 +119,7 @@ class LinuxNetClient:
shell=True,
)
def device_mac(self, device, mac):
def device_mac(self, device: str, mac: str) -> None:
"""
Set MAC address for a device.
@ -142,7 +129,7 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} link set dev {device} address {mac}")
def delete_device(self, device):
def delete_device(self, device: str) -> None:
"""
Delete device.
@ -151,7 +138,7 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} link delete {device}")
def delete_tc(self, device):
def delete_tc(self, device: str) -> None:
"""
Remove traffic control settings for a device.
@ -160,7 +147,7 @@ class LinuxNetClient:
"""
self.run(f"{TC_BIN} qdisc delete dev {device} root")
def checksums_off(self, interface_name):
def checksums_off(self, interface_name: str) -> None:
"""
Turns interface checksums off.
@ -169,7 +156,7 @@ class LinuxNetClient:
"""
self.run(f"{ETHTOOL_BIN} -K {interface_name} rx off tx off")
def create_address(self, device, address, broadcast=None):
def create_address(self, device: str, address: str, broadcast: str = None) -> None:
"""
Create address for a device.
@ -185,7 +172,7 @@ class LinuxNetClient:
else:
self.run(f"{IP_BIN} address add {address} dev {device}")
def delete_address(self, device, address):
def delete_address(self, device: str, address: str) -> None:
"""
Delete an address from a device.
@ -195,7 +182,7 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} address delete {address} dev {device}")
def create_veth(self, name, peer):
def create_veth(self, name: str, peer: str) -> None:
"""
Create a veth pair.
@ -205,7 +192,9 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} link add name {name} type veth peer name {peer}")
def create_gretap(self, device, address, local, ttl, key):
def create_gretap(
self, device: str, address: str, local: str, ttl: int, key: int
) -> None:
"""
Create a GRE tap on a device.
@ -225,7 +214,7 @@ class LinuxNetClient:
cmd += f" key {key}"
self.run(cmd)
def create_bridge(self, name):
def create_bridge(self, name: str) -> None:
"""
Create a Linux bridge and bring it up.
@ -238,7 +227,7 @@ class LinuxNetClient:
self.run(f"{IP_BIN} link set {name} type bridge mcast_snooping 0")
self.device_up(name)
def delete_bridge(self, name):
def delete_bridge(self, name: str) -> None:
"""
Bring down and delete a Linux bridge.
@ -248,7 +237,7 @@ class LinuxNetClient:
self.device_down(name)
self.run(f"{IP_BIN} link delete {name} type bridge")
def create_interface(self, bridge_name, interface_name):
def create_interface(self, bridge_name: str, interface_name: str) -> None:
"""
Create an interface associated with a Linux bridge.
@ -259,7 +248,7 @@ class LinuxNetClient:
self.run(f"{IP_BIN} link set dev {interface_name} master {bridge_name}")
self.device_up(interface_name)
def delete_interface(self, bridge_name, interface_name):
def delete_interface(self, bridge_name: str, interface_name: str) -> None:
"""
Delete an interface associated with a Linux bridge.
@ -269,11 +258,12 @@ class LinuxNetClient:
"""
self.run(f"{IP_BIN} link set dev {interface_name} nomaster")
def existing_bridges(self, _id):
def existing_bridges(self, _id: int) -> bool:
"""
Checks if there are any existing Linux bridges for a node.
:param _id: node id to check bridges for
:return: True if there are existing bridges, False otherwise
"""
output = self.run(f"{IP_BIN} -j link show type bridge")
bridges = json.loads(output)
@ -286,7 +276,7 @@ class LinuxNetClient:
return True
return False
def disable_mac_learning(self, name):
def disable_mac_learning(self, name: str) -> None:
"""
Disable mac learning for a Linux bridge.
@ -301,7 +291,7 @@ class OvsNetClient(LinuxNetClient):
Client for creating OVS bridges and ip interfaces for nodes.
"""
def create_bridge(self, name):
def create_bridge(self, name: str) -> None:
"""
Create a OVS bridge and bring it up.
@ -314,7 +304,7 @@ class OvsNetClient(LinuxNetClient):
self.run(f"{OVS_BIN} set bridge {name} other_config:stp-forward-delay=4")
self.device_up(name)
def delete_bridge(self, name):
def delete_bridge(self, name: str) -> None:
"""
Bring down and delete a OVS bridge.
@ -324,7 +314,7 @@ class OvsNetClient(LinuxNetClient):
self.device_down(name)
self.run(f"{OVS_BIN} del-br {name}")
def create_interface(self, bridge_name, interface_name):
def create_interface(self, bridge_name: str, interface_name: str) -> None:
"""
Create an interface associated with a network bridge.
@ -335,7 +325,7 @@ class OvsNetClient(LinuxNetClient):
self.run(f"{OVS_BIN} add-port {bridge_name} {interface_name}")
self.device_up(interface_name)
def delete_interface(self, bridge_name, interface_name):
def delete_interface(self, bridge_name: str, interface_name: str) -> None:
"""
Delete an interface associated with a OVS bridge.
@ -345,11 +335,12 @@ class OvsNetClient(LinuxNetClient):
"""
self.run(f"{OVS_BIN} del-port {bridge_name} {interface_name}")
def existing_bridges(self, _id):
def existing_bridges(self, _id: int) -> bool:
"""
Checks if there are any existing OVS bridges for a node.
:param _id: node id to check bridges for
:return: True if there are existing bridges, False otherwise
"""
output = self.run(f"{OVS_BIN} list-br")
if output:
@ -359,7 +350,7 @@ class OvsNetClient(LinuxNetClient):
return True
return False
def disable_mac_learning(self, name):
def disable_mac_learning(self, name: str) -> None:
"""
Disable mac learning for a OVS bridge.
@ -367,3 +358,17 @@ class OvsNetClient(LinuxNetClient):
:return: nothing
"""
self.run(f"{OVS_BIN} set bridge {name} other_config:mac-aging-time=0")
def get_net_client(use_ovs: bool, run: Callable) -> LinuxNetClient:
"""
Retrieve desired net client for running network commands.
:param bool use_ovs: True for OVS bridges, False for Linux bridges
:param func run: function used to run net client commands
:return: net client class
"""
if use_ovs:
return OvsNetClient(run)
else:
return LinuxNetClient(run)