a
   ϵ{xp                   @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZ ddlmZ e eZG dd dZG dd dZG dd deZdd ZdS )    N)chain)NotFound)
version_lt   )__version__)ConfigurationError)
VolumeSpec)LABEL_PROJECT)LABEL_VERSION)LABEL_VOLUMEc                   @   sp   e Zd ZdddZdd Zdd Zdd	d
Zdd Zedd Z	edd Z
edd Zedd Zdd ZdS )VolumeNFc	           	      C   s:   || _ || _|| _|| _|| _|| _|| _|| _d | _d S N)	clientprojectnamedriverdriver_optsexternallabelscustom_namelegacy)	selfr   r   r   r   r   r   r   r    r   2/usr/lib/python3.9/site-packages/compose/volume.py__init__   s    zVolume.__init__c                 C   s   | j j| j| j| j| jdS )N)r   )r   Zcreate_volume	full_namer   r   _labelsr   r   r   r   create    s    zVolume.createc                 C   s4   | j rtd| j d S td| j | j| jS )NzVolume %s is external, skippingzRemoving volume %s)r   loginfo	true_namer   Zremove_volumer   r   r   r   remove%   s
    zVolume.removec                 C   s    |r| j | jS | j | jS r   )r   Zinspect_volumelegacy_full_namer   )r   r   r   r   r   inspect,   s    zVolume.inspectc                 C   s4   |    z| j| jd W n ty.   Y dS 0 dS )Nr   FT)_set_legacy_flagr$   r   r   r   r   r   r   exists1   s    zVolume.existsc                 C   s"   | j r| jS d| jd| jS )N{}_{}z-_)r   r   formatr   lstripr   r   r   r   r   9   s    zVolume.full_namec                 C   s&   | j r| jS dtdd| j| jS )Nr(   z[_-] )r   r   r)   resubr   r   r   r   r   r#   ?   s
    zVolume.legacy_full_namec                 C   s   |    | jr| jS | jS r   )r&   r   r#   r   r   r   r   r   r!   G   s    zVolume.true_namec                 C   sD   t | jjdrd S | jr"| j ni }|t| jt| j	t
ti |S )Nz1.23)r   r   Z_versionr   copyupdater	   r   r   r   r
   r   )r   r   r   r   r   r   N   s    zVolume._labelsc                 C   sF   | j d urd S z| jdd}|d u| _ W n ty@   d| _ Y n0 d S )NTr%   F)r   r$   r   )r   datar   r   r   r&   Z   s    
zVolume._set_legacy_flag)NNFNF)N)__name__
__module____qualname__r   r   r"   r$   r'   propertyr   r#   r!   r   r&   r   r   r   r   r      s      





r   c                   @   s8   e Zd Zdd Zedd Zdd Zdd Zd	d
 ZdS )ProjectVolumesc                 C   s
   || _ d S r   )volumes)r   r6   r   r   r   r   f   s    zProjectVolumes.__init__c                    s*   |j pi } fdd| D }| |S )Nc                    sZ   i | ]R\}}|t  |d ||d|d|d du|dt|dddqS )r   r   r   Nr   r   F)r   r   r   r   r   r   r   r   )r   getbool).0vol_namer0   r   r   r   r   
<dictcomp>l   s   
z.ProjectVolumes.from_config.<locals>.<dictcomp>)r6   items)clsr   Zconfig_datar   Zconfig_volumesr6   r   r;   r   from_configi   s
    
zProjectVolumes.from_configc              	   C   sB   | j  D ]2}z|  W q
 ty:   td|j Y q
0 q
d S )NzVolume %s not found.)r6   valuesr"   r   r   warningr!   )r   volumer   r   r   r"   {   s
    zProjectVolumes.removec                 C   s   z| j  D ]z}| }|jrJtd|j |stdj|j	ddq|srt
d|j	|jpbd |  qt|j|jd| qW n& ty   td|j|jY n0 d S )	Nz>Volume {} declared as external. No new volume will be created.zVolume {name} declared as external, but could not be found. Please create the volume manually using `{command}{name}` and try again.zdocker volume create --name=)r   Zcommandz#Creating volume "{}" with {} driverdefaultr%   z)Volume {} specifies nonexistent driver {})r6   r@   r'   r   r   debugr)   r   r   r   r    r   r   check_remote_volume_configr$   r   r   )r   rB   Zvolume_existsr   r   r   
initialize   s:    
zProjectVolumes.initializec                 C   sF   |j s
|S t|tr.| j|j }|j|jdS | j|j j|_|S d S )N)r   )Zis_named_volume
isinstancer   r6   r   _replacer!   source)r   Zvolume_specrB   r   r   r   namespace_spec   s    
zProjectVolumes.namespace_specN)	r1   r2   r3   r   classmethodr?   r"   rF   rJ   r   r   r   r   r5   d   s   
"r5   c                       s   e Zd Z fddZ  ZS )VolumeConfigChangedErrorc              	      s$   t  dj|j||||jd d S )Na  Configuration for volume {vol_name} specifies {property_name} {local_value}, but a volume with the same name uses a different {property_name} ({remote_value}). If you wish to use the new configuration, please remove the existing volume "{full_name}" first:
$ docker volume rm {full_name})r:   property_namelocal_valueremote_valuer   )superr   r)   r   r!   )r   localrM   rN   rO   	__class__r   r   r      s    z!VolumeConfigChangedError.__init__)r1   r2   r3   r   __classcell__r   r   rR   r   rL      s   rL   c                 C   s   |j r,| d|j kr,t|d|j | d|jp4i }| dpBi }tt||D ]D}|drbqR||||krRt|d|||||qR|jpi }| dpi }tt||D ]8}|drq||||krt	
d|j| qd S )NZDriverr   ZOptionszcom.docker.z"{}" driver_optZLabelsz?Volume {}: label "{}" has changed. It may need to be recreated.)r   r7   rL   r   setr   
startswithr)   r   r   rA   r   )ZremoterQ   Z
local_optsZremote_optskZlocal_labelsZremote_labelsr   r   r   rE      s,    



rE   )Zloggingr,   	itertoolsr   Zdocker.errorsr   Zdocker.utilsr   r+   r   Zconfigr   Zconfig.typesr   constr	   r
   r   Z	getLoggerr1   r   r   r5   rL   rE   r   r   r   r   <module>   s   
QL