CiscoDevNet / ydk-gen

Generate model-driven APIs from YANG models
http://ciscodevnet.github.io/ydk-gen/
Apache License 2.0
135 stars 74 forks source link

Python core package fails to read single container using CRUDService #1002

Closed ygorelik closed 4 years ago

ygorelik commented 4 years ago

Expected Behavior

The YDK should be able to get single container data.

Current Behavior

The Python core package sometimes fails to read single container data using CRUDService.

In the example below there was created BGP configuration that has 2 containers: global and neighbors. The test succeeds to get container 'global', but fails to get container 'neighbors'.

Similar tests in C++ package are passing fine.

Your Script

import logging

from ydk.providers import NetconfServiceProvider
from ydk.services  import CRUDService
from ydk.filters import YFilter

from ydk.models.ydktest import openconfig_bgp

def enable_logging(level):
    log = logging.getLogger('ydk')
    log.setLevel(level)
    handler = logging.StreamHandler()
    formatter = logging.Formatter(("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
    handler.setFormatter(formatter)
    log.addHandler(handler)

def assert_true(test, result):
    if result is None or not result:
        print("Failed Test %s" % test)

if __name__ == "__main__":
    ncc = NetconfServiceProvider(
            "127.0.0.1",
            "admin",
            "admin",
            12022,
            )
    crud = CRUDService()
    enable_logging(logging.INFO)

    # Delete BGP config
    bgp_set = openconfig_bgp.Bgp()
    reply = crud.delete(ncc, bgp_set)
    assert_true("Delete BGP Config", reply)

    # Create BGP config
    bgp_set.global_.config.as_ = 65001
    bgp_set.global_.config.router_id = "1.2.3.4"
    d = openconfig_bgp.Bgp.Neighbors.Neighbor()
    d.neighbor_address = "1.2.3.4"
    d.config.neighbor_address = "1.2.3.4"
    q = openconfig_bgp.Bgp.Neighbors.Neighbor()
    q.neighbor_address = "1.2.3.5"
    q.config.neighbor_address = "1.2.3.5"
    bgp_set.neighbors.neighbor.extend([d, q])

    reply = crud.create(ncc, bgp_set)
    assert_true("Create config", reply)

    # Read only 'global' container
    bgp_filter = openconfig_bgp.Bgp()
    bgp_filter.global_.yfilter = YFilter.read
    bgp_read = crud.read_config(ncc, bgp_filter)
    assert_true("Read BGP global config", bgp_read)
    assert_true("Check global has data", bgp_read.global_.config.as_ == 65001)
    assert_true("Check 'neighbors' have no data", not bgp_read.neighbors.has_data())

    # Read only 'neighbors' container
    bgp_filter = openconfig_bgp.Bgp()
    bgp_filter.neighbors = YFilter.read
    bgp_read = crud.read_config(ncc, bgp_filter)
    assert_true("Get Neighbors Results", bgp_read)
    assert_true("Check number of neighbors", len(bgp_read.neighbors.neighbor) == 2)
    assert_true("Check 'globals' have no data", not bgp_read.global_.has_data())

Logs

/home/ygorelik/venv/bin/python3 /home/ygorelik/ydk-gen/scripts/tests/test_999.py
2020-06-27 11:23:39,014 - ydk - INFO - Executing CRUD delete operation on [openconfig-bgp:bgp]
2020-06-27 11:23:39,014 - ydk - INFO - Executing 'edit-config' RPC on [openconfig-bgp:bgp]
2020-06-27 11:23:39,037 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <target>
    <candidate/>
  </target>
  <config><bgp xmlns="http://openconfig.net/yang/bgp" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"/>
</config>
</edit-config>
</rpc>
2020-06-27 11:23:39,062 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
  <ok/>
</rpc-reply>

2020-06-27 11:23:39,062 - ydk - INFO - Executing 'commit' RPC
2020-06-27 11:23:39,062 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><commit xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"/>
</rpc>
2020-06-27 11:23:39,136 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="3">
  <ok/>
</rpc-reply>

2020-06-27 11:23:39,136 - ydk - INFO - Operation succeeded
2020-06-27 11:23:39,156 - ydk - INFO - Executing CRUD create operation on [openconfig-bgp:bgp]
2020-06-27 11:23:39,168 - ydk - INFO - Executing 'edit-config' RPC on [openconfig-bgp:bgp]
2020-06-27 11:23:39,186 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <target>
    <candidate/>
  </target>
  <config><bgp xmlns="http://openconfig.net/yang/bgp" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="merge">
  <global>
    <config>
      <as>65001</as>
      <router-id>1.2.3.4</router-id>
    </config>
  </global>
  <neighbors>
    <neighbor>
      <neighbor-address>1.2.3.4</neighbor-address>
      <config>
        <neighbor-address>1.2.3.4</neighbor-address>
      </config>
    </neighbor>
    <neighbor>
      <neighbor-address>1.2.3.5</neighbor-address>
      <config>
        <neighbor-address>1.2.3.5</neighbor-address>
      </config>
    </neighbor>
  </neighbors>
</bgp>
</config>
</edit-config>
</rpc>
2020-06-27 11:23:39,230 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="4">
  <ok/>
</rpc-reply>

2020-06-27 11:23:39,231 - ydk - INFO - Executing 'commit' RPC
2020-06-27 11:23:39,231 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><commit xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"/>
</rpc>
2020-06-27 11:23:39,328 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="5">
  <ok/>
</rpc-reply>

2020-06-27 11:41:31,573 - ydk - INFO - Operation succeeded
2020-06-27 11:41:31,587 - ydk - INFO - Executing CRUD read_config operation on [openconfig-bgp:bgp]
2020-06-27 11:41:31,588 - ydk - INFO - Executing 'get' RPC on [openconfig-bgp:bgp] from running
2020-06-27 11:41:31,590 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><get-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <source>
    <running/>
  </source>
  <filter><bgp xmlns="http://openconfig.net/yang/bgp">
  <global/>
</bgp></filter>
</get-config>
</rpc>
2020-06-27 11:41:31,618 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6">
  <data>
    <bgp xmlns="http://openconfig.net/yang/bgp">
      <global>
        <config>
          <as>65001</as>
          <router-id>1.2.3.4</router-id>
        </config>
      </global>
    </bgp>
  </data>
</rpc-reply>

2020-06-27 11:23:39,329 - ydk - INFO - Operation succeeded
2020-06-27 11:23:39,352 - ydk - INFO - Executing CRUD read_config operation on [openconfig-bgp:bgp]
2020-06-27 11:23:39,352 - ydk - INFO - Executing 'get' RPC on [openconfig-bgp:bgp] from running
2020-06-27 11:23:39,362 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><get-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <source>
    <running/>
  </source>
  <filter><bgp xmlns="http://openconfig.net/yang/bgp"/></filter>
</get-config>
</rpc>
2020-06-27 11:23:39,399 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6">
  <data>
    <bgp xmlns="http://openconfig.net/yang/bgp">
      <global>
        <config>
          <as>65001</as>
          <router-id>1.2.3.4</router-id>
        </config>
      </global>
      <neighbors>
        <neighbor>
          <neighbor-address>1.2.3.4</neighbor-address>
          <config>
            <neighbor-address>1.2.3.4</neighbor-address>
          </config>
        </neighbor>
        <neighbor>
          <neighbor-address>1.2.3.5</neighbor-address>
          <config>
            <neighbor-address>1.2.3.5</neighbor-address>
          </config>
        </neighbor>
      </neighbors>
    </bgp>
  </data>
</rpc-reply>

Failed Test Check 'globals' have no data
2020-06-27 11:23:39,510 - ydk - INFO - Disconnected from device

Process finished with exit code 0

System Information

YDK-0.8.4 with openconfig or ydktest bundle

ygorelik commented 4 years ago

There is an error in the script in line:

bgp_filter.neighbors = YFilter.read

Should be:

bgp_filter.neighbors.yfilter = YFilter.read

After correction the script runs with no errors. Hence closing the issue.