
    W'Fg                     ^    S SK r S SKrSSKJr  SSKJr  S r " S S\5      r	 " S S	\5      r
g)
    N   )log)xmlutilc                 b   U n[         R                  " SSU 5      n [         R                  " SSU 5      n [         R                  " SSU 5      n [         R                  " SSU 5      n [         R                  " S	S
U 5      n [        R                  " X5      nU(       a  [        R
                  " SU5        U $ )Nz	arch=".*"zarch="i686"zdomain type=".*"zdomain type="test"zmachine type=".*" z>exe<z>hvm<z>linux<z>xen<z!virtinst test sanitizing diff
:%s)resubr   diffr   debug)xmlorigr
   s      '/usr/share/virt-manager/virtinst/uri.pysanitize_xml_for_test_definer      s    D
&&
5C
&&%'=s
CC
&&&C
0C
&&'3
'C
&&GS
)C<<"D		6=J    c                   $    \ rS rSrSrS rS rSrg)URI   z2
Parse an arbitrary URI into its individual parts
c                    Xl         U R                  U5      nUS   U l        [        [        R
                  R                  USS  5      u  U l        U l        U l	        U l
        U l        SU l        SU R                  ;   a)  U R                  R                  SS5      u  U l        U l        SU l        SU l        U R                  R!                  S5      (       a  SU R                  ;   at  SU R                  ;   a)  U R                  R                  S	S5      u  U l        U l        SR#                  U R                  SS  R%                  SS5      5      U l        S
U l        O9S	U R                  ;   a)  U R                  R%                  S	S5      u  U l        U l        ['        [(        R*                  " SU R                  5      5      U l        g )Nr   r   r   +F[]z]::Tz	^[0-9.]+$)uri_splitschememapurllibparseunquoteusernamehostnamepathqueryfragment	transportrsplitportis_ipv6
startswithjoinsplitboolr   matchhost_is_ipv4_string)selfr   	split_uris      r   __init__URI.__init__!   sU   KK$	lfll22IabMB	ty$*	$++*.++*<*<S!*D'DK	==##C((SDMM-At}}$+/==+?+?Q+G(tyGGDMM!"$5$;$;C$CDDMDLDMM!'+}}':':3'B$DM49#'dmm(L#M r   c                 ^   SS jnS=n=n=n=pgUR                  S5      nUS:  a  US U R                  5       XS-   S  pUS S S:X  a.  U" US5      u  pQUR                  S5      n	U	S:  a  USU	 nXYS-   S  nS	U;   a  UR                  S	S5      u  pS
U;   a  UR                  S
S5      u  pX4XQXg4$ )Nr   c                 l    S H  nU R                  X!5      nUS:  d  M    O   [        U 5      nXU XS  4$ )Nz/?#r   )findlen)urlstartcdelims       r   splitnetlocURI._split.<locals>.splitnetloc?   sC    *A: 
 CU#S[00r   r   r   r      z//@#?r   )r5   lowerr+   )
r/   r   r;   r   r    netlocr#   r$   ioffsets
             r   r   
URI._split>   s    	1 9;:::F:UHHSMq5bq'--/31uv;C2Aw$)#q1S)A:%a/H#QJK0Fcz #		#q 1cz YYsA.
e==r   )r$   r.   r!   r(   r"   r'   r#   r   r%   r   r    N)__name__
__module____qualname____firstlineno____doc__r1   r   __static_attributes__ r   r   r   r      s    N:>r   r   c                   >    \ rS rSrSrSr\S 5       rS rS r	S r
Srg	)
MagicURIY   a  
Handle magic virtinst URIs we use for the test suite and UI testing.
This allows a special URI to override various features like capabilities
XML, reported connection and libvirt versions, that enable testing
different code paths.

A magic URI has 3 parts:

    1) Magic prefix __virtinst_test__
    2) Actual openable URI, usually a test:/// URI
    3) Comma separated options

The available options are:

    * 'predictable': Generate predictable UUIDs, MAC addresses, and
        temporary file names.
    * 'fakeuri': The URI to advertise as the actual connection URI
    * 'connver=%d': Override the connection (hv) version
    * 'libver=%d': Override the libvirt version
    * 'caps=%s': Points to a file with capabilities XML, that will
                 be returned in conn.getCapabilities. Ex.
                 files in test/capabilities-xml/
    * 'domcaps=%s': Points to a file with domain capabilities XML, that
                    will be returned in conn.getDomainCapabilities

See tests/utils.py for example URLs
__virtinst_test__c                 @    U R                  [        R                  5      $ N)r)   rO   VIRTINST_URI_MAGIC_PREFIX)r   s    r   uri_is_magicMagicURI.uri_is_magicw   s    ~~h@@AAr   c                 2  ^ U R                  U5      (       d   eSSKJn  UR                  U R                  S5      nUR                  SS5      nUS   U l        [        U" [        U5      S:  =(       a    US   =(       d    S5      5      mU4S jnU" S5      U l	        TR                  SS 5      U l        TR                  S	S 5      U l        TR                  S
S 5      U l        TR                  SS 5      U l        U R                  (       a  [        U R                  5      U l        OU R                  (       a  SU l        TR                  SS 5      U l        U R                   (       a  [        U R                   5      U l        S U l        T(       a  ST-  U l        g g )Nr   )parse_optstr_tuplesr   ,r   c                 6   > U T;   nTR                  U S 5        U$ rS   )pop)fieldretoptss     r   pop_bool#MagicURI.__init__.<locals>.pop_bool   s    4-CHHUD!Jr   predictablefakeuricapsdomcapsconnverl    d(	 libverzMagicURI has unhandled opts=%s)rU   clirX   replacerT   r+   open_uridictr6   ra   r[   rb   capsfiledomcapsfileconn_versionintlibvirt_version_err)r/   r   rX   r]   r_   r^   s        @r   r1   MagicURI.__init__{   sG     %%%%,kk$88"=iiQA'C1(?Q(E2FG	
 $M2xx	40.88It4 HHY5 #D$5$5 6D\\ +D#xx$7#&t';';#<D 	84?DI r   c                 P    U R                   (       a  [        U R                   5      eg rS   )rp   RuntimeError)r/   s    r   validateMagicURI.validate   s    99tyy)) r   c                   ^^^^^	 U R                   (       a.  [        U R                   5      R                  5       mU4S jUl        S mSmU R                  (       a#  [        U R                  5      R                  5       mSUU4S jjnX!l        U R                  (       a1  UR                  mUR                  m	U4S jnU	4S jnX1l        XAl        gg)z
After the connection is open, we need to stub out various functions
depending on what magic bits the user specified in the URI
c                     > T $ rS   rM   )capsxmls   r   <lambda>3MagicURI.overwrite_conn_functions.<locals>.<lambda>   s    7r   c                 `    SS K nUR                  S U S S S /nUR                  U 5      nX#l        Ue)Nr   )libvirtVIR_ERR_NO_SUPPORTlibvirtErrorerr)msgr|   r   excs       r   _raise_nosupport_errorAMagicURI.overwrite_conn_functions.<locals>._raise_nosupport_error   s7    --tS$dKC&&s+CGIr   Nc                    > U nUnUnUnT(       a&  TnU(       a  [         R                  " SSU-  U5      nU$ T" S5        g )Nzarch>.+</archzarch>%s</archz+virtinst test driver fake domcaps nosupport)r   r	   )	emulatorarchmachinevirttypeflagsignorer]   r   
domcapsxmls	          r   fake_domcaps7MagicURI.overwrite_conn_functions.<locals>.fake_domcaps   sL    FFFF &&/D2H#NC

 #ACr   c                 *   > [        U 5      n T" X5      $ rS   r   )r   r   
origcreates     r   	newcreate4MagicURI.overwrite_conn_functions.<locals>.newcreate   s    237!#--r   c                 *   > [        U 5      n T" U 5      $ rS   r   )r   
origdefines    r   	newdefine4MagicURI.overwrite_conn_functions.<locals>.newdefine   s    237!#&r   rA   )	rk   openreadgetCapabilitiesrl   getDomainCapabilitiesrb   	createXML	defineXML)
r/   connr   r   r   r   rx   r   r   r   s
        @@@@@r   overwrite_conn_functions!MagicURI.overwrite_conn_functions   s     ==4==)..0G#2D 	 
d../446J	C 	C$ &2"<<JJ.' 'N&N r   )rp   rk   rm   rl   rb   ro   ri   ra   N)rG   rH   rI   rJ   rK   rT   staticmethodrU   r1   rt   r   rL   rM   r   r   rO   rO   Y   s4    6 !4B B @N*6'r   rO   )r   urllib.parser   loggerr   r   r   r   objectr   rO   rM   r   r   <module>r      s3    
   9>& 9>xC'v C'r   