
    )                     L    S SK Jr  S SKJrJr  S SKJr  S SKJr   " S S5      rg)   )InvalidVersion)check_resourceminimum_version)
version_lt)utilsc                       \ rS rSrSS jr    SS jr\" S5      SS j5       r\" S5      S 5       r	\" S5      SS	 j5       r
\" S
5          SS j5       r\" S
5       SS j5       rSrg)NetworkApiMixin   Nc                     Uc  0 nU(       a  XS'   U(       a  X#S'   S[         R                  " U5      0nU R                  S5      nU R                  XTS9nU R	                  USS9$ )ao  
List networks. Similar to the ``docker network ls`` command.

Args:
    names (:py:class:`list`): List of names to filter by
    ids (:py:class:`list`): List of ids to filter by
    filters (dict): Filters to be processed on the network list.
        Available filters:
        - ``driver=[<driver-name>]`` Matches a network's driver.
        - ``label=[<key>]``, ``label=[<key>=<value>]`` or a list of
            such.
        - ``type=["custom"|"builtin"]`` Filters networks by type.

Returns:
    (dict): List of network objects.

Raises:
    :py:class:`docker.errors.APIError`
        If the server returns an error.
nameidfiltersz	/networksparamsTjson)r   convert_filters_url_get_result)selfnamesidsr   r   urlress          %lib/third_party/docker/api/network.pynetworksNetworkApiMixin.networks   sh    , ?G#FODMU227;<ii$iii+||Cd|++    c                 (   Ub   [        U[        5      (       d  [        S5      eUUUUUS.nUbJ  [        U R                  S5      (       a  [        S5      e[        U[        5      (       d  [        S5      eX|S'   U(       a+  [        U R                  S5      (       a  [        S5      eSUS	'   U(       a+  [        U R                  S
5      (       a  [        S5      eSUS'   U	b*  [        U R                  S5      (       a  [        S5      eXS'   Ub*  [        U R                  S5      (       a  [        S5      eXS'   U
b*  [        U R                  S5      (       a  [        S5      eXS'   U R                  S5      nU R                  XS9nU R                  USS9$ )a;  
Create a network. Similar to the ``docker network create``.

Args:
    name (str): Name of the network
    driver (str): Name of the driver used to create the network
    options (dict): Driver options as a key-value dictionary
    ipam (IPAMConfig): Optional custom IP scheme for the network.
    check_duplicate (bool): Request daemon to check for networks with
        same name. Default: ``None``.
    internal (bool): Restrict external access to the network. Default
        ``False``.
    labels (dict): Map of labels to set on the network. Default
        ``None``.
    enable_ipv6 (bool): Enable IPv6 on the network. Default ``False``.
    attachable (bool): If enabled, and the network is in the global
        scope,  non-service containers on worker nodes will be able to
        connect to the network.
    scope (str): Specify the network's scope (``local``, ``global`` or
        ``swarm``)
    ingress (bool): If set, create an ingress network which provides
        the routing-mesh in swarm mode.

Returns:
    (dict): The created network reference object

Raises:
    :py:class:`docker.errors.APIError`
        If the server returns an error.

Example:
    A network using the bridge driver:

        >>> client.api.create_network("network1", driver="bridge")

    You can also create more advanced networks with custom IPAM
    configurations. For example, setting the subnet to
    ``192.168.52.0/24`` and gateway address to ``192.168.52.254``.

    .. code-block:: python

        >>> ipam_pool = docker.types.IPAMPool(
            subnet='192.168.52.0/24',
            gateway='192.168.52.254'
        )
        >>> ipam_config = docker.types.IPAMConfig(
            pool_configs=[ipam_pool]
        )
        >>> client.api.create_network("network1", driver="bridge",
                                         ipam=ipam_config)
zoptions must be a dictionary)NameDriverOptionsIPAMCheckDuplicatez1.23z*network labels were introduced in API 1.23zlabels must be a dictionaryLabelsz&enable_ipv6 was introduced in API 1.23T
EnableIPv61.22z9Internal networks are not supported in API version < 1.22Internalz1.24z1attachable is not supported in API version < 1.24
Attachablez1.29z.ingress is not supported in API version < 1.29Ingressz1.30z,scope is not supported in API version < 1.30Scopez/networks/createdatar   )	
isinstancedict	TypeErrorr   _versionr   r   
_post_jsonr   )r   r   driveroptionsipamcheck_duplicateinternallabelsenable_ipv6
attachablescopeingressr.   r   r   s                  r   create_networkNetworkApiMixin.create_network)   s   n z'4'@'@:;; -
 $--00$@  fd++ =>>#N$--00$<  "&D$--00$ &G H H#D!$--00$G  ",$--00$D  &O$--00$B  "Mii*+ooco-||Cd|++r   z1.25c                     0 nU(       a  [         R                  " U5      US'   U R                  S5      nU R                  U R	                  X2S9S5      $ )a2  
Delete unused networks

Args:
    filters (dict): Filters to process on the prune list.

Returns:
    (dict): A dict containing a list of deleted network names and
        the amount of disk space reclaimed in bytes.

Raises:
    :py:class:`docker.errors.APIError`
        If the server returns an error.
r   z/networks/pruner   T)r   r   r   r   _post)r   r   r   r   s       r   prune_networksNetworkApiMixin.prune_networks   sL       % 5 5g >F9ii)*||DJJsJ:DAAr   net_idc                 l    U R                  SU5      nU R                  U5      nU R                  U5        g)zk
Remove a network. Similar to the ``docker network rm`` command.

Args:
    net_id (str): The network's id
/networks/{0}N)r   _delete_raise_for_status)r   rD   r   r   s       r   remove_networkNetworkApiMixin.remove_network   s0     ii0ll3s#r   c                    0 nUb*  [        U R                  S5      (       a  [        S5      eX$S'   Ub*  [        U R                  S5      (       a  [        S5      eX4S'   U R                  SU5      nU R	                  XTS9nU R                  US	S
9$ )a  
Get detailed information about a network.

Args:
    net_id (str): ID of network
    verbose (bool): Show the service details across the cluster in
        swarm mode.
    scope (str): Filter the network by scope (``swarm``, ``global``
        or ``local``).
z1.28z"verbose was introduced in API 1.28verbosez1.31z scope was introduced in API 1.31r<   rF   r   Tr   )r   r2   r   r   r   r   )r   rD   rL   r<   r   r   r   s          r   inspect_networkNetworkApiMixin.inspect_network   s     $--00$%IJJ '9$--00$%GHH#7Oii0iii+||Cd|++r   	containerc
                     UU R                  XVUXGUU	S9S.n
U R                  SU5      nU R                  XS9nU R                  U5        g)a  
Connect a container to a network.

Args:
    container (str): container-id/name to be connected to the network
    net_id (str): network id
    aliases (:py:class:`list`): A list of aliases for this endpoint.
        Names in that list can be used within the network to reach the
        container. Defaults to ``None``.
    links (:py:class:`list`): A list of links for this endpoint.
        Containers declared in this list will be linked to this
        container. Defaults to ``None``.
    ipv4_address (str): The IP address of this container on the
        network, using the IPv4 protocol. Defaults to ``None``.
    ipv6_address (str): The IP address of this container on the
        network, using the IPv6 protocol. Defaults to ``None``.
    link_local_ips (:py:class:`list`): A list of link-local
        (IPv4/IPv6) addresses.
    mac_address (str): The MAC address of this container on the
        network. Defaults to ``None``.
)aliaseslinksipv4_addressipv6_addresslink_local_ips
driver_optmac_address)	ContainerEndpointConfigz/networks/{0}/connectr-   N)create_endpoint_configr   r3   rH   )r   rO   rD   rS   rT   rQ   rR   rU   rV   rW   r.   r   r   s                r   connect_container_to_network,NetworkApiMixin.connect_container_to_network   s`    8 #"99<)%'	 : 
 ii/8ooco-s#r   c                     SU0nU(       a*  [        U R                  S5      (       a  [        S5      eX4S'   U R                  SU5      nU R	                  XTS9nU R                  U5        g)a  
Disconnect a container from a network.

Args:
    container (str): container ID or name to be disconnected from the
        network
    net_id (str): network ID
    force (bool): Force the container to disconnect from a network.
        Default: ``False``
rX   r(   z,Forced disconnect was introduced in API 1.22Forcez/networks/{0}/disconnectr-   N)r   r2   r   r   r3   rH   )r   rO   rD   forcer.   r   r   s          r   !disconnect_container_from_network1NetworkApiMixin.disconnect_container_from_network   sj     Y'$--00$B  "Mii2F;ooco-s#r    )NNN)
NNNNFNFNNN)N)NN)NNNNNNN)F)__name__
__module____qualname____firstlineno__r   r>   r   rB   r   rI   rM   r[   r`   __static_attributes__rb   r   r   r	   r	      s    ,B DHDHAE#p,d VB B* H	$ 	$ H, ,2 K EI9=EI15	&$ !&$P K 05$ !$r   r	   N)errorsr   r   r   r   r    r	   rb   r   r   <module>rj      s    # 3  O$ O$r   