a
   O$                   @   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                   @   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   3/usr/lib/python3.9/site-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yX   tdj| j	ddY n0 d S | 
  z| j| jd}t||  W nv ty   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0 d S )NZoverlayz@Network {} 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$   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   r1   r   r   r    r3   k   s
    zNetwork.legacy_full_namec                 C   s   | j r| jS d| j| jS )Nr4   )r   r   r'   r   r1   r   r   r    r(   s   s    zNetwork.full_namec                 C   s   |    | jr| jS | jS r   )r)   r   r3   r(   r1   r   r   r    r0   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   r-   r   copyupdater   r   r   r   r   r
   )r   r   r   r   r    r,      s    zNetwork._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   r.   r   r   r    r)      s    
zNetwork._set_legacy_flag)NNNFFFNF)F)__name__
__module____qualname__r!   r/   r2   r$   propertyr3   r(   r0   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ipranger@   rA   )r   get).0configr   r   r    
<listcomp>   s   z0create_ipam_config_from_dict.<locals>.<listcomp>rD   r#   )r   Zpool_configsr#   )r   rB   )	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   Znet_nameZproperty_name	__class__r   r    r!      s
    z"NetworkConfigChangedError.__init__)r:   r;   r<   r!   __classcell__r   r   rI   r    rG      s   rG   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 u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 "{}")rB   r   r   rG   r0   lensortedpopsetunionkeysr'   )remotelocalZremote_ipamrF   Zremote_configsZlocal_configsZlc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v rdqV||||krVt|jd	|qV|j
d urt| | |jd ur|j| ddkrt|jd|jd u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 )NrL   r   rO   zoption "{}"ZInternalFr   Z
EnableIPv6r   ZLabelszcom.docker.z@Network {}: label "{}" has changed. It may need to be recreated.)r   rB   rG   r0   r   rS   rT   rU   OPTS_EXCEPTIONSr'   r   r\   r   r   r   
startswithr%   warning)rV   rW   rZ   rY   r[   Zlocal_labelsZremote_labelsr   r   r    r*      s4    
 


 r*   c                    s>   |j pi } fdd| D }d|vr:t d|d< |S )Nc                    sr   i | ]j\}}|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   rB   bool)rC   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_servicerB   )rC   Z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, )rS   r%   r_   r'   join)clsZservicesrc   rg   Zservice_networksZunusedr   rj   r    from_services  s    
zProjectNetworks.from_servicesc              	   C   sL   | j s
d S | j D ]2}z|  W q tyD   td|j Y q0 qd S )NzNetwork %s not found.)rg   rc   valuesr2   r   r%   r_   r0   r   ri   r   r   r    r2     s    zProjectNetworks.removec                 C   s&   | j s
d S | j D ]}|  qd S r   )rg   rc   rn   r/   ro   r   r   r    
initialize#  s    zProjectNetworks.initializeN)r:   r;   r<   r!   classmethodrm   r2   rp   r   r   r   r    rf     s
   
	rf   c                 C   s.   d| v ri S |  ddd i}dd | D S )NZnetwork_moderc   r>   c                 S   s   i | ]\}}||pi qS r   r   )rC   ZnetrD   r   r   r    rb   /  s   z0get_network_defs_for_service.<locals>.<dictcomp>)rB   rd   )service_dictrc   r   r   r    get_network_defs_for_service+  s    rs   c                 C   s   t |  S r   )rs   rU   )rr   r   r   r    rh   5  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	| t
d	d
S d S )Nz+Service "{}" uses an undefined network "{}"r   c                 S   s   g | ]}| d qS )priorityrB   )rC   vr   r   r    rE   D      z get_networks.<locals>.<listcomp>c                 S   s   | d  dpdS )Nr	   rt   r   ru   )tr   r   r    <lambda>G  rw   zget_networks.<locals>.<lambda>T)rN   reverser   rM   )rs   rd   rB   r0   r   r'   anyrn   r   rQ   r   )rr   Znetwork_definitionsrc   r   Znetdefri   r   r   r    get_networks9  s     
r|   )$Zloggingr6   collectionsr   operatorr   Zdocker.errorsr   Zdocker.typesr   r   Zdocker.utilsr   r   r5   r
   rD   r   constr   r   r   Z	getLoggerr:   r%   r]   r   r   rG   r\   r*   re   rf   rs   rh   r|   r   r   r   r    <module>   s2   
z	%
