Ë
    Ì
âiÔ*  ã                   óP   — d Z ddlZddlZddlmZmZmZmZ ddlm	Z	  G d„ d«      Z
y)z3
Docker utility functions for container management
é    N)ÚListÚDictÚOptionalÚTupleé   )ÚLoggerc                   ó´  — e Zd ZdZdefd„Zdefd„Zd'dede	d	ed
e
dee	ef   f
d„Zde	fd„Zde	fd„Zdedee   fd„Zdeeef   fd„Zdede	fd„Zdede	fd„Zd(deee      de	de	fd„Zde	fd„Zdeeef   fd„Zd)ded
e
de	fd„Zd*dede
defd„Zd+dede	fd„Zd+de	fd„Zdede	fd„Zdede	fd „Zd!ede	fd"„Zdedee   fd#„Z dedede	fd$„Z!d%edee   fd&„Z"y),ÚDockerUtilsz&Helper functions for Docker operationsÚloggerc                 ó    — || _         d | _        y ©N)r   Úproject_dir)Úselfr   s     ú7/home/factor_ks/STREAMA2026/tests/utils/docker_utils.pyÚ__init__zDockerUtils.__init__   s   € ØˆŒØˆÕó    r   c                 ó   — || _         y)z5Set the project directory for docker-compose commandsN)r   )r   r   s     r   Úset_project_dirzDockerUtils.set_project_dir   s
   € à&ˆÕr   NÚcmdÚignore_errorsÚcwdÚtimeoutÚreturnc                 ó  — 	 t        j                  |ddd||¬«      }|j                  dk(  xs |}||j                  |j                  z   fS # t         j
                  $ r dd|› d�fcY S t        $ r}dt        |«      fcY d}~S d}~ww xY w)z*Run a command and return (success, output)TF)Úcapture_outputÚtextÚcheckr   r   r   zCommand timed out after z secondsN)Ú
subprocessÚrunÚ
returncodeÚstdoutÚstderrÚTimeoutExpiredÚ	ExceptionÚstr)r   r   r   r   r   ÚresultÚsuccessÚes           r   Ú_run_commandzDockerUtils._run_command   s˜   € ð	!Ü—^‘^ØØ#ØØØØôˆFð ×'Ñ'¨1Ñ,Ò=°ˆGØ˜FŸM™M¨F¯M©MÑ9Ð9Ð9øÜ×(Ñ(ò 	GØÐ4°W°I¸XÐFÐFÒFÜò 	!Øœ#˜a›&�=Õ ûð	!ús$   ‚AA ÁBÁ(BÁ0BÁ<BÂBc                 ó2   — | j                  ddg«      \  }}|S )zCheck if Docker is installedÚdockerz	--version©r)   ©r   r'   Ú_s      r   Úcheck_docker_installedz"DockerUtils.check_docker_installed'   s    € à×&Ñ&¨°+Ð'>Ó?‰
ˆ�Øˆr   c                 ó2   — | j                  g d¢«      \  }}|S )z$Check if Docker Compose is installed)r+   ÚcomposeÚversionr,   r-   s      r   Úcheck_docker_compose_installedz*DockerUtils.check_docker_compose_installed,   s   € à×&Ñ&Ò'GÓH‰
ˆ�Øˆr   Úcontainer_namec                 óZ   — | j                  dddd|g«      \  }}|r|j                  «       S y)z"Get status of a specific containerr+   Úinspectú-fz{{.State.Status}}N©r)   Ústrip©r   r4   r'   Úoutputs       r   Úget_container_statusz DockerUtils.get_container_status1   s;   € à×+Ñ+Ø�i Ð':¸Nð-
ó ‰ˆ�ñ Ø—<‘<“>Ð!Ør   c           	      ó„   — ddddddddd	œ}i }|j                  «       D ]  \  }}| j                  |«      }|r|nd
||<   Œ! |S )z(Get status of all StreamA2026 containersÚpostgresÚredisÚbackendÚdaemonÚfrontendÚcaddyÚnginxÚbackup)zstreama2026-postgreszstreama2026-rediszstreama2026-backendzstreama2026-daemonzstreama2026-frontendzstreama2026-caddyzstreama2026-nginxzstreama2026-backupÚ	not_found)Úitemsr<   )r   Ú
containersÚstatusesÚ	containerÚnameÚstatuss         r   Úget_all_container_statusesz&DockerUtils.get_all_container_statuses:   sj   € ð %/Ø!(Ø#,Ø"*Ø$.Ø!(Ø!(Ø"*ñ	
ˆ
ð ˆØ)×/Ñ/Ó1ò 	?‰OˆI�tØ×.Ñ.¨yÓ9ˆFÙ'-™V°;ˆH�TŠNð	?ð ˆr   c                 ó4   — | j                  dd|g«      \  }}|S )zStart a stopped containerr+   Ústartr,   ©r   r4   r'   r.   s       r   Ústart_containerzDockerUtils.start_containerN   s"   € à×&Ñ&¨°'¸>Ð'JÓK‰
ˆ�Øˆr   c                 ó4   — | j                  dd|g«      \  }}|S )zRestart a containerr+   Úrestartr,   rP   s       r   Úrestart_containerzDockerUtils.restart_containerS   s"   € à×&Ñ&¨°)¸^Ð'LÓM‰
ˆ�Øˆr   ÚservicesÚbuildc                 óØ   — | j                   s| j                  j                  dd«       yg d¢}|r|j                  d«       |r|j	                  |«       | j                  |d¬«      \  }}|S )zRun docker-compose upÚDOCKERúProject directory not setF©r+   r1   Úupú-dú--build)r   )r   r   ÚerrorÚappendÚextendr)   )r   rU   rV   Úcommandr'   r;   s         r   Ú
compose_upzDockerUtils.compose_upX   sd   € à×ÒØ�K‰K×Ñ˜hÐ(CÔDØâ3ˆÙØ�N‰N˜9Ô%ÙØ�N‰N˜8Ô$à×+Ñ+¨GÀEÐ+ÓJ‰ˆ�Øˆr   c                 ó„   — | j                   s| j                  j                  dd«       y| j                  g d¢«      \  }}|S )zRun docker-compose downrX   rY   F©r+   r1   Údown)r   r   r^   r)   r-   s      r   Úcompose_downzDockerUtils.compose_downg   s=   € à×ÒØ�K‰K×Ñ˜hÐ(CÔDØà×&Ñ&Ò'DÓE‰
ˆ�Øˆr   c                 óf  — | j                   s| j                  j                  dd«       i S | j                  g d¢«      \  }}|si S |j	                  d«      }i }|dd D ]Q  }|j                  «       sŒ|j	                  «       }t        |«      dk\  sŒ3|d   j                  d	d
«      }|d   }|||<   ŒS |S )zGet docker-compose ps outputrX   rY   )r+   r1   Úpsú
r   Né   r   zstreama2026-Ú é   )r   r   r^   r)   Úsplitr9   ÚlenÚreplace)	r   r'   r;   ÚlinesrI   ÚlineÚpartsrK   rL   s	            r   Ú
compose_pszDockerUtils.compose_psp   sº   € à×ÒØ�K‰K×Ñ˜hÐ(CÔDØˆIà×+Ñ+Ò,GÓH‰ˆ�ÙØˆIð —‘˜TÓ"ˆØˆØ˜!˜"�Iò 	,ˆDØ�z‰z�|ØŸ
™
›�Ü�u“: “?Ø  ™8×+Ñ+¨N¸BÓ?�DØ" 1™X�FØ%+�H˜T’Nð	,ð ˆr   c                 ó"  — t        j                   «       }d}t        j                   «       |z
  |k  r_| j                  dddd|g«      \  }}|r|j                  «       dk(  ryt        j                  |«       t        j                   «       |z
  |k  rŒ_y)	z8Wait for container to become healthy with active pollingrl   r+   r6   r7   z{{.State.Health.Status}}ÚhealthyTF)Útimer)   r9   Úsleep)r   r4   r   Ú
start_timeÚcheck_intervalr'   r;   s          r   Úwait_for_healthzDockerUtils.wait_for_health‡   s…   € ä—Y‘Y“[ˆ
Øˆä�i‰i‹k˜JÑ&¨Ò0Ø"×/Ñ/Ø˜) TÐ+EÀ~ð1ó ‰OˆG�Vñ ˜6Ÿ<™<›>¨YÒ6Øä�J‰J�~Ô&ô �i‰i‹k˜JÑ&¨Ó0ð r   Útailc                 óP   — | j                  dddt        |«      |g«      \  }}|r|S y)z Get recent logs from a containerr+   Úlogsz--tailrk   )r)   r%   )r   r4   r{   r'   r;   s        r   Úget_container_logszDockerUtils.get_container_logs˜   s7   € à×+Ñ+Ø�f˜h¬¨D«	°>ð-
ó ‰ˆ�ñ ØˆMØr   c                 óH   — |€ddg}g d¢|z   }| j                  |«      \  }}|S )zRebuild specific containersr@   rB   )r+   r1   r[   r\   r]   r,   )r   rU   r   r'   r.   s        r   Úrebuild_containerszDockerUtils.rebuild_containers¡   s5   € àÐØ! :Ð.ˆHâ:¸XÑEˆØ×&Ñ& sÓ+‰
ˆ�Øˆr   c                 óü  — |r$|j                  dd«       |j                  dd«       g d¢}| j                  || j                  ¬«      \  }}|s|r|j                  dd«       y|r|j	                  dd«       d	}d
dd|g}| j                  |«      \  }}|r/|r|j	                  dd|› d�«       n|j                  dd|› d�«       g d¢}|D ]N  }	d
dd|	g}
| j                  |
«      \  }}|sŒ |r|j	                  dd|	› d�«       Œ9|j                  dd|	› d�«       ŒP |r|j	                  dd«       g d¢}| j                  || j                  ¬«      \  }}|s|r|j                  dd«       y|r|j	                  dd«       y)zTReset Docker environment - stop containers and remove volumes for fresh installationrX   z.=== FULL RESET - THIS WILL DELETE ALL DATA ===z5This will remove all containers, volumes, and networkrd   )r   zFailed to stop containersFzContainers stopped and removedzstreama-networkr+   ÚnetworkÚrmzNetwork z removedz not found or already removed)Ústreama2026_postgres_dataÚstreama2026_redis_dataÚstreama2026_stream_storageÚstreama2026_ffmpeg_cacheÚvolumezVolume zAll volumes removedrZ   zFailed to start containersz%Containers started with fresh volumesT)Úinfor)   r   r^   r'   )r   r   Úcmd_stopr'   r.   r‚   Úcmd_rm_networkÚsuccess_networkÚvolumesrˆ   Úcmd_rmÚcmd_ups               r   Úreset_environmentzDockerUtils.reset_environmentª   sª  € áØ�K‰K˜Ð"RÔSØ�K‰K˜Ð"YÔZò 1ˆØ×&Ñ& x°T×5EÑ5EÐ&ÓF‰
ˆ�áÙØ—‘˜XÐ'BÔCØáØ�N‰N˜8Ð%EÔFð $ˆØ" I¨t°WÐ=ˆØ!×.Ñ.¨~Ó>Ñˆ˜ÙÙØ—‘˜x¨8°G°9¸HÐ)EÕFà—‘˜H¨°°	Ð9VÐ&WÔXò
ˆð ò 	[ˆFØ ¨$°Ð7ˆFà×*Ñ*¨6Ó2‰JˆG�QÚÙØ—N‘N 8¨w°v°h¸hÐ-GÕHà—K‘K ¨G°F°8Ð;XÐ*YÕZð	[ñ Ø�N‰N˜8Ð%:Ô;ò 3ˆØ×&Ñ& v°4×3CÑ3CÐ&ÓD‰
ˆ�áÙØ—‘˜XÐ'CÔDØáØ�N‰N˜8Ð%LÔMàr   Únetwork_namec                 ó~   — g d¢}| j                  |«      \  }}|sy|j                  «       j                  d«      }||v S )z Check if a Docker network exists)r+   r‚   Úlsz--formatú	{{.Name}}Fri   )r)   r9   rm   )r   r‘   r   r'   r;   Únetworkss         r   Úcheck_network_existsz DockerUtils.check_network_existsé   sB   € âBˆØ×+Ñ+¨CÓ0‰ˆ�áØà—<‘<“>×'Ñ'¨Ó-ˆØ˜xÐ'Ð'r   c                 ó:   — ddd|g}| j                  |«      \  }}|S )zCreate a Docker networkr+   r‚   Úcreater,   )r   r‘   r   r'   r.   s        r   Úcreate_networkzDockerUtils.create_networkô   s)   € à˜ H¨lÐ;ˆØ×&Ñ& sÓ+‰
ˆ�Øˆr   Úvolume_namec                 ó6   — | j                  ddd|g«      \  }}|S )zCheck if Docker volume existsr+   rˆ   r6   r,   )r   rš   r'   r.   s       r   Úcheck_volume_existszDockerUtils.check_volume_existsú   s+   € à×&Ñ&Ø�h 	¨;ð(
ó ‰
ˆ�ð ˆr   c                 óz   — | j                  dddd|g«      \  }}|r |j                  «       r|j                  «       S y)zGet IP address of a containerr+   r6   r7   z8{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}Nr8   r:   s       r   Úget_container_ipzDockerUtils.get_container_ip  sD   € à×+Ñ+Ø�i Ð'aØð-
ó ‰ˆ�ñ �v—|‘|”~Ø—<‘<“>Ð!Ør   c                 ó8   — | j                  ddd||g«      \  }}|S )z Connect a container to a networkr+   r‚   Úconnectr,   )r   r4   r‘   r'   r.   s        r   Úconnect_to_networkzDockerUtils.connect_to_network  s-   € à×&Ñ&Ø�i ¨L¸.ð(
ó ‰
ˆ�ð ˆr   Úservice_namec                 ón  — | j                   sy| j                  dddd|g| j                   d¬«      \  }}|r€|j                  «       rp|j                  «       j                  d«      d	   }| j                  dd
dd|gd¬«      \  }}|r1|j                  «       r!|j                  «       }|j	                  d«      S y)z=Get actual container name by service name from docker composeNr+   r1   rh   z-qé
   )r   r   ri   r   r6   r7   r”   )r   ú/)r   r)   r9   rm   Úlstrip)r   r¢   r'   r;   Úcontainer_idÚname_successÚname_outputrK   s           r   Úget_container_name_by_servicez)DockerUtils.get_container_name_by_service  sÆ   € à×ÒØð ×+Ñ+Ø�y $¨¨lÐ;Ø× Ñ Øð ,ó 
‰ˆ�ñ �v—|‘|”~à!Ÿ<™<›>×/Ñ/°Ó5°aÑ8ˆLØ(,×(9Ñ(9Ø˜9 d¨K¸ÐFØð ):ó )Ñ%ˆL˜+ñ  × 1Ñ 1Ô 3à"×(Ñ(Ó*�Ø—{‘{ 3Ó'Ð'àr   )FNé<   )NF)r«   )é2   r   )#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r%   r   ÚlistÚboolÚintÚtupler)   r/   r3   r   r<   r   rM   rQ   rT   r   rb   rf   rs   rz   r~   r€   r�   r–   r™   rœ   rž   r¡   rª   © r   r   r
   r
   
   sÕ  „ Ù0ð ˜vó  ð'¨3ó 'ñ! ð !°Tð !Èð !Ð]`ð !ÐjoÐptÐvyÐpyÑjzó !ð$¨ó ð
°ó ð
°3ð ¸8ÀC¹=ó ð¨D°°c°©Nó ð(¨cð °dó ð
°ð ¸ó ñ
 8¨D°©IÑ#6ð Àdð ÐW[ó ð˜dó ð˜D  c ™Nó ñ.¨cð ¸Cð Èó ñ"°ð ¸Cð Èó ñ¨4ð ¸4ó ñ=°ó =ð~	(°ð 	(¸ó 	(ð¨3ð °4ó ð¨sð °tó ð¨sð °xÀ±}ó ð°ð ÀCð ÈDó ð¸#ð À(È3Á-ô r   r
   )r°   r   rv   Útypingr   r   r   r   r   r   r
   rµ   r   r   ú<module>r·      s'   ðñó Û ß .Ó .Ý ÷`ò `r   