def get_head_service(cluster_name, cluster_owner_reference, head_service_ports): # Configure head service for dashboard, client, and Ray Serve. # Pull the default head service from # autoscaler/_private/_kubernetes/defaults.yaml default_kubernetes_config = _get_default_config({"type": "kubernetes"}) default_provider_conf = default_kubernetes_config["provider"] head_service = copy.deepcopy(default_provider_conf["services"][0]) # Configure the service's name service_name = f"{cluster_name}-ray-head" head_service["metadata"]["name"] = service_name # Garbage-collect service upon cluster deletion. head_service["metadata"]["ownerReferences"] = [cluster_owner_reference] # Allows service to access the head pod. # The corresponding label is set on the head pod in # KubernetesNodeProvider.create_node(). head_service["spec"]["selector"] = head_service_selector(cluster_name) # Configure custom ports if provided by the user. if head_service_ports: user_port_dict = port_list_to_dict(head_service_ports) default_port_dict = port_list_to_dict(head_service["spec"]["ports"]) # Update default ports with user specified ones. default_port_dict.update(user_port_dict) updated_port_list = port_dict_to_list(default_port_dict) head_service["spec"]["ports"] = updated_port_list return head_service
def fillout_defaults(config: Dict[str, Any]) -> Dict[str, Any]: defaults = _get_default_config(config["provider"]) defaults.update(config) # Just for clarity: merged_config = copy.deepcopy(defaults) # Fill auth field to avoid key errors. # This field is accessed when calling NodeUpdater but is not relevant to # certain node providers and is thus left out of some cluster launching # configs. merged_config["auth"] = merged_config.get("auth", {}) # A legacy config is one which doesn't have available_node_types, # but has at least one of head_node or worker_nodes. is_legacy_config = (("available_node_types" not in config) and ("head_node" in config or "worker_nodes" in config)) # Do merging logic for legacy configs. if is_legacy_config: merged_config = merge_legacy_yaml_with_defaults(merged_config) # Take care of this here, in case a config does not specify any of head, # workers, node types, but does specify min workers: merged_config.pop("min_workers", None) return merged_config
def test_operator_configure_ports(self): cluster_name = "test-cluster" cluster_owner_reference = {} head_service_ports = [ {"name": "test-port", "port": 123, "targetPort": 456}, {"name": "client", "port": 555, "targetPort": 666}, ] head_service = get_head_service( cluster_name, cluster_owner_reference, head_service_ports ) expected_ports = [ {"name": "client", "port": 555, "targetPort": 666}, {"name": "dashboard", "protocol": "TCP", "port": 8265, "targetPort": 8265}, {"name": "ray-serve", "protocol": "TCP", "port": 8000, "targetPort": 8000}, {"name": "test-port", "port": 123, "targetPort": 456}, ] assert head_service["spec"]["ports"] == expected_ports head_service = get_head_service(cluster_name, cluster_owner_reference, None) assert ( head_service["spec"]["ports"] == _get_default_config({"type": "kubernetes"})["provider"]["services"][0][ "spec" ]["ports"] )
def fillout_defaults(config: Dict[str, Any]) -> Dict[str, Any]: defaults = _get_default_config(config["provider"]) defaults.update(config) defaults["auth"] = defaults.get("auth", {}) try: defaults = _fillout_available_node_types_resources(defaults) except Exception: # We don't want to introduce new errors with filling available node # types resources feature. logger.exception("Failed to autodetect node resources") return defaults
def fillout_defaults(config: Dict[str, Any]) -> Dict[str, Any]: defaults = _get_default_config(config["provider"]) defaults.update(config) defaults["auth"] = defaults.get("auth", {}) defaults = rewrite_legacy_yaml_to_available_node_types(defaults) try: defaults = _fillout_available_node_types_resources(defaults) except ValueError: # When the user uses a wrong instance type. raise except Exception: # When the user is using e.g., staroid, but it is not installed. logger.exception("Failed to autodetect node resources.") return defaults
def get_provider_config(cluster_name): default_kubernetes_config = _get_default_config({"type": "kubernetes"}) default_provider_conf = default_kubernetes_config["provider"] # Configure head service for dashboard and client head_service = copy.deepcopy(default_provider_conf["services"][0]) service_name = f"{cluster_name}-ray-head" head_service["metadata"]["name"] = service_name head_service["spec"]["selector"] = head_service_selector(cluster_name) provider_conf = {} provider_conf["type"] = "kubernetes" provider_conf["use_internal_ips"] = True provider_conf["namespace"] = RAY_NAMESPACE provider_conf["services"] = [head_service] return provider_conf
def get_provider_config(cluster_name, namespace, cluster_owner_reference): default_kubernetes_config = _get_default_config({"type": "kubernetes"}) default_provider_conf = default_kubernetes_config["provider"] # Configure head service for dashboard and client head_service = copy.deepcopy(default_provider_conf["services"][0]) service_name = f"{cluster_name}-ray-head" head_service["metadata"]["name"] = service_name # Garbage-collect service upon cluster deletion. head_service["metadata"]["ownerReferences"] = [cluster_owner_reference] # Allows service to access the head pod. # The corresponding label is set on the head pod in # KubernetesNodeProvider.create_node(). head_service["spec"]["selector"] = head_service_selector(cluster_name) provider_conf = {} provider_conf["type"] = "kubernetes" provider_conf["use_internal_ips"] = True provider_conf["namespace"] = namespace provider_conf["services"] = [head_service] # Signal to autoscaler that the Operator is in use: provider_conf["_operator"] = True return provider_conf
def fillout_defaults(config: Dict[str, Any]) -> Dict[str, Any]: defaults = _get_default_config(config["provider"]) defaults.update(config) defaults["auth"] = defaults.get("auth", {}) defaults = rewrite_legacy_yaml_to_available_node_types(defaults) return defaults
def fillout_defaults(config: Dict[str, Any]) -> Dict[str, Any]: defaults = _get_default_config(config["provider"]) defaults.update(config) defaults["auth"] = defaults.get("auth", {}) return defaults