aboutsummaryrefslogtreecommitdiff
path: root/rumba/irm_backend.py
diff options
context:
space:
mode:
Diffstat (limited to 'rumba/irm_backend.py')
-rw-r--r--rumba/irm_backend.py83
1 files changed, 52 insertions, 31 deletions
diff --git a/rumba/irm_backend.py b/rumba/irm_backend.py
index e9cc5c6..e859e21 100644
--- a/rumba/irm_backend.py
+++ b/rumba/irm_backend.py
@@ -29,6 +29,8 @@ Provides two implementations:
"""
import abc
+from packaging.version import Version
+
import rumba.log as log
from rumba.elements.topology import LayerType
@@ -220,26 +222,48 @@ class IrmPython(IrmBackend):
def __init__(self):
try:
- from ouroboros import irm as _irm
from ouroboros import cli as _cli
- self._irm = _irm
self._cli = _cli
logger.info("pyouroboros IRM backend loaded successfully")
except ImportError:
raise ImportError(
"pyouroboros is required for Python backend. "
"Install it from the pyouroboros repository.")
+ self._check_version()
+
+ @staticmethod
+ def _check_version():
+ """Verify PyOuroboros is on the same patch level as Rumba.
+
+ Uses PEP 440 ordering so that dev/pre-release versions sort
+ correctly: tag 0.23.0 accepts 0.23.1.dev0 (setuptools_scm's
+ representation of the first commit after 0.23.0) because
+ 0.23.0 <= 0.23.1.dev0 < 0.23.1 in PEP 440.
+ """
+ import importlib.metadata
+ from rumba._version import version as rumba_ver
+
+ pyouro_ver = Version(importlib.metadata.version("PyOuroboros"))
+ floor = Version(rumba_ver)
+ parts = [int(x) for x in rumba_ver.split(".")[:3]]
+ parts[2] += 1
+ ceiling = Version(".".join(str(x) for x in parts))
+ if pyouro_ver < floor or pyouro_ver >= ceiling:
+ raise RuntimeError(
+ "PyOuroboros >= %s, < %s required (lockstep with Rumba), "
+ "got %s" % (floor, ceiling, pyouro_ver)
+ )
def _get_ipcp_type(self, layer_type):
"""Convert LayerType to pyouroboros IpcpType."""
type_map = {
- LayerType.LOCAL: self._irm.IpcpType.LOCAL,
- LayerType.UNICAST: self._irm.IpcpType.UNICAST,
- LayerType.BROADCAST: self._irm.IpcpType.BROADCAST,
- LayerType.ETH_LLC: self._irm.IpcpType.ETH_LLC,
- LayerType.ETH_DIX: self._irm.IpcpType.ETH_DIX,
- LayerType.UDP4: self._irm.IpcpType.UDP4,
- LayerType.UDP6: self._irm.IpcpType.UDP6,
+ LayerType.LOCAL: self._cli.IpcpType.LOCAL,
+ LayerType.UNICAST: self._cli.IpcpType.UNICAST,
+ LayerType.BROADCAST: self._cli.IpcpType.BROADCAST,
+ LayerType.ETH_LLC: self._cli.IpcpType.ETH_LLC,
+ LayerType.ETH_DIX: self._cli.IpcpType.ETH_DIX,
+ LayerType.UDP4: self._cli.IpcpType.UDP4,
+ LayerType.UDP6: self._cli.IpcpType.UDP6,
}
return type_map[layer_type]
@@ -253,9 +277,8 @@ class IrmPython(IrmBackend):
def bootstrap_ipcp(self, node, name, layer_type, layer_name,
policies=None, eth_dev=None, ip_addr=None,
autobind=True):
- pid = self._cli.pid_of(name)
ipcp_type = self._get_ipcp_type(layer_type)
- irm = self._irm
+ cli = self._cli
# Build config based on type
if layer_type == LayerType.UNICAST:
@@ -269,28 +292,28 @@ class IrmPython(IrmBackend):
for comp, pol in policies.items():
if comp == 'rmt.pff':
pol_map = {
- 'lfa': irm.LinkStatePolicy.LFA,
- 'ecmp': irm.LinkStatePolicy.ECMP,
- 'simple': irm.LinkStatePolicy.SIMPLE,
+ 'lfa': cli.LinkStatePolicy.LFA,
+ 'ecmp': cli.LinkStatePolicy.ECMP,
+ 'simple': cli.LinkStatePolicy.SIMPLE,
}
if pol in pol_map:
ls_kwargs['pol'] = pol_map[pol]
if ls_kwargs:
- routing_kwargs['ls'] = irm.LinkStateConfig(**ls_kwargs)
+ routing_kwargs['ls'] = cli.LinkStateConfig(**ls_kwargs)
if routing_kwargs:
- dt_kwargs['routing'] = irm.RoutingConfig(**routing_kwargs)
+ dt_kwargs['routing'] = cli.RoutingConfig(**routing_kwargs)
if dt_kwargs:
- uc_kwargs['dt'] = irm.DtConfig(**dt_kwargs)
+ uc_kwargs['dt'] = cli.DtConfig(**dt_kwargs)
- conf = irm.IpcpConfig(
+ conf = cli.IpcpConfig(
ipcp_type=ipcp_type,
layer_name=layer_name,
- unicast=irm.UnicastConfig(**uc_kwargs))
+ unicast=cli.UnicastConfig(**uc_kwargs))
elif layer_type in (LayerType.ETH_DIX, LayerType.ETH_LLC):
- eth_conf = irm.EthConfig(dev=eth_dev or "")
- conf = irm.IpcpConfig(
+ eth_conf = cli.EthConfig(dev=eth_dev or "")
+ conf = cli.IpcpConfig(
ipcp_type=ipcp_type,
layer_name=layer_name,
eth=eth_conf)
@@ -299,37 +322,35 @@ class IrmPython(IrmBackend):
udp4_kwargs = {}
if ip_addr:
udp4_kwargs['ip_addr'] = ip_addr
- conf = irm.IpcpConfig(
+ conf = cli.IpcpConfig(
ipcp_type=ipcp_type,
layer_name=layer_name,
- udp4=irm.Udp4Config(**udp4_kwargs))
+ udp4=cli.Udp4Config(**udp4_kwargs))
elif layer_type == LayerType.UDP6:
udp6_kwargs = {}
if ip_addr:
udp6_kwargs['ip_addr'] = ip_addr
- conf = irm.IpcpConfig(
+ conf = cli.IpcpConfig(
ipcp_type=ipcp_type,
layer_name=layer_name,
- udp6=irm.Udp6Config(**udp6_kwargs))
+ udp6=cli.Udp6Config(**udp6_kwargs))
else:
- conf = irm.IpcpConfig(
+ conf = cli.IpcpConfig(
ipcp_type=ipcp_type,
layer_name=layer_name)
- self._cli.bootstrap_ipcp(pid, conf, autobind=autobind)
+ self._cli.bootstrap_ipcp(name, conf, autobind=autobind)
logger.debug("Bootstrapped IPCP %s in layer %s", name, layer_name)
def enroll_ipcp(self, node, name, dst_name, autobind=True):
- pid = self._cli.pid_of(name)
- self._cli.enroll_ipcp(pid, dst_name, autobind=autobind)
+ self._cli.enroll_ipcp(name, dst_name, autobind=autobind)
logger.debug("Enrolled IPCP %s via %s", name, dst_name)
def connect_ipcp(self, node, name, dst_name):
- pid = self._cli.pid_of(name)
- self._cli.connect_ipcp(pid, dst_name)
+ self._cli.connect_ipcp(name, dst_name)
logger.debug("Connected IPCP %s to %s", name, dst_name)
def reg_name(self, node, name, ipcp_names):