From f1ae008c4dfedce3c69a028c73add6fb066e0071 Mon Sep 17 00:00:00 2001 From: adeptvin1 <37010056+adeptvin1@users.noreply.github.com> Date: Fri, 21 Aug 2020 21:04:09 +1000 Subject: [PATCH] Update facts (#101) * Update facts.py * Update facts.py * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Update plugins/modules/facts.py Co-authored-by: Egor Zaitsev * Create 101_update_facts.yml * Update plugins/modules/facts.py Co-authored-by: Felix Fontein * Update changelogs/fragments/101_update_facts.yml Co-authored-by: Felix Fontein * add test default function * add test data * Update routing_ospf_neighbor_print_detail_without-paging * add test function "Routing" * added information of version * Removed extra spaces * add one more version, "ansible_net_cpu_load" * remove many blank lines * remove 'too many blank lines' * renamed arhitec to arch * Update facts.py * Update test_facts.py * Update test_facts.py * one more * remove one route * Update test_facts.py * remove one neighbor Co-authored-by: Egor Zaitsev Co-authored-by: Felix Fontein --- changelogs/fragments/101_update_facts.yml | 2 + plugins/modules/facts.py | 234 +++++++++++++++++- .../ip_route_print_detail_without-paging | 19 ++ ...g_bgp_instance_print_detail_without-paging | 10 + ...uting_bgp_peer_print_detail_without-paging | 13 + ...gp_vpnv4-route_print_detail_without-paging | 7 + ..._ospf_instance_print_detail_without-paging | 10 + ..._ospf_neighbor_print_detail_without-paging | 3 + tests/unit/plugins/modules/test_facts.py | 223 +++++++++++++++++ 9 files changed, 519 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/101_update_facts.yml create mode 100644 tests/unit/plugins/modules/fixtures/facts/ip_route_print_detail_without-paging create mode 100644 tests/unit/plugins/modules/fixtures/facts/routing_bgp_instance_print_detail_without-paging create mode 100644 tests/unit/plugins/modules/fixtures/facts/routing_bgp_peer_print_detail_without-paging create mode 100644 tests/unit/plugins/modules/fixtures/facts/routing_bgp_vpnv4-route_print_detail_without-paging create mode 100644 tests/unit/plugins/modules/fixtures/facts/routing_ospf_instance_print_detail_without-paging create mode 100644 tests/unit/plugins/modules/fixtures/facts/routing_ospf_neighbor_print_detail_without-paging diff --git a/changelogs/fragments/101_update_facts.yml b/changelogs/fragments/101_update_facts.yml new file mode 100644 index 0000000..074d5e6 --- /dev/null +++ b/changelogs/fragments/101_update_facts.yml @@ -0,0 +1,2 @@ +minor_changes: + - facts - now also collecting data about BGP and OSPF (https://github.com/ansible-collections/community.network/pull/101). diff --git a/plugins/modules/facts.py b/plugins/modules/facts.py index d018f75..0f46e5a 100644 --- a/plugins/modules/facts.py +++ b/plugins/modules/facts.py @@ -68,6 +68,21 @@ ansible_net_hostname: description: The configured hostname of the device returned: always type: str +ansible_net_arch: + description: The CPU architecture of the device + returned: always + type: str + version_added: 1.2.0 +ansible_net_uptime: + description: The uptime of the device + returned: always + type: str + version_added: 1.2.0 +ansible_net_cpu_load: + description: Current CPU load + returned: always + type: str + version_added: 1.2.0 # hardware ansible_net_spacefree_mb: @@ -110,6 +125,38 @@ ansible_net_neighbors: description: The list of neighbors from the remote device returned: when interfaces is configured type: dict + +# routing +ansible_net_bgp_peer: + description: The dict bgp peer + returned: peer information + type: dict + version_added: 1.2.0 +ansible_net_bgp_vpnv4_route: + description: The dict bgp vpnv4 route + returned: vpnv4 route information + type: dict + version_added: 1.2.0 +ansible_net_bgp_instance: + description: The dict bgp instance + returned: bgp instance information + type: dict + version_added: 1.2.0 +ansible_net_route: + description: The dict routes in all routing table + returned: routes information in all routing table + type: dict + version_added: 1.2.0 +ansible_net_ospf_instance: + description: The dict ospf instance + returned: ospf instance information + type: dict + version_added: 1.2.0 +ansible_net_ospf_neighbor: + description: The dict ospf neighbor + returned: ospf neighbor information + type: dict + version_added: 1.2.0 """ import re @@ -148,11 +195,12 @@ class Default(FactsBase): data = self.responses[0] if data: self.facts['hostname'] = self.parse_hostname(data) - data = self.responses[1] if data: self.facts['version'] = self.parse_version(data) - + self.facts['arch'] = self.parse_arch(data) + self.facts['uptime'] = self.parse_uptime(data) + self.facts['cpu_load'] = self.parse_cpu_load(data) data = self.responses[2] if data: self.facts['model'] = self.parse_model(data) @@ -173,6 +221,21 @@ class Default(FactsBase): if match: return match.group(1) + def parse_arch(self, data): + match = re.search(r'architecture-name:\s(.*)\s*$', data, re.M) + if match: + return match.group(1) + + def parse_uptime(self, data): + match = re.search(r'uptime:\s(.*)\s*$', data, re.M) + if match: + return match.group(1) + + def parse_cpu_load(self, data): + match = re.search(r'cpu-load:\s(.*)\s*$', data, re.M) + if match: + return match.group(1) + def parse_serialnum(self, data): match = re.search(r'serial-number:\s(.*)\s*$', data, re.M) if match: @@ -319,11 +382,178 @@ class Interfaces(FactsBase): yield parsed +class Routing(FactsBase): + + COMMANDS = [ + '/routing bgp peer print detail without-paging', + '/routing bgp vpnv4-route print detail without-paging', + '/routing bgp instance print detail without-paging', + '/ip route print detail without-paging', + '/routing ospf instance print detail without-paging', + '/routing ospf neighbor print detail without-paging' + ] + + DETAIL_RE = re.compile(r'([\w\d\-]+)=\"?(\w{3}/\d{2}/\d{4}\s\d{2}:\d{2}:\d{2}|[\w\d\-\.:/]+)') + WRAPPED_LINE_RE = re.compile(r'^\s+(?!\d)') + + def populate(self): + super(Routing, self).populate() + self.facts['bgp_peer'] = dict() + self.facts['bgp_vpnv4_route'] = dict() + self.facts['bgp_instance'] = dict() + self.facts['route'] = dict() + self.facts['ospf_instance'] = dict() + self.facts['ospf_neighbor'] = dict() + data = self.responses[0] + if data: + peer = self.parse_bgp_peer(data) + self.populate_bgp_peer(peer) + data = self.responses[1] + if data: + vpnv4 = self.parse_vpnv4_route(data) + self.populate_vpnv4_route(vpnv4) + data = self.responses[2] + if data: + instance = self.parse_instance(data) + self.populate_bgp_instance(instance) + data = self.responses[3] + if data: + route = self.parse_route(data) + self.populate_route(route) + data = self.responses[4] + if data: + instance = self.parse_instance(data) + self.populate_ospf_instance(instance) + data = self.responses[5] + if data: + instance = self.parse_ospf_neighbor(data) + self.populate_ospf_neighbor(instance) + + def preprocess(self, data): + preprocessed = list() + for line in data.split('\n'): + if len(line) == 0 or line[:5] == 'Flags': + continue + elif not re.match(self.WRAPPED_LINE_RE, line): + preprocessed.append(line) + else: + preprocessed[-1] += line + return preprocessed + + def parse_name(self, data): + match = re.search(r'name=.(\S+\b)', data, re.M) + if match: + return match.group(1) + + def parse_interface(self, data): + match = re.search(r'interface=([\w\d\-]+)', data, re.M) + if match: + return match.group(1) + + def parse_instance_name(self, data): + match = re.search(r'instance=([\w\d\-]+)', data, re.M) + if match: + return match.group(1) + + def parse_routing_mark(self, data): + match = re.search(r'routing-mark=([\w\d\-]+)', data, re.M) + if match: + return match.group(1) + else: + match = 'main' + return match + + def parse_bgp_peer(self, data): + facts = dict() + data = self.preprocess(data) + for line in data: + name = self.parse_name(line) + facts[name] = dict() + for (key, value) in re.findall(self.DETAIL_RE, line): + facts[name][key] = value + return facts + + def parse_instance(self, data): + facts = dict() + data = self.preprocess(data) + for line in data: + name = self.parse_name(line) + facts[name] = dict() + for (key, value) in re.findall(self.DETAIL_RE, line): + facts[name][key] = value + return facts + + def parse_vpnv4_route(self, data): + facts = dict() + data = self.preprocess(data) + for line in data: + name = self.parse_interface(line) + facts[name] = dict() + for (key, value) in re.findall(self.DETAIL_RE, line): + facts[name][key] = value + return facts + + def parse_route(self, data): + facts = dict() + data = self.preprocess(data) + for line in data: + name = self.parse_routing_mark(line) + facts[name] = dict() + for (key, value) in re.findall(self.DETAIL_RE, line): + facts[name][key] = value + return facts + + def parse_ospf_instance(self, data): + facts = dict() + data = self.preprocess(data) + for line in data: + name = self.parse_name(line) + facts[name] = dict() + for (key, value) in re.findall(self.DETAIL_RE, line): + facts[name][key] = value + return facts + + def parse_ospf_neighbor(self, data): + facts = dict() + data = self.preprocess(data) + for line in data: + name = self.parse_instance_name(line) + facts[name] = dict() + for (key, value) in re.findall(self.DETAIL_RE, line): + facts[name][key] = value + return facts + + def populate_bgp_peer(self, data): + for key, value in iteritems(data): + self.facts['bgp_peer'][key] = value + + def populate_vpnv4_route(self, data): + for key, value in iteritems(data): + self.facts['bgp_vpnv4_route'][key] = value + + def populate_bgp_instance(self, data): + for key, value in iteritems(data): + self.facts['bgp_instance'][key] = value + + def populate_route(self, data): + for key, value in iteritems(data): + self.facts['route'][key] = value + + def populate_ospf_instance(self, data): + for key, value in iteritems(data): + self.facts['ospf_instance'][key] = value + + def populate_ospf_neighbor(self, data): + for key, value in iteritems(data): + self.facts['ospf_neighbor'][key] = value + + FACT_SUBSETS = dict( default=Default, hardware=Hardware, interfaces=Interfaces, config=Config, + routing=Routing, ) VALID_SUBSETS = frozenset(FACT_SUBSETS.keys()) diff --git a/tests/unit/plugins/modules/fixtures/facts/ip_route_print_detail_without-paging b/tests/unit/plugins/modules/fixtures/facts/ip_route_print_detail_without-paging new file mode 100644 index 0000000..6c2e558 --- /dev/null +++ b/tests/unit/plugins/modules/fixtures/facts/ip_route_print_detail_without-paging @@ -0,0 +1,19 @@ +Flags: X - disabled, A - active, D - dynamic, +C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, +B - blackhole, U - unreachable, P - prohibit + 0 ADC dst-address=10.10.66.0/30 pref-src=10.10.66.1 gateway=bridge1 + gateway-status=bridge1 reachable distance=0 scope=10 + routing-mark=altegro + + 2 A S dst-address=0.0.0.0/0 gateway=85.15.75.109 + gateway-status=85.15.75.109 reachable via Internet-VTK distance=1 + scope=30 target-scope=10 + + 3 ADC dst-address=10.10.1.0/30 pref-src=10.10.1.1 gateway=GRE_TYRMA + gateway-status=GRE_TYRMA reachable distance=0 scope=10 + + 4 DC dst-address=10.10.1.4/30 pref-src=10.10.1.5 gateway=RB2011 + gateway-status=RB2011 unreachable distance=255 scope=10 + + 5 ADC dst-address=10.10.2.0/30 pref-src=10.10.2.1 gateway=VLAN_SAT.ROUTER + gateway-status=VLAN_SAT.ROUTER reachable distance=0 scope=10 diff --git a/tests/unit/plugins/modules/fixtures/facts/routing_bgp_instance_print_detail_without-paging b/tests/unit/plugins/modules/fixtures/facts/routing_bgp_instance_print_detail_without-paging new file mode 100644 index 0000000..8c560e2 --- /dev/null +++ b/tests/unit/plugins/modules/fixtures/facts/routing_bgp_instance_print_detail_without-paging @@ -0,0 +1,10 @@ +Flags: * - default, X - disabled + 0 *X name="default" as=65530 router-id=0.0.0.0 redistribute-connected=no + redistribute-static=no redistribute-rip=no redistribute-ospf=no + redistribute-other-bgp=no out-filter="" client-to-client-reflection=yes + ignore-as-path-len=no routing-table="" + + 1 name="MAIN_AS_STARKDV" as=64520 router-id=10.10.50.1 + redistribute-connected=no redistribute-static=no redistribute-rip=no + redistribute-ospf=no redistribute-other-bgp=no out-filter="" + client-to-client-reflection=yes ignore-as-path-len=no routing-table="" diff --git a/tests/unit/plugins/modules/fixtures/facts/routing_bgp_peer_print_detail_without-paging b/tests/unit/plugins/modules/fixtures/facts/routing_bgp_peer_print_detail_without-paging new file mode 100644 index 0000000..1ae4f5b --- /dev/null +++ b/tests/unit/plugins/modules/fixtures/facts/routing_bgp_peer_print_detail_without-paging @@ -0,0 +1,13 @@ +Flags: X - disabled, E - established + 0 E name="iBGP_BRAS.TYRMA" instance=MAIN_AS_STARKDV remote-address=10.10.100.1 + remote-as=64520 tcp-md5-key="" nexthop-choice=default multihop=no + route-reflect=yes hold-time=3m ttl=default in-filter="" out-filter="" + address-families=ip,l2vpn,vpnv4 update-source=LAN_KHV + default-originate=never remove-private-as=no as-override=no passive=no + use-bfd=yes + + 1 E name="iBGP_BRAS_SAT" instance=MAIN_AS_STARKDV remote-address=10.10.50.230 + remote-as=64520 tcp-md5-key="" nexthop-choice=default multihop=no + route-reflect=yes hold-time=3m ttl=default in-filter="" out-filter="" + address-families=ip default-originate=never remove-private-as=no + as-override=no passive=no use-bfd=yes diff --git a/tests/unit/plugins/modules/fixtures/facts/routing_bgp_vpnv4-route_print_detail_without-paging b/tests/unit/plugins/modules/fixtures/facts/routing_bgp_vpnv4-route_print_detail_without-paging new file mode 100644 index 0000000..f64fa6d --- /dev/null +++ b/tests/unit/plugins/modules/fixtures/facts/routing_bgp_vpnv4-route_print_detail_without-paging @@ -0,0 +1,7 @@ +Flags: L - label-present + 0 L route-distinguisher=64520:666 dst-address=10.10.66.8/30 gateway=10.10.100.1 + interface=GRE_TYRMA in-label=6136 out-label=6136 bgp-local-pref=100 + bgp-origin=incomplete bgp-ext-communities="RT:64520:666" + + 1 L route-distinguisher=64520:666 dst-address=10.10.66.0/30 interface=bridge1 + in-label=1790 bgp-ext-communities="RT:64520:666" diff --git a/tests/unit/plugins/modules/fixtures/facts/routing_ospf_instance_print_detail_without-paging b/tests/unit/plugins/modules/fixtures/facts/routing_ospf_instance_print_detail_without-paging new file mode 100644 index 0000000..9640466 --- /dev/null +++ b/tests/unit/plugins/modules/fixtures/facts/routing_ospf_instance_print_detail_without-paging @@ -0,0 +1,10 @@ +Flags: X - disabled, * - default + 0 * name="default" router-id=10.10.50.1 distribute-default=never redistribute-connected=no + redistribute-static=no redistribute-rip=no redistribute-bgp=no redistribute-other-ospf=no + metric-default=1 metric-connected=20 metric-static=20 metric-rip=20 metric-bgp=auto + metric-other-ospf=auto in-filter=ospf-in out-filter=ospf-out + + 1 name="OSPF_ALTEGRO" router-id=10.10.66.1 distribute-default=never redistribute-connected=no + redistribute-static=no redistribute-rip=no redistribute-bgp=no redistribute-other-ospf=no + metric-default=1 metric-connected=20 metric-static=20 metric-rip=20 metric-bgp=auto + metric-other-ospf=auto in-filter=ospf-in out-filter=ospf-out routing-table=altegro diff --git a/tests/unit/plugins/modules/fixtures/facts/routing_ospf_neighbor_print_detail_without-paging b/tests/unit/plugins/modules/fixtures/facts/routing_ospf_neighbor_print_detail_without-paging new file mode 100644 index 0000000..d683b25 --- /dev/null +++ b/tests/unit/plugins/modules/fixtures/facts/routing_ospf_neighbor_print_detail_without-paging @@ -0,0 +1,3 @@ +0 instance=default router-id=10.10.100.1 address=10.10.1.2 interface=GRE_TYRMA priority=1 + dr-address=0.0.0.0 backup-dr-address=0.0.0.0 state="Full" state-changes=15 ls-retransmits=0 + ls-requests=0 db-summaries=0 adjacency=6h8m46s diff --git a/tests/unit/plugins/modules/test_facts.py b/tests/unit/plugins/modules/test_facts.py index d8dcf9c..25fb04e 100644 --- a/tests/unit/plugins/modules/test_facts.py +++ b/tests/unit/plugins/modules/test_facts.py @@ -64,6 +64,12 @@ class TestRouterosFactsModule(TestRouterosModule): self.assertEqual( result['ansible_facts']['ansible_net_serialnum'], '1234567890' ) + self.assertEqual( + result['ansible_facts']['ansible_net_arch'], 'x86' + ) + self.assertEqual( + result['ansible_facts']['ansible_net_uptime'], '3h28m52s' + ) def test_facts_hardware(self): set_module_args(dict(gather_subset='hardware')) @@ -117,3 +123,220 @@ class TestRouterosFactsModule(TestRouterosModule): result = interfaces.populate_addresses(data=addresses, family='ipv6') self.assertEqual(result, None) + + def test_facts_routing(self): + set_module_args(dict(gather_subset='routing')) + result = self.execute_module() + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['name'], ['iBGP_BRAS.TYRMA'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['instance'], ['MAIN_AS_STARKDV'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['remote-address'], ['10.10.100.1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['remote-as'], ['64520'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['nexthop-choice'], ['default'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['multihop'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['route-reflect'], ['yes'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['hold-time'], ['3m'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['ttl'], ['default'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['address-families'], ['ip'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['update-source'], ['LAN_KHV'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['default-originate'], ['never'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['remove-private-as'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['as-override'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['passive'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_peer']['iBGP_BRAS.TYRMA']['use-bfd'], ['yes'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['route-distinguisher'], ['64520:666'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['dst-address'], ['10.10.66.8/30'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['gateway'], ['10.10.100.1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['interface'], ['GRE_TYRMA'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['in-label'], ['6136'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['out-label'], ['6136'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['bgp-local-pref'], ['100'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['bgp-origin'], ['incomplete'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_vpnv4_route']['GRE_TYRMA']['bgp-ext-communities'], ['RT:64520:666'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['name'], ['default'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['as'], ['65530'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['router-id'], ['0.0.0.0'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['redistribute-connected'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['redistribute-static'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['redistribute-rip'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['redistribute-ospf'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['redistribute-other-bgp'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['client-to-client-reflection'], ['yes'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_bgp_instance']['default']['ignore-as-path-len'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_route']['altegro']['dst-address'], ['10.10.66.0/30'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_route']['altegro']['pref-src'], ['10.10.66.1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_route']['altegro']['gateway'], ['bridge1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_route']['altegro']['gateway-status'], ['bridge1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_route']['altegro']['distance'], ['0'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_route']['altegro']['scope'], ['10'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_route']['altegro']['routing-mark'], ['altegro'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['name'], ['default'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['router-id'], ['10.10.50.1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['distribute-default'], ['never'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['redistribute-connected'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['redistribute-static'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['redistribute-rip'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['redistribute-bgp'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['redistribute-other-ospf'], ['no'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['metric-default'], ['1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['metric-connected'], ['20'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['metric-static'], ['20'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['metric-rip'], ['20'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['metric-bgp'], ['auto'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['metric-other-ospf'], ['auto'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['in-filter'], ['ospf-in'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_instance']['default']['out-filter'], ['ospf-out'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['instance'], ['default'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['router-id'], ['10.10.100.1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['address'], ['10.10.1.2'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['interface'], ['GRE_TYRMA'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['priority'], ['1'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['dr-address'], ['0.0.0.0'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['backup-dr-address'], ['0.0.0.0'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['state'], ['Full'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['state-changes'], ['15'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['ls-retransmits'], ['0'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['ls-requests'], ['0'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['db-summaries'], ['0'] + ) + self.assertIn( + result['ansible_facts']['ansible_net_ospf_neighbor']['default']['adjacency'], ['6h8m46s'] + )