From d990e283cd0b380bb9d1ab4d1eb58c60fb6b6fe1 Mon Sep 17 00:00:00 2001 From: Luke Russell Date: Sat, 1 Sep 2018 06:59:58 +1000 Subject: [PATCH] show ip vrf detail, more tests for show ip bgp summary (#11) * task file per command for future growth plus more tests * merging * cleaning * Seperating tests for each command * tests * working parser template * Interfaces being captured, tests * `show ip vrf detail` parser and more tests (#1) * parser for `show ip vrf detail` * more parser tests * Test case for BGP not active. Fixed to pass tests. * forgot the command map... --- parser_templates/cli/show_ip_bgp_summary.yaml | 50 ++++-- parser_templates/cli/show_ip_vrf_detail.yaml | 147 ++++++++++++++++++ .../output/show_ip_bgp_summary/03.14.00.S.txt | 4 +- .../show_ip_bgp_summary/12.2(33)SXH5.txt | 16 ++ .../output/show_ip_bgp_summary/15.1(2)T5.txt | 14 ++ .../show_ip_bgp_summary/bgp_not_active.txt | 1 + tests/output/show_ip_bgp_summary/main.yml | 90 +++++++++++ .../show_ip_vrf_detail/12.2(33)SXH5.txt | 47 ++++++ tests/output/show_ip_vrf_detail/main.yml | 34 ++++ tests/test.yml | 31 +--- vars/get_facts_command_map.yaml | 7 + 11 files changed, 402 insertions(+), 39 deletions(-) create mode 100644 parser_templates/cli/show_ip_vrf_detail.yaml create mode 100644 tests/output/show_ip_bgp_summary/12.2(33)SXH5.txt create mode 100644 tests/output/show_ip_bgp_summary/15.1(2)T5.txt create mode 100644 tests/output/show_ip_bgp_summary/bgp_not_active.txt create mode 100644 tests/output/show_ip_bgp_summary/main.yml create mode 100644 tests/output/show_ip_vrf_detail/12.2(33)SXH5.txt create mode 100644 tests/output/show_ip_vrf_detail/main.yml diff --git a/parser_templates/cli/show_ip_bgp_summary.yaml b/parser_templates/cli/show_ip_bgp_summary.yaml index a5f3bd9..65cb4ca 100644 --- a/parser_templates/cli/show_ip_bgp_summary.yaml +++ b/parser_templates/cli/show_ip_bgp_summary.yaml @@ -6,34 +6,60 @@ command: show ip bgp summary network_os: ios +- name: match not active + register: not_active + export: true + pattern_match: + regex: "BGP not active" + match_all: true + +- name: set_vars bgp state active + export: true + set_vars: + process_state: "active" + +- name: set_vars bgp state not active + export: true + set_vars: + process_state: "not active" + when: "not_active.0.matches == 'BGP not active'" + - name: match sections + register: context pattern_match: regex: "Neighbor.+" match_all: yes match_greedy: yes - register: context - export: false + when: process_state == 'active' - name: match lines + register: lines pattern_match: regex: "^[0-9a-f.]+" + content: "{{ context.0 }}" match_all: yes match_greedy: yes - content: "{{ context.0 }}" - register: lines - export: false + when: process_state == 'active' - name: match neighbors + register: neighbors + loop: "{{ lines }}" pattern_match: regex: "(?P[0-9a-f.]+)\\s+(?P\\d+)\\s+(?P\\d+)\\s+(?P\\d+)\\s+(?P\\d+)\\s+(?P\\d+)\\s+(?P\\d+)\\s+(?P\\d+)\\s+(?P\\S+)\\s+(?P\\S+)" content: "{{ item }}" - loop: "{{ lines }}" - register: neighbors - export: false + when: process_state == 'active' - name: template entries + register: ip_bgp_summary + loop: "{{ neighbors }}" + export: true + export_as: dict + extend: cisco_ios + when: process_state == 'active' json_template: template: + - key: "process_state" + value: "active" - key: "{{ item.ip }}" object: - key: state_pfxrcd @@ -44,8 +70,14 @@ value: "{{ item.timer }}" - key: ip_version value: "{{ item.version }}" + +- name: template entries register: ip_bgp_summary - loop: "{{ neighbors }}" export: true export_as: dict extend: cisco_ios + when: process_state == 'not active' + json_template: + template: + - key: "process_state" + value: "not active" diff --git a/parser_templates/cli/show_ip_vrf_detail.yaml b/parser_templates/cli/show_ip_vrf_detail.yaml new file mode 100644 index 0000000..ab4c854 --- /dev/null +++ b/parser_templates/cli/show_ip_vrf_detail.yaml @@ -0,0 +1,147 @@ +--- + +- name: show_ip_vrf_detail + parser_metadata: + version: 1.0 + command: show ip vrf detail + network_os: ios + +- name: match vrf section + register: section + pattern_match: + regex: "^VRF \\S+; default RD" + match_all: true + match_greedy: true + +- name: match vrf values + loop: "{{ section }}" + register: vrf + pattern_group: + + - name: match name + pattern_match: + regex: "^VRF (\\S+); default RD" + content: "{{ item }}" + register: name + + - name: match description + pattern_match: + regex: "^ Description: (.*)\\n" + content: "{{ item }}" + register: description + + - name: match route distinguisher + pattern_match: + regex: ".*; default RD (\\d+:\\d+)" + content: "{{ item }}" + register: rd + + - name: match export route target section + pattern_match: + regex: "^ Export VPN route-target communities([\\s\\S]*)^ Import VPN" + content: "{{ item }}" + match_all: true + match_greedy: false + register: export_rt_section + + - name: match import route target section + pattern_match: + regex: "^ Import VPN route-target communities([\\s\\S]*)import route-map" + content: "{{ item }}" + match_all: true + match_greedy: false + register: import_rt_section + + - name: match interface section + pattern_match: + regex: "^ Interfaces:([\\s\\S]*)VRF Table ID" + content: "{{ item }}" + match_all: true + match_greedy: false + register: interface_section + +- name: match vrf nested values + loop: "{{ vrf }}" + loop_control: + loop_var: vrf_item + register: vrf_nested + pattern_group: + + - name: match vrf name + pattern_match: + regex: "(.*)" + content: "{{ vrf_item.name.matches.0 }}" + match_greedy: true + register: name + + - name: match export route targets + pattern_match: + regex: "\\s+RT:(\\d+:\\d+)" + content: "{{ vrf_item.export_rt_section.0.matches }}" + match_all: true + register: export_rt + + - name: match import route targets + pattern_match: + regex: "\\s+RT:(\\d+:\\d+)" + content: "{{ vrf_item.import_rt_section.0.matches }}" + match_all: true + register: import_rt + + - name: match interfaces + pattern_match: + regex: "[\\s|\\\n]+(\\S*)[\\s|\\n]" + content: "{{ vrf_item.interface_section.0.matches }}" + match_all: true + register: interface + +- name: build a dict for nested values with name as key + register: vrf_nested_values + export_as: dict + loop: "{{ vrf_nested }}" + loop_control: + loop_var: vrf_nested_item + json_template: + template: + - key: "{{ vrf_nested_item.name.0 }}" + object: + - key: export_rt + elements: "{{ nested_item.matches }}" + repeat_for: "{{ vrf_nested_item.export_rt }}" + repeat_var: nested_item + - key: import_rt + elements: "{{ nested_item.matches }}" + repeat_for: "{{ vrf_nested_item.import_rt }}" + repeat_var: nested_item + - key: interface + elements: "{{ nested_item.matches }}" + repeat_for: "{{ vrf_nested_item.interface }}" + repeat_var: nested_item + +- name: ensure vrf_nested_values is a DICT + set_vars: + dict_vrf_nested_values: "{{ ({}| combine(*vrf_nested_values)) }}" + +- name: template export json object + register: ip_vrf_detail + loop: "{{ vrf }}" + export: true + export_as: dict + extend: cisco_ios + json_template: + template: + - key: "{{ item.name.matches.0 }}" + object: + - key: name + value: "{{ item.name.matches.0 }}" + - key: description + value: "{{ item.description.matches.0 }}" + - key: rd + value: "{{ item.rd.matches.0 }}" + - key: export_rt + value: "{{ dict_vrf_nested_values[item.name.matches.0].export_rt }}" + - key: import_rt + value: "{{ dict_vrf_nested_values[item.name.matches.0].import_rt }}" + - key: interfaces + value: "{{ dict_vrf_nested_values[item.name.matches.0].interface }}" + diff --git a/tests/output/show_ip_bgp_summary/03.14.00.S.txt b/tests/output/show_ip_bgp_summary/03.14.00.S.txt index fd89a46..37a8a24 100644 --- a/tests/output/show_ip_bgp_summary/03.14.00.S.txt +++ b/tests/output/show_ip_bgp_summary/03.14.00.S.txt @@ -12,7 +12,5 @@ BGP activity 18292/15523 prefixes, 74591/69053 paths, scan interval 60 secs Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 10.15.17.2 4 64785 748767 766529 79501 0 0 7w1d 1125 -172.31.3.17 4 65530 795592 739710 79501 0 0 7w1d 1641 10.1.19.2 4 1234 0 0 1 0 0 00:00:30 Active -72.31.0.13 4 65004 0 0 1 0 0 00:00:45 Idle -72.31.0.130 4 65530 8027 6488 2287 0 0 10:32:44 1644 \ No newline at end of file +72.31.0.13 4 65004 0 0 1 0 0 10:32:44 Idle \ No newline at end of file diff --git a/tests/output/show_ip_bgp_summary/12.2(33)SXH5.txt b/tests/output/show_ip_bgp_summary/12.2(33)SXH5.txt new file mode 100644 index 0000000..14afb9d --- /dev/null +++ b/tests/output/show_ip_bgp_summary/12.2(33)SXH5.txt @@ -0,0 +1,16 @@ +BGP router identifier 172.16.32.1, local AS number 65123 +BGP table version is 3317, main routing table version 3317 +140 network entries using 16380 bytes of memory +276 path entries using 14352 bytes of memory +1184/12 BGP path/bestpath attribute entries using 165760 bytes of memory +108 BGP AS-PATH entries using 2832 bytes of memory +84 BGP community entries using 2016 bytes of memory +74 BGP extended community entries using 1920 bytes of memory +0 BGP route-map cache entries using 0 bytes of memory +0 BGP filter-list cache entries using 0 bytes of memory +BGP using 203260 total bytes of memory +BGP activity 2362466/2358636 prefixes, 9381389/9370747 paths, scan interval 60 secs + +Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd +172.31.32.10 4 64910 5784429 5675902 3317 0 0 23w5d 114 +172.16.32.1 4 65123 6281459 6288574 3317 0 0 28w5d 136 \ No newline at end of file diff --git a/tests/output/show_ip_bgp_summary/15.1(2)T5.txt b/tests/output/show_ip_bgp_summary/15.1(2)T5.txt new file mode 100644 index 0000000..03f179c --- /dev/null +++ b/tests/output/show_ip_bgp_summary/15.1(2)T5.txt @@ -0,0 +1,14 @@ +BGP router identifier 10.29.19.69, local AS number 65312 +BGP table version is 8405, main routing table version 8405 +1390 network entries using 189040 bytes of memory +1390 path entries using 72280 bytes of memory +1016/1016 BGP path/bestpath attribute entries using 125984 bytes of memory +1008 BGP AS-PATH entries using 24516 bytes of memory +2 BGP extended community entries using 48 bytes of memory +0 BGP route-map cache entries using 0 bytes of memory +0 BGP filter-list cache entries using 0 bytes of memory +BGP using 411868 total bytes of memory +BGP activity 3131/1741 prefixes, 4889/3499 paths, scan interval 60 secs + +Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd +10.29.19.70 4 7474 78662 72306 8405 0 0 4d22h 1385 \ No newline at end of file diff --git a/tests/output/show_ip_bgp_summary/bgp_not_active.txt b/tests/output/show_ip_bgp_summary/bgp_not_active.txt new file mode 100644 index 0000000..d2c7f30 --- /dev/null +++ b/tests/output/show_ip_bgp_summary/bgp_not_active.txt @@ -0,0 +1 @@ +% BGP not active diff --git a/tests/output/show_ip_bgp_summary/main.yml b/tests/output/show_ip_bgp_summary/main.yml new file mode 100644 index 0000000..dafebf2 --- /dev/null +++ b/tests/output/show_ip_bgp_summary/main.yml @@ -0,0 +1,90 @@ +--- + +### BGP not active + +- name: not active - parse `show ip bgp summary` + command_parser: + file: "{{ playbook_dir }}/../parser_templates/cli/show_ip_bgp_summary.yaml" + content: "{{ lookup('file', '{{ playbook_dir }}/output/show_ip_bgp_summary/bgp_not_active.txt') }}" + register: result + +- name: not active - test `show ip bgp summary` parser + assert: + that: + - "cisco_ios['ip_bgp_summary']['process_state'] == 'not active'" + +- name: clear facts + meta: clear_facts + +### IOS-XE 03.14.00.S + +- name: 03.14.00.S.txt - parse `show ip bgp summary` + command_parser: + file: "{{ playbook_dir }}/../parser_templates/cli/show_ip_bgp_summary.yaml" + content: "{{ lookup('file', '{{ playbook_dir }}/output/show_ip_bgp_summary/03.14.00.S.txt') }}" + register: result + +- name: 03.14.00.S.txt - test `show ip bgp summary` parser + assert: + that: + - "'ip_bgp_summary' in cisco_ios" + - "'10.15.17.2' in cisco_ios['ip_bgp_summary']" + - "cisco_ios['ip_bgp_summary']['10.15.17.2']['state_pfxrcd'] == 1125" + - "cisco_ios['ip_bgp_summary']['10.15.17.2']['asn'] == 64785" + - "cisco_ios['ip_bgp_summary']['10.15.17.2']['ip_version'] == 4" + - "cisco_ios['ip_bgp_summary']['10.15.17.2']['timer'] == '7w1d'" + - "'10.1.19.2' in cisco_ios['ip_bgp_summary']" + - "cisco_ios['ip_bgp_summary']['10.1.19.2']['state_pfxrcd'] == 'Active'" + - "cisco_ios['ip_bgp_summary']['10.1.19.2']['asn'] == 1234" + - "cisco_ios['ip_bgp_summary']['10.1.19.2']['ip_version'] == 4" + - "'{{ cisco_ios['ip_bgp_summary']['10.1.19.2']['timer'] | string }}' == '00:00:30'" + - "'72.31.0.13' in cisco_ios['ip_bgp_summary']" + - "cisco_ios['ip_bgp_summary']['72.31.0.13']['state_pfxrcd'] == 'Idle'" + - "cisco_ios['ip_bgp_summary']['72.31.0.13']['asn'] == 65004" + - "cisco_ios['ip_bgp_summary']['72.31.0.13']['ip_version'] == 4" + - "'{{ cisco_ios['ip_bgp_summary']['72.31.0.13']['timer'] | string }}' == '10:32:44'" + +### IOS 15.1(2)T5.txt + +- name: 15.1(2)T5.txt - parse `show ip bgp summary` + command_parser: + file: "{{ playbook_dir }}/../parser_templates/cli/show_ip_bgp_summary.yaml" + content: "{{ lookup('file', '{{ playbook_dir }}/output/show_ip_bgp_summary/15.1(2)T5.txt') }}" + register: result + +- name: 15.1(2)T5.txt - test `show ip bgp summary` parser + assert: + that: + - "'ip_bgp_summary' in cisco_ios" + - "'10.29.19.70' in cisco_ios['ip_bgp_summary']" + - "cisco_ios['ip_bgp_summary']['10.29.19.70']['state_pfxrcd'] == 1385" + - "cisco_ios['ip_bgp_summary']['10.29.19.70']['asn'] == 7474" + - "cisco_ios['ip_bgp_summary']['10.29.19.70']['ip_version'] == 4" + - "cisco_ios['ip_bgp_summary']['10.29.19.70']['timer'] == '4d22h'" + +### IOS 12.2(33)SXH5.txt + +- name: 12.2(33)SXH5.txt - parse `show ip bgp summary` + command_parser: + file: "{{ playbook_dir }}/../parser_templates/cli/show_ip_bgp_summary.yaml" + content: "{{ lookup('file', '{{ playbook_dir }}/output/show_ip_bgp_summary/12.2(33)SXH5.txt') }}" + register: result + +- name: 12.2(33)SXH5.txt - test `show ip bgp summary` parser + assert: + that: + - "'ip_bgp_summary' in cisco_ios" + - "'172.31.32.10' in cisco_ios['ip_bgp_summary']" + - "cisco_ios['ip_bgp_summary']['172.31.32.10']['state_pfxrcd'] == 114" + - "cisco_ios['ip_bgp_summary']['172.31.32.10']['asn'] == 64910" + - "cisco_ios['ip_bgp_summary']['172.31.32.10']['ip_version'] == 4" + - "cisco_ios['ip_bgp_summary']['172.31.32.10']['timer'] == '23w5d'" + - "'172.16.32.1' in cisco_ios['ip_bgp_summary']" + - "cisco_ios['ip_bgp_summary']['172.16.32.1']['state_pfxrcd'] == 136" + - "cisco_ios['ip_bgp_summary']['172.16.32.1']['asn'] == 65123" + - "cisco_ios['ip_bgp_summary']['172.16.32.1']['ip_version'] == 4" + - "'{{ cisco_ios['ip_bgp_summary']['172.16.32.1']['timer'] | string }}' == '28w5d'" + +- name: all tests complete + debug: + msg: "All tests for `show ip bgp summary` passed" diff --git a/tests/output/show_ip_vrf_detail/12.2(33)SXH5.txt b/tests/output/show_ip_vrf_detail/12.2(33)SXH5.txt new file mode 100644 index 0000000..f3ba143 --- /dev/null +++ b/tests/output/show_ip_vrf_detail/12.2(33)SXH5.txt @@ -0,0 +1,47 @@ +VRF ABC; default RD 65000:12; default VPNID + Description: ABC VPN + Interfaces: + Te7/3.16 +VRF Table ID = 45 + Export VPN route-target communities + RT:65000:12 + Import VPN route-target communities + RT:65000:12 + No import route-map + No export route-map + VRF label distribution protocol: not configured + VRF label allocation mode: per-prefix + vrf-conn-aggr for connected and BGP aggregates (Label 1706) + +VRF Def; default RD 65000:13; default VPNID + Description: Def VPN + Interfaces: + Vl190 Vl193 Lo10 + Vl85 Vl194 Vl19 + Vl191 Te7/3.194 +VRF Table ID = 1 + Export VPN route-target communities + RT:65000:13 RT:65000:120 RT:65000:130 + RT:123:123 + Import VPN route-target communities + RT:65000:13 RT:65000:14 + No import route-map + No export route-map + VRF label distribution protocol: not configured + VRF label allocation mode: per-prefix + vrf-conn-aggr for connected and BGP aggregates (Label 16) + +VRF XYzzz0-1-9; default RD 65111:100; default VPNID + Description: A random description + Interfaces: + Vl777 Gi7/3.30 +VRF Table ID = 6 + Export VPN route-target communities + RT:65000:100 + Import VPN route-target communities + RT:65000:100 + No import route-map + No export route-map + VRF label distribution protocol: not configured + VRF label allocation mode: per-prefix + vrf-conn-aggr for connected and BGP aggregates (Label 1446) \ No newline at end of file diff --git a/tests/output/show_ip_vrf_detail/main.yml b/tests/output/show_ip_vrf_detail/main.yml new file mode 100644 index 0000000..db03833 --- /dev/null +++ b/tests/output/show_ip_vrf_detail/main.yml @@ -0,0 +1,34 @@ +### IOS 12.2(33)SXH5 + +- name: parse `show ip vrf detail` + command_parser: + file: "{{ playbook_dir }}/../parser_templates/cli/show_ip_vrf_detail.yaml" + content: "{{ lookup('file', '{{ playbook_dir }}/output/show_ip_vrf_detail/12.2(33)SXH5.txt') }}" + register: result + +- name: test `show ip vrf detail` + assert: + that: + - "'ip_vrf_detail' in cisco_ios" + - "'ABC' in cisco_ios['ip_vrf_detail']" + - "cisco_ios['ip_vrf_detail']['ABC']['rd'] == '65000:12'" + - "cisco_ios['ip_vrf_detail']['ABC']['description'] == 'ABC VPN'" + - "cisco_ios['ip_vrf_detail']['ABC']['export_rt'] == ['65000:12']" + - "cisco_ios['ip_vrf_detail']['ABC']['import_rt'] == ['65000:12']" + - "cisco_ios['ip_vrf_detail']['ABC']['interfaces'] == ['Te7/3.16']" + - "'Def' in cisco_ios['ip_vrf_detail']" + - "cisco_ios['ip_vrf_detail']['Def']['rd'] == '65000:13'" + - "cisco_ios['ip_vrf_detail']['Def']['description'] == 'Def VPN'" + - "cisco_ios['ip_vrf_detail']['Def']['export_rt'] == ['65000:13','65000:120','65000:130','123:123']" + - "cisco_ios['ip_vrf_detail']['Def']['import_rt'] == ['65000:13','65000:14']" + - "cisco_ios['ip_vrf_detail']['Def']['interfaces'] == ['Vl190','Vl193','Lo10','Vl85','Vl194','Vl19','Vl191','Te7/3.194']" + - "'XYzzz0-1-9' in cisco_ios['ip_vrf_detail']" + - "cisco_ios['ip_vrf_detail']['XYzzz0-1-9']['rd'] == '65111:100'" + - "cisco_ios['ip_vrf_detail']['XYzzz0-1-9']['description'] == 'A random description'" + - "cisco_ios['ip_vrf_detail']['XYzzz0-1-9']['export_rt'] == ['65000:100']" + - "cisco_ios['ip_vrf_detail']['XYzzz0-1-9']['import_rt'] == ['65000:100']" + - "cisco_ios['ip_vrf_detail']['XYzzz0-1-9']['interfaces'] == ['Vl777','Gi7/3.30']" + +- name: all tests complete + debug: + msg: "All tests for `show ip vrf detail` passed" diff --git a/tests/test.yml b/tests/test.yml index aaac084..7c0c661 100644 --- a/tests/test.yml +++ b/tests/test.yml @@ -5,32 +5,9 @@ - "{{ playbook_dir }}/../../ansible-network.network-engine" tasks: - - name: parse `show ip bgp summary` - command_parser: - file: "{{ playbook_dir }}/../parser_templates/cli/show_ip_bgp_summary.yaml" - content: "{{ lookup('file', '{{ playbook_dir }}/output/show_ip_bgp_summary/03.14.00.S.txt') }}" - register: result - - name: set fact dictionary path - set_fact: - facts: "{{ ansible_facts['cisco_ios'] }}" + - name: Include tests for `show ip bgp summary` + include_tasks: output/show_ip_bgp_summary/main.yml - - name: test `show ip bgp summary` parser - assert: - that: - - "'ip_bgp_summary' in facts" - - "'10.15.17.2' in facts['ip_bgp_summary']" - - "facts['ip_bgp_summary']['10.15.17.2']['state_pfxrcd'] == 1125" - - "facts['ip_bgp_summary']['10.15.17.2']['asn'] == 64785" - - "facts['ip_bgp_summary']['10.15.17.2']['ip_version'] == 4" - - "facts['ip_bgp_summary']['10.15.17.2']['timer'] == '7w1d'" - - "'10.1.19.2' in facts['ip_bgp_summary']" - - "facts['ip_bgp_summary']['10.1.19.2']['state_pfxrcd'] == 'Active'" - - "facts['ip_bgp_summary']['10.1.19.2']['asn'] == 1234" - - "facts['ip_bgp_summary']['10.1.19.2']['ip_version'] == 4" - - "'{{ facts['ip_bgp_summary']['10.1.19.2']['timer'] | string }}' == '00:00:30'" - - "'72.31.0.13' in facts['ip_bgp_summary']" - - "facts['ip_bgp_summary']['72.31.0.13']['state_pfxrcd'] == 'Idle'" - - "facts['ip_bgp_summary']['72.31.0.13']['asn'] == 65004" - - "facts['ip_bgp_summary']['72.31.0.13']['ip_version'] == 4" - - "'{{ facts['ip_bgp_summary']['72.31.0.13']['timer'] | string }}' == '00:00:45'" \ No newline at end of file + - name: Include tests for `show ip vrf detail` + include_tasks: output/show_ip_vrf_detail/main.yml diff --git a/vars/get_facts_command_map.yaml b/vars/get_facts_command_map.yaml index 3cb481c..096ab77 100644 --- a/vars/get_facts_command_map.yaml +++ b/vars/get_facts_command_map.yaml @@ -39,3 +39,10 @@ groups: - all - lldp + +- command: show ip vrf detail + parser: show_ip_vrf_detail.yaml + groups: + - all + - vrf +