vyos_lldp_global (#59627)

* vyos_lldp_global

Signed-off-by: rohitthakur2590 <rohitthakur2590@outlook.com>

* sanity checks

Signed-off-by: rohitthakur2590 <rohitthakur2590@outlook.com>

* deprecated changes

Signed-off-by: rohitthakur2590 <rohitthakur2590@outlook.com>

* comments incorporated

Signed-off-by: rohitthakur2590 <rohitthakur2590@outlook.com>

* test cases updated

Signed-off-by: rohitthakur2590 <rohitthakur2590@outlook.com>

* comments incorporated

Signed-off-by: rohitthakur2590 <rohitthakur2590@outlook.com>

* branch conflict resolved

Signed-off-by: rohitthakur2590 <rohitthakur2590@outlook.com>

* sanity check passes

Signed-off-by: rohitthakur2590 <rohitthakur2590@outlook.com>
This commit is contained in:
Rohit 2019-08-19 17:31:09 +05:30 committed by GitHub
parent b55a54469c
commit d8f9904f43
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 1083 additions and 30 deletions

View file

@ -96,6 +96,8 @@ The following modules will be removed in Ansible 2.13. Please update update your
* vyos_linkagg use :ref:`vyos_lag_interfaces <vyos_lag_interfaces_module>` instead.
* vyos_lldp use :ref:`vyos_lldp_global <vyos_lldp_global_module>` instead.
The following functionality will be removed in Ansible 2.12. Please update update your playbooks accordingly.
* ``vmware_cluster`` DRS, HA and VSAN configuration; use :ref:`vmware_cluster_drs <vmware_cluster_drs_module>`, :ref:`vmware_cluster_ha <vmware_cluster_ha_module>` and :ref:`vmware_cluster_vsan <vmware_cluster_vsan_module>` instead.

View file

@ -22,7 +22,9 @@ class FactsArgs(object): # pylint: disable=R0903
'l3_interfaces',
'!l3_interfaces',
'lag_interfaces',
'!lag_interfaces'
'!lag_interfaces',
'lldp_global',
'!lldp_global'
]
argument_spec = {

View file

@ -0,0 +1,61 @@
# 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 vyos_lldp_global module
"""
from __future__ import absolute_import, division, print_function
__metaclass__ = type
class Lldp_globalArgs(object): # pylint: disable=R0903
"""The arg spec for the vyos_lldp_global module
"""
def __init__(self, **kwargs):
pass
argument_spec = {
'config': {
'options': {
'address': {
'type': 'str'
},
'enable': {
'type': 'bool'
},
'legacy_protocols': {
'choices': ['cdp', 'edp', 'fdp', 'sonmp'],
'type': 'list'
},
'snmp': {
'type': 'str'
}
},
'type': 'dict'
},
'state': {
'choices': ['merged', 'replaced', 'deleted'],
'default': 'merged',
'type': 'str'
}
} # pylint: disable=C0301

View file

@ -0,0 +1,238 @@
# Copyright 2019 Red Hat
# GNU General Public License v3.0+
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
"""
The vyos_lldp_global 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, dict_diff
from ansible.module_utils.network.vyos.facts.facts import Facts
from ansible.module_utils.six import iteritems
from ansible.module_utils.network.vyos.utils.utils import get_lst_diff_for_dicts, list_diff_have_only
class Lldp_global(ConfigBase):
"""
The vyos_lldp_global class
"""
gather_subset = [
'!all',
'!min',
]
gather_network_resources = [
'lldp_global',
]
params = ['enable', 'address', 'snmp', 'legacy_protocols']
def __init__(self, module):
super(Lldp_global, self).__init__(module)
def get_lldp_global_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_global_facts = facts['ansible_network_resources'].get('lldp_global')
if not lldp_global_facts:
return {}
return lldp_global_facts
def execute_module(self):
""" Execute the module
:rtype: A dictionary
:returns: The result from module execution
"""
result = {'changed': False}
commands = list()
warnings = list()
existing_lldp_global_facts = self.get_lldp_global_facts()
commands.extend(self.set_config(existing_lldp_global_facts))
if commands:
if not self._module.check_mode:
self._connection.edit_config(commands)
result['changed'] = True
result['commands'] = commands
changed_lldp_global_facts = self.get_lldp_global_facts()
result['before'] = existing_lldp_global_facts
if result['changed']:
result['after'] = changed_lldp_global_facts
result['warnings'] = warnings
return result
def set_config(self, existing_lldp_global_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_global_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
"""
commands = []
state = self._module.params['state']
if state == 'deleted':
commands.extend(self._state_deleted(want=None, have=have))
elif state == 'merged':
commands.extend(self._state_merged(want=want, have=have))
elif state == 'replaced':
commands.extend(self._state_replaced(want=want, have=have))
return commands
def _state_replaced(self, want, have):
""" The command generator when state is replaced
:rtype: A list
:returns: the commands necessary to migrate the current configuration
to the desired configuration
"""
commands = []
if have:
commands.extend(self._state_deleted(want, have))
commands.extend(self._state_merged(want, have))
return commands
def _state_merged(self, want, have):
""" The command generator when state is merged
:rtype: A list
:returns: the commands necessary to merge the provided into
the current configuration
"""
commands = []
commands.extend(self._render_updates(want, have))
return commands
def _state_deleted(self, want, have):
""" The command generator when state is deleted
:rtype: A list
:returns: the commands necessary to remove the current configuration
of the provided objects
"""
commands = []
if want:
for item in Lldp_global.params:
if item == 'legacy_protocols':
commands.extend(self._update_lldp_protocols(want, have))
elif have.get(item) and not want.get(item) and item != 'enable':
commands.append(Lldp_global.del_cmd + item)
elif have:
for item in Lldp_global.params:
if have.get(item):
if item == 'legacy_protocols':
commands.append(
self._compute_command('legacy-protocols', remove=True)
)
elif item == 'address':
commands.append(
self._compute_command('management-address', remove=True)
)
elif item == 'snmp':
commands.append(
self._compute_command(item, remove=True)
)
return commands
def _render_updates(self, want, have):
commands = []
if have:
temp_have_legacy_protos = have.pop('legacy_protocols', None)
else:
have = {}
temp_want_legacy_protos = want.pop('legacy_protocols', None)
updates = dict_diff(have, want)
if have and temp_have_legacy_protos:
have['legacy_protocols'] = temp_have_legacy_protos
if not have and temp_want_legacy_protos:
want['legacy_protocols'] = temp_want_legacy_protos
commands.extend(self._add_lldp_protocols(want, have))
if updates:
for key, value in iteritems(updates):
if value:
if key == 'enable':
commands.append(
self._compute_command()
)
elif key == 'address':
commands.append(
self._compute_command('management-address', str(value))
)
elif key == 'snmp':
if value == 'disable':
commands.append(
self._compute_command(key, remove=True)
)
else:
commands.append(
self._compute_command(key, str(value))
)
return commands
def _add_lldp_protocols(self, want, have):
commands = []
diff_members = get_lst_diff_for_dicts(want, have, 'legacy_protocols')
for key in diff_members:
commands.append(
self._compute_command('legacy-protocols', key)
)
return commands
def _update_lldp_protocols(self, want_item, have_item):
commands = []
want_protocols = want_item.get('legacy_protocols') or []
have_protocols = have_item.get('legacy_protocols') or []
members_diff = list_diff_have_only(want_protocols, have_protocols)
if members_diff:
for member in members_diff:
commands.append(
self._compute_command('legacy-protocols', member, remove=True)
)
return commands
def _compute_command(self, key=None, value=None, remove=False):
if remove:
cmd = 'delete service lldp'
else:
cmd = 'set service lldp'
if key:
cmd += (' ' + key)
if value:
cmd += (" '" + value + "'")
return cmd

View file

@ -6,16 +6,14 @@ The facts class for vyos
this file validates each subset of facts and selectively
calls the appropriate facts gathering function
"""
from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible.module_utils.network.vyos.argspec.facts.facts import FactsArgs
from ansible.module_utils.network.common.facts.facts import FactsBase
from ansible.module_utils.network.vyos.facts.interfaces.interfaces import InterfacesFacts
from ansible.module_utils.network.vyos.facts.l3_interfaces.l3_interfaces import L3_interfacesFacts
from ansible.module_utils.network.vyos.facts.lag_interfaces.lag_interfaces import Lag_interfacesFacts
from ansible.module_utils.network.vyos.facts.lldp_global.lldp_global import Lldp_globalFacts
from ansible.module_utils.network.vyos.facts.legacy.base import Default, Neighbors, Config
@ -27,7 +25,8 @@ FACT_LEGACY_SUBSETS = dict(
FACT_RESOURCE_SUBSETS = dict(
interfaces=InterfacesFacts,
l3_interfaces=L3_interfacesFacts,
lag_interfaces=Lag_interfacesFacts
lag_interfaces=Lag_interfacesFacts,
lldp_global=Lldp_globalFacts
)
@ -54,7 +53,6 @@ class Facts(FactsBase):
if self.VALID_RESOURCE_SUBSETS:
self.get_network_resources_facts(netres_choices, FACT_RESOURCE_SUBSETS,
resource_facts_type, data)
if self.VALID_LEGACY_GATHER_SUBSETS:
self.get_network_legacy_facts(FACT_LEGACY_SUBSETS, legacy_facts_type)

View file

@ -11,8 +11,6 @@ based on the configuration.
from __future__ import absolute_import, division, print_function
__metaclass__ = type
import platform
import re
from ansible.module_utils. \

View file

@ -0,0 +1,109 @@
#
# -*- 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 vyos lldp_global 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 re import findall, M
from copy import deepcopy
from ansible.module_utils.network.common import utils
from ansible.module_utils.network.vyos.argspec.lldp_global.lldp_global import Lldp_globalArgs
class Lldp_globalFacts(object):
""" The vyos lldp_global fact class
"""
def __init__(self, module, subspec='config', options='options'):
self._module = module
self.argument_spec = Lldp_globalArgs.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 lldp_global
:param connection: the device connection
:param ansible_facts: Facts dictionary
:param data: previously collected conf
:rtype: dictionary
:returns: facts
"""
if not data:
data = connection.get_config()
objs = {}
lldp_output = findall(r'^set service lldp (\S+)', data, M)
if lldp_output:
for item in set(lldp_output):
lldp_regex = r' %s .+$' % item
cfg = findall(lldp_regex, data, M)
obj = self.render_config(cfg)
if obj:
objs.update(obj)
lldp_service = findall(r"^set service (lldp)?('lldp')", data, M)
if lldp_service or lldp_output:
lldp_obj = {}
lldp_obj['enable'] = True
objs.update(lldp_obj)
facts = {}
params = utils.validate_config(self.argument_spec, {'config': objs})
facts['lldp_global'] = utils.remove_empties(params['config'])
ansible_facts['ansible_network_resources'].update(facts)
return ansible_facts
def render_config(self, 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 configuration
:rtype: dictionary
:returns: The generated config
"""
protocol_conf = '\n'.join(filter(lambda x: ('legacy-protocols' in x), conf))
att_conf = '\n'.join(filter(lambda x: ('legacy-protocols' not in x), conf))
config = self.parse_attribs(
['snmp', 'address'], att_conf
)
config['legacy_protocols'] = self.parse_protocols(protocol_conf)
return utils.remove_empties(config)
def parse_protocols(self, conf):
protocol_support = None
if conf:
protocols = findall(r'^.*legacy-protocols (.+)', conf, M)
if protocols:
protocol_support = []
for protocol in protocols:
protocol_support.append(protocol.strip("'"))
return protocol_support
def parse_attribs(self, attribs, conf):
config = {}
for item in attribs:
value = utils.parse_conf_arg(conf, item)
if value:
config[item] = value.strip("'")
else:
config[item] = None
return utils.remove_empties(config)

View file

@ -66,7 +66,33 @@ def diff_list_of_dicts(want, have):
return diff
def get_lst_diff_for_dicts(want, have, lst):
"""
This function generates a list containing values
that are only in want and not in list in have dict
:param want: dict object to want
:param have: dict object to have
:param lst: list the diff on
:return: new list object with values which are only in want.
"""
if not have:
diff = want.get(lst) or []
else:
want_elements = want.get(lst) or {}
have_elements = have.get(lst) or {}
diff = list_diff_want_only(want_elements, have_elements)
return diff
def list_diff_have_only(want_list, have_list):
"""
This function generated the list containing values
that are only in have list.
:param want_list:
:param have_list:
:return: new list with values which are only in have list
"""
if have_list and not want_list:
diff = have_list
elif not have_list:
@ -77,6 +103,13 @@ def list_diff_have_only(want_list, have_list):
def list_diff_want_only(want_list, have_list):
"""
This function generated the list containing values
that are only in want list.
:param want_list:
:param have_list:
:return: new list with values which are only in want list
"""
if have_list and not want_list:
diff = None
elif not have_list:
@ -84,14 +117,3 @@ def list_diff_want_only(want_list, have_list):
else:
diff = [i for i in have_list + want_list if i in want_list and i not in have_list]
return diff
def get_lst_diff_for_dicts(want, have, lst):
if not have:
diff = want.get(lst) or []
else:
want_elements = want.get(lst) or {}
have_elements = have.get(lst) or {}
diff = list_diff_want_only(want_elements, have_elements)
return diff

View file

@ -19,8 +19,12 @@
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
#
from __future__ import absolute_import, division, print_function
__metaclass__ = type
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'status': ['deprecated'],
'supported_by': 'network'}
@ -33,14 +37,23 @@ short_description: Manage LLDP configuration on VyOS network devices
description:
- This module provides declarative management of LLDP service
on VyOS network devices.
deprecated:
removed_in: '2.13'
alternative: vyos_lldp_global
why: Updated modules released with more functionality.
notes:
- Tested against VYOS 1.1.7
options:
interfaces:
description:
- Name of the interfaces.
type: list
state:
description:
- State of the LLDP configuration.
- State of the link aggregation group.
default: present
choices: ['present', 'absent']
choices: ['present', 'absent', 'enabled', 'disabled']
type: str
extends_documentation_fragment: vyos
"""

View file

@ -52,7 +52,7 @@ options:
specific subset should not be collected.
required: false
version_added: "2.9"
choices: ['all', 'interfaces', '!interfaces', 'l3_interfaces', '!l3_interfaces', 'lag_interfaces', '!lag_interfaces']
choices: ['all', 'interfaces', '!interfaces', 'l3_interfaces', '!l3_interfaces', 'lag_interfaces', '!lag_interfaces', 'lldp_global', '!lldp_global']
"""
EXAMPLES = """

View file

@ -0,0 +1,323 @@
#!/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 vyos_lldp_global
"""
from __future__ import absolute_import, division, print_function
__metaclass__ = type
ANSIBLE_METADATA = {
'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'network'
}
DOCUMENTATION = """
---
module: vyos_lldp_global
version_added: 2.9
short_description: Manage link layer discovery protocol (LLDP) attributes on VyOS devices..
description: This module manages link layer discovery protocol (LLDP) attributes on VyOS devices.
notes:
- Tested against VyOS 1.1.8 (helium).
- This module works with connection C(network_cli).
author:
- Rohit Thakur (@rohitthakur2590)
options:
config:
description: The provided link layer discovery protocol (LLDP) configuration.
type: dict
suboptions:
enable:
description:
- This argument is a boolean value to enable or disable LLDP.
type: bool
address:
description:
- This argument defines management-address.
type: str
snmp:
description:
- This argument enable the SNMP queries to LLDP database.
type: str
legacy_protocols:
description:
- List of the supported legacy protocols.
type: list
choices:
- cdp
- edp
- fdp
- sonmp
state:
description:
- The state the configuration should be left in.
type: str
choices:
- merged
- replaced
- deleted
default: merged
"""
EXAMPLES = """
# Using merged
#
# Before state:
# -------------
#
# vyos@vyos:~$ show configuration commands|grep lldp
# vyos@vyos:~$
#
- name: Merge provided configuration with device configuration
vyos_lldp_global:
config:
legacy_protocols:
- 'fdp'
- 'cdp'
snmp: 'enable'
address: 192.0.2.11
state: merged
#
#
# ------------------------
# Module Execution Results
# ------------------------
#
# "before": []
#
# "commands": [
# "set service lldp legacy-protocols fdp",
# "set service lldp legacy-protocols cdp",
# "set service lldp snmp enable",
# "set service lldp management-address '192.0.2.11'"
# ]
#
# "after": [
# {
# "snmp": "enable"
# },
# {
# "address": "192.0.2.11"
# },
# {
# "legacy_protocols": [
# "cdp",
# "fdp"
# ]
# }
# {
# "enable": true
# }
# ]
#
# After state:
# -------------
#
# set service lldp legacy-protocols cdp
# set service lldp legacy-protocols fdp
# set service lldp management-address '192.0.2.11'
# set service lldp snmp enable
# Using replaced
#
# Before state:
# -------------
#
# vyos@vyos:~$ show configuration commands | grep lldp
# set service lldp legacy-protocols cdp
# set service lldp legacy-protocols fdp
# set service lldp management-address '192.0.2.11'
# set service lldp snmp enable
#
- name: Replace device configurations with provided configurations
vyos_lldp_global:
config:
legacy_protocols:
- 'edp'
- 'sonmp'
- 'cdp'
address: 192.0.2.14
state: replaced
#
#
# ------------------------
# Module Execution Results
# ------------------------
#
#
# "before": [
# {
# "snmp": "enable"
# },
# {
# "address": "192.0.2.11"
# },
# {
# "legacy_protocols": [
# "cdp",
# "fdp"
# ]
# }
# {
# "enable": true
# }
# ]
# "commands": [
# "delete service lldp snmp",
# "delete service lldp legacy-protocols fdp",
# "set service lldp management-address '192.0.2.14'",
# "set service lldp legacy-protocols edp",
# "set service lldp legacy-protocols sonmp"
# ]
#
# "after": [
# {
# "address": "192.0.2.14"
# },
# {
# "legacy_protocols": [
# "cdp",
# "edp",
# "sonmp"
# ]
# }
# {
# "enable": true
# }
# ]
#
# After state:
# -------------
#
# vyos@vyos:~$ show configuration commands|grep lldp
# set service lldp legacy-protocols cdp
# set service lldp legacy-protocols edp
# set service lldp legacy-protocols sonmp
# set service lldp management-address '192.0.2.14'
# Using deleted
#
# Before state
# -------------
# vyos@vyos:~$ show configuration commands|grep lldp
# set service lldp legacy-protocols cdp
# set service lldp legacy-protocols edp
# set service lldp legacy-protocols sonmp
# set service lldp management-address '192.0.2.14'
#
- name: Delete attributes of given lldp service (This won't delete the LLDP service itself)
vyos_lldp_global:
config:
state: deleted
#
#
# ------------------------
# Module Execution Results
# ------------------------
#
# "before": [
# {
# "address": "192.0.2.14"
# },
# {
# "legacy_protocols": [
# "cdp",
# "edp",
# "sonmp"
# ]
# }
# {
# "enable": true
# }
# ]
#
# "commands": [
# "delete service lldp management-address",
# "delete service lldp legacy-protocols"
# ]
#
# "after": [
# {
# "enable": true
# }
# ]
#
# After state
# ------------
# vyos@vyos:~$ show configuration commands | grep lldp
# set service lldp
"""
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:
- set service lldp legacy-protocols sonmp
- set service lldp management-address '192.0.2.14'
"""
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.network.vyos.argspec.lldp_global.lldp_global import Lldp_globalArgs
from ansible.module_utils.network.vyos.config.lldp_global.lldp_global import Lldp_global
def main():
"""
Main entry point for module execution
:returns: the result form module invocation
"""
required_if = [('state', 'merged', ('config',)),
('state', 'replaced', ('config',))]
module = AnsibleModule(argument_spec=Lldp_globalArgs.argument_spec, required_if=required_if,
supports_check_mode=True)
result = Lldp_global(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,19 @@
---
- name: Collect all cli test cases
find:
paths: "{{ role_path }}/tests/cli"
patterns: "{{ testcase }}.yaml"
use_regex: true
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 (connection=network_cli)
include: "{{ test_case_to_run }}"
vars:
ansible_connection: network_cli
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View file

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

View file

@ -0,0 +1,9 @@
---
- name: Setup
cli_config:
config: "{{ lines }}"
vars:
lines: |
set service lldp
set service lldp legacy-protocols 'cdp'
set service lldp management-address '192.0.2.17'

View file

@ -0,0 +1,9 @@
---
- name: Remove Config
cli_config:
config: "{{ lines }}"
vars:
lines: |
delete service lldp legacy-protocols
delete service lldp management-address
delete service lldp

View file

@ -0,0 +1,44 @@
---
- debug:
msg: "Start vyos_lldp_global deleted integration tests ansible_connection={{ ansible_connection }}"
- include_tasks: _populate.yaml
- block:
- name: Delete attributes of LLDP service.
vyos_lldp_global: &deleted
config:
state: deleted
register: result
- name: Assert that the before dicts were correctly generated
assert:
that:
- "{{ populate == result['before']}}"
- name: Assert that the correct set of commands were generated
assert:
that:
- "{{ deleted['commands'] | symmetric_difference(result['commands']) |length == 0 }}"
- name: Assert that the after dicts were correctly generated
assert:
that:
- "{{ deleted['after'] == result['after']}}"
- name: Delete attributes of given interfaces (IDEMPOTENT)
vyos_lldp_global: *deleted
register: result
- name: Assert that the previous task was idempotent
assert:
that:
- "result.changed == false"
- name: Assert that the before dicts were correctly generated
assert:
that:
- "{{ deleted['after'] == result['before'] }}"
always:
- include_tasks: _remove_config.yaml

View file

@ -0,0 +1,49 @@
---
- debug:
msg: "START vyos_lldp_global merged integration tests on connection={{ ansible_connection }}"
- include_tasks: _remove_config.yaml
- include_tasks: _populate.yaml
- block:
- name: Merge the provided configuration with the exisiting running configuration
vyos_lldp_global: &merged
config:
legacy_protocols:
- 'fdp'
- 'cdp'
address: 192.0.2.11
state: merged
register: result
- name: Assert that before dicts were correctly generated
assert:
that: "{{ merged['before'] == result['before'] }}"
- name: Assert that correct set of commands were generated
assert:
that:
- "{{ merged['commands'] | symmetric_difference(result['commands']) |length == 0 }}"
- name: Assert that after dicts was correctly generated
assert:
that:
- "{{ merged['after'] == result['after'] }}"
- name: Merge the provided configuration with the existing running configuration (IDEMPOTENT)
vyos_lldp_global: *merged
register: result
- name: Assert that the previous task was idempotent
assert:
that:
- "result['changed'] == false"
- name: Assert that before dicts were correctly generated
assert:
that:
- "{{ merged['after'] == result['before'] }}"
always:
- include_tasks: _remove_config.yaml

View file

@ -0,0 +1,51 @@
---
- debug:
msg: "START vyos_lldp_global replaced integration tests on connection={{ ansible_connection }}"
- include_tasks: _remove_config.yaml
- include_tasks: _populate.yaml
- block:
- name: Replace device configurations of LLDP service with provided configurations
vyos_lldp_global: &replaced
config:
legacy_protocols:
- 'edp'
- 'sonmp'
- 'cdp'
address: 192.0.2.14
state: replaced
register: result
- name: Assert that correct set of commands were generated
assert:
that:
- "{{ replaced['commands'] | symmetric_difference(result['commands']) |length == 0 }}"
- name: Assert that before dicts are correctly generated
assert:
that:
- "{{ populate == result['before'] }}"
- name: Assert that after dict is correctly generated
assert:
that:
- "{{ replaced['after'] == result['after'] }}"
- name: Replace device configurations of LLDP service with provided configurarions (IDEMPOTENT)
vyos_lldp_global: *replaced
register: result
- name: Assert that task was idempotent
assert:
that:
- "result['changed'] == false"
- name: Assert that before dict is correctly generated
assert:
that:
- "{{ replaced['after'] == result['before'] }}"
always:
- include_tasks: _remove_config.yaml

View file

@ -0,0 +1,51 @@
---
- debug:
msg: "START vyos_lldp_global round trip integration tests on connection={{ ansible_connection }}"
- include_tasks: _remove_config.yaml
- block:
- name: Apply the provided configuration (base config)
vyos_lldp_global:
config:
legacy_protocols:
- 'fdp'
- 'cdp'
address: 192.0.2.11
state: merged
register: base_config
- name: Gather vyos_lldp_global facts
vyos_facts:
gather_subset:
- default
gather_network_resources:
- lldp_global
- name: Apply the provided configuration (config to be reverted)
vyos_lldp_global:
config:
legacy_protocols:
- 'edp'
- 'sonmp'
- 'cdp'
address: 192.0.2.14
state: merged
register: result
- name: Assert that changes were applied
assert:
that: "{{ round_trip['after'] == result['after'] }}"
- name: Revert back to base config using facts round trip
vyos_lldp_global:
config: "{{ ansible_facts['network_resources']['lldp_global'] }}"
state: replaced
register: revert
- name: Assert that config was reverted
assert:
that: "{{ base_config['after'] == revert['after'] }}"
always:
- include_tasks: _remove_config.yaml

View file

@ -0,0 +1,56 @@
---
merged:
before:
address: '192.0.2.17'
enable: true
legacy_protocols:
- 'cdp'
commands:
- "set service lldp management-address '192.0.2.11'"
- "set service lldp legacy-protocols 'fdp'"
after:
address: '192.0.2.11'
enable: true
legacy_protocols:
- 'cdp'
- 'fdp'
populate:
address: '192.0.2.17'
enable: true
legacy_protocols:
- 'cdp'
replaced:
commands:
- "set service lldp legacy-protocols 'edp'"
- "set service lldp legacy-protocols 'sonmp'"
- "set service lldp management-address '192.0.2.14'"
after:
address: '192.0.2.14'
enable: true
legacy_protocols:
- 'cdp'
- 'edp'
- 'sonmp'
deleted:
commands:
- "delete service lldp management-address"
- "delete service lldp legacy-protocols"
after:
"enable": true
round_trip:
after:
address: '192.0.2.14'
enable: true
legacy_protocols:
- 'cdp'
- 'edp'
- 'fdp'
- 'sonmp'

View file

@ -5165,13 +5165,7 @@ lib/ansible/modules/network/vyos/_vyos_linkagg.py validate-modules:E326
lib/ansible/modules/network/vyos/_vyos_linkagg.py validate-modules:E337
lib/ansible/modules/network/vyos/_vyos_linkagg.py validate-modules:E338
lib/ansible/modules/network/vyos/_vyos_linkagg.py validate-modules:E340
lib/ansible/modules/network/vyos/vyos_lldp.py future-import-boilerplate
lib/ansible/modules/network/vyos/vyos_lldp.py metaclass-boilerplate
lib/ansible/modules/network/vyos/vyos_lldp.py validate-modules:E322
lib/ansible/modules/network/vyos/vyos_lldp.py validate-modules:E324
lib/ansible/modules/network/vyos/vyos_lldp.py validate-modules:E326
lib/ansible/modules/network/vyos/vyos_lldp.py validate-modules:E337
lib/ansible/modules/network/vyos/vyos_lldp.py validate-modules:E338
lib/ansible/modules/network/vyos/_vyos_lldp.py validate-modules:E324
lib/ansible/modules/network/vyos/vyos_lldp_interface.py future-import-boilerplate
lib/ansible/modules/network/vyos/vyos_lldp_interface.py metaclass-boilerplate
lib/ansible/modules/network/vyos/vyos_lldp_interface.py validate-modules:E322