diff --git a/gns3server/api/routes/compute/projects.py b/gns3server/api/routes/compute/projects.py index 2a946c55a..76c88d2f0 100644 --- a/gns3server/api/routes/compute/projects.py +++ b/gns3server/api/routes/compute/projects.py @@ -191,8 +191,12 @@ async def create_batch_nios( nio_settings = jsonable_encoder(entry.nio, exclude_unset=True) # Dynamips.create_nio takes an extra positional `node` argument that # the base signature does not include. Detect it via parameter count. + # Dynamips.create_nio(self, node, nio_settings) exposes one extra + # positional on the bound method compared to the standard signature + # (self, nio_settings). Detect it: standard == 1 bound param, + # Dynamips == 2 bound params (node + nio_settings). sig = inspect.signature(node.manager.create_nio) - if len(sig.parameters) == 3: + if len(sig.parameters) >= 2: nio = node.manager.create_nio(node, nio_settings) else: nio = node.manager.create_nio(nio_settings) diff --git a/tests/api/routes/compute/test_projects.py b/tests/api/routes/compute/test_projects.py index f491f3c04..b64053d7d 100644 --- a/tests/api/routes/compute/test_projects.py +++ b/tests/api/routes/compute/test_projects.py @@ -260,24 +260,25 @@ class TestBatchNIOEdgeCases: @pytest.mark.asyncio async def test_dynamips_create_nio_passes_node_arg(self): """ - Dynamips.create_nio(self, node, nio_settings) takes an extra 'node' - positional; the batch handler detects this via parameter count. + Dynamips.create_nio(self, node, nio_settings) exposes 2 bound-method + params vs. the standard 1. The batch handler detects this via the + parameter count on the bound method and passes the extra 'node' + argument. """ import inspect - # Dynamips-style 3-param signature (self + node + nio_settings) - async def create_nio_with_node(self, node, nio_settings): - pass + class _FakeDynamips: + async def create_nio(self, node, nio_settings): + pass - sig = inspect.signature(create_nio_with_node) - assert len(sig.parameters) == 3 + class _FakeBase: + async def create_nio(self, nio_settings): + pass - # Standard base 2-param signature (self + nio_settings) - async def create_nio_base(self, nio_settings): - pass - - sig2 = inspect.signature(create_nio_base) - assert len(sig2.parameters) == 2 + dyn = _FakeDynamips() + base = _FakeBase() + assert len(inspect.signature(dyn.create_nio).parameters) == 2 # Dynamips + assert len(inspect.signature(base.create_nio).parameters) == 1 # standard @pytest.mark.asyncio async def test_qemu_dispatch_to_adapter_add_nio_binding(self):