
    c<                         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	m
Z
mZmZmZ ddlmc mZ ddlmZ ddlmZ ddlmZ ddlmZ d	Zd
Zdeefz  Z G d de          Z G d de
          ZdS )zRedis-related providers.    )print_functionN)EnvVarProviderProviderAnalysisshutdown_service_run_statedelete_service_directory)PROVIDE_MODE_DEVELOPMENT)_new_error_recorder)
py2_compat)logged_subprocess	localhosti  zredis://%s:%dc                   "     e Zd ZdZ fdZ xZS )_RedisProviderAnalysiszKSubtype of ProviderAnalysis with extra fields RedisProvider needs to track.c                 x    t          t          |                               |||           || _        || _        d S N)superr   __init__existing_scoped_instance_urldefault_system_exists)selfconfigmissing_to_configuremissing_to_provider   r   	__class__s         Vlib/python3.11/site-packages/anaconda_project/requirements_registry/providers/redis.pyr   z_RedisProviderAnalysis.__init__!   s>    $d++44V=QSefff,H)%:"""    )__name__
__module____qualname____doc__r   __classcell__r   s   @r   r   r      s>        UU; ; ; ; ; ; ; ; ;r   r   c                   |     e Zd ZdZed             Zd Z fdZ fdZd Z	d Z
 fdZd	 Zd
 Z fdZddZ xZS )RedisProviderzNRuns a project-scoped Redis process (each project needing Redis gets its own).c                 L   |                     d          }t          |          dk    rd S 	 t          |d                                                   }t          |d                                                   }n# t          $ r Y d S w xY w|dk    s|dk    rd S ||k    rd S ||fS )N-   r      )splitlenintstrip
ValueError)clsspiecesloweruppers        r   _parse_port_rangezRedisProvider._parse_port_range+   s    v;;! 	4	q	))**Eq	))**EE 	 	 	44	A: 	! 	45= 	4u~s   AA; ;
B	B	c                     d|j         gS )Nservice_options)env_var)r   requirements     r   _config_sectionzRedisProvider._config_section;   s    !;#677r   c                    t          t          |                               |||||          }d|v sJ |                     |          }|                    |dgz   d          }|d         dk    rd|z   |d<   d}	d}
d	|	|
fz  }|                    |d
gz   |          }|                     |          }|-t          d|d|dt          j                   |	|d<   |
|d<   n|d         |d<   |d         |d<   |S )z)Override superclass to return our config.sourcescopeall)defaultunsetfind_i  i1  z%d-%d
port_rangeNzInvalid port_range 'z', should be like '')file
lower_port
upper_portr   r'   )	r   r#   read_configr7   	get_valuer2   printsysstderr)r   r6   environlocal_state_filedefault_env_spec_name	overridesr   sectionr:   default_lower_portdefault_upper_portdefault_port_rangeport_range_stringparsed_port_ranger   s                 r   rD   zRedisProvider.read_config>   s_   }d++77WN^`u8AC C 6!!!!&&{33 **7gY+>*NN(w& 	/&F8!!$(:<N'OO,66w,7OYk6ll 223DEE 	8EDUDUDUWiWiWijz# # # ##5F< #5F<  #4Q#7F< #4Q#7F< r   c                 :   |                      ||||d          }|                     |          }|d         }	|d         }
d|v r|d         }
d|v r|d         }	|                    |dgz   |
d|	           d|v rr|d         dk    rd	}n |d         d
k    rd}n|d         dk    rd}nd}||                    |dgz   |           |d         dk    r|                    |j        d           t          t          |                               ||||||           dS )z-Override superclass to set our config values.N)rL   rC   rB   r?   r%   r9   find_allr;   find_projectprojectfind_systemsystemr:   rI   )rD   r7   	set_valuepopr5   r   r#   set_config_values_as_strings)r   r6   rI   rJ   rK   rL   valuesr   rM   rC   rB   r:   r   s               r   r[   z*RedisProvider.set_config_values_as_strings[   s    !!+w8HJ_ko!pp&&{33L)
L)
6! 	.-J6! 	.-J""7l^#;


T^T^=_```v 	7h:- !^3 !!]2   G **7gY+>FFFh9, 7 K/666 	mT""??WVf@UW`bh	j 	j 	j 	j 	jr   c                 ~    d|v r8t          j        d|d                   rd                    |d                   S d S )Nportr   hostr^   redis://localhost:{port}r^   )network_utilcan_connect_to_socketformat)r   	run_states     r   "_previously_run_redis_url_if_alivez0RedisProvider._previously_run_redis_url_if_alive   sN    Y 	<#E;]fgm]n#o#o#o 	-44)F:K4LLL4r   c                 B    t          j        t          t                    S )Nr_   )rc   rd   _DEFAULT_SYSTEM_REDIS_HOST_DEFAULT_SYSTEM_REDIS_PORT)r   s    r   _can_connect_to_system_defaultz,RedisProvider._can_connect_to_system_default   s    17QXrssssr   c                 (   t          t          |                               |||||          }|                    |j                  }|                     |          }|                                 }	t          |j        |j	        |j
        ||	          S )z?Override superclass to store additional fields in the analysis.)r   r   )r   r#   analyzeget_service_run_stater5   rg   rk   r   r   missing_env_vars_to_configuremissing_env_vars_to_provide)r   r6   rI   rJ   rK   rL   analysisrf   previous
systemwider   s             r   rm   zRedisProvider.analyze   s    --55k7L\^s6?A A$::;;NOO	::9EE88::
%ho&.&L&.&JCK<F	H H H 	Hr   c                 p    |j         j        j        r$|                    dt          z             t          S d S )Nz Found system default Redis at %s)statusrq   r   info_DEFAULT_SYSTEM_REDIS_URL)r   r6   contextfrontends       r   _provide_systemzRedisProvider._provide_system   s;    >"8 	-MM<?XXYYY,,	- 	-r   c                 r    j         j        j        fd}                    j        |          S )Nc                 .   j         j        j        }|+                    d                    |                     |S |                                                      j                  }t          j	        
                    |d          }t          j	        
                    |d          }d         }d         }|}||k    r"t          j        d|          sn|d	z  }||k    "||k    r,                    d
                    ||                     d S 	 t          j        |           n# t          $ r Y nt           $ r Y nw xY wdd|d|dddt#          |          g	}                    dt%          |          z              	 t'          j        |t*          j        t/          j        j                            }	n=# t4          $ r0}
                    dt#          |
          z             Y d }
~
d S d }
~
ww xY w|	                                \  }}|J |                    d          }d }|	j        dk    rd}d}d}d}||k     rf|dz  }t=          j        |           ||z  }|st          j        d|          rd}|s!t          j	                             |          rd}|r|rn||k     f|r3|| d<   d                    |          }dd t#          |          d!gg| d"<   n                    d#|z             ||!                    d$          D ]}|d%k    r                    |           	 tE          j#        |d&d'          5 }|$                                D ]}                    |           	 d d d            n# 1 swxY w Y   nV# t          $ rI}
|
j%        tJ          j&        k    r*                    d(                    ||
)                     Y d }
~
nd }
~
ww xY w                    d*                    |	j        +                     |S ),Nz1Using redis-server we started previously at {url})urlz	redis.pidz	redis.logrB   rC   r   r_   r'   z[All ports from {lower} to {upper} were in use, could not start redis-server on one of them.)r0   r1   zredis-serverz	--pidfilez	--logfilez--daemonizeyesz--portz	Starting )argsrH   envz Error executing redis-server: %sreplaceerrorsr   F
   g     @@Tr^   ra   rb   z	redis-cliz-pshutdownshutdown_commandszVredis-server started successfully, but we timed out trying to connect to it on port %d
 rzutf-8z!Failed to read {logfile}: {error})logfileerrorzAredis-server process failed or timed out, exited with code {code})code)'ru   rq   r   rv   re   clearensure_service_directoryr5   ospathjoinrc   rd   r   removeIOErrorOSErrorstrreprr   Popen
subprocessPIPEr
   env_without_unicoderI   	Exceptioncommunicatedecode
returncodetimesleepexistsr(   codecsopen	readlineserrnoENOENT)rf   r}   workdirpidfiler   
LOWER_PORT
UPPER_PORTr^   commandpopeneouterrport_is_readypidfile_is_readyMAX_WAIT_TIMEso_far	incrementlinelogr   rx   ry   r6   s                       r   ensure_redisz4RedisProvider._provide_project.<locals>.ensure_redis   sN    .)FC QXX]`Xaabbb
OO66{7JKKGgll7K88Ggll7K88G  -J-JD*$ #9{QUVVV 	 *$  j   !OPVPV]g]g QW Qi Qij j j t	'""""       Wk7M[`bjD		G MM+W5666
)/W7A4>4RSZSb4c4ce e e    ASVVLMMMttttt **,,JS#**I*..CC1$ !  !&#(  "},  - 5IJy)))i'F( 1'=;UYZZZ 1,0M+ 47>>'22 4/3,$ )9  },   ! 	 (,If%4;;;FFC 8CD#d))U_6`5aI122MMp       wIIdOO , ,Drz , d+++lWc7;; 0s$'MMOO 0 0D$MM$////00 0 0 0 0 0 0 0 0 0 0 0 0 0 0  l l l w%,. l &I&P&PY`hi&P&j&jkkk	l W^^didt^uuw w w Jsl   D0 0
E<	EE	8G 
G<%G77G<5N -N9N N		N N	N 
O$?OO$)ru   rq   r   transform_service_run_stater5   )r   r6   rx   ry   r   r   s    ``` @r   _provide_projectzRedisProvider._provide_project   s_    (/y	 y	 y	 y	 y	 y	 y	 y	v 22;3FUUUr   c                 h   d|j         v sJ d}|j        j        j        d         }t	          t
          |                               ||          }|j                             |j        d          }t          |j
                  }d}|'|dk    s|dk    r|                     |||          }|d}|3|dk    s|dk    r'|j        t          k    r|                     |||          }||r|                    d	           n||j         |j        <   |                    |                                
          S )zOverride superclass to start a project-scoped redis-server.

        If it locates or starts a redis-server, it sets the
        requirement's env var to that server's URL.

        PATHNr9   FrW   rT   TrU   z*Could not connect to system default Redis.r   )rI   ru   rq   r   r   r#   providegetr5   r	   ry   rz   moder   r   r   copy_with_additions
pop_errors)	r   r6   rx   r}   r9   super_resultry   system_failedr   s	           r   r   zRedisProvider.provide  se    (((((/9]D1199+wOOo!!+"5t<<&w'788  	%Fm3 	%v7K 	%&&{GXFFC % $ 	LFn4 	L*8L 	L|77 L++K(KK 	7 MKLLL36GOK/0//x7J7J7L7L/MMMr   Nc                 Z    t          ||j                  }t          ||j                   |S )z=Override superclass to shut down any redis-server we started.)r   r5   r   )r   r6   rI   rJ   rL   requirement_statusru   s          r   	unprovidezRedisProvider.unprovideF  s.    +,<k>QRR !1;3FGGGr   r   )r   r   r   r   classmethodr2   r7   rD   r[   rg   rk   rm   rz   r   r   r   r    r!   s   @r   r#   r#   )   s       XX  [8 8 8    :&j &j &j &j &jP  t t tH H H H H- - -
~V ~V ~V@%N %N %N %N %NN       r   r#   )r   
__future__r   r   r   r   r   rG   r   /anaconda_project.requirements_registry.providerr   r   r   r   3anaconda_project.requirements_registry.network_utilrequirements_registryrc   anaconda_project.provider   anaconda_project.frontendr	   anaconda_project.internalr
   r   ri   rj   rw   r   r#    r   r   <module>r      s     % % % % % %   				     



 s s s s s s s s s s s s J J J J J J J J J = = = = = = 9 9 9 9 9 9 0 0 0 0 0 0 7 7 7 7 7 7( ! +/IKe.ff ; ; ; ; ;- ; ; ;a a a a aN a a a a ar   