Skip to content
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
8d80529
feat: Add serverless activities support with new gRPC service and client
YunchuWang May 22, 2026
b502afb
Remove serverless worker wakeup listener
YunchuWang May 22, 2026
79e8c92
refactor: Rename DurableTaskSchedulerServerlessWorker to ServerlessWo…
YunchuWang May 22, 2026
31218f3
remove public pull
YunchuWang May 22, 2026
ea10305
Align serverless declarations with dotnet
YunchuWang May 28, 2026
ad041de
Rename serverless to on-demand-sandbox APIs
YunchuWang Jun 2, 2026
b741449
Use gRPC status for serverless worker registration
YunchuWang Jun 2, 2026
a50ea45
Add on-demand sandbox preview package
YunchuWang Jun 8, 2026
d33077c
Fix on-demand sandbox preview layout
YunchuWang Jun 8, 2026
0e56d02
Remove unrelated Python PR noise
YunchuWang Jun 8, 2026
4c692f0
Restore unrelated repo files
YunchuWang Jun 8, 2026
7a93746
rename
YunchuWang Jun 8, 2026
9d409d6
Introduce activity hooks; update on-demand worker
YunchuWang Jun 9, 2026
5ecc8f8
Address on-demand sandbox review feedback
YunchuWang Jun 9, 2026
eb1d6c3
Simplify sandbox container image options
YunchuWang Jun 9, 2026
ce19f8a
Merge branch 'main' into wangbill/serverless-op1
YunchuWang Jun 9, 2026
f5fd86b
Simplify sandbox worker activity tracking
YunchuWang Jun 9, 2026
e4b1b5a
Separate sandbox management client from worker transport
YunchuWang Jun 9, 2026
5094781
Split on-demand sandbox client modules
YunchuWang Jun 9, 2026
cd6994e
Address on-demand sandbox review comments
YunchuWang Jun 9, 2026
28c04b0
Remove duplicate sandbox normalization helper
YunchuWang Jun 9, 2026
f4376b9
Move sandbox normalization helpers to private module
YunchuWang Jun 9, 2026
3af18ca
Rename sandbox normalization module to helpers
YunchuWang Jun 9, 2026
dd611af
Update sandbox helper imports
YunchuWang Jun 9, 2026
f79b78b
Use standard helpers module name
YunchuWang Jun 9, 2026
a31e605
Simplify on-demand sandbox worker sample wait
YunchuWang Jun 10, 2026
30bbe86
Potential fix for pull request finding 'Empty except'
YunchuWang Jun 10, 2026
445c8af
Potential fix for pull request finding
YunchuWang Jun 10, 2026
080ca1b
Potential fix for pull request finding
YunchuWang Jun 10, 2026
e8ee577
Potential fix for pull request finding
YunchuWang Jun 10, 2026
f35524d
Fix on-demand sandbox CI checks
YunchuWang Jun 10, 2026
146da0d
Align sandbox transport stub typing
YunchuWang Jun 10, 2026
50f5631
Align sandbox worker hook annotations
YunchuWang Jun 10, 2026
4385ef8
Resolve sandbox transport code quality comments
YunchuWang Jun 10, 2026
5eef77a
Require matching core SDK for sandbox worker
YunchuWang Jun 10, 2026
9ea00af
Update generated protobuf files from durabletask-protobuf@98e1384
YunchuWang Jun 10, 2026
46d63fd
Align generated protos with protobuf PR
YunchuWang Jun 10, 2026
d3f1f99
Regenerate proto without exclude activity filters
YunchuWang Jun 10, 2026
0deae2a
Validate on-demand sandbox substrate
YunchuWang Jun 11, 2026
950c3ef
Rename sandbox preview API
YunchuWang Jun 12, 2026
fdf908a
remove default worker profile
YunchuWang Jun 12, 2026
db28f3f
Align sandbox preview behavior with dotnet
YunchuWang Jun 13, 2026
732fd59
Update sandbox proto source path
YunchuWang Jun 13, 2026
47517af
Tighten sandbox activity metadata validation
YunchuWang Jun 13, 2026
ee33bb6
Apply sandbox image proto updates
YunchuWang Jun 13, 2026
660101d
Rename sandbox declarations to worker profiles
YunchuWang Jun 14, 2026
587b8cc
Add sandbox activity versions to worker profiles
YunchuWang Jun 15, 2026
0ecfaaf
Sync sandbox proto hash and simplify activity hooks
YunchuWang Jun 15, 2026
37513f8
Clarify sandbox preview wording
YunchuWang Jun 15, 2026
34c7f8c
Merge branch 'main' into wangbill/serverless-op1
YunchuWang Jun 16, 2026
2ccbf85
Align sandbox preview APIs with dotnet
YunchuWang Jun 17, 2026
eba60e4
Fix sandbox worker pyright override
YunchuWang Jun 17, 2026
a2480f5
Merge main and align sandbox options
YunchuWang Jun 17, 2026
ea40f0c
Default sandbox sample activities to unversioned
YunchuWang Jun 17, 2026
1e9ed95
Use base worker activity registration for sandboxes
YunchuWang Jun 17, 2026
27d2745
Split sandbox profile builders
YunchuWang Jun 17, 2026
883fb3d
save
YunchuWang Jun 18, 2026
b4e5c33
save
YunchuWang Jun 18, 2026
7f063fd
Retry failed precondition sandbox registrations
YunchuWang Jun 18, 2026
ecc6422
Tighten sandbox changelog wording
YunchuWang Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,12 @@ install:

gen-proto:
curl -o durabletask/internal/orchestrator_service.proto https://raw.githubusercontent.com/microsoft/durabletask-protobuf/refs/heads/main/protos/orchestrator_service.proto
curl -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/microsoft/durabletask-protobuf/commits?path=protos/orchestrator_service.proto&sha=main&per_page=1" | jq -r '.[0].sha' >> durabletask/internal/PROTO_SOURCE_COMMIT_HASH
curl -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/microsoft/durabletask-protobuf/commits?path=protos/orchestrator_service.proto&sha=main&per_page=1" | jq -r '.[0].sha' > durabletask/internal/PROTO_SOURCE_COMMIT_HASH
python3 -m grpc_tools.protoc --proto_path=. --python_out=. --pyi_out=. --grpc_python_out=. ./durabletask/internal/orchestrator_service.proto
rm durabletask/internal/*.proto
ON_DEMAND_SANDBOX_PROTO_SOURCE_COMMIT_HASH=$$(cat durabletask-azuremanaged/durabletask/azuremanaged/internal/ON_DEMAND_SANDBOX_PROTO_SOURCE_COMMIT_HASH); \
curl -o durabletask-azuremanaged/durabletask/azuremanaged/internal/on_demand_sandbox_activities_service.proto https://raw.githubusercontent.com/microsoft/durabletask-protobuf/$${ON_DEMAND_SANDBOX_PROTO_SOURCE_COMMIT_HASH}/protos/serverless_activities_service.proto
python3 -m grpc_tools.protoc --proto_path=. --python_out=. --pyi_out=. --grpc_python_out=. ./durabletask-azuremanaged/durabletask/azuremanaged/internal/on_demand_sandbox_activities_service.proto
rm durabletask-azuremanaged/durabletask/azuremanaged/internal/*.proto

.PHONY: init test gen-proto install
6 changes: 6 additions & 0 deletions durabletask-azuremanaged/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## Unreleased

- Added preview `durabletask.azuremanaged.preview.on_demand_sandbox` APIs for
declaring Durable Task Scheduler on-demand sandbox activities, registering
worker profiles, and running sandbox activity workers.

## v1.5.0

- Updates base dependency to durabletask v1.5.0
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3c481ecf6e4888766dd1317456693ace92ca3669

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

class SubstrateKind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = ()
SUBSTRATE_KIND_UNSPECIFIED: _ClassVar[SubstrateKind]
SUBSTRATE_KIND_ACA_SESSION_POOL: _ClassVar[SubstrateKind]
SUBSTRATE_KIND_SANDBOX: _ClassVar[SubstrateKind]
SUBSTRATE_KIND_UNSPECIFIED: SubstrateKind
SUBSTRATE_KIND_ACA_SESSION_POOL: SubstrateKind
SUBSTRATE_KIND_SANDBOX: SubstrateKind

class OnDemandSandboxActivityWorkerMessage(_message.Message):
__slots__ = ("start", "heartbeat")
START_FIELD_NUMBER: _ClassVar[int]
HEARTBEAT_FIELD_NUMBER: _ClassVar[int]
start: OnDemandSandboxActivityWorkerStart
heartbeat: OnDemandSandboxActivityWorkerHeartbeat
def __init__(self, start: _Optional[_Union[OnDemandSandboxActivityWorkerStart, _Mapping]] = ..., heartbeat: _Optional[_Union[OnDemandSandboxActivityWorkerHeartbeat, _Mapping]] = ...) -> None: ...

class OnDemandSandboxActivityWorkerStart(_message.Message):
__slots__ = ("task_hub", "max_activities_count", "substrate", "dts_sandbox_identifier", "worker_profile_id", "activity_names")
TASK_HUB_FIELD_NUMBER: _ClassVar[int]
MAX_ACTIVITIES_COUNT_FIELD_NUMBER: _ClassVar[int]
SUBSTRATE_FIELD_NUMBER: _ClassVar[int]
DTS_SANDBOX_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
WORKER_PROFILE_ID_FIELD_NUMBER: _ClassVar[int]
ACTIVITY_NAMES_FIELD_NUMBER: _ClassVar[int]
task_hub: str
max_activities_count: int
substrate: SubstrateKind
dts_sandbox_identifier: str
worker_profile_id: str
activity_names: _containers.RepeatedScalarFieldContainer[str]
def __init__(self, task_hub: _Optional[str] = ..., max_activities_count: _Optional[int] = ..., substrate: _Optional[_Union[SubstrateKind, str]] = ..., dts_sandbox_identifier: _Optional[str] = ..., worker_profile_id: _Optional[str] = ..., activity_names: _Optional[_Iterable[str]] = ...) -> None: ...

class OnDemandSandboxActivityWorkerHeartbeat(_message.Message):
__slots__ = ("active_activities_count",)
ACTIVE_ACTIVITIES_COUNT_FIELD_NUMBER: _ClassVar[int]
active_activities_count: int
def __init__(self, active_activities_count: _Optional[int] = ...) -> None: ...

class OnDemandSandboxActivityWorkerSessionResult(_message.Message):
__slots__ = ("message",)
MESSAGE_FIELD_NUMBER: _ClassVar[int]
message: str
def __init__(self, message: _Optional[str] = ...) -> None: ...

class OnDemandSandboxActivityDeclaration(_message.Message):
__slots__ = ("worker_profile_id", "activity_names", "image", "environment_variables", "max_concurrent_activities", "resources", "entrypoint", "cmd", "scheduler_managed_identity_client_id")
class EnvironmentVariablesEntry(_message.Message):
__slots__ = ("key", "value")
KEY_FIELD_NUMBER: _ClassVar[int]
VALUE_FIELD_NUMBER: _ClassVar[int]
key: str
value: str
def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ...
WORKER_PROFILE_ID_FIELD_NUMBER: _ClassVar[int]
ACTIVITY_NAMES_FIELD_NUMBER: _ClassVar[int]
IMAGE_FIELD_NUMBER: _ClassVar[int]
ENVIRONMENT_VARIABLES_FIELD_NUMBER: _ClassVar[int]
MAX_CONCURRENT_ACTIVITIES_FIELD_NUMBER: _ClassVar[int]
RESOURCES_FIELD_NUMBER: _ClassVar[int]
ENTRYPOINT_FIELD_NUMBER: _ClassVar[int]
CMD_FIELD_NUMBER: _ClassVar[int]
SCHEDULER_MANAGED_IDENTITY_CLIENT_ID_FIELD_NUMBER: _ClassVar[int]
worker_profile_id: str
activity_names: _containers.RepeatedScalarFieldContainer[str]
image: OnDemandSandboxActivityImage
environment_variables: _containers.ScalarMap[str, str]
max_concurrent_activities: int
resources: OnDemandSandboxActivityResources
entrypoint: _containers.RepeatedScalarFieldContainer[str]
cmd: _containers.RepeatedScalarFieldContainer[str]
scheduler_managed_identity_client_id: str
def __init__(self, worker_profile_id: _Optional[str] = ..., activity_names: _Optional[_Iterable[str]] = ..., image: _Optional[_Union[OnDemandSandboxActivityImage, _Mapping]] = ..., environment_variables: _Optional[_Mapping[str, str]] = ..., max_concurrent_activities: _Optional[int] = ..., resources: _Optional[_Union[OnDemandSandboxActivityResources, _Mapping]] = ..., entrypoint: _Optional[_Iterable[str]] = ..., cmd: _Optional[_Iterable[str]] = ..., scheduler_managed_identity_client_id: _Optional[str] = ...) -> None: ...

class OnDemandSandboxActivityImage(_message.Message):
__slots__ = ("image_ref", "managed_identity_client_id")
IMAGE_REF_FIELD_NUMBER: _ClassVar[int]
MANAGED_IDENTITY_CLIENT_ID_FIELD_NUMBER: _ClassVar[int]
image_ref: str
managed_identity_client_id: str
def __init__(self, image_ref: _Optional[str] = ..., managed_identity_client_id: _Optional[str] = ...) -> None: ...

class OnDemandSandboxActivityResources(_message.Message):
__slots__ = ("cpu", "memory")
CPU_FIELD_NUMBER: _ClassVar[int]
MEMORY_FIELD_NUMBER: _ClassVar[int]
cpu: str
memory: str
def __init__(self, cpu: _Optional[str] = ..., memory: _Optional[str] = ...) -> None: ...

class OnDemandSandboxActivityDeclarationResult(_message.Message):
__slots__ = ()
def __init__(self) -> None: ...

class RemoveOnDemandSandboxActivityDeclarationRequest(_message.Message):
__slots__ = ("worker_profile_id",)
WORKER_PROFILE_ID_FIELD_NUMBER: _ClassVar[int]
worker_profile_id: str
def __init__(self, worker_profile_id: _Optional[str] = ...) -> None: ...

class RemoveOnDemandSandboxActivityDeclarationResult(_message.Message):
__slots__ = ()
def __init__(self) -> None: ...
Loading
Loading