Add active param to junos declarative modules (#26222)

*  active/deactivate configuration capability
*  integration test refactor
This commit is contained in:
Ganesh Nalawade 2017-06-29 10:18:35 +05:30 committed by GitHub
commit 911a7e085e
13 changed files with 561 additions and 331 deletions

View file

@ -57,7 +57,7 @@ ARGS_DEFAULT_VALUE = {
OPERATION_LOOK_UP = {
'absent': 'delete',
'active': 'active',
'suspend': 'inactive'
'deactivate': 'inactive'
}
@ -289,18 +289,19 @@ def map_obj_to_ele(module, want, top, value_map=None):
ele = SubElement(ele, item)
container = ele
state = module.params.get('state')
active = module.params.get('active')
if active:
oper = 'active'
else:
oper = 'inactive'
# build xml subtree
for obj in want:
oper = None
if container.tag != top_ele[-1]:
node = SubElement(container, top_ele[-1])
else:
node = container
if state and state != 'present':
oper = OPERATION_LOOK_UP.get(state)
for xpath, attributes in obj.items():
for attr in attributes:
tag_only = attr.get('tag_only', False)
@ -309,16 +310,20 @@ def map_obj_to_ele(module, want, top, value_map=None):
is_key = attr.get('is_key', False)
value = attr.get('value')
# operation (delete/active/inactive) is added as element attribute
# only if it is key or tag only or leaf only node
if oper and not (is_key or tag_only or leaf_only):
# operation 'delete' is added as element attribute
# only if it is key or leaf only node
if state == 'absent' and not (is_key or leaf_only):
continue
# for tag only node if value is false continue to next attr
if tag_only and not value:
continue
# convert param value to device specific value
if value_map and xpath in value_map:
value = value_map[xpath].get(value)
if value or tag_only or (leaf_only and value):
if value or tag_only or leaf_only:
ele = node
tags = xpath.split('/')
if value:
@ -328,22 +333,39 @@ def map_obj_to_ele(module, want, top, value_map=None):
ele = SubElement(ele, item)
if tag_only:
if not value:
ele.set('delete', 'delete')
if state == 'present':
if not value:
# if value of tag_only node is false, delete the node
ele.set('delete', 'delete')
elif leaf_only:
if oper:
if state == 'present':
ele.set(oper, oper)
ele.text = value
else:
ele.set('delete', 'delete')
# Add value of leaf node if required while deleting.
# in some cases if value is present while deleting, it
# can result in error, hence the check
if is_value:
ele.text = value
else:
ele.text = value
else:
ele.text = value
if HAS_LXML:
par = ele.getparent()
else:
module.fail_json(msg='lxml is not installed.')
if is_key and oper and not par.attrib.get(oper):
par.set(oper, oper)
if state == 'present':
# set replace attribute at parent node
if not par.attrib.get('replace'):
par.set('replace', 'replace')
# set active/inactive at parent node
if not par.attrib.get(oper):
par.set(oper, oper)
else:
par.set('delete', 'delete')
return root

View file

@ -53,7 +53,12 @@ options:
- Specifies whether or not the configuration is
present in the current devices active running configuration.
default: present
choices: ['present', 'absent', 'active', 'suspend']
choices: ['present', 'absent']
active:
description:
- Specifies whether or not the configuration is active or deactivated
default: True
choices: [True, False]
requirements:
- ncclient (>=v0.5.2)
notes:
@ -79,12 +84,14 @@ EXAMPLES = """
- name: deactivate the motd banner
junos_banner:
banner: motd
state: suspend
state: present
active: False
- name: activate the motd banner
junos_banner:
banner: motd
state: active
state: present
active: True
- name: Configure banner from file
junos_banner:
@ -133,7 +140,8 @@ def main():
argument_spec = dict(
banner=dict(required=True, choices=['login', 'motd']),
text=dict(),
state=dict(default='present', choices=['present', 'absent', 'active', 'suspend'])
state=dict(default='present', choices=['present', 'absent']),
active=dict(default=True, type='bool')
)
argument_spec.update(junos_argument_spec)
@ -156,10 +164,9 @@ def main():
param_to_xpath_map = collections.OrderedDict()
param_to_xpath_map.update({
'text': {'xpath': 'message' if module.params['banner'] == 'login' else 'announcement',
'leaf_only': True}
})
param_to_xpath_map.update([
('text', {'xpath': 'message' if module.params['banner'] == 'login' else 'announcement', 'leaf_only': True})
])
validate_param_values(module, param_to_xpath_map)

View file

@ -43,10 +43,7 @@ options:
- 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
- Interface link status.
speed:
description:
- Interface link speed.
@ -73,9 +70,15 @@ options:
default: no
state:
description:
- State of the Interface configuration.
- State of the Interface configuration, C(up) means present and
operationally up and C(down) means present and operationally C(down)
default: present
choices: ['present', 'absent', 'active', 'suspend']
choices: ['present', 'absent', 'up', 'down']
active:
description:
- Specifies whether or not the configuration is active or deactivated
default: True
choices: [True, False]
requirements:
- ncclient (>=v0.5.2)
notes:
@ -97,24 +100,24 @@ EXAMPLES = """
- name: make interface down
junos_interface:
name: ge-0/0/1
state: present
enabled: False
state: down
- name: make interface up
junos_interface:
name: ge-0/0/1
state: present
enabled: True
state: up
- name: Deactivate interface config
junos_interface:
name: ge-0/0/1
state: suspend
state: present
active: False
- name: Activate interface config
net_interface:
name: ge-0/0/1
state: active
state: present
active: True
- name: Configure interface speed, mtu, duplex
junos_interface:
@ -123,7 +126,6 @@ EXAMPLES = """
speed: 1g
mtu: 256
duplex: full
enabled: True
"""
RETURN = """
@ -172,7 +174,7 @@ def main():
argument_spec = dict(
name=dict(required=True),
description=dict(),
enabled=dict(default=True, type='bool'),
enabled=dict(),
speed=dict(),
mtu=dict(type='int'),
duplex=dict(choices=['full', 'half', 'auto']),
@ -181,7 +183,8 @@ def main():
collection=dict(),
purge=dict(default=False, type='bool'),
state=dict(default='present',
choices=['present', 'absent', 'active', 'suspend'])
choices=['present', 'absent', 'up', 'down']),
active=dict(default=True, type='bool')
)
argument_spec.update(junos_argument_spec)
@ -200,18 +203,26 @@ def main():
top = 'interfaces/interface'
param_to_xpath_map = collections.OrderedDict()
param_to_xpath_map.update({
'name': {'xpath': 'name', 'is_key': True},
'description': 'description',
'speed': 'speed',
'mtu': 'mtu',
'enabled': {'xpath': 'disable', 'tag_only': True},
'duplex': 'link-mode'
})
param_to_xpath_map.update([
('name', {'xpath': 'name', 'is_key': True}),
('description', 'description'),
('speed', 'speed'),
('mtu', 'mtu'),
('duplex', 'link-mode'),
('disable', {'xpath': 'disable', 'tag_only': True})
])
state = module.params.get('state')
module.params['disable'] = True if state == 'down' else False
if state in ('present', 'up', 'down'):
module.params['state'] = 'present'
else:
module.params['disable'] = True
choice_to_value_map = {
'link-mode': {'full': 'full-duplex', 'half': 'half-duplex', 'auto': 'automatic'},
'disable': {True: False, False: True}
'link-mode': {'full': 'full-duplex', 'half': 'half-duplex', 'auto': 'automatic'}
}
validate_param_values(module, param_to_xpath_map)

View file

@ -65,7 +65,12 @@ options:
configuration and when set to I(absent) the values should not be
in the device active configuration
default: present
choices: ['present', 'absent', 'active', 'suspend']
choices: ['present', 'absent']
active:
description:
- Specifies whether or not the configuration is active or deactivated
default: True
choices: [True, False]
requirements:
- ncclient (>=v0.5.2)
notes:
@ -137,8 +142,8 @@ def main():
domain_name=dict(),
domain_search=dict(type='list'),
name_servers=dict(type='list'),
state=dict(choices=['present', 'absent', 'active', 'suspend'], default='present')
state=dict(choices=['present', 'absent'], default='present'),
active=dict(default=True, type='bool')
)
argument_spec.update(junos_argument_spec)
@ -164,12 +169,12 @@ def main():
top = 'system'
param_to_xpath_map = collections.OrderedDict()
param_to_xpath_map.update({
'hostname': {'xpath': 'host-name', 'leaf_only': True},
'domain_name': {'xpath': 'domain-name', 'leaf_only': True},
'domain_search': {'xpath': 'domain-search', 'leaf_only': True, 'value_req': True},
'name_servers': {'xpath': 'name-server/name', 'is_key': True}
})
param_to_xpath_map.update([
('hostname', {'xpath': 'host-name', 'leaf_only': True}),
('domain_name', {'xpath': 'domain-name', 'leaf_only': True}),
('domain_search', {'xpath': 'domain-search', 'leaf_only': True, 'value_req': True}),
('name_servers', {'xpath': 'name-server/name', 'is_key': True})
])
validate_param_values(module, param_to_xpath_map)

View file

@ -59,7 +59,12 @@ options:
description:
- State of the VLAN configuration.
default: present
choices: ['present', 'absent', 'active', 'suspend']
choices: ['present', 'absent']
active:
description:
- Specifies whether or not the configuration is active or deactivated
default: True
choices: [True, False]
requirements:
- ncclient (>=v0.5.2)
notes:
@ -82,12 +87,14 @@ EXAMPLES = """
- name: deactive VLAN configuration
junos_vlan:
vlan_name: test
state: suspend
state: present
active: False
- name: activate VLAN configuration
junos_vlan:
vlan_name: test
state: active
state: present
active: True
"""
RETURN = """
@ -134,8 +141,8 @@ def main():
interfaces=dict(),
collection=dict(),
purge=dict(default=False, type='bool'),
state=dict(default='present',
choices=['present', 'absent', 'active', 'suspend'])
state=dict(default='present', choices=['present', 'absent']),
active=dict(default=True, type='bool')
)
argument_spec.update(junos_argument_spec)
@ -154,11 +161,11 @@ def main():
top = 'vlans/vlan'
param_to_xpath_map = collections.OrderedDict()
param_to_xpath_map.update({
'name': {'xpath': 'name', 'is_key': True},
'vlan_id': 'vlan-id',
'description': 'description'
})
param_to_xpath_map.update([
('name', {'xpath': 'name', 'is_key': True}),
('vlan_id', 'vlan-id'),
('description', 'description')
])
validate_param_values(module, param_to_xpath_map)