
    x[hb                        % S SK r S SKrS SKrS SKJrJrJrJr  S SKJ	r	J
r
Jr  S SKJrJrJrJrJrJrJrJrJr  \(       a  S SKJr  \R0                  " \5      rSrS/ SQ0r/ SQrS	S
SSSSSSSSSSSSSS.SSSSSSSSSS SS!.S".r\\\\\4   4   \ S#'   S$\!S%S4S& jr"S' r# " S( S)\$5      r%S* r& " S+ S,5      r' " S- S.5      r(S/ r)S6S0 jr*S1 r+S2 r,  S7S3\!S4\-S%\'4S5 jjr.g)8    N)TYPE_CHECKINGAnyDictOptional)	lifecyclesafeyamlutil)	find_interface_name_from_macget_interfaces_by_macipv4_mask_to_net_prefixipv6_mask_to_net_prefixis_ip_networkis_ipv4_networkis_ipv6_addressis_ipv6_networknet_prefix_to_ipv4_maskRenderer   versionconfignetwork_state)	addressesdhcp4dhcp4-overridesdhcp6dhcp6-overridesgateway4gateway6
interfacesmatchmtunameserversrendererset-name	wakeonlan	accept-raoptionalz	ad-selectzarp-intervalzarp-ip-targetzarp-validatez
down-delayzfail-over-mac-policyz	lacp-ratezmii-monitor-intervalz	min-linksmodegratuitous-arpprimaryzprimary-reselect-policyzup-delayztransmit-hash-policy)zbond-ad-selectzbond-arp-intervalzbond-arp-ip-targetzbond-arp-validatezbond-downdelayzbond-fail-over-maczbond-lacp-ratezbond-miimonzbond-min-linksz	bond-modezbond-num-grat-arpzbond-primaryzbond-primary-reselectzbond-updelayzbond-xmit-hash-policyzageing-timepriorityzforward-delayz
hello-timezmax-agez	path-costzport-prioritystp)bridge_ageingbridge_bridgeprio	bridge_fdbridge_gcintbridge_hellobridge_maxagebridge_maxwaitbridge_pathcostbridge_portprio
bridge_stpbridge_waitport)bondbridgeNET_CONFIG_TO_V2diktreturnc                 J    SU ;   d  SU ;   a  [         R                  " SSSS9  gg)z8Warn about deprecations of v2 properties for all devicesr   r    z$The use of `gateway4` and `gateway6`z22.4zbFor more info check out: https://docs.cloud-init.io/en/latest/topics/network-config-format-v2.html)
deprecateddeprecated_versionextra_messageN)r   	deprecate)r=   s    =/usr/lib/python3/dist-packages/cloudinit/net/network_state.pywarn_deprecated_all_devicesrE   W   s0    TZ4/=%X	
 0    c                 P    [        U 5      nU H  nUR                  U5        M     U$ N)setdiscard)expectedactualmissingkeys       rD   	diff_keysrO   b   s&    (mG NrF   c                       \ rS rSrSrg)InvalidCommandi    N)__name__
__module____qualname____firstlineno____static_attributes__rS   rF   rD   rQ   rQ   i   s    rF   rQ   c                    ^  U 4S jnU$ )Nc                 J   >^  [         R                  " T 5      U U4S j5       nU$ )Nc                 v   > T(       a&  [        TU5      nU(       a  [        SU< ST< 35      eT" X/UQ70 UD6$ )NzCommand missing z of required keys )rO   rQ   )selfcommandargskwargsmissing_keysfuncrequired_keyss        rD   	decorator7ensure_command_keys.<locals>.wrapper.<locals>.decoratoro   sC    (@('8  7777rF   )	functoolswraps)ra   rc   rb   s   ` rD   wrapper$ensure_command_keys.<locals>.wrappern   s&    			8 
	8 rF   rS   )rb   rg   s   ` rD   ensure_command_keysri   m   s     NrF   c                       \ rS rSr\4S\S\4S jjr\S\4S j5       r	\S 5       r
\S 5       r\S	 5       r\S
 5       rSS jrSS jrS rS r\S\SS 4S j5       rSrg)NetworkState   r   r   c                     [         R                  " U5      U l        X l        UR	                  SS5      U l        S U l        g )Nuse_ipv6F)copydeepcopy_network_state_versiongetrn   _has_default_route)r\   r   r   s      rD   __init__NetworkState.__init__   s6     #mmM:%))*e<"&rF   r>   c                      U R                   S   $ )Nr   )rq   r\   s    rD   r   NetworkState.config   s    ""8,,rF   c                     U R                   $ rH   )rr   rx   s    rD   r   NetworkState.version   s    }}rF   c                 L     U R                   S   S   $ ! [         a    / s $ f = f)Ndnsr$   rq   KeyErrorrx   s    rD   dns_nameserversNetworkState.dns_nameservers   s1    	&&u-m<< 	I	    ##c                 L     U R                   S   S   $ ! [         a    / s $ f = f)Nr}   searchr~   rx   s    rD   dns_searchdomainsNetworkState.dns_searchdomains   s1    	&&u-h77 	I	r   c                 ^    U R                   c  U R                  5       U l         U R                   $ rH   )rt   _maybe_has_default_routerx   s    rD   has_default_routeNetworkState.has_default_route   s+    ""*&*&C&C&ED#&&&rF   Nc              #      #    U R                   R                  S0 5      nUR                  5        H  nUc  Uv   M  U" U5      (       d  M  Uv   M!     g 7f)Nr!   )rq   rs   values)r\   filter_funcifacesifaces       rD   iter_interfacesNetworkState.iter_interfaces   sH     $$((r:]]_E"u%%K %s   AA
	Ac              #      #    U R                   R                  S/ 5       H  nUb  U" U5      (       a  Uv   M  M  Uv   M!     g 7fNroutesrq   rs   )r\   r   routes      rD   iter_routesNetworkState.iter_routes   sD     ((,,Xr:E&u%%K &  ;s   AAc                 (   U R                  5        H  nU R                  U5      (       d  M    g   U R                  5        HO  nUR                  S/ 5       H6  nUR                  S/ 5       H  nU R                  U5      (       d  M        g   M8     MQ     g)NTsubnetsr   F)r   _is_default_router   rs   )r\   r   r   subnets       rD   r   %NetworkState._maybe_has_default_route   s    %%'E%%e,, ( ))+E))Ir2#ZZ"5E--e44# 6 3 ,
 rF   c                 d    SnUR                  S5      S:H  =(       a    UR                  S5      U;   $ )N)z::z0.0.0.0prefixr   network)rs   )r\   r   default_netss      rD   r   NetworkState._is_default_route   s0    (IIh1$M9)=)M	
rF   c                 8    0 nSU;   a  US   US'   U " SU040 UD6$ )zInstantiates a `NetworkState` without interpreting its data.

That means only `config` and `version` are copied.

:param network_state: Network state data.
:return: Instance of `NetworkState`.
r   r   rS   )clsr   r_   s      rD   to_passthroughNetworkState.to_passthrough   s5     % -i 8F9Hm,777rF   )rt   rq   rr   rn   rH   )rT   rU   rV   rW   NETWORK_STATE_VERSIONdictintru   propertyr   r   r   r   r   r   r   r   r   classmethodr   rX   rS   rF   rD   rk   rk      s    2G'!',/' - - -       ' '
 	
 84 8N 8 8rF   rk   c                      \ rS rSr0 / / / S.SSS.r\SS4 S+S jjr\S\4S j5       r	\S	 5       r
\
R                  S
 5       r
S rS rS rS rS,S jrS,S jrS,S jr\" S/5      S 5       r\" S/5      S 5       r\" / SQ5      S 5       r\" / SQ5      S 5       r\" SS/5      S 5       r\" S/5      S 5       rS r\" S/5      S 5       r\" S/5      S 5       r\" S /5      S! 5       rS" rS# rS$ r S% r!S& r"S-S' jr#S.S( jr$S) r%S*r&g)/NetworkStateInterpreter   r$   r   FN)r!   r   r}   rn   r   c                    Xl         X l        [        R                  " U R                  5      U l        X R
                  S'   SU l        0 U l        X0l        U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                   U R"                  U R$                  U R&                  U R(                  U R*                  S.U l        g )Nr   F)r:   bondsr;   bridges	ethernets
infinibandloopback
nameserverphysicalr   vlanvlanswifis)rr   _configro   rp   initial_network_staterq   _parsed_interface_dns_map	_rendererhandle_bondhandle_bondshandle_bridgehandle_bridgeshandle_ethernetshandle_infinibandhandle_loopbackhandle_nameserverhandle_physicalhandle_routehandle_vlanhandle_vlanshandle_wifiscommand_handlers)r\   r   r   r%   s       rD   ru    NetworkStateInterpreter.__init__   s      "mmD,F,FG(.H%(*!$$&&((**..00,,00,,&&$$&&&&!
rF   r>   c                    SSK Jn  U R                  S:X  aO  [        U R                  U5      (       a4  [
        R                  S5        [        R                  U R                  5      $ [        U R                  U R                  S9$ )Nr   r      zPassthrough netplan v2 configr   )cloudinit.net.netplanr   rr   
isinstancer   LOGdebugrk   r   r   rq   )r\   NetplanRenderers     rD   r   %NetworkStateInterpreter.network_state   sZ    E==A*T^^_"M"MII56..t||<<D//GGrF   c                 8    U R                   R                  S5      $ Nrn   r   rx   s    rD   rn    NetworkStateInterpreter.use_ipv6  s    ""&&z22rF   c                 >    U R                   R                  SU05        g r   )rq   update)r\   vals     rD   rn   r     s    ""J#45rF   c                 v    U R                   U R                  U R                  S.n[        R                  " U5      $ )Nr   )rr   r   rq   r   dumps)r\   states     rD   dumpNetworkStateInterpreter.dump  s1    }}ll!00

 ~~e$$rF   c                 >   SU;  a   [         R                  S5        [        S5      e[        US      n[	        X!5      nU(       a%  SU-  n[         R                  U5        [        U5      eU Vs/ s H  oUS;  d  M
  UPM     sn H  n[        XX   5        M     g s  snf )Nr   z$Invalid state, missing version fieldzInvalid state, missing keys: %sr   )r   error
ValueErrorNETWORK_STATE_REQUIRED_KEYSrO   setattr)r\   r   rb   r`   msgkrN   s          rD   loadNetworkStateInterpreter.load  s    E!II<=CDD3E)4DE 63|DCIIcNS/!  -E}!0DA}ECDuz* FEs   .	B;Bc                 B    [         R                  " U R                  5      $ rH   )r   r   rq   rx   s    rD   dump_network_state*NetworkStateInterpreter.dump_network_state'  s    ~~d1122rF   c                 4    U R                   U R                  S.$ )N)r   r   )rr   r   rx   s    rD   as_dictNetworkStateInterpreter.as_dict*  s    ==DLLAArF   c                     U R                   S:X  a  U R                  US9  SU l        g U R                   S:X  a  U R                  US9  SU l        g g )Nr   skip_brokenTr   )rr   parse_config_v1r   parse_config_v2)r\   r   s     rD   parse_config$NetworkStateInterpreter.parse_config-  sO    ==A  [ 9DL]]a  [ 9DL  rF   c                 >   U R                    H!  nUS   n U R                  U   n U" U5        M#     U R                  R                  5        H/  u  pgS n U R                  S   U   nU(       d  M#  Uu  pU	U
S.US	'   M1     g ! [         a  n[        SU-  5      UeS nAff = f! [         aD    U(       d  e [
        R                  SUSS9  [
        R                  U R                  5       5         M  f = f! [         a   n[        SR                  U5      5      UeS nAff = f)
Ntypez"No handler found for  command '%s'Skipping invalid command: %sTexc_infor!   zINameserver specified for interface {0}, but interface {0} does not exist!r   r}   )r   r   r   RuntimeErrorrQ   r   warningr   r   r   itemsrq   r   format)r\   r   r]   command_typehandlere	interfacer}   r   r$   r   s              rD   r   'NetworkStateInterpreter.parse_config_v15  s8   ||G"6?L//=
	9  $$ #55;;=NIE++L9)D u&)##.$ e >  "8<G " 9"KK6$    IId55789   88>y8I sA   B B!C2 
B
BB!A
C/.C/2
D<DDc                    SSK Jn  [        U R                  U5      (       a  g U R                  R                  5        H7  u  p4US;   a  M   U R                  U   n U" U5        U R                  U5        M9     g ! [         a  n[        SU-  5      UeS nAff = f! [         aD    U(       d  e [        R                  SUSS9  [        R                  U R                  5       5         M  f = f)Nr   r   )r   r%   z!No handler found for command '%s'r   Tr   )r   r   r   r   r   r   r   r   r   
_v2_commonrQ   r   r   r   r   )r\   r   r   r  r]   r  r  s          rD   r   'NetworkStateInterpreter.parse_config_v2X  s    Ednno66%)\\%7%7%9!L66//=

9 ( &:
  "7,F " 9"KK6$    IId55789s+   A9B9
BBBA
C('C(namec                 $    U R                  U5      $ rH   r   r\   r]   s     rD   r   'NetworkStateInterpreter.handle_loopbackt  s    ##G,,rF   c                 T   U R                   R                  S0 5      nUR                  US   0 5      nUR                  S0 5      R                  5        H  u  pEUR                  XE05        M     [	        UR                  S5      5      nU R
                  (       dV  U HP  nUR                  S5      R                  S5      (       d!  [        UR                  S5      5      (       d  MI  SU l          O   UR                  S	S
5      nUb  [        R                  " U5      nUR                  SS
5      n	U	b  [        R                  " U	5      n	UR                  SS
5      n
U
b  [        R                  " U
5      n
UR                  UR                  S5      UR                  S5      UR                  S5      UR                  S5      SSUR                  S5      S
S
UUU	U
S.5        UR                  SUR                  S5      5      nU R                   S   R                  X05        U R                  5         g
)z
command = {
    'type': 'physical',
    'mac_address': 'c0:d6:9f:2c:e8:80',
    'name': 'eth0',
    'subnets': [
        {'type': 'dhcp4'}
     ],
    'accept-ra': 'true'
}
r!   r
  paramsr   r   6addressTr(   Nr'   r)   	config_idmac_addressinetmanualr#   )r  r
  r   r  r  r*   r#   r  gatewayr   r(   r'   r)   )rq   rs   r   r   _normalize_subnetsrn   endswithr   r	   is_truer   )r\   r]   r!   r   paramr   r   r   	accept_rar'   r)   	iface_keys               rD   r   'NetworkStateInterpreter.handle_physicalx  s    ((,,\2>
wv3!++h399;JELL%& < %W[[%;< }}!::f%..s33JJy)8 8 %)DM " KKT2	 Y/IKKT2	 Y/I;;z40||H-H$[[5F+F+&{{=9 {{5)"&&$	
" KKW[[-@A	L)00)1CD!rF   )r
  vlan_id	vlan_linkc                    U R                   R                  S0 5      nU R                  U5        UR                  UR                  S5      0 5      nUR                  S5      US'   UR                  S5      US'   UR                  US   U05        g)z
auto eth0.222
iface eth0.222 inet static
        address 10.10.10.1
        netmask 255.255.255.0
        hwaddress ether BC:76:4E:06:96:B3
        vlan-raw-device eth0
r!   r
  r   zvlan-raw-devicer  N)rq   rs   r   r   )r\   r]   r!   r   s       rD   r   #NetworkStateInterpreter.handle_vlan  s     ((,,\2>
W%w{{62B7#*;;{#; ";;y1i5=%01rF   )r
  bond_interfacesr  c                    U R                  U5        U R                  R                  S5      nUR                  UR                  S5      0 5      nUR                  S5      R                  5        H  u  pEUR	                  XE05        M     UR	                  SS05        U R                  S   R	                  US   U05        UR                  S5       H  nXb;  a  USS.nU R                  U5        U R                  R                  S0 5      nUR                  U5      nUR                  S5      US	'   UR                  S5      R                  5        H  u  pEUR	                  XE05        M     U R                  S   R	                  Xh05        M     g
)a  
#/etc/network/interfaces
auto eth0
iface eth0 inet manual
    bond-master bond0
    bond-mode 802.3ad

auto eth1
iface eth1 inet manual
    bond-master bond0
    bond-mode 802.3ad

auto bond0
iface bond0 inet static
     address 192.168.0.10
     gateway 192.168.0.1
     netmask 255.255.255.0
     bond-slaves none
     bond-mode 802.3ad
     bond-miimon 100
     bond-downdelay 200
     bond-updelay 200
     bond-lacp-rate 4
r!   r
  r  zbond-slavesnoner#  r:   )r
  r   zbond-masterN)r   rq   rs   r   r   )	r\   r]   r!   r   r  r   ifnamecmdbond_ifs	            rD   r   #NetworkStateInterpreter.handle_bond  sZ   6 	W%((,,\:
w{{62B7!++h/557JELL%& 8mV,-L)00%-1GH kk"34F'""
 $$S),,00rBJ nnV,G%,[[%8GM"%kk(399;
|, <-44f5FG 5rF   bridge_interfacesc                    U R                   R                  S0 5      nUR                  S5       H  nX2;   a  M
  SU0nU R                  U5        M!     U R                   R                  S0 5      nU R                  U5        UR                  UR                  S5      0 5      nUS   US'   UR                  S0 5      R                  5        H  u  pgUR	                  Xg05        M     UR                  S5      nUbR  [        U[        5      (       d=  US;   a  S	nO!US
;   a  SnO[        SR                  US95      eUR	                  SU05        UR	                  US   U05        g)a  
    auto br0
    iface br0 inet static
            address 10.10.10.1
            netmask 255.255.255.0
            bridge_ports eth0 eth1
            bridge_stp off
            bridge_fd 0
            bridge_maxwait 0

bridge_params = [
    "bridge_ports",
    "bridge_ageing",
    "bridge_bridgeprio",
    "bridge_fd",
    "bridge_gcint",
    "bridge_hello",
    "bridge_hw",
    "bridge_maxage",
    "bridge_maxwait",
    "bridge_pathcost",
    "bridge_portprio",
    "bridge_stp",
    "bridge_waitport",
]
r!   r*  r
  bridge_portsr  r8   N)on1r   T)off0r   Fz2Cannot convert bridge_stp value ({stp}) to boolean)r.   )	rq   rs   r   r   r   r   boolr   r  )	r\   r]   r!   r&  r'  r   r  r   r8   s	            rD   r   %NetworkStateInterpreter.handle_bridge  sZ   > ((,,\2>
kk"56F# C   % 7 ((,,\2>
W%w{{62B7 '(; <n!++h399;JELL%& < YY|,
!*Z*F*F^+!
."
 %v*v5  LL,
345=%01rF   c                 &    U R                  U5        g rH   r  r  s     rD   r   )NetworkStateInterpreter.handle_infiniband<  s    W%rF   c                    / n/ nSU;   a7  US   n[        U[        5      (       d  U/nU H  nUR                  U5        M     SU;   a7  US   n[        U[        5      (       d  U/nU H  nUR                  U5        M     X#4$ )Nr  r   )r   listappend)r\   r]   r$   r   addrsaddrpathspaths           rD   
_parse_dns"NetworkStateInterpreter._parse_dns@  s    I&EeT**""4( wH%EeT**d# ""rF   r  c                     U R                   R                  S5      nU R                  U5      u  p4SU;   a  UU4U R                  US   '   g US   R	                  U5        US   R	                  U5        g )Nr}   r  r$   r   )rq   rs   r<  r   extend)r\   r]   r}   r$   r   s        rD   r   )NetworkStateInterpreter.handle_nameserverQ  su    !!%%e,"oog6'!=D##GK$89
 %%k2M  (rF   c                 r    U R                   R                  S5      nU R                  U5      u  pEXES.X2   S'   g )Nr!   r   r}   )rq   rs   r<  )r\   r]   r   _ifacer$   r   s         rD   _handle_individual_nameserver5NetworkStateInterpreter._handle_individual_nameserver^  s8    $$((6"oog6/:MerF   destinationc                 R    U R                   S   R                  [        U5      5        g r   )rq   r7  _normalize_router  s     rD   r   $NetworkStateInterpreter.handle_routed  s!    H%,,-=g-FGrF   c                 $    U R                  USS9  g)a  
v2_command = {
  bond0: {
    'interfaces': ['interface0', 'interface1'],
    'parameters': {
       'mii-monitor-interval': 100,
       'mode': '802.3ad',
       'xmit_hash_policy': 'layer3+4'}},
  bond1: {
    'bond-slaves': ['interface2', 'interface7'],
    'parameters': {
        'mode': 1,
    }
  }
}

v1_command = {
    'type': 'bond'
    'name': 'bond0',
    'bond_interfaces': [interface0, interface1],
    'params': {
        'bond-mode': '802.3ad',
        'bond_miimon: 100,
        'bond_xmit_hash_policy': 'layer3+4',
    }
}

r:   cmd_typeN_handle_bond_bridger  s     rD   r   $NetworkStateInterpreter.handle_bondsi  s    : 	  6 :rF   c                 $    U R                  USS9  g)a_  
v2_command = {
  br0: {
    'interfaces': ['interface0', 'interface1'],
    'forward-delay': 0,
    'stp': False,
    'maxwait': 0,
  }
}

v1_command = {
    'type': 'bridge'
    'name': 'br0',
    'bridge_interfaces': [interface0, interface1],
    'params': {
        'bridge_stp': 'off',
        'bridge_fd: 0,
        'bridge_maxwait': 0
    }
}

r;   rJ  NrL  r  s     rD   r   &NetworkStateInterpreter.handle_bridges  s    . 	  8 <rF   c                    [        5       nUR                  5        GHH  u  p4USS.nUR                  S0 5      nUR                  SS5      nU(       d   [        R	                  SU[        U5      5        XuS'   UnUR                  S5      n	U	(       a  U	nO2U(       a+  U(       a$  UR                  5       n
[        U
5      nU(       a  UnXS	'   UR                  S
S5      nU(       a  S
U0US'   S H  nX;   d  M
  XM   X]'   M     [        U5        U R                  U5      n[        U5      S:  a  UR                  SU05        [        R	                  SU5        U R                  U5        GMK     g)a  
ethernets:
  eno1:
    match:
      macaddress: 00:11:22:33:44:55
      driver: hv_netvsc
    wakeonlan: true
    dhcp4: true
    dhcp6: false
    addresses:
      - 192.168.14.2/24
      - 2001:1::1/64
    gateway4: 192.168.14.1
    gateway6: 2001:1::2
    nameservers:
      search: [foo.local, bar.local]
      addresses: [8.8.8.8, 8.8.4.4]
  lom:
    match:
      driver: ixgbe
    set-name: lom1
    dhcp6: true
    accept-ra: true
  switchports:
    match:
      name: enp2*
    mtu: 1280

command = {
    'type': 'physical',
    'mac_address': 'c0:d6:9f:2c:e8:80',
    'name': 'eth0',
    'subnets': [
        {'type': 'dhcp4'}
     ]
}
r   )r  r   r"   
macaddressNzHNetworkState Version2: missing "macaddress" info in config entry: %s: %sr  r&   r
  driverr  )r#   r"   r'   r(   r)   r   r   z!v2(ethernets) -> v1(physical):
%s)r   r   rs   r   r   strlowerr
   rE   _v2_to_v1_ipcfglenr   r   )r\   r]   ifaces_by_macethcfgphy_cmdr"   r  r
  set_namelcase_mac_addressmacrS  rN   r   s                  rD   r   (NetworkStateInterpreter.handle_ethernets  sQ   Z ./HC "G GGGR(E))L$7K		.H	 &1M" Dwwz*H$/$5$5$7!23DED"FOYYx.F%-v$6!M:#&8GL N (,**3/G7|a	734II:GD  )] (rF   c                 f   UR                  5        H  u  p#SUUR                  S5      UR                  S5      S.nSU;   a  US   US'   [        U5        U R                  U5      n[	        U5      S:  a  UR                  SU05        [        R                  SU5        U R                  U5        M     g	)
z
v2_vlans = {
    'eth0.123': {
        'id': 123,
        'link': 'eth0',
        'dhcp4': True,
    }
}

v1_command = {
    'type': 'vlan',
    'name': 'eth0.123',
    'vlan_link': 'eth0',
    'vlan_id': 123,
    'subnets': [{'type': 'dhcp4'}],
}
r   idlink)r   r
  r  r   r#   r   r   zv2(vlans) -> v1(vlan):
%sN)	r   rs   rE   rV  rW  r   r   r   r   )r\   r]   r   rZ  vlan_cmdr   s         rD   r   $NetworkStateInterpreter.handle_vlans   s    $ !ID774= WWV_	H |"%e*',**3/G7|aG 45II2H=X& )rF   c                 .    [         R                  S5        g )NzOWifi configuration is only available to distros with netplan rendering support.)r   r   r  s     rD   r   $NetworkStateInterpreter.handle_wifis"  s    *	
rF   c                 H   [         R                  SU5        UR                  5        Hx  u  p#SU;   d  M  UR                  S5      R                  S5      nUR                  S5      R                  S5      nSS0nU(       a  XFS'   U(       a  XVS'   U R	                  Xb5        Mz     g )Nzv2_common: handling config:
%sr$   r   r   r   r   r  )r   r   r   rs   rC  )r\   rZ  r   dev_cfgr   r}   name_cmds          rD   r  "NetworkStateInterpreter._v2_common(  s    		3S9!iikNE' ]377Akk-044[A"L1)/X&*-Y'228C *rF   c                   ^
 [        S [        R                  U5      R                  5        5       5      m
UR                  5        GH>  u  p4[        S UR                  5        5       5      nUR                  S0 5      nUR	                  SS5      nU(       a  XvS'   SUSUUS	-   UR                  S
5      S[        U
4S jUR                  5        5       5      0nSU;   a  US   US'   [        U5        U R                  U5      n	[        U	5      S:  a  UR                  SU	05        [        R                  SX"U5        US:X  a  U R                  U5        GM  US:X  a  U R                  U5        GM)  [        SR                  US95      e   g)z(Common handler for bond and bridge typesc              3   ,   #    U  H
  u  pX!4v   M     g 7frH   rS   .0r   vs      rD   	<genexpr>>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>:  s      
EtqQFEs   c              3   D   #    U  H  u  pU[         ;  d  M  X4v   M     g 7frH   )NETWORK_V2_KEY_FILTER)rn  rN   values      rD   rp  rq  ?  s&      $4LS33 $4s    
 
parameterszgratuitious-arpNr+   r   r
  _interfacesr!   r  c              3   6   >#    U  H  u  pTU   U4v   M     g 7frH   rS   )rn  r   ro  v2key_to_v1s      rD   rp  rq  O  s     N~tqA2~s   r#   r   r   zv2(%s) -> v1(%s):
%sr;   r:   z Unknown command type: {cmd_type}rJ  )r   r<   rs   r   poprE   rV  rW  r   r   r   r   r   r   r  )r\   r]   rK  	item_nameitem_cfgitem_paramsr  
grat_valuev1_cmdr   rx  s             @rD   rM  +NetworkStateInterpreter._handle_bond_bridge6  s{     
/33H=CCE
 
 $+==?I $,NN$4 K !__\26F$5t<J+5'( 	=((,,|*D$Nv||~NN	F   (u'1**84G7|ay'23II-x6J8#""6*V#  ( 6==!) >  C $3rF   c                 |   S n/ nUR                  S5      (       a.  SS0nU" UR                  S0 5      U5        UR                  U5        UR                  S5      (       a5  SS0nSU l        U" UR                  S0 5      U5        UR                  U5        SnSn0 nUR                  S	/ 5       H  nS
US.nSU;   a.  SU;   a'  Uc$  UR                  S5      nUR                  SU05        O-SU;   a'  Uc$  UR                  S5      nUR                  SU05        SU;   an  U(       dg  UR                  S5      R                  S	5      n	U	(       a  XS'   UR                  S5      R                  S5      n
U
(       a  XS'   UR                  U5        UR                  U5        M     / nUR                  S/ 5       H^  nUR                  [	        UR                  S5      UR                  S5      UR                  S5      UR                  S5      S.5      5        M`     [        U5      (       a  [        U5      (       a  XS   S'   U$ )z7Common ipconfig extraction from v2 to v1 subnets array.c                 "    SU ;   a	  U S   US'   g g )Nzroute-metricmetricrS   )	overridesr   s     rD   _add_dhcp_overridesDNetworkStateInterpreter._v2_to_v1_ipcfg.<locals>._add_dhcp_overridesh  s    *#,^#<x  +rF   r   r   r   r   Tr   Nr   static)r   r  :r    r  r   r$   r   r   
dns_searchr   toviar  r#   )rE  r  r  r#   r   )rs   r7  rn   r   rG  rW  )r\   rZ  r  r   r   r   r    r$   r  r   r   r   r   s                rD   rV  'NetworkStateInterpreter._v2_to_v1_ipcfge  s   	= 777g&F(92 >GNN6"777g&F DM(92 >GNN6"ww{B/G "F
 g~$)9"wwz2HMM9h"78$)9"wwz2HMM9h"78#KGGM266{C	5> 12/33H=06-k*NN6"1 04 WWXr*EMM ',yy#(99U#3"'))H"5$yy/		 + w<<CKK#)AJx rF   )r   r   rq   r   r   rr   r   rn   )r%   zOptional[Renderer])T)r>   NrH   )'rT   rU   rV   rW   r   r   ru   r   rk   r   rn   setterr   r   r   r   r   r   r   ri   r   r   r   r   r   r   r<  r   rC  r   r   r   r   r   r   r  rM  rV  rX   rS   rF   rD   r   r      s   
 	 &)-	
 '	
: H| H H 3 3 __6 6%+ 3B !F98 &"- #- &":" #:"x 9:2 ;2  >?2H @2Hh &"567>2 8>2@ &"& #&#" )%
) &
) )%N &N
 -)H *H;>=2]*~ 'D
D-^ArF   r   c                 ^   [         R                  " U 5      n [        S U R                  5        5       5      nU R	                  S5      S;   a  UR                  [        USS95        U R	                  S/ 5       Vs/ s H  n[        U5      PM     snUS'   S nS H  nU" X5        M     U$ s  snf )	Nc              3   >   #    U  H  u  pU(       d  M  X4v   M     g 7frH   rS   rm  s      rD   rp  $_normalize_subnet.<locals>.<genexpr>  s     @NDAa!Ns   
r   )r  static6)r  
ip_addressaddress_keysr   c                 h    X;   a-  [        X   [        5      (       d  X   R                  5       X'   g g g rH   )r   r6  split)snetr
  s     rD   listify"_normalize_subnet.<locals>.listify  s.    <
4:t < <))+DJ !=<rF   )r  r   )ro   rp   r   r   rs   r   _normalize_net_keysrG  )r   normal_subnetrr  r   s        rD   _normalize_subnetr    s    ]]6"F@FLLN@@Mzz&22	
 &,ZZ"%=%=%=M(, /! / s   9B*c                 t   U R                  5        VVs0 s H  u  p#U(       d  US:X  d  M  X#_M     nnnSnU H  nUR                  U5      (       d  M  Un  O   U(       d9  SSR                  U5      < SU < 3n[        R	                  U5        [        U5      e[        UR                  U5      5      n[        U5      (       d%  [        R	                  SU5        [        SU S35      e[        U5      n	[        U5      n
UR                  S	5      nS
U;   ac  UR                  S
5      u  pnXU'   U	(       a  [        U5      nOU
(       a  [        U5      nOy[        R	                  SU5        [        SU S35      eSU;   a  [        US   5      nO?U(       a  U
(       a  [        U5      nO%U(       a  U	(       a  [        U5      nOU	(       a  SOSnSU;   a2  [        US   5      [        U5      :w  a  [        R                  SUU5        XS'   U	(       a  S	U;   a  US		 U$ U
(       a  [        US   5      US	'   U$ s  snnf )a  Normalize dictionary network keys returning prefix and address keys.

@param network: A dict of network-related definition containing prefix,
    netmask and address_keys.
@param address_keys: A tuple of keys to search for representing the address
    or cidr. The first address_key discovered will be used for
    normalization.

@returns: A dict containing normalized prefix and matching addr_key.
r   Nz No config network address keys [,z] found in z$Address %s is not a valid ip networkzAddress z is not a valid ip addressnetmask/r   @      z;Overwriting existing 'prefix' with '%s' in network info: %s)r   rs   joinr   r   r   rT  r   r   r   	partitionr   r   r   r   r   )r   r  r   ro  netaddr_keyrN   messager9  ipv6ipv4r  	addr_part_maybe_prefixr   s                   rD   r  r    s    $MMO
;ODAqAF414OC
;H773<<H  HH\"
 			'!!swwx !D		8$?8D6)CDEE4 D4 Dggi G
d{%)^^C%8"	l!H,\:F,\:F II<dCxv-GHII	SS]#	T(1	T(133s8}-V<I	

 M I J 
0X?IJ} <s
   H4H4c                 F   [        S U R                  5        5       5      nSU;   a  US   US'   US	 UR                  [        USS95        UR	                  S5      nU(       a   [        U5      US'   U$ U$ ! [         a   n[        SR                  U5      5      UeSnAff = f)	ag  normalize a route.
return a dictionary with only:
   'type': 'route' (only present if it was present in input)
   'network': the network portion of the route as a string.
   'prefix': the network prefix for address as an integer.
   'metric': integer metric (only if present in input).
   'netmask': netmask (string) equivalent to prefix iff network is ipv4.
c              3   <   #    U  H  u  pUS ;  d  M  X4v   M     g7f)) NNrS   rm  s      rD   rp  #_normalize_route.<locals>.<genexpr>  s       (41AZ,?=s   
rE  r   )r   rE  r  r  z(Route config metric {} is not an integerN)	r   r   r   r  rs   r   r   	TypeErrorr  )r   normal_router  r  s       rD   rG  rG    s       ;;= L $".}"=Y''A	
 h'F	%([L"
 <	  	:AA&I	s   $A6 6
B  BB c                 V    U (       d  / n U  Vs/ s H  n[        U5      PM     sn$ s  snf rH   )r  )r   ss     rD   r  r  4  s(    *12'Qa '222s   &
net_configr   c                     SnU R                  S5      nU R                  S5      nUS:X  a  U nU(       a(  Ub%  [        XEUS9nUR                  US9  UR                  nU(       d  [	        SU  35      eU$ )z^Parses the config, returns NetworkState object

:param net_config: curtin network config dict
Nr   r   r   )r   r   r%   r   zpNo valid network_state object created from network config. Did you specify the correct version? Network config:
)rs   r   r   r   r   )r  r   r%   r   r   r   nsis          rD   parse_net_config_datar  :  s     EnnY'G^^H%F!| 6%%X
 	[1!!El
 	
 LrF   )rS   )TN)/ro   re   loggingtypingr   r   r   r   	cloudinitr   r   r	   cloudinit.netr
   r   r   r   r   r   r   r   r   cloudinit.net.rendererr   	getLoggerrT   r   r   r   rs  r<   rT  __annotations__r   rE   rO   	ExceptionrQ   ri   rk   r   r  r  rG  r  r1  r  rS   rF   rD   <module>r     s^      5 5 / /
 
 
 /! -  * &+-+&4%-%-!!:"!7$ ''$$"&*%/ $sDcN*+ D
d 
t 
	Y 	$S8 S8lQ Qh:IXD3  	rF   