diff options
17 files changed, 352 insertions, 111 deletions
diff --git a/.github/workflows/codecoverage.yml b/.github/workflows/codecoverage.yml index a8a3d658..97adfb8a 100644 --- a/.github/workflows/codecoverage.yml +++ b/.github/workflows/codecoverage.yml @@ -62,9 +62,10 @@ jobs: working-directory: ${{ steps.identify.outputs.collection_path }} - name: Upload coverage report to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: directory: ${{ steps.identify.outputs.collection_path }} fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/changelogs/fragments/T7006-interface-integration-tests.yml b/changelogs/fragments/T7006-interface-integration-tests.yml new file mode 100644 index 00000000..122dde76 --- /dev/null +++ b/changelogs/fragments/T7006-interface-integration-tests.yml @@ -0,0 +1,8 @@ +--- +minor_changes: + - adjust for loopback being removed in `vyos_l3_interfaces` + - fixed `vyos_interfaces` for 1.5+ + - update codecov updloader to version 5 + +known_issues: + - integration tests for `interfaces` are still failing occasionally in 1.4 and below diff --git a/changelogs/fragments/T7008-l3-interface-integration-tests.yml b/changelogs/fragments/T7008-l3-interface-integration-tests.yml index cfe7d2f0..bbdcbde1 100644 --- a/changelogs/fragments/T7008-l3-interface-integration-tests.yml +++ b/changelogs/fragments/T7008-l3-interface-integration-tests.yml @@ -1,7 +1,12 @@ --- minor_changes: - fix integration tests for `l3_interfaces` - - fix integration tests for `interfaces` (still failing occasionally in 1.3 and below) + - fix integration tests for `interfaces` + - fix replace in interfaces to remove vif completely if not present in new config + - fix override in interfaces to remove vif completely if not present in new config + - fix delete in interfaces to remove vif completely if in affected interface + - added unit test for unknown interface type known_issues: - - integration tests for `interfaces` are still failing occasionally in 1.3 and below + - integration tests for `interfaces` fail for 1.3 and below due to + mtu setting issue when a `vif` is defined. diff --git a/docs/vyos.vyos.vyos_interfaces_module.rst b/docs/vyos.vyos.vyos_interfaces_module.rst index 24156270..14f7a473 100644 --- a/docs/vyos.vyos.vyos_interfaces_module.rst +++ b/docs/vyos.vyos.vyos_interfaces_module.rst @@ -523,7 +523,7 @@ Examples # - delete interfaces ethernet eth2 speed # - delete interfaces ethernet eth2 duplex # - delete interfaces ethernet eth2 mtu - # - delete interfaces ethernet eth2 vif 200 description + # - delete interfaces ethernet eth2 vif 200 # - set interfaces ethernet eth2 description 'Replaced by Ansible' # - delete interfaces ethernet eth3 speed # - delete interfaces ethernet eth3 duplex @@ -545,9 +545,6 @@ Examples # - description: Replaced by Ansible # enabled: true # name: eth2 - # vifs: - # - enabled: true - # vlan_id: '200' # - description: Replaced by Ansible # enabled: true # name: eth1 @@ -575,7 +572,6 @@ Examples # set interfaces ethernet eth2 description 'Replaced by Ansible' # set interfaces ethernet eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 smp-affinity 'auto' - # set interfaces ethernet eth2 vif 200 # set interfaces ethernet eth3 description 'Replaced by Ansible' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces loopback lo @@ -660,8 +656,7 @@ Examples # - delete interfaces vti vti1 mtu # - delete interfaces ethernet eth1 description # - delete interfaces ethernet eth1 mtu - # - delete interfaces ethernet eth1 vif 100 description - # - delete interfaces ethernet eth1 vif 100 disable + # - delete interfaces ethernet eth1 vif 100 # - delete interfaces ethernet eth0 mtu # - set interfaces ethernet eth0 description 'Outbound Interface For The Appliance' # - delete interfaces ethernet eth2 description @@ -685,9 +680,6 @@ Examples # speed: auto # - enabled: true # name: eth1 - # vifs: - # - enabled: true - # vlan_id: '100' # - description: Outbound Interface For The Appliance # duplex: auto # enabled: true @@ -706,7 +698,6 @@ Examples # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 hw-id '08:00:27:ea:0f:b9' # set interfaces ethernet eth1 smp-affinity 'auto' - # set interfaces ethernet eth1 vif 100 # set interfaces ethernet eth2 duplex 'auto' # set interfaces ethernet eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 smp-affinity 'auto' diff --git a/plugins/module_utils/network/vyos/config/interfaces/interfaces.py b/plugins/module_utils/network/vyos/config/interfaces/interfaces.py index 62e4f922..a9d9307c 100644 --- a/plugins/module_utils/network/vyos/config/interfaces/interfaces.py +++ b/plugins/module_utils/network/vyos/config/interfaces/interfaces.py @@ -275,7 +275,9 @@ class Interfaces(ConfigBase): commands.append( self._compute_commands(key=key, interface=want_copy["name"], remove=True), ) - if have_copy["enabled"] is False and not ('enabled' in want_copy and want_copy["enabled"] is False): + if have_copy["enabled"] is False and not ( + "enabled" in want_copy and want_copy["enabled"] is False + ): commands.append( self._compute_commands(key="enabled", value=True, interface=want_copy["name"]), ) @@ -284,43 +286,48 @@ class Interfaces(ConfigBase): for have_vif in have_vifs: want_vif = search_obj_in_list(have_vif["vlan_id"], want_vifs, key="vlan_id") if not want_vif: - want_vif = { - "vlan_id": have_vif["vlan_id"], - "enabled": True, - } - - for key in dict_delete(have_vif, want_vif).keys(): - if key == "enabled": - continue commands.append( self._compute_commands( - key=key, + key="", interface=want_copy["name"], - vif=want_vif["vlan_id"], + vif=have_vif["vlan_id"], remove=True, ), ) - if have_vif["enabled"] is False: + continue + + for key in dict_delete(have_vif, want_vif).keys(): + if key == "enabled": + continue commands.append( self._compute_commands( - key="enabled", - value=True, + key=key, interface=want_copy["name"], vif=want_vif["vlan_id"], + remove=True, ), ) return commands def _compute_commands(self, interface, key, vif=None, value=None, remove=False): - intf_context = "interfaces {0} {1}".format(get_interface_type(interface), interface) + interface_type = get_interface_type(interface) + if not interface_type: + self._module.fail_json( + msg="interface {0} is not a valid interface type".format(interface), + ) + intf_context = "interfaces {0} {1}".format(interface_type, interface) set_cmd = "set {0}".format(intf_context) del_cmd = "delete {0}".format(intf_context) if vif: set_cmd = set_cmd + (" vif {0}".format(vif)) del_cmd = del_cmd + (" vif {0}".format(vif)) - - if key == "enabled": + if key == "" or key is None: + if not remove: + command = "{0}".format(set_cmd) + else: + command = "{0}".format(del_cmd) + elif key == "enabled": if not value: command = "{0} disable".format(set_cmd) else: diff --git a/plugins/modules/vyos_interfaces.py b/plugins/modules/vyos_interfaces.py index b679a226..6125b4b9 100644 --- a/plugins/modules/vyos_interfaces.py +++ b/plugins/modules/vyos_interfaces.py @@ -353,7 +353,7 @@ EXAMPLES = """ # - delete interfaces ethernet eth2 speed # - delete interfaces ethernet eth2 duplex # - delete interfaces ethernet eth2 mtu -# - delete interfaces ethernet eth2 vif 200 description +# - delete interfaces ethernet eth2 vif 200 # - set interfaces ethernet eth2 description 'Replaced by Ansible' # - delete interfaces ethernet eth3 speed # - delete interfaces ethernet eth3 duplex @@ -375,9 +375,6 @@ EXAMPLES = """ # - description: Replaced by Ansible # enabled: true # name: eth2 -# vifs: -# - enabled: true -# vlan_id: '200' # - description: Replaced by Ansible # enabled: true # name: eth1 @@ -405,7 +402,6 @@ EXAMPLES = """ # set interfaces ethernet eth2 description 'Replaced by Ansible' # set interfaces ethernet eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 smp-affinity 'auto' -# set interfaces ethernet eth2 vif 200 # set interfaces ethernet eth3 description 'Replaced by Ansible' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces loopback lo @@ -490,8 +486,7 @@ EXAMPLES = """ # - delete interfaces vti vti1 mtu # - delete interfaces ethernet eth1 description # - delete interfaces ethernet eth1 mtu -# - delete interfaces ethernet eth1 vif 100 description -# - delete interfaces ethernet eth1 vif 100 disable +# - delete interfaces ethernet eth1 vif 100 # - delete interfaces ethernet eth0 mtu # - set interfaces ethernet eth0 description 'Outbound Interface For The Appliance' # - delete interfaces ethernet eth2 description @@ -515,9 +510,6 @@ EXAMPLES = """ # speed: auto # - enabled: true # name: eth1 -# vifs: -# - enabled: true -# vlan_id: '100' # - description: Outbound Interface For The Appliance # duplex: auto # enabled: true @@ -536,7 +528,6 @@ EXAMPLES = """ # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 hw-id '08:00:27:ea:0f:b9' # set interfaces ethernet eth1 smp-affinity 'auto' -# set interfaces ethernet eth1 vif 100 # set interfaces ethernet eth2 duplex 'auto' # set interfaces ethernet eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 smp-affinity 'auto' diff --git a/tests/integration/targets/vyos_firewall_rules/vars/v1_4.yaml b/tests/integration/targets/vyos_firewall_rules/vars/v1_4.yaml index 267803f6..08675983 100644 --- a/tests/integration/targets/vyos_firewall_rules/vars/v1_4.yaml +++ b/tests/integration/targets/vyos_firewall_rules/vars/v1_4.yaml @@ -85,7 +85,6 @@ overridden_commands: - set firewall ipv4 name Downlink rule 502 description 'Rule 502 is configured by Ansible' - set firewall ipv4 name Downlink rule 502 protocol 'tcp' - rendered: commands: - set firewall ipv6 name UPLINK default-action 'accept' diff --git a/tests/integration/targets/vyos_interfaces/tests/cli/_get_version.yaml b/tests/integration/targets/vyos_interfaces/tests/cli/_get_version.yaml new file mode 100644 index 00000000..46f4b821 --- /dev/null +++ b/tests/integration/targets/vyos_interfaces/tests/cli/_get_version.yaml @@ -0,0 +1,28 @@ +- name: make sure to get facts + vyos.vyos.vyos_facts: + vars: + ansible_connection: ansible.netcommon.network_cli + register: vyos_facts + when: vyos_version is not defined + +- name: debug vyos_facts + debug: + var: vyos_facts + +- name: pull version from facts + set_fact: + vyos_version: "{{ vyos_facts.ansible_facts.ansible_net_version.split('-')[0].split(' ')[-1] }}" + when: vyos_version is not defined + +- name: fix '.0' versions + set_fact: + vyos_version: "{{ vyos_version }}.0" + when: vyos_version.count('.') == 1 + +- name: include correct vars + include_vars: pre-v1_5.yaml + when: vyos_version is version('1.5.0', '<', version_type='semver') + +- name: include correct vars + include_vars: v1_5.yaml + when: vyos_version is version('1.5.0', '>=', version_type='semver') diff --git a/tests/integration/targets/vyos_interfaces/tests/cli/_populate.yaml b/tests/integration/targets/vyos_interfaces/tests/cli/_populate.yaml index c6cc1a8d..45bd9b6a 100644 --- a/tests/integration/targets/vyos_interfaces/tests/cli/_populate.yaml +++ b/tests/integration/targets/vyos_interfaces/tests/cli/_populate.yaml @@ -1,17 +1,15 @@ --- +- name: ensure facts + include_tasks: _get_version.yaml + - ansible.builtin.include_tasks: _remove_config.yaml - name: Setup - vars: - lines: |- + ansible.netcommon.cli_config: + config: |- + {% for intf in ('eth1','eth2') %} set interfaces ethernet "{{ intf }}" description 'Configured by Ansible' set interfaces ethernet "{{ intf }}" mtu '1500' set interfaces ethernet "{{ intf }}" vif 200 set interfaces ethernet "{{ intf }}" vif 200 description 'VIF - 200' - loop: - - eth1 - - eth2 - loop_control: - loop_var: intf - ansible.netcommon.cli_config: - config: "{{ lines }}" + {% endfor %} diff --git a/tests/integration/targets/vyos_interfaces/tests/cli/_remove_config.yaml b/tests/integration/targets/vyos_interfaces/tests/cli/_remove_config.yaml index ed2b424b..73f481bf 100644 --- a/tests/integration/targets/vyos_interfaces/tests/cli/_remove_config.yaml +++ b/tests/integration/targets/vyos_interfaces/tests/cli/_remove_config.yaml @@ -1,17 +1,12 @@ --- - name: Remove Config - vars: - lines: |- + ansible.netcommon.cli_config: + config: |- + {% for intf in ('eth1','eth2') %} delete interfaces ethernet "{{ intf }}" description delete interfaces ethernet "{{ intf }}" speed delete interfaces ethernet "{{ intf }}" duplex delete interfaces ethernet "{{ intf }}" mtu delete interfaces ethernet "{{ intf }}" disable delete interfaces ethernet "{{ intf }}" vif - loop: - - eth1 - - eth2 - loop_control: - loop_var: intf - ansible.netcommon.cli_config: - config: "{{ lines }}" + {% endfor %} diff --git a/tests/integration/targets/vyos_interfaces/tests/cli/replaced.yaml b/tests/integration/targets/vyos_interfaces/tests/cli/replaced.yaml index 6309c590..9d0a3a8b 100644 --- a/tests/integration/targets/vyos_interfaces/tests/cli/replaced.yaml +++ b/tests/integration/targets/vyos_interfaces/tests/cli/replaced.yaml @@ -23,7 +23,7 @@ - name: Assert that correct set of commands were generated assert: that: - - "{{ replaced['commands'] | symmetric_difference(result['commands']) |length == 0 }}" + - replaced['commands'] | symmetric_difference(result['commands']) |length == 0 - debug: var: populate | symmetric_difference(result['before']) @@ -31,7 +31,7 @@ - name: Assert that before dicts are correctly generated assert: that: - - "{{ populate | symmetric_difference(result['before']) |length == 0 }}" + - populate | symmetric_difference(result['before']) |length == 0 - debug: var: replaced['after'] | symmetric_difference(result['after']) @@ -39,7 +39,15 @@ - name: Assert that after dict is correctly generated assert: that: - - "{{ replaced['after'] | symmetric_difference(result['after']) |length == 0 }}" + - replaced['after'] | symmetric_difference(result['after']) |length == 0 + + - vyos.vyos.vyos_facts: + gather_network_resources: interfaces + + - name: Assert that the facts and the after dict are the same + assert: + that: + - result.after == ansible_facts['network_resources']['interfaces'] - name: Replace device configurations of listed interfaces with provided configurarions (IDEMPOTENT) register: result @@ -53,6 +61,6 @@ - name: Assert that before dict is correctly generated assert: that: - - "{{ replaced['after'] | symmetric_difference(result['before']) |length == 0 }}" + - replaced['after'] | symmetric_difference(result['before']) |length == 0 always: - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_interfaces/vars/main.yaml b/tests/integration/targets/vyos_interfaces/vars/main.yaml index 9d931707..be87cf8c 100644 --- a/tests/integration/targets/vyos_interfaces/vars/main.yaml +++ b/tests/integration/targets/vyos_interfaces/vars/main.yaml @@ -9,8 +9,6 @@ merged: enabled: true - name: eth2 enabled: true - - name: lo - enabled: true commands: - set interfaces ethernet eth1 description 'Configured by Ansible - Interface 1' - set interfaces ethernet eth1 mtu '1500' @@ -21,8 +19,6 @@ merged: - set interfaces ethernet eth2 mtu '1406' - set interfaces ethernet eth2 disable after: - - name: lo - enabled: true - name: eth0 enabled: true duplex: auto @@ -44,8 +40,6 @@ merged: mtu: 1406 enabled: false populate: - - name: lo - enabled: true - name: eth1 enabled: true description: Configured by Ansible @@ -69,15 +63,13 @@ populate: replaced: commands: - delete interfaces ethernet eth1 mtu - - delete interfaces ethernet eth1 vif 200 description + - delete interfaces ethernet eth1 vif 200 - set interfaces ethernet eth1 description 'Replaced by Ansible' - set interfaces ethernet eth1 vif 100 description 'VIF 100 - Replaced by Ansible' - - delete interfaces ethernet eth2 vif 200 description + - delete interfaces ethernet eth2 vif 200 - set interfaces ethernet eth2 description 'Replaced by Ansible' - set interfaces ethernet eth2 mtu '1400' after: - - name: lo - enabled: true - name: eth1 description: Replaced by Ansible enabled: true @@ -85,15 +77,10 @@ replaced: - vlan_id: 100 enabled: true description: VIF 100 - Replaced by Ansible - - vlan_id: 200 - enabled: true - name: eth2 mtu: 1400 description: Replaced by Ansible enabled: true - vifs: - - vlan_id: 200 - enabled: true - name: eth0 enabled: true duplex: auto @@ -120,29 +107,21 @@ overridden: commands: - delete interfaces ethernet eth1 description - delete interfaces ethernet eth1 mtu - - delete interfaces ethernet eth1 vif 200 description - - delete interfaces ethernet eth2 vif 200 description + - delete interfaces ethernet eth1 vif 200 + - delete interfaces ethernet eth2 vif 200 - set interfaces ethernet eth2 description 'Overridden by Ansible' - set interfaces ethernet eth2 mtu '1402' after: - - name: lo - enabled: true - name: eth0 enabled: true speed: auto duplex: auto - name: eth1 enabled: true - vifs: - - vlan_id: 200 - enabled: true - name: eth2 enabled: true description: Overridden by Ansible mtu: 1402 - vifs: - - vlan_id: 200 - enabled: true rendered: commands: - set interfaces ethernet eth1 description 'Configured by Ansible - Interface 1' @@ -157,31 +136,21 @@ deleted: commands: - delete interfaces ethernet eth1 description - delete interfaces ethernet eth1 mtu - - delete interfaces ethernet eth1 vif 200 description + - delete interfaces ethernet eth1 vif 200 - delete interfaces ethernet eth2 description - delete interfaces ethernet eth2 mtu - - delete interfaces ethernet eth2 vif 200 description + - delete interfaces ethernet eth2 vif 200 after: - - name: lo - enabled: true - name: eth0 enabled: true speed: auto duplex: auto - name: eth1 enabled: true - vifs: - - vlan_id: 200 - enabled: true - name: eth2 enabled: true - vifs: - - vlan_id: 200 - enabled: true round_trip: after: - - name: lo - enabled: true - name: eth0 enabled: true speed: auto diff --git a/tests/integration/targets/vyos_interfaces/vars/pre-v1_5.yaml b/tests/integration/targets/vyos_interfaces/vars/pre-v1_5.yaml new file mode 100644 index 00000000..1026b30e --- /dev/null +++ b/tests/integration/targets/vyos_interfaces/vars/pre-v1_5.yaml @@ -0,0 +1,2 @@ +--- +# Remove the lo0 interface for older versions of VyOS (pre-v1.4) diff --git a/tests/integration/targets/vyos_interfaces/vars/v1_5.yaml b/tests/integration/targets/vyos_interfaces/vars/v1_5.yaml new file mode 100644 index 00000000..ed97d539 --- /dev/null +++ b/tests/integration/targets/vyos_interfaces/vars/v1_5.yaml @@ -0,0 +1 @@ +--- diff --git a/tests/integration/targets/vyos_l3_interfaces/vars/main.yaml b/tests/integration/targets/vyos_l3_interfaces/vars/main.yaml index deec3faa..e9781e6a 100644 --- a/tests/integration/targets/vyos_l3_interfaces/vars/main.yaml +++ b/tests/integration/targets/vyos_l3_interfaces/vars/main.yaml @@ -1,7 +1,6 @@ --- merged: before: - - name: lo - name: eth0 ipv4: - address: dhcp @@ -14,7 +13,6 @@ merged: - set interfaces ethernet eth2 vif 101 address '198.51.100.130/25' - set interfaces ethernet eth2 vif 101 address '2001:db8::20/32' after: - - name: lo - name: eth0 ipv4: - address: dhcp @@ -33,7 +31,6 @@ merged: ipv6: - address: 2001:db8::20/32 populate: - - name: lo - name: eth1 ipv4: - address: 192.0.2.14/24 @@ -57,7 +54,6 @@ replaced: - delete interfaces ethernet eth1 address '192.0.2.14/24' - set interfaces ethernet eth1 address '192.0.2.19/24' after: - - name: lo - name: eth2 ipv6: - address: 2001:db8::11/32 @@ -76,7 +72,6 @@ overridden: - delete interfaces ethernet eth2 address '2001:db8::10/32' - delete interfaces ethernet eth2 address '2001:db8::12/32' after: - - name: lo - name: eth0 ipv4: - address: dhcp @@ -116,7 +111,6 @@ deleted: - delete interfaces ethernet eth2 address '2001:db8::10/32' - delete interfaces ethernet eth2 address '2001:db8::12/32' after: - - name: lo - name: eth0 ipv4: - address: dhcp diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_interfaces_config_vif.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_interfaces_config_vif.cfg new file mode 100644 index 00000000..b1b6b4c2 --- /dev/null +++ b/tests/unit/modules/network/vyos/fixtures/vyos_interfaces_config_vif.cfg @@ -0,0 +1,14 @@ +set interfaces ethernet eth0 address 'dhcp' +set interfaces ethernet eth0 hw-id '08:00:27:7c:85:05' +set interfaces ethernet eth1 description 'test-interface' +set interfaces ethernet eth1 vif 200 +set interfaces ethernet eth1 vif 200 description 'VIF eth1.200' +set interfaces ethernet eth1 vif 201 +set interfaces ethernet eth1 vif 201 description 'VIF eth1.201' +set interfaces ethernet eth1 vif 201 disable +set interfaces ethernet eth2 hw-id '08:00:27:04:85:99' +set interfaces ethernet eth3 hw-id '08:00:27:1c:82:d1' +set interfaces ethernet eth3 disable +set interfaces ethernet eth3 description 'Ethernet 3' +set interfaces wireguard wg02 description 'wire guard int 2' +set interfaces loopback 'lo' diff --git a/tests/unit/modules/network/vyos/test_vyos_interfaces.py b/tests/unit/modules/network/vyos/test_vyos_interfaces.py index 14e49c36..8549d768 100644 --- a/tests/unit/modules/network/vyos/test_vyos_interfaces.py +++ b/tests/unit/modules/network/vyos/test_vyos_interfaces.py @@ -59,6 +59,8 @@ class TestVyosFirewallInterfacesModule(TestVyosModule): "facts.interfaces.interfaces.InterfacesFacts.get_device_data", ) self.execute_show_command = self.mock_execute_show_command.start() + # define the default fixture for the vyos_interfaces module + self.fixture_path = "vyos_interfaces_config.cfg" def tearDown(self): super(TestVyosFirewallInterfacesModule, self).tearDown() @@ -70,7 +72,7 @@ class TestVyosFirewallInterfacesModule(TestVyosModule): def load_fixtures(self, commands=None, filename=None): def load_from_file(*args, **kwargs): - return load_fixture("vyos_interfaces_config.cfg") + return load_fixture(self.fixture_path) self.execute_show_command.side_effect = load_from_file @@ -93,6 +95,52 @@ class TestVyosFirewallInterfacesModule(TestVyosModule): ] self.execute_module(changed=True, commands=commands) + def test_vyos_interfaces_merged_retain_vif(self): + # we have a vif in eth1 at this point, so that should be retained + self.fixture_path = "vyos_interfaces_config_vif.cfg" + set_module_args( + dict( + config=[ + dict(name="bond1", description="Bond - 1", enabled=True), + dict(name="vtun1", description="vtun - 1", enabled=True), + dict(name="wg01", description="wg - 1", enabled=True), + ], + state="merged", + ), + ) + + commands = [ + "set interfaces bonding bond1 description 'Bond - 1'", + "set interfaces openvpn vtun1 description 'vtun - 1'", + "set interfaces wireguard wg01 description 'wg - 1'", + ] + self.execute_module(changed=True, commands=commands) + + def test_vyos_interfaces_merged_additional_vif(self): + # we have a vif in eth1 at this point, so that should be retained + self.fixture_path = "vyos_interfaces_config_vif.cfg" + set_module_args( + dict( + config=[ + dict( + name="eth1", + vifs=[ + dict( + vlan_id=105, + description="vlan 105", + ), + ], + ), + ], + state="merged", + ), + ) + + commands = [ + "set interfaces ethernet eth1 vif 105 description 'vlan 105'", + ] + self.execute_module(changed=True, commands=commands) + def test_vyos_interfaces_merged_idempotent(self): set_module_args( dict( @@ -159,6 +207,102 @@ class TestVyosFirewallInterfacesModule(TestVyosModule): ] self.execute_module(changed=True, commands=commands) + def test_vyos_interfaces_replaced_remove_vif(self): + # we have a vif in eth1 at this point, so that should be removed + self.fixture_path = "vyos_interfaces_config_vif.cfg" + set_module_args( + dict( + config=[ + dict( + name="eth4", + description="Ethernet 4", + enabled=True, + speed="auto", + duplex="auto", + ), + dict(name="eth1", description="Configured by Ansible"), + ], + state="replaced", + ), + ) + + commands = [ + "delete interfaces ethernet eth1 vif 200", + "delete interfaces ethernet eth1 vif 201", + "set interfaces ethernet eth1 description 'Configured by Ansible'", + "set interfaces ethernet eth4 description 'Ethernet 4'", + "set interfaces ethernet eth4 duplex 'auto'", + "set interfaces ethernet eth4 speed 'auto'", + ] + self.execute_module(changed=True, commands=commands) + + def test_vyos_interfaces_merged_enable_vif(self): + # merge in enabling vif + self.fixture_path = "vyos_interfaces_config_vif.cfg" + set_module_args( + dict( + config=[ + dict( + name="eth1", + vifs=[ + dict( + vlan_id=201, + enabled=True, + ), + ], + ), + ], + state="merged", + ), + ) + + commands = [ + "delete interfaces ethernet eth1 vif 201 disable", + ] + self.execute_module(changed=True, commands=commands) + + def test_vyos_interfaces_replaced_retain_vif(self): + # we have a vif in eth1 at this point, so that should be removed + self.fixture_path = "vyos_interfaces_config_vif.cfg" + set_module_args( + dict( + config=[ + dict( + name="eth4", + description="Ethernet 4", + enabled=True, + speed="auto", + duplex="auto", + ), + dict( + name="eth1", + description="Configured by Ansible", + vifs=[ + dict( + vlan_id=200, + ), + dict( + vlan_id=201, + description="VIF eth1.201", + enabled=True, + ), + ], + ), + ], + state="replaced", + ), + ) + + commands = [ + "delete interfaces ethernet eth1 vif 200 description", + "delete interfaces ethernet eth1 vif 201 disable", + "set interfaces ethernet eth1 description 'Configured by Ansible'", + "set interfaces ethernet eth4 description 'Ethernet 4'", + "set interfaces ethernet eth4 duplex 'auto'", + "set interfaces ethernet eth4 speed 'auto'", + ] + self.execute_module(changed=True, commands=commands) + def test_vyos_interfaces_overridden_newinterface(self): set_module_args( dict( @@ -187,6 +331,38 @@ class TestVyosFirewallInterfacesModule(TestVyosModule): ] self.execute_module(changed=True, commands=commands) + def test_vyos_overridden_remove_vif(self): + # we have a vif in eth1 at this point, so that should be removed + self.fixture_path = "vyos_interfaces_config_vif.cfg" + set_module_args( + dict( + config=[ + dict( + name="eth4", + description="Ethernet 4", + enabled=True, + speed="auto", + duplex="auto", + ), + dict(name="eth1", description="Configured by Ansible"), + ], + state="overridden", + ), + ) + + commands = [ + "set interfaces ethernet eth1 description 'Configured by Ansible'", + "set interfaces ethernet eth4 description 'Ethernet 4'", + "set interfaces ethernet eth4 duplex 'auto'", + "set interfaces ethernet eth4 speed 'auto'", + "delete interfaces wireguard wg02 description", + "delete interfaces ethernet eth3 description", + "delete interfaces ethernet eth3 disable", + "delete interfaces ethernet eth1 vif 200", + "delete interfaces ethernet eth1 vif 201", + ] + self.execute_module(changed=True, commands=commands) + def test_vyos_interfaces_idempotent_disable(self): set_module_args( dict( @@ -198,7 +374,7 @@ class TestVyosFirewallInterfacesModule(TestVyosModule): ), ], state="merged", - ) + ), ) commands = [] @@ -215,8 +391,62 @@ class TestVyosFirewallInterfacesModule(TestVyosModule): ), ], state="replaced", - ) + ), ) commands = [] self.execute_module(changed=False, commands=commands) + + def test_vyos_interfaces_deleted_remove_vif(self): + # we have a vif in eth1 at this point, so that should be removed + self.fixture_path = "vyos_interfaces_config_vif.cfg" + set_module_args( + dict( + config=[ + dict(name="eth1"), + ], + state="deleted", + ), + ) + + commands = [ + "delete interfaces ethernet eth1 vif 200", + "delete interfaces ethernet eth1 vif 201", + "delete interfaces ethernet eth1 description", + ] + self.execute_module(changed=True, commands=commands) + + def test_vyos_interfaces_deleted_remove_all(self): + # we have a vif in eth1 at this point, so that should be removed + set_module_args( + dict( + config=[], + state="deleted", + ), + ) + + commands = [ + "delete interfaces ethernet eth1 description", + "delete interfaces ethernet eth3 description", + "delete interfaces ethernet eth3 disable", + "delete interfaces wireguard wg02 description", + ] + self.execute_module(changed=True, commands=commands) + + def test_vyos_interfaces_replaced_bad_name(self): + set_module_args( + dict( + config=[ + dict( + name="int4", + description="Ethernet 4", + enabled=True, + speed="auto", + duplex="auto", + ), + ], + state="replaced", + ), + ) + + self.execute_module(failed=True) |