[WORKFLOW SDK BUG] Workflow constructors reject Unix-domain socket DAPR_GRPC_ENDPOINT
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 78/100
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.
Description
Expected Behavior
WorkflowRuntime and DaprWorkflowClient should accept an absolute Unix-domain socket endpoint supplied through DAPR_GRPC_ENDPOINT, for example:
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:
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:
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:
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:
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.
- Dominant language
- Python
- Stars
- 272
- Forks
- 152
- Avg merge
- 1d 13h
- Merged PRs (30d)
- 4
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from dapr/python-sdk
-
dapr-ext-workflow good first issue kind/enhancement P2
Difficulty 2/5 1-2 days Newbie friendliness 72/100
dapr/python-sdk#853 · 4 comments ·
-
feature-request
Difficulty 3/5 1-2 days Newbie friendliness 76/100
dapr/python-sdk#1214 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 76/100
dapr/python-sdk#1200 ·
-
dapr-ext-workflow kind/enhancement
Difficulty 3/5 1-2 days Newbie friendliness 58/100
dapr/python-sdk#1188 ·
-
dapr-ext-workflow kind/enhancement
Difficulty 4/5 3-5 days Newbie friendliness 48/100
dapr/python-sdk#1181 · 1 assignee ·
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
use-agent-os/agent-os#3314 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
BasedHardware/omi#15662 · 1 comment ·
-
documentation help wanted
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
AiursoftWeb/AnduinOS-2#19 ·