mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-09-29 04:55:09 +02:00
WIP: chore(cli): support DR for deploy command (#7098)
- [ ] **Add tests and docs**: If you're adding a new integration, you must include: 1. A test for the integration, preferably unit tests that do not rely on network access, 2. An example notebook showing its use. It lives in `docs/docs/integrations` directory. - [ ] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. We will not consider a PR unless these three are passing in CI. See [contribution guidelines](https://docs.langchain.com/oss/python/contributing/overview) for more. Additional guidelines: - Make sure optional dependencies are imported within a function. - Please do not add dependencies to `pyproject.toml` files (even optional ones) unless they are **required** for unit tests. - Most PRs should not touch more than one package. - Changes should be backwards compatible.
This commit is contained in:
@@ -946,18 +946,19 @@ def test_prepare_args_and_stdin_distributed_mode() -> None:
|
||||
api_version="0.7.67",
|
||||
)
|
||||
|
||||
# API service should use langgraph-api base image
|
||||
assert "FROM langchain/langgraph-api:" in actual_stdin
|
||||
# API service should use langgraph-api base image with pinned version
|
||||
assert "FROM langchain/langgraph-api:0.7.67-py3.11" in actual_stdin
|
||||
|
||||
# Distributed mode sets N_JOBS_PER_WORKER=0 on the API service
|
||||
assert 'N_JOBS_PER_WORKER: "0"' in actual_stdin
|
||||
|
||||
# Orchestrator service present
|
||||
# Orchestrator service present with pinned version
|
||||
assert "langgraph-orchestrator:" in actual_stdin
|
||||
assert "langchain/langgraph-orchestrator-licensed:0.7.67" in actual_stdin
|
||||
|
||||
# Executor service present with correct base image
|
||||
assert "langgraph-executor:" in actual_stdin
|
||||
assert "FROM langchain/langgraph-executor:" in actual_stdin
|
||||
assert "FROM langchain/langgraph-executor:0.7.67-py3.11" in actual_stdin
|
||||
assert "executor_entrypoint.sh" in actual_stdin
|
||||
|
||||
|
||||
|
||||
@@ -152,6 +152,79 @@ def test_update_deployment_no_secrets(client):
|
||||
assert result == {"ok": True}
|
||||
|
||||
|
||||
def test_update_deployment_with_engine_runtime_mode():
|
||||
"""Verify engine_runtime_mode is included in the PATCH payload."""
|
||||
import json
|
||||
|
||||
def handler(req: httpx.Request) -> httpx.Response:
|
||||
body = json.loads(req.content)
|
||||
assert body["engine_runtime_mode"] == "distributed"
|
||||
assert body["source_revision_config"]["image_uri"] == "img:v1"
|
||||
return httpx.Response(200, json={"id": "dep-1"})
|
||||
|
||||
c = HostBackendClient("https://api.example.com", "test-key")
|
||||
c._client = httpx.Client(
|
||||
base_url="https://api.example.com",
|
||||
transport=httpx.MockTransport(handler),
|
||||
headers={"X-Api-Key": "test-key", "Accept": "application/json"},
|
||||
timeout=30,
|
||||
)
|
||||
result = c.update_deployment(
|
||||
"dep-1", "img:v1", engine_runtime_mode="distributed"
|
||||
)
|
||||
assert result == {"id": "dep-1"}
|
||||
|
||||
|
||||
def test_update_deployment_with_deployed_api_version():
|
||||
"""Verify deployed_api_version is included in the PATCH payload."""
|
||||
import json
|
||||
|
||||
def handler(req: httpx.Request) -> httpx.Response:
|
||||
body = json.loads(req.content)
|
||||
assert body["deployed_api_version"] == "0.3.5"
|
||||
assert body["engine_runtime_mode"] == "distributed"
|
||||
assert body["source_revision_config"]["image_uri"] == "img:v2"
|
||||
assert body["secrets"] == [{"name": "K", "value": "V"}]
|
||||
return httpx.Response(200, json={"id": "dep-2"})
|
||||
|
||||
c = HostBackendClient("https://api.example.com", "test-key")
|
||||
c._client = httpx.Client(
|
||||
base_url="https://api.example.com",
|
||||
transport=httpx.MockTransport(handler),
|
||||
headers={"X-Api-Key": "test-key", "Accept": "application/json"},
|
||||
timeout=30,
|
||||
)
|
||||
result = c.update_deployment(
|
||||
"dep-2",
|
||||
"img:v2",
|
||||
secrets=[{"name": "K", "value": "V"}],
|
||||
engine_runtime_mode="distributed",
|
||||
deployed_api_version="0.3.5",
|
||||
)
|
||||
assert result == {"id": "dep-2"}
|
||||
|
||||
|
||||
def test_update_deployment_omits_none_fields():
|
||||
"""Verify None values for optional fields are not sent in payload."""
|
||||
import json
|
||||
|
||||
def handler(req: httpx.Request) -> httpx.Response:
|
||||
body = json.loads(req.content)
|
||||
assert "engine_runtime_mode" not in body
|
||||
assert "deployed_api_version" not in body
|
||||
assert "secrets" not in body
|
||||
return httpx.Response(200, json={"ok": True})
|
||||
|
||||
c = HostBackendClient("https://api.example.com", "test-key")
|
||||
c._client = httpx.Client(
|
||||
base_url="https://api.example.com",
|
||||
transport=httpx.MockTransport(handler),
|
||||
headers={"X-Api-Key": "test-key", "Accept": "application/json"},
|
||||
timeout=30,
|
||||
)
|
||||
c.update_deployment("dep-3", "img:v1")
|
||||
|
||||
|
||||
def test_list_revisions(client):
|
||||
result = client.list_revisions("dep-123", limit=5)
|
||||
assert result == {"ok": True}
|
||||
|
||||
Reference in New Issue
Block a user