
    iI                       d dl mZ d dlZd dlmc mZ d dlm	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Zd dlmZ d dlmZ d dlmZ 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mZ d!dZ  G d d          Z! G d dej"                  Z#d"dZ$ G d de
j%                  Z& G d d          Z'd#d Z(dS )$    )annotationsN)Sequence)Path)Any)Callable)Literal)Union)	_sys_path)Producer)
WorkerInfoconfigpytest.Configreturn	list[str]c                V   g }|                      d          }|D ]x}|                    d          }	 t          |d |                   }|                    ||dz   d          g|z             T# t          $ r |                    |           Y uw xY w|st          j        d          |S )Ntx*   z6MISSING test execution (tx) nodes: please specify --tx)getvaluefindintextend
ValueErrorappendpytest
UsageError)r   	xspeclistr   xspecinums         Y/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/xdist/workermanage.pyparse_tx_spec_configr"      s    IOOD))B 5 5JJsOO	5eBQBi..C eAEGGn-34444  	$ 	$ 	$U#####	$  
D
 
 	
 s   A..BBc                  x    e Zd ZdZg dZ	 	 d+d,dZd-dZd.dZd/dZd0dZ	d1dZ
d1dZd2dZd3d Z	 	 	 d4d5d*ZdS )6NodeManager
   )z.*z*.pycz*.pyoz*~Npyexecnetcacher   r   specs$Sequence[execnet.XSpec | str] | Nonedefaultchdirstrr   Nonec                   || _         | j         j                            d          | _        | j                             d          | _        | j        t          j                    j        | _        t          j	        d          | _
        |                                 D ]E}t          |dd           t          j        d| d          | j
                            |           F||                                 }g | _        |D ]}t%          |t          j                  st          j        |          }t          |dd           dk    rt          j        d	|           }|j        s|j        s||_        | j
                            |           | j                            |           |                                 | _        |                                 | _        t9                      | _        d S )
Nnodemanager
testrunuidmain_thread_only)	execmodelidzProxy gateway z must include an idr0   execmodel=main_thread_only//)r   traceget	getoptionr.   uuiduuid4hexexecnetGroupgroup_getpxspecsgetattrr   r   makegateway_gettxspecsr'   
isinstanceXSpecchdirpopenallocate_idr   _getrsyncdirsroots_getrsyncoptionsrsyncoptionsset_rsynced_specs)selfr   r'   r)   
proxy_specspecs         r!   __init__zNodeManager.__init__0   s    [&**=99
+//==?""jll.DO]-?@@@
**,, 	/ 	/J z4..6'DZDDD   J"":....=$$&&E*,
 	$ 	$DdGM22 +}T**t[$//3EEE}%JD%J%JKK: *dj *)
J""4(((Jd####''))
 113347EE    gatewayexecnet.Gatewayc                T    | j         r| j         D ]} | j        ||fi | j         dS dS )z1Rsync the set of roots to the node's gateway cwd.N)rF   rsyncrH   )rK   rP   roots      r!   rsync_rootszNodeManager.rsync_rootsU   sS    : 	?
 ? ?
7D>>D,=>>>>	? 	?? ?rO   putevent,Callable[[tuple[str, dict[str, Any]]], None]list[WorkerController]c                      j         j                             j          j                                        d            fd j        D             S )N)r   r'   zsetting up nodesc                <    g | ]}                     |          S  )
setup_node).0rM   rV   rK   s     r!   
<listcomp>z+NodeManager.setup_nodes.<locals>.<listcomp>a   s'    GGGDh//GGGrO   )r   hookpytest_xdist_setupnodesr'   r3   )rK   rV   s   ``r!   setup_nodeszNodeManager.setup_nodes[   sZ     	004:0VVV

%&&&GGGGGDJGGGGrO   rM   execnet.XSpecWorkerControllerc                   t          |dd           dk    rt          j        d|           }| j                            |          }| j        j                            |           |                     |           t          | || j        |          }||_
        |                                 |                     d|z             |S )Nr0   r/   r2   )rP   zstarted node %r)r=   r9   rA   r;   r>   r   r_   pytest_xdist_newgatewayrU   rc   nodesetupr3   )rK   rM   rV   gwrf   s        r!   r\   zNodeManager.setup_nodec   s    
 4d++/AAA=!F!F!FGGDZ##D))000<<<b$+x@@



$t+,,,rO   c                D    | j                             | j                   d S N)r;   	terminateEXIT_TIMEOUTrK   s    r!   teardown_nodeszNodeManager.teardown_nodest   s!    
T./////rO   list[execnet.XSpec]c                >    d t          | j                  D             S )Nc                6    g | ]}t          j        |          S r[   r9   rA   r]   xs     r!   r^   z+NodeManager._gettxspecs.<locals>.<listcomp>x   s"    LLLQa  LLLrO   )r"   r   rm   s    r!   r?   zNodeManager._gettxspecsw   s!    LL*>t{*K*KLLLLrO   c                J    d | j                             d          D             S )Nc                6    g | ]}t          j        |          S r[   rr   rs   s     r!   r^   z+NodeManager._getpxspecs.<locals>.<listcomp>{   s"    FFFQa  FFFrO   px)r   r5   rm   s    r!   r<   zNodeManager._getpxspecsz   s&    FF$+*?*?*E*EFFFFrO   
list[Path]c                   | j         D ]}|j        r|j        r ng S dd l}dd l}dd} ||j                  } ||j                  }| j        }||g}||j        j        z  }|	                    d          }	|	r|
                    |	           g }
|D ]c}t          |                                          }|                                s |j        d|          ||
vr|
                    |           d|
S )	Nr   pr*   r   c                    |                      d          }t          j                            |          dk    rt          j                            |           S |S )zRReturn the directory path if p is a package or the path to the .py file otherwise.coz__init__.py)rstripospathbasenamedirname)rz   strippeds     r!   get_dirz*NodeManager._getrsyncdirs.<locals>.get_dir   sE    xx~~Hw))]::wq)))rO   	rsyncdirszrsyncdir doesn't exist: )rz   r*   r   r*   )r'   rC   rB   _pytestr   __file__r   optionrsyncdirgetinir   r   resolveexistsr   r   )rK   rM   r   r   r   
pytestpath	pytestdirr   
candidates
rsyncrootsrF   rT   	root_paths                r!   rE   zNodeManager._getrsyncdirs}   sN   J 	 	D:   I	  	  	  	  WV_--
GG,--	 ),
fm,,
]];//
 	*j))) 	( 	(DT

**,,I##%% M'f'(K4(K(KLLL%%Y'''rO   dict[str, Any]c                    t          | j                  }|d | j        j        j        D             z  }|d | j                            d          D             z  }|t          | j        j        dd          dS )z#Get options to be passed for rsync.c                ,    g | ]}t          |          S r[   r*   r]   r   s     r!   r^   z0NodeManager._getrsyncoptions.<locals>.<listcomp>   s    III$CIIIIIrO   c                ,    g | ]}t          |          S r[   r   r   s     r!   r^   z0NodeManager._getrsyncoptions.<locals>.<listcomp>   s    LLL$CIILLLrO   rsyncignoreverboser   ignoresr   )listDEFAULT_IGNORESr   r   r   r   r=   )rK   r   s     r!   rG   zNodeManager._getrsyncoptions   s    t+,,II$+*<*HIIIILL$+*<*<]*K*KLLLL t{19a@@
 
 	
rO   Fsourcestr | os.PathLike[str]notifyBCallable[[str, execnet.XSpec, str | os.PathLike[str]], Any] | Noner   r   r   Sequence[str] | Nonec                N   t          |dk    |          }|j        j        r]j        sV|                    dt
          j                            t                              z            	                                 dS f| j
        v rdS d
fd}|                    ||           | j
                            f           | j        j                            |g	           |                                 | j        j                            |g	           dS )z'Perform rsync to remote hosts for node.r   )r   r   zA
                import sys ; sys.path.insert(0, %r)
            Nr   r+   c                 *     r  d           d S d S )Nrsyncrootreadyr[   )r   r   rM   s   r!   finishedz#NodeManager.rsync.<locals>.finished   s0     7'v666667 7rO   )r   )r   gatewaysr   r+   )	HostRSyncrM   rC   rB   remote_execr~   r   r   r*   	waitcloserJ   add_target_hostaddr   r_   pytest_xdist_rsyncstartsendpytest_xdist_rsyncfinish)	rK   rP   r   r   r   r   rS   r   rM   s	     ``    @r!   rS   zNodeManager.rsync   sK    &'A+wGGG|: 		dj 		  '//#f++../ 
 ikkkF&>T000F	7 	7 	7 	7 	7 	7 	7 	7 	g999v///00'0SSS

117)1TTTTTrO   )Nr&   )r   r   r'   r(   r)   r*   r   r+   )rP   rQ   r   r+   )rV   rW   r   rX   )rM   rb   rV   rW   r   rc   r   )r   ro   )r   rx   )r   r   )NFN)rP   rQ   r   r   r   r   r   r   r   r   r   r+   )__name__
__module____qualname__rl   r   rN   rU   ra   r\   rn   r?   r<   rE   rG   rS   r[   rO   r!   r$   r$   ,   s       L444O
 7;,	#: #: #: #: #:J? ? ? ?H H H H   "0 0 0 0M M M MG G G G       D	
 	
 	
 	
" (,%U %U %U %U %U %U %UrO   r$   c                  `     e Zd ZdZeedf         Zdddd fdZddZ	 dd fdZ	ddZ
 xZS )r   z&RSyncer that filters out common files.zos.PathLike[str]NTr   	sourcedirPathLiker   Sequence[PathLike] | Noner   boolr   r+   c                   |g }d |D             | _         t                                          t          |          |           d S )Nc           	     ~    g | ]:}t          j        t          j        t	          j        |                              ;S r[   )recompilefnmatch	translater~   fspathrs   s     r!   r^   z&HostRSync.__init__.<locals>.<listcomp>   s5    VVVG$5bill$C$CDDVVVrO   )r   r   )_ignoressuperrN   r   )rK   r   r   r   	__class__s       r!   rN   zHostRSync.__init__   sM     ?GVVgVVV4	??GDDDDDrO   r   c                    t          |          }| j        D ]A}|                    |j                  s"|                    t	          |                    r dS BdS )NFT)r   r   matchnamer*   )rK   r   cres      r!   filterzHostRSync.filter   s`    Dzz= 	 	Cyy## syyT';'; uu 4rO   rP   rQ   r   Callable[[], None] | Nonec                    t           j                            | j                  }t	                                          |||d           d S )NT)finishedcallbackdelete)r~   r   r   
_sourcedirr   
add_target)rK   rP   r   
remotepathr   s       r!   r   zHostRSync.add_target_host   sD    
 W%%do66
7JRVWWWWWrO   modified_rel_pathr*   c                    | j         dk    rTt          j                            | j                  dz   |z   }|j        j        }t          |j         d| d|            d S d S )Nr   /:z <= )_verboser~   r   r   r   rM   rB   print)rK   rP   r   r   r   s        r!   _report_send_filezHostRSync._report_send_file   sq    
 =17##DO44s:=NND +JW\::J::D::;;;;; rO   )r   r   r   r   r   r   r   r+   )r   r   r   r   rj   )rP   rQ   r   r   r   r+   )rP   rQ   r   r*   r   r+   )r   r   r   __doc__r	   r*   r   rN   r   r   r   __classcell__)r   s   @r!   r   r      s        00S,,-H .2
E 
E 
E 
E 
E 
E 
E 
E    /3X X X X X X X< < < < < < < <rO   r   rF   Sequence[Path]argsc                   d}g }|D ]}|                     |          }t          |d                   }	 |                                }n# t          $ r d}Y nw xY w|s|                    |           l| D ]R}	 |                    |          }	n# t          $ r d }	Y nw xY w|	s||k    r|j        dz   t          |	          z   |d<    nSt          d| d          |                    |	                    |                     |S )Nz::r   Fr   zarg z not relative to an rsync root)
splitr   r   OSErrorr   relative_tor   r   r*   join)
rF   r   	splitcoderesultargpartsr   r   rT   rt   s
             r!   make_reltorootr      sU   IF - -		)$$eAh	]]__FF 	 	 	FFF	 	MM# 
	I 
	ID&&t,,    FdNN9s?SVV3a # GCGGGHHHinnU++,,,,Ms#   A		AA8BBBc                      e Zd ZdZdS )MarkerN)r   r   r   ENDr[   rO   r!   r   r     s        
CCCrO   r   c                      e Zd ZU ded<    G d d          Zd&dZd'dZed(d            Zd)dZ	d)dZ
d*dZd)dZd*dZd)dZd+dZd,d!Zd-d$Zd%S ).rc   r   
workerinfoc                  D    e Zd Z ej        d          dd            ZdS )WorkerController.RemoteHookT)trylastr   r   c                    t           j        S rj   )xdistremoterm   s    r!   pytest_xdist_getremotemodulez8WorkerController.RemoteHook.pytest_xdist_getremotemodule$  s
    <rO   N)r   r   )r   r   r   r   hookimplr   r[   rO   r!   
RemoteHookr   #  sB        		&	&	&	  	  	  
'	&	  	  	 rO   r   r-   r$   rP   rQ   r   r   rV   rW   r   r+   c                f   |j                             |                                            || _        || _        || _        || _        |j        t          |j	                  |j
        t          j        d| _        d| _        d| _        t!          d|j         |j        j                  | _        d S )N)workeridworkercountr.   mainargvFz
workerctl-)enabled)pluginmanagerregisterr   r-   rV   rP   r   r1   lenr'   r.   sysargvworkerinput_down_shutdown_sentr   r   debuglog)rK   r-   rP   r   rV   s        r!   rN   zWorkerController.__init__(  s     	%%doo&7&7888& 
{011%0	
 
 
#555v}?RSSSrO   r*   c                <    d| j         j         d| j        j         dS )N< >)r   r   rP   r1   rm   s    r!   __repr__zWorkerController.__repr__>  s$    ?4>*??T\_????rO   r   c                    | j         p| j        S rj   )r   r   rm   s    r!   shutting_downzWorkerController.shutting_downA  s    z0T00rO   c                `   |                      d           | j                                         | j        j        }d | j        j        j        pdD             }i }|j        r|j        rt          | j
        j        |          }|j        rWd| j        j        z  }t          | j        d          r3| j        j                                        }t!          ||z            |d<   | j        j                            |            | j        j                                        }| j                            |          | _        | j        j        j        rt,          nd }| j                            | j        |||f           | j        r-| j                            | j        t8          j                   d S d S )	Nzsetting up worker sessionc                ,    g | ]}t          |          S r[   r   rs   s     r!   r^   z*WorkerController.setup.<locals>.<listcomp>M  s    III1AIIIrO   r[   zpopen-%s_tmp_path_factorybasetemprf   )	endmarker)r   rP   _rinforM   r   invocation_paramsr   rC   rB   r   r-   rF   r1   hasattrr
  getbasetempr*   r_   pytest_configure_noder   r   channelr
   r   r   rV   setcallbackprocess_from_remoter   r   )rK   rM   r   option_dictr   r  remote_modulechange_sys_paths           r!   rg   zWorkerController.setupE  s   ,---
 	| II = B HbIIIz 	@TZ 	@!$"2"8$??D: 	?/Dt{$788 ?;8DDFF*-ho*>*>J'..D.999(EEGG|//>> (,|'8'>H))D4+T;PQQQ = 	UL$$T%=$TTTTT	U 	UrO   c                L   t          | d          rM| j                                        s4|                     d| j                   | j                                         t          | d          r6|                     d| j                   | j                                         d S d S )Nr  closingrP   exiting)r  r  isclosedr   closerP   exitrm   s    r!   ensure_teardownz WorkerController.ensure_teardownc  s    4## 	%<((** %DL111""$$$4## 	 HHY---L	  	 rO   indicesSequence[int]c                4    |                      d|           d S )Nruntestsr   sendcommandrK   r   s     r!   send_runtest_somez"WorkerController.send_runtest_somen  s!    W55555rO   c                0    |                      d           d S )Nruntests_allr%  rm   s    r!   send_runtest_allz!WorkerController.send_runtest_allq  s    (((((rO   c                4    |                      d|           d S )Nstealr$  r%  r'  s     r!   
send_stealzWorkerController.send_stealt  s!    '22222rO   c                t    | j         s0	 |                     d           n# t          $ r Y nw xY wd| _        d S d S )NshutdownT)r   r&  r   r   rm   s    r!   r0  zWorkerController.shutdownw  s`    z 	'  ,,,,   "&D	' 	's    
,,r   kwargsobjectc                v    |                      d| d| d           | j                            ||f           dS )z4Send a named parametrized command to the other side.zsending command (**)N)r   r  r   )rK   r   r1  s      r!   r&  zWorkerController.sendcommand  sH    6D66V6667774.)))))rO   	eventnamec                l    |                      d| d| d           |                     ||f           d S )Nzqueuing r4  r5  )r   rV   )rK   r6  r1  s      r!   notify_inproczWorkerController.notify_inproc  sE    3I33&333444y&)*****rO   	eventcall0tuple[str, dict[str, Any]] | Literal[Marker.END]c                   	 |t           j        u rZ| j                                        }| j        s8|rt          |t                    rd}|                     d| |           d| _        dS |\  }}|dv r|                     d| d| d	           dS |d
k    r | j        |fd| i| dS |dk    r | j        |fd| i| dS |dk    r-d| _        |d         | _	        |                     d|            dS |dv r | j        |fd| i| dS |dv re|
                    dd          }| j        j                            | j        |d                   }|||_        |                     || |           dS |dk    r |                     || |d                    dS |dk    r | j        |fd| i| dS |dk    r | j        |fd| i| dS |dk    r4|                     ||d         |d         |d         |d                    dS |d k    rCt          |d!                   }|                     |||d"         |d         |d#         $           dS t!          d%|           # t"          $ r  t$          $ rx t&          j                                        }t-          d&|           | j                            |           |                                  |                     d| |           Y dS w xY w)'a
  This gets called for each object we receive from
        the other side and if the channel closes.

        Note that channel callbacks run in the receiver
        thread of execnet gateways - we need to
        avoid raising exceptions or doing heavy work.
        zNot properly terminated	errordown)rf   errorTN)collectionstartz	ignoring (r5  workerreadyrf   internal_errorworkerfinishedworkeroutputr  )logstart	logfinish)
testreportcollectreportteardownreport
item_indexdata)r   rJ  )rf   repcollectionfinishids)rf   rM  runtest_protocol_completeunscheduled
logwarningmessagecodenodeid)rQ  rR  rS  
fslocationwarning_recordedwarning_message_datawhenlocation)warning_messagerW  rS  rX  zunknown event: z!!!!!!!!!!!!!!!!!!!!)r   r   r  _getremoteerrorr   r@   EOFErrorr8  r   rC  popr   r_   pytest_report_from_serializablerI  unserialize_warning_messager   KeyboardInterruptBaseExceptionr   ExceptionInfofrom_currentr   notify_exceptionr0  )	rK   r9  errr6  r1  rI  rK  rY  excinfos	            r!   r  z$WorkerController.process_from_remote  s   A	FFJ&&%)\%A%A%C%Cz & 8*S(";"; 87&&{S&III!%DJ )Iv000:Y:::::;;;;;m++""9BB4B6BBBBB...""9BB4B6BBBBB...!
$*>$:!""#3$"?????777""9BB4B6BBBBBOOO#ZZd;;
k&FF;VF^ G   )%/CN""94S"AAAAA000""94VE]"KKKKK999""9BB4B6BBBBBm++""9BB4B6BBBBBl**"""9-!(+%h/ #      000"=12# # ""$3!(+#J/ #      !!>9!>!>???  	 	 	 	F 	F 	F*7799G(G$$$K((111MMOOO{WEEEEEE	Fs]   A&I *%I I )I 1I 4I 
A'I 3$I I 1I 	8I AI I BK*)K*N)
r-   r$   rP   rQ   r   r   rV   rW   r   r+   )r   r*   )r   r   r   )r   r!  r   r+   )r   r*   r1  r2  r   r+   )r6  r*   r1  r2  r   r+   )r9  r:  r   r+   )r   r   r   __annotations__r   rN   r  propertyr  rg   r  r(  r+  r.  r0  r&  r8  r  r[   rO   r!   rc   rc     s^                       
T T T T,@ @ @ @ 1 1 1 X1U U U U<       6 6 6 6) ) ) )3 3 3 3' ' ' '* * * *
+ + + +KF KF KF KF KF KFrO   rc   rJ  r   warnings.WarningMessagec                >   dd l }| d         r|                    | d                   }t          || d                   }d }| d         	  || d          }n# t          $ r Y nw xY w|9d                    | d         | d         | d                   }t          |          }n| d         }| d         r2|                    | d                   }t          || d	                   }nd }||d
}t          j        j        D ]}|d
v r| |         ||<   t          j        di |S )Nr   message_modulemessage_class_namemessage_argsz{mod}.{cls}: {msg}message_str)modclsmsgcategory_modulecategory_class_name)rQ  categoryr[   )		importlibimport_moduler=   	TypeErrorformatWarningwarningsWarningMessage_WARNING_DETAILS)	rJ  rt  rn  ro  rQ  message_textrs  r1  	attr_names	            r!   r^  r^    s    &%%d+;&<==c4 4566+#tN34   ? 066)*-.' 7  L
 l++G}% %%d+<&=>>3%: ;<< h77F,= , ,	/// Oy",,V,,,s   	A 
A"!A")r   r   r   r   )rF   r   r   r   r   r   )rJ  r   r   rh  ))
__future__r   builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arcollections.abcr   enumr   r~   pathlibr   r   r   typingr   r   r   r	   r6   ry  r9   r   xdist.pluginr
   xdist.remoter   r   r   r"   r$   RSyncr   r   Enumr   rc   r^  r[   rO   r!   <module>r     sB   " " " " " "               $ $ $ $ $ $   				       				 



                             " " " " " "     ! ! ! ! ! ! # # # # # #   $cU cU cU cU cU cU cU cUL)< )< )< )< )< )< )< )<X   :    TY   tF tF tF tF tF tF tF tFn&- &- &- &- &- &-rO   