U
    ]i                     @   s   d dl mZ d dl mZ 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 eeZG dd deZG dd deZG dd deZdd ZdS )    )absolute_import)unicode_literalsN)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   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   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   s6   |    z| j| jd W n tk
r0   Y dS X dS )Nr   FT)_set_legacy_flagr%   r   r   r   r   r   r   exists3   s    zVolume.existsc                 C   s"   | j r| jS d| jd| jS )N{0}_{1}z-_)r   r   formatr   lstripr   r   r   r   r   ;   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$   A   s     zVolume.legacy_full_namec                 C   s   |    | jr| jS | jS r   )r'   r   r$   r   r   r   r   r   r"   I   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   P   s       zVolume._labelsc                 C   sH   | j d k	rd S z| jdd}|d k	| _ W n tk
rB   d| _ Y nX d S )NTr&   F)r   r%   r   )r   datar   r   r   r'   \   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   r7   r   r   r   r   h   s    zProjectVolumes.__init__c                    s*   |j pi } fdd| D }| |S )Nc                    sZ   i | ]R\}}|t  |d ||d|d|d dk	|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_namer1   r   r   r   r   
<dictcomp>n   s    
z.ProjectVolumes.from_config.<locals>.<dictcomp>)r7   items)clsr   Zconfig_datar   Zconfig_volumesr7   r   r<   r   from_configk   s
    
zProjectVolumes.from_configc              	   C   sD   | j  D ]4}z|  W q
 tk
r<   td|j Y q
X q
d S )NzVolume %s not found.)r7   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k
r   td|j|jf Y nX d S )	Nz?Volume {0} 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 "{0}" with {1} driverdefaultr&   z)Volume %s specifies nonexistent driver %s)r7   rA   r(   r   r    debugr*   r   r   r   r!   r   r   check_remote_volume_configr%   r   r   )r   rC   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	   r7   r   _replacer"   source)r   Zvolume_specrC   r   r   r   namespace_spec   s    
zProjectVolumes.namespace_specN)	r2   r3   r4   r   classmethodr@   r#   rG   rK   r   r   r   r   r6   f   s   
"r6   c                       s   e Zd Z fddZ  ZS )VolumeConfigChangedErrorc              	      s(   t 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   )superrM   r   r*   r   r"   )r   localrN   rO   rP   	__class__r   r   r      s    
  z!VolumeConfigChangedError.__init__)r2   r3   r4   r   __classcell__r   r   rS   r   rM      s   rM   c                 C   s  |j r,| d|j kr,t|d|j | d|jp4i }| dpBi }tt| t| D ]D}|drpq`||||kr`t|d|||||q`|j	pi }| dpi }t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   r8   rM   r   setunionkeys
startswithr*   r   r    rB   r   )ZremoterR   Z
local_optsZremote_optskZlocal_labelsZremote_labelsr   r   r   rF      s4    
 
   
 
 rF   )Z
__future__r   r   Zloggingr-   Zdocker.errorsr   Zdocker.utilsr   r,   r   Zconfigr   Zconfig.typesr	   Zconstr
   r   r   Z	getLoggerr2   r    objectr   r6   rM   rF   r   r   r   r   <module>   s    
QL