
    Vh                    2   d 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ZddlZddl	Z
ddlmZmZ ddlmZmZ ddl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mZmZmZ  G d dej@                        Z! ejD                  d       G d d             Z#ddZ$ddZ%y)zuDiagnostic utilities to probe container cgroup behavior during development and testing (both manual and integration).    )annotationsN   )read_text_filewrite_text_file)displayANSIBLE_TEST_TARGET_ROOT)EnvironmentConfig)LOGINUID_NOT_SETdocker_execget_docker_infoget_podman_remoterequire_docker)DockerConfig)CGroupEntry
CGroupPath
MountEntry	MountTypec                  v    e Zd ZdZ ej
                         Z ej
                         Z ej
                         Zy)CGroupStatez3The expected state of a cgroup related mount point.N)	__name__
__module____qualname____doc__enumautoHOSTPRIVATESHADOWED     Z/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/dev/container_probe.pyr   r   .   s,    =499;DdiikGtyy{Hr    r   T)frozenc                  @    e Zd ZU dZded<   ded<   ded<   ded	<   d
 Zy)CGroupMountzPDetails on a cgroup mount point that is expected to be present in the container.strpathzt.Optional[str]typezt.Optional[bool]writablezt.Optional[CGroupState]statec                   t        j                  | j                        j                  t        j
                        sJ | j                  | j                  J y | j                  t        j                  k(  r| j                  du sJ | j                  J y | j                  t        j                  t        j                  fv sJ | j                  J y )NT)pathlibPurePosixPathr&   is_relative_tor   ROOTr'   r)   r   TMPFSr(   	CGROUP_V1	CGROUP_V2)selfs    r!   __post_init__zCGroupMount.__post_init__?   s    $$TYY/>>zOOO99::%%%YY)//)==D(((::%%%99!4!4i6I6I JJJJ::)))r    N)r   r   r   r   __annotations__r3   r   r    r!   r$   r$   6   s!    Z
I
""
*r    r$   c           	     F   g d}t        | ||d      d   }|j                  d      \  }}t        j                  |      }t	        j                  |      }	t        d |	D              }	i }
i }|D ]  }|j                  r|	D cg c]k  }|j                  t        j                  k(  rL|j                  j                  |j                        r'|j                  j                  |j                        r|m c}xs dgd   }nN|	D cg c]:  }|j                  t        j                  k(  r|j                  |j                  k(  r|< c}xs dgd   }|s||
|<    |	D ]N  }d||j                  <   |
j                  |      x}s&|j                  |j                  k7  s@d||j                  <   P t!        t"        j                  j%                  t&        d	d
            }|j(                  j                  d| dg|D cg c]  }t+        |       c}z   }t-        j                  t        | ||d|      d         }|D ]  }|t+        |         ||<    |	D ci c]  }|j                  | }}i }|D ]  }t/        j0                  |j                        }|j3                  |d      x}sd||<   =||j                     }g }|
j                  |      x}r|j4                  t6        j8                  k(  r|j;                  d       |j                  |j                  k(  r;|j4                  t6        j<                  k(  rd||j                  j?                  d      <   |j                  |j                  k(  rJ|j                  |j                  k7  r.|j4                  t6        j@                  k(  r|j;                  d       n||j                     }g }|j4                  t6        j8                  k(  r|j;                  d       |j                  |j                  k7  r.|j4                  t6        j@                  k(  r|j;                  d       |r|j;                  |       |r$dddj%                  |       f||j                  <   n?d||j                  <   n/|j4                  dt6        j8                  fvr|j;                  d       |j                  |j                  k7  r*|j                  |j;                  d|j                          tC        |      |jD                  k(  r|j;                  |xs d        |r1d|j                   ddj%                  |       f||j                  <   d|j                   d|xs d df||j                  <    |jG                         D ]7  }||j                     }dd|j                   d|xs d df||j                  <   9 tI        | ||      }tK        |jM                               D cg c]  \  }}||d   |d    f }}}d!j%                  d" |D              } tO        jP                  d#| d!| jS                                 | jT                  r8tW        t"        j                  j%                  | jT                  | d$      |        yyc c}w c c}w c c}w c c}w c c}}w )%zKCheck the running container to examine the state of the cgroup hierarchies.)shz-cz3cat /proc/1/cgroup && echo && cat /proc/1/mountinfoT)capturer   z

c              3  t   K   | ]0  }|j                   j                  t        j                        s-| 2 y w)N)r&   r-   r   r.   ).0mounts     r!   	<genexpr>z0check_container_cgroup_status.<locals>.<genexpr>V   s%     [U

0I0I*//0Z5[s   .88Nsetupzprobe_cgroups.py-z-probe)r7   data)Fznot mountedzunexpected cgroup association)Fzmissing cgroupz???zunexpected mountzunexpected cgroupFzdirectory errors: z, )Tzdirectory (writable)zmissing cgroup associationz	type not r(   z	 errors: z ()zunexpected z mount (   
c              3  @   K   | ]  \  }}}|rd nd d| d|   yw)PASSFAILz: z -> Nr   )r9   r&   resultmessages       r!   r;   z0check_container_cgroup_status.<locals>.<genexpr>   s0     uShSWY_ahV684&WINus   z>>> Container: z.log),r   splitr   loadsr   tuple	subsystemr'   r   r0   r&   r-   	root_path	full_pathr1   getr   osjoinr   pythonr%   jsonr+   r,   popr)   r   r   appendr   joinpathr   boolr(   valuesget_identitysorteditemsr   inforstripdev_probe_cgroupsr   )!argsconfigcontainer_nameexpected_mountscmdstdoutcgroups_stdoutmounts_stdoutcgroupsmountsmount_cgroupsprobe_pathscgroupr:   probe_scriptr&   probe_commandprobe_resultsremaining_mountsresultsexpected_mountexpected_pathactual_mountactual_mount_write_erroractual_mount_errorscgroup_write_errorcgroup_errorsremaining_mountremaining_mount_write_erroridentityrF   messagesrG   s!                                    r!   check_container_cgroup_statusr{   L   s   
MC~sDA!DF$*LL$8!NM/Gm,F[f[[F35M@BK *)/ jjI$7$77jj//0@0@A&&55ejjA   " !62	'E *0 jjI$7$77jjF$4$44   " !62'E
 #)M% *   1"&EJJ#''..F.F4D4D

4R,0K(()	1 ""'',,/GRd"efL]]''0@.GHbmKnZ^CPTIKnnMJJ{4X\copqrstM 5)#d)4D5 ag@gW\UAR@g@g=?G) 1s--n.A.AB 0 4 4]D III%;GM"#.|/@/@#A  "&&|4464##{';';;#**+JK6#3#338L8LP[P`P`8`<U((11%89<#4#44##v'7'77N<P<PT_TgTg<g'../AB%01A1A%B" "!'';+?+??!(()HI##v'7'77N<P<PT_TgTg<g!(()<=%!(();< 16:LTYYWdMeLf8g0hGF,,-0NGF,,-!!$0D0D)EE&&'CD 3 338K8K8W&&>3F3F2G'HI()^-D-DD&&*B*Pj)QS*/L4E4E3FiPTPYPYZmPnOo1p)qGL%%&*.<3D3D2ERH`HndnGoop0q)rGL%%&c1sf ,224 J&1/2F2F&G#).+o>R>R=SS[\w  ]F  |F  \G  GH  1I  )J$$%J
 D&.9Hpvw~  xE  xE  xG  qH  ?I`l`dflfQiQWXYQZ?[  ?IH  ?IiiultuuGLL?8*Bw~~/?.@ABT%;%;z=NOQXY y Lo Ahx ?Is    A0Z	 ?Z4ZZ+Zc                
   t               j                  }	 t        t        d            }t        j                  t        j                               j                  }|t
        k(  r|nt        j                  |      j                  }|dk(  xr
 t               }|j                  |d|j                  j                   dt        |       j                    d| d| d| |f}dj#                  |      S # t        $ r	 t
        }Y w xY w)	zHGenerate and return an identity string to use when logging test results.z/proc/self/loginuidpodmanzcgroup=@zremote=zuser=z	loginuid=|)r   commandintr   FileNotFoundErrorr
   pwdgetpwuidrO   getuidpw_namer   namerj   valuer   cgroup_versionrP   )	r^   r_   r`   engineloginuiduser
login_userremotetagss	            r!   rX   rX      s    %%F$~&;<= <<		$,,D!%553<<;Q;Y;YJx7$5$7F 	
&--%%&a(=(L(L'MN
&
v
J< D 88D>#  $#$s   C0 0DD)
r^   r	   r_   r   r`   r%   ra   ztuple[CGroupMount, ...]returnNone)r^   r	   r_   r   r`   r%   r   r%   )&r   
__future__r   dataclassesr   rR   rO   r+   r   typingtior   r   utilr   r   r_   r	   docker_utilr
   r   r   r   r   host_configsr   rj   r   r   r   r   Enumr   	dataclassr$   r{   rX   r   r    r!   <module>r      s    { "    	  
 

  $))  d#* * $**nZbr    