U
    ]?.                     @   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 d
dlmZ d
dlmZ d
dlmZ eeZdddgZG dd deZdd ZG dd deZdd Zdd Z dd Z!G dd  d eZ"d!d" Z#d#d$ Z$d%d& Z%dS )'    )absolute_import)unicode_literalsN)OrderedDict)NotFound)
IPAMConfig)IPAMPool)version_gte)
version_lt   )__version__)ConfigurationError)LABEL_NETWORK)LABEL_PROJECT)LABEL_VERSIONz.com.docker.network.driver.overlay.vxlanid_listz$com.docker.network.windowsshim.hnsidz*com.docker.network.windowsshim.networknamec                   @   sh   e Zd ZdddZdd Zdd Zdd	d
Zedd Zedd Z	edd Z
edd Zdd ZdS )NetworkNFc                 C   sP   || _ || _|| _|| _|| _t|| _|| _|| _|	| _	|
| _
|| _d | _d S N)clientprojectnamedriverdriver_optscreate_ipam_config_from_dictipamexternalinternalenable_ipv6labelscustom_namelegacy)selfr   r   r   r   r   r   r   r   r   r   r    r    1/usr/lib/python3/dist-packages/compose/network.py__init__   s    
zNetwork.__init__c                 C   s  | j r`| jdkrd S z|   td| j W n( tk
rZ   tdj| j	ddY nX d S | 
  z| j| jd}t||  W nx tk
r   d}| jrd| j}td	| j	| | jj| j	| j| j| j| j| j| jt| jjd
pd dd	 Y nX d S )NZoverlayzANetwork {0} declared as external. No new network will be created.zNetwork {name} declared as external, but could not be found. Please create the network manually using `{command} {name}` and try again.zdocker network create)r   Zcommandr   zthe default driverzdriver "{}"zCreating network "{}" with {}z1.24T)	r   r   optionsr   r   r   r   Z
attachableZcheck_duplicate)r   r   inspectlogdebugformatr   r   r   	full_name_set_legacy_flagr   check_remote_network_configinfor   Zcreate_networkr   r   r   r   _labelsr   _version)r   dataZdriver_namer    r    r!   ensure/   sP    

zNetwork.ensurec                 C   s<   | j rtd| j d S td| j | j| j d S )Nz Network %s is external, skippingzRemoving network {})r   r&   r,   	true_namer(   r   Zremove_networkr   r    r    r!   remove`   s
    zNetwork.removec                 C   s    |r| j | jS | j | jS r   )r   Zinspect_networklegacy_full_namer)   )r   r   r    r    r!   r%   h   s    zNetwork.inspectc                 C   s&   | j r| jS dtdd| j| jS )N{0}_{1}z[_-] )r   r   r(   resubr   r2   r    r    r!   r4   m   s     zNetwork.legacy_full_namec                 C   s   | j r| jS d| j| jS )Nr5   )r   r   r(   r   r2   r    r    r!   r)   u   s    zNetwork.full_namec                 C   s   |    | jr| jS | jS r   )r*   r   r4   r)   r2   r    r    r!   r1   {   s    zNetwork.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   r.   r   copyupdater   r   r   r   r   r   )r   r   r    r    r!   r-      s       zNetwork._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   r/   r    r    r!   r*      s    
zNetwork._set_legacy_flag)NNNFFFNF)F)__name__
__module____qualname__r"   r0   r3   r%   propertyr4   r)   r1   r-   r*   r    r    r    r!   r      s(              
1




r   c                 C   s8   | sd S t | dpddd | dg D | ddS )Nr   defaultc              	   S   s4   g | ],}t |d |d|d|ddqS )subnetZip_rangegatewayaux_addresses)r@   ZiprangerA   rB   )r   get).0configr    r    r!   
<listcomp>   s   z0create_ipam_config_from_dict.<locals>.<listcomp>rE   r$   )r   Zpool_configsr$   )r   rC   )	ipam_dictr    r    r!   r      s    
	r   c                       s   e Zd Z fddZ  ZS )NetworkConfigChangedErrorc                    s   t t| d|| d S )Nz3Network "{}" needs to be recreated - {} has changed)superrH   r"   r(   )r   Znet_nameZproperty_name	__class__r    r!   r"      s    
 z"NetworkConfigChangedError.__init__)r;   r<   r=   r"   __classcell__r    r    rJ   r!   rH      s   rH   c                 C   s  |  d}t|j}|j drB|j d| dkrBt|jdt|d dkrHt|d t|d krxt|jdt|d dd	}t|d dd	}|rH| }| }| d| dkrt|jd
| dd k	r| d| dkrt|jd| d| dkrt|jdt| dt| dkrt|jdq| dpVi }|j dphi }	t	t|
 t|	
 D ].}
| |
|	 |
krt|jd|
qd S )NZIPAMr   DriverzIPAM driverZConfigr   zIPAM configsZSubnetkeyzIPAM config subnetZGatewayzIPAM config gatewayZIPRangezIPAM config ip_rangeZAuxiliaryAddresseszIPAM config aux_addressesOptionszIPAM option "{}")rC   r   r   rH   r1   lensortedpopsetunionkeysr(   )remotelocalZremote_ipamrG   Zremote_configsZlocal_configsZlcZrcremote_opts
local_optskr    r    r!   check_remote_ipam_config   s2    

"" r\   c                 C   sl  |j r"| d|j kr"t|jd|jp*i }| dp8i }tt| t| D ]4}|tkrdqV||||krVt|jd	|qV|j
d k	rt| | |jd k	r|j| ddkrt|jd|jd k	r|j| ddkrt|jd	|jpi }| d
pi }tt| t| D ]@}|dr:q&||||kr&td	|j| q&d S )NrM   r   rP   zoption "{}"ZInternalFr   Z
EnableIPv6r   ZLabelszcom.docker.z@Network {}: label "{}" has changed. It may need to be recreated.)r   rC   rH   r1   r   rT   rU   rV   OPTS_EXCEPTIONSr(   r   r\   r   r   r   
startswithr&   warning)rW   rX   rZ   rY   r[   Zlocal_labelsZremote_labelsr    r    r!   r+      s6    
 


  r+   c                    s>   |j pi } fdd| D }d|kr:t d|d< |S )Nc                    sr   i | ]j\}}|t  |d ||d|d|dt|dd|d|d|d|d d	k	d
qS )r   r   r   r   r   Fr   r   r   N)r   r   r   r   r   r   r   r   r   r   r   )r   rC   bool)rD   Znetwork_namer/   r   r   r    r!   
<dictcomp>   s     
z"build_networks.<locals>.<dictcomp>r?   )networksitemsr   )r   Zconfig_datar   Znetwork_configrc   r    ra   r!   build_networks   s    
re   c                   @   s0   e Zd Zdd Zedd Zdd Zdd Zd	S )
ProjectNetworksc                 C   s   |pi | _ || _d S r   )rc   use_networking)r   rc   rg   r    r    r!   r"   
  s    
zProjectNetworks.__init__c                    sL    fdd|D }t  t | dh }|rBtdd| | ||S )Nc                    s&   i | ]}t |D ]}| |qqS r    )get_network_names_for_servicerC   )rD   servicenetworkrc   r    r!   rb     s
   
  z1ProjectNetworks.from_services.<locals>.<dictcomp>r?   z>Some networks were defined but are not used by any service: {}z, )rT   r&   r_   r(   join)clsservicesrc   rg   Zservice_networksZunusedr    rk   r!   from_services  s    
zProjectNetworks.from_servicesc              	   C   sN   | j s
d S | j D ]4}z|  W q tk
rF   td|j Y qX qd S )NzNetwork %s not found.)rg   rc   valuesr3   r   r&   r_   r1   r   rj   r    r    r!   r3     s    zProjectNetworks.removec                 C   s&   | j s
d S | j D ]}|  qd S r   )rg   rc   rp   r0   rq   r    r    r!   
initialize%  s    zProjectNetworks.initializeN)r;   r<   r=   r"   classmethodro   r3   rr   r    r    r    r!   rf     s
   
	rf   c                 C   s2   d| kri S |  ddd i}tdd | D S )NZnetwork_moderc   r?   c                 s   s   | ]\}}||pi fV  qd S r   r    )rD   ZnetrE   r    r    r!   	<genexpr>1  s   z/get_network_defs_for_service.<locals>.<genexpr>)rC   dictrd   )service_dictrc   r    r    r!   get_network_defs_for_service-  s    rw   c                 C   s   t |  S r   )rw   rV   )rv   r    r    r!   rh   7  s    rh   c                 C   s   i }t |  D ]6\}}||}|r2|||j< qtd| d |qtdd | D rxtt	| dd ddS tt	| d	d d
S d S )Nz+Service "{}" uses an undefined network "{}"r   c                 S   s   g | ]}| d qS )priorityrC   )rD   vr    r    r!   rF   F  s     z get_networks.<locals>.<listcomp>c                 S   s   | d  dpdS )Nr
   rx   r   ry   tr    r    r!   <lambda>I      zget_networks.<locals>.<lambda>T)rO   reversec                 S   s   | d S )Nr   r    r{   r    r    r!   r}   N  r~   rN   )
rw   rd   rC   r1   r   r(   anyrp   r   rR   )rv   Znetwork_definitionsrc   r   Znetdefrj   r    r    r!   get_networks;  s$    
  r   )&Z
__future__r   r   Zloggingr7   collectionsr   Zdocker.errorsr   Zdocker.typesr   r   Zdocker.utilsr   r	   r6   r   rE   r   Zconstr   r   r   Z	getLoggerr;   r&   r]   objectr   r   rH   r\   r+   re   rf   rw   rh   r   r    r    r    r!   <module>   s:   
z	%
