diff --git a/plugins/module_utils/network/vyos/facts/vrrp/vrrp.py b/plugins/module_utils/network/vyos/facts/vrrp/vrrp.py index 82b076f0..db0b9da8 100644 --- a/plugins/module_utils/network/vyos/facts/vrrp/vrrp.py +++ b/plugins/module_utils/network/vyos/facts/vrrp/vrrp.py @@ -1,127 +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) - + self._module.fail_json(msg=resources) 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: 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 01e77e97..aac66e95 100644 --- a/plugins/module_utils/network/vyos/rm_templates/vrrp.py +++ b/plugins/module_utils/network/vyos/rm_templates/vrrp.py @@ -1,458 +1,619 @@ # -*- 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_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.*) $""", 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 }}", }, }, }, - + { + "name": "vg_gp_version", + "getval": re.compile( + r""" + ^set + \shigh-availability + \svrrp + \sglobal-parameters + \sversion + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "high-availability vrrp global-parameters version {{version}}", + "compval": "global_parameters.version", + "result": { + "global_parameters": { + "version": "{{ version }}", + }, + }, + }, + { + "name": "gp_startup_delay", + "getval": re.compile( + r""" + ^set + \shigh-availability + \svrrp + \sglobal-parameters + \sstartup-delay + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "high-availability vrrp global-parameters startup-delay {{startup_delay}}", + "compval": "global_parameters.startup_delay", + "result": { + "global_parameters": { + "startup_delay": "{{ startup_delay }}", + }, + }, + }, + { + "name": "gp_garp_interval", + "getval": re.compile( + r""" + ^set + \shigh-availability + \svrrp + \sglobal-parameters + \sgarp + \sinterval + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "high-availability vrrp global-parameters garp interval {{interval}}", + "compval": "global_parameters.garp.interval", + "result": { + "global_parameters": { + "garp": { + "interval": "{{ interval }}", + }, + }, + }, + }, + { + "name": "gp_garp_master_delay", + "getval": re.compile( + r""" + ^set + \shigh-availability + \svrrp + \sglobal-parameters + \sgarp + \smaster-delay + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "high-availability vrrp global-parameters garp master-delay {{master_delay}}", + "compval": "global_parameters.garp.master_delay", + "result": { + "global_parameters": { + "garp": { + "master_delay": "{{ master_delay }}", + }, + }, + }, + }, + { + "name": "gp_garp_master_refresh", + "getval": re.compile( + r""" + ^set + \shigh-availability + \svrrp + \sglobal-parameters + \sgarp + \smaster-refresh + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "high-availability vrrp global-parameters garp master-refresh {{master_refresh}}", + "compval": "global_parameters.garp.master_refresh", + "result": { + "global_parameters": { + "garp": { + "master_refresh": "{{ master_refresh }}", + }, + }, + }, + }, + { + "name": "gp_garp_master_refresh_repeat", + "getval": re.compile( + r""" + ^set + \shigh-availability + \svrrp + \sglobal-parameters + \sgarp + \smaster-refresh-repeat + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "high-availability vrrp global-parameters garp master-refresh_repeat {{master_refresh_repeat}}", + "compval": "global_parameters.garp.master_refersh_repeat", + "result": { + "global_parameters": { + "garp": { + "master_refresh_repeat": "{{ master_refresh_repeat }}", + }, + }, + }, + }, + { + "name": "gp_garp_master_repeat", + "getval": re.compile( + r""" + ^set + \shigh-availability + \svrrp + \sglobal-parameters + \sgarp + \smaster-refresh-repeat + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "high-availability vrrp global-parameters garp master-refresh-repeat {{master_refresh_repeat}}", + "compval": "global_parameters.garp.master_refersh_repeat", + "result": { + "global_parameters": { + "garp": { + "master_refresh_repeat": "{{ master_refresh_repeat }}", + }, + }, + }, + }, ] # fmt: on