diff --git a/tests/integration/targets/vyos_vrf/tests/cli/_parsed.cfg b/tests/integration/targets/vyos_vrf/tests/cli/_parsed.cfg index b0eb373a..2b083b79 100644 --- a/tests/integration/targets/vyos_vrf/tests/cli/_parsed.cfg +++ b/tests/integration/targets/vyos_vrf/tests/cli/_parsed.cfg @@ -1,14 +1,34 @@ set vrf bind-to-all set vrf name vrf1 description 'Parser Test VRF 1' set vrf name vrf1 disable set vrf name vrf1 table 101 set vrf name vrf1 vni 501 set vrf name vrf2 description 'Parser Test VRF 2' set vrf name vrf2 disable set vrf name vrf2 table 102 set vrf name vrf2 vni 102 set vrf name vrf1 ip disable-forwarding set vrf name vrf1 ip nht no-resolve-via-default set vrf name vrf-red ip protocol kernel route-map 'rm1' set vrf name vrf-red ip protocol ospf route-map 'rm1' set vrf name vrf-red ipv6 nht no-resolve-via-default +set vrf name vrf-green protocols ospf area '4' +set vrf name vrf-green protocols ospf area 4 area-type stub default-cost 20 +set vrf name vrf-green protocols ospf area 4 network 192.0.2.0/24 +set vrf name vrf-green protocols ospf area 4 range 192.0.3.0/24 +set vrf name vrf-green protocols ospf area 4 range 192.0.3.0/24 cost 10 +set vrf name vrf-green protocols ospf area 4 range 192.0.4.0/24 +set vrf name vrf-green protocols ospf area 4 range 192.0.4.0/24 cost 12 +set vrf name vrf-green protocols ospfv3 area '2' +set vrf name vrf-green protocols ospfv3 area 2 export-list export1 +set vrf name vrf-green protocols ospfv3 area 2 import-list import1 +set vrf name vrf-green protocols ospfv3 area 2 range 2001:db10::/32 +set vrf name vrf-green protocols ospfv3 area 2 range 2001:db20::/32 +set vrf name vrf-green protocols ospfv3 area 2 range 2001:db30::/32 +set vrf name vrf-green protocols static route 192.0.2.0/24 +set vrf name vrf-green protocols static route 192.0.2.0/24 blackhole distance '10' +set vrf name vrf-green protocols static route 192.0.2.0/24 next-hop '203.0.113.1' +set vrf name vrf-green protocols static route 192.0.2.0/24 next-hop '203.0.113.2' +set vrf name vrf-green protocols static route6 2001:db8::/32 +set vrf name vrf-green protocols static route6 2001:db8::/32 blackhole distance '20' +set vrf name vrf-green protocols static route6 2001:db8::/32 next-hop '2001:db8::1'" diff --git a/tests/integration/targets/vyos_vrf/tests/cli/merged.yaml b/tests/integration/targets/vyos_vrf/tests/cli/merged.yaml index 637ab1db..0a93ae02 100644 --- a/tests/integration/targets/vyos_vrf/tests/cli/merged.yaml +++ b/tests/integration/targets/vyos_vrf/tests/cli/merged.yaml @@ -1,44 +1,54 @@ --- - debug: msg: START vyos_vrf merged integration tests on connection={{ ansible_connection }} - include_tasks: _populate.yaml - block: - name: Merge the provided configuration with the existing running configuration register: result vyos.vyos.vyos_vrf: &id001 config: bind_to_all: true instances: - name: "vrf-green" description: "green-vrf" table_id: 110 vni: 1010 + - name: "vrf-pink" + description: "pink-vrf" + table_id: 111 + vni: 1111 + protocols: + bgp: + as_number: 65005 + neighbor: + - address: 192.0.5.1 + remote_as: 65012 state: merged - vyos.vyos.vyos_facts: gather_network_resources: vrf - assert: that: - result.changed == true - result.commands|symmetric_difference(merged.commands) == [] - result.after|symmetric_difference(ansible_facts['network_resources']['vrf']) == [] - name: Assert that before dicts were correctly generated assert: that: - "{{ merged['before'] | symmetric_difference(result['before']) |length == 0 }}" - name: Merge the provided configuration with the existing running configuration (IDEMPOTENT) register: result vyos.vyos.vyos_vrf: *id001 - name: Assert that the previous task was idempotent assert: that: - result['changed'] == false always: - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/tests/cli/rtt.yaml b/tests/integration/targets/vyos_vrf/tests/cli/rtt.yaml index 53b1d4ff..e8e9ea2c 100644 --- a/tests/integration/targets/vyos_vrf/tests/cli/rtt.yaml +++ b/tests/integration/targets/vyos_vrf/tests/cli/rtt.yaml @@ -1,59 +1,69 @@ --- - debug: msg: START vyos_vrf merged integration tests on connection={{ ansible_connection }} - include_tasks: _populate.yaml - block: - name: Merge the provided configuration with the existing running configuration register: baseconfig vyos.vyos.vyos_vrf: config: bind_to_all: true instances: - name: "vrf-green" description: "green-vrf" table_id: 110 vni: 1010 + - name: "vrf-pink" + description: "pink-vrf" + table_id: 111 + vni: 1111 + protocols: + bgp: + as_number: 65005 + neighbor: + - address: 192.0.5.1 + remote_as: 65012 state: merged - vyos.vyos.vyos_facts: gather_network_resources: vrf - assert: that: - baseconfig.changed == true - baseconfig.commands|symmetric_difference(merged.commands) == [] - baseconfig.after|symmetric_difference(ansible_facts['network_resources']['vrf']) == [] - name: Merge the existing configuration with the provided running configuration register: result vyos.vyos.vyos_vrf: config: instances: - name: "vrf-blue" description: "blue-vrf" disable: true table_id: 100 vni: 1000 - name: "vrf-green" description: "green-vrf" table_id: 110 vni: 1010 address_family: - afi: "ipv4" disable_forwarding: true state: merged - name: Revert back to base config using facts round trip register: revert vyos.vyos.vyos_vrf: config: "{{ ansible_facts['network_resources']['vrf'] }}" state: overridden - name: Assert that config was reverted assert: that: baseconfig.after == revert.after always: - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/vars/main.yaml b/tests/integration/targets/vyos_vrf/vars/main.yaml index c981b25a..2927d7a2 100644 --- a/tests/integration/targets/vyos_vrf/vars/main.yaml +++ b/tests/integration/targets/vyos_vrf/vars/main.yaml @@ -1,110 +1,211 @@ --- merged: before: bind_to_all: true instances: - name: "vrf-blue" description: "blue-vrf" disable: false table_id: 100 vni: 1000 - name: "vrf-red" description: "red-vrf" disable: true table_id: 101 vni: 1001 address_family: - afi: "ipv4" disable_forwarding: true route_maps: - rm_name: "rm1" protocol: "kernel" - rm_name: "rm1" protocol: "rip" - afi: "ipv6" nht_no_resolve_via_default: true + - name: "vrf-green" + description: "green-vrf" + table_id: 110 + vni: 1010 + protocols: + ospf: + areas: + - area_id: "4" + area_type: + stub: + default_cost: 20 + network: + - address: 192.0.2.0/24 + range: + - address: 192.0.3.0/24 + cost: 10 + - address: 192.0.4.0/24 + cost: 12 + ospfv3: + areas: + - area_id: "2" + export_list: export1 + import_list: import1 + range: + - address: 2001:db10::/32 + - address: 2001:db20::/32 + - address: 2001:db30::/32 + static: + - address_families: + - afi: ipv4 + routes: + - dest: "192.0.2.0/24" + blackhole_config: + distance: 10 + next_hops: + - forward_router_address: "203.0.113.1" + - forward_router_address: "203.0.113.2" + - afi: ipv6 + routes: + - dest: "2001:db8::/32" + blackhole_config: + distance: 20 + next_hops: + - forward_router_address: "2001:db8::1" commands: - set vrf name vrf-green table 110 - set vrf name vrf-green vni 1010 - set vrf name vrf-green description green-vrf + - set vrf name vrf-pink protocols bgp system-as 65005 + - set vrf name vrf-pink protocols bgp neighbor 192.0.5.1 remote-as 65012 after: bind_to_all: true instances: - name: "vrf-blue" description: "blue-vrf" disable: false table_id: 100 vni: 1000 - name: "vrf-red" description: "red-vrf" disable: true table_id: 101 vni: 1001 address_family: - afi: "ipv4" disable_forwarding: true route_maps: - rm_name: "rm1" protocol: "kernel" - rm_name: "rm1" protocol: "rip" - afi: "ipv6" nht_no_resolve_via_default: true - name: "vrf-green" description: "green-vrf" table_id: 110 vni: 1010 replaced: commands: - delete vrf bind-to-all - set vrf name vrf-blue disable - set vrf name vrf-red vni 1011 - set vrf name vrf-red description Vermillion_VRF - delete vrf name vrf-red disable - delete vrf name vrf-red ipv6 nht no-resolve-via-default after: [] overridden: commands: - delete vrf name vrf-blue - commit - set vrf name vrf-blue table 103 - set vrf name vrf-blue vni 1002 - set vrf name vrf-blue description blue-vrf - set vrf name vrf-blue disable - delete vrf bind-to-all after: [] deleted: commands: - delete vrf after: [] rendered: commands: - set vrf bind-to-all - set vrf name vrf-green table 105 - set vrf name vrf-green vni 1000 - set vrf name vrf-green description green-vrf - set vrf name vrf-green disable - set vrf name vrf-amber table 111 - set vrf name vrf-amber vni 1001 - set vrf name vrf-amber description amber-vrf - set vrf name vrf-amber ip protocol kernel route-map rm1 - set vrf name vrf-amber ip protocol ospf route-map rm1 - set vrf name vrf-amber ip disable-forwarding populate_config: - set vrf bind-to-all - set vrf name vrf-blue description 'blue-vrf' - set vrf name vrf-blue table '100' - set vrf name vrf-blue vni '1000' - set vrf name vrf-red description 'red-vrf' - set vrf name vrf-red disable - set vrf name vrf-red ip disable-forwarding - set vrf name vrf-red ip protocol kernel route-map 'rm1' - set vrf name vrf-red ip protocol rip route-map 'rm1' - set vrf name vrf-red ipv6 nht no-resolve-via-default - set vrf name vrf-red table '101' - set vrf name vrf-red vni '1001' + - set vrf name vrf-pink table 111 + - set vrf name vrf-pink vni 1111 + - set vrf name vrf-pink description pink-vrf + - set vrf name vrf-pink protocols bgp system-as 65000 + - set vrf name vrf-pink protocols bgp neighbor 192.0.2.1 remote-as 65002 + - set vrf name vrf-pink protocols bgp neighbor 1.1.1.3 passive + - set vrf name vrf-pink protocols bgp neighbor 1.1.1.3 remote-as 400 + - set vrf name vrf-pink protocols ospf log-adjacency-changes 'detail' + - set vrf name vrf-pink protocols ospf max-metric router-lsa administrative + - set vrf name vrf-pink protocols ospf max-metric router-lsa on-shutdown 10 + - set vrf name vrf-pink protocols ospf max-metric router-lsa on-startup 10 + - set vrf name vrf-pink protocols ospf default-information originate always + - set vrf name vrf-pink protocols ospf default-information originate metric 10 + - set vrf name vrf-pink protocols ospf default-information originate metric-type 2 + - set vrf name vrf-pink protocols ospf mpls-te router-address '192.0.11.12' + - set vrf name vrf-pink protocols ospf auto-cost reference-bandwidth '2' + - set vrf name vrf-pink protocols ospf neighbor 192.0.11.12 + - set vrf name vrf-pink protocols ospf neighbor 192.0.11.12 poll-interval 10 + - set vrf name vrf-pink protocols ospf neighbor 192.0.11.12 priority 2 + - set vrf name vrf-pink protocols ospf redistribute bgp + - set vrf name vrf-pink protocols ospf redistribute bgp metric 10 + - set vrf name vrf-pink protocols ospf redistribute bgp metric-type 2 + - set vrf name vrf-pink protocols ospf parameters router-id '192.0.1.1' + - set vrf name vrf-pink protocols ospf parameters rfc1583-compatibility + - set vrf name vrf-pink protocols ospf parameters abr-type 'cisco' + - set vrf name vrf-pink protocols ospf area '2' + - set vrf name vrf-pink protocols ospf area 2 area-type normal + - set vrf name vrf-pink protocols ospf area 2 authentication plaintext-password + - set vrf name vrf-pink protocols ospf area 2 shortcut enable + - set vrf name vrf-pink protocols ospf area '3' + - set vrf name vrf-pink protocols ospf area 3 area-type nssa + - set vrf name vrf-pink protocols ospf area '4' + - set vrf name vrf-pink protocols ospf area 4 area-type stub default-cost 20 + - set vrf name vrf-pink protocols ospf area 4 network 192.0.2.0/24 + - set vrf name vrf-pink protocols ospf area 4 range 192.0.3.0/24 + - set vrf name vrf-pink protocols ospf area 4 range 192.0.3.0/24 cost 10 + - set vrf name vrf-pink protocols ospf area 4 range 192.0.4.0/24 + - set vrf name vrf-pink protocols ospf area 4 range 192.0.4.0/24 cost 12 + - set vrf name vrf-pink protocols ospfv3 area '2' + - set vrf name vrf-pink protocols ospfv3 area 2 export-list export1 + - set vrf name vrf-pink protocols ospfv3 area 2 import-list import1 + - set vrf name vrf-pink protocols ospfv3 area 2 range 2001:db10::/32 + - set vrf name vrf-pink protocols ospfv3 area 2 range 2001:db20::/32 + - set vrf name vrf-pink protocols ospfv3 area 2 range 2001:db30::/32 + - set vrf name vrf-pink protocols ospfv3 area '3' + - set vrf name vrf-pink protocols ospfv3 area 3 range 2001:db40::/32 + - set vrf name vrf-pink protocols ospfv3 parameters router-id '192.0.2.10' + - set vrf name vrf-pink protocols ospfv3 redistribute bgp + - set vrf name vrf-pink protocols static route 192.0.2.0/24 + - set vrf name vrf-pink protocols static route 192.0.2.0/24 blackhole distance '10' + - set vrf name vrf-pink protocols static route 192.0.2.0/24 next-hop '203.0.113.1' + - set vrf name vrf-pink protocols static route 192.0.2.0/24 next-hop '203.0.113.2' + - set vrf name vrf-pink protocols static route6 2001:db8::/32 + - set vrf name vrf-pink protocols static route6 2001:db8::/32 blackhole distance '20' + - set vrf name vrf-pink protocols static route6 2001:db8::/32 next-hop '2001:db8::1' diff --git a/tests/unit/modules/network/vyos/test_vyos_config.py b/tests/unit/modules/network/vyos/test_vyos_config.py index 4f1cac6a..d9fd5933 100644 --- a/tests/unit/modules/network/vyos/test_vyos_config.py +++ b/tests/unit/modules/network/vyos/test_vyos_config.py @@ -1,142 +1,149 @@ # # (c) 2016 Red Hat Inc. # # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ansible is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . # Make coding more python3-ish from __future__ import absolute_import, division, print_function __metaclass__ = type from unittest.mock import MagicMock, patch from ansible_collections.vyos.vyos.plugins.cliconf.vyos import Cliconf from ansible_collections.vyos.vyos.plugins.modules import vyos_config from ansible_collections.vyos.vyos.tests.unit.modules.utils import set_module_args from .vyos_module import TestVyosModule, load_fixture class TestVyosConfigModule(TestVyosModule): module = vyos_config def setUp(self): super(TestVyosConfigModule, self).setUp() self.mock_get_config = patch( "ansible_collections.vyos.vyos.plugins.modules.vyos_config.get_config", ) self.get_config = self.mock_get_config.start() self.mock_load_config = patch( "ansible_collections.vyos.vyos.plugins.modules.vyos_config.load_config", ) self.load_config = self.mock_load_config.start() self.mock_run_commands = patch( "ansible_collections.vyos.vyos.plugins.modules.vyos_config.run_commands", ) self.run_commands = self.mock_run_commands.start() self.mock_get_connection = patch( "ansible_collections.vyos.vyos.plugins.modules.vyos_config.get_connection", ) self.get_connection = self.mock_get_connection.start() self.cliconf_obj = Cliconf(MagicMock()) self.running_config = load_fixture("vyos_config_config.cfg") self.conn = self.get_connection() self.conn.edit_config = MagicMock() self.running_config = load_fixture("vyos_config_config.cfg") + self._connection = self.mock_connection() + def tearDown(self): super(TestVyosConfigModule, self).tearDown() self.mock_get_config.stop() self.mock_load_config.stop() self.mock_run_commands.stop() self.mock_get_connection.stop() def load_fixtures(self, commands=None, filename=None): config_file = "vyos_config_config.cfg" self.get_config.return_value = load_fixture(config_file) self.load_config.return_value = None + def mock_connection(self): + """Fixture to provide a mock connection object""" + mock = MagicMock() + return mock + def test_vyos_config_unchanged(self): src = load_fixture("vyos_config_config.cfg") self.conn.get_diff = MagicMock(return_value=self.cliconf_obj.get_diff(src, src)) set_module_args(dict(src=src)) self.execute_module() def test_vyos_config_src(self): src = load_fixture("vyos_config_src.cfg") set_module_args(dict(src=src)) candidate = "\n".join(self.module.format_commands(src.splitlines())) commands = [ "set system host-name foo", "delete interfaces ethernet eth0 address", ] self.conn.get_diff = MagicMock( return_value=self.cliconf_obj.get_diff(candidate, self.running_config), ) self.execute_module(changed=True, commands=commands) def test_vyos_config_src_brackets(self): src = load_fixture("vyos_config_src_brackets.cfg") set_module_args(dict(src=src)) commands = [ "set interfaces ethernet eth0 address 10.10.10.10/24", "set policy route testroute rule 1 set table 10", "set system host-name foo", ] self.conn.get_diff = MagicMock(side_effect=self.cliconf_obj.get_diff) self.execute_module(changed=True, commands=commands) def test_vyos_config_backup(self): set_module_args(dict(backup=True)) result = self.execute_module() self.assertIn("__backup__", result) def test_vyos_config_lines(self): commands = ["set system host-name foo"] set_module_args(dict(lines=commands)) candidate = "\n".join(commands) self.conn.get_diff = MagicMock( return_value=self.cliconf_obj.get_diff(candidate, self.running_config), ) self.execute_module(changed=True, commands=commands) def test_vyos_config_config(self): config = "set system host-name localhost" new_config = ["set system host-name router"] set_module_args(dict(lines=new_config, config=config)) candidate = "\n".join(new_config) self.conn.get_diff = MagicMock(return_value=self.cliconf_obj.get_diff(candidate, config)) self.execute_module(changed=True, commands=new_config) def test_vyos_config_match_none(self): lines = [ "set system interfaces ethernet eth0 address 1.2.3.4/24", "set system interfaces ethernet eth0 description test string", ] set_module_args(dict(lines=lines, match="none")) candidate = "\n".join(lines) self.conn.get_diff = MagicMock( return_value=self.cliconf_obj.get_diff(candidate, None, diff_match="none"), ) self.execute_module(changed=True, commands=lines, sort=False) diff --git a/tests/unit/modules/network/vyos/test_vyos_vrf.py b/tests/unit/modules/network/vyos/test_vyos_vrf.py index 44e3baf3..634598b4 100644 --- a/tests/unit/modules/network/vyos/test_vyos_vrf.py +++ b/tests/unit/modules/network/vyos/test_vyos_vrf.py @@ -1,525 +1,523 @@ # (c) 2021 Red Hat Inc. # # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ansible is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . # Make coding more python3-ish from __future__ import absolute_import, division, print_function __metaclass__ = type from unittest.mock import patch from ansible_collections.vyos.vyos.plugins.modules import vyos_vrf from ansible_collections.vyos.vyos.tests.unit.modules.utils import set_module_args from .vyos_module import TestVyosModule, load_fixture class TestVyosVrfModule(TestVyosModule): module = vyos_vrf def setUp(self): super(TestVyosVrfModule, self).setUp() self.mock_get_resource_connection_config = patch( "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module_base.get_resource_connection", ) self.get_resource_connection_config = self.mock_get_resource_connection_config.start() self.mock_get_resource_connection_facts = patch( "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection", ) self.get_resource_connection_facts = self.mock_get_resource_connection_facts.start() - self._connection = self.mock_get_resource_connection_facts.start() - self.mock_execute_show_command = patch( "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.vrf.vrf.VrfFacts.get_config", ) self.execute_show_command = self.mock_execute_show_command.start() self.mock_get_os_version = patch( "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.vrf.vrf.get_os_version", ) self.get_os_version = self.mock_get_os_version.start() self.get_os_version.return_value = "1.5" self.maxDiff = None def tearDown(self): super(TestVyosVrfModule, self).tearDown() self.mock_get_resource_connection_config.stop() self.mock_get_resource_connection_facts.stop() self.mock_execute_show_command.stop() self.mock_get_os_version.stop() def load_fixtures(self, commands=None, filename=None): if filename is None: filename = "vyos_vrf_config.cfg" def load_from_file(*args, **kwargs): output = load_fixture(filename) return output self.execute_show_command.side_effect = load_from_file def test_vrf_merged_idempotent(self): set_module_args( dict( config=dict( bind_to_all=True, instances=[ dict( name="vrf-blue", description="blue-vrf", disable=False, table_id=100, vni=1000, ), dict( name="vrf-red", description="red-vrf", disable=True, table_id=101, vni=1001, address_family=[ dict( afi="ipv4", disable_forwarding=True, route_maps=[ dict(rm_name="rm1", protocol="kernel"), dict(rm_name="rm1", protocol="rip"), ], ), dict( afi="ipv6", nht_no_resolve_via_default=True, ), ], # protocols = dict( # bgp=dict( # as_number=65000, # neighbor=[ # dict( # address="192.0.2.1", # remote_as=65002, # ), # dict( # address="1.1.1.3", # remote_as=400, # passive=True, # ), # ], # ), # ), ), ], ), state="merged", ), ) self.execute_module(changed=False, commands=[]) def test_vrf_merged(self): set_module_args( dict( config=dict( bind_to_all=True, instances=[ dict( name="vrf-green", description="green-vrf", table_id=110, vni=1010, ), ], ), state="merged", ), ) commands = [ "set vrf name vrf-green table 110", "set vrf name vrf-green vni 1010", "set vrf name vrf-green description green-vrf", ] self.execute_module(changed=True, commands=commands) def test_vrf_replaced(self): set_module_args( dict( config=dict( bind_to_all=True, instances=[ dict( name="vrf-blue", description="blue-vrf-replaced", disable=True, table_id=100, vni=1000, ), dict( name="vrf-red", description="red-vrf", disable=True, table_id=101, vni=1001, address_family=[ dict( afi="ipv4", disable_forwarding=False, route_maps=[ dict(rm_name="rm1", protocol="kernel"), dict(rm_name="rm1", protocol="rip"), ], ), dict( afi="ipv6", nht_no_resolve_via_default=False, ), ], ), ], ), state="replaced", ), ) commands = [ "set vrf name vrf-blue description blue-vrf-replaced", "set vrf name vrf-blue disable", "delete vrf name vrf-red ip disable-forwarding", "delete vrf name vrf-red ipv6 nht no-resolve-via-default", ] self.execute_module(changed=True, commands=commands) def test_vrf_replaced_idempotent(self): set_module_args( dict( config=dict( bind_to_all=True, instances=[ dict( name="vrf-blue", description="blue-vrf", disable=False, table_id=100, vni=1000, ), dict( name="vrf-red", description="red-vrf", disable=True, table_id=101, vni=1001, address_family=[ dict( afi="ipv4", disable_forwarding=True, route_maps=[ dict(rm_name="rm1", protocol="kernel"), dict(rm_name="rm1", protocol="rip"), ], ), dict( afi="ipv6", nht_no_resolve_via_default=True, ), ], ), ], ), state="replaced", ), ) self.execute_module(changed=False, commands=[]) def test_vrf_overridden(self): set_module_args( dict( config=dict( instances=[ dict( name="vrf-blue", description="blue-vrf", disable=True, table_id=103, vni=1002, ), ], ), state="overridden", ), ) commands = [ "delete vrf name vrf-blue", "commit", "set vrf name vrf-blue table 103", "set vrf name vrf-blue vni 1002", "set vrf name vrf-blue description blue-vrf", "set vrf name vrf-blue disable", "delete vrf bind-to-all", ] self.execute_module(changed=True, commands=commands) def test_vrf_overridden_idempotent(self): set_module_args( dict( config=dict( bind_to_all=True, instances=[ dict( name="vrf-blue", description="blue-vrf", disable=False, table_id=100, vni=1000, ), dict( name="vrf-red", description="red-vrf", disable=True, table_id=101, vni=1001, address_family=[ dict( afi="ipv4", disable_forwarding=True, route_maps=[ dict(rm_name="rm1", protocol="kernel"), dict(rm_name="rm1", protocol="rip"), ], ), dict( afi="ipv6", nht_no_resolve_via_default=True, ), ], ), ], ), state="overridden", ), ) self.execute_module(changed=False, commands=[]) def test_vrf_rendered(self): set_module_args( dict( config=dict( bind_to_all=True, instances=[ dict( name="vrf-green", description="green-vrf", disabled=True, table_id=105, vni=1000, ), dict( name="vrf-amber", description="amber-vrf", disable=False, table_id=111, vni=1001, address_family=[ dict( afi="ipv4", disable_forwarding=True, route_maps=[ dict(rm_name="rm1", protocol="kernel"), dict(rm_name="rm1", protocol="ospf"), ], ), dict( afi="ipv6", nht_no_resolve_via_default=False, ), ], ), ], ), state="rendered", ), ) rendered_commands = [ "set vrf bind-to-all", "set vrf name vrf-green table 105", "set vrf name vrf-green vni 1000", "set vrf name vrf-green description green-vrf", "set vrf name vrf-green disable", "set vrf name vrf-amber table 111", "set vrf name vrf-amber vni 1001", "set vrf name vrf-amber description amber-vrf", "set vrf name vrf-amber ip protocol kernel route-map rm1", "set vrf name vrf-amber ip protocol ospf route-map rm1", "set vrf name vrf-amber ip disable-forwarding", ] result = self.execute_module(changed=False) self.assertEqual( sorted(result["rendered"]), sorted(rendered_commands), result["rendered"], ) def test_vrf_parsed(self): commands = ( "set vrf bind-to-all", "set vrf name vrf1 description 'red'", "set vrf name vrf1 disable", "set vrf name vrf1 table 101", "set vrf name vrf1 vni 501", "set vrf name vrf2 description 'green'", "set vrf name vrf2 disable", "set vrf name vrf2 table 102", "set vrf name vrf2 vni 102", "set vrf name vrf1 ip disable-forwarding", "set vrf name vrf1 ip nht no-resolve-via-default", "set vrf name vrf-red ip protocol kernel route-map 'rm1'", "set vrf name vrf-red ip protocol ospf route-map 'rm1'", "set vrf name vrf-red ipv6 nht no-resolve-via-default", ) parsed_str = "\n".join(commands) set_module_args(dict(running_config=parsed_str, state="parsed")) result = self.execute_module(changed=False) parsed_list = { "bind_to_all": True, "instances": [ { "address_family": [ { "afi": "ipv4", "disable_forwarding": True, "nht_no_resolve_via_default": True, }, ], "description": "red", "disable": True, "name": "vrf1", }, { "description": "green", "disable": True, "name": "vrf2", }, { "address_family": [ { "afi": "ipv4", "disable_forwarding": False, "nht_no_resolve_via_default": False, "route_maps": [ { "protocol": "kernel", "rm_name": "rm1", }, { "protocol": "ospf", "rm_name": "rm1", }, ], }, { "afi": "ipv6", "disable_forwarding": False, "nht_no_resolve_via_default": True, }, ], "disable": False, "name": "vrf-red", }, ], } self.assertEqual(parsed_list, result["parsed"]) def test_vrf_gathered(self): set_module_args(dict(state="gathered")) result = self.execute_module(changed=False) gathered_list = { "bind_to_all": True, "instances": [ { "description": "blue-vrf", "disable": False, "name": "vrf-blue", "table_id": 100, "vni": 1000, }, { "address_family": [ { "afi": "ipv4", "disable_forwarding": True, "nht_no_resolve_via_default": False, "route_maps": [ { "protocol": "kernel", "rm_name": "rm1", }, { "protocol": "rip", "rm_name": "rm1", }, ], }, { "afi": "ipv6", "disable_forwarding": False, "nht_no_resolve_via_default": True, }, ], "description": "red-vrf", "disable": True, "name": "vrf-red", "table_id": 101, "vni": 1001, }, ], } self.assertEqual(gathered_list, result["gathered"]) def test_vrf_deleted(self): # Delete the instances and global setting bind_to_all set_module_args( dict( config=dict( bind_to_all=True, instances=[ dict( name="vrf-blue", ), ], ), state="deleted", ), ) commands = [ "delete vrf bind-to-all", "delete vrf name vrf-blue", ] self.execute_module(changed=True, commands=commands) def test_vrf_all_deleted(self): set_module_args( dict( state="deleted", ), ) commands = [ "delete vrf", ] self.execute_module(changed=True, commands=commands)