Skip to content

Commit e4a6403

Browse files
feat(client): add task hub name filter to orchestration queries (#295)
Closes #222. - Adds ask_hub_names: list[str] | None = None to OrchestrationQuery. - Serializes ask_hub_names into InstanceQuery.taskHubNames as epeated google.protobuf.StringValue in �uild_query_instances_req(). - Updates unit tests covering ask_hub_names serialization independently, combined with instance_id_prefix, and verifying positional argument order preservation. - Documents the addition in CHANGELOG.md under Unreleased.
1 parent 040c9e5 commit e4a6403

4 files changed

Lines changed: 31 additions & 0 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## Unreleased
99

10+
ADDED
11+
12+
- Added `OrchestrationQuery.task_hub_names` to filter orchestration instances
13+
by one or more task hubs.
14+
1015
FIXED
1116

1217
- Large-payload externalization now checks every eligible payload's maximum

‎durabletask/client.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ class OrchestrationQuery:
197197
max_instance_count: int | None = (1 << 31) - 1
198198
fetch_inputs_and_outputs: bool = False
199199
instance_id_prefix: str | None = None
200+
task_hub_names: list[str] | None = None
200201

201202

202203
@dataclass

‎durabletask/internal/client_helpers.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ def build_query_instances_req(
103103
runtimeStatus=[status.value for status in orchestration_query.runtime_status] if orchestration_query.runtime_status else None,
104104
createdTimeFrom=helpers.new_timestamp(orchestration_query.created_time_from) if orchestration_query.created_time_from else None,
105105
createdTimeTo=helpers.new_timestamp(orchestration_query.created_time_to) if orchestration_query.created_time_to else None,
106+
taskHubNames=[wrappers_pb2.StringValue(value=name) for name in orchestration_query.task_hub_names] if orchestration_query.task_hub_names else None,
106107
instanceIdPrefix=helpers.get_string_value(orchestration_query.instance_id_prefix),
107108
maxInstanceCount=orchestration_query.max_instance_count,
108109
fetchInputsAndOutputs=orchestration_query.fetch_inputs_and_outputs,

‎tests/durabletask/test_batch_actions.py‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,36 @@ def test_orchestration_query_serializes_instance_id_prefix():
197197
assert request.query.instanceIdPrefix.value == "prefix-"
198198

199199

200+
def test_orchestration_query_serializes_task_hub_names():
201+
request = build_query_instances_req(
202+
client.OrchestrationQuery(task_hub_names=["hub1", "hub2"]),
203+
continuation_token=None,
204+
)
205+
206+
assert [name.value for name in request.query.taskHubNames] == ["hub1", "hub2"]
207+
208+
209+
def test_orchestration_query_serializes_task_hub_names_and_instance_id_prefix():
210+
request = build_query_instances_req(
211+
client.OrchestrationQuery(
212+
instance_id_prefix="prefix-",
213+
task_hub_names=["hub1"],
214+
),
215+
continuation_token=None,
216+
)
217+
218+
assert request.query.HasField("instanceIdPrefix")
219+
assert request.query.instanceIdPrefix.value == "prefix-"
220+
assert [name.value for name in request.query.taskHubNames] == ["hub1"]
221+
222+
200223
def test_orchestration_query_preserves_positional_argument_order():
201224
query = client.OrchestrationQuery(None, None, None, None, True)
202225

203226
assert query.max_instance_count is None
204227
assert query.fetch_inputs_and_outputs is True
205228
assert query.instance_id_prefix is None
229+
assert query.task_hub_names is None
206230

207231

208232
def test_get_orchestration_state_pagination_succeeds(backend):

0 commit comments

Comments
 (0)