
    S`-                     8   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 j,                  e      Zg dZ G d d      Zd Z G d de      Zd Zd Zd Z G d d      Z d Z!d Z"d Z#y)    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                   t    e Zd Z	 	 	 ddZd Zd ZddZed        Zed        Z	ed        Z
ed	        Zd
 Zy)NetworkNc                     || _         || _        || _        || _        || _        t        |      | _        || _        || _        |	| _	        |
| _
        || _        d | _        y 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   s               1/usr/lib/python3/dist-packages/compose/network.py__init__zNetwork.__init__   s`     	&06	  &&    c                 z   | j                   rP| j                  dk(  ry 	 | j                          t        j	                  dj                  | j                               y | j                          	 | j                  | j                        }t        ||        y # t        $ r' t        dj                  | j                  d            w xY w# t        $ r d}| j                  rdj                  | j                        }t        j                  d	j                  | j                  |             | j                  j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  | j(                  t+        | j                  j,                  d
      xs d d	       Y y w xY w)N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   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_names      r"   ensurezNetwork.ensure-   st   =={{i' 		//5vdii/@ 	<<t{{<3D'd3  (??Ev!^^ 7 @F @   	.K{{+224;;?HH/66t~~{S KK&&^^{{((YY ,,||&t{{';';VDL $ ' 
	s   >B .(C
 0C
C-F:9F:c                    | j                   r!t        j                  d| j                         y t        j                  dj	                  | j                               | j
                  j                  | j                         y )Nz Network %s is external, skippingzRemoving network {})r   r-   r3   	true_namer/   r   remove_networkr!   s    r"   removezNetwork.remove^   sQ    ==HH7H&--dnn=>""4>>2r$   c                     |r%| j                   j                  | j                        S | j                   j                  | j                        S r   )r   inspect_networklegacy_full_namer0   )r!   r    s     r"   r,   zNetwork.inspectf   s9    ;;..t/D/DEE{{**4>>::r$   c                     | j                   r| j                  S dj                  t        j                  dd| j
                        | j                        S )N{}_{}z[_-] )r   r   r/   resubr   r=   s    r"   rA   zNetwork.legacy_full_namek   s@    99~~FF7B-tyy
 	
r$   c                 ~    | j                   r| j                  S dj                  | j                  | j                        S )NrC   )r   r   r/   r   r=   s    r"   r0   zNetwork.full_names   s.    99~~dllDII66r$   c                 j    | j                          | j                  r| j                  S | j                  S r   )r1   r    rA   r0   r=   s    r"   r;   zNetwork.true_namey   s+    ;;(((~~r$   c                    t        | j                  j                  d      ry | j                  r| j                  j	                         ni }|j                  t        | j                  t        | j                  t        t        i       |S )Nz1.23)r	   r   r6   r   copyupdater   r   r   r   r   r   )r!   r   s     r"   r5   zNetwork._labels   sb    dkk**F3'+{{!!#4<<499;
 	
 r$   c                     | j                   y 	 | j                  d      }|d u| _         y # t        $ r
 d| _         Y y w xY w)NTr(   F)r    r,   r   )r!   r7   s     r"   r1   zNetwork._set_legacy_flag   sF    ;;"	 <<t<,Dd*DK 	 DK	 s   + >>)NNNFFFNF)F)__name__
__module____qualname__r#   r9   r>   r,   propertyrA   r0   r;   r5   r1    r$   r"   r   r      su    GKHM*/ /b3;
 
 
 7 7
   	 	 r$   r   c                 @   | sy t        | j                  d      xs d| j                  dg       D cg c]M  }t        |j                  d      |j                  d      |j                  d      |j                  d            O c}| j                  d	      
      S c c}w )Nr   defaultconfigsubnetip_rangegatewayaux_addresses)rU   iprangerW   rX   r)   )r   pool_configsr)   )r   getr   )	ipam_dictrT   s     r"   r   r      s    }}X&3) $--"5
  zz(+

:.

9-$jj9	
 i( 
s   AB
c                        e Zd Z fdZ xZS )NetworkConfigChangedErrorc                 D    t         |   dj                  ||             y )Nz3Network "{}" needs to be recreated - {} has changed)superr#   r/   )r!   net_nameproperty_name	__class__s      r"   r#   z"NetworkConfigChangedError.__init__   s#    AHH-	
r$   )rM   rN   rO   r#   __classcell__)rc   s   @r"   r^   r^      s    
 
r$   r^   c                    | j                  d      }t        |j                        }|j                  j                  d      rC|j                  j                  d      |j                  d      k7  rt        |j                  d      t        |d         dk7  rt        |d         t        |d         k7  rt        |j                  d      t        |d   d	      }t        |d   d	      }|r+|j                         }|j                         }|j                  d      |j                  d      k7  rt        |j                  d
      |j                  d      9|j                  d      |j                  d      k7  rt        |j                  d      |j                  d      |j                  d      k7  rt        |j                  d      t        |j                  d            t        |j                  d            k7  rt        |j                  d      |r+|j                  d      xs i }|j                  j                  d      xs i }	t        j                  t        |j                               t        |	j                                     D ]J  }
|j                  |
      |	j                  |
      k7  s't        |j                  dj                  |
             y )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 "{}")r[   r   r   r^   r;   lensortedpopsetunionkeysr/   )remotelocalremote_ipamr\   remote_configslocal_configslcrcremote_opts
local_optsks              r"   check_remote_ipam_configr      sF   **V$K,UZZ8Izz~~hEJJNN8$<PX@Y$Y'GG
9X1$y"#s;x+@'AA+EOO^LLH 58Dy2A""$B##%Bvvh266(#33/AUVVvvi ,	1BbffYFW1W/AVWWvvi BFF9$55/AWXXbff123vbffEY>Z7[[/A\]]  //),2K	*0bJYYs;++-.JOO4E0FG [??1!22+EOO=O=V=VWX=YZZ[r$   c                    |j                   r4| j                  d      |j                   k7  rt        |j                  d      |j                  xs i }| j                  d      xs i }t
        j                  t        |j                               t        |j                                     D ]S  }|t        v r|j                  |      |j                  |      k7  s0t        |j                  dj                  |             |j                  t        | |       |j                  5|j                  | j                  dd      k7  rt        |j                  d      |j                  5|j                  | j                  dd      k7  rt        |j                  d	      |j                  xs i }| j                  d
      xs i }t
        j                  t        |j                               t        |j                                     D ]g  }|j                  d      r|j                  |      |j                  |      k7  s9t         j#                  dj                  |j                  |             i y )Nrg   r   ro   zoption "{}"InternalFr   
EnableIPv6r   Labelszcom.docker.z@Network {}: label "{}" has changed. It may need to be recreated.)r   r[   r^   r;   r   rs   rt   ru   OPTS_EXCEPTIONSr/   r   r   r   r   r   
startswithr-   warning)rv   rw   r~   r}   r   local_labelsremote_labelss          r"   r2   r2      s   ||

8,<'BB""(bJ**Y'-2KYYs;++-.JOO4E0FG V??1!22+EOO]=Q=QRS=TUU	V zz /~~!enn

:u8U&U'DD$):):fjjW\>])]'GG<<%2LJJx(.BMYYs=--/0#l6G6G6I2JK <<&Q<#3#3A#66KK$fU__a8	r$   c                    |j                   xs i }|j                         D ci c]  \  }}|t        || |j                  d|      |j                  d      |j                  d      |j                  d      t	        |j                  dd            |j                  d      |j                  d      |j                  d	      |j                  d      d u
       }}}d|vrt        || d      |d<   |S c c}}w )Nr   r   r   r   r   Fr   r   r   )r   r   r   r   r   r   r   r   r   r   r   rS   )networksitemsr   r[   bool)r   config_datar   network_confignetwork_namer7   r   s          r"   build_networksr      s     ))/RN #1"6"6"8 L$ 	g4&,/88H%/&!$((:u56XXj)/88H%(4
 	
H    %fdI>O's   B5C2c                   .    e Zd Zd Zed        Zd Zd Zy)ProjectNetworksc                 (    |xs i | _         || _        y r   )r   use_networking)r!   r   r   s      r"   r#   zProjectNetworks.__init__  s     B,r$   c           	      "   |D ci c]$  }t        |      D ]  }||j                  |       & }}}t        |      t        |      z
  dhz
  }|r3t        j	                  dj                  dj                  |                    | ||      S c c}}w )NrS   z>Some networks were defined but are not used by any service: {}z, )get_network_names_for_servicer[   rs   r-   r   r/   join)clsservicesr   r   servicenetworkservice_networksunuseds           r"   from_serviceszProjectNetworks.from_services  s     $
8A
  X\\'**

 

 X%5!66)DKKVDIIf-.0 #^44
s   )Bc                     | j                   sy | j                  j                         D ]  }	 |j                           y # t        $ r# t
        j                  d|j                         Y Bw xY w)NzNetwork %s not found.)r   r   valuesr>   r   r-   r   r;   r!   r   s     r"   r>   zProjectNetworks.remove  sd    ""}}++- 	HGH 	H  H3W5F5FGHs   ?)A+*A+c                 |    | j                   sy | j                  j                         D ]  }|j                           y r   )r   r   r   r9   r   s     r"   
initializezProjectNetworks.initialize#  s4    ""}}++- 	GNN	r$   N)rM   rN   rO   r#   classmethodr   r>   r   rQ   r$   r"   r   r     s&    - 5 5Hr$   r   c                     d| v ri S | j                  ddd i      }|j                         D ci c]  \  }}||xs i  c}}S c c}}w )Nnetwork_moder   rS   )r[   r   )service_dictr   netrT   s       r"   get_network_defs_for_servicer   +  s\    %	
Y,=>H $>>+C 	fl  s   Ac                 4    t        |       j                         S r   )r   ru   )r   s    r"   r   r   5  s    '5::<<r$   c                    i }t        |       j                         D ]E  \  }}|j                  |      }|r|||j                  <   )t	        dj                  | d   |             t        |j                         D cg c]  }|j                  d       c}      r&t        t        |j                         d d            S t        t        |j                         t        d                  S c c}w )	Nz+Service "{}" uses an undefined network "{}"r   priorityc                 2    | d   j                  d      xs dS )Nr
   r   r   )r[   )ts    r"   <lambda>zget_networks.<locals>.<lambda>G  s    !A$((:.3! r$   T)rk   reverser   rj   )r   r   r[   r;   r   r/   anyr   r   rq   r   )r   network_definitionsr   r   netdefr   vs          r"   get_networksr   9  s    H4\BHHJ 5f%))$/*0HW&&'$=V,d35 55 x'89!AEE*9:6NN3T
  	 6(.."2
1FGG :s   ;C-)$loggingrE   collectionsr   operatorr   docker.errorsr   docker.typesr   r   docker.utilsr   r	   rD   r   rT   r   constr   r   r   	getLoggerrM   r-   r   r   r   r^   r   r2   r   r   r   r   r   rQ   r$   r"   <module>r      s     	 #  " # ! $ #  &       g!w  w t&
 2 
[:>0" "J=Hr$   