
    W'Fg7                         S SK r S SKrS SKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  SS	KJr  SS
KJrJr  SSKJrJr  S r " S S\5      rg)    N   )Capabilities)pollhelpers)support)xmlutil)Guest)log)
NodeDevice)StoragePoolStorageVolume)URIMagicURIc                      Sn [        [        U 5      (       d$  [        [        U [        R                  " 5       5        [	        [        U 5      $ )zW
Lookup the local libvirt library version, but cache the value since
it never changes.
__virtinst_cached_getVersion)hasattrlibvirtsetattr
getVersiongetattr)keys    ./usr/share/virt-manager/virtinst/connection.py_real_local_libvirt_versionr      s8    
 )C7C  g00237C      c                      \ rS rSrSr\S 5       r\S 5       rS rS r	S r
\" \
5      rS r\" \5      rS	 rS
 rS rS rS rS rS rS rSrSrSrSrS rS rS rS rS rS r S r!S r"S r#S r$S r%S  r&S! r'S" r(S# r)S$ r*S% r+S& r,S' r-S( r.S) r/S* r0S+ r1S, r2S- r3S. r4S/ r5S0 r6S1 r7S2 r8S3 r9S4 r:S5 r;S6 r<S7 r=S8 r>S9 r?S: r@S;rAg<)=VirtinstConnection"   z
Wrapper for libvirt connection that provides various bits like
- caching static data
- lookup for API feature support
- simplified API wrappers that handle new and old ways of doing things
c                      [         R                  R                  S5      n U (       d  [         R                  R	                  S5      n [         R                  R                  U S5      $ )NXDG_CACHE_HOMEz~/.cachezvirt-manager)osenvirongetpath
expanduserjoin)rets    r   get_app_cache_dir$VirtinstConnection.get_app_cache_dir)   sA    jjnn-.''$$Z0Cww||C00r   c                  ,    [         R                  " 5       $ N)r   in_testsuite r   r   r*   VirtinstConnection.in_testsuite0   s    ##%%r   c                    U=(       d    Sn[         R                  " U5      (       a  [        U5      U l        U R                  R                  U l        U R                  R
                  =(       d    U R                  U l        U R                  R                  U l        U R                  R                  U l
        U R                  R                  U l        O(S U l        X l        X l        SU l        S U l        S U l
        S U l        S U l        S U l        [!        U R                  5      U l        S U l        0 U l        S U l        S U l        S U l        S U l        S U l        [2        R4                  " [6        R8                  " U 5      5      U l        g )N F)r   uri_is_magic
_magic_uriopen_uri	_open_urifakeuri_uripredictable_fake_conn_predictableconn_version_fake_conn_versionlibvirt_version_fake_libvirt_version_daemon_version_conn_version_libvirtconnr   _uriobj_caps_fetch_cachecb_fetch_all_domainscb_fetch_all_poolscb_fetch_all_volscb_fetch_all_nodedevscb_cache_new_poolr   SupportCacheweakrefproxy)selfuri_initial_uris      r   __init__VirtinstConnection.__init__4   s-   yb  ..&|4DO!__55DN//A4>>DI*.//*E*ED'&*oo&B&BD#)-)H)HD&"DO)N$I*/D')-D&&*D##! 499~
 %)!"&!%%)"!%++GMM$,?@r   c                 N    U R                   R                  S5      n[        X!5      $ )Nr=   )__dict__r!   r   )rI   attrlibvirtconns      r   __getattr__VirtinstConnection.__getattr__`   s!    mm''7{))r   c                 @    U R                   =(       d    U R                  $ r)   )r4   r2   rI   s    r   _get_uriVirtinstConnection._get_urie   s    yy*DNN*r   c                     U R                   (       dL  U R                  R                  5       n[        X5      U l         [        R
                  " SU R                  U5        U R                   $ )NzFetched capabilities for %s: %s)r?   r=   getCapabilitiesr   r	   debugr4   )rI   capsxmls     r   	_get_capsVirtinstConnection._get_capsi   sH    zz''779G%d4DJII7GLzzr   c                     U R                   $ r)   )r=   rU   s    r   get_conn_for_api_arg'VirtinstConnection.get_conn_for_api_argq   s       r   c           	          S n[         R                  " SU" U R                  5       5      U" U R                  5       5      U" U R	                  5       5      5        g )Nc                 d    [        U S-  5      n[        U S-  5      S-  nU S-  nU< SU< SU< 3$ )Ni@B i  .)int)nummajorminormicros       r   format_version8VirtinstConnection._log_versions.<locals>.format_versionz   s8    g&Ed
Od*E$JE!&u55r   z7libvirt URI versions library=%s driver=%s hypervisor=%s)r	   rZ   local_libvirt_versiondaemon_versionr7   )rI   ri   s     r   _log_versions VirtinstConnection._log_versionsy   sK    	6 			K !;!;!=> !4!4!67 !2!2!45	7r   c                     SnU R                   (       a  U R                   R                  5       nS U l         S U l        0 U l        U$ Nr   )r=   closer4   r@   rI   r%   s     r   rq   VirtinstConnection.close   s@    ##))+C 	
r   c                     U R                   $ r)   )r6   rU   s    r   fake_conn_predictable(VirtinstConnection.fake_conn_predictable   s    ***r   c                     S U l         g r)   )r?   rU   s    r   invalidate_caps"VirtinstConnection.invalidate_caps   s	    
r   c                 ,    [        U R                  5      $ r)   )boolr=   rU   s    r   is_openVirtinstConnection.is_open   s    D%%&&r   c                    U R                   (       a  U R                   R                  5         [        R                  [        R                  [        R
                  [        R                  [        R                  [        R                  /nSn[        R                  " U R                  X1U/U5      nU R                   (       a  U R                   R                  U5        XPl        U R                  (       d9  U R                  R                  5       U l        [        U R                  5      U l        U R#                  5         U R%                  5         g rp   )r0   validater   VIR_CRED_AUTHNAMEVIR_CRED_ECHOPROMPTVIR_CRED_REALMVIR_CRED_PASSPHRASEVIR_CRED_NOECHOPROMPTVIR_CRED_EXTERNALopenAuthr2   overwrite_conn_functionsr=   getURIr4   r   r>   rm   r\   )rI   authcbcbdatavalid_auth_options
open_flagsconns         r   openVirtinstConnection.open   s    ??OO$$& %%''""''))%%
 
#V4 ??OO44T: ~~))002DItyy>DLr   c                     U R                  5       (       a  g[        R                  R                  S[        R                  R                  S5      5      $ )Nz/var/lib/libvirtXDG_DATA_HOMEz~/.local/share/libvirt)is_privilegedr   r    r!   r"   r#   rU   s    r   get_libvirt_data_root_dir,VirtinstConnection.get_libvirt_data_root_dir   s@    %zz~~o gg001IJL 	Lr   vmspoolsvolsnodedevsc                     U(       a  U" 5       $ XR                   ;  a  U" 5       U R                   U'   U R                   U   S S  $ r)   )r@   )rI   r   raw_cboverride_cbs       r   _fetch_helper VirtinstConnection._fetch_helper   sA    = '''%+XDc"  %a((r   c                 D   [         R                  " U 0 S 5      u  pn/ nU HB  n UR                  S5      nUR                  [        [        R                  " U 5      US95        MD     U$ ! [        R                   a"  n[
        R                  " SU5         S nAMy  S nAff = f)Nc                     U $ r)   r+   objignores     r   <lambda>;VirtinstConnection._fetch_all_domains_raw.<locals>.<lambda>       #r   r   zFetching domain XML failed: %sparsexml)r   	fetch_vmsXMLDescr   libvirtErrorr	   rZ   appendr   rG   rH   )rI   dummy1dummy2r%   domainsr   xmles           r   _fetch_all_domains_raw)VirtinstConnection._fetch_all_domains_raw   s    )33"-/Ckk!n NN5t!4sCD  	 '' 		:A>s   A))B=BBc                 \    [        [        R                  " U 5      UR                  S5      S9$ )Nr   r   )r   rG   rH   r   rI   poolobjs     r   _build_pool_raw"VirtinstConnection._build_pool_raw   s&    7==.$+OOA$68 	8r   c                    [         R                  " U 0 S 5      u  pn/ nU H&  n U R                  U5      nUR                  U5        M(     U$ ! [        R                   a"  n[
        R                  " SU5         S nAM]  S nAff = f)Nc                     U $ r)   r+   r   s     r   r   9VirtinstConnection._fetch_all_pools_raw.<locals>.<lambda>   r   r   zFetching pool XML failed: %s)r   fetch_poolsr   r   r   r	   rZ   r   )rI   r   r   r%   r   r   poolr   s           r   _fetch_all_pools_raw'VirtinstConnection._fetch_all_pools_raw   s    )55"-/G++G4 LL  	 '' 		8!<s   AB!A>>Bc           	          [         R                  " U 0 S 5      u  pnU Vs/ s H2  n[        [        R                  " U 5      UR                  S5      5      PM4     sn$ s  snf )Nc                     U $ r)   r+   r   s     r   r   <VirtinstConnection._fetch_all_nodedevs_raw.<locals>.<lambda>   r   r   r   )r   fetch_nodedevsr
   rG   rH   r   )rI   r   r   r%   r   s        r   _fetch_all_nodedevs_raw*VirtinstConnection._fetch_all_nodedevs_raw   s^    )88"-/  C 7==.A?  	   s   9Ac                    / n U R                   R                  UR                  5      nUR                  5       S   [        R                  :w  a  U$ [        R                  " X0 S 5      u  pEnU HB  n UR                  S5      nUR                  [        [        R                  " U 5      US95        MD     U$ ! [        R                   a    Us $ f = f! [        R                   a"  n	[        R                  " SU	5         S n	A	M  S n	A	ff = f)Nr   c                     U $ r)   r+   r   s     r   r   4VirtinstConnection._fetch_vols_raw.<locals>.<lambda>  s    r   r   zFetching volume XML failed: %s)r=   storagePoolLookupByNamenamer   r   infoVIR_STORAGE_POOL_RUNNINGr   fetch_volumesr   r   r   rG   rH   r	   rZ   )
rI   
poolxmlobjr%   r   r   r   r   volr   r   s
             r   _fetch_vols_raw"VirtinstConnection._fetch_vols_raw   s    	$$<<Z__MD 99;q>W===J*883 5 C?kk!n

=t)<sKL  
 ## 	J	 '' ?		:A>>?s)   %B6 2>C6CCD&DDc                 x    / nU R                  5        H#  nUR                  U R                  U5      5        M%     U$ r)   )fetch_all_poolsextendr   )rI   r%   r   s      r   _fetch_all_vols_raw&VirtinstConnection._fetch_all_vols_raw  s6    ..0JJJt++J78 1
r   c                 X   U R                   U R                  ;  a  g U R                  U R                      nU R                  U5      nUR                  U5        U R                  U R                  ;  a  g U R                  U R                     nUR                  U R                  U5      5        g r)   )_FETCH_KEY_POOLSr@   r   r   _FETCH_KEY_VOLSr   r   )rI   r   poollistr   vollists        r   _cache_new_pool_raw&VirtinstConnection._cache_new_pool_raw  s      (9(99 $$T%:%:;))'2

#t'8'88##D$8$89t++J78r   c                 h    U R                   (       a  U R                  U5      $ U R                  U5      $ )z*
Insert the passed poolobj into our cache
)rE   r   r   s     r   cache_new_pool!VirtinstConnection.cache_new_pool#  s/     !!))'22''00r   c                 d    U R                  U R                  U R                  U R                  5      $ )z#
Returns a list of Guest() objects
)r   _FETCH_KEY_DOMAINSr   rA   rU   s    r   fetch_all_domains$VirtinstConnection.fetch_all_domains,  s2     !!''++))+ 	+r   c                 d    U R                  U R                  U R                  U R                  5      $ )z'
Returns a list of StoragePool objects
)r   r   r   rB   rU   s    r   r   "VirtinstConnection.fetch_all_pools5  s2     !!%%))'') 	)r   c                 d    U R                  U R                  U R                  U R                  5      $ )z)
Returns a list of StorageVolume objects
)r   r   r   rC   rU   s    r   fetch_all_vols!VirtinstConnection.fetch_all_vols>  s2     !!$$((&&( 	(r   c                 d    U R                  U R                  U R                  U R                  5      $ )z(
Returns a list of NodeDevice() objects
)r   _FETCH_KEY_NODEDEVSr   rD   rU   s    r   fetch_all_nodedevs%VirtinstConnection.fetch_all_nodedevsG  s2     !!((,,**, 	,r   c                     U R                   $ r)   )r4   rU   s    r   r   VirtinstConnection.getURIU  s    yyr   c                 H    U R                   b  U R                   $ [        5       $ r)   )r:   r   rU   s    r   rk   (VirtinstConnection.local_libvirt_version]  s#    %%1---*,,r   c                 j   U R                   b  U R                   $ U R                  5       (       d
  [        5       $ U R                  c3  SU l         U R                  R                  5       U l        U R                  $ U R                  $ ! [         a#    [        R                  " SSS9   U R                  $ f = f)Nr   zError calling getLibVersionTexc_info)	r:   	is_remoter   r;   r=   getLibVersion	Exceptionr	   rZ   rU   s    r   rl   !VirtinstConnection.daemon_versionc  s    %%1---~~.00'#$D H'+'8'8'F'F'H$ ###t###  H		7$G###Hs   B B21B2c                 ,   U R                   b  U R                   $ U R                  c3  SU l         U R                  R                  5       U l        U R                  $ U R                  $ ! [         a#    [
        R                  " SSS9   U R                  $ f = f)Nr   zError calling getVersionTr   )r8   r<   r=   r   r   r	   rZ   rU   s    r   r7   VirtinstConnection.conn_versionq  s    "".***%!"DE%)%6%6%A%A%C" !!!t!!!  E		4tD!!!Es   A& &BBc                 @    [        U R                  R                  5      $ r)   )r{   r>   hostnamerU   s    r   r   VirtinstConnection.is_remote  s    DLL))**r   c                     U R                  5       S:X  a  gU R                  5       S:X  a  [        R                  " 5       S:H  $ g)Nz/sessionFz/embedr   T)get_uri_pathr   getuidrU   s    r   r    VirtinstConnection.is_privileged  s;    *,(*99;!##r   c                 ,    U R                  5       (       + $ r)   )r   rU   s    r   is_unprivileged"VirtinstConnection.is_unprivileged  s    %%'''r   c                 .    U R                   R                  $ r)   )r>   r   rU   s    r   get_uri_hostname#VirtinstConnection.get_uri_hostname      ||$$$r   c                 .    U R                   R                  $ r)   )r>   portrU   s    r   get_uri_portVirtinstConnection.get_uri_port      ||   r   c                 .    U R                   R                  $ r)   )r>   usernamerU   s    r   get_uri_username#VirtinstConnection.get_uri_username  r  r   c                     U R                  5       (       a  U R                  R                  (       d  gU R                  R                  $ )Ntls)r  r>   	transportrU   s    r   get_uri_transport$VirtinstConnection.get_uri_transport  s2      ""4<<+A+A ||%%%r   c                 .    U R                   R                  $ r)   )r>   r"   rU   s    r   r   VirtinstConnection.get_uri_path  r  r   c                 .    U R                   R                  $ r)   )r>   schemerU   s    r   get_uri_driver!VirtinstConnection.get_uri_driver  s    ||"""r   c                 L    U R                   R                  R                  S5      $ )Nqemur>   r  
startswithrU   s    r   is_qemuVirtinstConnection.is_qemu      ||""--f55r   c                 P    U R                  5       =(       a    U R                  5       $ r)   )r   r   rU   s    r   is_qemu_privileged%VirtinstConnection.is_qemu_privileged  s    74#5#5#78r   c                 P    U R                  5       =(       a    U R                  5       $ r)   )r   r  rU   s    r   is_qemu_unprivileged'VirtinstConnection.is_qemu_unprivileged  s    94#7#7#9:r   c                 ^    [        U R                  5      R                  R                  S5      $ Ntest)r   r2   r  r  rU   s    r   is_really_test!VirtinstConnection.is_really_test  s"    4>>"))44V<<r   c                 L    U R                   R                  R                  S5      $ r*  r  rU   s    r   is_testVirtinstConnection.is_test  r"  r   c                     U R                   R                  R                  S5      =(       d%    U R                   R                  R                  S5      $ )Nxenlibxlr  rU   s    r   is_xenVirtinstConnection.is_xen  s<    ##..u5 8##..w7	9r   c                 L    U R                   R                  R                  S5      $ )Nlxcr  rU   s    r   is_lxcVirtinstConnection.is_lxc  s    ||""--e44r   c                 L    U R                   R                  R                  S5      $ )Nopenvzr  rU   s    r   	is_openvzVirtinstConnection.is_openvz  s    ||""--h77r   c                 P    U R                  5       =(       d    U R                  5       $ r)   )r8  r<  rU   s    r   is_container_only$VirtinstConnection.is_container_only  s    {{}0 00r   c                     U R                   R                  R                  S5      =(       d%    U R                   R                  R                  S5      $ )Nvz	parallelsr  rU   s    r   is_vzVirtinstConnection.is_vz  s<    ##..t4 <##..{;	=r   c                 L    U R                   R                  R                  S5      $ )Nbhyver  rU   s    r   is_bhyveVirtinstConnection.is_bhyve  s    ||""--g66r   c                     U R                   R                  5       nU R                  (       d  U R                  5       (       a  SnU R	                  5       =(       d    U$ )NF)r   conn_streamr0   r/  r*   rr   s     r   support_remote_url_install-VirtinstConnection.support_remote_url_install  s>    ll&&(??dllnnC  ")c)r   )r?   r<   r;   r6   r8   r:   r@   r=   r0   r2   r4   r>   rE   rA   rD   rB   rC   r   N)B__name__
__module____qualname____firstlineno____doc__staticmethodr&   r*   rL   rR   rV   propertyrJ   r\   capsr_   rm   rq   ru   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rk   rl   r7   r   r   r  r  r
  r  r  r   r  r   r$  r'  r,  r/  r4  r8  r<  r?  rD  rH  rL  __static_attributes__r+   r   r   r   r   "   s[    1 1 & &%AX*
+
8
C ID!
7"+'<L O$)8 ,9 1+)(,-$
""+(%!%&!#69;=69581=7*r   r   )r   rG   r   r.   r   r   r   r   guestr   loggerr	   nodedevr
   storager   r   rJ   r   r   r   objectr   r+   r   r   <module>r\     s>    
          / !`* `*r   