o
    bi1                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZm Z m!Z! e "e#Z$dZ%dZ&G dd deZ'dS )    N)defaultdict)AnyDictListOptional)PENDINGRUNNINGSTOPPEDSTOPPINGbootstrap_aliyun)	AcsClient)
cli_logger)BOTO_MAX_RETRIES)LogTimer)NodeProvider)TAG_RAY_CLUSTER_NAMETAG_RAY_LAUNCH_CONFIGTAG_RAY_NODE_KINDTAG_RAY_NODE_NAMETAG_RAY_NODE_STATUSTAG_RAY_USER_NODE_TYPE   c                   @   s<  e Zd Zdd Zdeeef dee fddZdedefdd	Z	dedefd
dZ
dedeeef fddZdedefddZdedefddZdedeeef ddfddZdd Zdd Zdeeef deeef dedeeeef  fddZdeddfddZd ee ddfd!d"Zd#d$ Zd%d& Zed'd( ZdS ))AliyunNodeProviderc                 C   s   t | || |dd| _t|d |d |d td| _tdd| _	i | _
tt| _d| _t | _| j  t | _| j  t | _t | _i | _d S )	Ncache_stopped_nodesT
access_keyaccess_key_secretregion)r   r   	region_idmax_retriesr   d   )r   __init__getr   r   r   acsrandomrandint
subnet_idx	tag_cacher   dicttag_cache_pendingbatch_thread_count	threadingEventbatch_update_donesetready_for_new_batchLocktag_cache_lock
count_lockcached_nodes)selfprovider_configcluster_name r6   `/home/ubuntu/.local/lib/python3.10/site-packages/ray/autoscaler/_private/aliyun/node_provider.pyr    $   s&   







zAliyunNodeProvider.__init__tag_filtersreturnc                 C   s   t | jdg}| D ]\}}|||d q| jj|d}g }|D ] }|dtks3|dtkrC||d || j	|d< q#|S )NKeyValuetagsStatus
InstanceId)
r   r5   itemsappendr"   describe_instancesr!   r   r   r2   )r3   r8   r>   kv	instancesnon_terminated_instanceinstancer6   r6   r7   non_terminated_nodesB   s$   z'AliyunNodeProvider.non_terminated_nodesnode_idc                 C   s>   | j j|gd}|d ur|d }|ddkS td| dS )Ninstance_idsr   r?   RunningInvalid node id: %sF)r"   rC   r!   r   errorr3   rJ   rF   rH   r6   r6   r7   
is_runningY   s   zAliyunNodeProvider.is_runningc                 C   sN   | j j|gd}|d urt|dksJ |d }|ddkS td| dS )NrK   r   r   r?   StoppedrN   F)r"   rC   lenr!   r   rO   rP   r6   r6   r7   is_terminateda   s   z AliyunNodeProvider.is_terminatedc                 C   sx   | j j|gd}|d ur9t|dksJ |d }|dd ur9t }|ddD ]}|d||d< q*|S t S )NrK   r   r   TagsTagTagValueTagKey)r"   rC   rS   r!   r'   )r3   rJ   rF   rH   	node_tagstagr6   r6   r7   rY   j   s   zAliyunNodeProvider.node_tagsc                 C   s   	 | j j|gd}|d ur>t|sJ |d }|dd ur>|ddd ur>t|dddkr>|ddd S td|  tt q)NTrK   r   PublicIpAddress	IpAddressz*PublicIpAddress attribute is not exist. %s	r"   rC   rS   r!   r   rO   timesleepSTOPPING_NODE_DELAYrP   r6   r6   r7   external_ipv   s   
zAliyunNodeProvider.external_ipc                 C   s   	 | j j|gd}|d urFt|dksJ |d }|dd urF|ddd urFt|ddddkrF|dddd S td|  tt q)	NTrK   r   r   VpcAttributesPrivateIpAddressr\   z)InnerIpAddress attribute is not exist. %sr]   rP   r6   r6   r7   internal_ip   s0   
zAliyunNodeProvider.internal_ipr>   Nc                 C   sD  d}| j $ | jsd}| j  | j  | j  | j| | W d    n1 s,w   Y  |rTtt	 | j  | 
  | j  W d    n1 sOw   Y  | j |  jd7  _W d    n1 siw   Y  | j  | j" |  jd8  _| jdkr| j  W d    d S W d    d S 1 sw   Y  d S )NFTr   r   )r0   r(   r.   waitclearr,   updater^   r_   TAG_BATCH_DELAY_update_node_tagsr-   r1   r)   )r3   rJ   r>   is_batching_threadr6   r6   r7   set_node_tags   s4   


	


"z AliyunNodeProvider.set_node_tagsc                 C   sZ   t t}| j D ]\}}| D ]	}|| | q|| j|< q	t t| _| | d S N)r   listr(   rA   rB   r&   r'   _create_tags)r3   batch_updatesrJ   r>   xr6   r6   r7   ri      s   
z$AliyunNodeProvider._update_node_tagsc              	   C   sx   |  D ]5\\}}}d|||}td| |tkrd}| j|||dg W d    n1 s4w   Y  qd S )NzSet tag {}={} on {}zAliyunNodeProvider: {}Namer:   )rA   formatr   r   r"   tag_resource)r3   ro   rD   rE   node_idsmr6   r6   r7   rn      s   zAliyunNodeProvider._create_tagsnode_configcountc              	   C   s  t | jdt|t dt|t dt|t dt|t dg}i }| jr| jj|d}|rt	
dx g }|D ]k}|d}	|d}
|
tkrL|
tkrLq7|
tkrz| jj|	gdd dtkrztd|	  tt | jj|	gdd dtks_||	 |||d< | j|	 |d	| j|	< | |	| t||kr nq7W d    n1 sw   Y  |t|8 }i }|dkr|t|t d | jj|d
 |d ||| jd | jd | jd d}| jj|d}|d ur|D ]	}|||d< q|}|| |S )Nr:   r=   zStopping instances to reuser@   r?   rK   r   zwait for %s stoprU   InstanceTypeImageIdv_switch_idsecurity_group_idkey_name)instance_typeimage_idr>   amount
vswitch_idr{   key_pair_name)r   r5   r   r   r   r   r   r"   rC   r   groupr!   r
   r	   logginginfor^   r_   r`   rB   start_instancer&   rk   rS   r   run_instancesr4   rg   )r3   rv   r>   rw   filter_tagsreused_nodes_dictreuse_nodes_candidatereuse_node_idsnoderJ   statuscreated_nodes_dictinstance_id_setsrF   rH   all_created_nodesr6   r6   r7   create_node   s   



	
zAliyunNodeProvider.create_nodec                 C   sD   t d|  | jrt d| | j| d S | j| d S )Nzterminate node: %sz{Stopping instance {} (to terminate instead, set `cache_stopped_nodes: False` under `provider` in the cluster configuration))loggerr   r   rr   r"   stop_instancedelete_instancer3   rJ   r6   r6   r7   terminate_node  s   z!AliyunNodeProvider.terminate_nodert   c                 C   s>   |sd S | j rtd| | j| d S | j| d S )Nz|Stopping instances {} (to terminate instead, set `cache_stopped_nodes: False` under `provider` in the cluster configuration))r   r   r   rr   r"   stop_instancesdelete_instances)r3   rt   r6   r6   r7   terminate_nodes  s   z"AliyunNodeProvider.terminate_nodesc                 C   sP   |  i  || jv r| j| S | jj|gd}t|dks$J d||d S )z7Refresh and get info for this node, updating the cache.rK   r   zInvalid instance id {}r   )rI   r2   r"   rC   rS   rr   )r3   rJ   matchesr6   r6   r7   	_get_node-  s   


zAliyunNodeProvider._get_nodec                 C   s   || j v r
| j | S | |S )z>Return node info from cache if possible, otherwise fetches it.)r2   r   r   r6   r6   r7   _get_cached_node;  s   


z#AliyunNodeProvider._get_cached_nodec                 C   s   t | S rl   )r   )cluster_configr6   r6   r7   bootstrap_configB  s   z#AliyunNodeProvider.bootstrap_config)__name__
__module____qualname__r    r   strr   rI   boolrQ   rT   rY   ra   rd   rk   ri   rn   r   intr   r   r   r   r   r   staticmethodr   r6   r6   r6   r7   r   #   s4    	



Er   )(r   r#   r*   r^   collectionsr   typingr   r   r   r   %ray.autoscaler._private.aliyun.configr   r   r	   r
   r   $ray.autoscaler._private.aliyun.utilsr   "ray.autoscaler._private.cli_loggerr   !ray.autoscaler._private.constantsr   !ray.autoscaler._private.log_timerr   ray.autoscaler.node_providerr   ray.autoscaler.tagsr   r   r   r   r   r   	getLoggerr   r   rh   r`   r   r6   r6   r6   r7   <module>   s"     
	