summaryrefslogtreecommitdiff
path: root/plugins/module_utils
diff options
context:
space:
mode:
authorRohit Thakur <rohitthakur2590@outlook.com>2020-05-11 13:16:30 +0530
committerRohit Thakur <rohitthakur2590@outlook.com>2020-05-11 19:29:55 +0530
commitb0a8d123261afeaca84089fd51d2714ff3b088ed (patch)
tree01e052edf8ba16c228f719469164247fdcafb0ef /plugins/module_utils
parent7e32c63e6d065062b4540b9bf467989ee86e1f2a (diff)
downloadvyos-ansible-collection-b0a8d123261afeaca84089fd51d2714ff3b088ed.tar.gz
vyos-ansible-collection-b0a8d123261afeaca84089fd51d2714ff3b088ed.zip
comments ncorporated
Signed-off-by: Rohit Thakur <rohitthakur2590@outlook.com>
Diffstat (limited to 'plugins/module_utils')
-rw-r--r--plugins/module_utils/network/vyos/argspec/ospfv2/ospfv2.py460
-rw-r--r--plugins/module_utils/network/vyos/config/ospfv2/ospfv2.py756
-rw-r--r--plugins/module_utils/network/vyos/facts/facts.py2
-rw-r--r--plugins/module_utils/network/vyos/facts/ospfv2/ospfv2.py271
-rw-r--r--plugins/module_utils/network/vyos/utils/utils.py11
5 files changed, 833 insertions, 667 deletions
diff --git a/plugins/module_utils/network/vyos/argspec/ospfv2/ospfv2.py b/plugins/module_utils/network/vyos/argspec/ospfv2/ospfv2.py
index a2a6e04..275aaf3 100644
--- a/plugins/module_utils/network/vyos/argspec/ospfv2/ospfv2.py
+++ b/plugins/module_utils/network/vyos/argspec/ospfv2/ospfv2.py
@@ -29,337 +29,241 @@ The arg spec for the vyos_ospfv2 module
class Ospfv2Args(object): # pylint: disable=R0903
"""The arg spec for the vyos_ospfv2 module
"""
+
def __init__(self, **kwargs):
pass
argument_spec = {
- 'config': {
- 'options': {
- 'auto_cost': {
- 'options': {
- 'reference_bandwidth': {
- 'type': 'int'
- }
- },
- 'type': 'dict'
+ "config": {
+ "options": {
+ "auto_cost": {
+ "options": {"reference_bandwidth": {"type": "int"}},
+ "type": "dict",
},
- 'default_information': {
- 'options': {
- 'originate': {
- 'options': {
- 'always': {
- 'type': 'bool'
- },
- 'metric': {
- 'type': 'int'
- },
- 'metric_type': {
- 'type': 'int'
- },
- 'route_map': {
- 'type': 'str'
- }
+ "default_information": {
+ "options": {
+ "originate": {
+ "options": {
+ "always": {"type": "bool"},
+ "metric": {"type": "int"},
+ "metric_type": {"type": "int"},
+ "route_map": {"type": "str"},
},
- 'type': 'dict'
+ "type": "dict",
}
},
- 'type': 'dict'
- },
- 'default_metric': {
- 'type': 'int'
+ "type": "dict",
},
- 'distance': {
- 'options': {
- 'global': {
- 'type': 'int'
- },
- 'ospf': {
- 'options': {
- 'external': {
- 'type': 'int'
- },
- 'inter_area': {
- 'type': 'int'
- },
- 'intra_area': {
- 'type': 'int'
- }
+ "default_metric": {"type": "int"},
+ "distance": {
+ "options": {
+ "global": {"type": "int"},
+ "ospf": {
+ "options": {
+ "external": {"type": "int"},
+ "inter_area": {"type": "int"},
+ "intra_area": {"type": "int"},
},
- 'type': 'dict'
- }
+ "type": "dict",
+ },
},
- 'type': 'dict'
+ "type": "dict",
},
- 'log_adjacency_changes': {
- 'choices': ['detail'],
- 'type': 'str'
+ "log_adjacency_changes": {
+ "choices": ["detail"],
+ "type": "str",
},
- 'max_metric': {
- 'options': {
- 'router_lsa': {
- 'options': {
- 'administrative': {
- 'type': 'bool'
- },
- 'on_shutdown': {
- 'type': 'int'
- },
- 'on_startup': {
- 'type': 'int'
- }
+ "max_metric": {
+ "options": {
+ "router_lsa": {
+ "options": {
+ "administrative": {"type": "bool"},
+ "on_shutdown": {"type": "int"},
+ "on_startup": {"type": "int"},
},
- 'type': 'dict'
+ "type": "dict",
}
},
- 'type': 'dict'
+ "type": "dict",
},
- 'mpls_te': {
- 'options': {
- 'enabled': {
- 'type': 'bool'
- },
- 'router_address': {
- 'type': 'str'
- }
+ "mpls_te": {
+ "options": {
+ "enabled": {"type": "bool"},
+ "router_address": {"type": "str"},
},
- 'type': 'dict'
+ "type": "dict",
},
- 'neighbor': {
- 'elements': 'dict',
- 'options': {
- 'neighbor_id': {
- 'type': 'str'
- },
- 'poll_interval': {
- 'type': 'int'
- },
- 'priority': {
- 'type': 'int'
- }
+ "neighbor": {
+ "elements": "dict",
+ "options": {
+ "neighbor_id": {"type": "str"},
+ "poll_interval": {"type": "int"},
+ "priority": {"type": "int"},
},
- 'type': 'list'
+ "type": "list",
},
- 'areas': {
- 'elements': 'dict',
- 'options': {
- 'area_id': {
- 'type': 'str'
- },
- 'area_type': {
- 'options': {
- 'normal': {
- 'type': 'bool'
- },
- 'nssa': {
- 'options': {
- 'default_cost': {
- 'type': 'int'
- },
- 'no_summary': {
- 'type': 'bool'
+ "areas": {
+ "elements": "dict",
+ "options": {
+ "area_id": {"type": "str"},
+ "area_type": {
+ "options": {
+ "normal": {"type": "bool"},
+ "nssa": {
+ "options": {
+ "default_cost": {"type": "int"},
+ "no_summary": {"type": "bool"},
+ "set": {"type": "bool"},
+ "translate": {
+ "choices": [
+ "always",
+ "candidate",
+ "never",
+ ],
+ "type": "str",
},
- 'set': {
- 'type': 'bool'
- },
- 'translate': {
- 'choices':
- ['always', 'candidate', 'never'],
- 'type':
- 'str'
- }
},
- 'type': 'dict'
+ "type": "dict",
},
- 'stub': {
- 'options': {
- 'default_cost': {
- 'type': 'int'
- },
- 'no_summary': {
- 'type': 'bool'
- },
- 'set': {
- 'type': 'bool'
- }
+ "stub": {
+ "options": {
+ "default_cost": {"type": "int"},
+ "no_summary": {"type": "bool"},
+ "set": {"type": "bool"},
},
- 'type': 'dict'
- }
+ "type": "dict",
+ },
},
- 'type': 'dict'
+ "type": "dict",
},
- 'authentication': {
- 'choices': ['plaintext-password', 'md5'],
- 'type': 'str'
+ "authentication": {
+ "choices": ["plaintext-password", "md5"],
+ "type": "str",
},
- 'network': {
- 'elements': 'dict',
- 'options': {
- 'address': {
- 'required': True,
- 'type': 'str'
- }
+ "network": {
+ "elements": "dict",
+ "options": {
+ "address": {"required": True, "type": "str"}
},
- 'type': 'list'
+ "type": "list",
},
- 'range': {
- 'elements': 'dict',
- 'options': {
- 'address': {
- 'type': 'str'
- },
- 'cost': {
- 'type': 'int'
- },
- 'not_advertise': {
- 'type': 'bool'
- },
- 'substitute': {
- 'type': 'str'
- }
+ "range": {
+ "elements": "dict",
+ "options": {
+ "address": {"type": "str"},
+ "cost": {"type": "int"},
+ "not_advertise": {"type": "bool"},
+ "substitute": {"type": "str"},
},
- 'type': 'list'
+ "type": "list",
},
- 'shortcut': {
- 'choices': ['default', 'disable', 'enable'],
- 'type': 'str'
+ "shortcut": {
+ "choices": ["default", "disable", "enable"],
+ "type": "str",
},
- 'virtual_link': {
- 'elements': 'dict',
- 'options': {
- 'address': {
- 'type': 'str'
- },
- 'authentication': {
- 'options': {
- 'md5': {
- 'elements': 'dict',
- 'options': {
- 'key_id': {
- 'type': 'int'
- },
- 'md5_key': {
- 'type': 'str'
- }
+ "virtual_link": {
+ "elements": "dict",
+ "options": {
+ "address": {"type": "str"},
+ "authentication": {
+ "options": {
+ "md5": {
+ "elements": "dict",
+ "options": {
+ "key_id": {"type": "int"},
+ "md5_key": {"type": "str"},
},
- 'type': 'list'
+ "type": "list",
},
- 'plaintext_password': {
- 'type': 'str'
- }
+ "plaintext_password": {"type": "str"},
},
- 'type': 'dict'
- },
- 'dead_interval': {
- 'type': 'int'
- },
- 'hello_interval': {
- 'type': 'int'
+ "type": "dict",
},
- 'retransmit_interval': {
- 'type': 'int'
- },
- 'transmit_delay': {
- 'type': 'int'
- }
+ "dead_interval": {"type": "int"},
+ "hello_interval": {"type": "int"},
+ "retransmit_interval": {"type": "int"},
+ "transmit_delay": {"type": "int"},
},
- 'type': 'list'
- }
+ "type": "list",
+ },
},
- 'type': 'list'
+ "type": "list",
},
- 'parameters': {
- 'options': {
- 'abr_type': {
- 'choices':
- ['cisco', 'ibm', 'shortcut', 'standard'],
- 'type': 'str'
+ "parameters": {
+ "options": {
+ "abr_type": {
+ "choices": [
+ "cisco",
+ "ibm",
+ "shortcut",
+ "standard",
+ ],
+ "type": "str",
},
- 'opaque_lsa': {
- 'type': 'bool'
- },
- 'rfc1583_compatibility': {
- 'type': 'bool'
- },
- 'router_id': {
- 'type': 'str'
- }
+ "opaque_lsa": {"type": "bool"},
+ "rfc1583_compatibility": {"type": "bool"},
+ "router_id": {"type": "str"},
},
- 'type': 'dict'
+ "type": "dict",
},
- 'passive_interface': {
- 'type': 'list'
- },
- 'passive_interface_exclude': {
- 'type': 'list'
- },
- 'redistribute': {
- 'elements': 'dict',
- 'options': {
- 'metric': {
- 'type': 'int'
- },
- 'metric_type': {
- 'type': 'int'
- },
- 'route_map': {
- 'type': 'str'
+ "passive_interface": {"type": "list"},
+ "passive_interface_exclude": {"type": "list"},
+ "redistribute": {
+ "elements": "dict",
+ "options": {
+ "metric": {"type": "int"},
+ "metric_type": {"type": "int"},
+ "route_map": {"type": "str"},
+ "route_type": {
+ "choices": [
+ "bgp",
+ "connected",
+ "kernel",
+ "rip",
+ "static",
+ ],
+ "type": "str",
},
- 'route_type': {
- 'choices':
- ['bgp', 'connected', 'kernel', 'rip', 'static'],
- 'type':
- 'str'
- }
},
- 'type': 'list'
- },
- 'route_map': {
- 'type': 'list'
+ "type": "list",
},
- 'timers': {
- 'options': {
- 'refresh': {
- 'options': {
- 'timers': {
- 'type': 'int'
- }
- },
- 'type': 'dict'
+ "route_map": {"type": "list"},
+ "timers": {
+ "options": {
+ "refresh": {
+ "options": {"timers": {"type": "int"}},
+ "type": "dict",
},
- 'throttle': {
- 'options': {
- 'spf': {
- 'options': {
- 'delay': {
- 'type': 'int'
- },
- 'initial_holdtime': {
- 'type': 'int'
- },
- 'max_holdtime': {
- 'type': 'int'
- }
+ "throttle": {
+ "options": {
+ "spf": {
+ "options": {
+ "delay": {"type": "int"},
+ "initial_holdtime": {"type": "int"},
+ "max_holdtime": {"type": "int"},
},
- 'type': 'dict'
+ "type": "dict",
}
},
- 'type': 'dict'
- }
+ "type": "dict",
+ },
},
- 'type': 'dict'
- }
+ "type": "dict",
+ },
},
- 'type': 'dict'
+ "type": "dict",
},
"running_config": {"type": "str"},
- 'state': {
- 'choices': [
- 'merged', 'replaced', 'deleted', 'parsed', 'gathered',
- 'rendered'
+ "state": {
+ "choices": [
+ "merged",
+ "replaced",
+ "deleted",
+ "parsed",
+ "gathered",
+ "rendered",
],
- 'default':
- 'merged',
- 'type':
- 'str'
- }
+ "default": "merged",
+ "type": "str",
+ },
} # pylint: disable=C0301
diff --git a/plugins/module_utils/network/vyos/config/ospfv2/ospfv2.py b/plugins/module_utils/network/vyos/config/ospfv2/ospfv2.py
index 13645cd..fd25c17 100644
--- a/plugins/module_utils/network/vyos/config/ospfv2/ospfv2.py
+++ b/plugins/module_utils/network/vyos/config/ospfv2/ospfv2.py
@@ -22,11 +22,16 @@ from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.u
to_list,
remove_empties,
)
-from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.facts import Facts
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.facts import (
+ Facts,
+)
from ansible.module_utils.six import iteritems
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.utils import (
- list_diff_want_only, _in_target, _is_w_same, _bool_to_str
+ list_diff_want_only,
+ _in_target,
+ _is_w_same,
+ _bool_to_str,
)
@@ -36,9 +41,9 @@ class Ospfv2(ConfigBase):
The vyos_ospfv2 class
"""
- gather_subset = ['!all', '!min']
+ gather_subset = ["!all", "!min"]
- gather_network_resources = ['ospfv2']
+ gather_network_resources = ["ospfv2"]
def __init__(self, module):
super(Ospfv2, self).__init__(module)
@@ -50,12 +55,10 @@ class Ospfv2(ConfigBase):
:returns: The current configuration as a dictionary
"""
- (facts, _warnings) = \
- Facts(self._module).get_facts(self.gather_subset,
- self.gather_network_resources, data=data)
- ospfv2_facts = facts['ansible_network_resources'].get('ospfv2')
- if not ospfv2_facts:
- return []
+ (facts, _warnings) = Facts(self._module).get_facts(
+ self.gather_subset, self.gather_network_resources, data=data
+ )
+ ospfv2_facts = facts["ansible_network_resources"].get("ospfv2", {})
return ospfv2_facts
def execute_module(self):
@@ -65,47 +68,48 @@ class Ospfv2(ConfigBase):
:returns: The result from module execution
"""
- result = {'changed': False}
+ result = {"changed": False}
warnings = list()
commands = list()
if self.state in self.ACTION_STATES:
existing_ospfv2_facts = self.get_ospfv2_facts()
else:
- existing_ospfv2_facts = []
+ existing_ospfv2_facts = {}
- if self.state in self.ACTION_STATES or self.state == 'rendered':
+ if self.state in self.ACTION_STATES or self.state == "rendered":
commands.extend(self.set_config(existing_ospfv2_facts))
if commands and self.state in self.ACTION_STATES:
if not self._module.check_mode:
self._connection.edit_config(commands)
- result['changed'] = True
+ result["changed"] = True
if self.state in self.ACTION_STATES:
- result['commands'] = commands
+ result["commands"] = commands
- if self.state in self.ACTION_STATES or self.state == 'gathered':
+ if self.state in self.ACTION_STATES or self.state == "gathered":
changed_ospfv2_facts = self.get_ospfv2_facts()
- elif self.state == 'rendered':
- result['rendered'] = commands
- elif self.state == 'parsed':
- running_config = self._module.params['running_config']
+ elif self.state == "rendered":
+ result["rendered"] = commands
+ elif self.state == "parsed":
+ running_config = self._module.params["running_config"]
if not running_config:
- self._module.fail_json(msg='value of running_config parameter must not be empty for state parsed')
- result['parsed'] = \
- self.get_ospfv2_facts(data=running_config)
+ self._module.fail_json(
+ msg="value of running_config parameter must not be empty for state parsed"
+ )
+ result["parsed"] = self.get_ospfv2_facts(data=running_config)
else:
- changed_ospfv2_facts = []
+ changed_ospfv2_facts = {}
if self.state in self.ACTION_STATES:
- result['before'] = existing_ospfv2_facts
- if result['changed']:
- result['after'] = changed_ospfv2_facts
- elif self.state == 'gathered':
- result['gathered'] = changed_ospfv2_facts
+ result["before"] = existing_ospfv2_facts
+ if result["changed"]:
+ result["after"] = changed_ospfv2_facts
+ elif self.state == "gathered":
+ result["gathered"] = changed_ospfv2_facts
- result['warnings'] = warnings
+ result["warnings"] = warnings
return result
def set_config(self, existing_ospfv2_facts):
@@ -117,7 +121,7 @@ class Ospfv2(ConfigBase):
to the desired configuration
"""
- want = self._module.params['config']
+ want = self._module.params["config"]
have = existing_ospfv2_facts
resp = self.set_state(want, have)
return to_list(resp)
@@ -133,15 +137,21 @@ class Ospfv2(ConfigBase):
"""
commands = []
- if self.state in ('merged', 'replaced', 'overridden', 'rendered'
- ) and not w:
- self._module.fail_json(msg='value of config parameter must not be empty for state {0}'.format(self.state))
-
- if self.state == 'deleted':
- commands.extend(self._state_deleted(w, h))
- elif self.state in ('merged', 'rendered'):
+ if (
+ self.state in ("merged", "replaced", "overridden", "rendered")
+ and not w
+ ):
+ self._module.fail_json(
+ msg="value of config parameter must not be empty for state {0}".format(
+ self.state
+ )
+ )
+
+ if self.state == "deleted":
+ commands.extend(self._state_deleted(h))
+ elif self.state in ("merged", "rendered"):
commands.extend(self._state_merged(w, h))
- elif self.state == 'replaced':
+ elif self.state == "replaced":
commands.extend(self._state_replaced(w, h))
return commands
@@ -170,8 +180,7 @@ class Ospfv2(ConfigBase):
commands = []
if have:
- commands.extend(self._render_ospf_param(have, want,
- opr=False))
+ commands.extend(self._render_ospf_param(have, want, opr=False))
commands.extend(self._render_ospf_param(want, have))
return commands
@@ -187,7 +196,7 @@ class Ospfv2(ConfigBase):
commands.extend(self._render_ospf_param(want, have))
return commands
- def _state_deleted(self, want, have):
+ def _state_deleted(self, have):
""" The command generator when state is deleted
:rtype: A list
@@ -196,26 +205,8 @@ class Ospfv2(ConfigBase):
"""
commands = []
- if want and have:
- for (key, val) in iteritems(want):
- if key in have:
- if key == 'areas':
- h_areas = have.get(key) or []
- key = 'area'
- for area in h_areas:
- h_vlist = area.get('virtual_link') or []
- if h_vlist:
- for vlink in h_vlist:
- cmd = self._compute_command(
- key=key + ' ' + area['area_id'], attr='virtual_link',
- val=vlink['address'], opr=False)
- commands.append(cmd)
- commands.append(self._compute_command(key=key,
- attr=area['area_id'], opr=False))
- commands.append(self._compute_command(attr=key,
- opr=False))
- elif have:
- commands.append('delete protocols ospf')
+ if have:
+ commands.append("delete protocols ospf")
return commands
def _render_ospf_param(self, want, have, opr=True):
@@ -231,16 +222,25 @@ class Ospfv2(ConfigBase):
commands = []
w = deepcopy(remove_empties(want))
- leaf = ('default_metric', 'log_adjacency_changes')
+ leaf = ("default_metric", "log_adjacency_changes")
if w:
for (key, val) in iteritems(w):
if opr and key in leaf and not _is_w_same(w, have, key):
- commands.append(self._form_attr_cmd(attr=key,
- val=_bool_to_str(val), opr=opr))
+ commands.append(
+ self._form_attr_cmd(
+ attr=key, val=_bool_to_str(val), opr=opr
+ )
+ )
elif not opr and key in leaf and not _in_target(have, key):
- commands.append(self._form_attr_cmd(attr=key, val=_bool_to_str(val), opr=opr))
+ commands.append(
+ self._form_attr_cmd(
+ attr=key, val=_bool_to_str(val), opr=opr
+ )
+ )
else:
- commands.extend(self._render_child_param(w, have, key, opr))
+ commands.extend(
+ self._render_child_param(w, have, key, opr)
+ )
return commands
def _render_child_param(self, w, h, key, opr=True):
@@ -255,22 +255,23 @@ class Ospfv2(ConfigBase):
"""
commands = []
- if key in ('neighbor', 'redistribute'):
- commands.extend(self._render_list_dict_param(key, w, h,
- opr=opr))
- elif key in ('default_information', 'max_metric'):
- commands.extend(self._render_nested_dict_param(key, w, h,
- opr=opr))
- elif key in ('mpls_te', 'auto_cost', 'parameters', 'auto_cost'):
+ if key in ("neighbor", "redistribute"):
+ commands.extend(self._render_list_dict_param(key, w, h, opr=opr))
+ elif key in ("default_information", "max_metric"):
+ commands.extend(self._render_nested_dict_param(key, w, h, opr=opr))
+ elif key in ("mpls_te", "auto_cost", "parameters", "auto_cost"):
commands.extend(self._render_dict_param(key, w, h, opr=opr))
- elif key in ('route_map', 'passive_interface',
- 'passive_interface_exclude'):
+ elif key in (
+ "route_map",
+ "passive_interface",
+ "passive_interface_exclude",
+ ):
commands.extend(self._render_list_param(key, w, h, opr=opr))
- elif key == 'areas':
+ elif key == "areas":
commands.extend(self._render_areas(key, w, h, opr=opr))
- elif key == 'timers':
+ elif key == "timers":
commands.extend(self._render_timers(key, w, h, opr=opr))
- elif key == 'distance':
+ elif key == "distance":
commands.extend(self._render_distance(key, w, h, opr=opr))
return commands
@@ -291,24 +292,50 @@ class Ospfv2(ConfigBase):
if not opr and not h:
commands.append(self._form_attr_cmd(attr=attr, opr=opr))
elif want[attr]:
- leaf_dict = {'auto_cost': 'reference_bandwidth',
- 'mpls_te': ('enabled', 'router_address'),
- 'parameters': ('router_id', 'abr_type',
- 'opaque_lsa', 'rfc1583_compatibility')}
+ leaf_dict = {
+ "auto_cost": "reference_bandwidth",
+ "mpls_te": ("enabled", "router_address"),
+ "parameters": (
+ "router_id",
+ "abr_type",
+ "opaque_lsa",
+ "rfc1583_compatibility",
+ ),
+ }
leaf = leaf_dict[attr]
for (item, value) in iteritems(want[attr]):
- if opr and item in leaf and not _is_w_same(want[attr], h, item):
- if item == 'enabled':
- item = 'enable'
- if item in ('opaque_lsa', 'enable', 'rfc1583_compatibility'):
- commands.append(self._form_attr_cmd(key=attr, attr=item, opr=opr))
+ if (
+ opr
+ and item in leaf
+ and not _is_w_same(want[attr], h, item)
+ ):
+ if item == "enabled":
+ item = "enable"
+ if item in (
+ "opaque_lsa",
+ "enable",
+ "rfc1583_compatibility",
+ ):
+ commands.append(
+ self._form_attr_cmd(key=attr, attr=item, opr=opr)
+ )
else:
- commands.append(self._form_attr_cmd(key=attr, attr=item, val=value, opr=opr))
+ commands.append(
+ self._form_attr_cmd(
+ key=attr, attr=item, val=value, opr=opr
+ )
+ )
elif not opr and item in leaf and not _in_target(h, item):
- if item == 'enabled':
- commands.append(self._form_attr_cmd(key=attr, attr='enable', opr=opr))
+ if item == "enabled":
+ commands.append(
+ self._form_attr_cmd(
+ key=attr, attr="enable", opr=opr
+ )
+ )
else:
- commands.append(self._form_attr_cmd(key=attr, attr=item, opr=opr))
+ commands.append(
+ self._form_attr_cmd(key=attr, attr=item, opr=opr)
+ )
return commands
def _render_list_param(self, attr, want, have, cmd=None, opr=True):
@@ -334,24 +361,31 @@ class Ospfv2(ConfigBase):
if opr:
members = list_diff_want_only(w, h)
for member in members:
- command = cmd + attr.replace('_', '-') + ' '
- if attr == 'network':
- command += member['address']
+ command = cmd + attr.replace("_", "-") + " "
+ if attr == "network":
+ command += member["address"]
else:
command += member
commands.append(command)
elif not opr:
if h:
for member in w:
- if attr == 'network':
- if not self.search_obj_in_have(h, member, 'address'):
- commands.append(cmd + attr.replace('_','-') +
- ' ' + member['address'])
+ if attr == "network":
+ if not self.search_obj_in_have(
+ h, member, "address"
+ ):
+ commands.append(
+ cmd
+ + attr.replace("_", "-")
+ + " "
+ + member["address"]
+ )
elif member not in h:
- commands.append(cmd + attr.replace('_', '-') +
- ' ' + member)
+ commands.append(
+ cmd + attr.replace("_", "-") + " " + member
+ )
else:
- commands.append(cmd + ' ' + attr.replace('_', '-'))
+ commands.append(cmd + " " + attr.replace("_", "-"))
return commands
def _render_vlink(self, attr, want, have, cmd=None, opr=True):
@@ -368,53 +402,81 @@ class Ospfv2(ConfigBase):
commands = []
h = []
- name = {'virtual_link': 'address'}
- leaf_dict = {'virtual_link': ('address', 'dead_interval',
- 'transmit_delay', 'hello_interval',
- 'retransmit_interval')}
+ name = {"virtual_link": "address"}
+ leaf_dict = {
+ "virtual_link": (
+ "address",
+ "dead_interval",
+ "transmit_delay",
+ "hello_interval",
+ "retransmit_interval",
+ )
+ }
leaf = leaf_dict[attr]
w = want.get(attr) or []
if have:
h = have.get(attr) or []
if not opr and not h:
- commands.append(cmd + attr.replace('_', '-'))
+ commands.append(cmd + attr.replace("_", "-"))
elif w:
for w_item in w:
for (key, val) in iteritems(w_item):
if not cmd:
cmd = self._compute_command(opr=opr)
h_item = self.search_obj_in_have(h, w_item, name[attr])
- if opr and key in leaf and not _is_w_same(w_item, h_item, key):
- if key in 'address':
- commands.append(cmd
- + attr.replace('_', '-')
- + ' ' + str(val))
+ if (
+ opr
+ and key in leaf
+ and not _is_w_same(w_item, h_item, key)
+ ):
+ if key in "address":
+ commands.append(
+ cmd + attr.replace("_", "-") + " " + str(val)
+ )
else:
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + w_item[name[attr]]
- + ' ' + key.replace('_', '-')
- + ' ' + str(val))
- elif not opr and key in leaf and not _in_target(h_item, key):
- if key in 'address':
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + str(val))
+ commands.append(
+ cmd
+ + attr.replace("_", "-")
+ + " "
+ + w_item[name[attr]]
+ + " "
+ + key.replace("_", "-")
+ + " "
+ + str(val)
+ )
+ elif (
+ not opr and key in leaf and not _in_target(h_item, key)
+ ):
+ if key in "address":
+ commands.append(
+ cmd + attr.replace("_", "-") + " " + str(val)
+ )
else:
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + w_item[name[attr]]
- + ' ' + key)
- elif key == 'authentication':
- commands.extend(self._render_vlink_auth(
- attr,
- key,
- w_item,
- h_item,
- w_item['address'],
- cmd,
- opr,
- ))
+ commands.append(
+ cmd
+ + attr.replace("_", "-")
+ + " "
+ + w_item[name[attr]]
+ + " "
+ + key
+ )
+ elif key == "authentication":
+ commands.extend(
+ self._render_vlink_auth(
+ attr,
+ key,
+ w_item,
+ h_item,
+ w_item["address"],
+ cmd,
+ opr,
+ )
+ )
return commands
- def _render_vlink_auth(self, attr, key, want, have, address, cmd=None, opr=True):
+ def _render_vlink_auth(
+ self, attr, key, want, have, address, cmd=None, opr=True
+ ):
"""
This function forms the set/delete commands based on the 'opr' type
for attributes with in desired list of dictionary.
@@ -432,9 +494,8 @@ class Ospfv2(ConfigBase):
w = want.get(key) or {}
if have:
h = have.get(key) or {}
- cmd += attr.replace('_', '-') + ' ' + address + ' ' + key + ' '
- commands.extend(self._render_list_dict_param('md5', w, h, cmd,
- opr))
+ cmd += attr.replace("_", "-") + " " + address + " " + key + " "
+ commands.extend(self._render_list_dict_param("md5", w, h, cmd, opr))
return commands
def _render_list_dict_param(self, attr, want, have, cmd=None, opr=True):
@@ -452,20 +513,30 @@ class Ospfv2(ConfigBase):
commands = []
h = []
name = {
- 'redistribute': 'route_type',
- 'neighbor': 'neighbor_id',
- 'range': 'address',
- 'md5': 'key_id',
- 'vlink': 'address',
- }
+ "redistribute": "route_type",
+ "neighbor": "neighbor_id",
+ "range": "address",
+ "md5": "key_id",
+ "vlink": "address",
+ }
leaf_dict = {
- 'md5': 'md5_key',
- 'redistribute': ('metric', 'route_map', 'route_type', 'metric_type'),
- 'neighbor': ('priority', 'poll_interval', 'neighbor_id'),
- 'range': ('cost', 'address', 'substitute', 'not_advertise'),
- 'vlink': ('address', 'dead_interval', 'transmit_delay',
- 'hello_interval', 'retransmit_interval'),
- }
+ "md5": "md5_key",
+ "redistribute": (
+ "metric",
+ "route_map",
+ "route_type",
+ "metric_type",
+ ),
+ "neighbor": ("priority", "poll_interval", "neighbor_id"),
+ "range": ("cost", "address", "substitute", "not_advertise"),
+ "vlink": (
+ "address",
+ "dead_interval",
+ "transmit_delay",
+ "hello_interval",
+ "retransmit_interval",
+ ),
+ }
leaf = leaf_dict[attr]
w = want.get(attr) or []
if have:
@@ -478,39 +549,81 @@ class Ospfv2(ConfigBase):
if not cmd:
cmd = self._compute_command(opr=opr)
h_item = self.search_obj_in_have(h, w_item, name[attr])
- if opr and key in leaf and not _is_w_same(w_item, h_item, key):
- if key in ('route_type', 'neighbor_id',
- 'address', 'key_id'):
- commands.append(cmd + attr + ' ' + str(val))
- elif key == 'cost':
- commands.append(cmd + attr
- + ' ' + w_item[name[attr]]
- + ' ' + key
- + ' ' + str(val))
- elif key == 'not_advertise':
- commands.append(cmd + attr
- + ' ' + w_item[name[attr]]
- + ' ' + key.replace('_', '-'))
- elif key == 'md5_key':
- commands.append(cmd + attr
- + ' ' + 'key-id'
- + ' ' + str(w_item[name[attr]])
- + ' ' + key.replace('_', '-')
- + ' ' + w_item[key])
+ if (
+ opr
+ and key in leaf
+ and not _is_w_same(w_item, h_item, key)
+ ):
+ if key in (
+ "route_type",
+ "neighbor_id",
+ "address",
+ "key_id",
+ ):
+ commands.append(cmd + attr + " " + str(val))
+ elif key == "cost":
+ commands.append(
+ cmd
+ + attr
+ + " "
+ + w_item[name[attr]]
+ + " "
+ + key
+ + " "
+ + str(val)
+ )
+ elif key == "not_advertise":
+ commands.append(
+ cmd
+ + attr
+ + " "
+ + w_item[name[attr]]
+ + " "
+ + key.replace("_", "-")
+ )
+ elif key == "md5_key":
+ commands.append(
+ cmd
+ + attr
+ + " "
+ + "key-id"
+ + " "
+ + str(w_item[name[attr]])
+ + " "
+ + key.replace("_", "-")
+ + " "
+ + w_item[key]
+ )
else:
- commands.append(cmd + attr
- + ' ' + w_item[name[attr]]
- + ' ' + key.replace('_', '-')
- + ' ' + str(val))
- elif not opr and key in leaf \
- and not _in_target(h_item, key):
- if key in ('route_type', 'neighbor_id',
- 'address', 'key_id'):
- commands.append(cmd + attr + ' ' + str(val))
+ commands.append(
+ cmd
+ + attr
+ + " "
+ + w_item[name[attr]]
+ + " "
+ + key.replace("_", "-")
+ + " "
+ + str(val)
+ )
+ elif (
+ not opr and key in leaf and not _in_target(h_item, key)
+ ):
+ if key in (
+ "route_type",
+ "neighbor_id",
+ "address",
+ "key_id",
+ ):
+ commands.append(cmd + attr + " " + str(val))
else:
- commands.append(cmd + attr
- + ' ' + w_item[name[attr]]
- + ' ' + key)
+ commands.append(
+ cmd
+ + attr
+ + " "
+ + w_item[name[attr]]
+ + " "
+ + key
+ )
return commands
def _render_nested_dict_param(self, attr, want, have, opr=True):
@@ -526,10 +639,19 @@ class Ospfv2(ConfigBase):
"""
commands = []
- attr_dict = {'default_information': 'originate',
- 'max_metric': 'router_lsa'}
- leaf_dict = {'default_information': ('always', 'metric', 'metric_type', 'route_map'),
- 'max_metric': ('administrative', 'on_startup', 'on_shutdown')}
+ attr_dict = {
+ "default_information": "originate",
+ "max_metric": "router_lsa",
+ }
+ leaf_dict = {
+ "default_information": (
+ "always",
+ "metric",
+ "metric_type",
+ "route_map",
+ ),
+ "max_metric": ("administrative", "on_startup", "on_shutdown"),
+ }
h = {}
w = want.get(attr) or {}
if have:
@@ -546,20 +668,38 @@ class Ospfv2(ConfigBase):
if h and key in h.keys():
h_attrib = h.get(key) or {}
for (item, val) in iteritems(w[key]):
- if opr and item in leaf and not _is_w_same(w[key], h_attrib, item):
- if item in ('administrative', 'always') and val:
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + key.replace('_', '-')
- + ' ' + item.replace('_', '-'))
- elif item not in ('administrative', 'always'):
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + key.replace('_', '-')
- + ' ' + item.replace('_', '-')
- + ' ' + str(val))
- elif not opr and item in leaf \
- and not _in_target(h_attrib, item):
-
- commands.append(cmd + attr + ' ' + item)
+ if (
+ opr
+ and item in leaf
+ and not _is_w_same(w[key], h_attrib, item)
+ ):
+ if item in ("administrative", "always") and val:
+ commands.append(
+ cmd
+ + attr.replace("_", "-")
+ + " "
+ + key.replace("_", "-")
+ + " "
+ + item.replace("_", "-")
+ )
+ elif item not in ("administrative", "always"):
+ commands.append(
+ cmd
+ + attr.replace("_", "-")
+ + " "
+ + key.replace("_", "-")
+ + " "
+ + item.replace("_", "-")
+ + " "
+ + str(val)
+ )
+ elif (
+ not opr
+ and item in leaf
+ and not _in_target(h_attrib, item)
+ ):
+
+ commands.append(cmd + attr + " " + item)
return commands
def _render_areas(self, attr, want, have, opr=True):
@@ -576,43 +716,84 @@ class Ospfv2(ConfigBase):
commands = []
h_lst = {}
w_lst = want.get(attr) or []
- l_set = ('area_id', 'shortcut', 'authentication')
+ l_set = ("area_id", "shortcut", "authentication")
if have:
h_lst = have.get(attr) or []
if not opr and not h_lst:
- commands.append(self._form_attr_cmd(attr='area', opr=opr))
+ commands.append(self._form_attr_cmd(attr="area", opr=opr))
elif w_lst:
for w_area in w_lst:
- cmd = self._compute_command(
- key='area', attr=_bool_to_str(w_area['area_id']), opr=opr
- ) + ' '
- h_area = self.search_obj_in_have(h_lst, w_area, 'area_id')
+ cmd = (
+ self._compute_command(
+ key="area",
+ attr=_bool_to_str(w_area["area_id"]),
+ opr=opr,
+ )
+ + " "
+ )
+ h_area = self.search_obj_in_have(h_lst, w_area, "area_id")
if not opr and not h_area:
- commands.append(self._form_attr_cmd(key='area',
- attr=w_area['area_id'], opr=opr))
+ commands.append(
+ self._form_attr_cmd(
+ key="area", attr=w_area["area_id"], opr=opr
+ )
+ )
else:
for (key, val) in iteritems(w_area):
- if opr and key in l_set and not _is_w_same(w_area, h_area, key):
- if key == 'area_id':
- commands.append(self._form_attr_cmd(attr='area',
- val=_bool_to_str(val), opr=opr))
+ if (
+ opr
+ and key in l_set
+ and not _is_w_same(w_area, h_area, key)
+ ):
+ if key == "area_id":
+ commands.append(
+ self._form_attr_cmd(
+ attr="area",
+ val=_bool_to_str(val),
+ opr=opr,
+ )
+ )
else:
- commands.append(cmd + key + ' ' +
- _bool_to_str(val).replace('_', '-'))
+ commands.append(
+ cmd
+ + key
+ + " "
+ + _bool_to_str(val).replace("_", "-")
+ )
elif not opr and key in l_set:
- if key == 'area_id' and not _in_target(h_area, key):
+ if key == "area_id" and not _in_target(
+ h_area, key
+ ):
commands.append(cmd)
continue
- elif key != 'area_id' and not _in_target(h_area, key):
- commands.append(cmd + val + ' ' + key)
- elif key == 'area_type':
- commands.extend(self._render_area_type(w_area, h_area, key, cmd, opr))
- elif key == 'network':
- commands.extend(self._render_list_param(key, w_area, h_area, cmd, opr))
- elif key == 'range':
- commands.extend(self._render_list_dict_param(key, w_area, h_area, cmd, opr))
- elif key == 'virtual_link':
- commands.extend(self._render_vlink(key, w_area, h_area, cmd, opr))
+ elif key != "area_id" and not _in_target(
+ h_area, key
+ ):
+ commands.append(cmd + val + " " + key)
+ elif key == "area_type":
+ commands.extend(
+ self._render_area_type(
+ w_area, h_area, key, cmd, opr
+ )
+ )
+ elif key == "network":
+ commands.extend(
+ self._render_list_param(
+ key, w_area, h_area, cmd, opr
+ )
+ )
+ elif key == "range":
+ commands.extend(
+ self._render_list_dict_param(
+ key, w_area, h_area, cmd, opr
+ )
+ )
+ elif key == "virtual_link":
+ commands.extend(
+ self._render_vlink(
+ key, w_area, h_area, cmd, opr
+ )
+ )
return commands
def _render_area_type(self, want, have, attr, cmd, opr=True):
@@ -633,24 +814,36 @@ class Ospfv2(ConfigBase):
if have:
h_type = have.get(attr) or {}
if not opr and not h_type:
- commands.append(cmd + attr.replace('_', '-'))
+ commands.append(cmd + attr.replace("_", "-"))
elif w_type:
- key = 'normal'
- if opr and key in w_type.keys() and not _is_w_same(w_type, h_type, key):
+ key = "normal"
+ if (
+ opr
+ and key in w_type.keys()
+ and not _is_w_same(w_type, h_type, key)
+ ):
if not w_type[key] and h_type and h_type[key]:
- commands.append(cmd.replace('set', 'delete')
- + attr.replace('_', '-')
- + ' ' + key)
+ commands.append(
+ cmd.replace("set", "delete")
+ + attr.replace("_", "-")
+ + " "
+ + key
+ )
elif w_type[key]:
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + key)
- elif not opr and key in w_type.keys() and not (h_type
- and key in h_type.keys()):
- commands.append(cmd + want['area']
- + ' ' + attr.replace('_', '-'))
-
- a_type = {'nssa': ('set', 'default_cost', 'no_summary', 'translate'),
- 'stub': ('set', 'default_cost', 'no_summary')}
+ commands.append(cmd + attr.replace("_", "-") + " " + key)
+ elif (
+ not opr
+ and key in w_type.keys()
+ and not (h_type and key in h_type.keys())
+ ):
+ commands.append(
+ cmd + want["area"] + " " + attr.replace("_", "-")
+ )
+
+ a_type = {
+ "nssa": ("set", "default_cost", "no_summary", "translate"),
+ "stub": ("set", "default_cost", "no_summary"),
+ }
for key in a_type:
w_area = want[attr].get(key) or {}
h_area = {}
@@ -658,29 +851,53 @@ class Ospfv2(ConfigBase):
if h_type and key in h_type.keys():
h_area = h_type.get(key) or {}
for (item, val) in iteritems(w_type[key]):
- if opr and item in a_type[key] \
- and not _is_w_same(w_type[key], h_area, item):
- if item == 'set' and val:
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + key)
+ if (
+ opr
+ and item in a_type[key]
+ and not _is_w_same(w_type[key], h_area, item)
+ ):
+ if item == "set" and val:
+ commands.append(
+ cmd + attr.replace("_", "-") + " " + key
+ )
elif not val and h_area and h_area[item]:
- commands.append(cmd.replace('set', 'delete')
- + attr.replace('_', '-')
- + ' ' + key)
- elif item != 'set':
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + key
- + ' ' + item.replace('_', '-')
- + ' ' + str(val))
- elif not opr and item in a_type[key] \
- and not (h_type and key in h_type):
- if item == 'set':
- commands.append(cmd + attr.replace('_', '-')
- + ' ' + key)
+ commands.append(
+ cmd.replace("set", "delete")
+ + attr.replace("_", "-")
+ + " "
+ + key
+ )
+ elif item != "set":
+ commands.append(
+ cmd
+ + attr.replace("_", "-")
+ + " "
+ + key
+ + " "
+ + item.replace("_", "-")
+ + " "
+ + str(val)
+ )
+ elif (
+ not opr
+ and item in a_type[key]
+ and not (h_type and key in h_type)
+ ):
+ if item == "set":
+ commands.append(
+ cmd + attr.replace("_", "-") + " " + key
+ )
else:
- commands.append(cmd + want['area']
- + ' ' + attr.replace('_', '-')
- + ' ' + key + ' ' + item.replace('_', '-'))
+ commands.append(
+ cmd
+ + want["area"]
+ + " "
+ + attr.replace("_", "-")
+ + " "
+ + key
+ + " "
+ + item.replace("_", "-")
+ )
return commands
def _form_attr_cmd(self, key=None, attr=None, val=None, opr=True):
@@ -693,9 +910,13 @@ class Ospfv2(ConfigBase):
:return: generated command.
"""
- return self._compute_command(key, attr=self._map_attrib(attr), val=val, opr=opr)
+ return self._compute_command(
+ key, attr=self._map_attrib(attr), val=val, opr=opr
+ )
- def _compute_command(self, key=None, attr=None, val=None, remove=False, opr=True):
+ def _compute_command(
+ self, key=None, attr=None, val=None, remove=False, opr=True
+ ):
"""
This function construct the add/delete command based on passed attributes.
:param key: parent key.
@@ -706,13 +927,13 @@ class Ospfv2(ConfigBase):
"""
if remove or not opr:
- cmd = 'delete protocols ospf '
+ cmd = "delete protocols ospf "
else:
- cmd = 'set protocols ospf '
+ cmd = "set protocols ospf "
if key:
- cmd += key.replace('_', '-') + ' '
+ cmd += key.replace("_", "-") + " "
if attr:
- cmd += attr.replace('_', '-')
+ cmd += attr.replace("_", "-")
if val:
cmd += " '" + str(val) + "'"
return cmd
@@ -725,5 +946,4 @@ class Ospfv2(ConfigBase):
:return: regex string
"""
- return ('disable' if attrib == 'disabled'
- else attrib.replace('_', '-'))
+ return "disable" if attrib == "disabled" else attrib.replace("_", "-")
diff --git a/plugins/module_utils/network/vyos/facts/facts.py b/plugins/module_utils/network/vyos/facts/facts.py
index 17c7aa3..f1221f6 100644
--- a/plugins/module_utils/network/vyos/facts/facts.py
+++ b/plugins/module_utils/network/vyos/facts/facts.py
@@ -43,7 +43,7 @@ from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.firew
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.ospfv3.ospfv3 import (
Ospfv3Facts,
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.ospfv2.ospfv2 import (
- Ospfv2Facts,
+ Ospfv2Facts,
)
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.legacy.base import (
Default,
diff --git a/plugins/module_utils/network/vyos/facts/ospfv2/ospfv2.py b/plugins/module_utils/network/vyos/facts/ospfv2/ospfv2.py
index 0467b72..d62fa9a 100644
--- a/plugins/module_utils/network/vyos/facts/ospfv2/ospfv2.py
+++ b/plugins/module_utils/network/vyos/facts/ospfv2/ospfv2.py
@@ -15,9 +15,13 @@ __metaclass__ = type
from re import findall, search, M
from copy import deepcopy
-from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import utils
+from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import (
+ utils,
+)
-from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.ospfv2.ospfv2 import Ospfv2Args
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.ospfv2.ospfv2 import (
+ Ospfv2Args,
+)
class Ospfv2Facts(object):
@@ -26,11 +30,8 @@ class Ospfv2Facts(object):
"""
def __init__(
- self,
- module,
- subspec='config',
- options='options',
- ):
+ self, module, subspec="config", options="options",
+ ):
self._module = module
self.argument_spec = Ospfv2Args.argument_spec
@@ -69,9 +70,9 @@ class Ospfv2Facts(object):
if ospfv2:
objs = self.render_config(ospfv2)
facts = {}
- params = utils.validate_config(self.argument_spec,{'config': objs})
- facts['ospfv2'] = utils.remove_empties(params['config'])
- ansible_facts['ansible_network_resources'].update(facts)
+ params = utils.validate_config(self.argument_spec, {"config": objs})
+ facts["ospfv2"] = utils.remove_empties(params["config"])
+ ansible_facts["ansible_network_resources"].update(facts)
return ansible_facts
def render_config(self, conf):
@@ -82,25 +83,35 @@ class Ospfv2Facts(object):
:returns: The generated config
"""
- conf = '\n'.join(filter(lambda x: x, conf))
- a_lst = ['default_metric', 'log_adjacency_changes']
+ conf = "\n".join(filter(lambda x: x, conf))
+ a_lst = ["default_metric", "log_adjacency_changes"]
config = self.parse_attr(conf, a_lst)
if not config:
config = {}
- config['timers'] = self.parse_timers(conf)
- config['auto_cost'] = self.parse_auto_cost(conf)
- config['distance'] = self.parse_distance(conf)
- config['max_metric'] = self.parse_max_metric(conf)
- config['default_information'] = self.parse_def_info(conf)
- config['route_map'] = self.parse_leaf_list(conf, 'route-map')
- config['mpls_te'] = self.parse_attrib(conf, 'mpls_te', 'mpls-te')
- config['areas'] = self.parse_attrib_list(conf, 'area', 'area_id')
- config['parameters'] = self.parse_attrib(conf, 'parameters', 'parameters')
- config['neighbor'] = self.parse_attrib_list(conf, 'neighbor', 'neighbor_id')
- config['passive_interface'] = self.parse_leaf_list(conf, 'passive-interface')
- config['redistribute'] = self.parse_attrib_list(conf, 'redistribute', 'route_type')
- config['passive_interface_exclude'] = self.parse_leaf_list(conf, 'passive-interface-exclude')
+ config["timers"] = self.parse_timers(conf)
+ config["auto_cost"] = self.parse_auto_cost(conf)
+ config["distance"] = self.parse_distance(conf)
+ config["max_metric"] = self.parse_max_metric(conf)
+ config["default_information"] = self.parse_def_info(conf)
+ config["route_map"] = self.parse_leaf_list(conf, "route-map")
+ config["mpls_te"] = self.parse_attrib(conf, "mpls_te", "mpls-te")
+ config["areas"] = self.parse_attrib_list(conf, "area", "area_id")
+ config["parameters"] = self.parse_attrib(
+ conf, "parameters", "parameters"
+ )
+ config["neighbor"] = self.parse_attrib_list(
+ conf, "neighbor", "neighbor_id"
+ )
+ config["passive_interface"] = self.parse_leaf_list(
+ conf, "passive-interface"
+ )
+ config["redistribute"] = self.parse_attrib_list(
+ conf, "redistribute", "route_type"
+ )
+ config["passive_interface_exclude"] = self.parse_leaf_list(
+ conf, "passive-interface-exclude"
+ )
return config
def parse_timers(self, conf):
@@ -111,8 +122,8 @@ class Ospfv2Facts(object):
"""
cfg_dict = {}
- cfg_dict['refresh'] = self.parse_refresh(conf, 'refresh')
- cfg_dict['throttle'] = self.parse_throttle(conf, 'spf')
+ cfg_dict["refresh"] = self.parse_refresh(conf, "refresh")
+ cfg_dict["throttle"] = self.parse_throttle(conf, "spf")
return cfg_dict
def parse_throttle(self, conf, attrib=None):
@@ -135,7 +146,7 @@ class Ospfv2Facts(object):
:return: generated config dictionary
"""
- cfg_dict = self.parse_attr(conf, ['timers'], match=attrib)
+ cfg_dict = self.parse_attr(conf, ["timers"], match=attrib)
return cfg_dict
def parse_leaf_list(self, conf, attrib):
@@ -148,10 +159,11 @@ class Ospfv2Facts(object):
"""
lst = []
- items = findall(r"^" + attrib + " (?:\'*)(\\S+)(?:\'*)", conf, M)
+ items = findall(r"^" + attrib + " (?:'*)(\\S+)(?:'*)", conf, M)
if items:
for i in set(items):
lst.append(i.strip("'"))
+ lst.sort()
return lst
def parse_distance(self, conf, attrib=None):
@@ -162,8 +174,8 @@ class Ospfv2Facts(object):
:return: generated config dictionary
"""
- cfg_dict = self.parse_attr(conf, ['global'], match=attrib)
- cfg_dict['ospf'] = self.parse_ospf(conf, 'ospf')
+ cfg_dict = self.parse_attr(conf, ["global"], match=attrib)
+ cfg_dict["ospf"] = self.parse_ospf(conf, "ospf")
return cfg_dict
def parse_ospf(self, conf, attrib=None):
@@ -174,7 +186,7 @@ class Ospfv2Facts(object):
:return: generated config dictionary
"""
- cfg_dict = self.parse_attrib(conf, 'ospf', match=attrib)
+ cfg_dict = self.parse_attrib(conf, "ospf", match=attrib)
return cfg_dict
def parse_max_metric(self, conf):
@@ -185,7 +197,9 @@ class Ospfv2Facts(object):
"""
cfg_dict = {}
- cfg_dict['router_lsa'] = self.parse_attrib(conf, 'router_lsa', match='router-lsa')
+ cfg_dict["router_lsa"] = self.parse_attrib(
+ conf, "router_lsa", match="router-lsa"
+ )
return cfg_dict
def parse_auto_cost(self, conf, attrib=None):
@@ -196,8 +210,7 @@ class Ospfv2Facts(object):
:return: generated config dictionary
"""
- cfg_dict = self.parse_attr(conf, ['reference_bandwidth'],
- match=attrib)
+ cfg_dict = self.parse_attr(conf, ["reference_bandwidth"], match=attrib)
return cfg_dict
def parse_def_info(self, conf):
@@ -208,7 +221,9 @@ class Ospfv2Facts(object):
"""
cfg_dict = {}
- cfg_dict['originate'] = self.parse_attrib(conf, 'originate', 'originate')
+ cfg_dict["originate"] = self.parse_attrib(
+ conf, "originate", "originate"
+ )
return cfg_dict
def parse_area(self, conf, area_id):
@@ -219,13 +234,15 @@ class Ospfv2Facts(object):
:return: generated rule configuration dictionary.
"""
- rule = self.parse_attrib(conf, 'area_id', match=area_id)
+ rule = self.parse_attrib(conf, "area_id", match=area_id)
r_sub = {
- 'area_type': self.parse_area_type(conf, 'area-type'),
- 'network': self.parse_network(conf),
- 'range': self.parse_attrib_list(conf, 'range', 'address'),
- 'virtual_link': self.parse_attrib_list(conf, 'virtual-link', 'address'),
- }
+ "area_type": self.parse_area_type(conf, "area-type"),
+ "network": self.parse_network(conf),
+ "range": self.parse_attrib_list(conf, "range", "address"),
+ "virtual_link": self.parse_attrib_list(
+ conf, "virtual-link", "address"
+ ),
+ }
rule.update(r_sub)
return rule
@@ -237,7 +254,7 @@ class Ospfv2Facts(object):
:return: generated rule configuration dictionary.
"""
- rule = self.parse_attrib(conf, 'key_id', match=key_id)
+ rule = self.parse_attrib(conf, "key_id", match=key_id)
return rule
def parse_area_type(self, conf, attrib=None):
@@ -248,9 +265,9 @@ class Ospfv2Facts(object):
:return: generated config dictionary
"""
- cfg_dict = self.parse_attr(conf, ['normal'], match=attrib)
- cfg_dict['nssa'] = self.parse_attrib(conf, 'nssa', match='nssa')
- cfg_dict['stub'] = self.parse_attrib(conf, 'stub', match='stub')
+ cfg_dict = self.parse_attr(conf, ["normal"], match=attrib)
+ cfg_dict["nssa"] = self.parse_attrib(conf, "nssa", match="nssa")
+ cfg_dict["stub"] = self.parse_attrib(conf, "stub", match="stub")
return cfg_dict
def parse_network(self, conf):
@@ -265,9 +282,9 @@ class Ospfv2Facts(object):
if applications:
app_lst = []
for r in set(applications):
- obj = {'address': r.strip("'")}
+ obj = {"address": r.strip("'")}
app_lst.append(obj)
- a_lst = sorted(app_lst, key=lambda i: i['address'])
+ a_lst = sorted(app_lst, key=lambda i: i["address"])
return a_lst
def parse_vlink(self, conf):
@@ -277,9 +294,10 @@ class Ospfv2Facts(object):
:return: generated rule configuration dictionary
"""
- rule = self.parse_attrib(conf, 'vlink')
- r_sub = {'authentication': self.parse_authentication(conf,
- 'authentication')}
+ rule = self.parse_attrib(conf, "vlink")
+ r_sub = {
+ "authentication": self.parse_authentication(conf, "authentication")
+ }
rule.update(r_sub)
return rule
@@ -291,9 +309,8 @@ class Ospfv2Facts(object):
:return: generated config dictionary
"""
- cfg_dict = self.parse_attr(conf, ['plaintext_password'],
- match=attrib)
- cfg_dict['md5'] = self.parse_attrib_list(conf, 'key-id', 'key_id')
+ cfg_dict = self.parse_attr(conf, ["plaintext_password"], match=attrib)
+ cfg_dict["md5"] = self.parse_attrib_list(conf, "key-id", "key_id")
return cfg_dict
def parse_attrib_list(self, conf, attrib, param):
@@ -307,24 +324,30 @@ class Ospfv2Facts(object):
"""
r_lst = []
- if attrib == 'area':
- items = findall(r"^" + attrib.replace('_', '-')
- + " (?:\'*)(\\S+)(?:\'*)", conf, M)
- elif attrib == 'key-id':
- items = findall(r"^.*" + attrib.replace('_', '-')
- + " (?:\'*)(\\S+)(?:\'*)", conf, M)
+ if attrib == "area":
+ items = findall(
+ r"^" + attrib.replace("_", "-") + " (?:'*)(\\S+)(?:'*)",
+ conf,
+ M,
+ )
+ elif attrib == "key-id":
+ items = findall(
+ r"^.*" + attrib.replace("_", "-") + " (?:'*)(\\S+)(?:'*)",
+ conf,
+ M,
+ )
else:
- items = findall(r"" + attrib + " (?:\'*)(\\S+)(?:\'*)", conf, M)
+ items = findall(r"" + attrib + " (?:'*)(\\S+)(?:'*)", conf, M)
if items:
a_lst = []
for item in set(items):
i_regex = r" %s .+$" % item
- cfg = '\n'.join(findall(i_regex, conf, M))
- if attrib == 'area':
+ cfg = "\n".join(findall(i_regex, conf, M))
+ if attrib == "area":
obj = self.parse_area(cfg, item)
- elif attrib == 'virtual-link':
+ elif attrib == "virtual-link":
obj = self.parse_vlink(cfg)
- elif attrib == 'key-id':
+ elif attrib == "key-id":
obj = self.parse_key(cfg, item)
else:
obj = self.parse_attrib(cfg, attrib)
@@ -342,27 +365,32 @@ class Ospfv2Facts(object):
"""
param_lst = {
- 'key_id': ['md5_key'],
- 'mpls_te': ['enabled', 'router_address'],
- 'area_id': ['shortcut', 'authentication'],
- 'neighbor': ['priority', 'poll_interval'],
- 'stub': ['set', 'default_cost', 'no_summary'],
- 'range': ['cost', 'substitute', 'not_advertise'],
- 'ospf': ['external', 'inter_area', 'intra_area'],
- 'spf': ['delay', 'max_holdtime', 'initial_holdtime'],
- 'redistribute': ['metric', 'metric_type', 'route_map'],
- 'nssa': ['set', 'translate', 'default_cost', 'no_summary'],
- 'config_routes': ['default_metric', 'log_adjacency_changes'
- ],
- 'originate': ['always', 'metric', 'metric_type', 'route_map'
- ],
- 'router_lsa': ['administrative', 'on_shutdown', 'on_startup'
- ],
- 'parameters': ['abr_type', 'opaque_lsa', 'router_id',
- 'rfc1583_compatibility'],
- 'vlink': ['dead_interval', 'hello_interval',
- 'transmit_delay', 'retransmit_interval'],
- }
+ "key_id": ["md5_key"],
+ "mpls_te": ["enabled", "router_address"],
+ "area_id": ["shortcut", "authentication"],
+ "neighbor": ["priority", "poll_interval"],
+ "stub": ["set", "default_cost", "no_summary"],
+ "range": ["cost", "substitute", "not_advertise"],
+ "ospf": ["external", "inter_area", "intra_area"],
+ "spf": ["delay", "max_holdtime", "initial_holdtime"],
+ "redistribute": ["metric", "metric_type", "route_map"],
+ "nssa": ["set", "translate", "default_cost", "no_summary"],
+ "config_routes": ["default_metric", "log_adjacency_changes"],
+ "originate": ["always", "metric", "metric_type", "route_map"],
+ "router_lsa": ["administrative", "on_shutdown", "on_startup"],
+ "parameters": [
+ "abr_type",
+ "opaque_lsa",
+ "router_id",
+ "rfc1583_compatibility",
+ ],
+ "vlink": [
+ "dead_interval",
+ "hello_interval",
+ "transmit_delay",
+ "retransmit_interval",
+ ],
+ }
cfg_dict = self.parse_attr(conf, param_lst[param], match)
return cfg_dict
@@ -382,14 +410,13 @@ class Ospfv2Facts(object):
regex = self.map_regex(attrib)
if match:
- regex = match.replace('_', '-') + ' ' + regex
+ regex = match.replace("_", "-") + " " + regex
if conf:
if self.is_bool(attrib):
- out = conf.find(attrib.replace('_', '-'))
- dis = conf.find(attrib.replace('_', '-')
- + " 'disable'")
+ out = conf.find(attrib.replace("_", "-"))
+ dis = conf.find(attrib.replace("_", "-") + " 'disable'")
if match:
- if attrib == 'set' and conf.find(match) >= 1:
+ if attrib == "set" and conf.find(match) >= 1:
config[attrib] = True
en = conf.find(match + " 'enable'")
if out >= 1:
@@ -400,7 +427,7 @@ class Ospfv2Facts(object):
elif match and en >= 1:
config[attrib] = True
else:
- out = search(r"^.*" + regex + ' (.+)', conf, M)
+ out = search(r"^.*" + regex + " (.+)", conf, M)
if out:
val = out.group(1).strip("'")
if self.is_num(attrib):
@@ -416,9 +443,17 @@ class Ospfv2Facts(object):
:return: regex string
"""
- return ('disable' if attrib == 'disabled' else ('enable'
- if attrib == 'enabled' else ('area' if attrib
- == 'area_id' else attrib.replace('_', '-'))))
+ return (
+ "disable"
+ if attrib == "disabled"
+ else (
+ "enable"
+ if attrib == "enabled"
+ else (
+ "area" if attrib == "area_id" else attrib.replace("_", "-")
+ )
+ )
+ )
def is_bool(self, attrib):
"""
@@ -428,15 +463,15 @@ class Ospfv2Facts(object):
"""
bool_set = (
- 'set',
- 'always',
- 'normal',
- 'enabled',
- 'opaque_lsa',
- 'not_advertise',
- 'administrative',
- 'rfc1583_compatibility',
- )
+ "set",
+ "always",
+ "normal",
+ "enabled",
+ "opaque_lsa",
+ "not_advertise",
+ "administrative",
+ "rfc1583_compatibility",
+ )
return True if attrib in bool_set else False
def is_num(self, attrib):
@@ -447,18 +482,18 @@ class Ospfv2Facts(object):
"""
num_set = (
- 'ospf',
- 'delay',
- 'metric',
- 'inter_area',
- 'intra_area',
- 'on_startup',
- 'metric_type',
- 'on_shutdown',
- 'max_holdtime',
- 'poll_interval',
- 'default_metric',
- 'initial_holdtime',
- 'key_id',
- )
+ "ospf",
+ "delay",
+ "metric",
+ "inter_area",
+ "intra_area",
+ "on_startup",
+ "metric_type",
+ "on_shutdown",
+ "max_holdtime",
+ "poll_interval",
+ "default_metric",
+ "initial_holdtime",
+ "key_id",
+ )
return True if attrib in num_set else False
diff --git a/plugins/module_utils/network/vyos/utils/utils.py b/plugins/module_utils/network/vyos/utils/utils.py
index c539beb..8fa2bfd 100644
--- a/plugins/module_utils/network/vyos/utils/utils.py
+++ b/plugins/module_utils/network/vyos/utils/utils.py
@@ -113,7 +113,7 @@ def get_lst_same_for_dicts(want, have, lst):
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:
@@ -238,7 +238,14 @@ def _bool_to_str(val):
:param val: bool value.
:return: enable/disable.
"""
- return "enable" if str(val) == "True" else "disable" if str(val) == "False" else val
+ return (
+ "enable"
+ if str(val) == "True"
+ else "disable"
+ if str(val) == "False"
+ else val
+ )
+
def _is_w_same(w, h, key):