From d5ea68dd2e815681b32721afe3c2855a1c17f9aa Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Tue, 3 Nov 2015 14:51:18 +0100 Subject: [PATCH] Allowed empty bridges #22 --- netjsonconfig/backends/openwrt/renderers.py | 10 +++++++-- netjsonconfig/schema.py | 9 +++----- tests/openwrt/test_network.py | 23 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/netjsonconfig/backends/openwrt/renderers.py b/netjsonconfig/backends/openwrt/renderers.py index 02180f539..4f11059d2 100644 --- a/netjsonconfig/backends/openwrt/renderers.py +++ b/netjsonconfig/backends/openwrt/renderers.py @@ -79,8 +79,14 @@ def _get_interfaces(self): }) # bridging if is_bridge: - uci_interface['ifname'] = bridge_members uci_interface['type'] = 'bridge' + # put bridge members in ifname attribute + if bridge_members: + uci_interface['ifname'] = bridge_members + # if no members, this is an empty bridge + else: + uci_interface['bridge_empty'] = True + del uci_interface['ifname'] # ensure type "bridge" is only given to one logical interface is_bridge = False # bridge has already been defined @@ -91,7 +97,7 @@ def _get_interfaces(self): # to these physical names uci_interface['ifname'] = 'br-{0}'.format(interface['name']) # delete bridge_members attribtue - if uci_interface.get('bridge_members'): + if uci_interface.get('bridge_members') is not None: del uci_interface['bridge_members'] # add address if any (with correct option name) if address_key and address_value: diff --git a/netjsonconfig/schema.py b/netjsonconfig/schema.py index 39be57119..2d9373c57 100644 --- a/netjsonconfig/schema.py +++ b/netjsonconfig/schema.py @@ -224,12 +224,9 @@ "bridge_members": { "type": "array", "title": "Bridge Members", - "minItems": 1, - "items": [ - { - "type": "string" - } - ] + "items": { + "type": "string" + } } } } diff --git a/tests/openwrt/test_network.py b/tests/openwrt/test_network.py index 44c06eb15..9ef2151e9 100644 --- a/tests/openwrt/test_network.py +++ b/tests/openwrt/test_network.py @@ -418,6 +418,26 @@ def test_eth_bridge(self): """) self.assertEqual(o.render(), expected) + def test_empty_bridge(self): + o = OpenWrt({ + "interfaces": [ + { + "network": "lan", + "name": "br-lan", + "type": "bridge", + "bridge_members": [] + } + ] + }) + expected = self._tabs("""package network + +config interface 'lan' + option bridge_empty '1' + option proto 'none' + option type 'bridge' +""") + self.assertEqual(o.render(), expected) + def test_dns(self): o = OpenWrt({ "interfaces": [ @@ -604,6 +624,9 @@ def test_bridge_members_schema(self): } ] }) + with self.assertRaises(ValidationError): + o.validate() + o.config['interfaces'][0]['bridge_members'] = [3] with self.assertRaises(ValidationError): o.validate() # ensure fix works