mirror of
https://github.com/wassname/ray.git
synced 2026-06-28 04:39:03 +08:00
[serve] Add list_backends and list_endpoints (#8737)
This commit is contained in:
@@ -1,10 +1,20 @@
|
||||
from ray.serve.api import (init, create_backend, delete_backend,
|
||||
create_endpoint, delete_endpoint, set_traffic,
|
||||
get_handle, stat, update_backend_config,
|
||||
get_backend_config, accept_batch) # noqa: E402
|
||||
from ray.serve.api import (
|
||||
init, create_backend, delete_backend, create_endpoint, delete_endpoint,
|
||||
set_traffic, get_handle, stat, update_backend_config, get_backend_config,
|
||||
accept_batch, list_backends, list_endpoints) # noqa: E402
|
||||
|
||||
__all__ = [
|
||||
"init", "create_backend", "delete_backend", "create_endpoint",
|
||||
"delete_endpoint", "set_traffic", "get_handle", "stat",
|
||||
"update_backend_config", "get_backend_config", "accept_batch"
|
||||
"init",
|
||||
"create_backend",
|
||||
"delete_backend",
|
||||
"create_endpoint",
|
||||
"delete_endpoint",
|
||||
"set_traffic",
|
||||
"get_handle",
|
||||
"stat",
|
||||
"update_backend_config",
|
||||
"get_backend_config",
|
||||
"accept_batch",
|
||||
"list_backends",
|
||||
"list_endpoints",
|
||||
]
|
||||
|
||||
@@ -141,6 +141,16 @@ def delete_endpoint(endpoint):
|
||||
retry_actor_failures(master_actor.delete_endpoint, endpoint)
|
||||
|
||||
|
||||
@_ensure_connected
|
||||
def list_endpoints():
|
||||
"""Returns a dictionary of all registered endpoints.
|
||||
|
||||
The dictionary keys are endpoint names and values are dictionaries
|
||||
of the form: {"methods": List[str], "traffic": Dict[str, float]}.
|
||||
"""
|
||||
return retry_actor_failures(master_actor.get_all_endpoints)
|
||||
|
||||
|
||||
@_ensure_connected
|
||||
def update_backend_config(backend_tag, config_options):
|
||||
"""Update a backend configuration for a backend tag.
|
||||
@@ -200,6 +210,15 @@ def create_backend(backend_tag,
|
||||
backend_config, replica_config)
|
||||
|
||||
|
||||
@_ensure_connected
|
||||
def list_backends():
|
||||
"""Returns a dictionary of all registered backends.
|
||||
|
||||
Dictionary maps backend tags to backend configs.
|
||||
"""
|
||||
return retry_actor_failures(master_actor.get_all_backends)
|
||||
|
||||
|
||||
@_ensure_connected
|
||||
def delete_backend(backend_tag):
|
||||
"""Delete the given backend.
|
||||
|
||||
@@ -446,12 +446,22 @@ class ServeMaster:
|
||||
return self.workers
|
||||
|
||||
def get_all_backends(self):
|
||||
"""Used for validation by the API client."""
|
||||
return list(self.backends.keys())
|
||||
"""Returns a dictionary of backend tag to backend config dict."""
|
||||
backends = {}
|
||||
for backend_tag, (_, config, _) in self.backends.items():
|
||||
backends[backend_tag] = config.__dict__
|
||||
return backends
|
||||
|
||||
def get_all_endpoints(self):
|
||||
"""Used for validation by the API client."""
|
||||
return [endpoint for endpoint, methods in self.routes.values()]
|
||||
"""Returns a dictionary of endpoint to endpoint config."""
|
||||
endpoints = {}
|
||||
for route, (endpoint, methods) in self.routes.items():
|
||||
endpoints[endpoint] = {
|
||||
"route": route if route.startswith("/") else None,
|
||||
"methods": methods,
|
||||
"traffic": self.traffic_policies.get(endpoint, {})
|
||||
}
|
||||
return endpoints
|
||||
|
||||
async def set_traffic(self, endpoint_name, traffic_policy_dictionary):
|
||||
"""Sets the traffic policy for the specified endpoint."""
|
||||
|
||||
@@ -426,3 +426,65 @@ def test_parallel_start(serve_instance):
|
||||
handle = serve.get_handle("test-parallel")
|
||||
|
||||
ray.get(handle.remote(), timeout=10)
|
||||
|
||||
|
||||
def test_list_endpoints(serve_instance):
|
||||
serve.init()
|
||||
|
||||
def f():
|
||||
pass
|
||||
|
||||
serve.create_endpoint("endpoint", "/api", methods=["GET", "POST"])
|
||||
serve.create_endpoint("endpoint2", methods=["POST"])
|
||||
serve.create_backend("backend", f)
|
||||
serve.set_traffic("endpoint2", {"backend": 1.0})
|
||||
|
||||
endpoints = serve.list_endpoints()
|
||||
assert "endpoint" in endpoints
|
||||
assert endpoints["endpoint"] == {
|
||||
"route": "/api",
|
||||
"methods": ["GET", "POST"],
|
||||
"traffic": {}
|
||||
}
|
||||
|
||||
assert "endpoint2" in endpoints
|
||||
assert endpoints["endpoint2"] == {
|
||||
"route": None,
|
||||
"methods": ["POST"],
|
||||
"traffic": {
|
||||
"backend": 1.0
|
||||
}
|
||||
}
|
||||
|
||||
serve.delete_endpoint("endpoint")
|
||||
assert "endpoint2" in serve.list_endpoints()
|
||||
|
||||
serve.delete_endpoint("endpoint2")
|
||||
assert len(serve.list_endpoints()) == 0
|
||||
|
||||
|
||||
def test_list_backends(serve_instance):
|
||||
serve.init()
|
||||
|
||||
@serve.accept_batch
|
||||
def f():
|
||||
pass
|
||||
|
||||
serve.create_backend("backend", f, config={"max_batch_size": 10})
|
||||
backends = serve.list_backends()
|
||||
assert len(backends) == 1
|
||||
assert "backend" in backends
|
||||
assert backends["backend"]["max_batch_size"] == 10
|
||||
|
||||
serve.create_backend("backend2", f, config={"num_replicas": 10})
|
||||
backends = serve.list_backends()
|
||||
assert len(backends) == 2
|
||||
assert backends["backend2"]["num_replicas"] == 10
|
||||
|
||||
serve.delete_backend("backend")
|
||||
backends = serve.list_backends()
|
||||
assert len(backends) == 1
|
||||
assert "backend2" in backends
|
||||
|
||||
serve.delete_backend("backend2")
|
||||
assert len(serve.list_backends()) == 0
|
||||
|
||||
Reference in New Issue
Block a user