Add [junos_lldp_interfaces] model (#59720)

* Add [junos_lldp_interfaces] model

*  Add new resource module junos_lldp_interface
*  Targets model https://github.com/ansible-network/resource_module_models/pull/40
*  Deprecate junos_lldp_interface module

* Fix CI issues
This commit is contained in:
Ganesh Nalawade 2019-08-08 18:23:54 +05:30 committed by GitHub
parent f6ae6eb3e0
commit 6f0aae256d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 971 additions and 6 deletions

View file

@ -11,6 +11,7 @@ CHOICES = [
'interfaces', 'interfaces',
'lag_interfaces', 'lag_interfaces',
'l3_interfaces', 'l3_interfaces',
'lldp_interfaces',
'vlans' 'vlans'
] ]

View file

@ -0,0 +1,45 @@
#
# -*- 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 arg spec for the junos_lldp_interfaces module
"""
from __future__ import absolute_import, division, print_function
__metaclass__ = type
class Lldp_interfacesArgs(object):
"""The arg spec for the junos_lldp_interfaces module
"""
def __init__(self, **kwargs):
pass
argument_spec = {'config': {'elements': 'dict',
'options': {'enable': {'type': 'bool'},
'name': {'required': True, 'type': 'str'}},
'type': 'list'},
'state': {'choices': ['merged', 'replaced', 'deleted', 'overridden'],
'default': 'merged',
'type': 'str'}}

View file

@ -0,0 +1,205 @@
#
# -*- 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)
"""
The junos_lldp_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 ansible.module_utils.network.common.cfg.base import ConfigBase
from ansible.module_utils.network.common.utils import to_list, get_xml_conf_arg
from ansible.module_utils.network.junos.facts.facts import Facts
from ansible.module_utils.network.junos.junos import locked_config, load_config, commit_configuration, discard_changes, tostring
from ansible.module_utils.network.common.netconf import build_root_xml_node, build_child_xml_node, build_subtree
class Lldp_interfaces(ConfigBase):
"""
The junos_lldp_interfaces class
"""
gather_subset = [
'!all',
'!min',
]
gather_network_resources = [
'lldp_interfaces',
]
def __init__(self, module):
super(Lldp_interfaces, self).__init__(module)
def get_lldp_interfaces_facts(self):
""" 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)
lldp_interfaces_facts = facts['ansible_network_resources'].get('lldp_interfaces')
if not lldp_interfaces_facts:
return []
return lldp_interfaces_facts
def execute_module(self):
""" Execute the module
:rtype: A dictionary
:returns: The result from module execution
"""
result = {'changed': False}
warnings = list()
existing_lldp_interfaces_facts = self.get_lldp_interfaces_facts()
config_xmls = self.set_config(existing_lldp_interfaces_facts)
with locked_config(self._module):
for config_xml in to_list(config_xmls):
diff = load_config(self._module, config_xml, warnings)
commit = not self._module.check_mode
if diff:
if commit:
commit_configuration(self._module)
else:
discard_changes(self._module)
result['changed'] = True
if self._module._diff:
result['diff'] = {'prepared': diff}
result['xml'] = config_xmls
changed_lldp_interfaces_facts = self.get_lldp_interfaces_facts()
result['before'] = existing_lldp_interfaces_facts
if result['changed']:
result['after'] = changed_lldp_interfaces_facts
return result
def set_config(self, existing_lldp_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_lldp_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
"""
root = build_root_xml_node('protocols')
lldp_intf_ele = build_subtree(root, 'lldp')
state = self._module.params['state']
if state == 'overridden':
config_xmls = self._state_overridden(want, have)
elif state == 'deleted':
config_xmls = self._state_deleted(want, have)
elif state == 'merged':
config_xmls = self._state_merged(want, have)
elif state == 'replaced':
config_xmls = self._state_replaced(want, have)
for xml in config_xmls:
lldp_intf_ele.append(xml)
return tostring(root)
def _state_replaced(self, want, have):
""" The xml configuration generator when state is replaced
:rtype: A list
:returns: the xml configuration necessary to migrate the current configuration
to the desired configuration
"""
lldp_intf_xml = []
lldp_intf_xml.extend(self._state_deleted(want, have))
lldp_intf_xml.extend(self._state_merged(want, have))
return lldp_intf_xml
def _state_overridden(self, want, have):
""" The xml configuration generator when state is overridden
:rtype: A list
:returns: the xml configuration necessary to migrate the current configuration
to the desired configuration
"""
lldp_intf_xmls_obj = []
# replace interface config with data in want
lldp_intf_xmls_obj.extend(self._state_replaced(want, have))
# delete interface config if interface in have not present in want
delete_obj = []
for have_obj in have:
for want_obj in want:
if have_obj['name'] == want_obj['name']:
break
else:
delete_obj.append(have_obj)
if len(delete_obj):
lldp_intf_xmls_obj.extend(self._state_deleted(delete_obj, have))
return lldp_intf_xmls_obj
def _state_merged(self, want, have):
""" The xml configuration generator when state is merged
:rtype: A list
:returns: the xml configuration necessary to merge the provided into
the current configuration
"""
lldp_intf_xml = []
for config in want:
lldp_intf_root = build_root_xml_node('interface')
if config.get('name'):
build_child_xml_node(lldp_intf_root, 'name', config['name'])
if config.get('enable') is not None:
if config['enable'] is False:
build_child_xml_node(lldp_intf_root, 'disable')
else:
build_child_xml_node(lldp_intf_root, 'disable', None, {'delete': 'delete'})
else:
build_child_xml_node(lldp_intf_root, 'disable', None, {'delete': 'delete'})
lldp_intf_xml.append(lldp_intf_root)
return lldp_intf_xml
def _state_deleted(self, want, have):
""" The xml configuration generator when state is deleted
:rtype: A list
:returns: the xml configuration necessary to remove the current configuration
of the provided objects
"""
lldp_intf_xml = []
intf_obj = want
if not intf_obj:
# delete lldp interfaces attribute from all the existing interface
intf_obj = have
for config in intf_obj:
lldp_intf_root = build_root_xml_node('interface')
lldp_intf_root.attrib.update({'delete': 'delete'})
build_child_xml_node(lldp_intf_root, 'name', config['name'])
lldp_intf_xml.append(lldp_intf_root)
return lldp_intf_xml

View file

@ -15,6 +15,7 @@ from ansible.module_utils.network.junos.facts.legacy.base import Default, Hardwa
from ansible.module_utils.network.junos.facts.interfaces.interfaces import InterfacesFacts from ansible.module_utils.network.junos.facts.interfaces.interfaces import InterfacesFacts
from ansible.module_utils.network.junos.facts.lag_interfaces.lag_interfaces import Lag_interfacesFacts from ansible.module_utils.network.junos.facts.lag_interfaces.lag_interfaces import Lag_interfacesFacts
from ansible.module_utils.network.junos.facts.l3_interfaces.l3_interfaces import L3_interfacesFacts from ansible.module_utils.network.junos.facts.l3_interfaces.l3_interfaces import L3_interfacesFacts
from ansible.module_utils.network.junos.facts.lldp_interfaces.lldp_interfaces import Lldp_interfacesFacts
from ansible.module_utils.network.junos.facts.vlans.vlans import VlansFacts from ansible.module_utils.network.junos.facts.vlans.vlans import VlansFacts
FACT_LEGACY_SUBSETS = dict( FACT_LEGACY_SUBSETS = dict(
@ -27,6 +28,7 @@ FACT_RESOURCE_SUBSETS = dict(
interfaces=InterfacesFacts, interfaces=InterfacesFacts,
lag_interfaces=Lag_interfacesFacts, lag_interfaces=Lag_interfacesFacts,
l3_interfaces=L3_interfacesFacts, l3_interfaces=L3_interfacesFacts,
lldp_interfaces=Lldp_interfacesFacts,
vlans=VlansFacts, vlans=VlansFacts,
) )

View file

@ -0,0 +1,103 @@
#
# -*- 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)
"""
The junos lldp_interfaces fact class
It is in this file the configuration is collected from the device
for a given resource, parsed, and the facts tree is populated
based on the configuration.
"""
from __future__ import absolute_import, division, print_function
__metaclass__ = type
from copy import deepcopy
from ansible.module_utils._text import to_bytes
from ansible.module_utils.network.common import utils
from ansible.module_utils.network.junos.argspec.lldp_interfaces.lldp_interfaces import Lldp_interfacesArgs
from ansible.module_utils.six import string_types
try:
from lxml import etree
HAS_LXML = True
except ImportError:
HAS_LXML = False
class Lldp_interfacesFacts(object):
""" The junos lldp_interfaces fact class
"""
def __init__(self, module, subspec='config', options='options'):
self._module = module
self.argument_spec = Lldp_interfacesArgs.argument_spec
spec = deepcopy(self.argument_spec)
if subspec:
if options:
facts_argument_spec = spec[subspec][options]
else:
facts_argument_spec = spec[subspec]
else:
facts_argument_spec = spec
self.generated_spec = utils.generate_dict(facts_argument_spec)
def populate_facts(self, connection, ansible_facts, data=None):
""" Populate the facts for interfaces
:param connection: the device connection
:param data: previously collected configuration as lxml ElementTree root instance
or valid xml sting
:rtype: dictionary
:returns: facts
"""
if not HAS_LXML:
self._module.fail_json(msg='lxml is not installed.')
if not data:
config_filter = """
<configuration>
<protocols>
<lldp>
<interface>
</interface>
</lldp>
</protocols>
</configuration>
"""
data = connection.get_configuration(filter=config_filter)
if isinstance(data, string_types):
data = etree.fromstring(to_bytes(data, errors='surrogate_then_replace'))
self._resources = data.xpath('configuration/protocols/lldp/interface')
objs = []
for resource in self._resources:
if resource is not None:
obj = self.render_config(self.generated_spec, resource)
if obj:
objs.append(obj)
facts = {}
if objs:
facts['lldp_interfaces'] = []
params = utils.validate_config(self.argument_spec, {'config': objs})
for cfg in params['config']:
facts['lldp_interfaces'].append(utils.remove_empties(cfg))
ansible_facts['ansible_network_resources'].update(facts)
return ansible_facts
def render_config(self, spec, conf):
"""
Render config as dictionary structure and delete keys
from spec for null values
:param spec: The facts tree, generated from the argspec
:param conf: The ElementTree instance of configuration object
:rtype: dictionary
:returns: The generated config
"""
config = deepcopy(spec)
config['name'] = utils.get_xml_conf_arg(conf, 'name')
if utils.get_xml_conf_arg(conf, 'disable', data='tag'):
config['enable'] = False
return utils.remove_empties(config)

View file

@ -9,7 +9,7 @@ __metaclass__ = type
ANSIBLE_METADATA = {'metadata_version': '1.1', ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'], 'status': ['deprecated'],
'supported_by': 'network'} 'supported_by': 'network'}
@ -22,6 +22,10 @@ short_description: Manage LLDP interfaces configuration on Juniper JUNOS network
description: description:
- This module provides declarative management of LLDP interfaces - This module provides declarative management of LLDP interfaces
configuration on Juniper JUNOS network devices. configuration on Juniper JUNOS network devices.
deprecated:
removed_in: "2.13"
why: Updated modules released with more functionality
alternative: Use M(junos_lldp_interfaces) instead.
options: options:
name: name:
description: description:

View file

@ -63,7 +63,7 @@ options:
to a given subset. Possible values for this argument include to a given subset. Possible values for this argument include
all and the resources like interfaces, vlans etc. all and the resources like interfaces, vlans etc.
Can specify a list of values to include a larger subset. Can specify a list of values to include a larger subset.
choices: ['all', 'interfaces', 'lag_interfaces', 'l3_interfaces', 'vlans'] choices: ['all', 'interfaces', 'lag_interfaces', 'l3_interfaces', 'lldp_interfaces', 'vlans']
required: false required: false
version_added: "2.9" version_added: "2.9"
requirements: requirements:

View file

@ -0,0 +1,224 @@
#!/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 junos_lldp_interfaces
"""
from __future__ import absolute_import, division, print_function
__metaclass__ = type
ANSIBLE_METADATA = {
'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'network'
}
DOCUMENTATION = """
---
module: junos_lldp_interfaces
version_added: 2.9
short_description: Manage link layer discovery protocol (LLDP) attributes of interfaces on Juniper JUNOS devices
description:
- This module manages link layer discovery protocol (LLDP) attributes of interfaces on Juniper JUNOS devices.
author: Ganesh Nalawade (@ganeshrn)
options:
config:
description: The list of link layer discovery protocol interface attribute configurations
type: list
elements: dict
suboptions:
name:
description:
- Name of the interface LLDP needs to be configured on.
type: str
required: True
enable:
description:
- This is a boolean value to control disabling of LLDP on the interface C(name)
type: bool
state:
description:
- The state the configuration should be left in.
type: str
choices:
- merged
- replaced
- overridden
- deleted
default: merged
"""
EXAMPLES = """
# Using merged
# Before state:
# -------------
# user@junos01# # show protocols lldp
# management-address 10.1.1.1;
# advertisement-interval 10000;
- name: Merge provided configuration with device configuration
junos_lldp_interfaces:
config:
- name: ge-0/0/1
- name: ge-0/0/2
enable: False
state: merged
# After state:
# -------------
# user@junos01# show protocols lldp
# management-address 10.1.1.1;
# advertisement-interval 10000;
# interface ge-0/0/1;
# interface ge-0/0/2 {
# disable;
# }
# Using replaced
# Before state:
# -------------
# user@junos01# show protocols lldp
# management-address 10.1.1.1;
# advertisement-interval 10000;
# interface ge-0/0/1;
# interface ge-0/0/2 {
# disable;
# }
- name: Replace provided configuration with device configuration
junos_lldp_interfaces:
config:
- name: ge-0/0/2
disable: False
- name: ge-0/0/3
enable: False
state: replaced
# After state:
# -------------
# user@junos01# show protocols lldp
# management-address 10.1.1.1;
# advertisement-interval 10000;
# interface ge-0/0/1;
# interface ge-0/0/2;
# interface ge-0/0/3 {
# disable;
# }
# Using overridden
# Before state:
# -------------
# user@junos01# show protocols lldp
# management-address 10.1.1.1;
# advertisement-interval 10000;
# interface ge-0/0/1;
# interface ge-0/0/2 {
# disable;
# }
- name: Override provided configuration with device configuration
junos_lldp_interfaces:
config:
- name: ge-0/0/2
enable: False
state: overridden
# After state:
# -------------
# user@junos01# show protocols lldp
# management-address 10.1.1.1;
# advertisement-interval 10000;
# interface ge-0/0/2 {
# disable;
# }
# Using deleted
# Before state:
# -------------
# user@junos01# show protocols lldp
# management-address 10.1.1.1;
# advertisement-interval 10000;
# interface ge-0/0/1;
# interface ge-0/0/2;
# interface ge-0/0/3 {
# disable;
# }
- name: Delete lldp interface configuration (this will not delete other lldp configuration)
junos_lldp_interfaces:
config:
- name: ge-0/0/1
- name: ge-0/0/3
state: deleted
# After state:
# -------------
# user@junos01# show protocols lldp
# management-address 10.1.1.1;
# advertisement-interval 10000;
# interface ge-0/0/2;
# interface ge-0/0/1;
"""
RETURN = """
before:
description: The configuration prior to the model invocation.
returned: always
type: list
sample: >
The configuration returned will always be in the same format
of the parameters above.
after:
description: The resulting configuration model invocation.
returned: when changed
type: list
sample: >
The configuration returned will always be in the same format
of the parameters above.
commands:
description: The set of commands pushed to the remote device.
returned: always
type: list
sample: ['xml 1', 'xml 2', 'xml 3']
"""
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.network.junos.argspec.lldp_interfaces.lldp_interfaces import Lldp_interfacesArgs
from ansible.module_utils.network.junos.config.lldp_interfaces.lldp_interfaces import Lldp_interfaces
def main():
"""
Main entry point for module execution
:returns: the result form module invocation
"""
module = AnsibleModule(argument_spec=Lldp_interfacesArgs.argument_spec,
supports_check_mode=True)
result = Lldp_interfaces(module).execute_module()
module.exit_json(**result)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,3 @@
---
testcase: "[^_].*"
test_items: []

View file

@ -0,0 +1,2 @@
dependencies:
- prepare_junos_tests

View file

@ -0,0 +1,2 @@
---
- { include: netconf.yaml, tags: ['netconf'] }

View file

@ -0,0 +1,17 @@
---
- name: collect all netconf test cases
find:
paths: "{{ role_path }}/tests/netconf"
patterns: "{{ testcase }}.yaml"
use_regex: true
connection: local
register: test_cases
- name: set test_items
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
- name: run test case (connection=netconf)
include: "{{ test_case_to_run }} ansible_connection=netconf"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

@ -0,0 +1,11 @@
---
- debug:
msg: "Start junos_lldp_interfaces deleted remove interface config ansible_connection={{ ansible_connection }}"
- name: "Setup - remove lldp interfaces config"
junos_config:
lines:
- delete protocols lldp
- debug:
msg: "End junos_lldp_interfaces deleted remove interface config ansible_connection={{ ansible_connection }}"

View file

@ -0,0 +1,87 @@
---
- debug:
msg: "START junos_lldp_interfaces deleted integration tests on connection={{ ansible_connection }}"
- name: get supported protocols
junos_command:
commands: show lldp
register: result
ignore_errors: yes
- name: lldp supported
set_fact:
lldp_supported: True
when: not result.failed
- name: lldp not supported
set_fact:
lldp_supported: False
when: result.failed
- block:
- include_tasks: _remove_config.yaml
- set_fact:
expected_deleted_output:
- name: ge-0/0/1
- name: Configure initial state for lldp interfaces
junos_lldp_interfaces: &initial
config:
- name: ge-0/0/1
- name: ge-0/0/2
enable: False
state: merged
register: result
- name: Delete the provided lldp interface configuration from running configuration
junos_lldp_interfaces: &deleted
config:
- name: ge-0/0/2
state: deleted
register: result
- name: Assert the configuration is reflected on host
assert:
that:
- "{{ expected_deleted_output | symmetric_difference(result['after']) |length == 0 }}"
- name: Delete the provided lldp interface configuration from running configuration (IDEMPOTENT)
junos_lldp_interfaces: *deleted
register: result
- name: Assert that the previous task was idempotent
assert:
that:
- "result['changed'] == false"
- name: Configure initial state for interface
junos_lldp_interfaces: *initial
register: result
- name: Delete the all lldp interface configuration from running configuration
junos_lldp_interfaces:
state: deleted
register: result
- name: Assert the configuration is reflected on host
assert:
that:
- "{{ result['after'] == []}}"
- name: Delete the all lldp interface configuration from running configuration (IDEMPOTENT)
junos_lldp_interfaces:
state: deleted
register: result
- name: Assert that the previous task was idempotent
assert:
that:
- "result['changed'] == false"
always:
- include_tasks: _remove_config.yaml
when: lldp_supported
- debug:
msg: "END junos_lldp_interfaces deleted integration tests on connection={{ ansible_connection }}"

View file

@ -0,0 +1,58 @@
---
- debug:
msg: "START junos_lldp_interfaces merged integration tests on connection={{ ansible_connection }}"
- name: get supported protocols
junos_command:
commands: show lldp
register: result
ignore_errors: yes
- name: lldp supported
set_fact:
lldp_supported: True
when: not result.failed
- name: lldp not supported
set_fact:
lldp_supported: False
when: result.failed
- block:
- include_tasks: _remove_config.yaml
- set_fact:
expected_merged_output:
- name: ge-0/0/1
- name: ge-0/0/2
enable: False
- name: Merge the provided configuration with the exisiting running configuration
junos_lldp_interfaces: &merged
config:
- name: ge-0/0/1
- name: ge-0/0/2
enable: False
state: merged
register: result
- name: Assert the configuration is reflected on host
assert:
that:
- "{{ expected_merged_output | symmetric_difference(result['after']) |length == 0 }}"
- name: Merge the provided configuration with the existing running configuration (IDEMPOTENT)
junos_lldp_interfaces: *merged
register: result
- name: Assert that the previous task was idempotent
assert:
that:
- "result['changed'] == false"
always:
- include_tasks: _remove_config.yaml
when: lldp_supported
- debug:
msg: "END junos_lldp_interfaces merged integration tests on connection={{ ansible_connection }}"

View file

@ -0,0 +1,63 @@
---
- debug:
msg: "START junos_lldp_interfaces overridden integration tests on connection={{ ansible_connection }}"
- name: get supported protocols
junos_command:
commands: show lldp
register: result
ignore_errors: yes
- name: lldp supported
set_fact:
lldp_supported: True
when: not result.failed
- name: lldp not supported
set_fact:
lldp_supported: False
when: result.failed
- block:
- include_tasks: _remove_config.yaml
- set_fact:
expected_overridden_output:
- name: ge-0/0/2
- name: Configure initial state for interface
junos_lldp_interfaces:
config:
- name: ge-0/0/1
- name: ge-0/0/2
enable: False
state: merged
register: result
- name: Override the provided configuration with the exisiting running configuration
junos_lldp_interfaces: &overridden
config:
- name: ge-0/0/2
state: overridden
register: result
- name: Assert the configuration is reflected on host
assert:
that:
- "{{ expected_overridden_output | symmetric_difference(result['after']) |length == 0 }}"
- name: Override the provided configuration with the existing running configuration (IDEMPOTENT)
junos_lldp_interfaces: *overridden
register: result
- name: Assert that the previous task was idempotent
assert:
that:
- "result['changed'] == false"
always:
- include_tasks: _remove_config.yaml
when: lldp_supported
- debug:
msg: "END junos_lldp_interfaces overridden integration tests on connection={{ ansible_connection }}"

View file

@ -0,0 +1,66 @@
---
- debug:
msg: "START junos_lldp_interfaces replaced integration tests on connection={{ ansible_connection }}"
- name: get supported protocols
junos_command:
commands: show lldp
register: result
ignore_errors: yes
- name: lldp supported
set_fact:
lldp_supported: True
when: not result.failed
- name: lldp not supported
set_fact:
lldp_supported: False
when: result.failed
- block:
- include_tasks: _remove_config.yaml
- set_fact:
expected_replaced_output:
- name: ge-0/0/1
enable: False
- name: ge-0/0/2
enable: False
- name: Configure initial state for interface
junos_lldp_interfaces:
config:
- name: ge-0/0/1
- name: ge-0/0/2
enable: False
register: result
- name: Replace the provided configuration with the exisiting running configuration
junos_lldp_interfaces: &replaced
config:
- name: ge-0/0/1
enable: False
state: replaced
register: result
- name: Assert the configuration is reflected on host
assert:
that:
- "{{ expected_replaced_output | symmetric_difference(result['after']) |length == 0 }}"
- name: Replace the provided configuration with the existing running configuration (IDEMPOTENT)
junos_lldp_interfaces: *replaced
register: result
- name: Assert that the previous task was idempotent
assert:
that:
- "result['changed'] == false"
always:
- include_tasks: _remove_config.yaml
when: lldp_supported
- debug:
msg: "END junos_lldp_interfaces replaced integration tests on connection={{ ansible_connection }}"

View file

@ -0,0 +1,72 @@
---
- debug:
msg: "START junos_lldp_interfaces round trip integration tests on connection={{ ansible_connection }}"
- name: get supported protocols
junos_command:
commands: show lldp
register: result
ignore_errors: yes
- name: lldp supported
set_fact:
lldp_supported: True
when: not result.failed
- name: lldp not supported
set_fact:
lldp_supported: False
when: result.failed
- block:
- include_tasks: _remove_config.yaml
- set_fact:
expected_revert_output:
- name: ge-0/0/1
- name: ge-0/0/2
enable: False
- name: Apply the provided configuration (base config)
junos_lldp_interfaces:
config:
- name: ge-0/0/1
- name: ge-0/0/2
enable: False
state: merged
register: base_config
- name: Gather interfaces facts
junos_facts:
gather_subset:
- default
gather_network_resources:
- lldp_interfaces
- name: Apply the provided configuration (config to be reverted)
junos_lldp_interfaces:
config:
- name: ge-0/0/2
state: overridden
register: result
- name: Assert that changes were applied
assert:
that: "result['changed'] == true"
- name: Revert back to base config using facts round trip
junos_lldp_interfaces:
config: "{{ ansible_facts['network_resources']['lldp_interfaces'] }}"
state: replaced
register: revert
- name: Assert that config was reverted
assert:
that: "{{ expected_revert_output | symmetric_difference(revert['after']) |length == 0 }}"
always:
- include_tasks: _remove_config.yaml
when: lldp_supported
- debug:
msg: "END junos_lldp_interfaces round trip integration tests on connection={{ ansible_connection }}"

View file

@ -4396,16 +4396,16 @@ lib/ansible/modules/network/junos/_junos_l3_interface.py validate-modules:E326
lib/ansible/modules/network/junos/_junos_l3_interface.py validate-modules:E337 lib/ansible/modules/network/junos/_junos_l3_interface.py validate-modules:E337
lib/ansible/modules/network/junos/_junos_l3_interface.py validate-modules:E338 lib/ansible/modules/network/junos/_junos_l3_interface.py validate-modules:E338
lib/ansible/modules/network/junos/_junos_l3_interface.py validate-modules:E340 lib/ansible/modules/network/junos/_junos_l3_interface.py validate-modules:E340
lib/ansible/modules/network/junos/_junos_lldp_interface.py validate-modules:E322
lib/ansible/modules/network/junos/_junos_lldp_interface.py validate-modules:E324
lib/ansible/modules/network/junos/_junos_lldp_interface.py validate-modules:E326
lib/ansible/modules/network/junos/_junos_lldp_interface.py validate-modules:E338
lib/ansible/modules/network/junos/junos_lag_interfaces.py validate-modules:E338 lib/ansible/modules/network/junos/junos_lag_interfaces.py validate-modules:E338
lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E322 lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E322
lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E324 lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E324
lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E326 lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E326
lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E337 lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E337
lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E338 lib/ansible/modules/network/junos/junos_lldp.py validate-modules:E338
lib/ansible/modules/network/junos/junos_lldp_interface.py validate-modules:E322
lib/ansible/modules/network/junos/junos_lldp_interface.py validate-modules:E324
lib/ansible/modules/network/junos/junos_lldp_interface.py validate-modules:E326
lib/ansible/modules/network/junos/junos_lldp_interface.py validate-modules:E338
lib/ansible/modules/network/junos/junos_logging.py validate-modules:E322 lib/ansible/modules/network/junos/junos_logging.py validate-modules:E322
lib/ansible/modules/network/junos/junos_logging.py validate-modules:E324 lib/ansible/modules/network/junos/junos_logging.py validate-modules:E324
lib/ansible/modules/network/junos/junos_logging.py validate-modules:E326 lib/ansible/modules/network/junos/junos_logging.py validate-modules:E326