dapr / dapr/python-sdk

[WORKFLOW SDK BUG] Workflow constructors reject Unix-domain socket DAPR_GRPC_ENDPOINT

Open
#1,213 0 comments 0 reactions 0 assignees View on GitHub
dapr-ext-workflow kind/enhancement
Dominant language
Python
Stars
272
Forks
152
PR merge metrics
No merged PRs in 30d

Description

## Expected Behavior
`WorkflowRuntime` and `DaprWorkflowClient` should accept an absolute Unix-domain socket endpoint supplied through `DAPR_GRPC_ENDPOINT`, for example:

```text
unix:///private/tmp/dapr-sockets/dapr-myapp-grpc.socket
```

`GrpcEndpoint` explicitly lists unix as an accepted scheme, so an absolute socket path should be accepted and converted to a gRPC-compatible Unix socket target.

This is needed when separate local applications each run their own Dapr sidecar. Unix-domain sockets avoid requiring every independently launched application to coordinate or search for a unique host TCP port.

## Actual Behavior

Both Workflow SDK constructors fail immediately while parsing the endpoint, before making any network connection:

```
ValueError: paths are not supported for gRPC endpoints: '/private/tmp/dapr-sockets/dapr-myapp-grpc.socket'

The above exception was the direct cause of the following exception:

dapr.clients.exceptions.DaprInternalError: paths are not supported for gRPC endpoints: '/private/tmp/dapr-sockets/dapr-myapp-grpc.socket'
```
The failure occurs because GrpcEndpoint accepts unix as a scheme but then rejects every parsed URI containing a path:

```python
class URIParseConfig:
ACCEPTED_SCHEMES = [
"dns",
"unix",
"unix-abstract",
"vsock",
"http",
"https",
]

def _validate_path_and_query(self) -> None:
if self._parsed_url.path:
raise ValueError(
f"paths are not supported for gRPC endpoints: '{self._parsed_url.path}'"
)
```

For an endpoint such as `unix:///private/tmp/dapr.sock`, the socket filename necessarily appears in `parsed_url.path`. The validation therefore makes the accepted unix scheme unusable with an absolute filesystem socket.

`WorkflowRuntime` and `DaprWorkflowClient` both pass the result of `getAddress()` through this parser:

```python
address = getAddress(host, port)

try:
uri = GrpcEndpoint(address)
except ValueError as error:
raise DaprInternalError(f"{error}") from error
```

## Steps to Reproduce the Problem

Install the released packages:

```
pip install "dapr==1.18.3" "dapr-ext-workflow==1.18.3"
```

Run:

```python
from dapr.conf import settings
from dapr.ext.workflow import WorkflowRuntime

settings.DAPR_GRPC_ENDPOINT = (
"unix:///private/tmp/dapr-sockets/dapr-myapp-grpc.socket"
)

WorkflowRuntime()
```

Result:

```
Traceback (most recent call last):
...
File ".../dapr/conf/helpers.py", line ..., in _validate_path_and_query
raise ValueError(
ValueError: paths are not supported for gRPC endpoints: '/private/tmp/dapr-sockets/dapr-myapp-grpc.socket'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
...
File ".../dapr/ext/workflow/workflow_runtime.py", line ..., in __init__
raise DaprInternalError(f'{error}') from error
dapr.clients.exceptions.DaprInternalError: paths are not supported for gRPC endpoints: '/private/tmp/dapr-sockets/dapr-myapp-grpc.socket'
```

`DaprWorkflowClient()` fails through the same `getAddress()` and `GrpcEndpoint` path.

The Dapr runtime does not need to be running to reproduce this. Endpoint parsing fails before any network operation.

A smaller reproduction without the Workflow SDK is:

```python
from dapr.conf.helpers import GrpcEndpoint

GrpcEndpoint(
"unix:///private/tmp/dapr-sockets/dapr-myapp-grpc.socket"
)
```

Environment where reproduced:

- Python: 3.12.13
- dapr: 1.18.3
- dapr-ext-workflow: 1.18.3
- OS: macOS
- Dapr runtime installed locally: 1.18.4, although the runtime is not reached by this reproduction

A likely fix is to allow a parsed path when the endpoint scheme is unix, while retaining the existing path restriction for endpoint schemes where paths are invalid.

Regression coverage should include both `GrpcEndpoint("unix:///tmp/dapr.sock")` and construction of `WorkflowRuntime` and `DaprWorkflowClient` when `DAPR_GRPC_ENDPOINT` contains that endpoint.

## Release Note
RELEASE NOTE: FIX Allow the Python Workflow SDK to use Unix-domain socket Dapr gRPC endpoints.

Contributor guide

Open the contributing guide

Research direction

Start in dapr/conf/helpers.py at GrpcEndpoint._validate_path_and_query and trace getAddress() into WorkflowRuntime and DaprWorkflowClient. Add regression coverage for GrpcEndpoint("unix:///tmp/dapr.sock") and both workflow constructors using DAPR_GRPC_ENDPOINT; done means absolute Unix-domain socket endpoints parse without the current ValueError.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api, backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.