diff --git a/plugins/module_utils/network/vyos/argspec/vrrp/vrrp.py b/plugins/module_utils/network/vyos/argspec/vrrp/vrrp.py index 41cd47ac..86afeedc 100644 --- a/plugins/module_utils/network/vyos/argspec/vrrp/vrrp.py +++ b/plugins/module_utils/network/vyos/argspec/vrrp/vrrp.py @@ -1,55 +1,63 @@ # -*- coding: utf-8 -*- # Copyright 2024 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) from __future__ import absolute_import, division, print_function __metaclass__ = type ############################################# # WARNING # ############################################# # # This file is auto generated by the # cli_rm_builder. # # Manually editing this file is not advised. # # To update the argspec make the desired changes # in the module docstring and re-run # cli_rm_builder. # ############################################# """ The arg spec for the vyos_vrrp module """ class VrrpArgs(object): # pylint: disable=R0903 """The arg spec for the vyos_vrrp module""" argument_spec = { "config": { "type": "dict", "options": { "disable": {"aliases": ["disabled"], "type": "bool", "default": False}, + "virtual_server": { + "type": "list", + "elements": "dict", + "options": { + "name": {"required": True, "type": "str"}, + "address": {"type": "str"}, + }, + }, }, }, "state": { "type": "str", "choices": [ "deleted", "merged", "purged", "replaced", "gathered", "rendered", "parsed", ], "default": "merged", }, "running_config": {"type": "str"}, } # pylint: disable=C0301 diff --git a/plugins/module_utils/network/vyos/facts/vrrp/vrrp.py b/plugins/module_utils/network/vyos/facts/vrrp/vrrp.py index 43a70b95..82b076f0 100644 --- a/plugins/module_utils/network/vyos/facts/vrrp/vrrp.py +++ b/plugins/module_utils/network/vyos/facts/vrrp/vrrp.py @@ -1,104 +1,127 @@ # -*- coding: utf-8 -*- # Copyright 2021 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) from __future__ import absolute_import, division, print_function __metaclass__ = type """ The vyos vrrp 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. """ import re from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import utils from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.vrrp.vrrp import ( VrrpArgs, ) from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.vrrp import ( VrrpTemplate, ) class VrrpFacts(object): """The vyos vrrp facts class""" def __init__(self, module, subspec="config", options="options"): self._module = module self.argument_spec = VrrpArgs.argument_spec def get_device_data(self, connection): return connection.get('show configuration commands | match "set high-availability"') def get_config_set(self, data, connection): """To classify the configurations beased on vrrp""" config_dict = {} for config_line in data.splitlines(): vrrp_grp = re.search(r"set high-availability vrrp group (\S+).*", config_line) + vrrp_snmp = re.search(r"set high-availability vrrp snmp", config_line) + vrrp_gp = re.search( + r"set high-availability vrrp global-parameters (\S+).*", + config_line, + ) + vrrp_sg = re.search(r"set high-availability vrrp sync-group (\S+).*", config_line) vrrp_vsrv = re.search(r"set high-availability virtual-server (\S+).*", config_line) vrrp_disable = re.search(r"set high-availability disable", config_line) if vrrp_disable: config_dict["disable"] = config_dict.get("disable", "") + config_line + "\n" + if vrrp_gp: + config_dict["global_parameters"] = ( + config_dict.get(vrrp_gp.group(1), "") + config_line + "\n" + ) + if vrrp_vsrv: + config_dict["virtual_server"] = ( + config_dict.get(vrrp_vsrv.group(1), "") + config_line + "\n" + ) + if vrrp_sg: + config_dict["sync_group"] = ( + config_dict.get(vrrp_sg.group(1), "") + config_line + "\n" + ) if vrrp_grp: config_dict[vrrp_grp.group(1)] = ( config_dict.get(vrrp_grp.group(1), "") + config_line + "\n" ) return list(config_dict.values()) def populate_facts(self, connection, ansible_facts, data=None): """Populate the facts for vrrp network resource :param connection: the device connection :param ansible_facts: Facts dictionary :param data: previously collected conf :rtype: dictionary :returns: facts """ facts = {} objs = {} config_lines = [] if not data: data = self.get_device_data(connection) vrrp_facts = {} + groups = [] + sync_groups = [] + vsvrs = [] resources = self.get_config_set(data, connection) for resource in resources: vrrp_parser = VrrpTemplate( lines=resource.split("\n"), module=self._module, ) objs = vrrp_parser.parse() - self._module.fail_json(msg=str(resource.split("\n")) + str(objs)) + # self._module.fail_json(msg=str(resource.split("\n")) + "******" + str(objs)) if objs: - self._module.fail_json(msg=str(objs)) - - # for resource in data.splitlines(): - # if "address-family" not in resource: - # config_lines.append(re.sub("'", "", resource)) - # - # vrrp_parser = VrrpTemplate(lines=config_lines, module=self._module) - # - # objs = vrrp_parser.parse() - # self._module.fail_json(msg=objs) - + if "disable" in objs: + vrrp_facts.update(objs) + if "group" in objs: + groups.append(objs) + if "virtual_server" in objs: + vsvrs.append(objs) + if "sync_group" in objs: + sync_groups.append(objs) + + if groups: + vrrp_facts.update({"groups": groups}) + + self._module.fail_json(msg=str(vrrp_facts)) ansible_facts["ansible_network_resources"].pop("vrrp", None) params = utils.remove_empties( vrrp_parser.validate_config(self.argument_spec, {"config": objs}, redact=True), ) facts["vrrp"] = params.get("config", []) ansible_facts["ansible_network_resources"].update(facts) self._module.fail_json(msg=ansible_facts) return ansible_facts diff --git a/plugins/module_utils/network/vyos/rm_templates/vrrp.py b/plugins/module_utils/network/vyos/rm_templates/vrrp.py index c285416e..01e77e97 100644 --- a/plugins/module_utils/network/vyos/rm_templates/vrrp.py +++ b/plugins/module_utils/network/vyos/rm_templates/vrrp.py @@ -1,473 +1,458 @@ # -*- coding: utf-8 -*- # Copyright 2021 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) from __future__ import absolute_import, division, print_function __metaclass__ = type """ The Bgp_global parser templates file. This contains a list of parser definitions and associated functions that facilitates both facts gathering and native command generation for the given network resource. """ import re # from ansible.module_utils.six import iteritems from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.network_template import ( NetworkTemplate, ) class VrrpTemplate(NetworkTemplate): def __init__(self, lines=None, module=None): prefix = {"set": "set", "remove": "delete"} super(VrrpTemplate, self).__init__( lines=lines, tmplt=self, prefix=prefix, module=module, ) # fmt: off PARSERS = [ { "name": "disable", "getval": re.compile( r""" ^set \shigh-availability \s(?Pdisable) $""", re.VERBOSE, ), "setval": "high-availability disable", "result": { "disable": "{{ True if disable is defined }}", }, }, - { - "name": "vg_global_garp_interval", - "getval": re.compile( - r""" - ^set - \shigh-availability - \s(?Pdisable) - $""", - re.VERBOSE, - ), - "setval": "high-availability disable", - "result": { - "disable": "{{ True if disable is defined }}", - }, - }, { "name": "vg_addr", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \saddress \s(?P
\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} address {{address}}", "compval": "address", "result": { "group": "{{ group }}", "address": "{{ address }}", }, }, { "name": "vg_addr_addr_int", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \saddress \s(?P
\S+) \sinterface \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} address {{address}} interface {{interface}}", "compval": "interface", "result": { "group": "{{ group }}", "address": "{{ address }}", "interface": "{{ interface }}", }, }, { "name": "vg_excluded_addr", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sexcluded-address \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} excluded-address {{excluded_addr}}", "compval": "excluded_address", "result": { "group": "{{ group }}", "excluded_address": "{{ excluded_addr }}", }, }, { "name": "vg_excluded_addr_int", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sexcluded-address \s(?P\S+) \sinterface \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} excluded-address {{excluded_addr}} interface {{excluded_addr_interface}}", "compval": "excluded_address_interface", "result": { "group": "{{ group }}", "excluded_address_interface": "{{ excluded_address_int }}", }, }, { "name": "vg_priority", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \spriority \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} priority {{priority}}", "compval": "priority", "result": { "group": "{{ group }}", "priority": "{{ priority }}", }, }, { "name": "vg_advertise_interval", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sadvertise-interval \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} advertise-interval {{adv_int}}", "compval": "advertise_interval", "result": { "group": "{{ group }}", "advertise_interval": "{{ adv_int }}", }, }, { "name": "vg_description", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sdescription - \s(?P\S+) + \s(?P.*) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} description {{description}}", "compval": "description", "result": { "group": "{{ group }}", "description": "{{ description }}", }, }, { "name": "vg_vrid", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \svrid \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} vrid {{vrid}}", "compval": "vrid", "result": { "group": "{{ group }}", "vrid": "{{ vrid }}", }, }, { "name": "vg_no_preempt", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \s(?Pno-preempt) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} no-preempt", "compval": "no_preempt", "result": { "group": "{{ group }}", "no_preempt": "{{ True if np is defined }}", }, }, { "name": "vg_preempt_delay", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \spreempt-delay \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} preempt-delay {{prd}}", "compval": "preempt_delay", "result": { "group": "{{ group }}", "preempt-delay": "{{ prd }}", }, }, { "name": "vg_authentication_password", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sauthentication \spassword \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} authentication password {{pass}}", "compval": "pass", "result": { "group": "{{ group }}", "authentication": { "password": "{{ pass }}", }, }, }, { "name": "vg_authentication_type", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sauthentication \stype \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} authentication type {{type}}", "compval": "type", "result": { "group": "{{ group }}", "authentication": { "password": "{{ type }}", }, }, }, { "name": "vg_rfc3768", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \srfc3768-compatibility \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} rfc3768-compatibility {{rfc3768}}", "compval": "rfc3768_compatibility", "result": { "group": "{{ group }}", "rfc3768_compatibility": "{{ True if rfc3768 is defined }}", }, }, { "name": "vg_garp_interval", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sgarp \sinterval \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} garp interval {{garp_int}}", "compval": "interval", "result": { "group": "{{ group }}", "garp": { "interval": "{{ garp_int}}", }, }, }, { "name": "vg_garp_master_delay", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sgarp \smaster-delay \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} garp master-delay {{garp_mdelay}}", "compval": "master_delay", "result": { "group": "{{ group }}", "garp": { "master_delay": "{{ garp_mdelay }}", }, }, }, { "name": "vg_garp_master_refresh", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sgarp \smaster-refresh \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} garp master-refresh {{garp_mrefresh}}", "compval": "master_refresh", "result": { "group": "{{ group }}", "garp": { "master_refresh": "{{ garp_mrefresh }}", }, }, }, { "name": "vg_garp_master_refresh_repeat", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sgarp \smaster-refresh-repeat \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} garp master-refresh-repeat {{garp_mrefresh_repeat}}", "compval": "master_refresh_repeat", "result": { "group": "{{ group }}", "garp": { "master_refresh_repeat": "{{ garp_mrefresh_repeat }}", }, }, }, { "name": "vg_garp_master_repeat", "getval": re.compile( r""" ^set \shigh-availability \svrrp \sgroup \s(?P\S+) \sgarp \smaster-repeat \s(?P\S+) $""", re.VERBOSE, ), "setval": "high-availability vrrp group {{group}} garp master-repeat {{garp_mrepeat}}", "compval": "master_repeat", "result": { "group": "{{ group }}", "garp": { "master_repeat": "{{ garp_mrepeat }}", }, }, }, ] # fmt: on