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: