
    &`iX                         d dl 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
 d dlmZ d dlmZmZmZ dZ G d	 d
e          Zefdedee         defdZefdedede	fdZdedefdZdS )    N)Counter)List
NamedTuple)	GcsClient)ClusterStatusStats)ClusterStatusParser)ClusterResourceStateGetClusterResourceStateReplyGetClusterStatusReply
   c                   $    e Zd ZU eed<   eed<   dS )ResourceRequest	resourceslabel_selectorN)__name__
__module____qualname__dict__annotations__     i/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/autoscaler/v2/sdk.pyr   r      s'         OOOr   r   gcs_address
to_requesttimeoutc                    t          |           dk    s
J d            g }|D ]}t          |t                    sJ dt          |                       |                    di           }|                    di           }|                    t          ||                     |}d t          fd|D                       }g }g }	g }
|                                D ]a\  \  }}}|                    t          |                     |	                    t          |                     |
                    |           bt          |           
                    ||	|
|           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 requests to request the cluster to have.
            Each resource request is a tuple of resources and a label_selector
            to apply per-bundle. e.g.: [{"resources": {"CPU": 1, "GPU": 1}, "label_selector": {"accelerator-type": "A100"}}]
        timeout: Timeout in seconds for the request to be timeout

    r   GCS address is not specified.z)Internal Error: Expected a dict, but got r   r   c                     t          | j                                                  t          | j                                                  fS N)	frozensetr   itemsr   )rs    r   keyfuncz*request_cluster_resources.<locals>.keyfunc;   s?    ak''))**a&,,..//
 	
r   c              3   .   K   | ]} |          V  d S r    r   ).0r#   r$   s     r   	<genexpr>z,request_cluster_resources.<locals>.<genexpr>A   s+      >>awwqzz>>>>>>r   	timeout_sN)len
isinstancer   typegetappendr   r   r"   r   #request_cluster_resource_constraint)r   r   r   
normalizedr#   r   selectorgrouped_requestsbundleslabel_selectorscountsbundlecountr$   s                @r   request_cluster_resourcesr8      s   , {a!@ )+J @ @t
 
 	A 	A@tAww@@	A 	A 
 EE+r**	55)2../)X>>????J
 
 
 >>>>:>>>>>G"$OF%5%;%;%=%=  !EtF||$$$tH~~...ek>>&G ?     r   returnc                 d   t          |           dk    s
J d            t          j                    }t          |                               |          }t          j                    }t	                      }|                    |           t          j        |t          ||z
  |                    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replys         r   r?   r?   Q   s     {a!@y{{H+&&99G9LLIJ!##E	)$$$ <zH'<8TTT   r   
gcs_clientc                 ~    |                                  }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)rF   rC   rE   s      r   rH   rH   l   s=     5577I(**E	)$$$''r   )r>   collectionsr   typingr   r   ray._rayletr   ray.autoscaler.v2.schemar   r   ray.autoscaler.v2.utilsr	   !ray.core.generated.autoscaler_pb2r
   r   r   DEFAULT_RPC_TIMEOUT_Sr   strr   intr8   r?   rH   r   r   r   <module>rS      sx          # # # # # # # # ! ! ! ! ! ! 9 9 9 9 9 9 9 9 7 7 7 7 7 7               j    )8 88T
8 8 8 8 8x &; "   6(9 (9M ( ( ( ( ( (r   