+
    hA^  c                   sH   ^ RI t ^ RIt^ RIt^ RIt^ RIt^RIHt ^RIHtH	t	 ^RI
Ht R tR tR tR tR	 tR
 tR tR tR tR tR tR tR tRtR tR tR tR tR t ! R R4      t ! R R]4      t  ! R R] 4      t! ! R R] 4      t" ! R  R!]4      t# ! R" R#]4      t$R# )$    N)log)StoragePoolStorageVolume)xmlutilc                s    V P                  V4      pVP                  4        VR3#   \        P                   dI   pTP	                  4       '       d%   TP	                  4       \        P
                  8w  d   h RT3u Rp?# Rp?ii ; i)z
Try to find a volume matching the full passed path. Call info() on
it to ensure the volume wasn't removed behind libvirt's back
N)ZstorageVolLookupByPathinfolibvirtZlibvirtErrorZget_error_codeZVIR_ERR_NO_STORAGE_VOL)connpathvole   &&  //usr/share/virt-manager/virtinst/diskbackend.py_lookup_vol_by_pathr      ss    
))$/
Dy  !"2"2"48V8V"VQws   $' B=A?9B?Bc                s    \         P                  P                  V4      pW P                  4       9   d   V P	                  V4      # R# )z
Try to lookup a volume for 'path' in parent 'pool' by it's filename.
This sometimes works in cases where full volume path lookup doesn't,
since not all libvirt storage backends implement path lookup.
N)osr   basenameZlistVolumesZstorageVolLookupByName)poolr   name   && r   _lookup_vol_by_basenamer   )   s=     77D!D!!**400 "    c                 s     \         P                  ! V \         P                  4      p\         P                  ! V^ ^4      p\         P                  ! V4       V#   \
         d    ^ p T# i ; ir    )r   openO_RDONLYlseekclose	Exception)r   fdsize   &  r   _get_block_sizer   4   sZ    WWT2;;'xxAq!
 K  Ks   AA A('A(c                 s    \         P                  P                  V 4      '       g   ^ # \        V 4      '       d   \	        V 4      # \         P                  P                  V 4      # r   )r   r   exists_stat_is_blockr   Zgetsizer      &r   	_get_sizer#   ?   sA    77>>$dt$$77??4  r   c                 s    \         P                  P                  V 4      '       g   R # \        P                  ! \         P                  ! V 4      \        P
                  ,          4      # F)r   r   r   statZS_ISBLKZST_MODEr!   r"   r   r    r    G   s8    77>>$<<dll344r   c                s&   \        W4      w  r#V'       d   W"P                  4       3# \        P                  ! V \        P
                  P                  V4      4      pV'       g   R#  \        P                  ! VRR7       \        W4      w  r%V'       d    \        WA4      pM V'       g0   V'       g(   V'       d    \        \        R4      RVRV/,          4      hW$3#   \         d     LGi ; i  \         d   pRpRp\        T4      p Rp?LjRp?ii ; i)zt
Try to lookup storage objects for the passed path.

Returns (volume, parent pool). Only one is returned at a time.
NT)Zrefreshz$Cannot use storage %(path)s: %(err)sr   err)NN)r   ZstoragePoolLookupByVolumer   Zlookup_pool_by_pathr   r   dirnameZensure_pool_is_runningr   r   str
ValueError_)r   r   r	   ignorer   Zverrr
   s   &&     r   _check_if_path_managedr,   M   s     &d1KC
11333**41FGD
**4>'3	-d9  tABfdTY[_E``aa9   1vs6   &-C, C C)&C, (C))C, ,D7DDc                 s    T ;'       g    R p . ROp\        V 4      '       d   R# V F*  pV P                  VR,           4      '       g	   W8X  g   K)   R# 	  R# ) F/T)z/devz/sysz/proc)path_is_urlZ
startswith)r   Zskip_prefixesZprefixr   r   _can_auto_manager0   q   sI    ::2D-M4??6C<((DN   r   c                 sz    ^RI Hp V! V 4      pVP                  R8X  d   VP                  P	                  R4      # V # )i   )URIZrbdr.   )Zurir1   Zschemer   Zstrip)r   r1   Zuriobjr   r   _get_storage_search_pathr2   ~   s6     YF}}{{  %%Kr   c                s   V P                   P                  4       '       g   R# V'       g   R# \        V4      '       g1   \        W4      '       g    \        P
                  P                  V4      p\        V4      p\        W4      w  r4V'       g   V'       g   \        V4      '       g   WV3# \        P
                  P                  V4      p\        P
                  P                  V4      P                  RR4      pV'       g   Rp\        P                  ! W4      p\        P                   ! RWe4       \        V 4      pWgn        VP$                  Vn        WWn        VP+                  RRRR7      p\-        WA4      pWV3# )	zH
If path is not managed, try to create a storage pool to probe the path
 r*   Zdirpoolz%Attempting to build pool=%s target=%sFT)ZbuildcreateZ	autostart)NNN)ZsupportZconn_storager/   path_is_network_volr   r   abspathr2   r,   r0   r'   r   replacer   Zfind_free_namer   debugr   ZTYPE_DIRtypetarget_pathinstallr   )r   r   Z
searchpathr	   r   r'   ZpoolnameZpoolxmls   &&      r   manage_pathr<      s"    <<$$&&t%8%D%Dwwt$)$/J&t8IC
d*400$ggood#Gww(00c:H))$9HII5xI$GL##GL!??tt?DD
!$
-Cd?r   c                sV    \        \        P                  ! RT ;'       g    R4      4      # )z
Detect if path is a URL
z[a-zA-Z]+(\+[a-zA-Z]+)?://.*r-   )boolreZmatchr!   r"   r   r/   r/      s!     8$**"EFFr   c                s    V P                  4        F/  pV'       g   K  VP                  V8X  g   K   VP                  R8H  u # 	  R# )z>
Detect if path is a network volume such as rbd, gluster, etc
networkF)Zfetch_all_volsr:   r9   )r   r   Zvolxmlr   r   r5   r5      s=     %%'4F&&$.;;)++ ( r   c                s   V'       d   VP                   '       d   VP                   # V'       d?   VP                  4       pV\        P                  8X  d   R# V\        P                  8X  d   R# V'       d]   VP                  4       ^ ,          pV\        P                  8X  d   R# V\        P                  8X  d   R# V\        P                  8X  d   R# V '       dl   \        V 4      '       d   R# V'       d   \        V 4      '       g   R#  R# \        P                  P                  V 4      '       d   R# \        V 4      '       d   R# R# )z$
Try to get device type for volume.
blockr?   ZfileZdir)r9   Zget_disk_typer   Z
TYPE_BLOCKZTYPE_NETWORKr   Z	TYPE_FILEr/   r0   r   r   isdirr    )r   vol_xml
vol_objectZpool_xmlZremoteZts   &&&&& r   _get_dev_typerD      s     7<<<||""$(((-,,, OOa '''-***-,,,t#D)) 	 *  ww}}T""%%r   c                s    Vf   R#  \        W4      w  r#TpV'       d   R# V P                  4       '       g    \        P                  P	                  V4      #  R#   \
         d     R# i ; i)zo
Return True if the path certainly exists, False if we are unsure.
See DeviceDisk entry point for more details
FT)r,   	is_remoter   r   r   r   )r   r   r	   r   r+   s   &&   r   path_definitely_existsrF      si    
 |	,T8~~77>>$''  
   s   A A A A('A(Zsetfaclc                 sj   \         R RV,          V .p\        P                  ! V\        P                  \        P                  R7      pVP	                  4       w  rE\
        P                  ! RV4       V'       g	   V'       d   \
        P                  ! RWE4       VP                  ^ 8w  d   \        V4      hR# )z--modifyz	user:%s:xZstdoutZstderrzRan command '%s'zout=%s
err=%sN)	SETFACL
subprocessPopenPIPEcommunicater   r8   
returncoder)   )r'   usernamecmdprocoutr&      &&    r   _fix_perms_aclrS     s    Jh 6
@CC

PD!HCII #&
c		"C-!o r   c                 sN   \         P                  ! R V 4       \        P                  ! V 4      P                  pV\        P
                  ,          p\        P                  ! W4       \        P                  ! V 4      P                  V8w  d   \        \        R4      V ,          4      hR# )zSetting +x on %sz!Permissions on '%s' did not stickN)	r   r8   r   r%   st_modeS_IXOTHZchmodr)   r*   )r'   ZmodeZnewmoder   r   _fix_perms_chmodrV     ss    II '*777##DT\\!GHHW	www7* >?'IJJ +r   c                 s>   R p/ pV  F%  pV'       d    \        WA4       K   \	        V4       K'  	  V#   \         d:   p\        P                  ! RT4       \        P                  ! R4       Rp Rp?LQRp?ii ; i  \         d   p\        T4      Y4&    Rp?K  Rp?ii ; i)Tzsetfacl failed: %sztrying chmodFN)rS   r   r   r8   rV   r(   )ZdirlistrN   ZuseaclZerrdictr'   r
   rR   r   set_dirs_searchablerW     s    FGw1	&W%   N  		.2		.)  	&"1vG	&s+   2A9A6/A11A69BBBc                s    \         P                  ! V 4      pYP                  8X  d   \        P                  pM1YP
                  8X  d   \        P                  pM\        P                  p\        TP                  T,          4      '       d   R# RT .p \        P                  ! T\        P                  \        P                  R7      pTP                  4       w  rxTP                   ^ 8w  d   \        P                  ! RYX4       R# RT,          p	\        \"        P$                  ! T	P'                  RR	4      T4      4      #   \         d     R# i ; i  \         d    \        P                  ! R4        R# i ; i)
z0
Check if passed directory is searchable by uid
FTZgetfaclrG   z Didn't find the getfacl command.zCmd '%s' failed: %szuser:%s:..xzutf-8r7   )r   r%   OSErrorZst_uidZS_IXUSRZst_gidZS_IXGRPrU   r=   rT   rI   rJ   rK   rL   r   r8   rM   r>   ZsearchZencode)
r'   uidrN   ZstatinfoZflagrO   rP   rQ   r&   Zpatterns
   &&&       r   _is_dir_searchablerZ   5  s   777# oo||		||||Ht#$$ g
CJOOJOOT##%
 !		'2h&G		'..)<cBCC7  $  		45s$   D= AE =EE!E43E4c                s<   \         P                  P                  V 4      '       d   T pRpM!\         P                  P                  V 4      w  r4. pV'       dG   \	        W1V4      '       g   VP                  V4       \         P                  P                  V4      w  r4KN  V# )z
Check each dir component of the passed path, see if they are
searchable by the uid/username, and return a list of paths
which aren't searchable
Z-)r   r   rA   ZsplitrZ   Zappend)r   rY   rN   r'   ZbaseZfixlists   &&&   r   is_path_searchabler[   Y  sq     
ww}}Td+G
!'99NN7#g.Nr   c                   x   a  ] tR tRt o RtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tRtV tR# )_StorageBaseis  z9
Storage base class, defining the API used by DeviceDisk
c                s     Wn         R V n        R # N_conn_parent_pool_xmlselfr      &&r   __init__Z_StorageBase.__init__x  s    
 $r   c                    \        4       hr^   ZNotImplementedErrorrc   r"   r   get_sizeZ_StorageBase.get_size|      !##r   c                rf   r^   rg   rh   r"   r   get_dev_typeZ_StorageBase.get_dev_type  rj   r   c                rf   r^   rg   rh   r"   r   get_driver_typeZ_StorageBase.get_driver_type  rj   r   c                rf   r^   rg   rh   r"   r   get_vol_installZ_StorageBase.get_vol_install  rj   r   c                rf   r^   rg   rh   r"   r   get_vol_objectZ_StorageBase.get_vol_object  rj   r   c                rf   r^   rg   rh   r"   r   get_parent_poolZ_StorageBase.get_parent_pool  rj   r   c                s    V P                   '       gP   V P                  4       '       d:   \        V P                  V P                  4       P	                  ^ 4      R7      V n         V P                   # )r    Zparsexml)ra   ro   r   r`   XMLDescrh   r"   r   get_parent_pool_xmlZ _StorageBase.get_parent_pool_xml  sT    $$$)=)=)?)?$/

T%9%9%;%C%CA%F%D! $$$r   c                rf   r^   rg   rh   r"   r   validateZ_StorageBase.validate  rj   r   c                rf   r^   rg   rh   r"   r   get_pathZ_StorageBase.get_path  rj   r   c                    R # r$    rh   r"   r   is_stubZ_StorageBase.is_stub      r   c                rf   r^   rg   rh   r"   r   is_size_conflictZ_StorageBase.is_size_conflict  rj   r   c                rf   r^   rg   rh   r"   r   will_create_storageZ _StorageBase.will_create_storage  rj   r   c                sh    Tp\         P                  ! R V P                  P                  ,          4      h)z%s can't create storage)r   DevErrorZ	__class____name__)rc   meterr+   r   r   r4   Z_StorageBase.create  s(    84>>;R;RRSSr   r_   N)r|   
__module____qualname____firstlineno____doc__re   ri   rk   rl   rm   rn   ro   rr   rs   rt   rw   ry   rz   r4   __static_attributes____classdictcell__Z__classdict__   @r   r]   r]   s  sW     %$$$$$$%$$$$T Tr   r]   c                   r   a  ] tR tRt o RtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tRtV tR# )_StorageCreatori  zC
Base object for classes that will actually create storage on disk
c                sv    \         P                  W4       R V n        R V n        R V n        R V n        R V n        R # r^   )r]   re   _pool_vol_install_path_size	_dev_typerb   rd   r   re   Z_StorageCreator.__init__  s4    d)
 

r   c                    \         hr^   rg   rc   r}   rd   r   r4   Z_StorageCreator.create      !!r   c                r   r^   rg   rh   r"   r   rs   Z_StorageCreator.validate  r   r   c                r   r^   rg   rh   r"   r   ri   Z_StorageCreator.get_size  r   r   c                s   V P                   '       d   V P                  '       g   \        V P                  V P                   P                  P                  ^ 4      R7      pV P                  4       R8X  d(   V P                   P                  V n        V P                  # \        P                  P                  VP                  V P                   P                  4      V n        V P                  # )r    rp   r?   )r   r   r   r`   r   rq   rk   r   r   r   Zjoinr:   )rc   Zxmlobj   & r   rt   Z_StorageCreator.get_path  s    TZZZ d6G6G6L6L6T6TUV6WXF  "i/!..33
 zz  WW\\&*<*<d>O>O>T>TU
zzr   c                    V P                   # r^   r   rh   r"   r   rm   Z_StorageCreator.get_vol_install         r   c                r   r^   r   rh   r"   r   get_vol_xmlZ_StorageCreator.get_vol_xml  r   r   c                s    V P                   '       gO   \        V P                  V P                  R V P	                  4       V P
                  P                  4       4      V n         V P                   # r^   )r   rD   r   r   rr   r`   rE   rh   r"   r   rk   Z_StorageCreator.get_dev_type  sR    ~~~*

!!((*

$$&DN ~~r   c                s    V P                   '       d7   V P                   P                  4       '       d   V P                   P                  # R # )raw)r   supports_formatformatrh   r"   r   rl   Z_StorageCreator.get_driver_type  s8      0022((///r   c                ru   Trv   rh   r"   r   rz   Z#_StorageCreator.will_create_storage      r   c                ru   r^   rv   rh   r"   r   rn   Z_StorageCreator.get_vol_object  r   r   c                sV    V P                   '       d   V P                   P                  # R # r^   )r   r   rh   r"   r   ro   Z_StorageCreator.get_parent_pool  s#    $$)))r   c                ru   r$   rv   rh   r"   r   r   Z_StorageCreator.exists  rx   r   )r   r   r   r   r   N)r|   r~   r   r   r   re   r4   rs   ri   rt   rm   r   rk   rl   rz   rn   ro   r   r   r   r   r   r   r   r     sP     """!!	
 r   r   c                   sB   a  ] tR tRt o RtR tR tR tR tR t	Rt
V tR	# )
ManagedStorageCreatori  z
Handles storage creation via libvirt APIs. All the actual creation
logic lives in StorageVolume, this is mostly about pulling out bits
from that class and mapping them to DeviceDisk elements
c                s^    \         P                  W4       VP                  V n        W n        R # r^   )r   re   r   r   r   )rc   r   Zvol_installs   &&&r   re   ZManagedStorageCreator.__init__  s#      , %%
'r   c                s:    V P                   P                  VR 7      # ))r}   )r   r;   r   rd   r   r4   ZManagedStorageCreator.create  s      ((u(55r   c                6    V P                   P                  4       # r^   )r   ry   rh   r"   r   ry   Z&ManagedStorageCreator.is_size_conflict  s      1133r   c                r   r^   )r   rs   rh   r"   r   rs   ZManagedStorageCreator.validate  s      ))++r   c                sj    \        V P                  P                  4      R ,          R ,          R ,          # )      @)floatr   capacityrh   r"   r   ri   ZManagedStorageCreator.get_size
  s(    T&&//069FBVKKr   )r   r   N)r|   r~   r   r   r   re   r4   ry   rs   ri   r   r   r   r   r   r   r     s*     (64,L Lr   r   c                   sH   a  ] tR tRt o RtR tR tR tR tR t	R t
R	tV tR
# )CloneStorageCreatori  z
Handles manually copying local files for Cloner

Many clone scenarios will use libvirt storage APIs, which will use
the ManagedStorageCreator
c                sl    \         P                  W4       W n        W n        W0n        W@n        WPn        R # r^   )r   re   r   _output_path_input_pathr   _sparse)rc   r   Zoutput_pathZ
input_pathr   sparses   &&&&&&r   re   ZCloneStorageCreator.__init__  s+      , 
'%
r   c                r   r^   )r   rh   r"   r   ri   ZCloneStorageCreator.get_size      zzr   c                s   R pRpV P                  4       R8X  d   \        V P                  4      pMw\        P                  ! \        P
                  P                  \        P
                  P                  V P                  4      4      4      pVP                  VP                  ,          p\        V P                  4      R,          R,          R,          pWS8  dh   V P                  '       d   \        R4      pMRp\        R4      pV'       d5   VR,          pV\        R4      R	VR,          R
VR,          /,          ,          pW3# )FNr@      zkThe filesystem will not have enough free space to fully allocate the sparse file when the guest is running.Tz2There is not enough free space to create the disk.r3   z+%(mem1)s M requested > %(mem2)s M availableZmem1Zmem2i   )rk   r#   r   r   Zstatvfsr   r'   r6   Zf_frsizeZf_bavailintr   r   r*   )rc   retmsgZavailZvfsZneeds   &     r   ry   Z$CloneStorageCreator.is_size_conflict"  s    ')djj)E**RWW__RWW__TZZ-HIJCLL3<</E4::%,t3<|||# LMs
qFGTk2U{3K   zr   c                s    V P                   f*   \        \        R4      V P                  4       ,          4      hV P	                  4       w  rV'       d   \        V4      hV'       d   \
        P                  ! V4       R # R # )Nz+size is required for non-existent disk '%s')r   r)   r*   rt   ry   r   Zwarning)rc   r&   r   r   r   rs   ZCloneStorageCreator.validate>  s]    ::QLMPTP]P]P__``((*S/!KK r   c                s   \        R 4      R\        P                  P                  V P                  4      /,          p\        V P                  4       R,          R,          R,          4      pVP                  W#4       V P                  W4       R# )zCloning %(srcfile)sZsrcfiler   N)	r*   r   r   r   r   r   ri   Zstart_clone_local)rc   r}   Ztext
size_bytesr   r   r4   ZCloneStorageCreator.createH  sg    &'9bgg6F6FtGWGW6X*YY4/$6=>
D% 	%,r   c           
     s    V P                   R 8X  d   \        P                  ! R4       R# V P                   V P                  8X  d   \        P                  ! R4       R# \        P
                  P                  V P                  4      '       g   V P                  '       d   RpRpRp \        P                  ! V P                  \        P                  \        P                  ,          R4      p\        P                  ! WR4       V'       d   \        P                  ! V4       MRpRp\        P                  ! RV P                   V P                  VV4       RpRRr  \        P                  ! V P                   \        P                  4      p\        P                  ! V P                  \        P                  \        P                  ,          R4      p^ p	 \        P                  ! Ws4      p
\        V
4      pV^ 8X  d   VP!                  4        MvV'       d   Wj8X  d   \        P"                  ! W^4       M-\        P$                  ! W4      pW8w  d   VP!                  4        M#W,          p	W8  g   K  VP'                  V	4       K  Ve   \        P                  ! V4       Ve   \        P                  ! V4       R# R#   T'       d   \        P                  ! T4       i i ; i  \(         d_   p\        P                  ! R	RR
7       \+        R4      RT P                   RT P                  R\-        T4      /,          p\/        T4      RhRp?ii ; i  Te   \        P                  ! T4       Te   \        P                  ! T4       i i ; i)z	/dev/nullz"Source dev was /dev/null. SkippingNz.Source and destination are the same. Skipping.i   Ti  Fz0Local Cloning %s to %s, sparse=%s, block_size=%szError while cloning)Zexc_infozBError cloning diskimage %(inputpath)s to %(outputpath)s: %(error)sZ	inputpathZ
outputpathZerrori   s                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   )r   r   r8   r   r   r   r   r   r   ZO_WRONLYZO_CREATZ	ftruncater   r   ZreadZlenZendr   ZwriteZupdaterX   r*   r(   ZRuntimeError)rc   r}   r   Zclone_block_sizer   r   ZzerosZsrc_fdZdst_fdZiZdataZsZbr
   r   s   &&&            r   r   Z CloneStorageCreator._clone_localQ  s   {* II:;t000IIFG
 ww~~d//00T\\\#FB!WWT..bjj0H%PR,HHRL/F		>	
 t#	!2!1!12;;?!2!2BKK"**4LeT776<DD	AAv		%-A.HHV26!IIK!FA~Q ! !  "g HHRL P  2		/$?\]!1!1 $"3"3SVa 
 #3'T12 ! !  "sX   %AJ6 B/K M K A
K M K +K 6!KM%AL>>MM 7M=)r   r   r   r   r   N)r|   r~   r   r   r   re   ri   ry   rs   r4   r   r   r   r   r   r   r   r     s/     8-I! I!r   r   c                   r\   )StorageBackendStubi  zv
Class representing a storage path for a parsed XML disk, that we
don't want to do slow resolving of unless requested
c                sT    \         P                  W4       W n        W0n        W@n        R # r^   )r]   re   r   r   _driver_type)rc   r   r   Zdev_typeZdriver_type   &&&&&r   re   ZStorageBackendStub.__init__  s     d)
!'r   c                r   r^   )r   rh   r"   r   rt   ZStorageBackendStub.get_path  r   r   c                ru   r^   rv   rh   r"   r   rn   Z!StorageBackendStub.get_vol_object  r   r   c                ru   r^   rv   rh   r"   r   r   ZStorageBackendStub.get_vol_xml  r   r   c                ru   r^   rv   rh   r"   r   ro   Z"StorageBackendStub.get_parent_pool  r   r   c                s    ^ # r   rv   rh   r"   r   ri   ZStorageBackendStub.get_size  s    r   c                ru   r   rv   rh   r"   r   r   ZStorageBackendStub.exists  r   r   c                r   r^   )r   rh   r"   r   rk   ZStorageBackendStub.get_dev_type  s    ~~r   c                r   r^   )r   rh   r"   r   rl   Z"StorageBackendStub.get_driver_type  r   r   c                ru   r^   rv   rh   r"   r   rs   ZStorageBackendStub.validate      r   c                ru   r^   rv   rh   r"   r   rm   Z"StorageBackendStub.get_vol_install  r   r   c                    R# F)FNrv   rh   r"   r   ry   Z#StorageBackendStub.is_size_conflict      r   c                ru   r   rv   rh   r"   r   rw   ZStorageBackendStub.is_stub  r   r   c                ru   r$   rv   rh   r"   r   rz   Z&StorageBackendStub.will_create_storage  rx   r   )r   r   r   N)r|   r~   r   r   r   re   rt   rn   r   ro   ri   r   rk   rl   rs   rm   ry   rw   rz   r   r   r   r   r   r   r     sU     
(! r   r   c                   r   )StorageBackendi  zU
Class that carries all the info about any existing storage that
the disk references
c                s8   \         P                  W4       W0n        W@n        W n        V P                  e   R V n        V P                  '       d)   V P                  '       g   \
        P                  ! R4      hR V n        R V n        R V n	        R V n
        R V n        R # )Nzparent_pool must be specified)r]   re   _vol_object_parent_poolr   r   r{   _vol_xmlra   _existsr   r   )rc   r   r   rC   Zparent_poolr   r   re   ZStorageBackend.__init__  s    d)%'
'DJD$5$5$5""#BCC  $
r   c                sr    V P                   '       d   V P                  4       P                  # V P                  # r^   )r   r   r:   r   rh   r"   r   rt   ZStorageBackend.get_path  s-    ##%111zzr   c                r   r^   )r   rh   r"   r   rn   ZStorageBackend.get_vol_object  s    r   c                s    V P                   fQ   \        V P                  V P                  P	                  ^ 4      R7      V n         V P
                  V P                   n        V P                   # )Nrp   )r   r   r`   r   rq   r   r   rh   r"   r   r   ZStorageBackend.get_vol_xml  sL    == )$**t?O?O?W?WXY?Z[DM!%!2!2DMM}}r   c                r   r^   )r   rh   r"   r   ro   ZStorageBackend.get_parent_pool  r   r   c                s,   V P                   f|   ^ pV P                  '       d   V P                  4       P                  pM'V P                  '       d   \        V P                  4      p\        V4      R,          R,          R,          V n         V P                   # )z!
Return size of existing storage
r   )r   r   r   r   r   r#   r   )rc   r   r   r   ri   ZStorageBackend.get_size   sn     ::C&&(11

+sf,v5>DJzzr   c                s   V P                   Ef`   V P                  '       d   RV n         V P                   # V P                  f   RV n         V P                   # V P                  4       R8w  dc   V P                  P                  4       '       gC   \        P                  P                  V P                  4      '       d   RV n         V P                   # V P                  '       d   RV n         V P                   # V P                  4       R8X  d   RV n         V P                   # V P                  P                  4       '       d/   \        V P                  4      '       g   RV n         V P                   # RV n         V P                   # )NTr?   F)r   r   r   rk   r`   rE   r   r   r   r   r0   rh   r"   r   r   ZStorageBackend.exists  s-   <<#* ||) ##& ||# !!#y0

,,..GGNN4::..# || """$ || ""$	1# || %%''0@0L0L
  $ ||  %||r   c                s   V P                   fs   RpV P                  '       d   V P                  4       p\        V P                  VV P                  V P                  4       V P                  P                  4       4      V n         V P                   # )z/
Return disk 'type' value per storage settings
N)r   r   r   rD   r   rr   r`   rE   )rc   rB   r   r   rk   ZStorageBackend.get_dev_type'  st     >>!G**,*

  ((*

$$&DN ~~r   c                s    V P                   '       dA   V P                  4       P                  4       '       d   V P                  4       P                  # R # R# )r   N)r   r   r   r   rh   r"   r   rl   ZStorageBackend.get_driver_type8  sA    !1133'')000r   c                ru   r^   rv   rh   r"   r   rs   ZStorageBackend.validate?  r   r   c                ru   r^   rv   rh   r"   r   rm   ZStorageBackend.get_vol_installB  r   r   c                r   r   rv   rh   r"   r   ry   ZStorageBackend.is_size_conflictE  r   r   c                ru   r$   rv   rh   r"   r   rz   Z"StorageBackend.will_create_storageH  rx   r   )r   r   r   ra   r   r   r   r   N)r|   r~   r   r   r   re   rt   rn   r   ro   ri   r   rk   rl   rs   rm   ry   rz   r   r   r   r   r   r   r     sP     
0
 !4" r   r   )%r   r>   r%   rI   r   Zloggerr   Zstorager   r   r-   r   r   r   r   r#   r    r,   r0   r2   r<   r/   r5   rD   rF   rH   rS   rV   rW   rZ   r[   r]   r   r   r   r   r   rv   r   r   <module>r      s    
 	     / (1!5!H
	DG*Z4 
K,!DH44T 4TnGl GTLO L4L!/ L!^1 1hx\ xr   