From 9c08c8c36747d0dc4935d319607a76ae6b28d9ad Mon Sep 17 00:00:00 2001 From: "Jonathan G. Underwood" Date: Wed, 29 Jul 2020 12:09:15 +0100 Subject: [PATCH] Add parser and tests for firewall forwardings --- .../backends/openwrt/converters/firewall.py | 7 ++ tests/openwrt/test_firewall.py | 91 +++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/netjsonconfig/backends/openwrt/converters/firewall.py b/netjsonconfig/backends/openwrt/converters/firewall.py index 7893344d5..e6298e2ba 100644 --- a/netjsonconfig/backends/openwrt/converters/firewall.py +++ b/netjsonconfig/backends/openwrt/converters/firewall.py @@ -118,6 +118,10 @@ def to_netjson_loop(self, block, result, index): zone = self.__netjson_zone(block) result["firewall"].setdefault("zones", []) result["firewall"]["zones"].append(zone) + if _type == "forwarding": + forwarding = self.__netjson_forwarding(block) + result["firewall"].setdefault("forwardings", []) + result["firewall"]["forwardings"].append(forwarding) return self.type_cast(result) @@ -149,3 +153,6 @@ def __netjson_zone(self, zone): zone["masq"] = zone.pop("masq") == "1" return self.type_cast(zone) + + def __netjson_forwarding(self, forwarding): + return self.type_cast(forwarding) diff --git a/tests/openwrt/test_firewall.py b/tests/openwrt/test_firewall.py index be5c23ae5..8190ac807 100644 --- a/tests/openwrt/test_firewall.py +++ b/tests/openwrt/test_firewall.py @@ -2,6 +2,7 @@ import unittest from netjsonconfig import OpenWrt +from netjsonconfig.exceptions import ValidationError from netjsonconfig.utils import _TabsMixin @@ -282,3 +283,93 @@ def test_parse_zone_2(self): def test_parse_zone_3(self): o = OpenWrt(native=self._zone_3_uci) self.assertEqual(o.config, self._zone_2_netjson) + + _forwarding_1_netjson = { + "firewall": {"forwardings": [{"src": "isolated", "dest": "wan"}]} + } + + _forwarding_1_uci = textwrap.dedent( + """\ + package firewall + + config defaults 'defaults' + + config forwarding 'forwarding_isolated_wan' + option src 'isolated' + option dest 'wan' + """ + ) + + def test_render_forwarding_1(self): + o = OpenWrt(self._forwarding_1_netjson) + expected = self._tabs(self._forwarding_1_uci) + self.assertEqual(o.render(), expected) + + def test_parse_forwarding_1(self): + o = OpenWrt(native=self._forwarding_1_uci) + self.assertEqual(o.config, self._forwarding_1_netjson) + + _forwarding_2_netjson = { + "firewall": { + "forwardings": [{"src": "isolated", "dest": "wan", "family": "ipv4"}] + } + } + + _forwarding_2_uci = textwrap.dedent( + """\ + package firewall + + config defaults 'defaults' + + config forwarding 'forwarding_isolated_wan_ipv4' + option src 'isolated' + option dest 'wan' + option family 'ipv4' + """ + ) + + def test_render_forwarding_2(self): + o = OpenWrt(self._forwarding_2_netjson) + expected = self._tabs(self._forwarding_2_uci) + self.assertEqual(o.render(), expected) + + def test_parse_forwarding_2(self): + o = OpenWrt(native=self._forwarding_2_uci) + self.assertEqual(o.config, self._forwarding_2_netjson) + + _forwarding_3_netjson = { + "firewall": {"forwardings": [{"src": "lan", "dest": "wan", "family": "any"}]} + } + + _forwarding_3_uci = textwrap.dedent( + """\ + package firewall + + config defaults 'defaults' + + config forwarding 'forwarding_lan_wan_any' + option src 'lan' + option dest 'wan' + option family 'any' + """ + ) + + def test_render_forwarding_3(self): + o = OpenWrt(self._forwarding_3_netjson) + expected = self._tabs(self._forwarding_3_uci) + self.assertEqual(o.render(), expected) + + def test_parse_forwarding_3(self): + o = OpenWrt(native=self._forwarding_3_uci) + self.assertEqual(o.config, self._forwarding_3_netjson) + + def test_forwarding_validation_error(self): + o = OpenWrt( + { + "firewall": { + "forwardings": [{"src": "lan", "dest": "wan", "family": "XXXXXX"}] + } + } + ) + with self.assertRaises(ValidationError): + o.validate()