o
    S`                     @   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                   @   st   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   0/usr/lib/python3/dist-packages/compose/volume.py__init__   s   
zVolume.__init__c                 C   s   | j j| j| j| j| jdS )N)r   )r   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   remove_volumer   r   r   r   remove%   s
   zVolume.removec                 C   s    |r	| j | jS | j | jS r   )r   inspect_volumelegacy_full_namer   )r   r   r   r   r   inspect,   s   zVolume.inspectc                 C   s2   |    z
| j| jd W dS  ty   Y dS w )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   _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 d S  ty"   d| _ Y d S w )NTr(   F)r   r'   r   )r   datar   r   r   r)   Z   s   
zVolume._set_legacy_flag)NNFNFr   )__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   r:   r   r   r   r   f   s   
zProjectVolumes.__init__c                    s*   |j pi } fdd| D }| |S )Nc                    sZ   i | ])\}}|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_namer4   r   r   r   r   
<dictcomp>l   s    
z.ProjectVolumes.from_config.<locals>.<dictcomp>)r:   items)clsr   config_datar   config_volumesr:   r   r?   r   from_configi   s
   
zProjectVolumes.from_configc              	   C   s@   | j  D ]}z|  W q ty   td|j Y qw d S )NzVolume %s not found.)r:   valuesr$   r   r    warningr"   )r   volumer   r   r   r$   {   s   zProjectVolumes.removec                 C   s   zF| j  D ]=}| }|jr%td|j |s$tdj|j	ddq|s9t
d|j	|jp1d |  qt|j|jd| qW d S  tyW   td|j|jw )	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   commandz#Creating volume "{}" with {} driverdefaultr(   z)Volume {} specifies nonexistent driver {})r:   rF   r*   r   r    debugr,   r   r   r   r!   r   r   check_remote_volume_configr'   r   r   )r   rH   volume_existsr   r   r   
initialize   s>   
zProjectVolumes.initializec                 C   sB   |j s|S t|tr| j|j }|j|jdS | j|j j|_|S )N)r   )is_named_volume
isinstancer   r:   r   _replacer"   source)r   volume_specrH   r   r   r   namespace_spec   s   
zProjectVolumes.namespace_specN)	r5   r6   r7   r   classmethodrE   r$   rN   rT   r   r   r   r   r9   d   s    
"r9   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   localrW   rX   rY   	__class__r   r   r      s   z!VolumeConfigChangedError.__init__)r5   r6   r7   r   __classcell__r   r   r\   r   rV      s    rV   c                 C   s   |j r| d|j krt|d|j | d|jpi }| dp!i }tt||D ]"}|dr1q)||||krKt|d|||||q)|jpPi }| dpWi }tt||D ]}|drgq_||||kr{t	
d|j| q_d S )NDriverr   Optionszcom.docker.z"{}" driver_optLabelsz?Volume {}: label "{}" has changed. It may need to be recreated.)r   r;   rV   r   setr   
startswithr,   r   r    rG   r   )remoter[   
local_optsremote_optsklocal_labelsremote_labelsr   r   r   rL      s0   




rL   )loggingr/   	itertoolsr   docker.errorsr   docker.utilsr   r.   r   configr   config.typesr   constr	   r
   r   	getLoggerr5   r    r   r9   rV   rL   r   r   r   r   <module>   s     
QL