
    >TfD                     R    d dl Z ddlT ddlmZmZ dZddZdd	Zd
 Zd Z	d Z
d ZdS )    N   )*)PrefixVLAN)add_available_ipaddressesadd_available_vlansadd_requested_prefixesget_next_available_prefixrebuild_prefixesTc                    g }|rX|rVt          j        |           t          j        d |D                       z  }d |                                D             }||z   }|r|r|t          |          z   }|                    d            |S )a  
    Return a list of requested prefixes using show_available, show_assigned filters. If available prefixes are
    requested, create fake Prefix objects for all unallocated space within a prefix.

    :param parent: Parent Prefix instance
    :param prefix_list: Child prefixes list
    :param show_available: Include available prefixes.
    :param show_assigned: Show assigned prefixes.
    c                     g | ]	}|j         
S  prefix.0ps     //var/www/html/netbox-4.1.3/netbox/ipam/utils.py
<listcomp>z*add_requested_prefixes.<locals>.<listcomp>   s    CbCbCbQRAHCbCbCb    c                 0    g | ]}t          |d           S )N)r   status)r   r   s     r   r   z*add_requested_prefixes.<locals>.<listcomp>    s%    eeefAd;;;eeer   c                     | j         S Nr   )r   s    r   <lambda>z(add_requested_prefixes.<locals>.<lambda>(   s    ah r   key)netaddrIPSet
iter_cidrslistsort)parentprefix_listshow_availableshow_assignedchild_prefixesavailable_prefixess         r   r	   r	      s     N  =~ = %]622W]CbCbVaCbCbCb5c5cceeEWEbEbEdEdeee'*<<  <} <'${*;*;; ..///r   Fc                 <   g }d}| j         dk    rF| j        dk     r;|s9t          j        | j        dz             }t          j        | j        dz
            }n2t          j        | j                  }t          j        | j                  }|s1t          ||z
  dz             d                    || j                  fgS |d         j        j	        |k    rTt          |d         j        j	        |z
            }d                    || j                  }|
                    ||f           |D ]}	|rnt          |	j        j	        |j        j	        z
            }
|
dk    rBd                    |j        j	        dz   | j                  }|
                    |
dz
  |f           |
                    |	           |	}|j        j	        |k     r[t          ||j        j	        z
            }d                    |j        j	        dz   | j                  }|
                    ||f           |S )z
    Annotate ranges of available IP addresses within a given prefix. If is_pool is True, the first and last IP will be
    considered usable (regardless of mask length).
    N      r   z{}/{}r   )version	prefixlenr   	IPAddressfirstlastintformataddressipappend)r   ipaddress_listis_pooloutputprev_ipfirst_ip_in_prefixlast_ip_in_prefixskipped_countfirst_skippedr4   diffs              r   r   r   -   s'    FG ~v/"44W4$.v|a/?@@#-fkAo>>$.v|<<#-fk:: !$66:;;NN-v/?@@
  	 a #&888N1-58;MMNN'96;KLL}m4555    	9rz}w'99::Daxx 'w/AA/EvGW X Xtax7888b ----0BBCCw'9A'=v?OPP}m4555Mr   c                    |rt          |j                  nt          }|rt          |j                  nt          }| s
||||z
  dgS |dz
  }g }| D ]S}||j        cxk    r|k     sn |j        |z
  dk    r'|                    |dz   ||j        |z
  dz
  d           |j        }T||k     r"|                    |dz   |||z
  dz
  d           |S )=
    Create fake records for all gaps between used VLANs
    )vid
vlan_group	availabler   )r1   lowerVLAN_VID_MINupperVLAN_VID_MAXrA   r5   )vlansrB   	vid_rangemin_vidmax_vidprev_vid	new_vlansvlans           r   available_vlans_from_rangerO   ]   sM    '0Ac)/"""\G&/Ac)/"""\G $ 7*
 
  	 {HI   $(,,,,W,,,, 8h""!|(!X014     8 'a<$ 8+a/
 
 	 	 	 r   c                     g }|j         D ]&}|                    t          | ||                     't          |           |z   } |                     d            | S )r@   c                 L    t          |           t          u r| j        n| d         S )NrA   )typer   rA   )vs    r   r   z%add_available_vlans.<locals>.<lambda>   s    d1ggooQUU1U8 r   r   )
vid_rangesextendrO   r!   r"   )rH   rB   rM   rI   s       r   r   r      sn     I* S S	3E:yQQRRRRKK)#E	JJCCJDDDLr   c           
      :  	 d }	fd}g 	g }t           j                            |                               dd          }t	          |          D ]K\  }}	r |	d         d         |d                   r ||           n	d         d         |d         k    r(	d         d                             |d                    n	r |	d         d         |d                   sw	                                }|d         D ]:}|                    t          |t          	          |d                              ;	r |	d         d         |d                   w ||           t          |          d	k    r$t           j                            |d
dg           g }M	rY	                                }|d         D ]:}|                    t          |t          	          |d                              ;	Yt           j                            |d
dg           dS )z_
    Rebuild the prefix hierarchy for all prefixes in the specified VRF (or global table).
    c                     || v o|| k    S r   r   )r#   childs     r   containsz"rebuild_prefixes.<locals>.contains   s    25F?2r   c                 ~    D ]}|dxx         dz  cc<                        | d         g| d         dd           d S )Nchildrenr   pkr   r   )r\   r   r[   )r5   )r   nstacks     r   push_to_stackz'rebuild_prefixes.<locals>.push_to_stack   sh     	 	AjMMMQMMMM$<.X&
 
 	 	 	 	 	r   )vrfr\   r   r[   )r\   _depth	_childrend   rb   rc   N)	r   objectsfiltervalues	enumerater5   poplenbulk_update)
r`   rY   r_   update_queueprefixesir   noder\   r^   s
            @r   r   r      s   3 3 3     EL~$$$--44T8DDH (##  1  	r8!4akBB 	M! 2Yx AhK//"IdO""1T7++++
  r8)<ak J J yy{{t*  B ''"SZZ4
CSTTT     r8)<ak J J  M! |##N&&|h5LMMML  yy{{t* 	 	B"SZZ4
;KLLL      N|h-DEEEEEr   c                     |                                  D ]2}||j        k    r%|j         d| }|                     |           |c S 3dS )zR
    Given a prefix length, allocate the next available prefix from an IPSet.
    /N)r    r-   networkremove)ipsetprefix_sizeavailable_prefixallocated_prefixs       r   r
   r
      sq     ",,.. $ $*444"2":JJ[JJLL)***#### 5 4r   )TT)F)r   	constantsmodelsr   r   __all__r	   r   rO   r   r   r
   r   r   r   <module>r{      s                           <- - - -`) ) )X  9F 9F 9Fx	 	 	 	 	r   