arcalot/arcaflow-plugin-sdk-python

`required_if` is triggering even if the listed required field is not set

Closed this issue · 0 comments

Describe the bug

Using schema.required_if in a schema object is causing the SDK to report that the item is required because the other item is set, even if that item is not set.

To reproduce

Set one item in an input schema to required_if for another item. Set both items as typing.Optional with default values of None. Do not set either option in the input, and then run the plugin. Reports:

$ python3.9 arcaflow_plugin_iperf3/iperf3_plugin.py -s client --debug -f configs/iperf3-client-example.yaml 
Traceback (most recent call last):
  File "/home/dblack/git/arcaflow-plugin-iperf3/arcaflow_plugin_iperf3/iperf3_plugin.py", line 138, in <module>
    plugin.run(
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/plugin.py", line 216, in run
    return _execute_file(step_id, s, options, stdin, stdout, stderr)
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/plugin.py", line 311, in _execute_file
    output_id, output_data = s(step_id, data)
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/schema.py", line 5622, in __call__
    output_id, output_data = self._call_step(
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/schema.py", line 5578, in _call_step
    return step(
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/schema.py", line 5509, in __call__
    result = self._handler(params)
  File "/home/dblack/git/arcaflow-plugin-iperf3/arcaflow_plugin_iperf3/iperf3_plugin.py", line 114, in iperf3_client
    input_params = client_input_params_schema.serialize(params)
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/schema.py", line 5315, in serialize
    return root_object.serialize(data, tuple(new_path))
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/schema.py", line 4987, in serialize
    new_path, value = self._validate_property(data, path, field_id, property_id)
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/schema.py", line 5002, in _validate_property
    self._validate_not_set(data, property_field, tuple(new_path))
  File "/home/dblack/git/arcaflow-plugin-iperf3/venv/lib64/python3.9/site-packages/arcaflow_plugin_sdk/schema.py", line 5014, in _validate_not_set
    raise ConstraintException(
arcaflow_plugin_sdk.schema.ConstraintException: Validation failed for 'ClientInputParams -> udp': This field is required because 'udp_counters_64bit' is set

Schema snip:

...
    udp: typing.Annotated[
        typing.Optional[bool],
        schema.name("use UDP protocol"),
        schema.conflicts("sctp"),
        schema.required_if("udp_counters_64bit"),
        schema.description("use the UDP protocol for network traffic"),
    ] = None
    udp_counters_64bit: typing.Annotated[
        typing.Optional[bool],
        schema.id("udp-counters-64bit"),
        schema.name("UDP 64-bit counters"),
        schema.description("use 64-bit counters in UDP test packets"),
    ] = None
...

Input yaml:

port: 50000
interval: 10
time: 5

Additional context

See: https://github.com/arcalot/arcaflow-plugin-iperf3/blob/ffbc127e010b9c731fd5eb2967d634867f609975/arcaflow_plugin_iperf3/iperf3_schema.py#L191-L193