+
    i_                         ^ RI t ^ RIHt ^ RIHtHtHtHtHtH	t	 ^ RI
HtHt ^ RIHtHt ^ RIHt ] P$                  ! ]4      tR R ltR	 R
 lt ! R R4      t ! R R]P0                  4      tRR ltR# )    N)defaultdict)AnyCallableDictListOptionalTuple)subputil)renderershould_add_gateway_onlink_flagNetworkStatec                    V ^8  d   QhR\         \        \        \        ,          3,          R\         \        \        \        ,          3,          /#    datareturn)r   strr   r   )formats   "8/usr/lib/python3/dist-packages/cloudinit/net/networkd.py__annotate__r      s4     	 	Dd3i( 	T#tCy.-A 	    c                V    / pV P                  4        F  w  r#\        V4      W&   K  	  V# )z
Normalize a dictionary of lists.
- Assumes top-level keys map to lists.
- Each list and any nested dicts/lists will be recursively normalized.
)items_normalize_value)r   
normalizedkeyvalues   &   r   	normalizer       s-     Jjjl
*51
 #r   c                0    V ^8  d   QhR\         R\         /# r   )r   )r   s   "r   r   r      s      3 3 r   c                z   \        V \        4      '       d*   / p\        V 4       F  p\        W,          4      W&   K  	  V# \        V \        4      '       dS   . pV  F>  p\        V\        \        34      '       d   \        V4      pMTpVP                  V4       K@  	   \        V4      # V #   \         d    Tu # i ; i)z
Recursively normalize a dictionary or list:
- Dicts: keys sorted, values normalized
- Lists: items normalized and sorted (if comparable)
)
isinstancedictsortedr   listappend	TypeError)r   r   r   normalized_itemsitemnormalized_items   &     r   r   r      s     $
$<C.ty9JO  	D$		D$t--"24"8"&##O4 	$*++ K  	$##	$s   
B* *B:9B:c                   8   a  ] tR t^9t o R tR tR tR tRtV t	R# )	CfgParserc                D    R . R. R. R. R. R. R/ R. R. R	. R
. R/ /V n         R# )MatchLinkNetworkDHCPv4DHCPv6AddressRouteNetDevVLANBondBridgeRoutingPolicyRuleN	conf_dict)selfs   &r   __init__CfgParser.__init__:   sG    RBrbbrRbBBb
r   c                `   V P                   P                  4        F  pWA8X  g   K  V P                   V,          P                  V R V 24       \        \        P                  V P                   V,          4      4      V P                   V&   V P                   V,          P                  4        K  	  R# )=Nr<   keysr'   r&   r$   fromkeyssort)r=   secr   valks   &&&& r   update_sectionCfgParser.update_sectionJ   sy    $$&Axq!((C5#8$(t~~a7H)I$Jq!q!&&(	 'r   c                   V P                   P                  4        F  pWQ8X  g   K  W P                   V,          9  d   . V P                   V,          V&   V P                   V,          V,          P                  V RV 24       \        \        P                  V P                   V,          V,          4      4      V P                   V,          V&   V P                   V,          V,          P                  4        K  	  R# )zs
For each route section we use rid as a key, this allows us to isolate
this route from others on subsequent calls.
rA   NrB   )r=   rF   ridr   rG   rH   s   &&&&& r   update_route_sectionCfgParser.update_route_sectionQ   s    
 $$&AxnnQ//-/DNN1%c*q!#&--Qsen=)-MM$.."3C"89*q!#& q!#&++- 'r   c                   R p\        V P                  4      V n        \        V P                  P                  4       4       F  w  r#V'       g   K  VR8X  d%   \        V4       F  pVRV RV R2,          pK  	  K:  VR9   dN   \        V4       F<  pVRV R2,          p\        W5,          4       F  pW R2,          pK  	  VR,          pK>  	  K  VRV R2,          p\        V4       F  pW R2,          pK  	  VR,          pK  	  V# ) r4   [z]



)r5   r:   )r    r<   r%   r   )r=   contentsrH   vens   &     r   get_final_confCfgParser.get_final_confa   s    "4>>24>>//12DAI~A!A3c!D 11H #44A!A3c
*H#AD\ cH, *$H	 # as#J&A#R(H #D ! 3$ r   r;   N)
__name__
__module____qualname____firstlineno__r>   rI   rM   rX   __static_attributes____classdictcell____classdict__s   @r   r-   r-   9   s     
 ).  r   r-   c                   8  a  ] tR t^{t o RtR"R ltV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltR#R ltR$V 3R lR lltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR  ltR!tV tR# )%Rendererz
Renders network information in /etc/systemd/network

This Renderer is currently experimental and doesn't support all the
use cases supported by the other renderers yet.
Nc                v    V'       g   / pVP                  R R4      V n        VP                  RR4      V n        R# )resolve_conf_fnz/etc/systemd/resolved.confnetwork_conf_dirz/etc/systemd/network/N)getre   rf   )r=   configs   &&r   r>   Renderer.__init__   s:    F%zz; 
 !'

 7!
r   c                    < V ^8  d   QhRS[ /# r   cfgr-   )r   ra   s   "r   r   Renderer.__annotate__   s       r   c                    R pRRRR/pVR,          R8X  d   RVR&   V'       g   R	# VP                  4        F5  w  rVWQ9   g   K  W,          '       g   K  VP                  W6W,          4       K7  	  VR,          # )
r/   nameNamedriverDrivertypephysical
MACAddressmac_addressN)r   rI   )r=   ifacerl   rF   
match_dictrH   rU   s   &&&    r   generate_match_sectionRenderer.generate_match_section   st    Fh


 =J&(4J}%$$&DAzehh""3584 ' V}r   c                    < V ^8  d   QhRS[ /# rk   rm   )r   ra   s   "r   r   rn      s     ? ?	 ?r   c                X   R pV'       g   R# VP                  R4      '       d   VP                  VRVR,          4       VR,          R8w  d2   VP                  R4      '       d   VP                  VRVR,          4       RV9   d'   VR,          '       d   VP                  VR	R
4       R# R# R# )r0   NmtuMTUBytesrt   ru   rw   rv   optionalRequiredForOnlineno)rg   rI   )r=   rx   rl   rF   s   &&& r   generate_link_sectionRenderer.generate_link_section   s    99UsJe==J&599]+C+CsL%2FG5#4#4s$7> $5r   c                    < V ^8  d   QhRS[ /# rk   rm   )r   ra   s   "r   r   rn      s     D D9 Dr   c                    RpRRRRRRRR	/pR
pRV9   d   RVR,           2pVP                  4        F5  w  rxWu9  d   K  VR8X  d	   W,          pVP                  WAWW,          V4       K7  	  R# )za
Parse a route and use rid as a key in order to isolate the route from
others in the route dict.
r5   gatewayGatewaynetworkDestinationmetricMetrictableTablerP   prefix/N)r   rM   )	r=   rL   confrl   rF   route_cfg_mapr   rH   rU   s	   &&&&     r   parse_routesRenderer.parse_routes   s    
 y}hW	
 th()FJJLDA%I~$$S}/?C !r   c                    < V ^8  d   QhRS[ /# rk   rm   )r   ra   s   "r   r   rn      s     ? ?	 ?r   c           	     (   R pRp^ pVP                  R. 4       EF  pVR,          pVR9   d   VR 8X  d   RpM$VR8X  d   RpMVR8X  d   VR 8X  d   RpM	VR8X  d   RpRV9   d>   VR,          '       d/   VR,           F!  pV P                  R	V 2W4       V^,           pK#  	  R
V9   g   K  VR
,          p	RV9   d   V	RVR,           2,          p	R
RRRRRRR/p
VP                  4        F  w  rVR
8X  d   VP                  RW,          V	4       K'  VR8X  dh   VP	                  RRV 2W,          V4       \        W4      '       d/   \        P                  RVV	4       VP	                  RRV 2RR4       V^,           pK  VR9   g   K  VP                  WJV,          RP                  V4      4       K  	  EK  	  VP                  VRV4       \        VP                  R4      \        4      '       d'   R pVR,          '       d   RpVP                  VRV4       V# )r   r1   subnetsrt   ipv4ipv6yesdhcp6routesraddressr   r   r4   r   r   dns_nameserversDNS
dns_searchDomainsr5   azGGateway %s is not contained within subnet %s, adding GatewayOnLink flagGatewayOnLink DHCPz	accept-raIPv6AcceptRA>   dhcpdhcp4>   r   r   )rg   r   r   rI   rM   r   LOGdebugjoinr#   bool)r=   rx   rl   r   rF   rL   rV   tiaddrsubnet_cfg_maprH   rU   rG   s   &&&           r   parse_subnetsRenderer.parse_subnets   s   9b)A&	A%%4<!DV^ Dg4<!DV^ D1}88A %%#i8'C	 %
 A~|q=a(}--Dyy%u )	" GGIDAI~**9n6GNi 00#qY0A1 :!BBII!= ! $	  44 '1SEOU "Ag??**3q0A388A;O+ &9 *f 	3-eii,d33C[!!sNC8r   c                    < V ^8  d   QhRS[ /# rk   rm   )r   ra   s   "r   r   rn   
  s     ; ;) ;r   c                J   R	 Fl  pW19  d   K  \        W,          4      P                  4       p \        P                  ! V4      pV'       d   RMRpVR 8X  d   RpMRpVP                  VRV4       Kn  	  R#   \         d#    TR8w  d   \
        P                  RT4       Rp LQi ; i)
dhcp4domainr   r   routezInvalid dhcp4domain value - %sr2   r3   
UseDomainsN)r   dhcp6domain)r   casefoldr   translate_bool
ValueErrorr   warningrI   )r=   drl   r*   retsections   &&&   r   dhcp_domainRenderer.dhcp_domain
  s    2D}ag,'')C))#."e
 }$""wc: 3  '>KK @#FCs   "A55*B"!B"c                &   < V ^8  d   QhRS[ RS[/# )r   rl   ns)r-   r   )r   ra   s   "r   r   rn     s     I II I< Ir   c                   R pVP                  R4      pV'       g-   VP                  ^8X  d   RVP                  RVP                  /pMV'       g   VP                  ^8X  d   R# VP                  R4      '       d*   VP	                  VRRP                  VR,          4      4       VP                  R4      '       d,   VP	                  VRRP                  VR,          4      4       R# R# )r1   dnssearchnameserversNr   r   r   )rg   versiondns_searchdomainsr   rI   r   )r=   rx   rl   r   rF   r   s   &&&&  r   	parse_dnsRenderer.parse_dns  s    iirzzQ"..r11C q778sIsxxH/FG77=!!sE388C4F+GH "r   c                    < V ^8  d   QhRS[ /# rk   rm   )r   ra   s   "r   r   rn   -  s     P P	 Pr   c                (   R RRRRRRR/pVR8X  d   VP                  R	R
RRRRRRRR/4       RV R2V9   d[   VRRV 239   dM   VRV R2,          pVP                  4        F)  w  rxW9   g   K  VP                  RV 2WvV,          4       K+  	  R# R# R# )UseDNSzuse-dnsr   use-domainsUseHostnamezuse-hostnameUseNTPzuse-ntp4SendHostnamezsend-hostnameHostnamehostnameRouteMetriczroute-metricUseMTUzuse-mtu	UseRoutesz
use-routesr   
-overridesr   ipvDHCPvN)updater   rI   )	r=   rl   devicer   r   dhcp_config_mapsdhcp_overridesrH   rU   s	   &&&&&    r   parse_dhcp_overridesRenderer.parse_dhcp_overrides-  s    i->i	
 c>##"O
!>i '*%/D'O=
 5
 $d7):$>?N(..0&&&wi'8!A=NO 15
/r   c                    R p\         P                  RV4       V RV V 2pVP                  R4      '       d   VRR p\        P                  ! Wb4       \        P
                  ! WeV4       R# )zsystemd-networkz Setting Networking Config for %sz10-cloud-init-rR   N)r   r   endswithr   
write_filechownbyname)r=   linkr   nwk_dirextnet_fn_ownernet_fns   &&&&&  r   create_network_fileRenderer.create_network_fileI  s`    (		4d;9N4&6==  9D%|<r   c                :   < V ^8  d   QhRS[ RS[S[,          RR/# )r   network_state	templatesr   N)r   r   r$   )r   ra   s   "r   r   rn   T  s2     G G#G D>G
 
Gr   c                   V P                   pV'       d   \        P                  ! V4      V,           p\        P                  ! V4       V P                  V4      pVP                  R / 4      pVP                  R/ 4      pVP                  R/ 4      pVP                  4        F  w  rV P                  WV4       K  	  VP                  4        F  w  rV P                  WVRR7       K  	  VP                  4        F  w  rV P                  WVRR7       K  	  VP                  4        F  w  rV P                  WVRR7       K  	  R# )vlan_netdevbond_netdevbridge_netdevz.netdev)r   N)	rf   r
   target_pathr   
ensure_dir_render_contentpopr   r   )r=   r   r   targetnetwork_dirr   r   r   r   rH   rU   s   &&&&       r   render_network_stateRenderer.render_network_stateT  s    ++**62[@K$&&}5kk-4kk-4OR8MMODA$$Q;7 $  %%'DA$$Q;I$F (  %%'DA$$Q;I$F ( "'')DA$$Q;I$F *r   c                    < V ^8  d   QhRS[ /# rk   rm   )r   ra   s   "r   r   rn   q  s      i r   c                    ^ pRpV FF  pVP                  4        F&  w  rgVP                  WCVP                  4       V4       K(  	  V^,          pKH  	  R# )r   r:   N)r   rM   
capitalize)r=   policyrl   rL   r   rG   rH   rU   s   &&&     r   parseRoutingPolicyRenderer.parseRoutingPolicyq  sI    !C		((1<<>1E $1HC r   c                    < V ^8  d   QhRS[ /# )r   nsCfg)r   )r   ra   s   "r   r   rn   y  s     
 
D 
r   c                    / pR pR F<  pWA9  d   K  W,          P                  4        F  w  rVW69   g   K  Wc,          W%&   K  	  K>  	  V# )zrouting-policy)	ethernetsbondsvlansbridges)r   )r=   r  routingPoliciesr   r   rx   settingss   &&     r   extractRoutingPoliciesRenderer.extractRoutingPoliciesy  sN    AG##(>#7#7#9?-5]O* $: B r   c                    < V ^8  d   QhRS[ /# )r   r   r   )r   ra   s   "r   r   rn     s     m m, mr   c                6   / pV P                  V4      pVR ,          pVR,          pWBR &   V P                  V4      pVR,          pVR,          pWrR&   V P                  V4      p	V	R,          p
V	R,          pWR&   V P                  VP                  4      pVP                  4        EF  p\        4       pVR,          pVP                  V. 4      pV F  pVP                  RRV4       K  	  VP                  V4      pV'       d   V P                  VV4       VP                  V4      pV'       d   VP                  RR	V4       VP                  V4      pV'       d   VR
,          P                  V/ 4      P                  V4      pV'       d   VP                  RRV4       VR,          P                  V/ 4      P                  V4      pV'       d   VP                  RRV4       VP                  RRV4       V P                  W4      pV P                  W4       V P                  W4      pV P                  WV4       ^ pVP                  4        F"  pV P                  RV 2VV4       V^,           pK$  	  VP                   ^8X  d   VR,          pVP                  R,          P#                  4        F)  w  ppRV9   g   K  VP                  R4      V8X  g   K'  Tp M	  VVP                  R,          9   d   VP                  R,          V,          pV P%                  VV4       R FS  pRV R2V9   d2   RVP                  RV R2/ 4      9   d   V RV RV R2p\'        V4      hV P)                  VVVV4       KU  	  VP+                  VVP-                  4       /4       EK  	  V# )r   	vlan_linkr   	bond_linkr   bridge_linkrp   r1   r7   r8   	path-costr9   Costport-priorityPrioritycr  zset-namer   domainr   r   z has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)r   6)render_vlansrender_bondsrender_bridgesr  rh   iter_interfacesr-   rg   rI   r  rz   r   r   r   iter_routesr   r   r   r   RuntimeErrorr   r   rX   ) r=   r   ret_dict	vlan_dictr   r  	bond_dictr   r  bridge_dictr   r  r  rx   rl   
iface_namevlan_link_namer   rPolicybond_link_namebridge_link_namerG   r   r   rL   r   rp   dev_namedev_cfgr   r   	exceptions    &&                              r   r   Renderer._render_content  s   %%b)	.k*	"-%%b)	.k*	"-))"-#O4!-0$1!55bii@'')E+CvJ&]]:r:N#""9fa8 $ &))*5G''5&]]:6N""9fnE*z:,S)2.S_ 
 &&x=  0S)2.S_ 
 &&xSA""9h8HI..u:D&&u2%%e1DNN5r*C) !!AcU)UC8Ag	 * zzQ&+Fm *,;)?)E)E)G%Hg!W,";;z2d:#+D!	 *H
 299[11YY{3D9F $$VS1#-"7)62f< -%zzD	*DbI!J $(&wi @,,39 57!8 &
 #/y"9911#vtWM $. OOT3#5#5#789o *r r   c                &   < V ^8  d   QhRS[ RS[/# r   r   r   r   r$   )r   ra   s   "r   r   rn     s     %
 %
| %
 %
r   c                   \        \        4      p/ p\        P                  ! R 4      pVP	                  V4       EF!  pVR,          pVP                  R4      pVP                  R4      pVe   Vf   \        P                  RV4       KO  W(,          P                  V4       \        4       p	V	P                  RRV4       V	P                  RRR 4       VP                  R4      p
V
'       d   V	P                  RR	V
4       VP                  R
4      p
V
'       d"   V	P                  RRV
P                  4       4       V	P                  RRV4       V	P                  4       W6&   EK$  	  RVRV/# )vlanrp   vlan_idzvlan-raw-devicez)Skipping VLAN %s - missing 'id' or 'link'r6   rq   Kindr~   r   rw   rv   r7   Idr   r  )r   r&   r   filter_by_typer  rg   r   r   r'   r-   rI   lowerrX   )r=   r   vlan_link_infovlan_ndev_configsvlan_filterrx   r%  r3  parentrl   rG   s   &&         r   r  Renderer.render_vlans  sA   $T*--f5''4EvJii	*GYY01F&.? "))*5 +Cx<x8))E"C""8Z=))M*C""8\399;GvtW5,/,>,>,@)7 5< ,
 	
r   c                &   < V ^8  d   QhRS[ RS[/# r/  r0  )r   ra   s   "r   r   rn     s     L
 L
| L
 L
r   c           
        / p/ pR p\         P                  ! R4      p\         P                  ! R4      pVP                  V4       EF  pVR,          pVP                  V4       U	u. uF  p	V	R,          V8X  g   K  V	R,          NK  	  p
p	V
'       g   \        P                  RV4       Kd  TP                  V
 Uu/ uF  qwVbK  	  up4       \        4       pVP                  RRV4       VP                  RRR4       XP                  R4      pV'       d   VP                  RR	V4       VP                  R
4      pV'       d"   VP                  RRVP                  4       4       \        \        \        \        \        \        .\        3,          3,          3,          p/ RR\        3bRRR 3bRR\        3bRRR 3bRR\        3bRR\        3bRRR 3bRR\        3bRR \        3bR!R"\        3bR#R$\        3bR%R&R' 3bR(R)\        3bR*R+R, 3bR-R.\        3bR/R0\        3bR1R2\        3bpVP!                  4        F0  w  pw  ppW9   g   K  VP                  VVV! W,          4      4       K2  	  R3V9   dE   VR3,          p\#        V\        4      '       d   V.pVP                  VR4R5P%                  V4      4       VP'                  4       W8&   EK  	  R6VR7V/# u up	i u upi )8r8   bondzbond-masterrp   z'Skipping bond %s - missing 'interfaces'r6   rq   r4  r~   r   rw   rv   zbond-ad-selectAdSelectzbond-arp-intervalARPIntervalSecc                     V  R 2# ms rU   s   &r   <lambda>'Renderer.render_bonds.<locals>.<lambda>C  s
    QCr(r   zbond-arp-validateARPValidatezbond-downdelayDownDelaySecc                     V  R 2# rC  rE  rF  s   &r   rG  rH  E  s
    s"Xr   zbond-fail-over-macFailOverMACPolicyzbond-lacp-rateLACPTransmitRatezbond-miimonMIIMonitorSecc                     V  R 2# rC  rE  rF  s   &r   rG  rH  H  s
    aS8r   zbond-min-linksMinLinksz	bond-modeModezbond-num-grat-arpGratuitousARPzbond-primary-reselectPrimaryReselectPolicyzbond-updelay
UpDelaySecc                     V  R 2# rC  rE  rF  s   &r   rG  rH  M  s
    A3br   zbond-xmit-hash-policyTransmitHashPolicyzbond-all-slaves-activeAllSlavesActivec                 4    \        V 4      P                  4       # N)r   r7  rF  s   &r   rG  rH  Q  s    c!fllnr   zbond-arp-all-targetsARPAllTargetszbond-learn-packet-intervalLearnPacketIntervalSeczbond-packets-per-slavePacketsPerSlavezarp-ip-targetsARPIPTargetsr   r   r  )r   r6  filter_by_attrr  r   r   r   r-   rI   rg   r7  r   r   r	   r   objectr   r#   r   rX   )r=   r   bond_link_infobond_ndev_configsr   bond_filterslave_filterrx   r%  slave_ifacebond_slavesrl   rG   ParamMapType	param_mapr   option	formattertargetss   &&                 r   r  Renderer.render_bonds  sV   )+--f5..}=''4EvJ $&#5#5l#C#CK}-; $F###C  
 =z !!+"N+*#4+"NO +Cx<x8))E"C""8Z=))M*C""8\399;G  U3&30G+G%H HIL' :s"3'#&68J%K' $mS%9' !>3E"F	'
 %':C&@' !#5s";' 1CD' !:s"3' fc]' $os%;' (*A3)G' /A B' (*>)D' )%,+'$ '#(>%'& -/G.M''( )+<c*B)'I. -6OO,=((fi<&&w	%*8MN ->  5( 01gs++&iG""7NCHHW<MN,/,>,>,@)A 5F ,
 	
A #Os   $K9K7K
c                &   < V ^8  d   QhRS[ RS[/# r/  r0  )r   ra   s   "r   r   rn   i  s     A
 A
 A
$ A
r   c                   R / R/ R/ /p/ p\         P                  ! R4      pVP                  V4       EF  pVR,          pVP                  R. 4      pV'       g   \        P                  RV4       K?  V F  pWbV&   K	  	  \        4       p	V	P                  RRV4       V	P                  RR	R4       VP                  R
4      p
V
'       d   V	P                  RRV
4       VP                  R4      p
V
'       d"   V	P                  RRV
P                  4       4       RRRRRRRRRRRR/pVP                  4        FT  w  rVP                  V4      p
V
'       g   K   \        V
\        4      '       d   V
'       d   RMRp
V	P                  RW4       KV  	  VP                  R4      p
V
'       d   WR,          V&   VP                  R4      p
V
'       d   WR,          V&   V	P                  4       W6&   EK  	  RVR V/# )!
macaddressr  r  bridgerp   bridge_portsz)Skipping bridge %s - missing 'interfaces'r6   rq   r4  r~   r   rw   rv   bridge_ageingAgeingTimeSecbridge_bridgeprior  	bridge_fdForwardDelaySecbridge_helloHelloTimeSecbridge_maxage	MaxAgeSec
bridge_stpSTPr   r   r9   bridge_pathcostbridge_portprior   r  )r   r6  r  rg   r   r   r-   rI   r7  r   r#   r   rX   )r=   r   bridge_link_infobridge_ndev_configsbridge_filterrx   r%  rp  bridge_portrl   rG   rg  r   sysd_keys   &&            r   r  Renderer.render_bridgesi  s   "R,
 ! //9''6EvJ 99^R8L?   ,0:-  , +Cx<x:))E"C""8Z=))M*C""8\399;G  #Z.eI "+!2iin3!#t,,'*e&&x? "3 ))-.C<?-j9))-.C@C1*=.1.@.@.B+e 7j 0+
 	
r   )rf   re   rY  )z.network)NN)rZ   r[   r\   r]   __doc__r>   rz   r   r   r   r   r   r   r   r   r  r  r   r  r  r  r^   r_   r`   s   @r   rc   rc   {   s     
 &? ?D D2? ?D; ;$I I"P P8	=G G: 
 
m m^%
 %
NL
 L
\A
 A
r   rc   c                 h    R R.pRR.pV F#  p\         P                  ! W2R7      '       d   K"   R# 	  R# )ip	systemctlz	/usr/sbinz/bin)r   FT)r
   which)r   expectedr   ps   &   r   	availabler    s7    k"H6"Fzz!++  r   rY  )loggingcollectionsr   typingr   r   r   r   r   r	   	cloudinitr
   r   cloudinit.netr   r   cloudinit.net.network_stater   	getLoggerrZ   r   r    r   r-   rc   r  rE  r   r   <module>r     s[     # = =   B 4!	6? ?Do
x   o
dr   