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 @@ -1,70 +1,71 @@ --- name: Code Coverage # cloned from ansible-network/github_actions/.github/workflows/coverage_network_devices.yml@main # in order to deal with token issue in codecov on: # yamllint disable-line rule:truthy push: pull_request: branches: [main] jobs: codecoverage: env: PY_COLORS: "1" source_directory: "./source" python_version: "3.10" ansible_version: "latest" os: "ubuntu-latest" collection_pre_install: >- git+https://github.com/ansible-collections/ansible.utils.git git+https://github.com/ansible-collections/ansible.netcommon.git runs-on: ubuntu-latest name: "Code Coverage | Python 3.10" steps: - name: Checkout the collection repository uses: ansible-network/github_actions/.github/actions/checkout_dependency@main with: path: ${{ env.source_directory }} ref: ${{ github.event.pull_request.head.sha }} fetch-depth: "0" - name: Set up Python ${{ env.python_version }} uses: actions/setup-python@v4 with: python-version: ${{ env.python_version }} - name: Install ansible-core (${{ env.ansible-version }}) run: python3 -m pip install ansible-core pytest pytest-cov pytest-ansible-units pytest-forked pytest-xdist - name: Read collection metadata from galaxy.yml id: identify uses: ansible-network/github_actions/.github/actions/identify_collection@main with: source_path: ${{ env.source_directory }} - name: Build and install the collection uses: ansible-network/github_actions/.github/actions/build_install_collection@main with: install_python_dependencies: true source_path: ${{ env.source_directory }} collection_path: ${{ steps.identify.outputs.collection_path }} tar_file: ${{ steps.identify.outputs.tar_file }} - name: Print the ansible version run: ansible --version - name: Print the python dependencies run: python3 -m pip list - name: Run Coverage tests run: | pytest tests/unit -v --cov-report xml --cov=./ 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 @@ -1,1132 +1,1123 @@ .. _vyos.vyos.vyos_interfaces_module: ************************* vyos.vyos.vyos_interfaces ************************* **Manages interface attributes of VyOS network devices.** Version added: 2.9.0 .. contents:: :local: :depth: 1 Synopsis -------- - This module manages the interface attributes on VyOS network devices. - This module supports managing base attributes of Ethernet, Bonding, VXLAN, Loopback and Virtual Tunnel Interfaces. Parameters ---------- .. raw:: html
Parameter Choices/Defaults Comments
config
list / elements=dictionary
The provided interface configuration.
description
string
Interface description.
duplex
string
    Choices:
  • full
  • half
  • auto
Interface duplex mode.
Applicable for Ethernet interfaces only.
enabled
boolean
    Choices:
  • no
  • yes ←
Administrative state of the interface.
Set the value to true to administratively enable the interface or false to disable it.

aliases: enable
mtu
integer
MTU for a specific interface. Refer to vendor documentation for valid values.
Applicable for Ethernet, Bonding, VXLAN and Virtual Tunnel interfaces.
name
string / required
Full name of the interface, e.g. eth0, eth1, bond0, vti1, vxlan2.
speed
string
    Choices:
  • auto
  • 10
  • 100
  • 1000
  • 2500
  • 10000
Interface link speed.
Applicable for Ethernet interfaces only.
vifs
list / elements=dictionary
Virtual sub-interfaces related configuration.
802.1Q VLAN interfaces are represented as virtual sub-interfaces in VyOS.
description
string
Virtual sub-interface description.
enabled
boolean
    Choices:
  • no
  • yes ←
Administrative state of the virtual sub-interface.
Set the value to true to administratively enable the interface or false to disable it.

aliases: enable
mtu
integer
MTU for the virtual sub-interface.
Refer to vendor documentation for valid values.
vlan_id
integer
Identifier for the virtual sub-interface.
running_config
string
This option is used only with state parsed.
The value of this option should be the output received from the VyOS device by executing the command show configuration commands | grep interfaces.
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
state
string
    Choices:
  • merged ←
  • replaced
  • overridden
  • deleted
  • rendered
  • gathered
  • parsed
The state of the configuration after module completion.

Notes ----- .. note:: - Tested against VyOS 1.3.8 - This module works with connection ``ansible.netcommon.network_cli``. See `the VyOS OS Platform Options <../network/user_guide/platform_vyos.html>`_. Examples -------- .. code-block:: yaml # Using merged # Before state: # ------------- # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding 'bond0' # set interfaces bonding 'bond1' # set interfaces bonding bond2 'ip' # set interfaces bonding bond2 'ipv6' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 'ip' # set interfaces ethernet eth0 'ipv6' # set interfaces ethernet eth0 smp_affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet 'eth1' # set interfaces ethernet 'eth2' - name: Merge provided configuration with device configuration vyos.vyos.vyos_interfaces: config: - name: eth2 description: Configured by Ansible enabled: true vifs: - vlan_id: 200 description: VIF 200 - ETH2 - name: eth3 description: Configured by Ansible mtu: 1500 - name: bond1 description: Bond - 1 mtu: 1200 - name: vti2 description: VTI - 2 enabled: false state: merged # Task Output # ----------- # before: # - enabled: true # name: lo # - enabled: true # name: eth3 # - enabled: true # name: eth2 # - enabled: true # name: eth1 # - duplex: auto # enabled: true # name: eth0 # speed: auto # commands: # - set interfaces ethernet eth2 description 'Configured by Ansible' # - set interfaces ethernet eth2 vif 200 # - set interfaces ethernet eth2 vif 200 description 'VIF 200 - ETH2' # - set interfaces ethernet eth3 description 'Configured by Ansible' # - set interfaces ethernet eth3 mtu '1500' # - set interfaces bonding bond1 # - set interfaces bonding bond1 description 'Bond - 1' # - set interfaces bonding bond1 mtu '1200' # - set interfaces vti vti2 # - set interfaces vti vti2 description 'VTI - 2' # - set interfaces vti vti2 disable # after: # - description: Bond - 1 # enabled: true # mtu: 1200 # name: bond1 # - enabled: true # name: lo # - description: VTI - 2 # enabled: false # name: vti2 # - description: Configured by Ansible # enabled: true # mtu: 1500 # name: eth3 # - description: Configured by Ansible # enabled: true # name: eth2 # vifs: # - description: VIF 200 - ETH2 # enabled: true # vlan_id: '200' # - enabled: true # name: eth1 # - duplex: auto # enabled: true # name: eth0 # speed: auto # After state: # ------------ # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding bond1 description 'Bond - 1' # set interfaces bonding bond1 mtu '1200' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # 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 eth2 description 'Configured 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 description 'VIF 200 - ETH2' # set interfaces ethernet eth3 description 'Configured by Ansible' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces ethernet eth3 mtu '1500' # set interfaces loopback lo # set interfaces vti vti2 description 'VTI - 2' # set interfaces vti vti2 disable # Using replaced # Before state: # ------------- # vyos:~$ show configuration commands | grep eth # set interfaces bonding bond1 description 'Bond - 1' # set interfaces bonding bond1 mtu '1400' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 description 'Management Interface for the Appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:f3:6c:b5' # set interfaces ethernet eth0 smp_affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Configured by Ansible Eng Team' # set interfaces ethernet eth1 duplex 'full' # set interfaces ethernet eth1 hw-id '08:00:27:ad:ef:65' # set interfaces ethernet eth1 smp_affinity 'auto' # set interfaces ethernet eth1 speed '100' # set interfaces ethernet eth2 description 'Configured by Ansible' # set interfaces ethernet eth2 duplex 'full' # set interfaces ethernet eth2 hw-id '08:00:27:ab:4e:79' # set interfaces ethernet eth2 mtu '500' # set interfaces ethernet eth2 smp_affinity 'auto' # set interfaces ethernet eth2 speed '100' # set interfaces ethernet eth2 vif 200 description 'Configured by Ansible' # set interfaces ethernet eth3 description 'Configured by Ansible' # set interfaces ethernet eth3 duplex 'full' # set interfaces ethernet eth3 hw-id '08:00:27:17:3c:85' # set interfaces ethernet eth3 mtu '1500' # set interfaces ethernet eth3 smp_affinity 'auto' # set interfaces ethernet eth3 speed '100' # set interfaces loopback lo - name: Replace device configurations of listed interfaces with provided configurations vyos.vyos.vyos_interfaces: config: - name: eth2 description: Replaced by Ansible - name: eth3 description: Replaced by Ansible - name: eth1 description: Replaced by Ansible state: replaced # Task Output # ----------- # before: # - description: Bond - 1 # enabled: true # mtu: 1400 # name: bond1 # - enabled: true # name: lo # - description: Configured by Ansible # duplex: full # enabled: true # mtu: 1500 # name: eth3 # speed: '100' # - description: Configured by Ansible # duplex: full # enabled: true # mtu: 500 # name: eth2 # speed: '100' # vifs: # - description: VIF 200 - ETH2 # enabled: true # vlan_id: '200' # - description: Configured by Ansible Eng Team # duplex: full # enabled: true # name: eth1 # speed: '100' # - description: Management Interface for the Appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # commands: # - 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 # - delete interfaces ethernet eth3 mtu # - set interfaces ethernet eth3 description 'Replaced by Ansible' # - delete interfaces ethernet eth1 speed # - delete interfaces ethernet eth1 duplex # - set interfaces ethernet eth1 description 'Replaced by Ansible' # after: # - description: Bond - 1 # enabled: true # mtu: 1400 # name: bond1 # - enabled: true # name: lo # - description: Replaced by Ansible # enabled: true # name: eth3 # - description: Replaced by Ansible # enabled: true # name: eth2 - # vifs: - # - enabled: true - # vlan_id: '200' # - description: Replaced by Ansible # enabled: true # name: eth1 # - description: Management Interface for the Appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # After state: # ------------ # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding bond1 description 'Bond - 1' # set interfaces bonding bond1 mtu '1400' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Management Interface for the Appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Replaced by Ansible' # set interfaces ethernet eth1 hw-id '08:00:27:ea:0f:b9' # set interfaces ethernet eth1 smp-affinity 'auto' # 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 # Using overridden # Before state: # ------------- # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Ethernet Interface - 0' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 mtu '1200' # set interfaces ethernet eth0 smp-affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Configured by Ansible Eng Team' # set interfaces ethernet eth1 hw-id '08:00:27:ea:0f:b9' # set interfaces ethernet eth1 mtu '100' # set interfaces ethernet eth1 smp-affinity 'auto' # set interfaces ethernet eth1 vif 100 description 'VIF 100 - ETH1' # set interfaces ethernet eth1 vif 100 disable # set interfaces ethernet eth2 description 'Configured by Ansible Team (Admin Down)' # set interfaces ethernet eth2 disable # set interfaces ethernet eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 mtu '600' # set interfaces ethernet eth2 smp-affinity 'auto' # set interfaces ethernet eth3 description 'Configured by Ansible Network' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces loopback lo # set interfaces vti vti1 description 'Virtual Tunnel Interface - 1' # set interfaces vti vti1 mtu '68' - name: Overrides all device configuration with provided configuration vyos.vyos.vyos_interfaces: config: - name: eth0 description: Outbound Interface For The Appliance speed: auto duplex: auto - name: eth2 speed: auto duplex: auto - name: eth3 mtu: 1200 state: overridden # Task Output # ----------- # before: # - enabled: true # name: lo # - description: Virtual Tunnel Interface - 1 # enabled: true # mtu: 68 # name: vti1 # - description: Configured by Ansible Network # enabled: true # name: eth3 # - description: Configured by Ansible Team (Admin Down) # enabled: false # mtu: 600 # name: eth2 # - description: Configured by Ansible Eng Team # enabled: true # mtu: 100 # name: eth1 # vifs: # - description: VIF 100 - ETH1 # enabled: false # vlan_id: '100' # - description: Ethernet Interface - 0 # duplex: auto # enabled: true # mtu: 1200 # name: eth0 # speed: auto # commands: # - delete interfaces vti vti1 description # - 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 # - delete interfaces ethernet eth2 mtu # - set interfaces ethernet eth2 duplex 'auto' # - delete interfaces ethernet eth2 disable # - set interfaces ethernet eth2 speed 'auto' # - delete interfaces ethernet eth3 description # - set interfaces ethernet eth3 mtu '1200' # after: # - enabled: true # name: lo # - enabled: true # name: vti1 # - enabled: true # mtu: 1200 # name: eth3 # - duplex: auto # enabled: true # name: eth2 # speed: auto # - enabled: true # name: eth1 - # vifs: - # - enabled: true - # vlan_id: '100' # - description: Outbound Interface For The Appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # After state: # ------------ # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Outbound Interface For The Appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # 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' # set interfaces ethernet eth2 speed 'auto' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces ethernet eth3 mtu '1200' # set interfaces loopback lo # set interfaces vti vti1 # Using deleted # Before state: # ------------- # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding bond0 mtu '1300' # set interfaces bonding bond1 description 'LAG - 1' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Outbound Interface for this appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Configured by Ansible Network' # set interfaces ethernet eth1 duplex 'full' # set interfaces ethernet eth1 hw-id '08:00:27:ea:0f:b9' # set interfaces ethernet eth1 smp-affinity 'auto' # set interfaces ethernet eth1 speed '100' # set interfaces ethernet eth2 description 'Configured by Ansible' # set interfaces ethernet eth2 disable # set interfaces ethernet eth2 duplex 'full' # set interfaces ethernet eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 mtu '600' # set interfaces ethernet eth2 smp-affinity 'auto' # set interfaces ethernet eth2 speed '100' # set interfaces ethernet eth3 description 'Configured by Ansible Network' # set interfaces ethernet eth3 duplex 'full' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces ethernet eth3 speed '100' # set interfaces loopback lo - name: Delete attributes of given interfaces (Note - This won't delete the interfaces themselves) vyos.vyos.vyos_interfaces: config: - name: bond1 - name: eth1 - name: eth2 - name: eth3 state: deleted # Task Output # ----------- # before: # - enabled: true # mtu: 1300 # name: bond0 # - description: LAG - 1 # enabled: true # name: bond1 # - enabled: true # name: lo # - description: Configured by Ansible Network # duplex: full # enabled: true # name: eth3 # speed: '100' # - description: Configured by Ansible # duplex: full # enabled: false # mtu: 600 # name: eth2 # speed: '100' # - description: Configured by Ansible Network # duplex: full # enabled: true # name: eth1 # speed: '100' # - description: Outbound Interface for this appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # commands: # - delete interfaces bonding bond1 description # - delete interfaces ethernet eth1 speed # - delete interfaces ethernet eth1 duplex # - delete interfaces ethernet eth1 description # - delete interfaces ethernet eth2 speed # - delete interfaces ethernet eth2 disable # - delete interfaces ethernet eth2 duplex # - delete interfaces ethernet eth2 disable # - delete interfaces ethernet eth2 description # - delete interfaces ethernet eth2 disable # - delete interfaces ethernet eth2 mtu # - delete interfaces ethernet eth2 disable # - delete interfaces ethernet eth3 speed # - delete interfaces ethernet eth3 duplex # - delete interfaces ethernet eth3 description # after: # - enabled: true # mtu: 1300 # name: bond0 # - enabled: true # name: bond1 # - enabled: true # name: lo # - enabled: true # name: eth3 # - enabled: true # name: eth2 # - enabled: true # name: eth1 # - description: Outbound Interface for this appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # After state: # ------------ # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding bond0 mtu '1300' # set interfaces bonding bond1 # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Outbound Interface for this appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # 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 eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 smp-affinity 'auto' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces loopback lo # Using gathered # Before state: # ------------- # vyos@192# run show configuration commands | grep interfaces # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' # set interfaces ethernet eth0 smp_affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Configured by Ansible' # set interfaces ethernet eth1 duplex 'auto' # set interfaces ethernet eth1 mtu '1500' # set interfaces ethernet eth1 speed 'auto' # set interfaces ethernet eth1 vif 200 description 'VIF - 200' # set interfaces ethernet eth2 description 'Configured by Ansible' # set interfaces ethernet eth2 duplex 'auto' # set interfaces ethernet eth2 mtu '1500' # set interfaces ethernet eth2 speed 'auto' # set interfaces ethernet eth2 vif 200 description 'VIF - 200' # - name: Gather listed interfaces with provided configurations vyos.vyos.vyos_interfaces: state: gathered # Task output # ----------- # gathered: # - description: Configured by Ansible # duplex: auto # enabled: true # mtu: 1500 # name: eth2 # speed: auto # vifs: # - description: VIF - 200 # enabled: true # vlan_id: 200 # - description: Configured by Ansible # duplex: auto # enabled: true # mtu: 1500 # name: eth1 # speed: auto # vifs: # - description: VIF - 200 # enabled: true # vlan_id: 200 # - duplex: auto # enabled: true # name: eth0 # speed: auto # Using rendered - name: Render the commands for provided configuration vyos.vyos.vyos_interfaces: config: - name: eth0 enabled: true duplex: auto speed: auto - name: eth1 description: Configured by Ansible - Interface 1 mtu: 1500 speed: auto duplex: auto enabled: true vifs: - vlan_id: 100 description: Eth1 - VIF 100 mtu: 400 enabled: true - vlan_id: 101 description: Eth1 - VIF 101 enabled: true - name: eth2 description: Configured by Ansible - Interface 2 (ADMIN DOWN) mtu: 600 enabled: false state: rendered # Task Output # ----------- # rendered: # - set interfaces ethernet eth0 duplex 'auto' # - set interfaces ethernet eth0 speed 'auto' # - delete interfaces ethernet eth0 disable # - set interfaces ethernet eth1 duplex 'auto' # - delete interfaces ethernet eth1 disable # - set interfaces ethernet eth1 speed 'auto' # - set interfaces ethernet eth1 description 'Configured by Ansible - Interface 1' # - set interfaces ethernet eth1 mtu '1500' # - set interfaces ethernet eth1 vif 100 description 'Eth1 - VIF 100' # - set interfaces ethernet eth1 vif 100 mtu '400' # - set interfaces ethernet eth1 vif 101 description 'Eth1 - VIF 101' # - set interfaces ethernet eth2 disable # - set interfaces ethernet eth2 description 'Configured by Ansible - Interface 2 (ADMIN # DOWN)' # - set interfaces ethernet eth2 mtu '600' # Using parsed - name: Parse the configuration. vyos.vyos.vyos_interfaces: running_config: "set interfaces ethernet eth0 address 'dhcp' set interfaces ethernet eth0 duplex 'auto' set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' set interfaces ethernet eth0 smp_affinity 'auto' set interfaces ethernet eth0 speed 'auto' set interfaces ethernet eth1 description 'Configured by Ansible' set interfaces ethernet eth1 duplex 'auto' set interfaces ethernet eth1 mtu '1500' set interfaces ethernet eth1 speed 'auto' set interfaces ethernet eth1 vif 200 description 'VIF - 200' set interfaces ethernet eth2 description 'Configured by Ansible' set interfaces ethernet eth2 duplex 'auto' set interfaces ethernet eth2 mtu '1500' set interfaces ethernet eth2 speed 'auto' set interfaces ethernet eth2 vif 200 description 'VIF - 200'" state: parsed # Task output # ----------- # parsed: # - description: Configured by Ansible # duplex: auto # enabled: true # mtu: 1500 # name: eth2 # speed: auto # vifs: # - description: VIF - 200 # enabled: true # vlan_id: 200 # - description: Configured by Ansible # duplex: auto # enabled: true # mtu: 1500 # name: eth1 # speed: auto # vifs: # - description: VIF - 200 # enabled: true # vlan_id: 200 # - duplex: auto # enabled: true # name: eth0 # speed: auto Return Values ------------- Common return values are documented `here `_, the following are the fields unique to this module: .. raw:: html
Key Returned Description
after
list
when changed
The resulting configuration after module execution.

Sample:
This output will always be in the same format as the module argspec.
before
list
when state is merged, replaced, overridden, deleted or purged
The configuration prior to the module execution.

Sample:
This output will always be in the same format as the module argspec.
commands
list
always
The set of commands pushed to the remote device.

Sample:
['set interfaces ethernet eth1 mtu 1200', 'set interfaces ethernet eth2 vif 100 description VIF 100']
gathered
list
when state is gathered
Facts about the network resource gathered from the remote device as structured data.

Sample:
This output will always be in the same format as the module argspec.
parsed
list
when state is parsed
The device native config provided in running_config option parsed into structured data as per module argspec.

Sample:
This output will always be in the same format as the module argspec.
rendered
list
when state is rendered
The provided configuration in the task rendered in device-native format (offline).

Sample:
['set interfaces ethernet eth1 mtu 1200', 'set interfaces ethernet eth2 vif 100 description VIF 100']


Status ------ Authors ~~~~~~~ - Nilashish Chakraborty (@nilashishc) - Rohit Thakur (@rohitthakur2590) 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 @@ -1,334 +1,341 @@ # Copyright 2019 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) """ The vyos_interfaces class It is in this file where the current configuration (as dict) is compared to the provided configuration (as dict) and the command set necessary to bring the current configuration to it's desired end-state is created """ from __future__ import absolute_import, division, print_function __metaclass__ = type from copy import deepcopy from ansible.module_utils.six import iteritems from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( ConfigBase, ) from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( dict_diff, remove_empties, to_list, ) from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.facts import Facts from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.utils import ( dict_delete, get_interface_type, search_obj_in_list, ) class Interfaces(ConfigBase): """ The vyos_interfaces class """ gather_subset = [ "!all", "!min", ] gather_network_resources = ["interfaces"] def __init__(self, module): super(Interfaces, self).__init__(module) def get_interfaces_facts(self, data=None): """Get the 'facts' (the current configuration) :rtype: A dictionary :returns: The current configuration as a dictionary """ facts, _warnings = Facts(self._module).get_facts( self.gather_subset, self.gather_network_resources, data=data, ) interfaces_facts = facts["ansible_network_resources"].get("interfaces") if not interfaces_facts: return [] return interfaces_facts def execute_module(self): """Execute the module :rtype: A dictionary :returns: The result from module execution """ result = {"changed": False} commands = list() warnings = list() if self.state in self.ACTION_STATES: existing_interfaces_facts = self.get_interfaces_facts() else: existing_interfaces_facts = [] if self.state in self.ACTION_STATES or self.state == "rendered": commands.extend(self.set_config(existing_interfaces_facts)) if commands and self.state in self.ACTION_STATES: if not self._module.check_mode: self._connection.edit_config(commands) result["changed"] = True if self.state in self.ACTION_STATES: result["commands"] = commands if self.state in self.ACTION_STATES or self.state == "gathered": changed_interfaces_facts = self.get_interfaces_facts() elif self.state == "rendered": result["rendered"] = commands elif self.state == "parsed": running_config = self._module.params["running_config"] if not running_config: self._module.fail_json( msg="value of running_config parameter must not be empty for state parsed", ) result["parsed"] = self.get_interfaces_facts(data=running_config) else: changed_interfaces_facts = [] if self.state in self.ACTION_STATES: result["before"] = existing_interfaces_facts if result["changed"]: result["after"] = changed_interfaces_facts elif self.state == "gathered": result["gathered"] = changed_interfaces_facts result["warnings"] = warnings return result def set_config(self, existing_interfaces_facts): """Collect the configuration from the args passed to the module, collect the current configuration (as a dict from facts) :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ want = self._module.params["config"] have = existing_interfaces_facts resp = self.set_state(want, have) return to_list(resp) def set_state(self, want, have): """Select the appropriate function based on the state provided :param want: the desired configuration as a dictionary :param have: the current configuration as a dictionary :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] if self.state in ("merged", "replaced", "overridden", "rendered") and not want: self._module.fail_json( msg="value of config parameter must not be empty for state {0}".format(self.state), ) if self.state == "overridden": commands.extend(self._state_overridden(want=want, have=have)) elif self.state == "deleted": if not want: for intf in have: commands.extend(self._state_deleted({"name": intf["name"]}, intf)) else: for item in want: obj_in_have = search_obj_in_list(item["name"], have) commands.extend(self._state_deleted(item, obj_in_have)) else: for item in want: name = item["name"] enable_state = item["enabled"] obj_in_have = search_obj_in_list(name, have) if not obj_in_have: obj_in_have = {"name": name, "enabled": enable_state} if self.state in ("merged", "rendered"): commands.extend(self._state_merged(item, obj_in_have)) elif self.state == "replaced": commands.extend(self._state_replaced(item, obj_in_have)) return commands def _state_replaced(self, want, have): """The command generator when state is replaced :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] if have: commands.extend(self._state_deleted(want, have)) commands.extend(self._state_merged(want, have)) return commands def _state_overridden(self, want, have): """The command generator when state is overridden :rtype: A list :returns: the commands necessary to migrate the current configuration to the desired configuration """ commands = [] for intf in have: intf_in_want = search_obj_in_list(intf["name"], want) if not intf_in_want: commands.extend(self._state_deleted({"name": intf["name"]}, intf)) for intf in want: intf_in_have = search_obj_in_list(intf["name"], have) if not intf_in_have: intf_in_have = { "name": intf["name"], "enabled": intf["enabled"], } commands.extend(self._state_replaced(intf, intf_in_have)) return commands def _state_merged(self, want, have): """The command generator when state is merged :rtype: A list :returns: the commands necessary to merge the provided into the current configuration """ commands = [] want_copy = deepcopy(remove_empties(want)) have_copy = deepcopy(have) want_vifs = want_copy.pop("vifs", []) have_vifs = have_copy.pop("vifs", []) updates = dict_diff(have_copy, want_copy) if updates: for key, value in iteritems(updates): commands.append( self._compute_commands(key=key, value=value, interface=want_copy["name"]), ) if want_vifs: for want_vif in want_vifs: have_vif = search_obj_in_list(want_vif["vlan_id"], have_vifs, key="vlan_id") if not have_vif: have_vif = { "vlan_id": want_vif["vlan_id"], "enabled": True, } vif_updates = dict_diff(have_vif, want_vif) if vif_updates: for key, value in iteritems(vif_updates): commands.append( self._compute_commands( key=key, value=value, interface=want_copy["name"], vif=want_vif["vlan_id"], ), ) return commands def _state_deleted(self, want, have): """The command generator when state is deleted :rtype: A list :returns: the commands necessary to remove the current configuration of the provided objects """ commands = [] want_copy = deepcopy(remove_empties(want)) have_copy = deepcopy(have) want_vifs = want_copy.pop("vifs", []) have_vifs = have_copy.pop("vifs", []) for key in dict_delete(have_copy, want_copy).keys(): if key == "enabled": continue 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"]), ) if have_vifs: 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: command = "{0} disable".format(del_cmd) else: if not remove: command = "{0} {1} '{2}'".format(set_cmd, key, value) else: command = "{0} {1}".format(del_cmd, key) return command 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 @@ -1,918 +1,909 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # Copyright 2019 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) ############################################# # WARNING # ############################################# # # This file is auto generated by the resource # module builder playbook. # # Do not edit this file manually. # # Changes to this file will be over written # by the resource module builder. # # Changes should be made in the model used to # generate this file or in the resource module # builder template. # ############################################# """ The module file for vyos_interfaces """ from __future__ import absolute_import, division, print_function __metaclass__ = type ANSIBLE_METADATA = { "metadata_version": "1.1", "status": ["preview"], "supported_by": "network", } DOCUMENTATION = """ --- module: vyos_interfaces version_added: '2.9.0' short_description: Manages interface attributes of VyOS network devices. description: - This module manages the interface attributes on VyOS network devices. - This module supports managing base attributes of Ethernet, Bonding, VXLAN, Loopback and Virtual Tunnel Interfaces. notes: - Tested against VyOS 1.3.8 - This module works with connection C(ansible.netcommon.network_cli). See L(the VyOS OS Platform Options,../network/user_guide/platform_vyos.html). author: - Nilashish Chakraborty (@nilashishc) - Rohit Thakur (@rohitthakur2590) options: config: description: The provided interface configuration. type: list elements: dict suboptions: name: description: - Full name of the interface, e.g. eth0, eth1, bond0, vti1, vxlan2. type: str required: true description: description: - Interface description. type: str duplex: description: - Interface duplex mode. - Applicable for Ethernet interfaces only. choices: - full - half - auto type: str enabled: default: true description: - Administrative state of the interface. - Set the value to C(true) to administratively enable the interface or C(false) to disable it. type: bool aliases: ['enable'] mtu: description: - MTU for a specific interface. Refer to vendor documentation for valid values. - Applicable for Ethernet, Bonding, VXLAN and Virtual Tunnel interfaces. type: int speed: description: - Interface link speed. - Applicable for Ethernet interfaces only. type: str choices: - auto - '10' - '100' - '1000' - '2500' - '10000' vifs: description: - Virtual sub-interfaces related configuration. - 802.1Q VLAN interfaces are represented as virtual sub-interfaces in VyOS. type: list elements: dict suboptions: vlan_id: description: - Identifier for the virtual sub-interface. type: int description: description: - Virtual sub-interface description. type: str enabled: description: - Administrative state of the virtual sub-interface. - Set the value to C(true) to administratively enable the interface or C(false) to disable it. type: bool default: true aliases: ['enable'] mtu: description: - MTU for the virtual sub-interface. - Refer to vendor documentation for valid values. type: int running_config: description: - This option is used only with state I(parsed). - The value of this option should be the output received from the VyOS device by executing the command B(show configuration commands | grep interfaces). - The state I(parsed) reads the configuration from C(running_config) option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the I(parsed) key within the result. type: str state: description: - The state of the configuration after module completion. type: str choices: - merged - replaced - overridden - deleted - rendered - gathered - parsed default: merged """ EXAMPLES = """ # Using merged # Before state: # ------------- # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding 'bond0' # set interfaces bonding 'bond1' # set interfaces bonding bond2 'ip' # set interfaces bonding bond2 'ipv6' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 'ip' # set interfaces ethernet eth0 'ipv6' # set interfaces ethernet eth0 smp_affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet 'eth1' # set interfaces ethernet 'eth2' - name: Merge provided configuration with device configuration vyos.vyos.vyos_interfaces: config: - name: eth2 description: Configured by Ansible enabled: true vifs: - vlan_id: 200 description: VIF 200 - ETH2 - name: eth3 description: Configured by Ansible mtu: 1500 - name: bond1 description: Bond - 1 mtu: 1200 - name: vti2 description: VTI - 2 enabled: false state: merged # Task Output # ----------- # before: # - enabled: true # name: lo # - enabled: true # name: eth3 # - enabled: true # name: eth2 # - enabled: true # name: eth1 # - duplex: auto # enabled: true # name: eth0 # speed: auto # commands: # - set interfaces ethernet eth2 description 'Configured by Ansible' # - set interfaces ethernet eth2 vif 200 # - set interfaces ethernet eth2 vif 200 description 'VIF 200 - ETH2' # - set interfaces ethernet eth3 description 'Configured by Ansible' # - set interfaces ethernet eth3 mtu '1500' # - set interfaces bonding bond1 # - set interfaces bonding bond1 description 'Bond - 1' # - set interfaces bonding bond1 mtu '1200' # - set interfaces vti vti2 # - set interfaces vti vti2 description 'VTI - 2' # - set interfaces vti vti2 disable # after: # - description: Bond - 1 # enabled: true # mtu: 1200 # name: bond1 # - enabled: true # name: lo # - description: VTI - 2 # enabled: false # name: vti2 # - description: Configured by Ansible # enabled: true # mtu: 1500 # name: eth3 # - description: Configured by Ansible # enabled: true # name: eth2 # vifs: # - description: VIF 200 - ETH2 # enabled: true # vlan_id: '200' # - enabled: true # name: eth1 # - duplex: auto # enabled: true # name: eth0 # speed: auto # After state: # ------------ # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding bond1 description 'Bond - 1' # set interfaces bonding bond1 mtu '1200' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # 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 eth2 description 'Configured 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 description 'VIF 200 - ETH2' # set interfaces ethernet eth3 description 'Configured by Ansible' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces ethernet eth3 mtu '1500' # set interfaces loopback lo # set interfaces vti vti2 description 'VTI - 2' # set interfaces vti vti2 disable # Using replaced # Before state: # ------------- # vyos:~$ show configuration commands | grep eth # set interfaces bonding bond1 description 'Bond - 1' # set interfaces bonding bond1 mtu '1400' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 description 'Management Interface for the Appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:f3:6c:b5' # set interfaces ethernet eth0 smp_affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Configured by Ansible Eng Team' # set interfaces ethernet eth1 duplex 'full' # set interfaces ethernet eth1 hw-id '08:00:27:ad:ef:65' # set interfaces ethernet eth1 smp_affinity 'auto' # set interfaces ethernet eth1 speed '100' # set interfaces ethernet eth2 description 'Configured by Ansible' # set interfaces ethernet eth2 duplex 'full' # set interfaces ethernet eth2 hw-id '08:00:27:ab:4e:79' # set interfaces ethernet eth2 mtu '500' # set interfaces ethernet eth2 smp_affinity 'auto' # set interfaces ethernet eth2 speed '100' # set interfaces ethernet eth2 vif 200 description 'Configured by Ansible' # set interfaces ethernet eth3 description 'Configured by Ansible' # set interfaces ethernet eth3 duplex 'full' # set interfaces ethernet eth3 hw-id '08:00:27:17:3c:85' # set interfaces ethernet eth3 mtu '1500' # set interfaces ethernet eth3 smp_affinity 'auto' # set interfaces ethernet eth3 speed '100' # set interfaces loopback lo - name: Replace device configurations of listed interfaces with provided configurations vyos.vyos.vyos_interfaces: config: - name: eth2 description: Replaced by Ansible - name: eth3 description: Replaced by Ansible - name: eth1 description: Replaced by Ansible state: replaced # Task Output # ----------- # before: # - description: Bond - 1 # enabled: true # mtu: 1400 # name: bond1 # - enabled: true # name: lo # - description: Configured by Ansible # duplex: full # enabled: true # mtu: 1500 # name: eth3 # speed: '100' # - description: Configured by Ansible # duplex: full # enabled: true # mtu: 500 # name: eth2 # speed: '100' # vifs: # - description: VIF 200 - ETH2 # enabled: true # vlan_id: '200' # - description: Configured by Ansible Eng Team # duplex: full # enabled: true # name: eth1 # speed: '100' # - description: Management Interface for the Appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # commands: # - 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 # - delete interfaces ethernet eth3 mtu # - set interfaces ethernet eth3 description 'Replaced by Ansible' # - delete interfaces ethernet eth1 speed # - delete interfaces ethernet eth1 duplex # - set interfaces ethernet eth1 description 'Replaced by Ansible' # after: # - description: Bond - 1 # enabled: true # mtu: 1400 # name: bond1 # - enabled: true # name: lo # - description: Replaced by Ansible # enabled: true # name: eth3 # - description: Replaced by Ansible # enabled: true # name: eth2 -# vifs: -# - enabled: true -# vlan_id: '200' # - description: Replaced by Ansible # enabled: true # name: eth1 # - description: Management Interface for the Appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # After state: # ------------ # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding bond1 description 'Bond - 1' # set interfaces bonding bond1 mtu '1400' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Management Interface for the Appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Replaced by Ansible' # set interfaces ethernet eth1 hw-id '08:00:27:ea:0f:b9' # set interfaces ethernet eth1 smp-affinity 'auto' # 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 # Using overridden # Before state: # ------------- # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Ethernet Interface - 0' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 mtu '1200' # set interfaces ethernet eth0 smp-affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Configured by Ansible Eng Team' # set interfaces ethernet eth1 hw-id '08:00:27:ea:0f:b9' # set interfaces ethernet eth1 mtu '100' # set interfaces ethernet eth1 smp-affinity 'auto' # set interfaces ethernet eth1 vif 100 description 'VIF 100 - ETH1' # set interfaces ethernet eth1 vif 100 disable # set interfaces ethernet eth2 description 'Configured by Ansible Team (Admin Down)' # set interfaces ethernet eth2 disable # set interfaces ethernet eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 mtu '600' # set interfaces ethernet eth2 smp-affinity 'auto' # set interfaces ethernet eth3 description 'Configured by Ansible Network' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces loopback lo # set interfaces vti vti1 description 'Virtual Tunnel Interface - 1' # set interfaces vti vti1 mtu '68' - name: Overrides all device configuration with provided configuration vyos.vyos.vyos_interfaces: config: - name: eth0 description: Outbound Interface For The Appliance speed: auto duplex: auto - name: eth2 speed: auto duplex: auto - name: eth3 mtu: 1200 state: overridden # Task Output # ----------- # before: # - enabled: true # name: lo # - description: Virtual Tunnel Interface - 1 # enabled: true # mtu: 68 # name: vti1 # - description: Configured by Ansible Network # enabled: true # name: eth3 # - description: Configured by Ansible Team (Admin Down) # enabled: false # mtu: 600 # name: eth2 # - description: Configured by Ansible Eng Team # enabled: true # mtu: 100 # name: eth1 # vifs: # - description: VIF 100 - ETH1 # enabled: false # vlan_id: '100' # - description: Ethernet Interface - 0 # duplex: auto # enabled: true # mtu: 1200 # name: eth0 # speed: auto # commands: # - delete interfaces vti vti1 description # - 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 # - delete interfaces ethernet eth2 mtu # - set interfaces ethernet eth2 duplex 'auto' # - delete interfaces ethernet eth2 disable # - set interfaces ethernet eth2 speed 'auto' # - delete interfaces ethernet eth3 description # - set interfaces ethernet eth3 mtu '1200' # after: # - enabled: true # name: lo # - enabled: true # name: vti1 # - enabled: true # mtu: 1200 # name: eth3 # - duplex: auto # enabled: true # name: eth2 # speed: auto # - enabled: true # name: eth1 -# vifs: -# - enabled: true -# vlan_id: '100' # - description: Outbound Interface For The Appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # After state: # ------------ # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Outbound Interface For The Appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # 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' # set interfaces ethernet eth2 speed 'auto' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces ethernet eth3 mtu '1200' # set interfaces loopback lo # set interfaces vti vti1 # Using deleted # Before state: # ------------- # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding bond0 mtu '1300' # set interfaces bonding bond1 description 'LAG - 1' # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Outbound Interface for this appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Configured by Ansible Network' # set interfaces ethernet eth1 duplex 'full' # set interfaces ethernet eth1 hw-id '08:00:27:ea:0f:b9' # set interfaces ethernet eth1 smp-affinity 'auto' # set interfaces ethernet eth1 speed '100' # set interfaces ethernet eth2 description 'Configured by Ansible' # set interfaces ethernet eth2 disable # set interfaces ethernet eth2 duplex 'full' # set interfaces ethernet eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 mtu '600' # set interfaces ethernet eth2 smp-affinity 'auto' # set interfaces ethernet eth2 speed '100' # set interfaces ethernet eth3 description 'Configured by Ansible Network' # set interfaces ethernet eth3 duplex 'full' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces ethernet eth3 speed '100' # set interfaces loopback lo - name: Delete attributes of given interfaces (Note - This won't delete the interfaces themselves) vyos.vyos.vyos_interfaces: config: - name: bond1 - name: eth1 - name: eth2 - name: eth3 state: deleted # Task Output # ----------- # before: # - enabled: true # mtu: 1300 # name: bond0 # - description: LAG - 1 # enabled: true # name: bond1 # - enabled: true # name: lo # - description: Configured by Ansible Network # duplex: full # enabled: true # name: eth3 # speed: '100' # - description: Configured by Ansible # duplex: full # enabled: false # mtu: 600 # name: eth2 # speed: '100' # - description: Configured by Ansible Network # duplex: full # enabled: true # name: eth1 # speed: '100' # - description: Outbound Interface for this appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # commands: # - delete interfaces bonding bond1 description # - delete interfaces ethernet eth1 speed # - delete interfaces ethernet eth1 duplex # - delete interfaces ethernet eth1 description # - delete interfaces ethernet eth2 speed # - delete interfaces ethernet eth2 disable # - delete interfaces ethernet eth2 duplex # - delete interfaces ethernet eth2 disable # - delete interfaces ethernet eth2 description # - delete interfaces ethernet eth2 disable # - delete interfaces ethernet eth2 mtu # - delete interfaces ethernet eth2 disable # - delete interfaces ethernet eth3 speed # - delete interfaces ethernet eth3 duplex # - delete interfaces ethernet eth3 description # after: # - enabled: true # mtu: 1300 # name: bond0 # - enabled: true # name: bond1 # - enabled: true # name: lo # - enabled: true # name: eth3 # - enabled: true # name: eth2 # - enabled: true # name: eth1 # - description: Outbound Interface for this appliance # duplex: auto # enabled: true # name: eth0 # speed: auto # After state: # ------------ # vyos@vyos:~$ show configuration commands | grep interfaces # set interfaces bonding bond0 mtu '1300' # set interfaces bonding bond1 # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 address 'dhcpv6' # set interfaces ethernet eth0 description 'Outbound Interface for this appliance' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:30:f0:22' # set interfaces ethernet eth0 smp-affinity 'auto' # 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 eth2 hw-id '08:00:27:c2:98:23' # set interfaces ethernet eth2 smp-affinity 'auto' # set interfaces ethernet eth3 hw-id '08:00:27:43:70:8c' # set interfaces loopback lo # Using gathered # Before state: # ------------- # vyos@192# run show configuration commands | grep interfaces # set interfaces ethernet eth0 address 'dhcp' # set interfaces ethernet eth0 duplex 'auto' # set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' # set interfaces ethernet eth0 smp_affinity 'auto' # set interfaces ethernet eth0 speed 'auto' # set interfaces ethernet eth1 description 'Configured by Ansible' # set interfaces ethernet eth1 duplex 'auto' # set interfaces ethernet eth1 mtu '1500' # set interfaces ethernet eth1 speed 'auto' # set interfaces ethernet eth1 vif 200 description 'VIF - 200' # set interfaces ethernet eth2 description 'Configured by Ansible' # set interfaces ethernet eth2 duplex 'auto' # set interfaces ethernet eth2 mtu '1500' # set interfaces ethernet eth2 speed 'auto' # set interfaces ethernet eth2 vif 200 description 'VIF - 200' # - name: Gather listed interfaces with provided configurations vyos.vyos.vyos_interfaces: state: gathered # Task output # ----------- # gathered: # - description: Configured by Ansible # duplex: auto # enabled: true # mtu: 1500 # name: eth2 # speed: auto # vifs: # - description: VIF - 200 # enabled: true # vlan_id: 200 # - description: Configured by Ansible # duplex: auto # enabled: true # mtu: 1500 # name: eth1 # speed: auto # vifs: # - description: VIF - 200 # enabled: true # vlan_id: 200 # - duplex: auto # enabled: true # name: eth0 # speed: auto # Using rendered - name: Render the commands for provided configuration vyos.vyos.vyos_interfaces: config: - name: eth0 enabled: true duplex: auto speed: auto - name: eth1 description: Configured by Ansible - Interface 1 mtu: 1500 speed: auto duplex: auto enabled: true vifs: - vlan_id: 100 description: Eth1 - VIF 100 mtu: 400 enabled: true - vlan_id: 101 description: Eth1 - VIF 101 enabled: true - name: eth2 description: Configured by Ansible - Interface 2 (ADMIN DOWN) mtu: 600 enabled: false state: rendered # Task Output # ----------- # rendered: # - set interfaces ethernet eth0 duplex 'auto' # - set interfaces ethernet eth0 speed 'auto' # - delete interfaces ethernet eth0 disable # - set interfaces ethernet eth1 duplex 'auto' # - delete interfaces ethernet eth1 disable # - set interfaces ethernet eth1 speed 'auto' # - set interfaces ethernet eth1 description 'Configured by Ansible - Interface 1' # - set interfaces ethernet eth1 mtu '1500' # - set interfaces ethernet eth1 vif 100 description 'Eth1 - VIF 100' # - set interfaces ethernet eth1 vif 100 mtu '400' # - set interfaces ethernet eth1 vif 101 description 'Eth1 - VIF 101' # - set interfaces ethernet eth2 disable # - set interfaces ethernet eth2 description 'Configured by Ansible - Interface 2 (ADMIN # DOWN)' # - set interfaces ethernet eth2 mtu '600' # Using parsed - name: Parse the configuration. vyos.vyos.vyos_interfaces: running_config: "set interfaces ethernet eth0 address 'dhcp' set interfaces ethernet eth0 duplex 'auto' set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' set interfaces ethernet eth0 smp_affinity 'auto' set interfaces ethernet eth0 speed 'auto' set interfaces ethernet eth1 description 'Configured by Ansible' set interfaces ethernet eth1 duplex 'auto' set interfaces ethernet eth1 mtu '1500' set interfaces ethernet eth1 speed 'auto' set interfaces ethernet eth1 vif 200 description 'VIF - 200' set interfaces ethernet eth2 description 'Configured by Ansible' set interfaces ethernet eth2 duplex 'auto' set interfaces ethernet eth2 mtu '1500' set interfaces ethernet eth2 speed 'auto' set interfaces ethernet eth2 vif 200 description 'VIF - 200'" state: parsed # Task output # ----------- # parsed: # - description: Configured by Ansible # duplex: auto # enabled: true # mtu: 1500 # name: eth2 # speed: auto # vifs: # - description: VIF - 200 # enabled: true # vlan_id: 200 # - description: Configured by Ansible # duplex: auto # enabled: true # mtu: 1500 # name: eth1 # speed: auto # vifs: # - description: VIF - 200 # enabled: true # vlan_id: 200 # - duplex: auto # enabled: true # name: eth0 # speed: auto """ RETURN = """ before: description: The configuration prior to the module execution. returned: when I(state) is C(merged), C(replaced), C(overridden), C(deleted) or C(purged) type: list sample: > This output will always be in the same format as the module argspec. after: description: The resulting configuration after module execution. returned: when changed type: list sample: > This output will always be in the same format as the module argspec. commands: description: The set of commands pushed to the remote device. returned: always type: list sample: - 'set interfaces ethernet eth1 mtu 1200' - 'set interfaces ethernet eth2 vif 100 description VIF 100' rendered: description: The provided configuration in the task rendered in device-native format (offline). returned: when I(state) is C(rendered) type: list sample: - 'set interfaces ethernet eth1 mtu 1200' - 'set interfaces ethernet eth2 vif 100 description VIF 100' gathered: description: Facts about the network resource gathered from the remote device as structured data. returned: when I(state) is C(gathered) type: list sample: > This output will always be in the same format as the module argspec. parsed: description: The device native config provided in I(running_config) option parsed into structured data as per module argspec. returned: when I(state) is C(parsed) type: list sample: > This output will always be in the same format as the module argspec. """ from ansible.module_utils.basic import AnsibleModule from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.interfaces.interfaces import ( InterfacesArgs, ) from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.interfaces.interfaces import ( Interfaces, ) def main(): """ Main entry point for module execution :returns: the result form module invocation """ required_if = [ ("state", "merged", ("config",)), ("state", "replaced", ("config",)), ("state", "rendered", ("config",)), ("state", "overridden", ("config",)), ("state", "parsed", ("running_config",)), ] mutually_exclusive = [("config", "running_config")] module = AnsibleModule( argument_spec=InterfacesArgs.argument_spec, required_if=required_if, supports_check_mode=True, mutually_exclusive=mutually_exclusive, ) result = Interfaces(module).execute_module() module.exit_json(**result) if __name__ == "__main__": main() 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 @@ -1,123 +1,122 @@ --- merged_commands: - set firewall ipv6 name UPLINK default-action 'accept' - set firewall ipv6 name UPLINK description 'This is ipv6 specific rule-set' - set firewall ipv6 name UPLINK rule 1 action 'accept' - set firewall ipv6 name UPLINK rule 1 - set firewall ipv6 name UPLINK rule 1 description 'Fwipv6-Rule 1 is configured by Ansible' - set firewall ipv6 name UPLINK rule 1 protocol 'tcp' - set firewall ipv6 name UPLINK rule 2 action 'accept' - set firewall ipv6 name UPLINK rule 2 - set firewall ipv6 name UPLINK rule 2 description 'Fwipv6-Rule 2 is configured by Ansible' - set firewall ipv6 name UPLINK rule 2 protocol 'tcp' - set firewall ipv4 name INBOUND default-action 'accept' - set firewall ipv4 name INBOUND description 'IPv4 INBOUND rule set' - set firewall ipv4 name INBOUND rule 101 action 'accept' - set firewall ipv4 name INBOUND rule 101 disable - set firewall ipv4 name INBOUND rule 101 - set firewall ipv4 name INBOUND rule 101 description 'Rule 101 is configured by Ansible' - set firewall ipv4 name INBOUND rule 101 protocol 'tcp' - set firewall ipv4 name INBOUND rule 102 action 'reject' - set firewall ipv4 name INBOUND rule 102 disable - set firewall ipv4 name INBOUND rule 102 - set firewall ipv4 name INBOUND rule 102 description 'Rule 102 is configured by Ansible' - set firewall ipv4 name INBOUND rule 102 protocol 'tcp' - set firewall ipv4 name INBOUND rule 103 description 'Rule 103 is configured by Ansible' - set firewall ipv4 name INBOUND rule 103 destination group address-group inbound - set firewall ipv4 name INBOUND rule 103 - set firewall ipv4 name INBOUND rule 103 source address 192.0.2.0 - set firewall ipv4 name INBOUND rule 103 state established - set firewall ipv4 name INBOUND rule 103 state related - set firewall ipv4 name INBOUND rule 103 action 'accept' populate_config: - set firewall group address-group 'inbound' - set firewall ipv6 name UPLINK default-action 'accept' - set firewall ipv6 name UPLINK description 'This is ipv6 specific rule-set' - set firewall ipv6 name UPLINK rule 1 action 'accept' - set firewall ipv6 name UPLINK rule 1 description 'Fwipv6-Rule 1 is configured by Ansible' - set firewall ipv6 name UPLINK rule 1 protocol 'tcp' - set firewall ipv6 name UPLINK rule 2 action 'accept' - set firewall ipv6 name UPLINK rule 2 description 'Fwipv6-Rule 2 is configured by Ansible' - set firewall ipv6 name UPLINK rule 2 protocol 'tcp' - set firewall ipv4 name INBOUND default-action 'accept' - set firewall ipv4 name INBOUND description 'IPv4 INBOUND rule set' - set firewall ipv4 name INBOUND rule 101 action 'accept' - set firewall ipv4 name INBOUND rule 101 description 'Rule 101 is configured by Ansible' - set firewall ipv4 name INBOUND rule 101 protocol 'tcp' - set firewall ipv4 name INBOUND rule 102 action 'reject' - set firewall ipv4 name INBOUND rule 102 description 'Rule 102 is configured by Ansible' - set firewall ipv4 name INBOUND rule 102 protocol 'tcp' - set firewall ipv4 name INBOUND rule 103 action 'accept' - set firewall ipv4 name INBOUND rule 103 description 'Rule 103 is configured by Ansible' - set firewall ipv4 name INBOUND rule 103 destination group address-group 'inbound' - set firewall ipv4 name INBOUND rule 103 source address '192.0.2.0' - set firewall ipv4 name INBOUND rule 103 state established - set firewall ipv4 name INBOUND rule 103 state related remove_config: - delete firewall ipv4 - delete firewall ipv6 parsed_config_file: "_parsed_config_1_4.cfg" replaced_commands: - delete firewall ipv6 name UPLINK rule 1 - delete firewall ipv6 name UPLINK rule 2 - delete firewall ipv4 name INBOUND rule 102 - delete firewall ipv4 name INBOUND rule 103 - set firewall ipv4 name INBOUND rule 104 action 'reject' - set firewall ipv4 name INBOUND rule 104 description 'Rule 104 is configured by Ansible' - set firewall ipv4 name INBOUND rule 104 - set firewall ipv4 name INBOUND rule 104 protocol 'udp' overridden_commands: - delete firewall ipv6 name UPLINK - delete firewall ipv4 name INBOUND - set firewall ipv4 name Downlink default-action 'accept' - set firewall ipv4 name Downlink description 'IPv4 INBOUND rule set' - set firewall ipv4 name Downlink rule 501 action 'accept' - set firewall ipv4 name Downlink rule 501 - set firewall ipv4 name Downlink rule 501 description 'Rule 501 is configured by Ansible' - set firewall ipv4 name Downlink rule 501 protocol 'tcp' - set firewall ipv4 name Downlink rule 502 action 'reject' - set firewall ipv4 name Downlink rule 502 - 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' - set firewall ipv6 name UPLINK description 'This is ipv6 specific rule-set' - set firewall ipv4 name INBOUND default-action 'accept' - set firewall ipv4 name INBOUND description 'IPv4 INBOUND rule set' - set firewall ipv4 name INBOUND rule 101 action 'accept' - set firewall ipv4 name INBOUND rule 101 - set firewall ipv4 name INBOUND rule 101 description 'Rule 101 is configured by Ansible' - set firewall ipv4 name INBOUND rule 101 protocol 'tcp' - set firewall ipv4 name INBOUND rule 102 action 'reject' - set firewall ipv4 name INBOUND rule 102 - set firewall ipv4 name INBOUND rule 102 description 'Rule 102 is configured by Ansible' - set firewall ipv4 name INBOUND rule 102 protocol 'tcp' - set firewall ipv4 name INBOUND rule 103 description 'Rule 103 is configured by Ansible' - set firewall ipv4 name INBOUND rule 103 destination group address-group inbound - set firewall ipv4 name INBOUND rule 103 - set firewall ipv4 name INBOUND rule 103 source address 192.0.2.0 - set firewall ipv4 name INBOUND rule 103 state established - set firewall ipv4 name INBOUND rule 103 state related - set firewall ipv4 name INBOUND rule 103 action 'accept' deleted_rs: commands: - delete firewall ipv6 name UPLINK - delete firewall ipv4 name INBOUND after: [] deleted_afi_all: commands: - delete firewall ipv6 - delete firewall ipv4 after: [] state_dict: established: true related: true 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 @@ -1,58 +1,66 @@ --- - debug: msg: START vyos_interfaces replaced integration tests on connection={{ ansible_connection }} - include_tasks: _populate.yaml - block: - name: Replace device configurations of listed interfaces with provided configurations register: result vyos.vyos.vyos_interfaces: &id001 config: - name: eth1 description: Replaced by Ansible vifs: - vlan_id: 100 description: VIF 100 - Replaced by Ansible - name: eth2 mtu: 1400 description: Replaced by Ansible state: replaced - 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']) - 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']) - 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 vyos.vyos.vyos_interfaces: *id001 - name: Assert that task was idempotent assert: that: - result['changed'] == false - 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 @@ -1,204 +1,173 @@ --- merged: before: - name: eth0 enabled: true speed: auto duplex: auto - name: eth1 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' - set interfaces ethernet eth1 vif 100 description 'Eth1 - VIF 100' - set interfaces ethernet eth1 vif 100 mtu '1404' - set interfaces ethernet eth1 vif 101 description 'Eth1 - VIF 101' - set interfaces ethernet eth2 description 'Configured by Ansible - Interface 2 (ADMIN DOWN)' - set interfaces ethernet eth2 mtu '1406' - set interfaces ethernet eth2 disable after: - - name: lo - enabled: true - name: eth0 enabled: true duplex: auto speed: auto - name: eth1 description: Configured by Ansible - Interface 1 mtu: 1500 enabled: true vifs: - vlan_id: 100 description: Eth1 - VIF 100 mtu: 1404 enabled: true - vlan_id: 101 description: Eth1 - VIF 101 enabled: true - name: eth2 description: Configured by Ansible - Interface 2 (ADMIN DOWN) mtu: 1406 enabled: false populate: - - name: lo - enabled: true - name: eth1 enabled: true description: Configured by Ansible mtu: 1500 vifs: - vlan_id: 200 enabled: true description: VIF - 200 - name: eth2 enabled: true description: Configured by Ansible mtu: 1500 vifs: - vlan_id: 200 enabled: true description: VIF - 200 - name: eth0 enabled: true duplex: auto speed: auto 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 vifs: - 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 speed: auto parsed: after: - name: eth1 description: Configured by Ansible - Interface 1 mtu: 1500 enabled: true vifs: - vlan_id: 100 description: Eth1 - VIF 100 mtu: 1404 enabled: true - vlan_id: 101 description: Eth1 - VIF 101 enabled: true - name: eth2 description: Configured by Ansible - Interface 2 (ADMIN DOWN) mtu: 1406 enabled: false 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' - set interfaces ethernet eth1 mtu '1500' - set interfaces ethernet eth1 vif 100 description 'Eth1 - VIF 100' - set interfaces ethernet eth1 vif 100 mtu '1404' - set interfaces ethernet eth1 vif 101 description 'Eth1 - VIF 101' - set interfaces ethernet eth2 description 'Configured by Ansible - Interface 2 (ADMIN DOWN)' - set interfaces ethernet eth2 mtu '1406' 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 duplex: auto - name: eth1 description: Interface 1 - Description (WILL BE REVERTED) enabled: true mtu: 1412 vifs: - vlan_id: 100 description: Eth1 - VIF 100 (WILL BE REVERTED) mtu: 1404 enabled: true - vlan_id: 101 description: Eth1 - VIF 101 (WILL BE REMOVED) enabled: true - name: eth2 description: Interface 2 (ADMIN DOWN) (WILL BE REVERTED) mtu: 1406 enabled: false 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,124 +1,118 @@ --- merged: before: - - name: lo - name: eth0 ipv4: - address: dhcp - name: eth1 - name: eth2 commands: - set interfaces ethernet eth1 address '192.0.2.10/24' - set interfaces ethernet eth1 address '2001:db8::10/32' - set interfaces ethernet eth2 address '198.51.100.10/24' - 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 - name: eth1 ipv4: - address: 192.0.2.10/24 ipv6: - address: 2001:db8::10/32 - name: eth2 ipv4: - address: 198.51.100.10/24 vifs: - vlan_id: 101 ipv4: - address: 198.51.100.130/25 ipv6: - address: 2001:db8::20/32 populate: - - name: lo - name: eth1 ipv4: - address: 192.0.2.14/24 - name: eth2 ipv4: - address: 192.0.2.10/24 - address: 192.0.2.11/24 ipv6: - address: 2001:db8::10/32 - address: 2001:db8::12/32 - name: eth0 ipv4: - address: dhcp replaced: commands: - delete interfaces ethernet eth2 address '192.0.2.10/24' - delete interfaces ethernet eth2 address '192.0.2.11/24' - delete interfaces ethernet eth2 address '2001:db8::10/32' - delete interfaces ethernet eth2 address '2001:db8::12/32' - set interfaces ethernet eth2 address '2001:db8::11/32' - 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 - name: eth1 ipv4: - address: 192.0.2.19/24 - name: eth0 ipv4: - address: dhcp overridden: commands: - delete interfaces ethernet eth1 address '192.0.2.14/24' - set interfaces ethernet eth1 address '192.0.2.15/24' - delete interfaces ethernet eth2 address '192.0.2.10/24' - delete interfaces ethernet eth2 address '192.0.2.11/24' - 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 - name: eth1 ipv4: - address: 192.0.2.15/24 - name: eth2 parsed: after: - name: eth1 ipv4: - address: 192.0.2.10/24 ipv6: - address: 2001:db8::10/32 - name: eth2 ipv4: - address: 198.51.100.10/24 vifs: - vlan_id: 101 ipv4: - address: 198.51.100.130/25 ipv6: - address: 2001:db8::20/32 rendered: commands: - set interfaces ethernet eth1 address '192.0.2.14/24' - set interfaces ethernet eth2 address '192.0.2.11/24' - set interfaces ethernet eth2 address '192.0.2.10/24' - set interfaces ethernet eth2 address '2001:db8::10/32' - set interfaces ethernet eth2 address '2001:db8::12/32' deleted: commands: - delete interfaces ethernet eth1 address '192.0.2.14/24' - delete interfaces ethernet eth2 address '192.0.2.10/24' - delete interfaces ethernet eth2 address '192.0.2.11/24' - 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 - name: eth1 - name: eth2 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 @@ -1,222 +1,452 @@ # (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 patch from ansible_collections.vyos.vyos.plugins.modules import vyos_interfaces from ansible_collections.vyos.vyos.tests.unit.modules.utils import set_module_args from .vyos_module import TestVyosModule, load_fixture class TestVyosFirewallInterfacesModule(TestVyosModule): module = vyos_interfaces def setUp(self): super(TestVyosFirewallInterfacesModule, self).setUp() self.mock_get_config = patch( "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.get_config", ) self.get_config = self.mock_get_config.start() self.mock_load_config = patch( "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.load_config", ) self.load_config = self.mock_load_config.start() self.mock_get_resource_connection_config = patch( "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.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.mock_execute_show_command = patch( "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos." "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() self.mock_get_resource_connection_config.stop() self.mock_get_resource_connection_facts.stop() self.mock_get_config.stop() self.mock_load_config.stop() self.mock_execute_show_command.stop() 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 def test_vyos_interfaces_merged(self): 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_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( config=[ dict( name="wg02", description="wire guard int 2", enabled=True, ), ], state="merged", ), ) self.execute_module(changed=False, commands=[]) def test_vyos_interfaces_merged_newinterface(self): 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="merged", ), ) 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'", ] self.execute_module(changed=True, commands=commands) def test_vyos_interfaces_replaced_newinterface(self): 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 = [ "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_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( 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", ] 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( config=[ dict( name="eth3", description="Ethernet 3", enabled=False, ), ], state="merged", - ) + ), ) commands = [] self.execute_module(changed=False, commands=commands) def test_vyos_interfaces_idempotent_disable_replace(self): set_module_args( dict( config=[ dict( name="eth3", description="Ethernet 3", enabled=False, ), ], 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)