diff --git a/lib/ansible/module_utils/junos.py b/lib/ansible/module_utils/junos.py index 7bee49cf715..e160c05c858 100644 --- a/lib/ansible/module_utils/junos.py +++ b/lib/ansible/module_utils/junos.py @@ -216,15 +216,23 @@ def get_param(module, key): return module.params[key] or module.params['provider'].get(key) -def map_params_to_obj(module, param_xpath_map): +def map_params_to_obj(module, param_to_xpath_map): obj = collections.OrderedDict() - for key, value in param_xpath_map.items(): + for key, attrib in param_to_xpath_map.items(): if key in module.params: - obj.update({value: module.params[key]}) - return [obj] + if isinstance(attrib, dict): + xpath = attrib.get('xpath') + del attrib['xpath'] + + attrib.update({'value': module.params[key]}) + obj.update({xpath: attrib}) + else: + xpath = attrib + obj.update({xpath: {'value': module.params[key]}}) + return obj -def map_obj_to_ele(module, want, top): +def map_obj_to_ele(module, want, top, value_map=None): top_ele = top.split('/') root = Element(top_ele[0]) ele = root @@ -244,14 +252,26 @@ def map_obj_to_ele(module, want, top): elif state == 'suspend': node.set('inactive', 'inactive') - for key, value in obj.items(): - if value: + for xpath, attrib in obj.items(): + tag_only = attrib.get('tag_only', False) + value = attrib.get('value') + + if value_map and xpath in value_map: + value = value_map[xpath].get(value) + + if value or tag_only: ele = node - tags = key.split('/') + tags = xpath.split('/') + for item in tags: ele = SubElement(ele, item) - ele.text = to_text(value, errors='surrogate_then_replace') + if tag_only: + if not value: + ele.set('delete', 'delete') + else: + ele.text = to_text(value, errors='surrogate_then_replace') + if state != 'present': break diff --git a/lib/ansible/modules/network/junos/junos_interface.py b/lib/ansible/modules/network/junos/junos_interface.py new file mode 100644 index 00000000000..224c9375a90 --- /dev/null +++ b/lib/ansible/modules/network/junos/junos_interface.py @@ -0,0 +1,231 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2017, Ansible by Red Hat, inc +# +# This file is part of Ansible by Red Hat +# +# 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 . +# + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['preview'], + 'supported_by': 'core'} + + +DOCUMENTATION = """ +--- +module: junos_interface +version_added: "2.4" +author: "Ganesh Nalawade (@ganeshrn)" +short_description: Manage Interface on Juniper JUNOS network devices +description: + - This module provides declarative management of Interfaces + on Juniper JUNOS network devices. +options: + name: + description: + - Name of the Interface. + required: true + description: + description: + - Description of Interface. + enabled: + description: + - Configure operational status of the interface link. + If value is I(yes/true), interface is configured in up state. + For I(no/false) interface is configured in down state. + default: yes + speed: + description: + - Interface link speed. + mtu: + description: + - Maximum size of transmit packet. + duplex: + description: + - Interface link status. + default: auto + choices: ['full', 'half', 'auto'] + tx_rate: + description: + - Transmit rate. + rx_rate: + description: + - Receiver rate. + collection: + description: List of Interfaces definitions. + purge: + description: + - Purge Interfaces not defined in the collections parameter. + This applies only for logical interface. + default: no + state: + description: + - State of the Interface configuration. + default: present + choices: ['present', 'absent', 'active', 'suspend'] +""" + +EXAMPLES = """ +- name: configure interface + junos_interface: + name: ge-0/0/1 + description: test-interface + +- name: remove interface + junos_interface: + name: ge-0/0/1 + state: absent + +- name: make interface down + junos_interface: + name: ge-0/0/1 + state: present + enabled: False + +- name: make interface up + junos_interface: + name: ge-0/0/1 + state: present + enabled: True + +- name: Deactivate interface config + junos_interface: + name: ge-0/0/1 + state: suspend + +- name: Activate interface config + net_interface: + name: ge-0/0/1 + state: active + +- name: Configure interface speed, mtu, duplex + junos_interface: + name: ge-0/0/1 + state: present + speed: 1g + mtu: 256 + duplex: full + enabled: True +""" + +RETURN = """ +rpc: + description: load-configuration RPC send to the device + returned: when configuration is changed on device + type: string + sample: > + + + ge-0/0/0 + test interface + + +""" +import collections + +from xml.etree.ElementTree import tostring + +from ansible.module_utils.junos import junos_argument_spec, check_args +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.junos import load_config, map_params_to_obj, map_obj_to_ele + +USE_PERSISTENT_CONNECTION = True + + +def validate_mtu(value, module): + if value and not 256 <= value <= 9192: + module.fail_json(msg='mtu must be between 256 and 9192') + + +def validate_param_values(module, obj): + for key in obj: + # validate the param value (if validator func exists) + validator = globals().get('validate_%s' % key) + if callable(validator): + validator(module.params.get(key), module) + + +def main(): + """ main entry point for module execution + """ + argument_spec = dict( + name=dict(required=True), + description=dict(), + enabled=dict(default=True, type='bool'), + speed=dict(), + mtu=dict(type='int'), + duplex=dict(choices=['full', 'half', 'auto']), + tx_rate=dict(), + rx_rate=dict(), + collection=dict(), + purge=dict(default=False, type='bool'), + state=dict(default='present', + choices=['present', 'absent', 'active', 'suspend']) + ) + + argument_spec.update(junos_argument_spec) + + module = AnsibleModule(argument_spec=argument_spec, + supports_check_mode=True) + + warnings = list() + check_args(module, warnings) + + result = {'changed': False} + + if warnings: + result['warnings'] = warnings + + top = 'interfaces/interface' + + param_to_xpath_map = collections.OrderedDict() + param_to_xpath_map.update({ + 'name': 'name', + 'description': 'description', + 'speed': 'speed', + 'mtu': 'mtu', + 'enabled': {'xpath': 'disable', 'tag_only': True}, + 'duplex': 'link-mode' + }) + + choice_to_value_map = { + 'link-mode': {'full': 'full-duplex', 'half': 'half-duplex', 'auto': 'automatic'}, + 'disable': {True: False, False: True} + } + + validate_param_values(module, param_to_xpath_map) + + want = list() + want.append(map_params_to_obj(module, param_to_xpath_map)) + + ele = map_obj_to_ele(module, want, top, choice_to_value_map) + + kwargs = {'commit': not module.check_mode} + kwargs['action'] = 'replace' + + diff = load_config(module, tostring(ele), warnings, **kwargs) + + if diff: + result.update({ + 'changed': True, + 'diff': {'prepared': diff}, + 'rpc': tostring(ele) + }) + + module.exit_json(**result) + +if __name__ == "__main__": + main() diff --git a/lib/ansible/modules/network/junos/junos_vlan.py b/lib/ansible/modules/network/junos/junos_vlan.py index 8bf70f0ed9b..0763a24b6a7 100644 --- a/lib/ansible/modules/network/junos/junos_vlan.py +++ b/lib/ansible/modules/network/junos/junos_vlan.py @@ -50,7 +50,7 @@ options: - List of interfaces to check the VLAN has been configured correctly. collection: - description: List of VLANs definitions + description: List of VLANs definitions. purge: description: - Purge VLANs not defined in the collections parameter. @@ -63,6 +63,26 @@ options: """ EXAMPLES = """ +- name: configure VLAN ID and name + junos_vlan: + vlan_name: test + vlan_id: 20 + name: test-vlan + +- name: remove VLAN configuration + junos_vlan: + vlan_name: test + state: absent + +- name: deactive VLAN configuration + junos_vlan: + vlan_name: test + state: suspend + +- name: activate VLAN configuration + junos_vlan: + vlan_name: test + state: active """ RETURN = """ @@ -125,16 +145,17 @@ def main(): top = 'vlans/vlan' - param_xpath_map = collections.OrderedDict() - param_xpath_map.update({ + param_to_xpath_map = collections.OrderedDict() + param_to_xpath_map.update({ 'name': 'name', 'vlan_id': 'vlan-id', 'description': 'description' }) - validate_param_values(module, param_xpath_map) + validate_param_values(module, param_to_xpath_map) - want = map_params_to_obj(module, param_xpath_map) + want = list() + want.append(map_params_to_obj(module, param_to_xpath_map)) ele = map_obj_to_ele(module, want, top) kwargs = {'commit': not module.check_mode} diff --git a/lib/ansible/modules/network/net_interface.py b/lib/ansible/modules/network/net_interface.py new file mode 100644 index 00000000000..19e304e9e9f --- /dev/null +++ b/lib/ansible/modules/network/net_interface.py @@ -0,0 +1,128 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2017, Ansible by Red Hat, inc +# +# This file is part of Ansible by Red Hat +# +# 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 . +# + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['preview'], + 'supported_by': 'core'} + + +DOCUMENTATION = """ +--- +module: net_interface +version_added: "2.4" +author: "Ganesh Nalawade (@ganeshrn)" +short_description: Manage Interface on network devices +description: + - This module provides declarative management of Interfaces + on network devices. +options: + name: + description: + - Name of the Interface. + required: true + description: + description: + - Description of Interface. + enabled: + description: + - Configure operational status of the interface link. + If value is I(yes) interface is configured in up state, + for I(no) interface is configured in down state. + default: yes + speed: + description: + - Interface link speed. + mtu: + description: + - Maximum size of transmit packet. + duplex: + description: + - Interface link status + default: auto + choices: ['full', 'half', 'auto'] + tx_rate: + description: + - Transmit rate + rx_rate: + description: + - Receiver rate + collection: + description: List of Interfaces definitions. + purge: + description: + - Purge Interfaces not defined in the collections parameter. + This applies only for logical interface. + default: no + state: + description: + - State of the Interface configuration. + default: present + choices: ['present', 'absent'] +""" + +EXAMPLES = """ +- name: configure interface + net_interface: + name: ge-0/0/1 + description: test-interface + +- name: remove interface + net_interface: + name: ge-0/0/1 + state: absent + +- name: make interface up + net_interface: + name: ge-0/0/1 + description: test-interface + state: present + enabled: True + +- name: make interface down + net_interface: + name: ge-0/0/1 + description: test-interface + state: present + enabled: False +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device. + returned: always + type: list + sample: + - interface 20 + - name test-interface +rpc: + description: load-configuration RPC send to the device + returned: C(rpc) is returned only for junos device + when configuration is changed on device + type: string + sample: > + + + ge-0/0/0 + test interface + + + +""" diff --git a/lib/ansible/modules/network/net_vlan.py b/lib/ansible/modules/network/net_vlan.py index 3ab0061f7be..52217ec6312 100644 --- a/lib/ansible/modules/network/net_vlan.py +++ b/lib/ansible/modules/network/net_vlan.py @@ -44,7 +44,7 @@ options: description: - List of interfaces the VLAN should be configured on. collection: - description: List of VLANs definitions + description: List of VLANs definitions. purge: description: - Purge VLANs not defined in the collections parameter. @@ -81,4 +81,10 @@ commands: sample: - vlan 20 - name test-vlan +rpc: + description: load-configuration RPC send to the device + returned: C(rpc) is returned only for junos device + when configuration is changed on device + type: string + sample: "test-vlan-4" """ diff --git a/lib/ansible/plugins/action/net_interface.py b/lib/ansible/plugins/action/net_interface.py new file mode 100644 index 00000000000..a4ee4db0b6e --- /dev/null +++ b/lib/ansible/plugins/action/net_interface.py @@ -0,0 +1,26 @@ +# (c) 2017, Ansible 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 . +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.plugins.action.net_base import ActionModule as _ActionModule + + +class ActionModule(_ActionModule): + def run(self, tmp=None, task_vars=None): + result = super(ActionModule, self).run(tmp, task_vars) + return result diff --git a/test/integration/junos.yaml b/test/integration/junos.yaml index 6be7274cb59..6cf8e7135f5 100644 --- a/test/integration/junos.yaml +++ b/test/integration/junos.yaml @@ -15,3 +15,4 @@ - { role: junos_rpc, when: "limit_to in ['*', 'junos_rpc']" } - { role: junos_template, when: "limit_to in ['*', 'junos_template']" } - { role: junos_vlan, when: "limit_to in ['*', 'junos_vlan']" } + - { role: junos_interface, when: "limit_to in ['*', 'junos_interface']" } diff --git a/test/integration/platform_agnostic.yaml b/test/integration/platform_agnostic.yaml index 57613e580c3..e993fea92c3 100644 --- a/test/integration/platform_agnostic.yaml +++ b/test/integration/platform_agnostic.yaml @@ -14,3 +14,4 @@ - { role: net_user, when: "limit_to in ['*', 'net_user']" } - { role: net_vlan, when: "limit_to in ['*', 'net_vlan']" } - { role: net_vrf, when: "limit_to in ['*', 'net_vrf']" } + - { role: net_interface, when: "limit_to in ['*', 'net_interface']" } diff --git a/test/integration/targets/junos_interface/aliases b/test/integration/targets/junos_interface/aliases new file mode 100644 index 00000000000..93151a8d9df --- /dev/null +++ b/test/integration/targets/junos_interface/aliases @@ -0,0 +1 @@ +network/ci diff --git a/test/integration/targets/junos_interface/defaults/main.yaml b/test/integration/targets/junos_interface/defaults/main.yaml new file mode 100644 index 00000000000..5f709c5aac1 --- /dev/null +++ b/test/integration/targets/junos_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: "*" diff --git a/test/integration/targets/junos_interface/tasks/main.yaml b/test/integration/targets/junos_interface/tasks/main.yaml new file mode 100644 index 00000000000..cc27f174fd8 --- /dev/null +++ b/test/integration/targets/junos_interface/tasks/main.yaml @@ -0,0 +1,2 @@ +--- +- { include: netconf.yaml, tags: ['netconf'] } diff --git a/test/integration/targets/junos_interface/tasks/netconf.yaml b/test/integration/targets/junos_interface/tasks/netconf.yaml new file mode 100644 index 00000000000..1286b354228 --- /dev/null +++ b/test/integration/targets/junos_interface/tasks/netconf.yaml @@ -0,0 +1,16 @@ +--- +- name: collect all netconf test cases + find: + paths: "{{ role_path }}/tests/netconf" + patterns: "{{ testcase }}.yaml" + register: test_cases + delegate_to: localhost + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test case + include: "{{ test_case_to_run }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/test/integration/targets/junos_interface/tests/netconf/basic.yaml b/test/integration/targets/junos_interface/tests/netconf/basic.yaml new file mode 100644 index 00000000000..306183a8be1 --- /dev/null +++ b/test/integration/targets/junos_interface/tests/netconf/basic.yaml @@ -0,0 +1,130 @@ +--- +- debug: msg="START junos_interface netconf/basic.yaml" + +- name: setup - remove interface + junos_interface: + name: ge-0/0/1 + description: test-interface + state: absent + provider: "{{ netconf }}" + +- name: Create interface + junos_interface: + name: ge-0/0/1 + description: test-interface + state: present + provider: "{{ netconf }}" + register: result + +- debug: + msg: "{{ result }}" + +- assert: + that: + - "result.changed == true" + - "'ge-0/0/1' in result.rpc" + - "'test-interface' in result.rpc" + +- name: Create interface (idempotent) + junos_interface: + name: ge-0/0/1 + description: test-interface + state: present + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == false" + +- name: Deactivate interface configuration + junos_interface: + name: ge-0/0/1 + description: test-interface + state: suspend + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'' in result.rpc" + - "'ge-0/0/1' in result.rpc" + +- name: Activate interface configuration + junos_interface: + name: ge-0/0/1 + description: test-interface + state: active + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'' in result.rpc" + - "'ge-0/0/1' in result.rpc" + +- name: Configure interface attributes + junos_interface: + name: ge-0/0/1 + description: test-interface + state: present + speed: 1g + mtu: 256 + duplex: full + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'ge-0/0/1' in result.rpc" + - "'full-duplex' in result.rpc" + - "'256' in result.rpc" + - "'1g' in result.rpc" + - "'test-interface' in result.rpc" + +- name: Disable interface + junos_interface: + name: ge-0/0/1 + description: test-interface + state: present + enabled: False + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'' in result.rpc" + - "'ge-0/0/1' in result.rpc" + +- name: Enable interface + junos_interface: + name: ge-0/0/1 + description: test-interface + state: present + enabled: True + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'' in result.rpc" + - "'ge-0/0/1' in result.rpc" + +- name: Delete interface + junos_interface: + name: ge-0/0/1 + description: test-interface + state: absent + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'' in result.rpc" + - "'ge-0/0/1' in result.rpc" diff --git a/test/integration/targets/net_interface/aliases b/test/integration/targets/net_interface/aliases new file mode 100644 index 00000000000..93151a8d9df --- /dev/null +++ b/test/integration/targets/net_interface/aliases @@ -0,0 +1 @@ +network/ci diff --git a/test/integration/targets/net_interface/defaults/main.yaml b/test/integration/targets/net_interface/defaults/main.yaml new file mode 100644 index 00000000000..5f709c5aac1 --- /dev/null +++ b/test/integration/targets/net_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: "*" diff --git a/test/integration/targets/net_interface/tasks/cli.yaml b/test/integration/targets/net_interface/tasks/cli.yaml new file mode 100644 index 00000000000..46d86dd6988 --- /dev/null +++ b/test/integration/targets/net_interface/tasks/cli.yaml @@ -0,0 +1,16 @@ +--- +- name: collect all cli test cases + find: + paths: "{{ role_path }}/tests/cli" + patterns: "{{ testcase }}.yaml" + register: test_cases + delegate_to: localhost + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test case + include: "{{ test_case_to_run }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/test/integration/targets/net_interface/tasks/main.yaml b/test/integration/targets/net_interface/tasks/main.yaml new file mode 100644 index 00000000000..af08869c922 --- /dev/null +++ b/test/integration/targets/net_interface/tasks/main.yaml @@ -0,0 +1,3 @@ +--- +- { include: cli.yaml, tags: ['cli'] } +- { include: netconf.yaml, tags: ['netconf'] } diff --git a/test/integration/targets/net_interface/tasks/netconf.yaml b/test/integration/targets/net_interface/tasks/netconf.yaml new file mode 100644 index 00000000000..1286b354228 --- /dev/null +++ b/test/integration/targets/net_interface/tasks/netconf.yaml @@ -0,0 +1,16 @@ +--- +- name: collect all netconf test cases + find: + paths: "{{ role_path }}/tests/netconf" + patterns: "{{ testcase }}.yaml" + register: test_cases + delegate_to: localhost + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test case + include: "{{ test_case_to_run }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/test/integration/targets/net_interface/tests/cli/basic.yaml b/test/integration/targets/net_interface/tests/cli/basic.yaml new file mode 100644 index 00000000000..b1bec77f7ca --- /dev/null +++ b/test/integration/targets/net_interface/tests/cli/basic.yaml @@ -0,0 +1,4 @@ +--- + +- include: "{{ role_path }}/tests/eos/basic.yaml" + when: hostvars[inventory_hostname]['ansible_network_os'] == 'eos' diff --git a/test/integration/targets/net_interface/tests/eos/basic.yaml b/test/integration/targets/net_interface/tests/eos/basic.yaml new file mode 100644 index 00000000000..a58390e16ca --- /dev/null +++ b/test/integration/targets/net_interface/tests/eos/basic.yaml @@ -0,0 +1,2 @@ +--- +- debug: msg="START net_interface eos/basic.yaml" \ No newline at end of file diff --git a/test/integration/targets/net_interface/tests/junos/basic.yaml b/test/integration/targets/net_interface/tests/junos/basic.yaml new file mode 100644 index 00000000000..e36555028b7 --- /dev/null +++ b/test/integration/targets/net_interface/tests/junos/basic.yaml @@ -0,0 +1,102 @@ +--- +- debug: msg="START net_interface junos/basic.yaml" + +- name: setup - remove interface + net_interface: + name: ge-0/0/1 + description: test-interface + state: absent + provider: "{{ netconf }}" + +- name: Create interface + net_interface: + name: ge-0/0/1 + description: test-interface + state: present + provider: "{{ netconf }}" + register: result + +- debug: + msg: "{{ result }}" + +- assert: + that: + - "result.changed == true" + - "'ge-0/0/1' in result.rpc" + - "'test-interface' in result.rpc" + +- name: Create interface (idempotent) + net_interface: + name: ge-0/0/1 + description: test-interface + state: present + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == false" + +- name: Configure interface attributes + net_interface: + name: ge-0/0/1 + description: test-interface + state: present + speed: 1g + mtu: 256 + duplex: full + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'ge-0/0/1' in result.rpc" + - "'full-duplex' in result.rpc" + - "'256' in result.rpc" + - "'1g' in result.rpc" + - "'test-interface' in result.rpc" + +- name: Disable interface + net_interface: + name: ge-0/0/1 + description: test-interface + state: present + enabled: False + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'' in result.rpc" + - "'ge-0/0/1' in result.rpc" + +- name: Enable interface + net_interface: + name: ge-0/0/1 + description: test-interface + state: present + enabled: True + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'' in result.rpc" + - "'ge-0/0/1' in result.rpc" + +- name: Delete interface + net_interface: + name: ge-0/0/1 + description: test-interface + state: absent + provider: "{{ netconf }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'' in result.rpc" + - "'ge-0/0/1' in result.rpc" diff --git a/test/integration/targets/net_interface/tests/netconf/basic.yaml b/test/integration/targets/net_interface/tests/netconf/basic.yaml new file mode 100644 index 00000000000..5ff7cf5af8e --- /dev/null +++ b/test/integration/targets/net_interface/tests/netconf/basic.yaml @@ -0,0 +1,3 @@ +--- +- include: "{{ role_path }}/tests/junos/basic.yaml" + when: hostvars[inventory_hostname]['ansible_network_os'] == 'junos' diff --git a/test/integration/targets/net_vlan/tests/eos/basic.yaml b/test/integration/targets/net_vlan/tests/eos/basic.yaml index 42442c5f5ce..9b7b4740665 100644 --- a/test/integration/targets/net_vlan/tests/eos/basic.yaml +++ b/test/integration/targets/net_vlan/tests/eos/basic.yaml @@ -1,4 +1,5 @@ --- +- debug: msg="START net_vlan eos/basic.yaml" - name: setup - remove vlan eos_vlan: diff --git a/test/integration/targets/net_vlan/tests/junos/basic.yaml b/test/integration/targets/net_vlan/tests/junos/basic.yaml index 13be53911c1..10646a68c95 100644 --- a/test/integration/targets/net_vlan/tests/junos/basic.yaml +++ b/test/integration/targets/net_vlan/tests/junos/basic.yaml @@ -1,5 +1,5 @@ --- -- debug: msg="START net_vlan netconf/basic.yaml" +- debug: msg="START net_vlan junos/basic.yaml" - name: setup - remove vlan net_vlan: