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/config/__pycache__/config.cpython-310.pyc
o

S�`���@s�ddlZddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZddl
mZddl
Z
zddlmZWneyKddlmZYnwddlmZd	d
lmZd	dlmZd	dlmZd	d
lmZd	dlmZd	dlmZd	dlmZd	dlmZddlm Z ddlm!Z!ddlm"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.ddlm/Z/ddlm0Z0dd lm1Z1dd!lm2Z2dd"lm3Z3dd#lm4Z4dd$lm5Z5dd%lm6Z6dd&l7m8Z8dd'l7m9Z9dd(l7m:Z:dd)l7m;Z;dd*l7m<Z<dd+l7m=Z=dd,l7m>Z>dd-l7m?Z?dd.l7m@Z@dd/l7mAZAdd0l7mBZBdd1l7mCZCdd2l7mDZDdd3l7mEZEdd4l7mFZFgd5�ZGeGgd6�ZHd7ZIgd8�ZJd9ZKe�LeM�ZNGd:d;�d;ed<d=��ZOGd>d?�d?ed@dA��ZPGdBdC�dCedDdE��ZQGdFdG�dGedHdI��ZRd�dJdK�ZSdLdM�ZTdNdO�ZUdPdQ�ZVdRdS�ZWdTdU�ZXd�dWdX�ZYd�dYdZ�ZZd[d\�Z[d]d^�Z\d�d_d`�Z]dadb�Z^dcdd�Z_d�dedf�Z`Gdgdh�dh�Zad�didj�Zbdkdl�Zcdmdn�Zddodp�Zedqdr�Zfdsdt�Zgdudv�Zhdwdx�Zidydz�Zjd{d|�Zkd}d~�Zl	Vd�dd��Zmd�d��Znd�d��ZoGd�d��d�ep�Zqd�d��Zrd�d��Zsd�d��Ztd�d��Zud�d��Zvd�d��Zwd�d��Zxd�d��Zyd�d��Zzd�d��Z{d�d��Z|d�d��Z}d�d��Z~d�d��Zd�d��Z�d�d��Z�e��e�e"d��Z�e��e�e"d��Z�e��e�e�d��Z�e��e�d�d��d��Z�e��e�e�d��Z�e��e�d�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�dÄZ�d�dńZ�d�dDŽZ�d�dɄZ�d�d˄Z�d�d̈́Z�d�dτZ�d�dфZ�d�dӄZ�d�dՄZ�d�d�dׄZ�dS)��N)�
namedtuple)�chain)�
attrgetter)�
itemgetter)�cached_property�)�types�)�COMPOSE_SPEC)�COMPOSEFILE_V1)�build_string_dict��	json_hash)�parse_bytes)�parse_nanoseconds_int)�
splitdrive)�ComposeVersion)�env_vars_from_file)�Environment)�	split_env)�CircularReference)�ComposeFileNotFound)�ConfigurationError)�DuplicateOverrideFileFound)�VERSION_EXPLANATION)�!interpolate_environment_variables)�$get_container_name_from_network_mode)�"get_service_name_from_network_mode)�sort_service_dicts)�	MountSpec)�parse_extra_hosts)�parse_restart_spec)�SecurityOpt)�ServiceLink)�ServicePort)�VolumeFromSpec)�
VolumeSpec)�match_named_volumes)�validate_against_config_schema)�validate_config_section)�validate_cpu)�validate_credential_spec)�validate_depends_on)�validate_extends_file_path)�validate_healthcheck)�validate_ipc_mode)�validate_links)�validate_network_mode)�validate_pid_mode)�validate_service_constraints)�validate_top_level_object)�validate_ulimits)<�cap_add�cap_drop�
cgroup_parent�command�	cpu_count�cpu_percent�
cpu_period�	cpu_quota�
cpu_rt_period�cpu_rt_runtime�
cpu_shares�cpus�cpuset�detach�device_cgroup_rules�devices�dns�
dns_search�dns_opt�
domainname�
entrypoint�env_file�environment�extra_hosts�	group_add�hostname�healthcheck�image�ipc�	isolation�labels�links�mac_address�	mem_limit�mem_reservation�
memswap_limit�mem_swappiness�net�
oom_score_adj�oom_kill_disable�pid�ports�
privileged�	read_only�restart�runtime�secrets�security_opt�shm_size�
pids_limit�
stdin_open�stop_signal�sysctls�tty�user�userns_mode�
volume_driver�volumes�volumes_from�working_dir)�blkio_config�build�container_name�credential_spec�
dockerfile�init�
log_driver�log_opt�logging�network_mode�platform�profiles�scale�stop_grace_period)zhttp://zhttps://zgit://zgithub.com/zgit@)zdocker-compose.ymlzdocker-compose.yamlzcompose.ymlzcompose.yaml)zdocker-compose.override.ymlzdocker-compose.override.yamlzcompose.override.ymlzcompose.override.yamlcs"eZdZdZd�fdd�	Z�ZS)�
ConfigDetailsac
    :param working_dir: the directory to use for relative paths in the config
    :type  working_dir: string
    :param config_files: list of configuration files to load
    :type  config_files: list of :class:`ConfigFile`
    :param environment: computed environment values for this project
    :type  environment: :class:`environment.Environment`
     Ncs$|dur	t�|�}t��||||�S�N)r�
from_env_file�super�__new__)�clsrq�config_filesrL��	__class__��7/usr/lib/python3/dist-packages/compose/config/config.pyr��s

�zConfigDetails.__new__r�)�__name__�
__module__�__qualname__�__doc__r��
__classcell__r�r�r�r�r��sr��_ConfigDetailsz$working_dir config_files environmentc@sdeZdZdZedd��Zedd��Zedd��Zdd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
dd�ZdS)�
ConfigFilez�
    :param filename: filename of the config file
    :type  filename: string
    :param config: contents of the config file
    :type  config: :class:`dict`
    cCs||t|��Sr�)�	load_yaml)r��filenamer�r�r��
from_filename�szConfigFile.from_filenamecCs.|j�dd�}t|t�rtS|rt|�S|jS)N�version)�config�get�
isinstance�dict�V1rr�)�selfr�r�r�r��config_version�s
zConfigFile.config_versioncCs|j�dd�}|sA|j�dd�}|j�dd�}|j�dd�}|s$|s$|r7dD]}t|j|j�|i�|�q&tSt|j|jd�tSt|t�rRt�	d�
|jt��tSt|t�s_td�
|j���t|t�rwt
�d�}|�|�swtd	�
||j���|�d
�r�td�
|jt���tS)Nr��services�networksro)r�r�roz�Unexpected type for "version" key in "{}". Assuming "version" is the name of a service, and defaulting to Compose file version {}.z3Version in "{}" is invalid - it should be a string.z^[1-3]+(\.\d+)?$z Version "{}" in "{}" is invalid.�1zVersion in "{}" is invalid. {})r�r�r)r��VERSIONr�r�r��log�warning�format�strr�re�compile�match�
startswithr)r�r�r�r�ro�section�version_patternr�r�r�r��sL�
�

�
�



�

�zConfigFile.versioncCs|��|Sr���get_service_dicts)r��namer�r�r��get_service�szConfigFile.get_servicecCs|jtkr|jS|j�di�S)Nr��r�r�r�r��r�r�r�r�r��s
zConfigFile.get_service_dictscC�|jtkriS|j�di�S)Nror�r�r�r�r��get_volumes�zConfigFile.get_volumescCr�)Nr�r�r�r�r�r��get_networksr�zConfigFile.get_networkscCr�)Nrdr�r�r�r�r��get_secrets	r�zConfigFile.get_secretscCr�)N�configsr�r�r�r�r��get_configsr�zConfigFile.get_configsN)r�r�r�r��classmethodr�rr�r�r�r�r�r�r�r�r�r�r�r�r��s


-r��_ConfigFilezfilename configc@seZdZdZdS)�Configa�
    :param config_version: configuration file version
    :type  config_version: int
    :param version: configuration version
    :type  version: int
    :param services: List of service description dictionaries
    :type  services: :class:`list`
    :param volumes: Dictionary mapping volume names to description dictionaries
    :type  volumes: :class:`dict`
    :param networks: Dictionary mapping network names to description dictionaries
    :type  networks: :class:`dict`
    :param secrets: Dictionary mapping secret names to description dictionaries
    :type secrets: :class:`dict`
    :param configs: Dictionary mapping config names to description dictionaries
    :type configs: :class:`dict`
    N)r�r�r�r�r�r�r�r�r�sr��_Configz@config_version version services volumes networks secrets configsc@seZdZedd��ZdS)�
ServiceConfigcCs8|std��|tj�|�|rtj�|�||�S|||�S)Nz!No working_dir for ServiceConfig.)�
ValueError�os�path�abspath)r�rqr�r�r�r�r�r��with_abs_paths%s
��zServiceConfig.with_abs_pathsN)r�r�r�r�r�r�r�r�r�r�#sr��_ServiceConfigz working_dir filename name configcs�|dgkrt|rtj�|�nt��tdt�tj	��g|�S|r)�fdd�|D�}nt
��}|s5|s5tt��|sAt
|�}|sAtt��t
�d�d�|���t|rQ|ntj�|d�dd�|D�|�S)N�-csg|]	}tj��|��qSr�)r�r��join��.0�f��base_dirr�r��
<listcomp>:�zfind.<locals>.<listcomp>zUsing configuration files: {}�,rcSsg|]}t�|��qSr�)r�r�r�r�r�r�r�J�)r�r�r�r��getcwdr��yaml�	safe_load�sys�stdin�get_default_config_filesr�SUPPORTED_FILENAMESr��debugr�r��dirname)r��	filenamesrL�override_dirr�r�r��find1s*
��r�cCsV|d}t|�|dd�D]}t|�|j|jkr(td�|j|j|j|j���qdS)NrrzTVersion mismatch: file {} specifies version {} but extension file {} uses version {})r4r�rr�r�)r��	main_file�	next_filer�r�r��validate_config_versionOs ����r�cCs`tt|�\}}|sdS|d}t|�dkr$t�dd�|��t�d|�tj�||�gt|�S)Nrrz4Found multiple config files with supported names: %s�, z	Using %s
)	�find_candidates_in_parent_dirsr��lenr�r�r�r�r��get_default_override_file)r��
candidatesr��winnerr�r�r�r�`sr�cs*�fdd�tD�}t|�dkrt|��|S)Ncs0g|]}tj�tj��|��rtj��|��qSr��r�r��existsr�)r��override_filename�r�r�r�r�ps�z-get_default_override_file.<locals>.<listcomp>r)�DEFAULT_OVERRIDE_FILENAMESr�r)r��override_files_in_pathr�r�r�r�os
�r�csN�fdd�|D�}|s#tj��d�}tj�|�tj���kr#t||�S|�fS)z�
    Given a directory path to start, looks for filenames in the
    directory, and then each parent directory successively,
    until found.

    Returns tuple (candidates, path).
    cs&g|]}tj�tj��|��r|�qSr�r�)r�r�r�r�r�r��s
�z2find_candidates_in_parent_dirs.<locals>.<listcomp>z..)r�r�r�r�r�)r�r�r��
parent_dirr�r�r�r�xs
r�csNd}d��fdd�|D�}|r%t�|jd�tdd�|D����d��dSdS)	Nz�Some services ({services}) use the '{key}' key, which will be ignored. Compose does not support '{key}' configuration - use `docker stack deploy` to deploy to a swarm.r�csg|]	}|���r|�qSr�)r��r��s��keyr�r�r��r�z+check_swarm_only_config.<locals>.<listcomp>r�css�|]}|dVqdS)r�Nr�r�r�r�r��	<genexpr>���z*check_swarm_only_config.<locals>.<genexpr>)r�r�)r�r�r�r��sorted)�
service_dicts�warning_templater�r�r�r��check_swarm_only_config�s����r�Tc
s�t�j���fdd��jD�}�j|d���jd}t�jdd�}t�jdd�}t�jd	d
�j�}t�jdd�j�}t�|�d
�}|jtkrQ|D]}	t|	|�qIt	|�t
|j|j|||||�S)aLoad the configuration from a working directory and a list of
    configuration files.  Files are loaded in order, and merged on top
    of each other to create the final configuration.

    Return a fully interpolated, extended and validated configuration.
    csg|]
}t|�j�d��qS)��interpolate)�process_config_filerL)r��config_file��config_detailsr�r�r�r��s��zload.<locals>.<listcomp>)r�rr��Volumer��Networkr��Secretr�r�r�)r�r��_replace�load_mappingrq�
load_servicesr�r�r'r�r�r�)
r�r��processed_filesr�ror�rdr�r��service_dictr�r�r��load�s4
	�
����


�rc
Cs�i}|D]o}t||����D]d\}}|pi||<|sq|�d�}|r@t||||j�t|t�r7|�d�|d<n	|�d�s@||d<d|vrLt|d�|d<d|vrYt||d�|d<d|vrrt	|d�|d<t
||�}	|	rr|	|dd<qq|S)N�externalr�rT�file�driver_opts�device)�getattr�itemsr��validate_externalr�r�r��parse_labels�expand_pathr�format_device_option)
r��get_func�entity_typerq�mappingr�r�r�rrr�r�r�r��s6


�
��r�cCst|dkrdS|�dd�}|dkrdS|d�d�}|d�d�}|r4|dkr6|r8tj�tj�|��}|SdSdSdS)Nr��driver�localr�or�bind)r�r�r�r��
expanduser)rr�rrr�fullpathr�r�r�r�s�rc
CsN|��D] }|dkr|dkrq|dvr$td�||d�dd�|D�����qdS)Nr�r)rr�zD{} {} declared as external but specifies additional attributes ({}).r�css�|]	}|dkr|VqdS)rNr��r��kr�r�r�r����z$validate_external.<locals>.<genexpr>)�keysrr�r�)rr�r�r�rr�r�r�r	�s����r	csL���fdd���fdd�}�fdd�}dd��jD�}t�||�}||�S)	Ncs`t��j�j||�}t|��jd�}t|���}|j|d�}t	||��t
||�j�j��}|S)N�rL�r�)r�r�rqr��ServiceExtendsResolverrL�process_service�runr��validate_service�finalize_servicer�)�service_namer�
service_names�service_config�resolver)r�r�r�r�r��
build_services(���z$load_services.<locals>.build_servicecs$|���t��fdd�|��D��S)Ncsg|]
\}}�||���qSr�r�)r�r�r)r%r"r�r�r�s
��z9load_services.<locals>.build_services.<locals>.<listcomp>)rrr)r#)r%)r"r��build_servicess�z%load_services.<locals>.build_servicescs&t��t��B}���fdd�|D�S)Nc	s,i|]}|t��|i���|i��j��qSr�)�merge_service_dicts_from_filesr�r�)r�r�)�baser��overrider�r��
<dictcomp> s�

��z9load_services.<locals>.merge_services.<locals>.<dictcomp>)�set)r(r)�all_service_names)r��r(r)r��merge_servicess�z%load_services.<locals>.merge_servicescS�g|]}|���qSr�r�)r�rr�r�r�r�(s�z!load_services.<locals>.<listcomp>)r��	functools�reduce)r�r�r�r&r.�service_configsr#r�)r%r�r�r�r�r�s
�r�cCst|j|||�Sr�)rr�)r�r�r�rLr�r�r��interpolate_config_section1s�r3cCs&t|j||�|rt|j|||�S|Sr�)r)r�rr�)r�r�r�rLr�r�r�r��process_config_section:s�r4cCs�t||��d||�}|jtkrIt|j�}||d<t||��d||�|d<t||��d||�|d<t||��d||�|d<t||�	�d	||�|d
<n|}|j
|d�}t||j�|rf||vrftd�
||j���|S)
N�servicer��volumero�networkr��secretrdr�r�r�3Cannot extend service '{}' in {}: Service not found)r4r�r�r�r�r�r�r�r�r�r�r(rr�r�)r�rLr!r�r��processed_configr�r�r�r�Fs`�

���
���r�c@sJeZdZddd�Zedd��Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS)rNcCs(||_|j|_|p
g|_||_||_dSr�)r#rq�already_seenr�rL)r�r#r�rLr;r�r�r��__init__}s


zServiceExtendsResolver.__init__cCs|jj|jjfSr�)r#r�r�r�r�r�r��	signature�sz ServiceExtendsResolver.signaturecCs"|j|jvrt|j|jg��dSr�)r=r;rr�r�r�r��detect_cycle�s�z#ServiceExtendsResolver.detect_cyclecCs6|��d|jjvr|j|���}|jj|d�S|jS)N�extendsr)r>r#r��resolve_extends�validate_and_construct_extendsr�)r�rr�r�r�r�s
zServiceExtendsResolver.runcCs�|jjd}t|t�sd|i}|�|�}|d}|tj�|jj	�kr:z|j�
|�}Wn(ty9td�
||���wt�|�}t|j|g�t||j|d�}|�
|�}|||fS)Nr?r5r9)r!)r#r�r�r��get_extended_config_pathr�r�r�r�r�r��KeyErrorrr�r�r�r�r�rL)r�r?�config_pathr!r#�extends_file�
extended_filer�r�r�rA�s,

���
�

z5ServiceExtendsResolver.validate_and_construct_extendscCsbtt�tj�|�|||�|j|j|jg|j	d�}|�
�}t|�}t|||�t
||jj|jj�S)N)r;rL)rr�r�r�r�r�r�r;r=rLrr�validate_extended_service_dict�merge_service_dictsr#r�r�)r��extended_config_pathrr!r$r#�other_service_dictr�r�r�r@�s.
����z&ServiceExtendsResolver.resolve_extendscCs4|jj}t|jj||�d|vrt|j|d�S|S)z�Service we are extending either has a value for 'file' set, which we
        need to obtain a full path too or we are extending from a service
        defined in our own file.
        r)r#r�r-r�rrq)r��extends_optionsr�r�r�r�rB�s�z/ServiceExtendsResolver.get_extended_config_pathr�)r�r�r�r<�propertyr=r>rrAr@rBr�r�r�r�r|s

	rcsTi}|�dg�D]
}|�t||��q|�t|�d���t�fdd�|��D��S)zjUnpack any environment variables from an env_file, if set.
    Interpolate environment values if set.
    rKrLc3� �|]\}}t||��VqdSr���resolve_env_var�r�r�vrr�r�r����z&resolve_environment.<locals>.<genexpr>)r��updater�parse_environmentr�r)rrLr��envrKr�rr��resolve_environment�s
rVcs"t|�}t�fdd�|��D��S)Nc3rMr�rNrPrr�r�r��rRz%resolve_build_args.<locals>.<genexpr>)�parse_build_argumentsr�r)�	buildargsrL�argsr�rr��resolve_build_args�srZcCs�d�||�}d|vrtd|��d|vrtd|��d|vr*t|d�r*td|��d|vr:t|d�r:td	|��d
|vrDtd|��dS)Nz!Cannot extend service '{}' in {}:rUz+%s services with 'links' cannot be extendedrpz2%s services with 'volumes_from' cannot be extendedr[z4%s services with 'net: container' cannot be extendedr{z;%s services with 'network_mode: service' cannot be extended�
depends_onz0%s services with 'depends_on' cannot be extended)r�rrr)rr�r5�error_prefixr�r�r�rG�s0������rGcCs�dd�}|j|j}}t|||�|�rt|�t|�t|�t||�t||�t||�t	||�t
||�t|�t|�|�
d�sRt|�rTtdj|d���dSdS)NcSs*tjdd�}d|vr
dSd|vrdSdS)Nr�pullFz
--no-buildT)r��argv)rYr�r�r��build_imagesz%validate_service.<locals>.build_imagerQz�Service '{name}' contains uppercase characters which are not valid as part of an image name. Either use a lowercase service name or use the `image` field to set a custom name for the service image.�r�)r�r�r3�validate_pathsr*r5r/r1r2r,r0r.r+r��
has_uppercaserr�)r#r"r�r_rr!r�r�r�rs*





���rcs�|j�t|j�}d|vr�fdd�t|d�D�|d<d|vr$t|��d|vr6|�d�dur6t�|�|d<d|vrDtt|d��|d<d|vrPt	|d�|d<t
|�}d	D]}||vrdt||�||<qVttt
t|����}|S)
NrKc�g|]}t�|��qSr�)r)r�r��rqr�r�r�*���z#process_service.<locals>.<listcomp>rsrornrjrT)rFrG�tmpfs)rqr�r��to_list�process_build_sectionr��resolve_volume_pathsr�
parse_sysctlsr
�process_depends_on�process_security_opt�process_blkio_config�
process_ports�process_healthcheck)r#r�fieldr�rdr�r%s.



�
��rcCs�t|dt�rt||d�|d<dSt|dt�rBd|dvr.|dd}t||�|dd<d|dvrDt|dd�|dd<dSdSdS)Nrs�contextrT)r�r��resolve_build_pathr�r
)rrqr�r�r�r�rhHs�rhcCsPd|vr|Sg}|dD]}t|t�r|�|�q|�t�|��q||d<|S)Nr_)r�r$�append�extend�parse)rr_�port_definitionr�r�r�rnSs
rncCs0d|vrt|dt�sdd�|dD�|d<|S)Nr[cSsi|]}|ddi�qS)�	condition�service_startedr�)r��svcr�r�r�r*cs
�z&process_depends_on.<locals>.<dictcomp>)r�r��rr�r�r�rkas

�rkcCs�|�d�s|SdD],}||dvr5|d�|g�D]}|�dd�}t|�|d<|ddur4td�|���qq	dD]0}||dvrh|d�|g�D]}zt|�dd��|d<WqHtygtd�|�d����wq8|S)Nrr)�device_read_bps�device_write_bps�raterz$Invalid format for bytes value: "{}")�device_read_iops�device_write_iopsz5Invalid IOPS value: "{}". Must be a positive integer.)r�rrr��intr�)rrprQr}r�r�r�rmis.
�����rmcCsbd|vr|S|d}d|vr|d=dg|d<dD]}||vs%t||t�r&qt||�||<q|S)NrP�disable�NONE�test)�interval�timeout�start_period)r�r�r)r�hcrpr�r�r�ro�s
roc	Cs�d|vrdg}|�d�}|�d�}|dD]}t|t�r&|�t�|||��q|�t�|||��qg}dd�|D�}|D]}ttt	d�|���
|j�dkrT|�|���q<|r`t
dd	�|���||d<|S)
Nro�COMPOSE_CONVERT_WINDOWS_PATHS�COMPOSE_FORCE_WINDOWS_HOSTcSs"g|]
}t|t�r
|��n|�qSr�)r�r�as_volume_spec�r�rQr�r�r�r��s"z,finalize_service_volumes.<locals>.<listcomp>�internalrzDuplicate mount points: [%s]r�)�get_booleanr�r�rsrrur&�list�mapr�countr��reprrr�)	rrL�finalized_volumes�	normalize�win_hostrQ�duplicate_mounts�mounts�mountr�r�r��finalize_service_volumes�s(


��r�cs.t|j�}d|vs
d|vrt|||�|d<|�dd�d|vr-��fdd�|dD�|d<t||�}d|vrQ|�d�}t|�}|rM|�vrMd�|�|d<n||d<d	|vr]t|d	�|d	<d
|vrit|d
�|d
<d|vrxdd�|dD�|d<d
|vr�dd�|d
D�|d
<t	||j
|�|j|d<t|�S)NrLrKrpcsg|]	}t�|����qSr�)r%ru)r��vf�r"r�r�r�r��s��z$finalize_service.<locals>.<listcomp>r[z
service:{}r{r�rbrdcS�g|]}tj�|��qSr�)r�
ServiceSecretrur�r�r�r�r����r�cSr�r�)rr�ru)r��cr�r�r�r��r�r�)
r�r�rV�popr�rr��parse_networksr!�normalize_buildrqr��normalize_v1_service_format)r#r"r�rLr�rr{rtr�r�r�r �s<

�


�
�
r cCs�d|vsd|vr.d|vri|d<d|vr|d|dd<|d=d|vr.|d|dd<|d=d|vrF|�di�|d<|d�d|�d�i�|S)Nrxryrzr�optionsrvrs)r�rSr�rzr�r�r�r��s
�r�cCs<t|||�}d|vr|d|d<|Sd|vr|d|d<|S)z�When merging services from multiple files we need to merge the `extends`
    field. This is not handled by `merge_service_dicts()` which is used to
    perform the `extends`.
    r?)rH)r(r)r��new_servicer�r�r�r'�s�r'c@sDeZdZdZdd�Zdd�Zddd�Zdd	d
�Zdd�Zd
d�Z	dS)�	MergeDictz>A dict-like object responsible for merging two dicts into one.cCs||_||_dSr�r-)r�r(r)r�r�r�r<s
zMergeDict.__init__cCs||jvp	||jvSr�r-�r�rpr�r�r��needs_mergeszMergeDict.needs_mergeNcCs4|�|�sdS||j�||�|j�||��||<dSr�)r�r(r�r))r�rp�
merge_func�defaultr�r�r��merge_fields
�zMergeDict.merge_fieldcCsP|�|�sdS|durdd�}||j�|��||<||�||j�|���dS)NcS�|piSr�r���mr�r�r��
parse_funcsz+MergeDict.merge_mapping.<locals>.parse_func)r�r(r�rSr))r�rpr�r�r�r��
merge_mappings
zMergeDict.merge_mappingcsb�fdd�}|�|�s
dS||j�|g��}|�||j�|g���dd�t|���D�||<dS)Ncst�fdd�|D�d�S)Nc3��|]}�|�VqdSr�r��r��item�r�r�r�r�r�zHMergeDict.merge_sequence.<locals>.parse_sequence_func.<locals>.<genexpr>r���
to_mapping)�seqr�r�r��parse_sequence_funcsz5MergeDict.merge_sequence.<locals>.parse_sequence_funccSr/r�)r�r�r�r�r�r�#�z,MergeDict.merge_sequence.<locals>.<listcomp>)r�r(r�rSr)r��values)r�rpr�r��mergedr�r�r��merge_sequences
zMergeDict.merge_sequencecCs,|�|�r|j�||j�|��||<dSdSr�)r�r)r�r(r�r�r�r��merge_scalar%s
�zMergeDict.merge_scalarr�)
r�r�r�r�r<r�r�r�r�r�r�r�r�r�r��s

r�cCs�t||�}|�dt�|�dt�|�dt�|�dt�|�dt�|�dt�|�dtj	�|�dt
jj	�|�d	t
jj	�|�d
t
j
j	�|�dt�|jdtid
�dD]}|�|t�qXdD]
}|j|tgd
�qcdD]}|�|t�qp|jdtid
�t|||�|jdtid
�|jdtid
�|jdtid
�tt�t|�D]}|�|�q�|tkr�t|||�t |�S|�d�r�t|||�|d<t |�S)NrLrT�ulimitsrjr[�storage_optrUrdr�rerMr��r�)rorE)r6r7�expose�external_linksrprDr})rFrGrKrfrzrrrP�deployrs)!r�r�rTr
�parse_flat_dictrj�parse_depends_onr�r#rurr�r�r"r r��merge_networks�merge_path_mappings�merge_unique_items_lists�merge_list_or_string�
merge_logging�merge_ports�merge_blkio_config�merge_healthchecks�merge_deployr+�ALLOWED_KEYSr�r��legacy_v1_merge_image_or_buildr��merge_buildr�)r(r)r��mdrpr�r�r�rH*s@

�rHcCs.dd�|D�}dd�|D�}ttt||���S)Ncs��|]}t|�VqdSr��r��r�rr�r�r�r�Xr�z+merge_unique_items_lists.<locals>.<genexpr>csr�r�r��r��br�r�r�r�Yr�)r�r+rr-r�r�r�r�Wsr�cCs(|�d�dur	|S|��}|�|�|S)N�disabledT)r��copyrS�r(r)�resultr�r�r�r�]s

r�cCsjdd�}d}|�|�s
dS||j�|g��}|�||j�|g���dd�t|��td�d�D�||<dS)NcSsdd�|D�}t|d�S)NcSs g|]}t�|�D]}|�q	qSr�)r$ru)r�r�r�r�r�r�r�gs z<merge_ports.<locals>.parse_sequence_func.<locals>.<listcomp>r�r�)r��accr�r�r�r�fs
z(merge_ports.<locals>.parse_sequence_funcr_cSsg|]}|�qSr�r�r�r�r�r�r�qszmerge_ports.<locals>.<listcomp>�targetr�)r�r(r�rSr)r�r�r)r�r(r)r�rpr�r�r�r�r�es
&r�cCs�dd�}t||�||��}|�d�|�d�|�d�|�d�|�d�|�d�|�d	t�|jd
tgd�|�dt�|�d
t�t|�S)NcSs"|�di�}t|t�rd|iS|S)Nrsrq)r�r�r�)r5�build_configr�r�r��to_dictus
zmerge_build.<locals>.to_dictrqrvr7r�rfrSrY�
cache_fromr�rTrM)	r�r�r�rWr�r�r
r r�)�outputr(r)r�r�r�r�r�r�ts





r�cCst|pi|pi�}|�d�|�d�|�d�|�dt�|�d�|�d�|�d�|�d�rVt|j�d�p:i|j�d�pAi�}|�d	�|jd
t	id�t
|�|d<|�d�r�t|j�d�pci|j�d�pji�}|�d
�|jdtgd�|jdtgd�t
|�|d<t
|�S)N�mode�
endpoint_mode�replicasrT�
update_config�rollback_config�restart_policy�	resources�limits�reservationsr��	placement�max_replicas_per_node�constraints�preferences)
r�r�r�r
r�r(r�r)r��merge_reservationsr�r��merge_unique_objects_lists)r(r)r��resources_md�placement_mdr�r�r�r��s(






"

"
r�cCs�i}t|�t|�B}t|t�rdd�|D�n|}t|t�r$dd�|D�n|}|D]4}t|�|�p1i|�|�p7i�}|�dtg�|�dtg�|�d�|�d�|�d�t|�||<q(|S)	NcS�i|]}|i�qSr�r�rr�r�r�r*��z"merge_networks.<locals>.<dictcomp>cSr�r�r�rr�r�r�r*�r��aliases�link_local_ips�priority�ipv4_address�ipv6_address)	r+r�r�r�r�r�r�r�r�)r(r)�merged_networks�all_network_names�network_namer�r�r�r�r��s


r�cCsFt||�}|�d�|�d�|�dtjj�|jdtgd�t|�S)NrA�memory�generic_resourcesrEr�)	r�r�r�r�GenericResourcerur�r�r��r(r)r�r�r�r�r��s


r�cCs:dd�||D�}dd�tdd�|��D�td�d�D�S)	NcSsi|]}t|�|�qSr�r
�r��ir�r�r�r*�r�z.merge_unique_objects_lists.<locals>.<dictcomp>cSsg|]}|d�qS)rr�rr�r�r�r��r�z.merge_unique_objects_lists.<locals>.<listcomp>css�|]	\}}||fVqdSr�r�rPr�r�r�r��rz-merge_unique_objects_lists.<locals>.<genexpr>rr�)r�rrr�r�r�r�r��s(r�cCs>t||�}|�d�dd�}dD]
}|j||gd�qt|�S)N�weightcsBtd���fdd�|D�}|��fdd�|D��t|���d�S)Nr�csi|]}�|�|�qSr�r�r���get_pathr�r�r*�r�zBmerge_blkio_config.<locals>.merge_blkio_limits.<locals>.<dictcomp>c3s�|]	}�|�|fVqdSr�r�r�rr�r�r��rzAmerge_blkio_config.<locals>.merge_blkio_limits.<locals>.<genexpr>r�)rrSr�r�)r(r)�indexr�rr��merge_blkio_limits�sz.merge_blkio_config.<locals>.merge_blkio_limits)r{r~r|r�
weight_devicer�)r�r�r�r�)r(r)r�rrpr�r�r�r��s

r�cCspt||�}|�d�|�d�|�d�ks|�d�dur'|�ddd��t|�S|�d�r4|�di�|d<t|�S)Nrr�cSr�r�r�r�r�r�r��<lambda>��zmerge_logging.<locals>.<lambda>)r�r�r�r�r�r�r�r�r�r��s

"
�r�cCs||�dd�|�dd�d|vr|d|d<dSd|vr$|d|d<dSd|vr0|d|d<dSd|vr<|d|d<dSdS)NrQrs)r�)r�r(r)r�r�r�r��s�r�cC�t|�}|�t|��|Sr�)rTrS)r(r)rUr�r�r��merge_environment��rcCr
r�)r
rS)r(r)rTr�r�r��merge_labels�rr
cCsd|vr
|�dd�S|dfS)N�=r�)�split)�kvpairr�r�r��split_kv�srcsJ|siSt|t�rt�fdd�|D��St|t�rt|�Std||f��)Nc3r�r�r�)r��e��
split_funcr�r�r�r�z%parse_dict_or_list.<locals>.<genexpr>z"%s "%s" must be a list or mapping,)r�r�r�r)r�	type_name�	argumentsr�rr��parse_dict_or_list�s

��rzbuild argumentsrLrTcCs|dfSr�r��rr�r�r�rr	rr�rjcCs|ddifS)Nrwrxr�rr�r�r�rsr[cCs"|siSt|t�r
t|�Std��)NzInvalid type: expected mapping)r�r�r��dr�r�r�r�s

r�cCs0|dur||fS|r||vr|||fS|dfSr�r�)r��valrLr�r�r�rO!s
rOcs�fdd�|dD�S)Ncrcr�)�resolve_volume_path)r�r6rdr�r�r�+rez(resolve_volume_paths.<locals>.<listcomp>ror�)rqrr�rdr�ri*s
�ricCs�t|t�r|�dd��d�r|ddkrt||d�|d<|Sd}t|�\}}|durS|\}}|dur5|S|�d�r?t||�}tj�|�}d�	|||rPd|�Sd�S|S)	N�sourcer)�.�~�typerrz{}:{}{}�:)
r�r�r�r�r�split_path_mappingr�r�rr�)rqr6�mount_params�container_path�	host_pathr�r�r�r�r1s


rcCshd|vr2i}t|dt�r|�d�|d<n|�|d�d|vr,tt|�d�|��|d<||d<dSdS)NrsrqrY)r�r�r�rSrrZr�)rrqrLrsr�r�r�r�Fs��r�cCst|�r|St||�Sr�)�is_urlr)rq�
build_pathr�r�r�rrWs
rrcCs
|�t�Sr�)r��DOCKER_VALID_URL_PREFIXES)r(r�r�r�r']s
r'cCs~d|vr9|�di�}t|t�r|}nt|t�r d|vr |d}ndSt|�s;tj�|�r3t�|tj	�s=t
d|��dSdSdS)NrsrqzNbuild path %s either does not exist, is not accessible, or is not a valid URL.)r�r�r�r�r'r�r�r��access�R_OKr)rrsr(r�r�r�raas(

�
�����racCst|�}|�t|��t|�Sr�)�dict_from_path_mappingsrS�path_mappings_from_dict)r(r)rr�r�r�r�vsr�cCs|rtdd�|D��SiS)Ncsr�r�)r#r�r�r�r�r�~r�z*dict_from_path_mappings.<locals>.<genexpr>)r�)�
path_mappingsr�r�r�r,|sr,cCsdd�t|���D�S)NcSsg|]}t|��qSr�)�join_path_mappingr�r�r�r�r��r�z+path_mappings_from_dict.<locals>.<listcomp>)r�rrr�r�r�r-�sr-cCs�t|t�r|�d�|fSt|�\}}d|vr<|�dd�\}}t|�\}}d}d|vr2|�dd�\}}|||||ffS|dfS)z�
    Ascertain if the volume_path contains a host path as well as a container
    path. Using splitdrive so windows absolute paths won't cause issues with
    splitting on ':'.
    r�r"rN)r�r�r�rr�rsplit)�volume_path�drive�
volume_config�host�	container�container_driver%r�r�r�r�r#�s
r#cCs:|�dg�}g}|D]
}|�t�|��q
|r||d<|S)Nre)r�rsr"ru)r�
security_optsr��valuer�r�r�rl�srlcCsL|\}}t|t�r|S|dur|S|\}}d�||f�}|r$|d|7}|S)Nr")r�r�r�)�pairr5r4r�r�r�r�r�r/�s
r/cCstj�tj�|tj�|���Sr�)r�r�r�r�r)rqr�r�r�r�r�srcCst|�t|�Sr�)rgr-r�r�r�r��sr�cCs |durgSt|t�r|gS|Sr�)r�r�)r8r�r�r�rg�s

rgcs�fdd�|D�S)Ncsi|]}t|��|�qSr�)rr���	key_fieldr�r�r*�szto_mapping.<locals>.<dictcomp>r�)�sequencer;r�r:r�r���r�cCstdd�|D��S)Ncss�|]}|tjvVqdSr�)�string�ascii_uppercase)r��charr�r�r�r��s�z has_uppercase.<locals>.<genexpr>)�anyr`r�r�r�rb�r=rbc
Cs�z$t||rdnd|d��}t�|�Wd�WS1swYWdSttjtfyY}z%|durAt|ddd�WYd}~St|dd�d	|jj	}t
d
�||���d}~ww)N�rb�r)�encodingz	utf-8-sigF)rD�binaryr�rrz{}: {})�openr�r��OSError�	YAMLError�UnicodeDecodeErrorr�rr�r�rr�)r�rDrE�fhr�
error_namer�r�r�r��s(���r�r�)T)NT)�r0rzr�r�r>r��collectionsr�	itertoolsr�operatorrrr�r�ImportErrorrr�constr
r�rr��utilsrrrrrr�rrLrrr�errorsrrrrr�
interpolationr�
sort_servicesrrrrr r!r"r#r$r%r&�
validationr'r(r)r*r+r,r-r.r/r0r1r2r3r4r5�DOCKER_CONFIG_KEYSr�r)r�r��	getLoggerr�r�r�r�r�r�r�r�r�r�r�r�rr�rr	r�r3r4r�rrVrZrGrrrhrnrkrmror�r r�r'r�r�rHr�r�r�r�r�r�r�r�r�r�r�rr
rr�partialrWrTr
r�rjr�r�rOrirr�rrr'rar�r,r-r#rlr/rr�rgr�rbr�r�r�r�r��<module>s"�?
V
	

*!
1	
6
Z$#
�.
--	


�