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

Open
#1,213 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

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

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

dapr-ext-workflow kind/enhancement

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dapr/python-sdk

All issues in dapr/python-sdk

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.