Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

'delete' and 'replace' filters do not work properly with gNMI and CRUD service #881

Closed
111pontes opened this issue Feb 21, 2019 · 1 comment
Assignees
Labels
Milestone

Comments

@111pontes
Copy link
Collaborator

from ydk.path import Repository
from ydk.gnmi.providers import gNMIServiceProvider
from ydk.services import CRUDService
from ydk.models.openconfig import openconfig_interfaces as oc_interfaces
from ydk.models.ietf import iana_if_type
from ydk.filters import YFilter

interfaces = oc_interfaces.Interfaces()
interface = interfaces.Interface()
interface.name = name
interface.config.name = name
interface.config.type = iana_if_type.EthernetCsmacd()
interface.config.description = ''
interface.config.enabled = False
#interface.subinterfaces.yfilter = YFilter.delete
interfaces.interface.append(interface)
interfaces.yfilter = YFilter.replace

crud.update(gnmi, interfaces)
2019-02-20 18:27:03,299 - ydk - INFO - gNMIServiceProvider Connected to 198.18.1.11 via Insecure Channel
2019-02-20 18:27:03,326 - ydk - INFO - Executing CRUD update operation on [openconfig-interfaces:interfaces]
2019-02-20 18:27:03,326 - ydk - INFO - Executing set gRPC operation 'update' on entity 'openconfig-interfaces:interfaces'
2019-02-20 18:27:03,351 - ydk - INFO - 
=============== Set Request Sent ================
update {
  path {
    origin: "openconfig-interfaces"
    elem {
      name: "interfaces"
    }
  }
  val {
    json_ietf_val: "{\"interface\":[{\"name\":\"GigabitEthernet0/0/0/0\",\"config\":{\"type\":\"iana-if-type:ethernetCsmacd\",\"name\":\"GigabitEthernet0/0/0/0\",\"description\":\"\",\"enabled\":false},\"subinterfaces\":{\"@\":{\"ietf-netconf:operation\":\"delete\"}}}]}"
  }
}


2019-02-20 18:27:03,393 - ydk - ERROR - SetRequest failed with error:
gNMI: set-request update/replace: unknown-element: Unknown element is specified: @
Traceback (most recent call last):
  File "./remove_peer_interface.py", line 100, in <module>
    crud.update(provider, interfaces)
  File "/usr/local/lib/python3.6/dist-packages/ydk/errors/error_handler.py", line 112, in helper
    return func(self, provider, entity, *args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/ydk/services/crud_service.py", line 98, in update
    return self._crud.update(provider, entity)
  File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__
    self.gen.throw(type, value, traceback)
  File "/usr/local/lib/python3.6/dist-packages/ydk/errors/error_handler.py", line 82, in handle_runtime_error
    _raise(_exc)
  File "/usr/local/lib/python3.6/dist-packages/ydk/errors/error_handler.py", line 54, in _raise
    exec("raise exc from None")
  File "<string>", line 1, in <module>
ydk.errors.YServiceProviderError:  SetRequest failed with error:
gNMI: set-request update/replace: unknown-element: Unknown element is specified: @
2019-02-20 18:27:03,488 - ydk - INFO - Disconnected from device
$ pip list | grep ydk
ydk                     0.8.1.post1
ydk-models-cisco-ios-xr 6.5.1.post1
ydk-models-ietf         0.1.5.post2
ydk-models-openconfig   0.1.6.post1
ydk-service-gnmi        0.4.0.post1
$ 
@111pontes 111pontes added the bug label Feb 21, 2019
@ghost ghost added this to the 0.8.2 milestone Mar 5, 2019
@ygorelik ygorelik changed the title delete and replace filters doesn't work properly with gNMI and CRUD service 'delete' and 'replace' filters do not work properly with gNMI and CRUD service Mar 6, 2019
@ygorelik
Copy link
Collaborator

ygorelik commented Mar 7, 2019

Fixed with this commit; component - gnmi_provider.cpp.

Tested 'delete' with this script

import logging

from ydk.path import Repository
from ydk.gnmi.providers import gNMIServiceProvider
from ydk.providers import NetconfServiceProvider
from ydk.services import CRUDService
from ydk.filters import YFilter
from test_utils import enable_logging

from ydk.models.ydktest_oc_nis import openconfig_interfaces as oc_interfaces
from ydk.models.ydktest_oc_nis import iana_if_type

enable_logging(logging.INFO)

interfaces = oc_interfaces.Interfaces()
interface = interfaces.Interface()
interface.name = '"TenGigE0/0/0/0"'
interfaces.interface.append(interface)
interfaces.yfilter = YFilter.delete

# mixed operations not supported, issue #885
#interface.subinterfaces.yfilter = YFilter.delete

repo = Repository('/home/yan/.ydk/172.27.150.154')
provider = gNMIServiceProvider(repo,
                               address='172.27.150.154',
                               port=57800,
                               username='root',
                               password='Cisco1234!')
crud = CRUDService()
r = crud.update(provider, interfaces)

Results

yan@ubuntu-yan:~/ydk-workspace/ydk-gen$ python scripts/tests/test_881.py 
2019-03-07 10:50:55,941 - ydk - INFO - gNMIServiceProvider Connected to 172.27.150.154 via Insecure Channel
2019-03-07 10:50:55,941 - ydk - INFO - Executing CRUD update operation on [openconfig-interfaces:interfaces]
2019-03-07 10:50:55,941 - ydk - INFO - Executing set gRPC operation 'delete' on entity 'openconfig-interfaces:interfaces'
2019-03-07 10:50:55,946 - ydk - INFO - 
=============== Set Request Sent ================
delete {
  origin: "openconfig-interfaces"
  elem {
    name: "interfaces"
  }
  elem {
    name: "interface"
    key {
      key: "name"
      value: "\"TenGigE0/0/0/0\""
    }
  }
  elem {
    name: "config"
  }
}

2019-03-07 10:50:57,066 - ydk - INFO - 
============= Set Response Received =============
response {
  path {
    origin: "openconfig-interfaces"
    elem {
      name: "interfaces"
    }
    elem {
      name: "interface"
      key {
        key: "name"
        value: "\"TenGigE0/0/0/0\""
      }
    }
    elem {
      name: "config"
    }
  }
  message {
  }
  op: DELETE
}
message {
}
timestamp: 1551955857000096808

2019-03-07 10:50:57,067 - ydk - INFO - Set Operation Succeeded
2019-03-07 10:50:57,067 - ydk - INFO - Operation succeeded
2019-03-07 10:50:57,067 - ydk - INFO - Disconnected from device

Tested 'replace' with this script

import logging

from ydk.path import Repository
from ydk.gnmi.providers import gNMIServiceProvider
from ydk.providers import NetconfServiceProvider
from ydk.services import CRUDService
from ydk.filters import YFilter
from test_utils import enable_logging

from ydk.models.ydktest_oc_nis import openconfig_interfaces as oc_interfaces
from ydk.models.ydktest_oc_nis import iana_if_type

enable_logging(logging.INFO)

interfaces = oc_interfaces.Interfaces()
interface = interfaces.Interface()
interface.name = 'TenGigE0/0/0/0'
interface.config.name = 'TenGigE0/0/0/0'
interface.config.type = iana_if_type.EthernetCsmacd()
interface.config.description = 'Testing'
interface.config.enabled = False
interfaces.interface.append(interface)
interfaces.yfilter = YFilter.replace

repo = Repository('/home/yan/.ydk/172.27.150.154')
provider = gNMIServiceProvider(repo,
                               address='172.27.150.154',
                               port=57800,
                               username='root',
                               password='Cisco1234!')
crud = CRUDService()
r = crud.update(provider, interfaces)

Result

yan@ubuntu-yan:~/ydk-workspace/ydk-gen$ python scripts/tests/test_881.py 
2019-03-07 10:56:42,596 - ydk - INFO - gNMIServiceProvider Connected to 172.27.150.154 via Insecure Channel
2019-03-07 10:56:42,596 - ydk - INFO - Executing CRUD update operation on [openconfig-interfaces:interfaces]
2019-03-07 10:56:42,596 - ydk - INFO - Executing set gRPC operation 'replace' on entity 'openconfig-interfaces:interfaces'
2019-03-07 10:56:42,612 - ydk - INFO - 
=============== Set Request Sent ================
replace {
  path {
    origin: "openconfig-interfaces"
    elem {
      name: "interfaces"
    }
  }
  val {
    json_ietf_val: "{\"interface\":[{\"name\":\"\\\"TenGigE0/0/0/0\\\"\",\"config\":{\"type\":\"iana-if-type:ethernetCsmacd\",\"name\":\"\\\"TenGigE0/0/0/0\\\"\",\"description\":\"Testing\",\"enabled\":false}}]}"
  }
}


2019-03-07 10:56:42,683 - ydk - INFO - 
============= Set Response Received =============
response {
  path {
    origin: "openconfig-interfaces"
    elem {
      name: "interfaces"
    }
  }
  message {
  }
  op: REPLACE
}
message {
}

2019-03-07 10:56:42,690 - ydk - INFO - Disconnected from device

Note 1. In results the SetRequest operation corresponds to the filter set on the top-level entity.
Note 2. Current implementation of gNMI Service does not support setting of replace/update/delete filters on non-top-level entities or leaves. There is open enhancement for this issue - #885.

@ygorelik ygorelik closed this as completed Mar 7, 2019
@ygorelik ygorelik self-assigned this Aug 12, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants