diff --git a/lib/ansible/modules/network/junos/junos_user.py b/lib/ansible/modules/network/junos/junos_user.py
index d144888cae5..0bd3ce099a1 100644
--- a/lib/ansible/modules/network/junos/junos_user.py
+++ b/lib/ansible/modules/network/junos/junos_user.py
@@ -91,6 +91,12 @@ options:
required: false
default: present
choices: ['present', 'absent']
+ active:
+ description:
+ - Specifies whether or not the configuration is active or deactivated
+ default: True
+ choices: [True, False]
+ version_added: "2.4"
requirements:
- ncclient (>=v0.5.2)
notes:
@@ -160,6 +166,11 @@ def map_obj_to_ele(want):
SubElement(user, 'name').text = item['name']
if operation == 'replace':
+ if item['active']:
+ user.set('active', 'active')
+ else:
+ user.set('inactive', 'inactive')
+
SubElement(user, 'class').text = item['role']
if item.get('full_name'):
@@ -220,7 +231,8 @@ def map_params_to_obj(module):
'full_name': get_value('full_name'),
'role': get_value('role'),
'sshkey': get_value('sshkey'),
- 'state': get_value('state')
+ 'state': get_value('state'),
+ 'active': get_value('active')
})
for key, value in iteritems(item):
@@ -247,7 +259,8 @@ def main():
purge=dict(type='bool'),
- state=dict(choices=['present', 'absent'], default='present')
+ state=dict(choices=['present', 'absent'], default='present'),
+ active=dict(default=True, type='bool')
)
mutually_exclusive = [('users', 'name')]
diff --git a/test/integration/junos.yaml b/test/integration/junos.yaml
index cc825def435..3ae5d4d9bfc 100644
--- a/test/integration/junos.yaml
+++ b/test/integration/junos.yaml
@@ -92,6 +92,13 @@
rescue:
- set_fact: test_failed=true
+ - block:
+ - include_role:
+ name: junos_user
+ when: "limit_to in ['*', 'junos_user']"
+ rescue:
+ - set_fact: test_failed=true
+
###########
- name: Has any previous test failed?
fail:
diff --git a/test/integration/targets/junos_user/defaults/main.yaml b/test/integration/targets/junos_user/defaults/main.yaml
new file mode 100644
index 00000000000..822f2213a44
--- /dev/null
+++ b/test/integration/targets/junos_user/defaults/main.yaml
@@ -0,0 +1,3 @@
+---
+testcase: "*"
+test_cases: []
diff --git a/test/integration/targets/junos_user/tasks/main.yaml b/test/integration/targets/junos_user/tasks/main.yaml
new file mode 100644
index 00000000000..cc27f174fd8
--- /dev/null
+++ b/test/integration/targets/junos_user/tasks/main.yaml
@@ -0,0 +1,2 @@
+---
+- { include: netconf.yaml, tags: ['netconf'] }
diff --git a/test/integration/targets/junos_user/tasks/netconf.yaml b/test/integration/targets/junos_user/tasks/netconf.yaml
new file mode 100644
index 00000000000..bd91bd88cea
--- /dev/null
+++ b/test/integration/targets/junos_user/tasks/netconf.yaml
@@ -0,0 +1,15 @@
+---
+- name: collect netconf test cases
+ find:
+ paths: "{{ role_path }}/tests/netconf"
+ patterns: "{{ testcase }}.yaml"
+ register: test_cases
+
+- 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_user/tests/netconf/basic.yaml b/test/integration/targets/junos_user/tests/netconf/basic.yaml
new file mode 100644
index 00000000000..03275df8ee0
--- /dev/null
+++ b/test/integration/targets/junos_user/tests/netconf/basic.yaml
@@ -0,0 +1,170 @@
+---
+- debug: msg="START junos_user netconf/basic.yaml"
+
+- name: setup - remove user
+ junos_user:
+ name: test_user
+ state: absent
+ provider: "{{ netconf }}"
+
+- name: Create user
+ junos_user:
+ name: test_user
+ state: present
+ full_name: test_user
+ role: operator
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user' in config.xml"
+ - "'test_user' in config.xml"
+ - "'read-only' in config.xml"
+
+- name: Create user again (idempotent)
+ junos_user:
+ name: test_user
+ state: present
+ full_name: test_user
+ role: operator
+ provider: "{{ netconf }}"
+ register: result
+
+- assert:
+ that:
+ - "result.changed == false"
+
+- name: Deactivate user
+ junos_user:
+ name: test_user
+ state: present
+ full_name: test_user
+ role: operator
+ active: False
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'' in config.xml"
+ - "'test_user' in config.xml"
+
+- name: Activate user
+ junos_user:
+ name: test_user
+ state: present
+ full_name: test_user
+ role: operator
+ active: True
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user' in config.xml"
+ - "'test_user' in config.xml"
+ - "'read-only' in config.xml"
+
+- name: Delete user
+ junos_user:
+ name: test_user
+ state: absent
+ full_name: test_user
+ role: operator
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user' not in config.xml"
+ - "'test_user' not in config.xml"
+
+- name: Delete user again (idempotent check)
+ junos_user:
+ name: test_user
+ state: absent
+ full_name: test_user
+ role: operator
+ provider: "{{ netconf }}"
+ register: result
+
+- assert:
+ that:
+ - "result.changed == false"
+
+- name: Teardown list of users
+ junos_user:
+ collection:
+ - {name: test_user1, state: absent}
+ - {name: test_user2, state: absent}
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Create list of users
+ junos_user:
+ collection:
+ - {name: test_user1, full_name: test_user2, role: operator, state: present}
+ - {name: test_user2, full_name: test_user2, role: read-only, state: present}
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user1' in config.xml"
+ - "'test_user2' in config.xml"
+
+- name: Delete list of users
+ junos_user:
+ collection:
+ - {name: test_user1, full_name: test_user2, role: operator, state: absent}
+ - {name: test_user2, full_name: test_user2, role: read-only, state: absent}
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user1' not in config.xml"
+ - "'test_user2' not in config.xml"
diff --git a/test/integration/targets/net_user/tasks/main.yaml b/test/integration/targets/net_user/tasks/main.yaml
index 415c99d8b12..af08869c922 100644
--- a/test/integration/targets/net_user/tasks/main.yaml
+++ b/test/integration/targets/net_user/tasks/main.yaml
@@ -1,2 +1,3 @@
---
- { include: cli.yaml, tags: ['cli'] }
+- { include: netconf.yaml, tags: ['netconf'] }
diff --git a/test/integration/targets/net_user/tasks/netconf.yaml b/test/integration/targets/net_user/tasks/netconf.yaml
new file mode 100644
index 00000000000..1286b354228
--- /dev/null
+++ b/test/integration/targets/net_user/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_user/tests/junos/basic.yaml b/test/integration/targets/net_user/tests/junos/basic.yaml
new file mode 100644
index 00000000000..2d1fdbb99f8
--- /dev/null
+++ b/test/integration/targets/net_user/tests/junos/basic.yaml
@@ -0,0 +1,120 @@
+---
+- debug: msg="START net_user junos/basic.yaml"
+
+- name: setup - remove user
+ net_user:
+ name: test_user
+ state: absent
+ provider: "{{ netconf }}"
+
+- name: Create user
+ net_user:
+ name: test_user
+ state: present
+ role: operator
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user' in config.xml"
+ - "'read-only' in config.xml"
+
+- name: Create user again (idempotent)
+ net_user:
+ name: test_user
+ state: present
+ role: operator
+ provider: "{{ netconf }}"
+ register: result
+
+- assert:
+ that:
+ - "result.changed == false"
+
+- name: Delete user
+ net_user:
+ name: test_user
+ state: absent
+ role: operator
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user' not in config.xml"
+ - "'test_user' not in config.xml"
+
+- name: Delete user again (idempotent check)
+ net_user:
+ name: test_user
+ state: absent
+ role: operator
+ provider: "{{ netconf }}"
+ register: result
+
+- assert:
+ that:
+ - "result.changed == false"
+
+- name: Teardown list of users
+ net_user:
+ collection:
+ - {name: test_user1, state: absent}
+ - {name: test_user2, state: absent}
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Create list of users
+ net_user:
+ collection:
+ - {name: test_user1, role: operator, state: present}
+ - {name: test_user2, role: read-only, state: present}
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user1' in config.xml"
+ - "'test_user2' in config.xml"
+
+- name: Delete list of users
+ net_user:
+ collection:
+ - {name: test_user1, role: operator, state: absent}
+ - {name: test_user2, role: read-only, state: absent}
+ provider: "{{ netconf }}"
+ register: result
+
+- name: Get running configuration
+ junos_rpc:
+ rpc: get-configuration
+ provider: "{{ netconf }}"
+ register: config
+
+- assert:
+ that:
+ - "result.changed == true"
+ - "'test_user1' not in config.xml"
+ - "'test_user2' not in config.xml"
diff --git a/test/integration/targets/net_user/tests/netconf/basic.yaml b/test/integration/targets/net_user/tests/netconf/basic.yaml
new file mode 100644
index 00000000000..5ff7cf5af8e
--- /dev/null
+++ b/test/integration/targets/net_user/tests/netconf/basic.yaml
@@ -0,0 +1,3 @@
+---
+- include: "{{ role_path }}/tests/junos/basic.yaml"
+ when: hostvars[inventory_hostname]['ansible_network_os'] == 'junos'