diff options
Diffstat (limited to 'rumba/irm_backend.py')
| -rw-r--r-- | rumba/irm_backend.py | 83 |
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): |
