
    W'Fg<_                     H   S SK r S SKrS SKrS SKrS SKrSSKJr  SSKJrJ	r	  SSK
J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 S\5      r  " S S\ 5      r! " S S\!5      r" " S S \!5      r# " S! S"\ 5      r$ " S# S$\ 5      r%g)%    N   )log)StoragePoolStorageVolume)xmlutilc                     U R                  U5      nUR                  5         US4$ ! [        R                   aF  nUR	                  5       (       a#  UR	                  5       [        R
                  :w  a  e SU4s SnA$ SnAff = f)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)storageVolLookupByPathinfolibvirtlibvirtErrorget_error_codeVIR_ERR_NO_STORAGE_VOL)connpathvoles       //usr/share/virt-manager/virtinst/diskbackend.py_lookup_vol_by_pathr      st    
))$/
Dy 	 '"@"@@Qw	s   $' B;A<6B<Bc                     [         R                  R                  U5      nX R                  5       ;   a  U R	                  U5      $ g)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   basenamelistVolumesstorageVolLookupByName)poolr   names      r   _lookup_vol_by_basenamer   *   s=     77D!D!!**400 "    c                      [         R                  " U [         R                  5      n[         R                  " USS5      n[         R                  " U5        U$ ! [
         a    Sn U$ f = f)Nr      )r   openO_RDONLYlseekclose	Exception)r   fdsizes      r   _get_block_sizer'   5   sZ    WWT2;;'xxAq!
 K  Ks   AA A'&A'c                     [         R                  R                  U 5      (       d  g[        U 5      (       a  [	        U 5      $ [         R                  R                  U 5      $ Nr   )r   r   exists_stat_is_blockr'   getsizer   s    r   	_get_sizer.   @   sA    77>>$dt$$77??4  r   c                     [         R                  R                  U 5      (       d  g[        R                  " [         R                  " U 5      [        R
                     5      $ NF)r   r   r*   statS_ISBLKST_MODEr-   s    r   r+   r+   H   s8    77>>$<<dll344r   c                    [        X5      u  p#U(       a  X"R                  5       4$ [        R                  " U [        R
                  R                  U5      5      nU(       d  g [        R                  " USS9  [        X5      u  p%U(       a   [        XA5      nO U(       d'  U(       d   U(       a  [        [        S5      XS.-  5      eX$4$ ! [         a     N=f = f! [         a  nSnSn[        U5      n SnAN_SnAff = f)zt
Try to lookup storage objects for the passed path.

Returns (volume, parent pool). Only one is returned at a time.
NNT)refreshNz$Cannot use storage %(path)s: %(err)s)r   err)r   storagePoolLookupByVolumer   lookup_pool_by_pathr   r   dirnameensure_pool_is_runningr   r$   str
ValueError_)r   r   r   ignorer   verrr   s          r   _check_if_path_managedrA   N   s     &d1KC
11333**41FGD
**4>'3	-d9  tAB'( ) 	) 9   1vs6   #)C C 
CC CC 
C>%C99C>c                     U =(       d    Sn / SQn[        U 5      (       a  gU H#  nU R                  US-   5      (       d  X:X  d  M#    g   g)N )z/devz/sysz/procF/T)path_is_url
startswith)r   skip_prefixesprefixs      r   _can_auto_managerI   s   sG    :2D-M4??6C<((DN   r   c                 x    SSK Jn  U" U 5      nUR                  S:X  a  UR                  R	                  S5      $ U $ )Nr   )URIrbdrD   )urirK   schemer   strip)r   rK   uriobjs      r   _get_storage_search_pathrQ      s6     YF}}{{  %%Kr   c                    U R                   R                  5       (       d  gU(       d  g[        U5      (       d/  [        X5      (       d  [        R
                  R                  U5      n[        U5      n[        X5      u  p4U(       d  U(       d  [        U5      (       d  XU4$ [        R
                  R                  U5      n[        R
                  R                  U5      R                  SS5      nU(       d  Sn[        R                  " X5      n[        R                   " SXe5        [        U 5      nXgl        UR$                  Ul        XWl        UR+                  SSSS9n[-        XA5      nXU4$ )	zH
If path is not managed, try to create a storage pool to probe the path
)NNN r>   dirpoolz%Attempting to build pool=%s target=%sFT)buildcreate	autostart)supportconn_storagerE   path_is_network_volr   r   abspathrQ   rA   rI   r:   r   replacer   find_free_namer   debugr   TYPE_DIRtypetarget_pathinstallr   )r   r   
searchpathr   r   r:   poolnamepoolxmls           r   manage_pathrf      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                 T    [        [        R                  " SU =(       d    S5      5      $ )z
Detect if path is a URL
z[a-zA-Z]+(\+[a-zA-Z]+)?://.*rC   )boolrematchr-   s    r   rE   rE      s     8$*"EFFr   c                     U R                  5        H-  nU(       d  M  UR                  U:X  d  M  UR                  S:H  s  $    g)z>
Detect if path is a network volume such as rbd, gluster, etc
networkF)fetch_all_volsra   r`   )r   r   volxmls      r   rZ   rZ      s=     %%'4F&&$.;;)++ ( r   c                 P   U(       a  UR                   (       a  UR                   $ U(       a:  UR                  5       nU[        R                  :X  a  gU[        R                  :X  a  gU(       aR  UR                  5       S   nU[        R                  :X  a  gU[        R                  :X  a  gU[        R                  :X  a  gU (       aa  [        U 5      (       a  gU(       a  [        U 5      (       d  g g[        R                  R                  U 5      (       a  g[        U 5      (       a  gg)z$
Try to get device type for volume.
blockrl   r   filedir)r`   get_disk_typer   
TYPE_BLOCKTYPE_NETWORKr
   	TYPE_FILErE   rI   r   r   isdirr+   )r   vol_xml
vol_objectpool_xmlremotets         r   _get_dev_typer}      s     7<<||""$(((-,,, OOa '''-***-,,,t#D)) 	 *  ww}}T""%%r   c                     Uc  g [        X5      u  p#UnU(       a  gU R                  5       (       d  [        R                  R	                  U5      $  g! [
         a     gf = f)zo
Return True if the path certainly exists, False if we are unsure.
See DeviceDisk entry point for more details
FT)rA   	is_remoter   r   r*   r$   )r   r   r   r   r?   s        r   path_definitely_existsr      si    
 |	,T8~~77>>$''  
   s   A 3A 
A A setfaclc                 T   [         SSU-  U /n[        R                  " U[        R                  [        R                  S9nUR	                  5       u  pE[
        R                  " SU5        U(       d  U(       a  [
        R                  " SXE5        UR                  S:w  a  [        U5      eg )Nz--modifyz	user:%s:xstdoutstderrzRan command '%s'zout=%s
err=%sr   )	SETFACL
subprocessPopenPIPEcommunicater   r^   
returncoder=   )r:   usernamecmdprocoutr7   s         r   _fix_perms_aclr     s    Jh 6
@CC#-??#-??4D !HCII #&
c		"C-!o r   c                 :   [         R                  " SU 5        [        R                  " U 5      R                  nU[        R
                  -  n[        R                  " X5        [        R                  " U 5      R                  U:w  a  [        [        S5      U -  5      eg )NzSetting +x on %sz!Permissions on '%s' did not stick)	r   r^   r   r1   st_modeS_IXOTHchmodr=   r>   )r:   modenewmodes      r   _fix_perms_chmodr     sz    II '*777##DT\\!GHHW	www7* 56@B 	B +r   c                 8   Sn0 nU  H$  nU(       a   [        XA5        M   [	        U5        M&     U$ ! [         a9  n[        R                  " SU5        [        R                  " S5        Sn S nANPS nAff = f! [         a  n[        U5      X4'    S nAM  S nAff = f)NTzsetfacl failed: %sztrying chmodF)r   r$   r   r^   r   r<   )dirlistr   useaclerrdictr:   r   s         r   set_dirs_searchabler   #  s    FGw1	&W%   N  		.2		.)  	&"1vG	&s+   1A7
A4/A//A47
BBBc                     [         R                  " U 5      nXR                  :X  a  [        R                  nO0XR
                  :X  a  [        R                  nO[        R                  n[        UR                  U-  5      (       a  gSU /n [        R                  " U[        R                  [        R                  S9nUR                  5       u  pxUR                   S:w  a  [        R                  " SXX5        gSU-  n	[        ["        R$                  " U	R'                  S	S
5      U5      5      $ ! [         a     gf = f! [         a    [        R                  " S5         gf = f)z0
Check if passed directory is searchable by uid
FTgetfaclr   z Didn't find the getfacl command.r   zCmd '%s' failed: %szuser:%s:..xzutf-8r\   )r   r1   OSErrorst_uidS_IXUSRst_gidS_IXGRPr   rh   r   r   r   r   r   r   r^   r   ri   searchencode)
r:   uidr   statinfoflagr   r   r   r7   patterns
             r   _is_dir_searchabler   9  s!   777# oo||		||||Ht#$$ g
C'1'18 ##%
 !		'2h&G		'..)<cBCC;  (  		45s$   D, AD< ,
D98D9< EEc                 D   [         R                  R                  U 5      (       a  U nSnO![         R                  R                  U 5      u  p4/ nU(       aL  [	        X1U5      (       d  UR                  U5        [         R                  R                  U5      u  p4U(       a  ML  U$ )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
-)r   r   rw   splitr   append)r   r   r   r:   basefixlists         r   is_path_searchabler   _  sx     
ww}}Td+G
!'99NN7#g. $
 Nr   c                   l    \ 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g)_StorageBaseix  z9
Storage base class, defining the API used by DeviceDisk
c                     Xl         S U l        g N_conn_parent_pool_xmlselfr   s     r   __init___StorageBase.__init__|  s    
 $r   c                     [        5       er   NotImplementedErrorr   s    r   get_size_StorageBase.get_size      !##r   c                     [        5       er   r   r   s    r   get_dev_type_StorageBase.get_dev_type  r   r   c                     [        5       er   r   r   s    r   get_driver_type_StorageBase.get_driver_type  r   r   c                     [        5       er   r   r   s    r   get_vol_install_StorageBase.get_vol_install  r   r   c                     [        5       er   r   r   s    r   get_vol_object_StorageBase.get_vol_object  r   r   c                     [        5       er   r   r   s    r   get_parent_pool_StorageBase.get_parent_pool  r   r   c                     U R                   (       dK  U R                  5       (       a6  [        U R                  U R                  5       R	                  S5      S9U l         U R                   $ Nr   parsexml)r   r   r   r   XMLDescr   s    r   get_parent_pool_xml _StorageBase.get_parent_pool_xml  sO    $$)=)=)?)?$/

--/77:%<D!$$$r   c                     [        5       er   r   r   s    r   validate_StorageBase.validate  r   r   c                     [        5       er   r   r   s    r   get_path_StorageBase.get_path  r   r   c                     gr0    r   s    r   is_stub_StorageBase.is_stub      r   c                     [        5       er   r   r   s    r   is_size_conflict_StorageBase.is_size_conflict  r   r   c                     [        5       er   r   r   s    r   will_create_storage _StorageBase.will_create_storage  r   r   c                 `    Un[         R                  " SU R                  R                  -  5      e)Nz%s can't create storage)r   DevError	__class____name__)r   meterr?   s      r   rV   _StorageBase.create  s.    %(?(??A 	Ar   r   N)r   
__module____qualname____firstlineno____doc__r   r   r   r   r   r   r   r   r   r   r   r   r   rV   __static_attributes__r   r   r   r   r   x  sN    %$$$$$$%
$$$$Ar   r   c                   f    \ 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g)_StorageCreatori  zC
Base object for classes that will actually create storage on disk
c                 t    [         R                  X5        S U l        S U l        S U l        S U l        S U l        g r   )r   r   _pool_vol_install_path_size	_dev_typer   s     r   r   _StorageCreator.__init__  s4    d)
 

r   c                     [         er   r   r   r   s     r   rV   _StorageCreator.create      !!r   c                     [         er   r   r   s    r   r   _StorageCreator.validate  r  r   c                     [         er   r   r   s    r   r   _StorageCreator.get_size  r  r   c                    U R                   (       a  U R                  (       d  [        U R                  U R                   R                  R                  S5      S9nU R                  5       S:X  a'  U R                   R                  U l        U R                  $ [        R                  R                  UR                  U R                   R                  5      U l        U R                  $ )Nr   r   rl   )r   r   r   r   r   r   r   r   r   r   joinra   )r   xmlobjs     r   r   _StorageCreator.get_path  s    TZZ **//77:<F  "i/!..33
 zz  WW\\**D,=,=,B,BD
zzr   c                     U R                   $ r   r   r   s    r   r   _StorageCreator.get_vol_install         r   c                     U R                   $ r   r  r   s    r   get_vol_xml_StorageCreator.get_vol_xml  r  r   c                     U R                   (       dN  [        U R                  U R                  S U R	                  5       U R
                  R                  5       5      U l         U R                   $ r   )r   r}   r   r   r   r   r   r   s    r   r   _StorageCreator.get_dev_type  sN    ~~*4::t7H7H$+/+C+C+E+/::+?+?+ACDN ~~r   c                     U R                   (       a5  U R                   R                  5       (       a  U R                   R                  $ gNraw)r   supports_formatformatr   s    r   r   _StorageCreator.get_driver_type  s5      0022((///r   c                     gNTr   r   s    r   r   #_StorageCreator.will_create_storage      r   c                     g r   r   r   s    r   r   _StorageCreator.get_vol_object  r  r   c                 R    U R                   (       a  U R                   R                  $ g r   )r   r   r   s    r   r   _StorageCreator.get_parent_pool  s     $$)))r   c                     gr0   r   r   s    r   r*   _StorageCreator.exists  r   r   )r   r   r   r   r   N)r   r   r   r   r   r   rV   r   r   r   r   r  r   r   r   r   r   r*   r   r   r   r   r   r     sH    """	!!r   r   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
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                 \    [         R                  X5        UR                  U l        X l        g r   )r   r   r   r   r   )r   r   vol_installs      r   r   ManagedStorageCreator.__init__  s#      , %%
'r   c                 4    U R                   R                  US9$ )N)r   )r   rb   r   s     r   rV   ManagedStorageCreator.create  s      ((u(55r   c                 6    U R                   R                  5       $ r   )r   r   r   s    r   r   &ManagedStorageCreator.is_size_conflict  s      1133r   c                 6    U R                   R                  5       $ r   )r   r   r   s    r   r   ManagedStorageCreator.validate  s      ))++r   c                 R    [        U R                  R                  5      S-  S-  S-  $ )N      @)floatr   capacityr   s    r   r   ManagedStorageCreator.get_size  s(    T&&//069FBVKKr   )r   r   N)r   r   r   r   r   r   rV   r   r   r   r   r   r   r   r%  r%    s!    
(64,Lr   r%  c                   <    \ rS rSrSrS rS rS rS rS r	S r
S	rg
)CloneStorageCreatori  z
Handles manually copying local files for Cloner

Many clone scenarios will use libvirt storage APIs, which will use
the ManagedStorageCreator
c                 j    [         R                  X5        X l        X l        X0l        X@l        XPl        g r   )r   r   r   _output_path_input_pathr   _sparse)r   r   output_path
input_pathr&   sparses         r   r   CloneStorageCreator.__init__  s+      , 
'%
r   c                     U R                   $ r   )r   r   s    r   r   CloneStorageCreator.get_size      zzr   c                 0   SnS nU R                  5       S:X  a  [        U R                  5      nOs[        R                  " [        R
                  R                  [        R
                  R                  U R                  5      5      5      nUR                  UR                  -  n[        U R                  5      S-  S-  S-  nXS:  aP  U R                  (       a  [        S5      nOSn[        S5      nU(       a  US-  nU[        S5      US	-  US	-  S
.-  -  nX4$ )NFrp      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.rS   z+%(mem1)s M requested > %(mem2)s M availablei   )mem1mem2)r   r.   r   r   statvfsr   r:   r[   f_frsizef_bavailintr   r9  r>   )r   retmsgavailvfsneeds         r   r   $CloneStorageCreator.is_size_conflict  s    ')djj)E**RWW__RWW__TZZ-HIJCLL3<</E4::%,t3<|| ' ( LM s
GH"&;"7"'K"8;; < zr   c                     U R                   c%  [        [        SU R                  5       -  5      5      eU R	                  5       u  pU(       a  [        U5      eU(       a  [
        R                  " U5        g g )Nz+size is required for non-existent disk '%s')r   r=   r>   r   r   r   warning)r   r7   rJ  s      r   r   CloneStorageCreator.validate)  sf    ::Q  &(, 8 9 : : ((*S/!KK r   c                     [        S5      S[        R                  R                  U R                  5      0-  n[        U R                  5       S-  S-  S-  5      nUR                  X#5        U R                  X5        g )NzCloning %(srcfile)ssrcfilerB  )	r>   r   r   r   r8  rH  r   start_clone_local)r   r   text
size_bytess       r   rV   CloneStorageCreator.create4  sm    '(BGG,,T-=-=>?@ 4/$6=>
D% 	%,r   c                    U R                   S:X  a  [        R                  " S5        g U R                   U R                  :X  a  [        R                  " S5        g [        R
                  R                  U R                  5      (       d  U R                  (       a|  SnSnS n [        R                  " U R                  [        R                  [        R                  -  S5      n[        R                  " XR5        U(       a  [        R                  " U5        OSnSn[        R                  " S	U R                   U R                  XC5        S
nSu  px  [        R                  " U R                   [        R                  5      n[        R                  " U R                  [        R                  [        R                  -  S5      nSn	 [        R                  " Xs5      n
[        U
5      nUS:X  a  UR!                  5         OlU(       a  Xj:X  a  [        R"                  " XS5        O,[        R$                  " X5      nX:w  a  UR!                  5         OX-  n	X:  a  UR'                  U	5        M  Ub  [        R                  " U5        Ub  [        R                  " U5        g g ! U(       a  [        R                  " U5        f f = f! [(         aU  n[        R                  " SSS9  [+        S5      U R                   U R                  [-        U5      S.-  n[/        U5      S eS nAff = f! Ub  [        R                  " U5        Ub  [        R                  " U5        f f = f)Nz	/dev/nullz"Source dev was /dev/null. Skippingz.Source and destination are the same. Skipping.i   Ti  i   Fz0Local Cloning %s to %s, sparse=%s, block_size=%ss                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   r5   r   r   zError while cloning)exc_infozBError cloning diskimage %(inputpath)s to %(outputpath)s: %(error)s)	inputpath
outputpatherror)r8  r   r^   r7  r   r   r*   r9  r    O_WRONLYO_CREAT	ftruncater#   r!   readlenendr"   writeupdater   r>   r<   RuntimeError)r   r   rW  clone_block_sizer<  r%   zerossrc_fddst_fdilsbr   rJ  s                  r   rU   CloneStorageCreator._clone_local>  s   {* II:;t000IIFG
 t0011dll#FB!WWT..bjj0H"$R,HHRL/F		D&&(9(9	0 #$	!2!1!12;;?!2!2!#rzz!95B 9AAAAv		%*A.HHV/6!IIK!FA~Q! 4 ! !  "a HHRL J  2		/$? F G'+'7'7(,(9(9#&q6++
 #3'T12 ! !  "sL   AJ B*J; 7L 8AJ; L J;  J8;
LALLL 5M)r8  r7  r   r   r9  N)r   r   r   r   r   r   r   r   r   rV   rU  r   r   r   r   r5  r5    s&    4	-G!r   r5  c                   l    \ 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g)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                 R    [         R                  X5        X l        X0l        X@l        g r   )r   r   r   r   _driver_type)r   r   r   dev_typedriver_types        r   r   StorageBackendStub.__init__  s     d)
!'r   c                     U R                   $ r   )r   r   s    r   r   StorageBackendStub.get_path  r@  r   c                     g r   r   r   s    r   r   !StorageBackendStub.get_vol_object  r  r   c                     g r   r   r   s    r   r  StorageBackendStub.get_vol_xml  r  r   c                     g r   r   r   s    r   r   "StorageBackendStub.get_parent_pool  r  r   c                     gr)   r   r   s    r   r   StorageBackendStub.get_size  s    r   c                     gr  r   r   s    r   r*   StorageBackendStub.exists  r  r   c                     U R                   $ r   )r   r   s    r   r   StorageBackendStub.get_dev_type  s    ~~r   c                     U R                   $ r   )rs  r   s    r   r   "StorageBackendStub.get_driver_type  r  r   c                     g r   r   r   s    r   r   StorageBackendStub.validate      r   c                     g r   r   r   s    r   r   "StorageBackendStub.get_vol_install  r  r   c                     gN)FNr   r   s    r   r   #StorageBackendStub.is_size_conflict      r   c                     gr  r   r   s    r   r   StorageBackendStub.is_stub  r  r   c                     gr0   r   r   s    r   r   &StorageBackendStub.will_create_storage  r   r   )r   rs  r   N)r   r   r   r   r   r   r   r   r  r   r   r*   r   r   r   r   r   r   r   r   r   r   r   rq  rq    sM    (!r   rq  c                   f    \ 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g)StorageBackendi  zU
Class that carries all the info about any existing storage that
the disk references
c                 0   [         R                  X5        X0l        X@l        X l        U R                  b  S U l        U R                  (       a'  U R                  (       d  [
        R                  " S5      eS U l        S U l        S U l	        S U l
        S U l        g )Nzparent_pool must be specified)r   r   _vol_object_parent_poolr   r   r   _vol_xmlr   _existsr   r   )r   r   r   ry   parent_pools        r   r   StorageBackend.__init__  s    d)%'
'DJD$5$5""/1 1  $
r   c                 p    U R                   (       a  U R                  5       R                  $ U R                  $ r   )r  r  ra   r   r   s    r   r   StorageBackend.get_path  s*    ##%111zzr   c                     U R                   $ r   )r  r   s    r   r   StorageBackend.get_vol_object  s    r   c                     U R                   cM  [        U R                  U R                  R	                  S5      S9U l         U R
                  U R                   l        U R                   $ r   )r  r   r   r  r   r  r   r   s    r   r  StorageBackend.get_vol_xml  sN    == )$**))11!46DM!%!2!2DMM}}r   c                     U R                   $ r   )r  r   s    r   r   StorageBackend.get_parent_pool  r  r   c                    U R                   cm  SnU R                  (       a  U R                  5       R                  nO&U R                  (       a  [        U R                  5      n[        U5      S-  S-  S-  U l         U R                   $ )z!
Return size of existing storage
r   r0  )r   r  r  r2  r   r.   r1  )r   rI  s     r   r   StorageBackend.get_size  si     ::C&&(11

+*v-6?DJzzr   c                    U R                   GcV  U R                  (       a  SU l         U R                   $ U R                  c  SU l         U R                   $ U R                  5       S:w  a`  U R                  R                  5       (       dA  [        R                  R                  U R                  5      (       a  SU l         U R                   $ U R                  (       a  SU l         U R                   $ U R                  5       S:X  a  SU l         U R                   $ U R                  R                  5       (       a-  [        U R                  5      (       d  SU l         U R                   $ SU l         U R                   $ )NTrl   F)r  r  r   r   r   r   r   r   r*   r  rI   r   s    r   r*   StorageBackend.exists  s'   <<#( ||' ##$ ||# ##%2jj**,,''..,,# || ""$ || ""$	1# || **&&((&tzz22
  $ ||  %||r   c                    U R                   cp  SnU R                  (       a  U R                  5       n[        U R                  XR                  U R                  5       U R                  R                  5       5      U l         U R                   $ )z/
Return disk 'type' value per storage settings
N)r   r  r  r}   r   r   r   r   )r   rx   s     r   r   StorageBackend.get_dev_type  sm     >>!G**,*4::w@P@P+/+C+C+E+/::+?+?+ACDN ~~r   c                     U R                   (       a>  U R                  5       R                  5       (       a  U R                  5       R                  $ gg r  )r  r  r  r  r   s    r   r   StorageBackend.get_driver_type  s>    !1133'')000r   c                     g r   r   r   s    r   r   StorageBackend.validate  r  r   c                     g r   r   r   s    r   r   StorageBackend.get_vol_install  r  r   c                     gr  r   r   s    r   r   StorageBackend.is_size_conflict  r  r   c                     gr0   r   r   s    r   r   "StorageBackend.will_create_storage!  r   r   )r   r  r  r   r   r   r  r  N)r   r   r   r   r   r   r   r   r  r   r   r*   r   r   r   r   r   r   r   r   r   r   r  r    sH    4
 !2r   r  )&r   ri   r1   r   r   loggerr   storager   r   rC   r   r   r   r'   r.   r+   rA   rI   rQ   rf   rE   rZ   r}   r   r   r   r   r   r   r   objectr   r   r%  r5  rq  r  r   r   r   <module>r     s    
 	     / *1!5"J
DG*Z4 	B,#DL2)A6 )AX?l ?DLO L,I!/ I!X& &Rq\ qr   