
    ԋg                        d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlZd dl	m
Z
 d dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ  G d
 de      Zy)    )annotationsN)suppress)
HTTPServer)get_address_hostget_tcp_server_addresses)Server)RoutingApplication)DequeHandlerclean_dashboard_addressget_versionsc                  N    e Zd ZdZd
dZd Zd Zed        ZddZ	ddZ
	 dd	Zy)
ServerNodez?
    Base class for server nodes in a distributed cluster.
    Nc                    t        |      S )N)packagesr   )selfr   s     0lib/python3.12/site-packages/distributed/node.pyversionszServerNode.versions   s    X..    c           	        |dk(  rd}| j                   j                         D ]  \  }}d }t        |t              r|\  }}nd}t        |t              r|j                  d      }t        |t        t        f      rCt        |      dk(  r|d   t        |d         }}n!t        |      dk(  r|dc\  }}nt        |      t        |t              r|\  }}ni }	  || fd| j                  i|}|j                  ||n||f       || j                  |<    y # t        $ r8}t        j                  d| d	| d
dz   t	        |      z   d       Y d }~-d }~ww xY w)N0.0.0.0 r   :      io_loopz
Could not launch service 'z
' on port z. zGot the following message:

   )
stacklevel)service_specsitems
isinstancetuplestrsplitlistlenint
ValueErrorlooplistenservices	Exceptionwarningswarn)	r   default_listen_ipkv	listen_ipportkwargsservicees	            r   start_serviceszServerNode.start_services"   sc   	) "&&,,.DAqI!U#4$$zz#$.t9>'+AwDGtIY!^(,a%KY$T**!U#	6D>$))>v>"+"7Y=NPTU $+a 9 /:  21#ZvRH67!f  !	 s   ;D	E-EEc                   t        | d      rN| j                  j                  D ]5  }t        |d      st        |j                        s&|j	                          7 | j
                  j                         D ]  }|j	                           y )Nhttp_applicationstop)hasattrr9   applicationscallabler:   r+   values)r   applicationr5   s      r   stop_serviceszServerNode.stop_servicesK   si    4+,#44AA;/H[=M=M4N$$&  B }}++-GLLN .r   c                ~    | j                   j                         D ci c]  \  }}||j                   c}}S c c}}w N)r+   r    r3   )r   r0   r1   s      r   service_portszServerNode.service_portsS   s5    &*mm&9&9&;<&;da166	&;<<<s   9c                   t        t        j                  j                  d            | _        | j                  j                  t        j                  t        j                  j                  d                   |j                  | j                         t        j                  | |j                  | j                         y )Nzdistributed.admin.log-length)nzdistributed.admin.log-format)r
   daskconfigget_deque_handlersetFormatterlogging	Formatter
addHandlerweakreffinalizeremoveHandler)r   loggers     r   _setup_loggingzServerNode._setup_loggingW   s    *kkoo<=
 	((dkkoo.LMN	
 	$--.v33T5H5HIr   c                l   | j                   }g }t        t        |j                              D ]  \  }}|r||k\  s|j                  |k  r |S |r8|j                  |j                  |j                  |j                  |      f       Y|j                  |j                  |j                  |      f        |S )a/  
        Fetch log entries for this node

        Parameters
        ----------
        start : float, optional
            A time (in seconds) to begin filtering log entries from
        n : int, optional
            Maximum number of log entries to return from filtered results
        timestamps : bool, default False
            Do we want log entries to include the time they were generated?

        Returns
        -------
        List of tuples containing the log level, message, and (optional) timestamp for each filtered entry, newest first
        )rI   	enumeratereverseddequecreatedappend	levelnameformat)r   startrE   
timestampsdeque_handlerLcountmsgs           r   get_logszServerNode.get_logsa   s    " ++#H]-@-@$ABJE3UaZ3;;#6
 	 #++s}}m6J6J36OPQ#--)=)=c)BCD C r   c           
        t        |      | _        t        j                  j	                  d      }t        j                  j	                  d      }t        j                  j	                  d      }|rBt        j                  |t
        j                  j                        }|j                  ||       t        | j                  |      | _        t        |xs |      }|D ]  }	||	d   d	k(  rd
|	d<   |	d   |	d   d	k(  rO| j                  }
t        |
t        t         f      r|
d   }
|
r&t#        t$              5  t'        |
      |	d<   ddd       d}d}	 	 |s | j                  j(                  di |	 n2 | j                  j(                  di t+        j,                  |	ddi        t1        | j                        }|d   \  | j                  _        | j                  _        | j                  | j6                  d<   t9        |D cg c]  }|d   	 c}|D cg c]  }|d   	 c}      D ]-  \  }}||k7  s|dkD  st;        j<                  d| d| d       / y# 1 sw Y   xY w# t.        $ r d}|dz
  }|dk  r Y nw xY w2c c}w c c}w )z0This creates an HTTP Server running on this nodez'distributed.scheduler.dashboard.tls.keyz(distributed.scheduler.dashboard.tls.certz+distributed.scheduler.dashboard.tls.ca-file)cafilepurpose)keyfile)ssl_optionsNaddressr   r   r   Fr   Tr3   r   	dashboardzPort z` is already in use.
Perhaps you already have a cluster running?
Hosting the HTTP server on port z instead )r	   r9   rF   rG   rH   sslcreate_default_contextPurposeCLIENT_AUTHload_cert_chainr   http_serverr   _start_addressr!   r%   r"   r   r(   r   r*   tlzmerger,   r   rg   r3   r+   zipr-   r.   )r   routesdashboard_addressdefault_portrf   tls_keytls_certtls_ca_filehttp_addresseshttp_addressrg   change_portretries_leftbound_addressesabexpectedactuals                     r   start_http_serverzServerNode.start_http_server~   s   
 !36 : ++//"KL;;??#MNkkoo&ST44"CKK,C,CK ''''B%d&;&;U01B1RlS*L !,i1HB1N*3Y'I&.,y2IR2O--ge}5%ajG!*-2B72KY/ .  KL
&/((//?,?/((//W#))L6ST+2VW/ +< 343C3CD ;J!:L7 $"2"2"7%)%5%5k" !$ ./1QvY/1P1!A$1P!
Hf 6!hlH: &77=hhH	!
3 .- ! "&K#/!#3L#a' ( * 01Ps+   6IAI&JJ	
I#	&I?>I?rB   )rQ   zlogging.LoggerreturnNone)r   NF)r   N)__name__
__module____qualname____doc__r   r7   r@   propertyrC   rR   ra   r   ri   r   r   r   r      sC    /'R = =J< FJAr   r   )
__future__r   rK   rj   r-   rN   
contextlibr   rq   tornado.httpserverr   rF   distributed.commr   r   distributed.corer   distributed.http.routingr	   distributed.utilsr
   r   distributed.versionsr   r   ri   r   r   <module>r      s=    "  
    
 )  G # 7 C -j jr   