Juniper / py-junos-eznc

Python library for Junos automation
https://www.juniper.net/documentation/en_US/junos-pyez/information-products/pathway-pages/junos-pyez-developer-guide.html
Apache License 2.0
670 stars 344 forks source link

Nested table views not working #993

Closed kr3ator closed 4 years ago

kr3ator commented 4 years ago

I'm trying to use the default bfd.yml Table/View to dump the information on the BFD sessions. In this file the "bfd_client" field refers back to other Table/View which doesn't seem to work correctly.

After populating the table with get() method and viewing it in the console all the normal fields are populated correctly but for the "bfd_client" I get:

('bfd_client', _BfdSessionClientTable:10.200.2.1: 0 items)

Running the same with juniper_junos_table module with Ansible yields an error:

File /usr/lib64/python2.7/runpy.py, line 176, in run_module fname, loader, pkg_name File /usr/lib64/python2.7/runpy.py, line 82, in _run_module_code mod_name, mod_fname, mod_loader, pkg_name File /usr/lib64/python2.7/runpy.py, line 72, in _run_code exec code in run_globals File /tmp/ansible_juniper_junos_table_payload_FAYu62/ansible_juniper_junos_table_payload.zip/ansible/modules/juniper_junos_table.py, line 477, in <module> File /tmp/ansible_juniper_junos_table_payload_FAYu62/ansible_juniper_junos_table_payload.zip/ansible/modules/juniper_junos_table.py, line 473, in main File /tmp/ansible_juniper_junos_table_payload_FAYu62/ansible_juniper_junos_table_payload.zip/ansible/module_utils/juniper_junos_common.py, line 781, in exit_json File /tmp/ansible_juniper_junos_table_payload_FAYu62/ansible_juniper_junos_table_payload.zip/ansible/module_utils/basic.py, line 2072, in exit_json File /tmp/ansible_juniper_junos_table_payload_FAYu62/ansible_juniper_junos_table_payload.zip/ansible/module_utils/basic.py, line 2065, in _return_formatted File /tmp/ansible_juniper_junos_table_payload_FAYu62/ansible_juniper_junos_table_payload.zip/ansible/module_utils/basic.py, line 418, in remove_values File /tmp/ansible_juniper_junos_table_payload_FAYu62/ansible_juniper_junos_table_payload.zip/ansible/module_utils/basic.py, line 401, in _remove_values_conditions TypeError: Value of unknown type: <class 'jnpr.junos.factory.Table._BfdSessionClientTable'>, _BfdSessionClientTable:10.200.2.1: 0 items"

vnitinv commented 4 years ago

@kr3ator Can you attach or unicast XML from device

you can use

<command> | display xml 
kr3ator commented 4 years ago

@vnitinv

<rpc-reply xmlns:junos="http://xml.juniper.net/junos/19.3R0/junos">
    <bfd-session-information xmlns="http://xml.juniper.net/junos/19.3R0/junos-bfd" junos:style="extensive">
        <bfd-session>
            <session-neighbor>172.16.1.10</session-neighbor>
            <session-state>Up</session-state>
            <session-interface>et-0/0/48.0</session-interface>
            <session-detection-time>0.900</session-detection-time>
            <session-transmission-interval>0.300</session-transmission-interval>
            <session-adaptive-multiplier>3</session-adaptive-multiplier>
            <bfd-client>
                <client-name>OSPF realm ospf-v2 Area 0.0.0.0</client-name>
                <client-transmission-interval>0.300</client-transmission-interval>
                <client-reception-interval>0.300</client-reception-interval>
            </bfd-client>
            <session-up-time>00:15:58</session-up-time>
            <previous-down-time>00:00:01</previous-down-time>
            <local-diagnostic>None</local-diagnostic>
            <remote-diagnostic>None</remote-diagnostic>
            <session-version>1</session-version>
            <remote-state>Up</remote-state>
            <session-type>Single hop BFD</session-type>
            <minimum-asynchronous-interval>0.300</minimum-asynchronous-interval>
            <minimum-slow-interval>1.000</minimum-slow-interval>
            <adaptive-asynchronous-transmission-interval>0.300</adaptive-asynchronous-transmission-interval>
            <adaptive-reception-interval>0.300</adaptive-reception-interval>
            <minimum-transmission-interval>0.300</minimum-transmission-interval>
            <minimum-reception-interval>0.300</minimum-reception-interval>
            <detection-multiplier>3</detection-multiplier>
            <neighbor-minimum-transmission-interval>0.300</neighbor-minimum-transmission-interval>
            <neighbor-minimum-reception-interval>0.300</neighbor-minimum-reception-interval>
            <neighbor-session-multiplier>3</neighbor-session-multiplier>
            <local-discriminator>16</local-discriminator>
            <remote-discriminator>16</remote-discriminator>
            <echo-mode-desired>disabled</echo-mode-desired>
            <echo-mode-state>inactive</echo-mode-state>
            <neighbor-fate>Remote is control-plane independent</neighbor-fate>
            <no-refresh> Session ID: 0x0</no-refresh>
        </bfd-session>
        <bfd-session>
            <session-neighbor>172.16.1.22</session-neighbor>
            <session-state>Up</session-state>
            <session-interface>et-0/0/49.0</session-interface>
            <session-detection-time>0.900</session-detection-time>
            <session-transmission-interval>0.300</session-transmission-interval>
            <session-adaptive-multiplier>3</session-adaptive-multiplier>
            <bfd-client>
                <client-name>OSPF realm ospf-v2 Area 0.0.0.0</client-name>
                <client-transmission-interval>0.300</client-transmission-interval>
                <client-reception-interval>0.300</client-reception-interval>
            </bfd-client>
            <session-up-time>00:15:58</session-up-time>
            <previous-down-time>00:00:01</previous-down-time>
            <local-diagnostic>None</local-diagnostic>
            <remote-diagnostic>None</remote-diagnostic>
            <session-version>1</session-version>
            <remote-state>Up</remote-state>
            <session-type>Single hop BFD</session-type>
            <minimum-asynchronous-interval>0.300</minimum-asynchronous-interval>
            <minimum-slow-interval>1.000</minimum-slow-interval>
            <adaptive-asynchronous-transmission-interval>0.300</adaptive-asynchronous-transmission-interval>
            <adaptive-reception-interval>0.300</adaptive-reception-interval>
            <minimum-transmission-interval>0.300</minimum-transmission-interval>
            <minimum-reception-interval>0.300</minimum-reception-interval>
            <detection-multiplier>3</detection-multiplier>
            <neighbor-minimum-transmission-interval>0.300</neighbor-minimum-transmission-interval>
            <neighbor-minimum-reception-interval>0.300</neighbor-minimum-reception-interval>
            <neighbor-session-multiplier>3</neighbor-session-multiplier>
            <local-discriminator>17</local-discriminator>
            <remote-discriminator>17</remote-discriminator>
            <echo-mode-desired>disabled</echo-mode-desired>
            <echo-mode-state>inactive</echo-mode-state>
            <neighbor-fate>Remote is control-plane independent</neighbor-fate>
            <no-refresh> Session ID: 0x0</no-refresh>
        </bfd-session>
        <bfd-session>
            <session-neighbor>192.168.100.0</session-neighbor>
            <session-state>Up</session-state>
            <session-interface></session-interface>
            <session-detection-time>0.900</session-detection-time>
            <session-transmission-interval>0.300</session-transmission-interval>
            <session-adaptive-multiplier>3</session-adaptive-multiplier>
            <bfd-client>
                <client-name>BGP</client-name>
                <client-transmission-interval>0.300</client-transmission-interval>
                <client-reception-interval>0.300</client-reception-interval>
            </bfd-client>
            <session-up-time>00:05:56</session-up-time>
            <previous-down-time>00:00:02</previous-down-time>
            <local-diagnostic>None</local-diagnostic>
            <remote-diagnostic>None</remote-diagnostic>
            <session-version>1</session-version>
            <remote-state>Up</remote-state>
            <session-type>Multi hop BFD</session-type>
            <minimum-asynchronous-interval>0.300</minimum-asynchronous-interval>
            <minimum-slow-interval>1.000</minimum-slow-interval>
            <adaptive-asynchronous-transmission-interval>0.300</adaptive-asynchronous-transmission-interval>
            <adaptive-reception-interval>0.300</adaptive-reception-interval>
            <minimum-transmission-interval>0.300</minimum-transmission-interval>
            <minimum-reception-interval>0.300</minimum-reception-interval>
            <detection-multiplier>3</detection-multiplier>
            <neighbor-minimum-transmission-interval>0.300</neighbor-minimum-transmission-interval>
            <neighbor-minimum-reception-interval>0.300</neighbor-minimum-reception-interval>
            <neighbor-session-multiplier>3</neighbor-session-multiplier>
            <local-discriminator>19</local-discriminator>
            <remote-discriminator>20</remote-discriminator>
            <echo-mode-desired>disabled</echo-mode-desired>
            <echo-mode-state>inactive</echo-mode-state>
            <neighbor-fate>Remote is control-plane independent</neighbor-fate>
            <multihop>Multi-hop</multihop>
            <multihop-routing-table-index>0</multihop-routing-table-index>
            <multihop-local-address>192.168.100.12</multihop-local-address>
            <no-refresh> Session ID: 0x0</no-refresh>
        </bfd-session>
        <bfd-session>
            <session-neighbor>192.168.100.1</session-neighbor>
            <session-state>Up</session-state>
            <session-interface></session-interface>
            <session-detection-time>0.900</session-detection-time>
            <session-transmission-interval>0.300</session-transmission-interval>
            <session-adaptive-multiplier>3</session-adaptive-multiplier>
            <bfd-client>
                <client-name>BGP</client-name>
                <client-transmission-interval>0.300</client-transmission-interval>
                <client-reception-interval>0.300</client-reception-interval>
            </bfd-client>
            <session-up-time>00:15:56</session-up-time>
            <previous-down-time>00:00:03</previous-down-time>
            <local-diagnostic>None</local-diagnostic>
            <remote-diagnostic>None</remote-diagnostic>
            <session-version>1</session-version>
            <remote-state>Up</remote-state>
            <session-type>Multi hop BFD</session-type>
            <minimum-asynchronous-interval>0.300</minimum-asynchronous-interval>
            <minimum-slow-interval>1.000</minimum-slow-interval>
            <adaptive-asynchronous-transmission-interval>0.300</adaptive-asynchronous-transmission-interval>
            <adaptive-reception-interval>0.300</adaptive-reception-interval>
            <minimum-transmission-interval>0.300</minimum-transmission-interval>
            <minimum-reception-interval>0.300</minimum-reception-interval>
            <detection-multiplier>3</detection-multiplier>
            <neighbor-minimum-transmission-interval>0.300</neighbor-minimum-transmission-interval>
            <neighbor-minimum-reception-interval>0.300</neighbor-minimum-reception-interval>
            <neighbor-session-multiplier>3</neighbor-session-multiplier>
            <local-discriminator>18</local-discriminator>
            <remote-discriminator>19</remote-discriminator>
            <echo-mode-desired>disabled</echo-mode-desired>
            <echo-mode-state>inactive</echo-mode-state>
            <neighbor-fate>Remote is control-plane independent</neighbor-fate>
            <multihop>Multi-hop</multihop>
            <multihop-routing-table-index>0</multihop-routing-table-index>
            <multihop-local-address>192.168.100.12</multihop-local-address>
            <no-refresh> Session ID: 0x0</no-refresh>
        </bfd-session>
        <sessions>4</sessions>
        <clients>4</clients>
        <cumulative-transmission-rate>13.3</cumulative-transmission-rate>
        <cumulative-reception-rate>13.3</cumulative-reception-rate>
    </bfd-session-information>
    <cli>
        <banner>{master:0}</banner>
    </cli>
</rpc-reply>
kr3ator commented 4 years ago

Today I tried to get this nesting working with custom BGP neighbor and it worked for couple of iterations and then suddenly stopped.

My bgp.yml Table/View file:

---
  bgpTable:
   rpc: get-bgp-neighbor-information
   item: bgp-peer
   view: bgpView
   key: peer-id

  bgpView:
   fields:
    local_as: local-as
    peer_as: peer-as
    local_address: local-address
    peer_id: peer-id
    local_id: local-id
    peer_state: peer-state
    nrlis: peer-restart-nlri-negotiated
    ribs: _bgpRibTable

  _bgpRibTable:
    item: bgp-rib
    view: _bgpRibView

  _bgpRibView:
    fields:
      name: name
      active_prefix_count: active-prefix-count
      accepted_prefix_count: accepted-prefix-count
      received_prefix_count: received-prefix-count
      advertised_prefix_count: advertised-prefix-count

Output from ansible running juniper_junos_table module:

{
"resource": [
            {
                "local_address": "1.254.10.2+179",
                "local_as": "65500",
                "local_id": "1.254.10.2",
                "nrlis": "inet-unicast",
                "peer_as": "550",
                "peer_id": "1.254.10.1",
                "peer_state": "Established",
                "ribs": [
                    {
                        "accepted_prefix_count": "3",
                        "active_prefix_count": "3",
                        "advertised_prefix_count": "8",
                        "name": "MGMT.inet.0",
                        "received_prefix_count": "3"
                    }
                ]
            }
   ...ommited...
]
}

Corresponding XML answer:

<rpc-reply xmlns:junos="http://xml.juniper.net/junos/18.2R3/junos">
    <bgp-information xmlns="http://xml.juniper.net/junos/18.2R3/junos-routing">
        <bgp-peer junos:style="detail">
            <peer-address>1.254.10.9+40409</peer-address>
            <peer-as>550</peer-as>
            <local-address>1.254.10.10+179</local-address>
            <local-as>65500</local-as>
            <peer-group>MGMT</peer-group>
            <peer-cfg-rti>MGMT</peer-cfg-rti>
            <peer-fwd-rti>MGMT</peer-fwd-rti>
            <peer-type>External</peer-type>
            <peer-state>Established</peer-state>
            <peer-flags>Sync</peer-flags>
            <last-state>OpenConfirm</last-state>
            <last-event>RecvKeepAlive</last-event>
            <last-error>None</last-error>
            <bgp-option-information xmlns="http://xml.juniper.net/junos/18.2R3/junos-routing">
                <export-policy>
                    direct_only
                </export-policy>
                <bgp-options>Multihop Preference LocalAddress Ttl PeerAS Refresh</bgp-options>
                <bgp-options2></bgp-options2>
                <bgp-options-extended></bgp-options-extended>
                <local-address>1.254.10.10</local-address>
                <holdtime>90</holdtime>
                <preference>170</preference>
            </bgp-option-information>
            <flap-count>1</flap-count>
            <last-flap-event>Restart</last-flap-event>
            <peer-id>1.254.10.9</peer-id>
            <local-id>10.200.1.252</local-id>
            <active-holdtime>60</active-holdtime>
            <keepalive-interval>20</keepalive-interval>
            <group-index>0</group-index>
            <peer-index>0</peer-index>
            <snmp-index>1</snmp-index>
            <bgp-peer-iosession>
                <iosession-thread-name>bgpio-0</iosession-thread-name>
                <iosession-state>Enabled</iosession-state>
            </bgp-peer-iosession>
            <bgp-bfd>
                <bfd-configuration-state>disabled</bfd-configuration-state>
                <bfd-operational-state>down</bfd-operational-state>
            </bgp-bfd>
            <peer-restart-nlri-configured>inet-unicast</peer-restart-nlri-configured>
            <nlri-type-peer>inet-unicast</nlri-type-peer>
            <nlri-type-session>inet-unicast</nlri-type-session>
            <peer-refresh-capability>2</peer-refresh-capability>
            <peer-stale-route-time-configured>300</peer-stale-route-time-configured>
            <peer-restart-time-received>1</peer-restart-time-received>
            <peer-restart-flags-received>Restarting</peer-restart-flags-received>
            <peer-restart-nlri-received>inet-unicast</peer-restart-nlri-received>
            <peer-restart-nlri-can-save-state>inet-unicast</peer-restart-nlri-can-save-state>
            <peer-restart-nlri-state-saved>inet-unicast</peer-restart-nlri-state-saved>
            <peer-restart-nlri-negotiated>inet-unicast</peer-restart-nlri-negotiated>
            <peer-end-of-rib-received>inet-unicast</peer-end-of-rib-received>
            <peer-end-of-rib-sent>inet-unicast</peer-end-of-rib-sent>
            <peer-end-of-rib-scheduled></peer-end-of-rib-scheduled>
            <peer-no-llgr-helper/>
            <peer-4byte-as-capability-advertised>550</peer-4byte-as-capability-advertised>
            <peer-addpath-not-supported/>
            <bgp-rib junos:style="detail">
                <name>MGMT.inet.0</name>
                <rib-bit>20000</rib-bit>
                <bgp-rib-state>BGP restart is complete</bgp-rib-state>
                <vpn-rib-state>VPN restart is complete</vpn-rib-state>
                <send-state>in sync</send-state>
                <active-prefix-count>3</active-prefix-count>
                <received-prefix-count>3</received-prefix-count>
                <accepted-prefix-count>3</accepted-prefix-count>
                <suppressed-prefix-count>0</suppressed-prefix-count>
                <advertised-prefix-count>8</advertised-prefix-count>
            </bgp-rib>
            <last-received>2</last-received>
            <last-sent>17</last-sent>
            <last-checked>483902</last-checked>
            <input-messages>24204</input-messages>
            <input-updates>11</input-updates>
            <input-refreshes>0</input-refreshes>
            <input-octets>460216</input-octets>
            <output-messages>26875</output-messages>
            <output-updates>1</output-updates>
            <output-refreshes>0</output-refreshes>
            <output-octets>510690</output-octets>
            <bgp-output-queue>
                <number>1</number>
                <count>0</count>
                <table-name>MGMT.inet.0</table-name>
                <rib-adv-nlri>inet-unicast</rib-adv-nlri>
            </bgp-output-queue>
        </bgp-peer>
 ...ommited...
 </bgp-information>
    <cli>
        <banner></banner>
    </cli>
</rpc-reply>

I've tried to run it several times now and I always get the same error as with BFD (the only change is in the name of the netsted table):

...ommited...
 line 401, in _remove_values_conditions
   TypeError: Value of unknown type: <class 'jnpr.junos.factory.Table._bgpRibTable'>, _bgpRibTable:10.200.2.2: 0 items
...ommited...
kr3ator commented 4 years ago

I've managed to figure it out. This is a duplicate of https://github.com/Juniper/ansible-junos-stdlib/issues/379

I've prepared a patch for this in the junos-stdlib repo.