sonic-net / sonic-gnmi

SONiC gNMI server and gNOI repo
Other
22 stars 52 forks source link

GNMI sonic-db:CONFIG_DB model - some SET operations say that they fail, but in reality they add the data. #238

Open TafkaMax opened 6 months ago

TafkaMax commented 6 months ago

I am building my own mainline sonic with these options:

    - sed -i 's/INCLUDE_ICCPD.*\sn/INCLUDE_ICCPD = y/' rules/config
    - sed -i 's/INCLUDE_RESTAPI.*\sn/INCLUDE_RESTAPI = y/' rules/config
    - sed -i 's/.*ENABLE_TRANSLIB_WRITE\s=\s.*/ENABLE_TRANSLIB_WRITE = y/' rules/config
    - sed -i 's/INCLUDE_FIPS.*\sy/INCLUDE_FIPS = n/' rules/config

So I have translib write enabled, which is the most important thing for gnmi I suppose.

I am building the Virtual Switch image to be run in GNS3 sonic-vs.img.gz

I am using nornir for automation with pygnmi and nornir_pygnmi as the interface to communicate with the sonic gnmi endpoint.

Some set operations work, but others don't. For example enabling and disabling features works. But when I try to update or replace SYSLOG_SERVER or NTP_SERVER it fails, but it also doesn't fail.

grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
    status = StatusCode.UNKNOWN
    details = "Error: Failed to apply patch on the following scopes:"
    debug_error_string = "UNKNOWN:Error received from peer  {created_time:"2024-05-14T16:41:39.262722796+03:00", grpc_status:2, grpc_message:"Error: Failed to apply patch on the following scopes:"}"
>

The code itself looks like this:

def sonic_ntp(task: Task) -> MultiResult:
  ntp_servers = {}
  for ntp_server in task.host.get('ntp_servers'):
    ntp_servers[ntp_server] = {
      "association_type": "pool",
      "iburst": "off",
      "admin_state": "disabled",
      "version": 4,
    }

  NTP_SETTINGS = [
      (
        "/sonic-db:CONFIG_DB/localhost/NTP_SERVER",
        ntp_servers
      )
  ]
  result = task.run(name="Configure NTP settings for SONiC appliance", task=gnmi_set, update=NTP_SETTINGS, encoding='json_ietf')
  return result

As you can see the endpoint is /sonic-db:CONFIG_DB/localhost/NTP_SERVER (https://github.com/sonic-net/sonic-buildimage/blob/master/src/sonic-yang-models/doc/Configuration.md#ntp-servers)

The data is inserted into the model, but the pygnmi connection does not recieve something back that it wants and fails.

sneelam20 commented 5 months ago

@qiluo-msft Would you be able to take a look at this?