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 d	dlmZ d	dlmZ d	dlmZ e  e¡Zg d¢ZG dd„ dƒZdd„ ZG dd„ deƒZdd„ Zdd„ Zdd„ ZG dd„ dƒZ dd„ Z!d d!„ Z"d"d#„ Z#dS )$é    N)ÚOrderedDict)Ú
itemgetter)ÚNotFound)Ú
IPAMConfig)ÚIPAMPool)Úversion_gte)Ú
version_lté   )Ú__version__)ÚConfigurationError)ÚLABEL_NETWORK)ÚLABEL_PROJECT)ÚLABEL_VERSION)z.com.docker.network.driver.overlay.vxlanid_listz$com.docker.network.windowsshim.hnsidz*com.docker.network.windowsshim.networknamec                   @   sn   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 d S  ty+   tdj| j	ddƒ‚w |  
¡  z| j| jd}t|| ƒ W d S  ty{   d}| jrQd | j¡}t d	 | j	|¡¡ | jj| j	| j| j| j| j| j| jt| jjd
ƒptd dd	 Y d S w )NÚoverlayz@Network {} declared as external. No new network will be created.z‡Network {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   Úcommand©r   zthe default driverzdriver "{}"zCreating network "{}" with {}z1.24T)	r   r   Úoptionsr   r   r   r   Ú
attachableÚcheck_duplicate)r   r   ÚinspectÚlogÚdebugÚformatr   r   r   Ú	full_nameÚ_set_legacy_flagr   Úcheck_remote_network_configÚinfor   Úcreate_networkr   r   r   r   Ú_labelsr   Ú_version)r   ÚdataÚdriver_namer   r   r    Úensure-   sT   
þ÷üÿÿÿ÷÷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   Úremove_network©r   r   r   r    Úremove^   s
   zNetwork.removec                 C   s    |r	| j  | j¡S | j  | j¡S r   )r   Úinspect_networkÚlegacy_full_namer,   )r   r   r   r   r    r(   f   s   zNetwork.inspectc                 C   s&   | j r| jS d t dd| j¡| j¡S )Nú{}_{}z[_-]Ú )r   r   r+   ÚreÚsubr   r8   r   r   r    r;   k   s
   ÿzNetwork.legacy_full_namec                 C   s   | j r| jS d | j| j¡S )Nr<   )r   r   r+   r   r8   r   r   r    r,   s   s   zNetwork.full_namec                 C   s   |   ¡  | jr
| jS | jS r   )r-   r   r;   r,   r8   r   r   r    r6   y   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   r2   r   ÚcopyÚupdater   r   r   r   r   r
   )r   r   r   r   r    r1   €   s   ýzNetwork._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   r3   r   r   r    r-   Œ   s   
ÿzNetwork._set_legacy_flag)NNNFFFNF)F)Ú__name__Ú
__module__Ú__qualname__r!   r5   r9   r(   Úpropertyr;   r,   r6   r1   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 )ÚsubnetÚip_rangeÚgatewayÚaux_addresses)rG   ÚiprangerI   rJ   )r   Úget)Ú.0Úconfigr   r   r    Ú
<listcomp>œ   s    úüÿz0create_ipam_config_from_dict.<locals>.<listcomp>rN   r%   )r   Úpool_configsr%   )r   rL   )Ú	ipam_dictr   r   r    r   –   s   
ù	õr   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚNetworkConfigChangedErrorc                    s   t ƒ  d ||¡¡ d S )Nz3Network "{}" needs to be recreated - {} has changed)Úsuperr!   r+   )r   Únet_nameÚproperty_name©Ú	__class__r   r    r!   ª   s
   ÿÿz"NetworkConfigChangedError.__init__)rB   rC   rD   r!   Ú__classcell__r   r   rV   r    rR   ©   s    rR   c                 C   s®  |   d¡}t|jƒ}|j  d¡r!|j  d¡|  d¡kr!t|jdƒ‚t|d ƒdkr¢t|d ƒt|d ƒkr;t|jdƒ‚t|d dd	}t|d dd	}|r¢| ¡ }| ¡ }|  d¡|  d¡kret|jd
ƒ‚|  d¡d ur||  d¡|  d¡kr|t|jdƒ‚|  d¡|  d¡krŒt|jdƒ‚t|  d¡ƒt|  d¡ƒkr t|jdƒ‚|sM|  d¡p¨i }|j  d¡p°i }	t 	t| 
¡ ƒt|	 
¡ ƒ¡D ]}
|  |
¡|	  |
¡krÔt|jd |
¡ƒ‚q¿d S )NÚIPAMr   ÚDriverzIPAM driverÚConfigr   zIPAM configsÚSubnet©ÚkeyzIPAM config subnetÚGatewayzIPAM config gatewayÚIPRangezIPAM config ip_rangeÚAuxiliaryAddresseszIPAM config aux_addressesÚOptionszIPAM option "{}")rL   r   r   rR   r6   ÚlenÚsortedÚpopÚsetÚunionÚkeysr+   )ÚremoteÚlocalÚremote_ipamrQ   Úremote_configsÚlocal_configsÚlcÚrcÚremote_optsÚ
local_optsÚkr   r   r    Úcheck_remote_ipam_config²   s8   

""ö ÿÿrs   c                 C   sb  |j r|  d¡|j krt|jdƒ‚|jpi }|  d¡pi }t t| ¡ ƒt| ¡ ƒ¡D ]}|tv r2q+| |¡| |¡krEt|jd 	|¡ƒ‚q+|j
d urPt| |ƒ |jd urd|j|  dd¡krdt|jdƒ‚|jd urx|j|  dd¡krxt|jd	ƒ‚|jp|i }|  d
¡pƒi }t t| ¡ ƒt| ¡ ƒ¡D ]}| d¡ršq’| |¡| |¡kr®t d 	|j|¡¡ q’d S )NrZ   r   rb   zoption "{}"ÚInternalFr   Ú
EnableIPv6r   ÚLabelszcom.docker.z@Network {}: label "{}" has changed. It may need to be recreated.)r   rL   rR   r6   r   rf   rg   rh   ÚOPTS_EXCEPTIONSr+   r   rs   r   r   r   Ú
startswithr)   Úwarning)ri   rj   rq   rp   rr   Úlocal_labelsÚremote_labelsr   r   r    r.   Ï   s8   
 ÿ


 

þ€ür.   c                    s>   |j pi }‡ ‡fdd„| ¡ D ƒ}d|vrtˆ ˆdƒ|d< |S )Nc                    sr   i | ]5\}}|t ˆ ˆ| d |¡| d¡| d¡| d¡t| dd¡ƒ| d¡| d¡| d¡| d ¡d	ud
“qS )r   r   r   r   r   Fr   r   r   N)r   r   r   r   r   r   r   r   r   r   r   )r   rL   Úbool)rM   Únetwork_namer3   ©r   r   r   r    Ú
<dictcomp>ð   s    ô
öÿz"build_networks.<locals>.<dictcomp>rF   )ÚnetworksÚitemsr   )r   Úconfig_datar   Únetwork_configr€   r   r~   r    Úbuild_networksî   s   
ór„   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   )r€   Úuse_networking)r   r€   r†   r   r   r    r!     s   

zProjectNetworks.__init__c                    sL   ‡ fdd„|D ƒ}t ˆ ƒt |ƒ dh }|r!t d d |¡¡¡ | ||ƒS )Nc                    s&   i | ]}t |ƒD ]}|ˆ  |¡“qqS r   )Úget_network_names_for_servicerL   )rM   ÚserviceÚnetwork©r€   r   r    r     s    ý
þÿz1ProjectNetworks.from_services.<locals>.<dictcomp>rF   z>Some networks were defined but are not used by any service: {}z, )rf   r)   ry   r+   Újoin)ÚclsÚservicesr€   r†   Úservice_networksÚunusedr   rŠ   r    Úfrom_services  s   
þþ
zProjectNetworks.from_servicesc              	   C   sJ   | j sd S | j ¡ D ]}z| ¡  W q
 ty"   t d|j¡ Y q
w d S )NzNetwork %s not found.)r†   r€   Úvaluesr9   r   r)   ry   r6   ©r   r‰   r   r   r    r9     s   ÿýzProjectNetworks.removec                 C   s&   | j sd S | j ¡ D ]}| ¡  q
d S r   )r†   r€   r‘   r5   r’   r   r   r    Ú
initialize#  s
   
ÿzProjectNetworks.initializeN)rB   rC   rD   r!   Úclassmethodr   r9   r“   r   r   r   r    r…     s    
	r…   c                 C   s.   d| v ri S |   ddd i¡}dd„ | ¡ D ƒS )NÚnetwork_moder€   rF   c                 S   s   i | ]	\}}||p
i “qS r   r   )rM   ÚnetrN   r   r   r    r   /  s    ÿÿz0get_network_defs_for_service.<locals>.<dictcomp>)rL   r   )Úservice_dictr€   r   r   r    Úget_network_defs_for_service+  s   þr˜   c                 C   s   t | ƒ ¡ S r   )r˜   rh   )r—   r   r   r    r‡   5  s   r‡   c                 C   sŽ   i }t | ƒ ¡ D ]\}}| |¡}|r|||j< qtd | d |¡ƒ‚tdd„ | ¡ D ƒƒr;tt	| ¡ dd„ ddƒS tt	| ¡ t
d	ƒd
ƒS )Nz+Service "{}" uses an undefined network "{}"r   c                 S   s   g | ]}|  d ¡‘qS )Úpriority©rL   )rM   Úvr   r   r    rO   D  s    z get_networks.<locals>.<listcomp>c                 S   s   | d   d¡pdS )Nr	   r™   r   rš   )Útr   r   r    Ú<lambda>G  s    zget_networks.<locals>.<lambda>T)r^   Úreverser   r]   )r˜   r   rL   r6   r   r+   Úanyr‘   r   rd   r   )r—   Únetwork_definitionsr€   r   Únetdefr‰   r   r   r    Úget_networks9  s   
þþr¢   )$Úloggingr>   Úcollectionsr   Úoperatorr   Údocker.errorsr   Údocker.typesr   r   Údocker.utilsr   r   r=   r
   rN   r   Úconstr   r   r   Ú	getLoggerrB   r)   rw   r   r   rR   rs   r.   r„   r…   r˜   r‡   r¢   r   r   r   r    Ú<module>   s4    
z	%
