
    W'Fgb                         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	J
r
Jr  SSKJr  SrS	rS
r " S S\	5      r " S S\	5      rS rS r " S S\	5      r " S S\5      rS r " S S\5      rg)    N   )generatename)progress)log)
XMLBuilderXMLChildPropertyXMLProperty)xmlutilz/devz/dev/disk/by-pathz/dev/mapperc                   `    \ rS rSrSr/ SQr\" S5      r\" S5      r\" S5      r	\" S5      r
Srg	)
_StoragePermissions   permissions)modeownergrouplabelz./modez./ownerz./groupz./label N)__name__
__module____qualname____firstlineno__XML_NAME_XML_PROP_ORDERr	   r   r   r   r   __static_attributes__r       +/usr/share/virt-manager/virtinst/storage.pyr   r      s4    H9Ox D	"E	"E	"Er   r   c                   8    \ rS rSrSr\" S5      r\" \SSS9r	Sr
g)	_StorageObject"   z[
Base class for building any libvirt storage object.

Meaningless to directly instantiate.
z./namez./targetT)relative_xpath	is_singler   N)r   r   r   r   __doc__r	   namer   r   r   r   r   r   r   r   r   "   s&     x D"#62<-13Kr   r   c                 b    U R                  5       n[        R                  R                  US5      $ )Nimages)get_libvirt_data_root_dirospathjoin)connroots     r   _preferred_default_pool_pathr,   3   s%    ))+D77<<h''r   c                     U R                  5        H;  nUR                  nUc  M  [        R                  R	                  U5      U:X  d  M9  Us  $    g N)fetch_all_poolstarget_pathr'   r(   abspath)r*   r(   poolxmlxml_paths       r   _lookup_poolxml_by_pathr4   8   sD    '')&&BGGOOH$=$EN * r   c                   >    \ rS rSrSS/rSr\" S5      r\" SSS9rS	r	g
)_Host@   r#   porthostz./@namez./@portTis_intr   N)
r   r   r   r   r   r   r	   r#   r8   r   r   r   r   r6   r6   @   s'    v&OHy!Dy.Dr   r6   c                   &   \ 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 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S:S j5       r\S 5       rS rS rS rS r\" \\5      rS rSr/ SQr \!" S5      r"\!" S5      r#\!" S5      r$\!" S5      r%\!" S 5      r&\!" S!S"S#9r'\!" S$S"S#9r(\!" S%S"S#9r)\!" S&5      r*\!" S'5      r+\!" S(5      r,\!" S)5      r-\!" S*5      r.\!" S+5      r/\!" S,5      r0\1" \2S-S.9r3S/ r4S0 r5S1 r6S2 r7S3 r8S4 r9S5 r:S6 r;S;S8 jr<S9r=g7)<StoragePoolH   zA
Base class for building and installing libvirt storage pool xml
dirfsnetfslogicaldiskiscsiscsimpathglusterrbdzfsc                    Sn U R                  XS5      n[        R
                  " SU5        SSKJs  Jn  UR                  U5      nUR                  S5       Vs/ s H  oDR                  PM     nn[        R
                  " SU5        U$ ! [         a-  nU R                  R                  U5      (       a  / s SnA$ e SnAff = fs  snf )z
Return a list of StoragePool instances built from libvirt's pool
source enumeration (if supported).

:param conn: Libvirt connection
:param pool_type: Pool type string from I{Types}
z	<source/>r   Nz%Libvirt returned pool sources XML:
%s./source/namezSources returning: %s)findStoragePoolSources	Exceptionsupportis_error_nosupportr   debugxml.etree.ElementTreeetreeElementTree
fromstringfindalltext)r*   	pool_type
source_xmlxmleETr+   rets           r   pool_list_from_sources"StoragePool.pool_list_from_sourcesX   s     !
	--iQGC 			:C@**}}S!  $||O<=<!vv<=		)3/
  	||..q11		 >s)   B
 C

C!B<5C;B<<Cc                     Sn[        U 5      nSnU R                  5        H  nUR                  U:X  d  M  Un  O   [        X5      nU(       a,  [        R
                  " SUR                  UR                  5        U$ )z
Helper to lookup the default pool. It will return one of
* The pool named 'default'
* If that doesn't exist, the pool pointing to the default path
* Otherwise None
defaultNz$Found default pool name=%s target=%s)r,   r/   r#   r4   r   rP   r0   )r*   r#   r(   r2   trypools        r   lookup_default_poolStoragePool.lookup_default_poolu   sq     +D1++-G||t#! .
 .d9GII<LL'"5"57r   c                    [         R                  U 5      nU(       a  U$  Sn[        U 5      n[        R                  " SU5        [        U 5      nUR
                  Ul        X$l        X4l        UR                  SSSS9  U$ ! [         a@  n[        R                  " SSS9  [        S5      W[        U5      S.-  n[        U5      S	eS	nAff = f)
zJ
Attempt to lookup the 'default' pool, but if it doesn't exist,
create it
r`   z1Attempting to build default pool with target '%s'T)buildcreate	autostartzError building default poolexc_infoz:Couldn't create default storage pool '%(path)s': %(error)s)r(   errorN)r=   rb   r,   r   rP   TYPE_DIRtyper#   r0   installrM   _strRuntimeError)r*   r2   r#   r(   defpoolrZ   msgs          r   build_default_poolStoragePool.build_default_pool   s     11$7N	.D/5DIII !$'G"++GLL"&OO$ttODN 	.II3dCQR!CF34Cs#-		.s   AA? ?
C		;CC	c                 ^    [        X5      nU(       d  gU R                  UR                  5      $ )z
Return the first pool with matching matching target path.
return the first we find, active or inactive. This iterates over
all pools and dumps their xml, so it is NOT quick.

:returns: virStoragePool object if found, None otherwise
N)r4   storagePoolLookupByNamer#   )r*   r(   r2   s      r   lookup_pool_by_pathStoragePool.lookup_pool_by_path   s)     *$5++GLL99r   c                 >   ^  U 4S jn[         R                  " X40 UD6$ )z
Finds a name similar (or equal) to passed 'basename' that is not
in use by another pool. Extra params are passed to generate_name
c                 X   > TR                  5        H  nUR                  U :X  d  M    g   g)NTF)r/   r#   )r#   poolr*   s     r   cb&StoragePool.find_free_name.<locals>.cb   s*    ,,.99$ / r   )r   generate_name)r*   basenamekwargsr|   s   `   r   find_free_nameStoragePool.find_free_name   s     	
 ))(A&AAr   c                 6   U R                  5       S   [        R                  :w  a6  [        R                  " SU R                  5       5        U R                  S5        U(       a7  [        R                  " SU R                  5       5        U R                  S5        gg)z
If the passed vmmStoragePool isn't running, start it.

:param pool_object: vmmStoragePool to check/start
:param refresh: If True, run refresh() as well
r   zstarting pool=%szrefreshing pool=%sN)infolibvirtVIR_STORAGE_POOL_RUNNINGr   rP   r#   rf   refresh)pool_objectr   s     r   ensure_pool_is_running"StoragePool.ensure_pool_is_running   st     a G$D$DDII(+*:*:*<=q!II*K,<,<,>?" r   c                     [         R                  " [        S5      U5         U R                  U5        [        [        SU-  5      5      e! [        R
                   a     g f = f)NStorage objectz)Name '%s' already in use by another pool.)r   validate_generic_namern   rv   r   libvirtError
ValueError)r*   r#   s     r   validate_nameStoragePool.validate_name   sf    ((+;)<dC	((. F    	  ## 		   A
 
A! A!c                    U R                  5       (       d  g U R                  U R                  :X  d4  U R                  U R                  :X  d  U R                  U R                  :X  a=  [
        R                  R                  [        U R                  5      U R                  5      $ U R                  U R                  :X  d  U R                  U R                  :X  a  [        $ U R                  U R                  :X  a  [        $ g r.   )supports_target_pathrl   rk   
TYPE_NETFSTYPE_FSr'   r(   r)   r,   r*   r#   
TYPE_ISCSI	TYPE_SCSI_DEFAULT_SCSI_TARGET
TYPE_MPATH_DEFAULT_MPATH_TARGETselfs    r   default_target_pathStoragePool.default_target_path   s    ((**II&II(II%77<<0;TYYH H99'499+F''99'(( (r   c                     U R                   U R                  :X  d  U R                   U R                  :X  a  gU R                   U R                  :X  a  gg)N_source_dir_source_adapter_source_device)rl   r   TYPE_GLUSTERr   r   s    r   _type_to_source_prop StoragePool._type_to_source_prop   s=    II(II*** YY$..($#r   c                 4    [        X R                  5       5      $ r.   )getattrr   r   s    r   _get_sourceStoragePool._get_source   s    t66899r   c                 6    [        X R                  5       U5      $ r.   )setattrr   )r   vals     r   _set_sourceStoragePool._set_source   s    t668#>>r   c                     U R                  5       (       d  g U R                  [        R                  :X  a  gU R                  [        R                  :X  a  gg )NrH   gv0)supports_source_namerl   r=   TYPE_RBDr   r   s    r   default_source_nameStoragePool.default_source_name   sC    ((**99,,,99000 1r   r{   )r#   rl   uuidcapacity
allocation	availableformathostsr   r   r   source_namer0   r   	auth_typeauth_usernameauth_secret_uuidz./source/dir/@pathz./source/adapter/@namez./source/device/@path./@typez./uuid
./capacityTr:   ./allocationz./availablez./source/format/@typez./source/initiator/iqn/@namerK   z./source/auth/@typez./source/auth/@usernamez./source/auth/secret/@uuid./target/pathz./source)r    c                     U R                   U R                  U R                  U R                  U R                  U R
                  U R                  4;   $ r.   )rl   rk   r   r   r   r   r   r   s    r   r    StoragePool.supports_target_path2  s?    yyt||T__1 1 	1r   c                 x    U R                   U R                  U R                  U R                  U R                  4;   $ r.   )rl   TYPE_LOGICALr   r   TYPE_ZFSr   s    r   r    StoragePool.supports_source_name8  s5    yyT..0A0AMM4==* * 	*r   c                     U R                   U R                  U R                  U R                  U R                  U R
                  U R                  4;   $ r.   )rl   r   r   	TYPE_DISKr   r   r   r   s    r   supports_source_path StoragePool.supports_source_path=  sA    yydoo!!# # 	#r   c                 x    U R                   U R                  U R                  U R                  U R                  4;   $ r.   )rl   r   r   r   r   r   s    r   supports_hostsStoragePool.supports_hostsC  s4    yy$2C2C  	r   c                 b    U R                   U R                  U R                  U R                  4;   $ r.   )rl   r   r   r   r   s    r   supports_formatStoragePool.supports_formatH  s$    yyT\\4??DNNKKKr   c                 6    U R                   U R                  4;   $ r.   )rl   r   r   s    r   supports_iqnStoragePool.supports_iqnK  s    yyT__---r   c                 B   U R                   [        R                  :X  dx  U R                   [        R                  :X  dZ  U R                   [        R                  :X  d<  U R                   [        R
                  :X  d  U R                   [        R                  :X  a  [        R                  $ U R                   [        R                  :X  d<  U R                   [        R                  :X  d  U R                   [        R                  :X  a  [        R                  $ [        R                  $ r.   )rl   r=   r   r   r   r   r   StorageVolume
TYPE_BLOCKr   r   r   TYPE_NETWORK	TYPE_FILEr   s    r   get_disk_typeStoragePool.get_disk_typeN  s    II...II111II...II///II--- +++II111II---II/// ---&&&r   c                    U R                  U R                  U R                  5        U R                  (       d;  U R                  U R
                  :X  a  [        U l        OU R                  5       U l        U R                  (       d  U R                  5       U l        U R                  (       d  U R                  5       (       a  SU l
        U R                  U R
                  :X  a  U R                  S:X  a  S U l
        g g g )Nauto)r   r*   r#   r0   rl   r   _DEFAULT_DEV_TARGETr   r   r   r   r   r   s    r   validateStoragePool.validate`  s    499dii0yyDNN* $7 #'#;#;#= #779D{{t3355 DKII'DKK6,A DK -B'r   Nc                 b   U R                  5       n[        R                  " SU R                  U5        [        R
                  " 5       (       a  SU;   a  [        S5      e[        R                  " U5      n U R                  R                  US5      nSn	U(       a    UR                  [        R                   5        U(       a  U	(       d   UR#                  S5        U(       a  U	(       d   UR%                  S	5        U	(       a   UR'                  5         [        U	5      eU R                  R)                  U5        U$ ! [         a(  n[        S5      [        U5      -  n[        U5      SeSnAff = f! [         a!  n[        S5      [        U5      -  n	 SnANSnAff = f! [         a!  n[        S5      [        U5      -  n	 SnANSnAff = f! [         a!  n[        S
5      [        U5      -  n	 SnANSnAff = f! [         a+  n[        R                  " S[        U5      5         SnAGNSnAff = f)z
Install storage pool xml.
z'Creating storage pool '%s' with xml:
%sz$virtinst-testsuite-fail-pool-installz,StoragePool.install testsuite mocked failurer   z!Could not define storage pool: %sNz Could not build storage pool: %sz Could not start storage pool: %sTz%Could not set pool autostart flag: %sz(Error cleaning up pool after failure: %s)get_xmlr   rP   r#   r
   in_testsuiterp   r   ensure_meterr*   storagePoolDefineXMLrM   rn   ro   re   r   VIR_STORAGE_POOL_BUILD_NEWrf   setAutostartundefinecache_new_pool)
r   meterrf   re   rg   rY   r{   rZ   rr   errmsgs
             r   rm   StoragePool.installt  s    lln		<ii	&   ""2c9MNN%%e,	.9911#q9D
 H

7==> &HA VM!!$' & v&&		  &E  	.783q6ACs#-	.  H=>QGH  H=>QGH  MBCc!fLM  &		D!!f& &&sx   5D: E/ 	F )G G9 :
E,#E''E,/
F9FF
G'GG
G6G11G69
H. H))H.)r   r   r0   )F)NFFF)>r   r   r   r   r"   rk   r   r   r   r   r   r   r   r   r   r   staticmethodr]   rb   rs   rw   r   r   r   r   r   r   r   propertysource_pathr   r   r   r	   r   r   r   rl   r   r   r   r   r   iqnr   r   r   r   r0   r   r6   r   r   r   r   r   r   r   r   r   rm   r   r   r   r   r=   r=   H   s    HGJLIJIJLHH 8  . . .4 : : 
B 
B # #&    )$:?;4K HIO 23K!":;O !89Ny!Dx D<5H^D9JM$7I01F
4
5Co.K12I 9:M"#?@o.KU:>E1*
#
L.'$(2r   r=   c                 r   S nU(       d  g   U(       d  UR                  U 5      nUR                  5          Uc  [        R
                  " S5        g  UR                  5       u  pVnUR                  U5        UR                  S5      (       a  g M=  ! [         a    UR                  S5      (       a   M{   Of = fM  )Ng?z.Couldn't lookup storage volume in prog thread.r   )storageVolLookupByNamer   rM   waitr   rP   update)volnamer{   r   eventvoldummy1dummy2allocs           r   _progress_threadr     s    
C
	11':HHJ
 {		BC
 #
U::a==	   	zz"~~ 	 s   (B  B43B4c                      \ rS rSrSr\S 5       r\S-S j5       r\" \	SS5      r
\" \	SS	5      r\" \	S
S5      r\" \	SS5      r\" \	SS5      rS rS rS r\" \\5      r\S 5       rS rS rS r\" \\5      r\S 5       rS r\" \5      rSr/ SQr\" S5      r\" S5      r \" SSS9r!\" S SS9r"\" S!5      r#\" S"5      r$\" S#5      r%\" S$5      r&\" S%SS&9r'S' r(S( r)S) r*S-S* jr+S+ r,S,r-g).r   i  zC
Base class for building and installing libvirt storage volume xml
c                 *    U (       d  gU S:X  a  gSU -   $ )N rawz.img.r   )fmts    r   get_file_extension_for_format+StorageVolume.get_file_extension_for_format  s    %<Syr   Nc                 .  ^^ / mU(       a  SnTR                  5       nU R                  5        H!  nUR                   U:X  d  M  UR                  n  O   UR                  R                   Hx  nUR                  5       n	U(       d  M  U	(       d  M%  [        R                  R                  U	5      U:X  d  MJ  TR                  [        R                  R                  U	5      5        Mz     UU4S jn
[        R                  TSS9  [        R                  " X*40 UD6$ )z
Finds a name similar (or equal) to passed 'basename' that is not
in use by another volume. Extra params are passed to generate_name

:param collideguest: Guest object. If specified, also check to
ensure we don't collide with any disk paths there
Nc                 T   > U T;   a  g[         R                  " TR                  U 5      $ )NT)r   check_libvirt_collisionr   )trynamecollidelistr   s    r   r|   (StorageVolume.find_free_name.<locals>.cb  s,    +%7722G= =r   T)r   )r#   r/   r0   devicesrC   get_source_pathr'   r(   dirnameappendr   r=   r   r   r~   )r*   r   r   collideguestr   
pooltargetpoolnamer2   rC   	checkpathr|   r
  s    `         @r   r   StorageVolume.find_free_name  s     J"'')H//1<<8+!(!4!4J 2
 %,,11 002	J99GGOOI.*<&&rww'7'7	'BC	 2	= 	**;*E))(A&AAr   VIR_STORAGE_VOL_FILEr   VIR_STORAGE_VOL_BLOCKr   VIR_STORAGE_VOL_DIR   VIR_STORAGE_VOL_NETWORK   VIR_STORAGE_VOL_NETDIR   c                 p    [         R                  " U /UQ70 UD6  S U l        S U l        S U l        SU l        g )NF)r   __init__
_input_vol_pool	_pool_xml_reflink)r   argsr   s      r   r  StorageVolume.__init__  s6    6t6v6
r   c                     U R                   $ r.   )r   r   s    r   	_get_poolStorageVolume._get_pool  s    zzr   c                     [         R                  U5        Xl        [        U R                  U R                  R	                  S5      S9U l        g Nr   )parsexml)r=   r   r   r*   XMLDescr!  )r   newpools     r   	_set_poolStorageVolume._set_pool  s9    **73
$TYYZZ''*,r   c                     U R                   $ r.   )r  r   s    r   	input_volStorageVolume.input_vol  s    r   c                 |   Xl         [        U R                  U R                   R                  S5      S9nUR                  U l        UR
                  U l        UR                  U l        UR                  R                  U R                  l        U R                  (       d   U R                   R                  5       U l        g g r)  )r  r   r*   r+  r   r   r   r   r   r   storagePoolLookupByVolumer{   )r   r   parsevols      r   set_input_volStorageVolume.set_input_vol  s     *.//*A*A!*DF oo ))"-- ( 4 4 9 9zzAACDI r   c                     U R                   $ r.   r"  r   s    r   _get_reflinkStorageVolume._get_reflink  s    }}r   c                     Xl         g r.   r8  )r   reflinks     r   _set_reflinkStorageVolume._set_reflink  s    r   c                     [         R                  " [        S5      U5         U R                  U5        [        [        SU-  5      5      e! [        R
                   a     g f = f)Nr   z+Name '%s' already in use by another volume.)r   r   rn   r   r   r   r   )r{   r#   s     r   r   StorageVolume.validate_name'  sf    ((+;)<dC	''- H    	  ## 		r   c                 8   U R                   (       ap  U R                   S:X  a  U R                  $ U R                   S:X  a  U R                  $ U R                   S:X  a  U R                  $ U R                   S:X  a  U R                  $ U R
                  R                  5       $ )Nfileblockr?   network)rl   r   r   rk   r   r!  r   r   s    r   _get_vol_typeStorageVolume._get_vol_type2  sv    99yyF"~~%g%&e#}}$i'(((~~++--r   volume)r#   keyr   r   r   r0   r   r   z./keyr   Tr:   r   z./target/format/@typer   z./backingStore/pathz./backingStore/format/@typez ./target/features/lazy_refcounts)is_boolc                 4   [         R                  " SU R                  5        SSKJn  UR                  U R                  U R                  5      u  p#nUnU(       d  [         R                  " S5        g [        U R                  UR                  S5      5      nXFl	        [         R                  " SUR                  5       5        UR                  5       (       d  [         R                  " S5        g [         R                  " SUR                  5        UR                  $ )	Nz0Attempting to detect format for backing_store=%sr   )diskbackendz(Didn't find any volume for backing_storer   z"Found backing store volume XML:
%szXbacking_store volume doesn't appear to have a file format we can specify, returning NonezReturning format=%s)r   rP   backing_storer   rK  manage_pathr*   r   r+  r{   r   r   r   )r   rK  r(   r   r{   dummyvolxmls          r   _detect_backing_store_format*StorageVolume._detect_backing_store_formatT  s    		D""	$!%11$))T=O=OP4II@A tyy#++a.9		7 	" %%''II ? @		'7}}r   c                 4    U R                   U R                  :H  $ r.   )	file_typer   r   s    r   r   StorageVolume.supports_formats  s    ~~//r   c                    U R                  U R                  U R                  5        U R                  (       d!  U R                  U R
                  :X  a  SU l        U R                  S5      (       a9  U R                  S:X  a)  U R                  R                  R                  5       U l
        U R                  R                  [        R                  :X  aJ  U R                  U R                   :w  a0  ["        R$                  " ['        S5      5        U R                   U l        U R)                  5       u  pU(       a  [+        U5      eU(       a  ["        R$                  " U5        g g )Nr  lazy_refcountsqcow2zNSparse logical volumes are not supported, setting allocation equal to capacity)r   r{   r#   r   rS  r   _prop_is_unsetr*   rN   conn_qcow2_lazy_refcountsrV  r!  rl   r=   r   r   r   r   warningrn   is_size_conflictr   )r   isfatalr   s      r   r   StorageVolume.validate{  s    499dii0{{t~~?DK/00T[[G5K"&))"3"3"M"M"OD>>+":"::$--/A F G H"&--//1V$$KK r   c                    U R                   (       a&  U R                  (       d  U R                  5       U l        U R                  5       n[        R
                  " SU R                  U5        SnSnU R                  S:X  a  U R                   (       dt  U R                  R                  R                  U R                  5      (       a@  U[        R                  -  nU R                  U R                  :X  a  U[        R                  -  nU R                   (       aF  U R                  S:w  a"  [        R"                  " SU R                  5        OU[%        [        SS5      -  n[&        R(                  " 5       n[*        R,                  " U5      n[&        R.                  " [0        SU R                  U R                  X4S	9nS
Ul         UR5                  5         [7        S5      SU R                  0-  nUR5                  XpR                  5        U R                  R9                  5       (       a  SnSnU R:                  (       a'  U R                  R=                  X R:                  U5      nO2[        R
                  " SU5        U R                  R?                  X$5      nURA                  U R                  5        URC                  5         [        R
                  " SU R                  5        UURE                  5         URG                  5         $ ! [H         aD  n	[        R
                  " SS
S9  SU R                  < S[K        U	5      < S3n[M        U5      SeSn	A	ff = f! URE                  5         URG                  5         f = f)z+
Build and install storage volume from xml
z)Creating storage volume '%s' with xml:
%sr   rW  r  z#skipping reflink for non-raw vol=%sVIR_STORAGE_VOL_CREATE_REFLINKr   zChecking storage allocation)targetr#   r#  TzAllocating '%(filename)s'filenamezUsing vol create flags=%sz%Storage volume '%s' install complete.zError creating storage volumerh   z Couldn't create storage volume 'z': ''N)'rL  backing_formatrP  r   r   rP   r#   r   r*   rN   pool_metadata_preallocr{   r   (VIR_STORAGE_VOL_CREATE_PREALLOC_METADATAr   r   r<  rZ  r   	threadingEventr   r   Threadr   daemonstartrn   is_really_testr0  createXMLFrom	createXMLr   endsetr)   rM   ro   rp   )
r   r   rY   
cloneflagscreateflagsr   trr   r   rZ   s
             r   rm   StorageVolume.install  s{    d&9&9"&"C"C"EDlln		>ii	& 
KK7"""II44TYY??7KKKK}}/ gNNN
<<{{e#A499Mgg4a9 9
 !%%e,$4"?#'99dii"FH 	GGI/0J		3JJCKK]]+yy''))
~~ii--c>>:N		5{Cii))#;LL'IIKII=tyyI IIKFFH  	.II5E		3q6#Cs#-		. IIKFFHs%   >DK> >
M?MMM "M1c                 6   U R                   (       d  gU R                   R                  5       S   nU R                  U:  a%  [        S5      U R                  S-  US-  S.-  nSU4$ U R                  U:  a%  [        S5      U R                  S-  US-  S.-  nSU4$ g)	z
Report if requested size exceeds its pool's available amount

:returns: 2 element tuple:
    1. True if collision is fatal, false otherwise
    2. String message if some collision was encountered.
)Fr   r  zThere is not enough free space on the storage pool to create the volume. (%(mem1)s M requested allocation > %(mem2)s M available)i   )mem1mem2TzThe requested volume capacity will exceed the available pool space when the volume is fully allocated. (%(mem1)s M requested capacity > %(mem2)s M available)F)r{   r   r   rn   r   )r   availrr   s      r   r[  StorageVolume.is_size_conflict  s     yy 		 #??U" 9 : #oo+>#477C
 #;]]U" 8 9  $}}=$58	8C 3<r   )
r  r   r!  r"  r   rc  r   r   rV  r{   r.   ).r   r   r   r   r"   r   r  r   r   r   r   r   rk   r   TYPE_NETDIRr  r&  r-  r   r{   r0  r5  r9  r=  r<  r   rE  rS  r   r   r	   rl   rH  r   r   r   r0   rL  rc  rV  rP  r   r   rm   r[  r   r   r   r   r   r     s      B B@ !7;I"91=Jw 5q9H7$=qAL'#;Q?K,
 Iy)D 
D |\2G    
. 'I H5O y!D
g
C<5H^D9J01Fo.K 56M !>?N .>N>0 (?Br   r   )r'   rf  r   r   r   r   loggerr   
xmlbuilderr   r   r	   r
   r   r   r   r   r   r,   r4   r6   r=   r   r   r   r   r   <module>r|     s    
      A A   * % #* #3Z 3"(
/J /^. ^B4iN ir   