updates to netclient, providing commonly used network commands in more convenient functions
This commit is contained in:
parent
a798774f18
commit
e4bb315c14
6 changed files with 203 additions and 324 deletions
|
@ -2,87 +2,94 @@
|
|||
Clients for dealing with bridge/interface commands.
|
||||
"""
|
||||
|
||||
import abc
|
||||
import os
|
||||
|
||||
from future.utils import with_metaclass
|
||||
|
||||
from core.constants import BRCTL_BIN, IP_BIN, OVS_BIN
|
||||
from core.constants import BRCTL_BIN, ETHTOOL_BIN, IP_BIN, OVS_BIN, TC_BIN
|
||||
from core.utils import check_cmd
|
||||
|
||||
|
||||
class NetClientBase(with_metaclass(abc.ABCMeta)):
|
||||
"""
|
||||
Base client for running command line bridge/interface commands.
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def create_bridge(self, name):
|
||||
"""
|
||||
Create a network bridge to connect interfaces to.
|
||||
|
||||
:param str name: bridge name
|
||||
:return: nothing
|
||||
"""
|
||||
pass
|
||||
|
||||
@abc.abstractmethod
|
||||
def delete_bridge(self, name):
|
||||
"""
|
||||
Delete a network bridge.
|
||||
|
||||
:param str name: bridge name
|
||||
:return: nothing
|
||||
"""
|
||||
pass
|
||||
|
||||
@abc.abstractmethod
|
||||
def create_interface(self, bridge_name, interface_name):
|
||||
"""
|
||||
Create an interface associated with a network bridge.
|
||||
|
||||
:param str bridge_name: bridge name
|
||||
:param str interface_name: interface name
|
||||
:return: nothing
|
||||
"""
|
||||
pass
|
||||
|
||||
@abc.abstractmethod
|
||||
def delete_interface(self, bridge_name, interface_name):
|
||||
"""
|
||||
Delete an interface associated with a network bridge.
|
||||
|
||||
:param str bridge_name: bridge name
|
||||
:param str interface_name: interface name
|
||||
:return: nothing
|
||||
"""
|
||||
pass
|
||||
|
||||
@abc.abstractmethod
|
||||
def existing_bridges(self, _id):
|
||||
"""
|
||||
Checks if there are any existing bridges for a node.
|
||||
|
||||
:param _id: node id to check bridges for
|
||||
"""
|
||||
pass
|
||||
|
||||
@abc.abstractmethod
|
||||
def disable_mac_learning(self, name):
|
||||
"""
|
||||
Disable mac learning for a bridge.
|
||||
|
||||
:param str name: bridge name
|
||||
:return: nothing
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
class LinuxNetClient(NetClientBase):
|
||||
class LinuxNetClient(object):
|
||||
"""
|
||||
Client for creating Linux bridges and ip interfaces for nodes.
|
||||
"""
|
||||
|
||||
def __init__(self, run_func):
|
||||
self.run_func = run_func
|
||||
|
||||
def run(self, cmd):
|
||||
return self.run_func(cmd)
|
||||
|
||||
def set_hostname(self, name):
|
||||
self.run(["hostname", name])
|
||||
|
||||
def add_route(self, route, device):
|
||||
self.run([IP_BIN, "route", "add", route, "dev", device])
|
||||
|
||||
def device_up(self, device):
|
||||
self.run([IP_BIN, "link", "set", device, "up"])
|
||||
|
||||
def device_down(self, device):
|
||||
self.run([IP_BIN, "link", "set", device, "down"])
|
||||
|
||||
def device_name(self, device, name):
|
||||
self.run([IP_BIN, "link", "set", device, "name", name])
|
||||
|
||||
def device_show(self, device):
|
||||
return self.run([IP_BIN, "link", "show", device])
|
||||
|
||||
def device_ns(self, device, namespace):
|
||||
self.run([IP_BIN, "link", "set", device, "netns", namespace])
|
||||
|
||||
def device_flush(self, device):
|
||||
self.run([IP_BIN, "-6", "address", "flush", "dev", device])
|
||||
|
||||
def device_mac(self, device, mac):
|
||||
self.run([IP_BIN, "link", "set", "dev", device, "address", mac])
|
||||
|
||||
def delete_device(self, device):
|
||||
self.run([IP_BIN, "link", "delete", device])
|
||||
|
||||
def delete_tc(self, device):
|
||||
self.run([TC_BIN, "qdisc", "del", "dev", device, "root"])
|
||||
|
||||
def checksums_off(self, interface_name):
|
||||
self.run([ETHTOOL_BIN, "-K", interface_name, "rx", "off", "tx", "off"])
|
||||
|
||||
def delete_address(self, device, address):
|
||||
self.run([IP_BIN, "address", "delete", address, "dev", device])
|
||||
|
||||
def create_veth(self, name, peer):
|
||||
self.run(
|
||||
[IP_BIN, "link", "add", "name", name, "type", "veth", "peer", "name", peer]
|
||||
)
|
||||
|
||||
def create_gretap(self, device, address, local, ttl, key):
|
||||
cmd = [IP_BIN, "link", "add", device, "type", "gretap", "remote", address]
|
||||
if local is not None:
|
||||
cmd.extend(["local", local])
|
||||
if ttl is not None:
|
||||
cmd.extend(["ttl", ttl])
|
||||
if key is not None:
|
||||
cmd.extend(["key", key])
|
||||
self.run(cmd)
|
||||
|
||||
def create_address(self, device, address, broadcast=None):
|
||||
if broadcast is not None:
|
||||
self.run(
|
||||
[
|
||||
IP_BIN,
|
||||
"address",
|
||||
"add",
|
||||
address,
|
||||
"broadcast",
|
||||
broadcast,
|
||||
"dev",
|
||||
device,
|
||||
]
|
||||
)
|
||||
else:
|
||||
self.run([IP_BIN, "address", "add", address, "dev", device])
|
||||
|
||||
def create_bridge(self, name):
|
||||
"""
|
||||
Create a Linux bridge and bring it up.
|
||||
|
@ -90,10 +97,10 @@ class LinuxNetClient(NetClientBase):
|
|||
:param str name: bridge name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([BRCTL_BIN, "addbr", name])
|
||||
check_cmd([BRCTL_BIN, "stp", name, "off"])
|
||||
check_cmd([BRCTL_BIN, "setfd", name, "0"])
|
||||
check_cmd([IP_BIN, "link", "set", name, "up"])
|
||||
self.run([BRCTL_BIN, "addbr", name])
|
||||
self.run([BRCTL_BIN, "stp", name, "off"])
|
||||
self.run([BRCTL_BIN, "setfd", name, "0"])
|
||||
self.device_up(name)
|
||||
|
||||
# turn off multicast snooping so forwarding occurs w/o IGMP joins
|
||||
snoop = "/sys/devices/virtual/net/%s/bridge/multicast_snooping" % name
|
||||
|
@ -108,8 +115,8 @@ class LinuxNetClient(NetClientBase):
|
|||
:param str name: bridge name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([IP_BIN, "link", "set", name, "down"])
|
||||
check_cmd([BRCTL_BIN, "delbr", name])
|
||||
self.device_down(name)
|
||||
self.run([BRCTL_BIN, "delbr", name])
|
||||
|
||||
def create_interface(self, bridge_name, interface_name):
|
||||
"""
|
||||
|
@ -119,8 +126,8 @@ class LinuxNetClient(NetClientBase):
|
|||
:param str interface_name: interface name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([BRCTL_BIN, "addif", bridge_name, interface_name])
|
||||
check_cmd([IP_BIN, "link", "set", interface_name, "up"])
|
||||
self.run([BRCTL_BIN, "addif", bridge_name, interface_name])
|
||||
self.device_up(interface_name)
|
||||
|
||||
def delete_interface(self, bridge_name, interface_name):
|
||||
"""
|
||||
|
@ -130,7 +137,7 @@ class LinuxNetClient(NetClientBase):
|
|||
:param str interface_name: interface name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([BRCTL_BIN, "delif", bridge_name, interface_name])
|
||||
self.run([BRCTL_BIN, "delif", bridge_name, interface_name])
|
||||
|
||||
def existing_bridges(self, _id):
|
||||
"""
|
||||
|
@ -138,7 +145,7 @@ class LinuxNetClient(NetClientBase):
|
|||
|
||||
:param _id: node id to check bridges for
|
||||
"""
|
||||
output = check_cmd([BRCTL_BIN, "show"])
|
||||
output = self.run([BRCTL_BIN, "show"])
|
||||
lines = output.split("\n")
|
||||
for line in lines[1:]:
|
||||
columns = line.split()
|
||||
|
@ -160,7 +167,7 @@ class LinuxNetClient(NetClientBase):
|
|||
check_cmd([BRCTL_BIN, "setageing", name, "0"])
|
||||
|
||||
|
||||
class OvsNetClient(NetClientBase):
|
||||
class OvsNetClient(LinuxNetClient):
|
||||
"""
|
||||
Client for creating OVS bridges and ip interfaces for nodes.
|
||||
"""
|
||||
|
@ -172,11 +179,11 @@ class OvsNetClient(NetClientBase):
|
|||
:param str name: bridge name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([OVS_BIN, "add-br", name])
|
||||
check_cmd([OVS_BIN, "set", "bridge", name, "stp_enable=false"])
|
||||
check_cmd([OVS_BIN, "set", "bridge", name, "other_config:stp-max-age=6"])
|
||||
check_cmd([OVS_BIN, "set", "bridge", name, "other_config:stp-forward-delay=4"])
|
||||
check_cmd([IP_BIN, "link", "set", name, "up"])
|
||||
self.run([OVS_BIN, "add-br", name])
|
||||
self.run([OVS_BIN, "set", "bridge", name, "stp_enable=false"])
|
||||
self.run([OVS_BIN, "set", "bridge", name, "other_config:stp-max-age=6"])
|
||||
self.run([OVS_BIN, "set", "bridge", name, "other_config:stp-forward-delay=4"])
|
||||
self.device_up(name)
|
||||
|
||||
def delete_bridge(self, name):
|
||||
"""
|
||||
|
@ -185,8 +192,8 @@ class OvsNetClient(NetClientBase):
|
|||
:param str name: bridge name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([IP_BIN, "link", "set", name, "down"])
|
||||
check_cmd([OVS_BIN, "del-br", name])
|
||||
self.device_down(name)
|
||||
self.run([OVS_BIN, "del-br", name])
|
||||
|
||||
def create_interface(self, bridge_name, interface_name):
|
||||
"""
|
||||
|
@ -196,8 +203,8 @@ class OvsNetClient(NetClientBase):
|
|||
:param str interface_name: interface name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([OVS_BIN, "add-port", bridge_name, interface_name])
|
||||
check_cmd([IP_BIN, "link", "set", interface_name, "up"])
|
||||
self.run([OVS_BIN, "add-port", bridge_name, interface_name])
|
||||
self.device_up(interface_name)
|
||||
|
||||
def delete_interface(self, bridge_name, interface_name):
|
||||
"""
|
||||
|
@ -207,7 +214,7 @@ class OvsNetClient(NetClientBase):
|
|||
:param str interface_name: interface name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([OVS_BIN, "del-port", bridge_name, interface_name])
|
||||
self.run([OVS_BIN, "del-port", bridge_name, interface_name])
|
||||
|
||||
def existing_bridges(self, _id):
|
||||
"""
|
||||
|
@ -215,7 +222,7 @@ class OvsNetClient(NetClientBase):
|
|||
|
||||
:param _id: node id to check bridges for
|
||||
"""
|
||||
output = check_cmd([OVS_BIN, "list-br"])
|
||||
output = self.run([OVS_BIN, "list-br"])
|
||||
if output:
|
||||
for line in output.split("\n"):
|
||||
fields = line.split(".")
|
||||
|
@ -230,4 +237,4 @@ class OvsNetClient(NetClientBase):
|
|||
:param str name: bridge name
|
||||
:return: nothing
|
||||
"""
|
||||
check_cmd([OVS_BIN, "set", "bridge", name, "other_config:mac-aging-time=0"])
|
||||
self.run([OVS_BIN, "set", "bridge", name, "other_config:mac-aging-time=0"])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue