o
    bi]                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZmZmZ dZefd	ed
ee defddZefd	ededefddZdedefddZdS )    N)defaultdict)List)	GcsClient)ClusterStatusStats)ClusterStatusParser)ClusterResourceStateGetClusterResourceStateReplyGetClusterStatusReply
   gcs_address
to_requesttimeoutc           	      C   s   t | dks
J dtt}|D ]}t| }||  d7  < qg }g }| D ]\}}|t| || q)t| j|||d dS )a  Request resources from the autoscaler.

    This will add a cluster resource constraint to GCS. GCS will asynchronously
    pass the constraint to the autoscaler, and the autoscaler will try to provision the
    requested minimal bundles in `to_request`.

    If the cluster already has `to_request` resources, this will be an no-op.
    Future requests submitted through this API will overwrite the previous requests.

    Args:
        gcs_address: The GCS address to query.
        to_request: A list of resource bundles to request the cluster to have.
            Each bundle is a dict of resource name to resource quantity, e.g:
            [{"CPU": 1}, {"GPU": 1}].
        timeout: Timeout in seconds for the request to be timeout

    r   GCS address is not specified.   	timeout_sN)	lenr   int	frozensetitemsappenddictr   #request_cluster_resource_constraint)	r   r   r   resource_requests_by_countrequestbundlebundlescountscount r    I/home/ubuntu/.local/lib/python3.10/site-packages/ray/autoscaler/v2/sdk.pyrequest_cluster_resources   s   
r"   returnc                 C   s^   t | dks
J dt }t| j|d}t }t }|| tj|t|| |ddS )z
    Get the cluster status from the autoscaler.

    Args:
        gcs_address: The GCS address to query.
        timeout: Timeout in seconds for the request to be timeout

    Returns:
        A ClusterStatus object.
    r   r   r   )gcs_request_time_srequest_ts_s)stats)	r   timer   get_cluster_statusr
   ParseFromStringr   from_get_cluster_status_replyr   )r   r   req_time	str_reply
reply_timereplyr    r    r!   r(   8   s   
r(   
gcs_clientc                 C   s   |   }t }|| |jS )z
    Get the cluster resource state from GCS.
    Args:
        gcs_client: The GCS client to query.
    Returns:
        A ClusterResourceState object
    Raises:
        Exception: If the request times out or failed.
    )get_cluster_resource_stater	   r)   cluster_resource_state)r/   r,   r.   r    r    r!   r0   S   s   

r0   )r'   collectionsr   typingr   ray._rayletr   ray.autoscaler.v2.schemar   r   ray.autoscaler.v2.utilsr   !ray.core.generated.autoscaler_pb2r   r	   r
   DEFAULT_RPC_TIMEOUT_Sstrr   r   r"   r(   r0   r    r    r    r!   <module>   s2    
(
