sdk.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from typing import Any, Dict, Optional
  2. from ray._private.utils import split_address
  3. from ray.dashboard.modules.dashboard_sdk import SubmissionClient
  4. try:
  5. import aiohttp
  6. import requests
  7. except ImportError:
  8. aiohttp = None
  9. requests = None
  10. DEPLOY_PATH = "/api/serve/applications/"
  11. DELETE_PATH = "/api/serve/applications/"
  12. STATUS_PATH = "/api/serve/applications/"
  13. class ServeSubmissionClient(SubmissionClient):
  14. def __init__(
  15. self,
  16. dashboard_head_address: str,
  17. create_cluster_if_needed=False,
  18. cookies: Optional[Dict[str, Any]] = None,
  19. metadata: Optional[Dict[str, Any]] = None,
  20. headers: Optional[Dict[str, Any]] = None,
  21. ):
  22. if requests is None:
  23. raise RuntimeError(
  24. "The Serve CLI requires the ray[default] "
  25. 'installation: `pip install "ray[default]"`'
  26. )
  27. invalid_address_message = (
  28. "Got an unexpected address"
  29. f'"{dashboard_head_address}" while trying '
  30. "to connect to the Ray dashboard. The Serve SDK/CLI requires the "
  31. "Ray dashboard's HTTP(S) address (which should start with "
  32. '"http://" or "https://". If this address '
  33. "wasn't passed explicitly, it may be set in the "
  34. "RAY_DASHBOARD_ADDRESS environment variable."
  35. )
  36. if "://" not in dashboard_head_address:
  37. raise ValueError(invalid_address_message)
  38. module_string, _ = split_address(dashboard_head_address)
  39. # If user passes in ray://, raise error. Serve submission should
  40. # not use a Ray client address.
  41. if module_string not in ["http", "https"]:
  42. raise ValueError(invalid_address_message)
  43. super().__init__(
  44. address=dashboard_head_address,
  45. create_cluster_if_needed=create_cluster_if_needed,
  46. cookies=cookies,
  47. metadata=metadata,
  48. headers=headers,
  49. )
  50. self._check_connection_and_version_with_url(
  51. min_version="1.12",
  52. version_error_message="Serve CLI is not supported on the Ray "
  53. "cluster. Please ensure the cluster is "
  54. "running Ray 1.12 or higher.",
  55. url="/api/ray/version",
  56. )
  57. def get_serve_details(self) -> Dict:
  58. response = self._do_request("GET", STATUS_PATH)
  59. if response.status_code != 200:
  60. self._raise_error(response)
  61. return response.json()
  62. def deploy_applications(self, config: Dict):
  63. """Deploy multiple applications."""
  64. response = self._do_request("PUT", DEPLOY_PATH, json_data=config)
  65. if response.status_code != 200:
  66. self._raise_error(response)
  67. def delete_applications(self):
  68. response = self._do_request("DELETE", DELETE_PATH)
  69. if response.status_code != 200:
  70. self._raise_error(response)