HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/compose/__pycache__/project.cpython-310.pyc
o

S�`w��@s�ddlZddlZddlZddlZddlZddlmZddlmZddl	m
Z
ddl	mZddl	mZddl
mZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddl m!Z!ddl m"Z"ddl m#Z#ddl$m%Z%ddl&m'Z'ddl&m(Z(ddl&m)Z)ddl&m*Z*ddl&m+Z+ddl&m,Z,ddl&m-Z-ddl&m.Z.ddl&m/Z/dd l&m0Z0dd!l&m1Z1dd"l&m2Z2dd#l&m3Z3dd$l&m4Z4dd%l5m6Z6dd&l5m7Z7dd'l5m8Z8dd(l9m:Z:e�;e<�Z=ej>Gd)d*�d*ej?��Z@Gd+d,�d,�ZAd-d.�ZBd/d0�ZCd1d2�ZDd3d4�ZEd5d6�ZFd7d8�ZGd9d:�ZHd;d<�ZId=d>�ZJd?d@�ZKGdAdB�dBeL�ZMGdCdD�dDeL�ZNGdEdF�dFeL�ZOGdGdH�dHeL�ZPGdIdJ�dJeL�ZQdS)K�N)�reduce)�path)�APIError)�
ImageNotFound)�NotFound)�
version_lt�)�parallel)�	UserError)�ConfigurationError)�V1)�$get_container_name_from_network_mode)�"get_service_name_from_network_mode)�
LABEL_ONE_OFF)�
LABEL_PROJECT)�
LABEL_SERVICE)�	Container)�build_networks)�get_networks)�ProjectNetworks)�read_status)�BuildAction)�ContainerIpcMode)�ContainerNetworkMode)�ContainerPidMode)�ConvergenceStrategy)�IpcMode)�NetworkMode)�NoSuchImageError)�parse_repository_tag)�PidMode)�Service)�ServiceIpcMode)�ServiceNetworkMode)�ServicePidMode)�filter_attached_for_up)�microseconds_from_time_nano)�truncate_string)�ProjectVolumesc@s$eZdZdZdZdZedd��ZdS)�OneOffFilterrr�cCs`||jkr|�d�td��dS||jkr |�d�td��dS||jkr'dStd�t|����)N�{}={}�True�FalsezInvalid value for one_off: {})�only�append�formatr�exclude�include�
ValueError�repr)�cls�value�labels�r8�1/usr/lib/python3/dist-packages/compose/project.py�
update_labels8s


zOneOffFilter.update_labelsN)�__name__�
__module__�__qualname__r2r1r.�classmethodr:r8r8r8r9r)2sr)c@s�eZdZdZ		dQdd�Zejdfdd�Ze		dRdd	��Z	e
d
d��Zdd
�Zdd�Z
dSdd�ZdTdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �ZdUd!d"�Zdejfd#d$�ZdUd%d&�ZdUd'd(�ZdUd)d*�Zdejfd+d,�Z			dVd-d.�Zd/d0�ZdUd1d2�Z			dWd3d4�Zde j!e"j#fd5d6�Z$d7d8�Z%dUd9d:�Z&dde j!e"j#dddddddddddddddfd;d<�Z'd=d>�Z(dXd?d@�Z)		dYdAdB�Z*dZdCdD�Z+dTdEdF�Z,dejfdGdH�Z-ddejfdIdJ�Z.dKdL�Z/dMdN�Z0dOdP�Z1dS)[�Projectz#
    A collection of services.
    NcCsD||_||_||_|pti�|_|ptid�|_||_|pg|_dS�NF)	�name�services�clientr(�volumesr�networks�config_version�enabled_profiles)�selfrArBrCrErDrFrGr8r8r9�__init__HszProject.__init__FcCs6|j}|rt�dd|�}d�t|�g}t�||�|S)Nz[_-]�r+)rA�re�subr0rr)r:)rH�one_off�legacyrAr7r8r8r9r7RszProject.labelscs�|pg}|jo|jtk}t|||�}t�|j||�}	t�|||��||g||	�|j|�}
|jD]�}t|�}|r=t	||�}ni}|�
dd�|
�|�}
|
�|�}|
�
|t|����}|
�|�}t|
|�}|jtkrw�fdd�|�dg�D�|d<t|d|�
dd�p�g|j�}|
�|�|d<|
�|�|d	<t|�}t|�\}}|r�t�d
�d�|���|
j�t|�
d�f|||||
||||||�
dd�||d
�
|���q/|
S)zB
        Construct a Project from a config.Config object.
        rENc�g|]}��|��qSr8)�namespace_spec)�.0�volume_spec�rDr8r9�
<listcomp>|s��z'Project.from_config.<locals>.<listcomp>rDrA�secrets�scale�device_requestszIThe following deploy sub-keys are not supported and have been ignored: {}�, �platform)
rC�project�use_networkingrE�links�network_mode�volumes_fromrU�pid_mode�ipc_moderY�default_platform�extra_labels)�versionrrr�
from_servicesrBr(�from_config�dictr�pop�	get_links�get_ipc_mode�get_network_mode�list�keys�get_pid_mode�get_volumes_from�get�get_secretsrU�get_service_scale�get_device_requests�)translate_credential_spec_to_security_opt�)translate_deploy_keys_to_container_config�log�warningr0�joinr/r!)r5rA�config_datarCrarbrGr[rE�project_networksrZ�service_dict�service_networksr\r`r]r_r^rU�ignored_keysr8rSr9re[s��


�





�����
���zProject.from_configcCsdd�|jD�S)NcS�g|]}|j�qSr8�rA�rQ�servicer8r8r9rT��z)Project.service_names.<locals>.<listcomp>)rB�rHr8r8r9�
service_names�szProject.service_namescCs&|jD]}|j|kr|Sqt|��)zo
        Retrieve a service by name. Raises NoSuchService
        if the named service does not exist.
        )rBrA�
NoSuchService)rHrAr�r8r8r9�get_service�s


�zProject.get_servicecCs$|j}|D]
}||vrt|��qdS)z�
        Validate that the given list of service names only contains valid
        services. Raises NoSuchService if one of the names is invalid.
        N)r�r�)rHr��valid_namesrAr8r8r9�validate_service_names�s��zProject.validate_service_namesTcs��j���|dust|�dkrd}�fdd��jD�}�fdd�|D���fdd��jD�}|rE|D]}|��D]}|�vrC��|�q8q2|rRt��fdd	�|g�}g��fd
d�|D��S)aM
        Returns a list of this project's services filtered
        by the provided list of names, or all services if service_names is None
        or [].

        If include_deps is specified, returns a list including the dependencies for
        service_names, in order of dependency.

        Preserves the original order of self.services where possible,
        reordering as needed to resolve dependencies.

        Raises NoSuchService if any of the named services do not exist.

        Raises ConfigurationError if any service depended on is not enabled by active profiles
        NrFcsg|]
}|���r|j�qSr8)�enabled_for_profilesrAr)rGr8r9rT�s��z(Project.get_services.<locals>.<listcomp>crOr8�r��rQrAr�r8r9rT�sc�g|]}|�vr|�qSr8r8�rQ�s)�unsortedr8r9rT��cs��||��S�N)�_inject_deps)�accr�)rGrHr8r9�<lambda>�sz&Project.get_services.<locals>.<lambda>csg|]}|�vr��|��qSr8)r/r�)�uniquesr8r9rT�s)rG�copy�lenrB�get_profilesr/r)rHr��include_deps�auto_enable_profilesrBr��profiler8)rGrHr�r�r9�get_services�s0

�
���zProject.get_servicescCs"|�||�}|D]}|��q|Sr�)r��remove_duplicate_containers)rHr�r�rBr�r8r8r9�get_services_without_duplicate�s
z&Project.get_services_without_duplicatec	Cs�g}d|vrA|�dg�D]1}d|vr|�dd�\}}n|d}}z|�|�|�|f�Wqty=td|d|f��w|d=|S)Nr\�:rz=Service "%s" has a link to service "%s" which does not exist.rA)ro�splitr/r�r�r)rHrzr\�link�service_name�	link_namer8r8r9rh�s"

���zProject.get_linkscCs�|�dd�}|s|jjr|rt|d�Std�Std�St|�}|r)t|�|��St|�}|rLz
tt	�
|j|��WStyKt
dj|d|d���wt|�S)Nr]r�nonezRService '{name}' uses the network stack of container '{dep}' which does not exist.rA�rA�dep)rgrEr[rrr#r�r
rr�from_idrCrrr0)rHrzrEr]r��container_namer8r8r9rjs(
���zProject.get_network_modecC�|�dd�}|std�St|�}|rt|�|��St|�}|r<z
tt�|j	|��WSt
y;tdj|d|d���wt|�S)N�pidzRService '{name}' uses the PID namespace of container '{dep}' which does not exist.rAr�)
rgr rr$r�r
rrr�rCrrr0)rHrzr_r�r�r8r8r9rm�$
���zProject.get_pid_modecCr�)N�ipczRService '{name}' uses the IPC namespace of container '{dep}' which does not exist.rAr�)
rgrrr"r�r
rrr�rCrrr0)rHrzr`r�r�r8r8r9ri3r�zProject.get_ipc_modecCs�|�dd�}|�dd�}|s|durdS|S|�dd�dkr&|dur$dS|S|�dd�}|dur8|dur8td��|dur>|}|durDdS|�di��d	|�}t||�}||kr_t�d
�|��|S)NrV�deployr�mode�
replicated�replicaszUBoth service.scale and service.deploy.replicas are set. Only one of them must be set.�	placement�max_replicas_per_nodez7Scale is limited to {} ('max_replicas_per_node' field).)ror�minrurvr0)rHrzrV�deploy_dictr��max_replicasr8r8r9rqHs2��
�zProject.get_service_scalecCs�|�dd�}|s
dS|�dd�}|r|�dd�sdS|d�d�}|s%dS|D]*}|�dd�}t|t�sF|dkrBtd�|d�d	��d|d<d
|vrQ|d
g|d
<q'|S)Nr��	resources�reservations�devices�count����allz$Invalid value "{}" for devices countz(expected integer or "all")�capabilities)ro�
isinstance�intrr0)rHrzr�r�r��devr�r8r8r9rrgs,
��zProject.get_device_requestscsLg���fdd�}��|�}�fdd�}tj||t�d�d|dd�d	��S)
Ncs"|jdddi���}��|�dS)N�quietTr8)�start�extend)r��service_containers)�
containers�optionsr8r9�
start_service�sz$Project.start.<locals>.start_servicec��fdd�|����D�S)Nc�h|]\}}��|�|f�qSr8r��rQr��configr�r8r9�	<setcomp>����z2Project.start.<locals>.get_deps.<locals>.<setcomp>��get_dependency_configs�items�r�r�r8r9�get_deps��

�zProject.start.<locals>.get_depsrA�StartingcSs
|��Sr�)r�)�objr8r8r9r��s
zProject.start.<locals>.<lambda>)�
fail_check)r�r	�parallel_execute�operator�
attrgetter)rHr�r�r�rBr�r8)r�r�rHr9r��s
�	z
Project.startcs@�j||d����fdd�}t����d|�t�d�d|�dS)N�rMcs��fdd��D�S)Ncs*h|]}�j��|j���vr|df�qSr�)r�r��get_dependency_names)rQ�other)�	containerrHr8r9r��s��z1Project.stop.<locals>.get_deps.<locals>.<setcomp>r8�r��r�rHr�r9r��szProject.stop.<locals>.get_deps�stoprA�Stopping)r�r	r��+build_container_operation_with_timeout_funcr�r�)rHr�rMr�r�r8r�r9r��s
�zProject.stopcKs|�|�}t�t|�|�|Sr�)r�r	�parallel_pause�reversed�rHr�r�r�r8r8r9�pause�s
z
Project.pausecKs|�|�}t�||�|Sr�)r�r	�parallel_unpauser�r8r8r9�unpause�s
zProject.unpausecKst�|�|�|�dSr�)r	�
parallel_killr�)rHr�r�r8r8r9�kill�szProject.killcKst�|j|d|d�|�dS)NT)�stoppedrM)r	�parallel_remover�)rHr�rMr�r8r8r9�remove_stopped�s
��zProject.remove_stoppedcCsT|jtj|d�|s|�|�|j|tjd�|j��|r#|j��|�|�dS)N)rM�timeout)�vrM)	r�r)r2�find_orphan_containersr�rE�removerD�
remove_images)rH�remove_image_type�include_volumes�remove_orphansr��ignore_orphansr8r8r9�down�s


zProject.downcCs|jD]}|�|�qdSr�)rB�remove_image)rHr�r�r8r8r9r��s
�zProject.remove_imagescKsDdd�|�|�D�}|j|dd�}t�||�d|�t�d�d�|S)NcSr}r8r~r�r8r8r9rT�r�z#Project.restart.<locals>.<listcomp>T�r��restartrA�
Restarting)r�r�r	r�r�r�r�r�r8r8r9r��s
�zProject.restartc

s�g}
|�|�D]}|��r|
�|�q�	st�d|j�q�r.|r't�d��r.t�d�����������	f
dd�}|rdtj|
|t	�
d�ddd	�\}}t|�rbd
�dd�|�
�D��}t|��dS|
D]}||�qfdS)
Nz%s uses an image, skippingzJFlag '--parallel' is ignored when building with COMPOSE_DOCKER_CLI_BUILD=1zJFlag '--compress' is ignored when building with COMPOSE_DOCKER_CLI_BUILD=1cs |���������	���
dSr�)�buildr��
�
build_args�cli�force_rm�gzip�memory�no_cache�progress�pull�rm�silentr8r9�
build_service�s z$Project.build.<locals>.build_servicerA�Building���limit�
cS�$g|]}t|t�r|�d�n|�qS��utf-8�r��bytes�decode�rQ�er8r8r9rT��z!Project.build.<locals>.<listcomp>)r��can_be_builtr/ru�inforArvr	r�r�r�r�rw�values�ProjectError)rHr�rrr�rr�r��parallel_buildrrr�rrBr�r�_�errors�combined_errorsr8r�r9r��s<�


�
��
�z
Project.buildcCsT|j|dd�}|D]}|j|d�q	|�||�}|D]
}|j||jddd�qdS)NT�r�)�do_buildF)�detachedr�)r��ensure_image_exists�_get_convergence_plans�execute_convergence_planrA)rHr��strategyrrB�svc�plansr�r8r8r9�create	s��zProject.createc	cs��dd�}t|p
|j�}|jjd|��idd�D](}d|vrqzt�|j|d�}Wn	ty3Yqw|j|vr:q|||�VqdS)NcSsLtj�|d�}|jt|d�d�}|d|d|j|j|j|dd�|d�S)	N�time�timeNano��microsecondr��status�from)rA�image�r'�type�action�idr��
attributesr�)�datetime�
fromtimestamp�replacer&r1r�rA)�eventr�r'r8r8r9�build_container_events
���z>Project._legacy_event_processor.<locals>.build_container_event�labelT��filtersrr+r1)	�setr�rC�eventsr7rr�rr�)rHr�r7r6r�r8r8r9�_legacy_event_processors$�

��
�zProject._legacy_event_processorcsJt�jjd�r��|�S�fdd����fdd�}||r!t|��S�j�S)Nz1.22cs�|dd}tj�|d�}|jt|d�d�}d}zt��j|d�}Wn	ty.Ynw|d|d|dd	|�t	�d
d�|�
�D�|d�S)
N�Actor�
Attributesr'r(r)r1r�r+�IDcSs i|]\}}|�d�s||�qS)zcom.docker.compose.)�
startswith)rQ�kr�r8r8r9�
<dictcomp>]s��zAProject.events.<locals>.build_container_event.<locals>.<dictcomp>r.)r3r4r5r&rr�rCrrorr�)r6�container_attrsr'r�r�r8r9r7Is*
��
��z-Project.events.<locals>.build_container_eventc	3sn��jjd���idd�D]'}|�d�dkrq
z|ddt|vr$Wq
Wn	ty.Yq
w�|�Vq
dS)Nr8Tr9�Typer�r>r?)rCr<r7ror�KeyError)r�r6�r7rHr8r9�
yield_loopds �

����z"Project.events.<locals>.yield_loop)rrC�api_versionr=r;r�)rHr�rHr8rGr9r<Ds

zProject.eventsc
s����|s��|��duri��j||d�}|D]
}|j|||d�q�j||||r.|ngd��t|||dd������������	�
f
dd�}�fdd	�}t�||t�	d
�d|�\}}|rdt
d��dd
�|D�S)Nr)rrr�)�always_recreate_depsrMcS�|jSr�r~r�r8r8r9r��szProject.up.<locals>.<lambda>cs2|j�|j�	�p|�v��|j������d�	S)N)r�r�scale_override�rescaler��reset_container_image�renew_anonymous_volumes�override_options)r"rAror�)
rrPr%rOrMrNrL�services_to_attachr�r�r8r9�do�s

�zProject.up.<locals>.docr�)Ncr�r8r�r�r�r8r9r��r�z/Project.up.<locals>.get_deps.<locals>.<setcomp>r�r�r�r8r9r��r�zProject.up.<locals>.get_depsrAz1Encountered errors while bringing up the project.cSs"g|]
}|dur|D]}|�q
qSr�r8)rQ�svc_containersr�r8r8r9rT�s��zProject.up.<locals>.<listcomp>)�
initializer�r�r r!r%r	r�r�r�r)rHr��
start_depsr#rr�rr�r�rLrMr�rJrNrOrr�rM�attach_dependenciesrPrBr$rRr��resultsrr8)rrPr%rOrMrNrLrHrQr�r�r9�upvsN
�
��
���z
Project.upcCs|j��|j��dSr�)rErTrDr�r8r8r9rT�s
zProject.initializec
s�i�|D]f}�fdd�|��D�}|o|j|v}|r_|jr_t�d|jd�|��t|jddddgid	��}t|���}	td
d�|��D��}
|	|
A}|sP|sP|rX|�	t
j|�}n
|�	||�}n|�	||�}|�|j<q�S)Ncs&g|]}|�vr�|jdvr|�qS))�recreater&)r0r��r%r8r9rT�s�z2Project._get_convergence_plans.<locals>.<listcomp>z%s has upstream changes (%s)rXTr+�created�exited)r�r:css�|]}|�d�VqdS)zHostConfig.LinksN)ro�rQ�cr8r8r9�	<genexpr>�s�z1Project._get_convergence_plans.<locals>.<genexpr>)r�rA�allows_recreateru�debugrw�anyr��get_link_names�convergence_planr�always)
rHrBr#rJrMr��updated_dependencies�
is_one_off�containers_stopped�service_has_links�container_has_links�should_recreate_for_links�planr8rZr9r!�s.
�
��zProject._get_convergence_plansc	
Cs�|�||�}|r|j||d�dSg}|D]"}z	|j||d�Wqttfy7|��r4|�|j�n�Yqwt|�rIt	�
d�d�|���dSdS)N)r�WSome service image(s) must be built from source by running:
    docker-compose build {}� )
r��
parallel_pullrrrrr/rAr�rurvr0rw)	rHr��ignore_pull_failuresrorr�rB�
must_buildr�r8r8r9r�s$����zProject.pullcs�|sdnd�g����fdd�}tj||t�d��dd�\}}t��r.t�d�d�����t|�rBd	�d
d�|�	�D��}t
|��dS)N�Pullingc	s�|j�ddd�}|durdSz+tj��}|durtd��|D]}d|vr%qt|�}|��|jt|�dd��qWdSt	t
fyP|��rO��|j�YdS�w)NT)�streamz2ParallelStreamWriter has not yet been instantiatedr+cSs|Sr�r8�r�r8r8r9r�sz=Project.parallel_pull.<locals>.pull_service.<locals>.<lambda>)
rr	�ParallelStreamWriter�get_instance�RuntimeErrorr�writerAr'rrrr/)r��strm�writerr6r+�rp�msgrqr8r9�pull_services(
���z+Project.parallel_pull.<locals>.pull_servicerArr	rmrnrcSrr
rrr8r8r9rT/rz)Project.parallel_pull.<locals>.<listcomp>)r	r�r�r�r�rurvr0rwrr)rHrBrprr}rrrr8r{r9ros(
��
��zProject.parallel_pullc	Csjt�}|j|dd�D](}t|j�\}}}|r|�||f�n|�|df�}||vr2|�|�|�|�q
dS)NFr�latest)r;r�r�
image_namerw�push�add)	rHr��ignore_push_failures�
unique_imagesr��repo�tag�sep�service_image_namer8r8r9r�4s 

��zProject.pushc
s�ttd�fdd��jj|d�j|d�id�D���}|r|Stt�fdd�td�fdd��jj|d�j|d	d
�id�D����S)Nc�g|]	}t��j|��qSr8�r�from_psrC�rQr�r�r8r9rT@���z/Project._labeled_containers.<locals>.<listcomp>r8r�)r�r:cs|��j�Sr�)�has_legacy_proj_namerA)r^r�r8r9r�Isz-Project._labeled_containers.<locals>.<lambda>cr�r8r�r�r�r8r9rTIr�T)rMrN)rk�filterrCr�r7)rHr�rM�ctnrsr8r�r9�_labeled_containers?s�
���zProject._labeled_containerscs@�r|���n|j�|�||�}�fdd���fdd�|D�S)Ncs|j�t��vSr�)r7rorr�)r�r8r9�matches_service_namesXsz1Project.containers.<locals>.matches_service_namescsg|]}�|�r|�qSr8r8r])r�r8r9rT[r�z&Project.containers.<locals>.<listcomp>)r�r�r�)rHr�r�rMr�r8)r�r�r9r�PszProject.containersc	s��fdd�}t|��}|sdS|r7|D]!}t�d�|j��z|��Wn	ty-Ynw|jdd�qdSt�d�d�	dd	�|D����dS)
Nc3sD�t����jdd��}|D]}|j�t�}|�jvr|VqdS)NTr�)r;r�r7rorr�)r��ctnrr�r�r8r9�_find^s�
��z-Project.find_orphan_containers.<locals>._findzRemoving orphan container "{}"T)�forcez�Found orphan containers ({}) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.rXcSsg|]}d�|j��qS)z{})r0rA)rQr�r8r8r9rTur�z2Project.find_orphan_containers.<locals>.<listcomp>)
rkrurr0rAr�rr�rvrw)rHr�r��orphansr�r8r�r9r�]s(
����zProject.find_orphan_containerscCsn|��}t|�dkr,|jtt|��ddd�}|D]}|�|�s*tdj|j|jd���qng}|�	|�||S)NrTF)r�r�r�z�Service "{dep_name}" was pulled in as a dependency of service "{service_name}" but is not enabled by the active profiles. You may fix this by adding a common profile to "{dep_name}" and "{service_name}".)�dep_namer�)
r�r�r�rkr;r�rr0rAr/)rHr�r�rG�	dep_names�dep_servicesr�r8r8r9r�ys&
�

����
zProject._inject_depscs���fdd�}|S)NcsD���}|�d�dur��|j�}|�d�|d<t|��di|��S)Nr�r8)r�ror�r��stop_timeout�getattr)r��_optionsr���	operationr�rHr8r9� container_operation_with_timeout�s
z]Project.build_container_operation_with_timeout_func.<locals>.container_operation_with_timeoutr8)rHr�r�r�r8r�r9r��sz3Project.build_container_operation_with_timeout_func)NNNN)NNN)NFTr@r�)FNF)NFFFNNFFTFFN)FN)NFTFF)FF)2r;r<r=�__doc__rIr)r1r7r>re�propertyr�r�r�r�r�rhrjrmrirqrrr�r�r�r�r�r�r�r�r�r�r�changedrr�r&r=r<rXrTr!rror�r�r�r�r�r�r8r8r8r9r?Ds�
�
	�K



1



	
�


�*
�
)3
�V
 
�

-
r?cCs:g}d|vrt|d�}|�dj|d��|r||d<|S)N�credential_speczcredentialspec={spec})�spec�security_opt)�'convert_credential_spec_to_security_optr/r0)rz�resultr�r8r8r9rs�srscCsjd|vr|d�d�|d<d|dvrt|dd�|d<d|vr3|d�d�|d<d|dvr3dgSgS)N�limitsr�	mem_limit�cpusr��mem_reservationzresources.reservations.cpus)ro�float)�resources_dictrzr8r8r9�+translate_resource_keys_to_container_config�sr�cCs0z	dddd�|WStytd�|���w)Nre�no�
on-failure)rbr�r�zInvalid restart policy "{}")rFrr0r~r8r8r9�convert_restart_policy�s���r�cCs(d|vrdj|dd�Sdj|dd�S)N�filez
file://{file})r�zregistry://{registry}�registry)r�)r0)r�r8r8r9r��sr�cs�d|vr|d=d|vr|d=d|vr|gfS|d��fdd�dD�}d�vrUt�d�dd	���d�d
d�d�|d
<�d��D]}|dkrT|d
krT|�d�|��qB|�t��di�|��|d=||fS)Nr��configsr�cr�r8r8)rQrB�r�r8r9rT�s
�z=translate_deploy_keys_to_container_config.<locals>.<listcomp>)�
endpoint_moder7�
update_config�rollback_config�restart_policy�	conditionrb�max_attemptsr)�Name�MaximumRetryCountr�zrestart_policy.{}r�)r�rorlr/r0r�r�)rzr|rBr8r�r9rt�s2
�
����rtcs4��dd�}|s
gS��fdd���fdd�|D�S)Nr^cs�|jdkrz|j��|j�d�WStyYnw|jdkr8zt��j|j�}|j|d�WSty7Ynwt	d�
�d|j���)Nr�)�sourcer�zWService "{}" mounts volumes from "{}", which is not the name of a service or container.rA)r/�_replacer�r�r�rr�rCrrr0)r�r�)rZrzr8r9�build_volume_from�s(
�
���z+get_volumes_from.<locals>.build_volume_fromcsg|]}�|��qSr8r8)rQ�vf)r�r8r9rTsz$get_volumes_from.<locals>.<listcomp>)rg)rZrzr^r8)r�rZrzr9rn�s
rncCs�g}|D]W}|�|j�}|stdj||jd���|�d�r)t�dj||jd��q|js2|js2|jr=t�dj||jd��|�d�}t	�
t|��sSt�dj||d��|�||d	��q|S)
Nz8Service "{service}" uses an undefined secret "{secret}" )r��secret�externalz�Service "{service}" uses secret "{secret}" which is external. External secrets are not available to containers created by docker-compose.z�Service "{service}" uses secret "{secret}" with uid, gid, or mode. These fields are not supported by this implementation of the Compose filer�zwService "{service}" uses an undefined secret file "{secret_file}", the following file should be created "{secret_file}")r��secret_file)r�r�)
ror�rr0rurv�uid�gidr�r�isfile�strr/)r��service_secrets�secret_defsrUr��
secret_defr�r8r8r9rps>��
���
��rpcCs�i}t�}t�}|jD]:}z	t|�||j<Wqty.}z|�|j�WYd}~qd}~wtyE}z|�|j�WYd}~qd}~ww|sJ|rOt	||��|Sr�)
r;rB�get_image_digestrA�	NeedsPushr�r�	NeedsPullr��MissingDigests)rZ�digests�
needs_push�
needs_pullr�rr8r8r9�get_image_digests*s 
���
r�cCsrd|jvr
tdj|d���t|jd�\}}}|dkr |jdSt|�}|r(|Sd|jvr4t|j|j��t|j��)Nr-z�Service '{s.name}' doesn't define an image tag. An image name is required to generate a proper image digest. Specify an image repo and tag with the 'image' option.rt�@r�)	r�r
r0r�
get_digestr�rrAr�)r�r�	separator�digestr8r8r9r�=s
��


r�cCs�d}z|��}|dr|dd}W|SW|StyLz|��}|ddr8dj|j|ddd�}WY|SWY|StyKtdj|jd���ww)	N�RepoDigestsr�
Descriptorr�z{image_name}@{digest})rr�zaDigest not found for service '{service}'. Repository does not exist or may require 'docker login'r�)r-r�get_image_registry_datar0rr
rA)r�r�r-�distributionr8r8r9r�Ts6��

�	�
�����r�c@�eZdZdd�ZdS)r�cC�||_||_dSr�)r�r�)rHr�r�r8r8r9rIo�
zMissingDigests.__init__N�r;r<r=rIr8r8r8r9r�n�r�c@r�)r�cC�
||_dSr�)r)rHrr8r8r9rIu�
zNeedsPush.__init__Nr�r8r8r8r9r�tr�r�c@r�)r�cCr�r�)rr�)rHrr�r8r8r9rIzr�zNeedsPull.__init__Nr�r8r8r8r9r�yr�r�c@seZdZdd�Zdd�ZdS)r�cCs*t|t�r
|�d�}||_d|j|_dS)NrzNo such service: %s)r�rrrAr|)rHrAr8r8r9rI�s

zNoSuchService.__init__cCrKr��r|r�r8r8r9�__str__�szNoSuchService.__str__N)r;r<r=rIr�r8r8r8r9r�sr�c@r�)rcCr�r�r�)rHr|r8r8r9rI�r�zProjectError.__init__Nr�r8r8r8r9r�r�r)Rr3�enum�loggingr�rK�	functoolsr�osr�
docker.errorsrrr�docker.utilsrrJr	�
cli.errorsr
r�r�
config.configr�config.sort_servicesr
r�constrrrr�r�networkrrr�progress_streamrr�rrrrrrrrrr r!r"r#r$�utilsr%r&r'�volumer(�	getLoggerr;ru�unique�Enumr)r?rsr�r�r�rtrnrpr�r�r��	Exceptionr�r�r�r�rr8r8r8r9�<module>s�
_
!&