ansible-networking-collections icon indicating copy to clipboard operation
ansible-networking-collections copied to clipboard

Usage of CONFIG in gNMI SetRequest()

Open mike-albano opened this issue 4 years ago • 3 comments

Attempting a gNMI SetRequest operation, it looks like the SetRequest is using the CONFIG DataType from GetRequest.

For example, using these path and values in the example playbook:

  - name: Update Nodal Configuration (using gNMI SET)
    gnmi_config:
      update:
        - path: /provision-aps/provision-ap[mac=00:11:74:*snip*]/config/hostname
          val: lab-ap.example.com

I get the following traceback:

The full traceback is:
WARNING: The below traceback may *not* be related to the actual failure.
  File "/tmp/ansible_gnmi_config_payload_U0Did_/ansible_gnmi_config_payload.zip/ansible_collections/nokia/grpc/plugins/modules/gnmi_config.py", line 135, in main
  File "/tmp/ansible_gnmi_config_payload_U0Did_/ansible_gnmi_config_payload.zip/ansible/module_utils/connection.py", line 195, in __rpc__
    raise ConnectionError(to_text(msg, errors='surrogate_then_replace'), code=code)
fatal: [192.168.2.2]: FAILED! => {
    "changed": false,
    "code": -32603,
    "invocation": {
        "module_args": {
            "backup": false,
            "backup_options": null,
            "delete": null,
            "prefix": null,
            "replace": null,
            "update": [
                {
                    "path": "/provision-aps/provision-ap[mac=00:11:74:*snip*]/config/hostname",
                    "val": "lab-ap.example.com"
                }
            ]
        }
    },
    "msg": "<_InactiveRpcError of RPC that terminated with:\n\tstatus = StatusCode.UNIMPLEMENTED\n\tdetails = \"unsupported request type: CONFIG\"\n\tdebug_error_string = \"{\"created\":\"@1612416547.477349400\",\"description\":\"Error received from peer ipv4:192.168.2.2:8080\",\"file\":\"src/core/lib/surface/call.cc\",\"file_line\":1067,\"grpc_message\":\"unsupported request type: CONFIG\",\"grpc_status\":12}\"\n>"
}

If I remove "type=config" from here the "unsupported request type: CONFIG" error goes away. I am instead hitting another error, though that error may be completely unrelated (including that below in case it helps):

The full traceback is:
WARNING: The below traceback may *not* be related to the actual failure.
  File "/tmp/ansible_gnmi_config_payload_w6AewL/ansible_gnmi_config_payload.zip/ansible_collections/nokia/grpc/plugins/modules/gnmi_config.py", line 136, in main
  File "/tmp/ansible_gnmi_config_payload_w6AewL/ansible_gnmi_config_payload.zip/ansible/module_utils/connection.py", line 195, in __rpc__
    raise ConnectionError(to_text(msg, errors='surrogate_then_replace'), code=code)
fatal: [192.168.2.2]: FAILED! => {
    "changed": false,
    "code": -32603,
    "invocation": {
        "module_args": {
            "backup": false,
            "backup_options": null,
            "delete": null,
            "prefix": null,
            "replace": null,
            "update": [
                {
                    "path": "/provision-aps/provision-ap[mac=00:11:74:*snip*]/config/hostname",
                    "val": "lab-ap.example.com"
                }
            ]
        }
    },
    "msg": "Ansible gNMI plugin does not support encoding for value: {\"stringVal\": \"tester-05.foo.net\"}"
}

...where tester-05.foo.net is the hostname assigned to the leaf referenced above.

mike-albano avatar Feb 04 '21 05:02 mike-albano

Hi @mike-albano

This gNMI Ansible plugin is taking a configuration snapshot before and after the SetRequest is executed. This is required to interwork with Ansible to enable the following features: change indicator, diff-mode and backup. If the device does not support GET type=CONFIG it implies that the OpenConfig gNMI standard is incompletely implemented. Removing the "type=config" would result in the risk, that the node returns both config and state while change indicator/diff-mode result in misleading results.

About the other issue, it would be good to understand, what capabilities your device is supporting. This Ansible plugin supports JSON and JSON IETF encoding - but must be set accordingly.

To have a deeper look, please provide the following:

  • Info about vendor, product family, chassis type and release of the DUT
  • YANG files
  • Response from Capabilities RPC
  • Playbook/Hostfile used

Best would be to have access to the DUT to do some basic testing/integration...

/wiso

wisotzky avatar Feb 04 '21 07:02 wisotzky

Missed the notification of your reply; thanks for the explanation.

"If the device does not support GET type=CONFIG..." That is indeed the case. Looking at the GetRequest Type it is true that the Targets in question have not implemented support for this. These Targets are WiFi AP's from Arista & HPE so that explains the issue I'm seeing with the SetRequest.

Since it appears that the functionality relies on this portion of the gNMI Specification being implemented, I'd say this is OK to close.

mike-albano avatar Mar 02 '21 20:03 mike-albano

Hi @mike-albano,

any update on the above... If not I would like to close that item.

wisotzky avatar Sep 22 '21 11:09 wisotzky