
    Vhx                       d dl mZmZmZ eZd dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZ d dlmZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z% 	 d dl&m'Z' dZ(erd Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9d  Z:d! Z;d" Z<d# Z=d$ Z>d% Z?d0d&Z@d0d'ZA G d( d)eB      ZCd* ZDd+ ZEd, ZFd- ZGd. ZHd/ ZIy# e)$ r dZ(Y sw xY w)1    )absolute_importdivisionprint_function)deepcopyN)json)env_fallback)PY3)filterfalse)	urlencodeurljoin)	fetch_url)	to_nativeto_text)
Connection)NDO_API_VERSION_PATH_FORMATAZURE_L4L7_CONNECTOR_TYPE_MAPLISTENER_REDIRECT_CODE_MAPLISTENER_CONTENT_TYPE_MAPLISTENER_ACTION_TYPE_MAPLISTENER_PROTOCOLS)MultipartEncoderTFc                     | |kD  | |k  z
  S N )abs     f/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/cisco/mso/plugins/module_utils/mso.pycmpr   -   s    A!a%      c           
         | u ry| k(  ryt        |       t              ury| j                         D ]  \   yvr yt        j                        t                    s yt        t              rt        j                              rb yt        t              r*	 t              t        j                              k  s yt        t              rj                        k  r yj                        k(  r y y# t        $ rJ t        t        fdj                                    t        t        fd            z   }|rY  yY 0w xY w)z5Recurse through nested dictionary and compare entriesTFc                     | v S r   r   )ivalues    r   <lambda>zissubset.<locals>.<lambda>X   s    !u* r   c                 *    | j                        v S r   get)jkeysupersets    r   r$   zissubset.<locals>.<lambda>X   s.    opt|  uA  uA  BE  uF  pF r   )
typeitems
isinstancer'   dictissubsetlistset	TypeErrorr
   )subsetr*   diffr)   r#   s    ` @@r   r/   r/   1   si      F|4>)lln  
U= h (,,s+T%[9 eT"HLL-u5t$!5zSc):%;;  < s#HLL--HLL--A D   !K(<hll3>OPQTXYd  fF  HM  ZN  UO  O  !s   +&DAE'&E'c                 ^    t        d | j                         D              }dt        |      z   S )z,Append key-value pairs to self.filter_stringc              3   0   K   | ]  \  }}|	||f  y wr   r   ).0kvs      r   	<genexpr>zupdate_qs.<locals>.<genexpr>g   s     Pfq!!-Aq6Ps   
	?)r.   r,   r   )paramsaccepted_paramss     r   	update_qsr>   e   s(    PPPO?+++r   c                     t        t        dddgt        dgf      t        ddt        dgf      t        ddt        d	d
gf      t        dddt        ddgf      t        ddg dt        dgf      t        dt        dgf      t        dt        dgf      t        dt        dgf      t        dt        dgf      t        dt        dgf      
      S )NstrFhostnameMSO_HOST)r+   requiredaliasesfallbackintMSO_PORT)r+   rC   rE   MSO_USERNAMEANSIBLE_NET_USERNAMETMSO_PASSWORDANSIBLE_NET_PASSWORD)r+   rC   no_logrE   normal)debuginforM   MSO_OUTPUT_LEVEL)r+   defaultchoicesrE   MSO_TIMEOUT)r+   rE   boolMSO_USE_PROXYMSO_USE_SSLMSO_VALIDATE_CERTSMSO_LOGIN_DOMAIN)
hostportusernamepasswordoutput_leveltimeout	use_proxyuse_sslvalidate_certslogin_domain)r.   r   r   r   r   mso_argument_specrc   k   s    uuzll]g\hMijuuzl7ST55L>[qJr;st55Xfh~W  IA  Buh@[gs  wI  vJ  gK  L%<-*IJFl_<M-NO&L=/+JK<BVAW2XYu?Q>R/ST r   c                  \    t        t        dd      t        d      t        d            S )Nr@   Tr+   rC   r+   )nameschematemplater.   r   r   r   mso_reference_specrk   z   s)    ut,5! r   c                  r    t        t        dd      t        d      t        d      t        d            S )Nr@   Tre   rf   )rg   rh   ri   tenantrj   r   r   r   mso_l3out_reference_specrn      s1    ut,5!	 r   c            
          t        t        dddg      t        d      t        ddddg      t        d	d
      t        d	d
            S )Nr@   Tipr+   rC   rD   rf   privatepublicr+   rQ   rR   rT   Fr+   rQ   )subnetdescriptionscopesharedno_default_gatewayrj   r   r   r   mso_epg_subnet_specr{      sJ    v>e$y9h:OP/VU; r   c                  f    t               } | j                  t        t        dd                   | S )NrT   Fru   querierr{   updater.   subnet_specs    r   mso_subnet_specr      s*    %'KtDfe$DEFr   c                      t               } | j                  t        t        dd                   | j                  t        t        dd                   | j                  t        t        dd                   | S )NrT   Fru   r}   )primary)virtualr   r   s    r   mso_bd_subnet_specr      s^    %'KtDfe$DEFtDfe$DEFtDfe$DEFr   c                  p    t        t        dt                     t        dd      t        dd            S )Nr.   r+   optionsr@   Tre   rF   )dhcp_option_policyrg   version)r.   mso_dhcp_option_specr   r   r   mso_dhcp_specr      s1    V5I5KLut,%$/ r   c                  H    t        t        dd      t        dd            S )Nr@   Tre   rF   )rg   r   rj   r   r   r   r   r      s#    ut,%$/ r   c                  z    t        t        dd      t        d      t        d      t        ddddg            S )	Nr@   Tre   rf   consumerproviderr+   rC   rR   )rg   rh   ri   r+   rj   r   r   r   mso_contractref_specr      s:    ut,5!utj*5MN	 r   c                  h    t        t        dddg      t        dg dd      t        d            S )	Nr@   Ttagrq   )not_ininequals
not_equalshas_keydoes_not_have_keyr+   rR   rC   rf   r+   operatorr#   rj   r   r   r   mso_expression_specr      s:    uteW=5*r  ~B  C r   c                  h    t        t        ddgd      t        ddgd      t        dd            S )Nr@   
ip_addressTr   r   re   r   rj   r   r   r   mso_expression_spec_ext_epgr      s5    u|ntD58*tD- r   c                  H    t        t        dd      t        dd            S )Nr@   Tre   )rg   rm   rj   r   r   r   mso_hub_network_specr      s#    ut,. r   c                  H    t        t        dd      t        dd            S )Nr@   Tre   )epganprj   r   r   r   mso_object_migrate_specr      s#    ed+ed+ r   c                  0    t        t        dd            S )Nr@   Tre   rf   rj   r   r   r   mso_service_graph_node_specr      s    ut, r   c            
          t        t        ddgd      t        dt        t        j                                     t        d      t        dddg      t        d      	      S )
Nr@   rg   T)r+   rD   rC   r+   rR   rf   noneredirect)device_nameprovider_connector_typeprovider_interfaceconsumer_connector_typeconsumer_interface)r.   r0   r   keysr   r   r   "mso_service_graph_node_device_specr      sU    efXE $%>[>`>`>b9c dU+ $%&*9M NU+ r   c                      t        t        dd      t        dd      t        dddg      t        d      t        d      t        d      t        d            S )Nr@   Tre   bdrt   rf   )r   r   connector_object_typeprovider_schemaprovider_templateconsumer_schemaconsumer_templaterj   r   r   r    mso_service_graph_connector_specr      sS    540540
 #tdVL%(E*%(E* r   c                      t        t        dg d      t        d      t        d      t        d      t        d      t        d      t        d      t        dddg      t        dg d      		      S )
Nr@   )rZ   vpcdpcr   rf   rF   	immediatelazy)nativeregularuntagged)	r+   podleaffexpathvlanprimary_micro_segment_vlandeployment_immediacymoderj   r   r   r   %mso_site_anp_epg_bulk_staticport_specr      sd    u&<=eueuu#'U#3!u{F6KLu&GH
 
r   c                  H    t        t        dd      t        dd            S )Nr@   Tre   )rg   rb   rj   r   r   r   ndo_remote_user_specr     s#    ut,ut4 r   c                      t        dt        t        dddg      t        dddg      t        d      t        d      t        d            	      S )
Nr.   r@   enableddisabledr   rF   rf   )stateadmin_statedetection_multipliermin_receive_intervalmin_transmit_intervalr   rj   r   r   r   ndo_bfd_multi_hop_settings_specr     sP    EIz+BC%)Z1HI!%5!1!%5!1"&E"2
	 	r   c           
         |S|Qt        j                  | j                        \  }}t        |d      }	 |j	                  |       |j                          d }	d }
t        j                  j                  |      s6t        j                  |       | j                  dj                  |             t        j                  |t        j                        s6t        j                  |       | j                  dj                  |             | j!                  |      }	t        j                  j                  |      rt        j                  |t        j"                        s6t        j                  |       | j                  dj                  |             t        j                  |t        j                        s6t        j                  |       | j                  dj                  |             | j!                  |      }
nt        j                  t        j                  j%                  |      t        j"                        sSt        j                  |       | j                  d	j                  t        j                  j%                  |                   |	|
k7  r	 t'        j(                  ||       t        j                  |       y # t
        $ rJ}t        j                  |       | j                  dj                  t        |                   Y d }~d }~ww xY w# t
        $ rK}t        j                  |       | j                  d
j                  ||t        |                   Y d }~d }~ww xY w)N)dirwbz,Failed to create temporary content file: {0}msgzSource '{0}' does not existzSource '{0}' is not readablezDestination '{0}' not writablezDestination '{0}' not readablez"Destination dir '{0}' not writablezfailed to copy {0} to {1}: {2})tempfilemkstemptmpdiropenwrite	Exceptionosremove	fail_jsonformatr   closer   existsaccessR_OKsha1W_OKdirnameshutilcopyfile)moduleurldestcontentresptmpsrcfdfechecksum_srcchecksum_dests              r   
write_filer     s    ~'-%%&--8
F	fGGG 	
	LM 77>>&!
		&:AA&IJ99VRWW%
		&;BB6JK;;v&L 
ww~~dyyrww'IIf!A!H!H!NOyyrww'IIf!A!H!H!NOD)yy.8IIf!E!L!LRWW__]aMb!cd}$	fOOFD)
 IIfO  	fIIf!O!V!VW`abWc!dee	fF  	fIIf!A!H!HQUW`abWc!dee	fs0   K L 	L?LL	M/$AM**M/c                      |ri fd}|D cg c]V  } |||n|j                  d      |j                  d|j                  d            |j                  d      d      D ]  }| X c}}S g S c c}}w )Nc              3   n  K   | j                  d      }t        j                  d|      r|  y t        j                  d|      r|j                  dd      d   }|j                  dd      d   j	                  d      \  }}t        |      t        |      kD  rXt        t        |      t        |      dz         D ]3  }t        |       }|j                  dj                  ||      	       | 5 y j                  d
j                  |             y j                  dj                  |             y w)NinterfaceIDz((\d+/)+\d+$)z((\d+/)+\d+-\d+$)/   r   -{0}/{1})r  zIRange start is greater than or equal to range stop for range of IDs '{0}'r   z1Incorrect interface ID or range of IDs. Got '{0}')r'   re	fullmatchrsplitsplitrF   ranger   r   r   r   )format_dictidsslotsrange_start
range_stopxcopy_format_dictmsos          r   format_range_interfacesz>format_interface_descriptions.<locals>.format_range_interfacesQ  s    //-0C||,c2!!2C8

3*1-*-**S!*<Q*?*E*Ec*J'Zz?S%55"3{#3S_q5HI /+3K+@((//I<L<LUTU<V/W../
 MM&q&x&xy|&}M~"U"\"\]`"abs   D2D5nodeinterface_idr  rw   )nodeIDr  rw   r&   )r  interface_descriptionsr  r  interface_descriptionitems   `     r   format_interface_descriptionsr  N  s    	c& *@

%/&*&6d<Q<U<UV\<]#8#<#<^MbMfMfgtMu#v#8#<#<]#K

  



 
	
 I

s   AA/c                      e Zd Zd Zd Zd Zd Zd;dZd<dZd=dZ	d>d	Z
d?d
Zd?dZd@dZd@dZd@dZd Zd@dZd@dZd@dZd@dZd@dZdAdZd@dZd Zd@dZd Zd Zd Zd Zd Zd Zd Z d  Z!d! Z"d" Z#d# Z$d$ Z%d% Z&d& Z'dBd'Z(d( Z)dCd)Z*d* Z+d+ Z,d, Z-d- Z.d. Z/dDd/Z0d0 Z1d1 Z2d2 Z3dEd3Z4dFd4Z5dFd5Z6dFd6Z7d7 Z8dGd8Z9dHd9Z:d: Z;y)I	MSOModulec                 F   || _         |j                  | _        t        d      | _        ddi| _        d| _        t               | _        d | _        t        d d d       | _        t               | _	        t               | _
        t               | _        d | _        d | _        d| _        d| _        d | _        d | _        d | _        d | _        d | _        t+               | _        d | _        d | _        | j                   j2                  r*| j                   j5                  d       d	| j                  d
<   | j                   j6                  | j                  j9                  d      d| j                  d<   | j                  j9                  d      d| j                  d<   | j                  j9                  d      d| j                  d<   | j                  j9                  d      d| j                  d<   | j                  j9                  dd      rdnd| j                  d<   | j                  j9                  d      B dj:                  d"i | j                  | _        dj;                  | j<                        | _        nA dj:                  d"i | j                  | _        dj;                  | j<                        | _        | j                  j9                  d      | jA                  d       | j                  j9                  d      r| jC                          y | jA                  d       y tE        | j                   j6                        | _#        | jF                  jI                         dk(  rd| _        y | jF                  jI                         dk(  rd | _        y | jA                  d!       y )#NF)changedContent-Typez	text/jsonlocal)codemessagerO    z2Enable debug output because ANSIBLE_DEBUG was set.rN   r]   r`   Tr_   ra   r^      httpshttpprotocolrZ   z{protocol}://{host}:{port}/z
{0}api/v1/z{protocol}://{host}/rY   zJParameter 'host' is required when not using the HTTP API connection pluginr   r\   z3Parameter 'password' is required for authenticationzcisco.ndndz	cisco.msor  zCConnection must be identified as platform 'cisco.nd' or 'cisco.mso'r   )%r   r<   r.   resultheadersplatformexistingjsondataerrorpreviousproposedsentstdoutpatch_operationhas_modifiedfilter_stringmethodr   responsestatusr   r0   httpapi_logs	site_typecloud_provider_type_debugwarn_socket_pathr'   r   base_only_uribaseurir   loginr   
connectionget_platform)selfr   s     r   __init__zMSOModule.__init__q  s   mm5)&4  tT=
 F	# "	 F#' ;;KKQR*1DKK';;##+{{y)1)-I&{{{+3+/K({{/0804,-{{y)1)+I& 26D1QgW]DKK
# {{v&2%I%B%I%I%XDKK%X"+2243E3EF%B%;%B%B%QT[[%Q"+2243E3EF{{v&.#op{{z*

#XY()A)ABDO++-; $--/;> %#hir   c                     ||S | j                  dd|      }|s| j                  d|z         d|vr| j                  d|d|       |d   S )	zGet a domain and return its idzauth/login-domainsdomainsr)   rg   z-Login domain '%s' is not a valid domain name.r   idz'Login domain lookup failed for domain 'z': )get_objr   )rD  domainds      r   get_login_domain_idzMSOModule.get_login_domain_id  s^    >MLL-96LJNNNQWWNXq=NNSY[\]N^wr   c                    | j                   j                  d      | j                   j                  d      dk7  rd| j                  | j                   j                  d            }| j                   j                  dd      | j                   j                  d      |d}n8| j                   j                  dd      | j                   j                  d      d}t        | j                  d	      | _        t        | j                  | j
                  t        j                  |      d
| j                  | j                   j                  d      | j                   j                  d            \  }}|j                  d      dvrN|j                  d      | _        |j                  d      | _        | j                   dj                  di |       t        j                  |j!                               } dj                  di || j                  d<   y)zLog in to MSOrb   NLocalr[   adminr\   )r[   r\   domainId)r[   r\   z
auth/loginPOSTr^   r_   )datar6  r*  r^   r_   r8  )      r   zAuthentication failed: {msg}r   zBearer {token}Authorizationr   )r<   r'   rM  r   r@  r   r   r   r   dumpsr*  r7  r8  r   r   loadsread)rD  	domain_idpayloadr   auths        r   rA  zMSOModule.login  s    KKOON+7dkkoon>]ah>h001PQI#';;??:w#GUYU`U`UdUdeoUp  H  IG#';;??:w#GUYU`U`UdUdeoUpqG4<<6KKHHG$LLKKOOI.kkook2

d 88HZ/ HHUODM((8,DKNND=DDLtLNM**TYY[)(?(8(?(?(J'(J_%r   c                     	 t        j                  |      | _        | j                  dvr| j                  | _        yy# t        $ r.}t	        dd|z        | _        || j                  d<   Y d}~yd}~ww xY w)zHandle MSO JSON response output4Unable to parse output as JSON, see 'raw' output. %sr!  r"  rawNrT  rU        )r   rX  r-  r   r.   r.  r)  r8  )rD  	rawoutputr   s      r   response_jsonzMSOModule.response_json  sn    	 JJy1DM ;;22DJ 3  	2/ehi/ijDJ!*DKK		s   = 	A4$A//A4Nc           
         | j                   dk7  rt        | j                  |      | _        d}i }i }d }d }	| j                  j                  d      }
|
rG	 | j                  j                  dt        j                  |
      j                  i       t        |
d      }	i }|}t        j                  j                  |      r]| j                   dk(  rX| j                   j#                  t%        j&                  ||	      | j(                  j*                  |      }|j                  d
      }net-        | j(                  | j                  | j                  || j                  j                  d            \  }}|j                  j                  d      }|r|j/                  d      d   }n;| j                  dj'                  | j                  j                  d      |             |d   dv r|j                  d      | _        d}t        j                  j1                  |      }t        j                  j3                  |      r?t4        j4                  j7                  t        j                  j9                  |            |d<   | j                   dk(  rj|d   dk(  r|du r|}n| j                   j#                  dj'                  | j                  j/                  dd            | j(                  j*                  |      }nt-        | j(                  | j                  f|	| j                  || j                  j                  d      | j                  j                  d      d|\  }}	 |j;                         }|
r	 |	jA                          |xs |j                  d      | j                  k7  |d <   |j                  |       |j                  |       tE        | j(                  | j                  ||||j                  d!             ||fS # t        $ r | j                  d|
z  d       Y w xY w# t<        $ r |j?                  dd      }Y w xY w# tB        $ r Y w xY w)"Nr(  FsrczContent-LengthrbzUnable to open source file %sr   )r   elapsedapi_versionr   zcontent-dispositionr^   )r*  r6  r^   zContent-Dispositionz	filename=r  zBFailed to fetch {0} backup information from MSO/NDO, response: {1}backupr   r8  )i-  i.  i/  i3  locationTlast_mod_timerT  z/mso/{0}z/mso/unix_socket)rS  r*  r6  r^   rp  bodyr#  r   
redirectedr   )#r+  r   r@  r   r<   r'   r*  r   r   statst_sizer   OSErrorr   r   isdirrB  get_remote_file_io_streamr   r   r   r   r   r	  joinr   datetimeutcfromtimestampgetmtimerY  AttributeErrorpopr   r   r   )rD  r   destinationr6  rl  rr  
redir_infor   r   rS  rh  kwargscontent_dispositioncheck	file_namerO   r   s                    r   request_downloadzMSOModule.request_download  s   ==D t||T2DH

kkooe$U##%5rwws|7K7K$LMC "rww}}['A}}$!__FF/66;UYZ\`\g\g\n\npv
 '1nn5J&K#$-dkk488T\\bhrvr}r}  sB  sB  CL  sM  %N!z&+mm&7&78M&N#"/55kB1E	#g#n#nosozozo~o~  @H  pI  KU  $V  W (#';;%>>*5!
'',,{I>K 77>>+&&.&7&7&H&HIYIYZeIf&gF?#==D (#s*zU/B!@@ARARSWS[S[SaSabiklSmAnptp{p{  qC  qC  EK  L"	 	2 KKOOM:	 	JD$/))+
 JJL ",!Jtxx$((/J
#4;;+w$((S[J\]$$G  U#BS#HRSTUd " /((62./ ! s7   AO: P  ,Q :PP P>=P>	QQc                 
   || _         | j                  dk7  rt        | j                  |      | _        t               }| j                  dk(  r	 t        j                   j                  | j                  j                  d            rg| j                  j                  |t        j                  ||      | j                  j                  d      | j                  j                  d            }n:| j                  dj                  | j                  j                  d                   nt         s| j                  d
       t#        |      }|j$                  | j&                  d<   d| j&                  d<   t)        | j*                  | j                  | j&                  ||| j                  j                  d      | j                  j                  d            \  }}|j                  d      | _        |j                  d      | _        d|v rNd| _        |j                  d      dk(  rd| j2                  d<   n#|j                  d      dk(  rd| j2                  d<   | j.                  dv r:| j                  dk(  r|S j5                         }	|	rt7        j8                  |	      S i S | j.                  r| j.                  dk\  r	 | j                  dk(  r|j                  d      }
n#t7        j8                  j5                               }
d
v r&| j                   d j                  d#i |
||
!       i S | j                   dj                  d#i |
||
!       i S | j                  d"j                  |             i S # t        $ r+}| j                  dj                  |             Y d	}~d	}~ww xY w# t:        t<        f$ rL 	 t7        j8                  |j                  d            }
n"# t        $ r | j                  d|       Y nw xY wY w xY w)$z3Generic HTTP MultiPart POST method for MSO uploads.r(  rm  rk  remote_path)filer  zCUpload failed due to: No such file or directory, Backup file: '{0}'r   zNDO upload failed due to: {0}NzArequests-toolbelt is required for the upload state of this module)fieldsr  zgzip, deflate, brzAccept-Encodingr^   r_   r*  rS  r6  r^   r_   r   r8  modifiedTfalseFr  truerb    rq  
MSO Error:)r   rO   r!  MSO Error {code}: {message})r   rO   r[  z%Backup file upload failed due to: {0}r   )r   r+  r   r@  r   r.   r   r   r<   r'   rB  send_file_requestr   r   r   r   HAS_MULTIPART_ENCODERr   content_typer*  r   r   r7  r8  r4  r)  rY  r   rX  
ValueErrorr|  )rD  r   r  r6  rl  rO   r.  
mp_encoderr   outputr[  s              r   request_uploadzMSOModule.request_uploadG  s   	==D t||T2DHv==D N77>>$++//(";<??<<3::{Y]^![[__X6$(KKOOM$B	 = D NN'l's'stxtt  uD  uD  EM  uN  (ON  P )#fg)8J+5+B+BDLL(.ADLL*+"	2++//+6JD$ hhx(  $Dxx
#w.).I&*%/)-I& ;;..}}$::f--. 	% [[{{c!	D}},"&((6"2"&**TYY["9 W$NN'K'D'K'K'Vg'V]akrNs
 	 NN':|':':'EW'EDZaNb 	 NNFMMdSNT	{  N>EEeLMMNd #N3 DD"&**TXXf-=">$ D<dCDDsP   CM0 9AN' 0	N$9 NN$'P7$OPO;8P:O;;PPc                    || _         ||| _        |dk(  r|si S || _        |dv r|d|d<   nt        d      }d}| j                  j
                  r| j                  j                  | j                         |N| j                  dk(  r"t        j                  || j                         }n)d	j                  || j                         }n| j                   }||t        |      z   }	 | j                  j                  ||t        j                  |            }|j!                  d
      | _        | j$                  j'                  | j                  j)                                |j+                  dd       n|<dj                  | j4                  || j                   j7                  d            | _        n:dj                  | j4                  | j                   j7                  d            | _        || j"                  t        |      z   | _        t9        | j                  | j"                  | j:                  t        j                  |      | j                  | j                  j!                  d      | j                  j!                  d            \  }}j!                  d      | _        |j!                  dd      | _        d|v rNd| _         |j!                  d      dk(  rd| jB                  d<   n#|j!                  d      dk(  rd| jB                  d<   | j>                  d v r*	 |jE                         }|r	 t        j.                  |      S y| j>                  d%k(  ri S | j                  d&k(  r| j>                  d'k(  ri S | j>                  d(k\  r| j>                  | jB                  d<   |j!                  d$      }|	 tK        |t              r|}nt        j.                  |      }| _#        d,|v r'| j3                   d-j                  d0i ||||.       i S | j3                   d*j                  d0i ||||.       i S d/j                  |j!                  d
      |j!                  d            }|| _#        | j3                  |       i S y# t,        $ r}		 t        j.                  t1        |	            }
n?# t,        $ r3 t        t        ddj                  |	      t1        |	                  }
Y nw xY w| j$                  j'                  | j                  j)                                | j3                  |
d   d          Y d}	~	d}	~	ww xY w# t,        $ r:}	t        dd!j                  |	      "      | _#        || jB                  d#<   Y d}	~	yd}	~	ww xY w# tH        $ r |j!                  d$      cY S w xY w# t,        $ rC}	t        dd)|	z  "      | _#        || jB                  d#<   | j3                  d*||+       Y d}	~	d}	~	ww xY w)1z%Generic HTTP method for MSO requests.NPATCH)r  r  validate)r  r(  rk  z/api/{0}/{1}r   dater^  <Unable to parse error output as JSON. Raw error message: {0}r!  r"  	exceptionr.  r.  r"  r   z{0}api/{1}/{2}r  z{0}{1}r^   r_   r  r   r8  r  TFr  r  )rT  rU  rc  5Unable to parse output as JSON, see 'raw' output. {0}r`  ra  rq  rd  DELETE  r  r_  r  r   rS  rO   r!  r  r   rS  rO   r[  Connection failed for {0}. {1}r   )&r   r6  r3  r.   r   r>  rB  
set_paramsr<   r+  r   r   r>   send_requestr   rW  r'   r   r9  extendpop_messagesr}  r   rX  r   r   r?  lstripr   r*  r7  r8  r4  r)  rY  r.  r|  r-   )rD  r   r6  rS  qsrl  r   urirO   r   	error_objr  rq  r[  r   s                  r   requestzMSOModule.request  sR   	 DK WTI#'D  Y~!(:7+;;##OO&&t{{3&==D(5<<[_[d[deC(//TYYGCii~IbM)B33FCDAQR88E?!!(()E)E)GH& &+2243E3E{TXT]T]TdTdehTij#??4+=+=tyy?O?OPS?TU~88im3"ZZ%{{	2++//+6JD$ hhx,  $Dxx
#w.).I&*%/)-I& ;;/)
(#zz&11  [[CI [[H$);I
 [[C$(KKDKK!88F#DK!$-"&"&**T"2
 %
W$NN'K'D'K'K'Vg'V]ahlv}N~ I NN':|':':'EW'EDW[elNm I 7==dhhuotxxX]_ 
3'I/  C  	B $

71: 6I   $"4r4y4yz{4|  IP  QR  IS  T!I 	
 !!(()E)E)GH9W#5i#@AA	B^ % %)r;r;y;yz{;|%}
-3E* " (xx''(. ! K!%27mpq7q!rDJ)-DKK&NN|$TNJJKs   $BQ; V +T< .(V" ;	T9R$#T4$9S T4S  AT44T9<	U?0U:5V :U??V VV"	W.+8W))W.c                 P   g }| j                  ||d      }|i k(  s|g k(  r|S ||}t        |t              r8||vr"| j                  dj	                  |      |       |j                  |      }n|}|D ]  }|j                         D ]  \  }	}
|
	t        |
t              r\|j                  |	      }|Gt        |t              r7d}|
j                         D ]  \  }}|j                  |      |k7  sd} n |sq  |j                  |	      |
k7  s  |j                  |        |S )z,Query the MSO REST API for objects in a pathGETrl  r6  zKey '{0}' missing from data)r   rS  FT)r  r-   r.   r   r   r'   r,   append)rD  r   r)   rl  r  foundobjs	objs_listobjkw_keykw_value	obj_valuebreakoutkw_key_lvl2kw_value_lvl2s                  r   
query_objszMSOModule.query_objs  s;   ||Dk%|H2:L;CdD!$#@#G#G#LSWXII 	"C$*LLN " #h- #I ,It1L#(:B..:J &6K(}}[9]J+/ %& $!WWV_0!"$ S!'	"* r   c                 r   | j                  ||d      }|i k(  ri S |j                         D ]  \  }}|	t        |t              rX|j	                  |      }|-t        |t              s>|j                         D ]  \  }}	|j	                  |      |	k7  si c c S  q|j	                  |      |k7  si c S  |S )z5Query the MSO REST API for the whole object at a pathr  r  )r  r,   r-   r.   r'   )
rD  r   rl  r  r  r  r  r  r  r  s
             r   	query_objzMSOModule.query_objG  s    ll4[lG"9I & 
	FH(D)GGFO	(Z	4-H6>nn6F &2]$==5F#%I& H,	
	 
r   c                      | j                   |fd|i|}t        |      dk(  ri S t        |      dkD  r!| j                  dj                  |             |d   S )z4Get a specific object from a set of MSO REST objectsrl  r   r  z/More than one object matches unique filter: {0}r   )r  lenr   r   )rD  r   rl  r  r  s        r   rJ  zMSOModule.get_objY  s[    ttGGGt9>It9q=NNPWWX^_N`Awr   c                 x   ||S | j                  dd|      }|s$|s"| j                  dj                  |             nC|r|d   j                  d      s-|r+| j                  j                  dj                  |             y|d   j                  d      }|s"| j                  d	j                  ||             |S )
z Look up schema and return its idNzschemas/list-identityschemas)r)   displayNamez%Provided schema '{0}' does not exist.r   r   rI  z,Schema lookup failed for schema '{0}': '{1}')r  r   r   r'   r   r=  )rD  rh   ignore_not_found_errorschema_summary	schema_ids        r   lookup_schemazMSOModule.lookup_schemab  s    >M)@i]cd&<NNFMMfUNV q(9(=(=d(CI_KKDKKFST"1%))$/	NNMTTU[]fgNhr   c                 R   ||S | j                  dd|      }|s$|s"| j                  dj                  |             n3|rd|vr-|r+| j                  j	                  dj                  |             yd|vr"| j                  dj                  ||             |j                  d      S )	z"Look up a domain and return its idNzauth/domainsrG  rH  z(Domain '{0}' is not a valid domain name.r   rI  z*Domain lookup failed for domain '{0}': {1}rJ  r   r   r   r=  r'   )rD  rK  r  rL  s       r   lookup_domainzMSOModule.lookup_domainr  s    >MLLYVLD/NNIPPQWXNYt1}*@KKGNNvVWq=NNKRRSY[\]N^uuT{r   c                 l   ||S g }|D ]  }d}	 t        j                  |      }t        |t              r+d|v r'|j	                  d      }|j	                  d      dk(  rd}| j                  d      }|s$|s"| j                  dj                  |      	       n6|rd
|vr0|r.| j                  j                  dj                  |             |c S d
|vr"| j                  dj                  ||      	       |j                  t        |j	                  d
      |              |S # t
        $ r |}Y w xY w)z"Look up roles and return their ids	readWriterg   access_typerY  readOnlyrolesrg   z$Role '{0}' is not a valid role name.r   rI  z&Role lookup failed for role '{0}': {1})roleId
accessType)astliteral_evalr-   r.   r'   r  rJ  r   r   r   r=  r  )rD  r  r  r  roler  rg   rs           r   lookup_roleszMSOModule.lookup_roles  s1   =L 	ID%K''-dD)fn88F+Dxx.&8&0 W40A3#I#P#PQU#VW4q=.D  !G!N!Nt!TU
1}#K#R#RSWYZ#[\JJt155;;GH'	I( 
  s   AD%%D32D3c                 p    |j                  d      }|dk(  r|j                  d      d   | _        || _        y)z%Get site type(AWS, AZURE or physical)r+  cloudcloudProvidersr   N)r'   r;  r:  )rD  	site_datar:  s      r   lookup_site_typezMSOModule.lookup_site_type  s6    MM*-	'0}}5E'Fq'ID$"r   c                 r   ||S | j                  d|      }|s$|s"| j                  dj                  |             n3|rd|vr-|r+| j                  j	                  dj                  |             yd|vr"| j                  dj                  ||             | j                  |       |j                  d      S )z Look up a site and return its idNsitesr  $Site '{0}' is not a valid site name.r   rI  &Site lookup failed for site '{0}': {1})rJ  r   r   r   r=  r  r'   )rD  siter  ss       r   lookup_sitezMSOModule.lookup_site  s    <KLLtL,/NNELLTRNSt1}*@KKCJJ4PQq=NNGNNtUVWNXa uuT{r   c                    ||S g }|D ]  }| j                  d|      }|s$|s"| j                  dj                  |             n6|rd|vr0|r.| j                  j	                  dj                  |             |c S d|vr"| j                  dj                  ||             |j                  t        |j                  d      g               |S )z"Look up sites and return their idsr  r  r  r   rI  r  )siteIdsecurityDomains)rJ  r   r   r   r=  r  r.   r'   )rD  r  r  r  r  r  s         r   lookup_siteszMSOModule.lookup_sites  s    =L 		EDW40A3#I#P#PQU#VW4q=.D  !G!N!Nt!TU
1}#K#R#RSWYZ#[\JJt155;CD		E 
r   c                 R   ||S | j                  dd|      }|s$|s"| j                  dj                  |             n3|rd|vr-|r+| j                  j	                  dj                  |             yd|vr"| j                  dj                  ||             |j                  d      S )z"Look up a tenant and return its idNtenantsrH  z&Tenant '{0}' is not valid tenant name.r   rI  z*Tenant lookup failed for tenant '{0}': {1}r  )rD  rm   r  ts       r   lookup_tenantzMSOModule.lookup_tenant  s    >MLL	L?/NNGNNvVNWt1}*@KKELLVTUq=NNKRRSY[\]N^uuT{r   c                 T   |y| j                  dd|      }d|vr$|s"| j                  dj                  |             n:d|vr6|r4| j                  j	                  dj                  |             t               S t        |j                  d      |j                  d      d	   
      }|S )z4Look up a remote location and return its path and idNzplatform/remote-locationsremoteLocationsrH  rI  z)No remote location found for remote '{0}'r   
credential
remotePath)rI  r   )rJ  r   r   r   r=  r.   r'   )rD  remote_locationr  remoteremote_infos        r   lookup_remote_locationz MSOModule.lookup_remote_location  s    "9?PWfgv&<NNJQQRabNc$:KKHOOP_`a6Mfjj.VZZ5Ml5[\r   c                 H   |dg}nd|vr|j                  d       g }| j                  dk(  r&| j                  dd      }| j                  dd      }|D ]I  }t               }| j                  dk(  r'| j	                  |      }|&| j	                  |      }n| j                  d|      }|s$|s"| j                  d	j                  |      
       n6|rd|vr0|r.| j                  j                  d	j                  |             |c S d|vrBd|vr"| j                  dj                  ||      
       t        |j                  d            }nt        |j                  d            }||v r!| j                  dj                  |      
       |j                  |       L |S )z"Look up users and return their idsrP  r(  #/nexus/infra/api/aaa/v4/remoteusersr  r6  z"/nexus/infra/api/aaa/v4/localusersusers)r[   $User '{0}' is not a valid user name.r   rI  userID&User lookup failed for user '{0}': {1}userIdUser '{0}' is duplicate.)r  r+  
nd_requestr.   get_user_from_list_of_usersrJ  r   r   r   r=  r'   )	rD  r  r  r  remote_userslocal_usersuser	user_dictrI  s	            r   lookup_userszMSOModule.lookup_users  s    =IEE!LL!==D ??+PY^?_L//*NW\/]K 	DI}}$ <<T;O	$ $ @ @| TI LL4L@	%;#I#P#PQU#VW4y#8>T  !G!N!Nt!TU
9$9,NN'O'V'VW[]f'gNhx!89t!45Sy#=#D#DT#JKJJrN+	, 
r   c                     |j                  d      D ]a  }|j                  d      j                  d      |k(  s'|dk(  s$|j                  d      j                  d      |k(  sP|j                  d      c S  y)zGet user from list of usersr,   specloginIDr#  loginDomainNr&   )rD  	user_namelist_of_usersrb   r  s        r   r  z%MSOModule.get_user_from_list_of_users	  s}    !%%g. 	(Dxx##I.);QSASW[W_W_`fWgWkWklyWz  K  XKxx''	( r   c                 R   g }| j                   dk(  r| j                  dd      }|D ]|  }t               }| j                   dk(  r1| j                  |j	                  d      |j	                  d            }|s3|s1| j                  dj                  |j	                  d                   nE|rd	|vr?|r=| j                  j                  dj                  |j	                  d                   |c S d	|vrQd
|vr1| j                  dj                  |j	                  d      |             t        |j	                  d
            }nt        |j	                  d	            }||v r0| j                  dj                  |j	                  d                   |j                  |        |S )Nr(  r  r  r  rg   rb   r  r   rI  r  r  r  r  )
r+  r  r.   r  r'   r   r   r   r=  r  )rD  r   r  r  remote_users_dataremote_userr  rI  s           r   lookup_remote_userszMSOModule.lookup_remote_users  s   ==D  $0U^c d' 	KI}}$ <<[__V=TVgitixix  zH  jI  J	%;#I#P#PQ\Q`Q`agQh#ij4y#8>T  !G!N!N{_eOf!gh
9$9,NN'O'V'VWbWfWfgmWnpy'zN{x!89t!45Sy#=#D#D[__U[E\#]^JJrN#	$ 
r   c                 @    | j                  ddt        ||            S )zCreate a new labellabelsrR  )r  r+   )r6  rS  )r  r.   )rD  label
label_types      r   create_labelzMSOModule.create_label(  s    ||HV$5Wa:b|ccr   c                 h   |yg }|D ]  }| j                  d|      }|s| j                  ||      }d|vr%|s#| j                  dj                  ||             n5d|vr1|r/| j                  j                  dj                  ||             |c S |j                  |j                  d              |S )z9Look up labels and return their ids (create if necessary)Nr  r  rI  z(Label lookup failed for label '{0}': {1}r   )rJ  r  r   r   r   r=  r  r'   )rD  r  r  r  r  r  	label_objs          r   lookup_labelszMSOModule.lookup_labels,  s    > 		,EX5AI --eZ@	9$-C#M#T#TUZ\e#fgY&+A  !K!R!RSXZc!de
JJy}}T*+		, 
r   c                 &     dj                   di |S )zCreate anpRef stringz4/schemas/{schema_id}/templates/{template}/anps/{anp}r   r   rD  rS  s     r   anp_refzMSOModule.anp_ref>      LELLTtTTr   c                 &     dj                   di |S )zCreate epgRef stringz?/schemas/{schema_id}/templates/{template}/anps/{anp}/epgs/{epg}r   r  r  s     r   epg_refzMSOModule.epg_refB  s    WPWW_Z^__r   c                 &     dj                   di |S )zCreate bdRef stringz2/schemas/{schema_id}/templates/{template}/bds/{bd}r   r  r  s     r   bd_refzMSOModule.bd_refF  s    JCJJRTRRr   c                 V    d|v r|j                  d      |d<    dj                  di |S )zCreate contractRef stringrg   contractz>/schemas/{schema_id}/templates/{template}/contracts/{contract}r   )r'   r   r  s     r   contract_refzMSOModule.contract_refJ  s6     T>#xx/DVOVV^Y]^^r   c                 &     dj                   di |S )zCreate a filterRef stringz:/schemas/{schema_id}/templates/{template}/filters/{filter}r   r  r  s     r   
filter_refzMSOModule.filter_refQ  s    RKRRZUYZZr   c                 &     dj                   di |S )zCreate vrfRef stringz4/schemas/{schema_id}/templates/{template}/vrfs/{vrf}r   r  r  s     r   vrf_refzMSOModule.vrf_refU  r  r   c                 &     dj                   di |S )zCreate l3outRef stringz8/schemas/{schema_id}/templates/{template}/l3outs/{l3out}r   r  r  s     r   	l3out_refzMSOModule.l3out_refY  s    PIPPXSWXXr   c                 &     dj                   di |S )zCreate extEpgRef stringzE/schemas/{schema_id}/templates/{template}/externalEpgs/{external_epg}r   r  r  s     r   ext_epg_refzMSOModule.ext_epg_ref]  s    ]V]]e`deer   c                 &     dj                   di |S )zCreate serviceGraphRef stringzG/schemas/{schema_id}/templates/{template}/serviceGraphs/{service_graph}r   r  r  s     r   service_graph_refzMSOModule.service_graph_refa  s    _X__gbfggr   c                     t        j                  d      }|j                  |      }|j                  d      |j                  d      |j                  d      dS )Nz,\/schemas\/(.*)\/templates\/(.*)\/vrfs\/(.*)   r     vrfNameschemaIdtemplateName)r  compilesearchgroup)rD  rS  vrf_ref_regexvrf_dicts       r   vrf_dict_from_refzMSOModule.vrf_dict_from_refe  sO    

#RS ''-~~a( q)$NN1-
 	
r   c           	      \   |r)|dk7  r"t        j                  d      }|j                  |      }||j                  d      }|j                  d      }|j                  d      }|j                  d      }g dg dg d	g d
g dg dg dg dd}||   d   |||   d   |i}	| j	                  ||	||   d          |	S t        j                  d      }|j                  |      }|#|j                  d      |j                  d      dS | j                  dj                  |             y y y )Nr#  z.\/schemas\/(.*)\/templates\/(.*?)\/(.*?)\/(.*)r  r0  r/     r1  )bdNamer3  r4  )
filterNamer3  r4  )contractNamer3  r4  )	l3outNamer3  r4  )anpNamer3  r4  )serviceGraphNamer3  r4  )serviceNodeNamer3  r4  rB  )vrfsbdsfilters	contractsl3outsanpsserviceGraphsserviceNoder   zuni\/tn-(.*)\/out-(.*))r@  rm   z$There was no group in search: {data})rS  r   )r  r5  r6  r7  recursive_dict_from_ref_regexr   r   )
rD  rS  	ref_regexdicr  template_namecategoryrg   uri_mapr)  s
             r   dict_from_refzMSOModule.dict_from_refn  s1   DBJ

#TUI""4(CIIaL	 #		!99Q<yy|CAI!MGC%U#f	 H%a()H%a(-
 224ARSTAUVJJ'@A	&&t,?),11NN#I#P#PVZ#P#[\? 4r   c                    t        j                  d      }t        j                  d      }|j                  |      }||j                  d      ||<   |j                  d      }|j                  |      }|F|j                  d      }	| j	                  |	||j                  d      j                  d      dz          y y |||<   y )Nz(.*?)\/([a-zA-Z]+.*)z([a-zA-Z]+)\/(.*)r  r0  r  Name)r  r5  r6  r7  rL  rstrip)
rD  rS  r)  rP  continued_ref_regexsection_ref_regexdic_namenext_sectiondic_next_section	next_names
             r   rL  z'MSOModule.recursive_dict_from_ref_regex  s     jj)@AJJ';<&--d3'~~a0F8#>>!,L077E+,2215	229fFVF\F\]^F_FfFfgjFkntFtu ,  $F8r   c                     |D ]e  }|j                  d      r#| j                  |j                  |            ||<   t        ||   t              sK||   D ]  }| j                  |        g |S )NRef)endswithrR  r'   r-   r0   recursive_dict_from_ref)rD  rS  r)   r  s       r   r_  z!MSOModule.recursive_dict_from_ref  so     	7C||E" ..txx}=S	$s)T* I 7D0067		7 r   c                 X   |y|j                  d      Y| j                  d|j                  d            }|s$| j                   dj                  dd|i|       |j                  d      }|j                  d	      |j                  d	      }d
|z  }||j                  d      d|d|iS )z$Create a reference from a dictionaryNrh   r  r  z;Referenced schema '{schema}' in {reftype}ref does not existreftyper   rI  ri   z%sNamerg   r3  r4  r   )r'   rJ  r   r   )rD  rS  ra  r  ri   
schema_objrefnames          r   make_referencezMSOModule.make_reference  s     <88H)iTXXh=OPJ#g#`#g#g  $Apw  $A{  $A  B"t,I88J+xx
+HW$ TXXf%	H
 	
r   c           
         |yg }|D ]  }d|v r|j                  d      |d<   |j                  d      |j                  d      |d<   t        |j                  d      t        |j                  d            |j                  d      |j                  d      |j                  d            }|rJ|j                  t        |j                  d	      |j                  d
      |j                  d                   |j	                  |        |S )z Create a subnets list from inputNrv   rp   rw   rx   ry   rz   )rp   rw   rx   ry   noDefaultGatewayr~   r   r   )r~   r   r   )r'   r.   r@   r   r  )rD  rS  is_bd_subnetsubnetsrv   subnet_payloads         r   make_subnetszMSOModule.make_subnets  s   < 	+F6!%zz(3tzz-(0(.

8(<}%!::d#

= 9:jj)zz(+!',@!AN %%d6::i3HRXR\R\]fRgqwq{q{  }F  rG  'H  INN>*	+  r   c                 `   |yt        |t              r7g }|D ].  }d|v r|j                  d      |d<   |d= |j                  |       0 |S d|v rt	        |j                  d            |d<   |r@d|v r<|j                  d      }|!d|v rt	        |j                  d            |d<   ||d<   |d= |S )zCreate a DHCP policy from inputNr   dhcpOptionLabelr   )r-   r0   r'   r  rF   )rD  rS  dhcpsdhcpr   s        r   make_dhcp_labelzMSOModule.make_dhcp_label  s    <dD!E #'4/.2hh7K.LD*+12T"	#
 L!$((9"56DO(D0!%*>!?!-)?Q2Q034F4J4J94U0V"9-&8D"#)*r   c                    |g }|g }t        | j                        | _        t        | j                        | _        t	        | j                  t
              ra| j                  D ]R  }|j                  d      r ||v r| j                  |= | j                  |= 4||v s9| j                  |= | j                  |= T t	        |t
              r|D ]  }||v r>|| j                  v s|j                  |      |j                  |      | j                  |<   E|s-|j                  |      || j                  v r| j                  |= t|s;|j                  |      | j                  j                  |      k(  r| j                  |= |j                  |      |j                  |      | j                  |<    | j                  j                  | j                         y||| _        | j                  | _        yy)z*Clean up unset keys from a request payloadNr]  )	r   r,  r0  r1  r-   r.   r^  r'   r   )rD  updatescollaterC   unwantedr)   s         r   sanitizezMSOModule.sanitize  s   HH /T]]+	dmmT*}} <<&h c*		# H_c*		# gt$ 6(?dmm+w{{3/?/K)0S)9		# !W[[%5%=dmm+ IIcN !W[[%59J9J39O%O		# ;;s#/%,[[%5DIIcN)6. MM  + DI IIDM !r   c                 B   t        |      }|j                         D ]  \  }}||v r||= t        |t              r| j	                  ||      ||<   4t        |t
              sEt        |      D ].  \  }}t        |t              s| j	                  ||      ||   |<   0  |S r   )r   r,   r-   r.   delete_keys_from_dictr0   	enumerate)rD  dict_to_sanitizer   copyr8   r9   indexr  s           r   rv  zMSOModule.delete_keys_from_dict%  s    () ZZ\	\ 
Dy$Q'At$&*&@&@D&I #At$#,Q< \KE4!$-595O5OPTVZ5[(+E2\	\  r   c                 @   | j                   j                  d      dv rj| j                   j                  d      dv r| j                  | j                  d<   | j                  s(| j                  | j
                  k7  rd| j                  d<   | j                  r| j                  | j                  d<   | j                   j                  d      d	k(  r| j                  | j                  d
<   | j                  | j                  d<   | j                  | j                  d<   | j                  | j                  d<   | j                  | j                  d<   | j                  j                  | j                  d<   | j                   j                  d      dv rZ| j                  | j                  d<   | j                  | j                  d<   | j                  dk(  r| j                   | j                  d<   | j
                  | j                  d<   | j                  j"                  rK| j                  j                  d      du r.t%        | j                  | j
                        | j                  d<    | j                  j&                  di |  | j                  j(                  di | j                   y)z*Custom written method to exit from module.r   )absentpresentuploadrestoredownloadmovecloner]   rN   rO   r/  Tr  r2  rN   r6  r7  r8  r   r9  socketr|  r}  r1  r0  r  r3  current)beforeafterr4   Nr   )r<   r'   r/  r)  r4  r,  r2  r6  r7  r8  r   r9  r   r>  r1  r0  r3  _diffr.   r   	exit_json)rD  r  s     r   r  zMSOModule.exit_json6  s    ;;??7#'nn{{~.2CC*.--J'$$$--)G)-I&;;$(KKDKK! ;;??>*g5$(KKDKK!&*mmDKK
#$(KKDKK!!%DKK*.*;*;DKK'$(KK$<$<DKK!{{w'+@@&*iiF#*.--J';;')595I5IDKK 12!%I;;!;t!C"&}}mm#DKK
 	$V$,,r   c                    | j                   j                  d      dv rj| j                   j                  d      dv r| j                  | j                  d<   | j                  s(| j                  | j
                  k7  rd| j                  d<   | j                  r| j                  | j                  d<   | j                   j                  d      d	k(  r#| j                  | j                  | j                  d<   | j                  | j                  d<   | j                  | j                  d<   | j                  | j                  d<   | j                  | j                  d<   | j                  j                  | j                  d<   | j                   j                  d      dv rZ| j                  | j                  d<   | j                  | j                  d<   | j                  dk(  r| j                   | j                  d<   | j
                  | j                  d<    | j                  j"                  di |  | j                  j$                  dd|i| j                   y
)z0Custom written method to return info on failure.r   r  r]   r  r/  Tr  r2  rN   Nr6  r7  r8  r   r9  r  r1  r0  r  r3  r  r   r   )r<   r'   r/  r)  r4  r,  r2  r   r6  r7  r8  r9  r   r>  r1  r0  r3  r   r   )rD  r   r  s      r   r   zMSOModule.fail_json]  s    ;;??7#'<<{{~.2CC*.--J'$$$--)G)-I&;;$(KKDKK! ;;??>*g5xx#(,H%*.--J'(,H%%)XXE".2.?.?N+(,(@(@H%{{w'+@@&*iiF#*.--J';;')595I5IDKK 12!%I$V$5#55r   c                     | j                   }d|v r| j                  j                  d      |d<   | j                  |      }t	        j
                  |      | _        t        | j                  |       S )z6Check if changed by comparing new values from existingr\   )r,  r1  r'   &remove_keys_from_dict_when_value_emptyr   rW  r2  r/   )rD  r,  s     r   check_changedzMSOModule.check_changed  s^    ==!#'99==#<HZ >>xHjj*DIIx000r   c                    | j                  |j                  d            |d<   |d   D ]  }| j                  |j                  d      j                  d            |j                  d      d<   | j                  |j                  d      j                  d            |j                  d      d<   | j                  |j                  d            |d<    |j                  d      r|d= yy)	#update filter with more informationserviceGraphRefserviceNodesRelationshipconsumerConnectorbdRefproviderConnectorserviceNodeRefserviceGraphContractRelationRefNrR  r'   )rD  service_graph_objservice_nodes      r   update_service_graph_objz"MSOModule.update_service_graph_obj  s	   /3/A/ABSBWBWXiBj/k+,-.HI 	dL=A=O=OP\P`P`atPuPyPy  {B  QC  >DL01':=A=O=OP\P`P`atPuPyPy  {B  QC  >DL01':-1-?-?@P@PQa@b-cL)*	d   !BC!"CD Dr   c                    |r#| j                  |j                  d            |d<   |r||d<   n|j                  d      |d<   ||d<   |j                  d      |d<   |j                  d      |d<   |j                  d      s|j                  d      dk(  r|j                  d      |d<   |j                  d	      r|j                  d	      |d	<   y
y
)r  	filterRefr  
filterTyperx   contractScopecontractFilterTyperw   r#  prioNr  )rD  contract_obj
filter_objfilter_typecontract_display_nameupdate_filter_refs         r   update_filter_objzMSOModule.update_filter_obj  s    &*&8&89T&UJ{# (=J}%(4(8(8(GJ}%#.
< &2&6&6w&?
?#+7+;+;L+I
'(M*l.>.>}.MQS.S(4(8(8(GJ}% F#!-!1!1&!9Jv $r   c                     | j                  |      }dj                  |      }| j                  ||      }|s+| j                  j	                  dj                  |             |||fS )Nschemas/{0}r  z(Schema '{0}' is not a valid schema name.r   )r  r   r  r   r   )rD  rh   r  schema_pathrb  s        r   query_schemazMSOModule.query_schema  sf    &&v.	#**95^^KV^D
KK!!&P&W&WX^&_!`+z11r   c                     dj                  |      }| j                  |      }|s+| j                  j                  dj                  |             |||fS )Nr  z&Schema '{0}' is not a valid schema ID.r   )r   r  r   r   )rD  r  r  rb  s       r   query_schema_by_idzMSOModule.query_schema_by_id  sR    #**95^^K0
KK!!&N&U&UV_&`!a+z11r   c                 h    | j                  dd      }|s| j                  j                  d       |S )Nzschemas/service-node-typesserviceNodeTypesr)   zService node types do not existr   )r  r   r   )rD  	node_objss     r   query_service_node_typesz"MSOModule.query_service_node_types  s5    OO$@FXOY	KK!!&G!Hr   c                    | j                   dk(  rdj                  || j                         }|$| j                  dj                  ||      d      }n$| j                  dj                  |||      d      }|z|D ]  }||j                  d      k(  s|c S  |r-| j                  j                  dj                  ||             |S | j                  j                  dj                  ||      	       |S )
Nr  r  z!sites/{0}/aci/tenants/{1}/devicesdevicesr  z0sites/{0}/aci/tenants/{1}/devices?deviceType={2}rg   z3Provided device '{0}' of type '{1}' does not exist.r   )r:  r   r  r'   r   r=  r   )rD  site_idrm   r   service_node_typer  node_devicesdevices           r   lookup_service_node_devicez$MSOModule.lookup_service_node_device  s   >>W$%%fdnn=F$??+N+U+UV]_e+flu?vL??+]+d+delnt  wH  ,I  OX?  YL"& "&**V"44!M" &  !V!]!]^ik|!}~##%%*_*f*fgr  uF  +G%  Hr   c                 ,   |g }|j                         D ]|  \  }}||k(  r|j                  |       t        |t              r| j	                  ||||       t        |t
              sQ|D ]'  }t        |t              s| j	                  ||||       ) ~ |S r   )r,   r  r-   r.   find_dicts_with_target_keyr0   )rD  target_dicttargetreplacer)  r)   r#   entrys           r   r  z$MSOModule.find_dicts_with_target_key  s    >F%++- 	XJCf}k*%&//vwO%&" XE!%.77vwPVWX	X r   c                     || j                   }| j                  |||      }|D ]  }|j                  |      ||<   ||=  y r   )r,  r  r'   )rD  r  r  r  key_listr  s         r   replace_keys_in_dictzMSOModule.replace_keys_in_dict  sM    --K22;P 	D HHV,DMV	r   c                 B   |t        |      }|j                         D ]~  \  }}|||= t        |t              r| j	                  |||          2t        |t
              sCt        |      D ].  \  }}t        |t              s| j	                  |||   |          0  |S r   )r   r,   r-   r.   r  r0   rw  )rD  r  modified_targetr)   r#   entry_indexr  s          r   r  z0MSOModule.remove_keys_from_dict_when_value_empty  s    "&{3O%++- 	nJC}#C(E4(;;E?SVCWXE4(*3E*: n&K!%.CCE?[^K_`kKlmn	n r   c                 H    | j                  dj                  |      d      S )Nzschemas/{id}/validate)rI  r  r  )r  r   )rD  r  s     r   validate_schemazMSOModule.validate_schema  s%    ||3::i:HQV|WWr   c           	      F   |dv s|dv r| j                   j                  d       |D cg c]  }|j                  |      d dg i dfv s| }}|4|2|r0| j                   j                  dj                  |||||             y |3|1|r/| j                   j                  dj                  ||||             y |3|1|r/| j                   j                  dj                  ||||             y |r.| j                   j                  d	j                  |||             y y c c}w )
N)Nr#  z#The attribute and value must be setr   r#  r   zlWhen the '{0}' is '{1}', the {2} attributes must be set at the object position: {3} and the object name: {4}zSWhen the '{0}' is '{1}', the {2} attributes must be set at the object position: {3}zPWhen the '{0}' is '{1}', the {2} attributes must be set and the object name: {3}z7When the '{0}' is '{1}', the {2} attributes must be set)r   r   r'   r   )	rD  	attr_name
attr_valuerequired_attributestarget_objectobject_positionobject_name	attributeempty_attributess	            r   input_validationzMSOModule.input_validation   s{   
"jJ&>KK!!&K!L7J  E)mN_N_`iNjosuwy{}  BC  oD  ODI  E  E&;+BGWKK!! C  J  Jz+;_k " 
 ([-@EUKK!!ippz+;_ " 
 $)@EUKK!!fmmz+;[ " 
 KK!!&_&f&fgpr|  O  'P!  Q ) Es   DDc
                 	   || _         ||| _        |dk(  r|si S t        | j                  j                        }
|
j                  | j                         | j                   }|dk7  rdj                  || j                         }||t        |      z   }	 ||
j                  ||||d|      }n;|r'|
j                  ||t        j                  |            }n|
j                  ||      }|| j                  d<   |j                  d      | _        | j                   j#                  |
j%                                |j'                  dd       j                  d      | _        |j                  dd      | _        | j                  j                  | j                  d<   d|v rNd| _        |j                  d      dk(  rd| j                  d<   n#|j                  d      dk(  rd| j                  d<   | j4                  dv r'|dk(  r|j                  d      S |j                  d      S | j                  dk(  r| j4                  dk(  ri S | j4                  dk\  ri| j4                  | j                  d<   |j                  d      }|	 t9        |t.              r|}nt        j*                  |      }| _        d"|v r'| j1                   d#j                  d*i ||||$       i S d%|v rJt=        |j                  d%            d&kD  r-| j1                   d'j                  d*i |d%   d&   |||$       i S |	ri S | j1                   d(j                  d*i ||||$       i S |j                  d      | j                  d<   d)j                  |j                  d      |j                  d            }|| _        | j1                  |       i S y# t(        $ r}	 t        j*                  t-        |            }n?# t(        $ r3 t/        t/        dd	j                  |      t-        |      
            }Y nw xY w| j1                  |d   d          Y d}~d}~ww xY w# t(        $ rw}t/        ddj                  |            | _        || j                  d<   | j1                  d j                  | j:                  j                  d            ||!       Y d}~d}~ww xY w)+z$Generic HTTP method for ND requests.Nr  r#  r  rS  r   r  r^  r  r  r  r.  r"  r   r   r8  r  r  Tr  Fr  r  rb  ra  rq  r  r  r  r  r`  zND Error: {0}r  r!  zND Error {code}: {message}r  messagesr   z'ND Error {code} ({severity}): {message}z8ND Error: Unknown error no error code in decoded payloadr  r   )r   r6  r   r   r>  r  r<   r   r>   r  r  r   rW  r)  r'   r   r9  r  r  r}  r   rX  r   r.   r   r7  r8  r4  r-   r.  r  )rD  r   r6  rS  r  r  prefixfile_keyoutput_formatr  connr  rO   r   r  rq  r[  r   s                     r   r  zMSOModule.nd_request  s   	 DK WTI$++223$iiR<""64995C>	"%C	>--fc4tXV,,VS$**T:JKD,,VS9D"&DKKxxDH$$T%6%6%89HHVT" hhx, $ 8 8H  $Dxx
#w.).I&*%/)-I& ;;..%xx&88F## [[H$);I
 [[C$(KKDKK!88F#Dp!$-"&"&**T"2
 %
W$NN'J'C'J'J'UW'U\`gku|N} I  7*s7;;z3J/Ka/ONN'W'P'W'W'qZablZmnoZp'qx|  DH  RYN  Z I .!	NN'h'a'h'h'skr'sz~  FJ  T[N  \ I &*XXe_E"6==dhhuotxxX]_ 
3'I9  E  	> JJwqz2	  t={  >C  >C  DE  >F  RY  Z[  R\  (]  ^	 NNy1)<N==	>V ! p!%27n7u7uvw7x!yDJ)-DKK&NN'='=djjnnY>W'X_cjnNoopsP   B4N7 :(Q 7	QO P= 9PP=PP==Q	SA,S  Sc                     |dk7  s|dk7  r,	 t         j                   j                  |d      }t        |      S y # t        $ r | j	                  d      cY S w xY w)Nnowinfinitez%Y-%m-%d %H:%M:%Sz8ERROR: The time must be in 'YYYY-MM-DD HH:MM:SS' format.r   )ry  strptimer@   r  r   )rD  	date_timeformatted_date_times      r   verify_time_formatzMSOModule.verify_time_format}  sg    j!8f&.&7&7&@&@L_&`#.// "9  f~~*d~eefs   *8 AA)Nr  v1)NrR  r  )NNNr  )Nr  )r  )F)r#  )T)FNN)NT)NNFr   )NN)NNNNr#  r  r   F)<__name__
__module____qualname__rE  rM  rA  rf  r  r  r  r  r  rJ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r#  r%  r'  r)  r+  r-  r:  rR  rL  r_  rd  rj  ro  rt  rv  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r  r  p  s@   IjV	K<'R%hPdDL&P$ 8#"$#J0d$U`S_[UYfh
 ]D$
.0,7&r "%-N 6D	1E:&22*$ XQ<]~fr   r  c                 Z    | j                  d      }t        |d   |d   |d   |d         S )Nr  r0        r<  )r3  rB  rC  r4  )r	  r.   )serviceNodeRefStrserviceNodeRefTokenss     r   service_node_ref_str_to_dictr    s@    ,2237%a(-a0,Q/)!,	 r   c                      t        t        ddg d      t        ddg d      t        dddg      t        dd	d
g      t        ddg d      t        dddg      t        dddg      t        dd            S )Nr@   T)cluster_devicer  r   rq   )provider_cluster_interfacer   provider_interface_nameprovider_redirect_policy_tenantprovider_tenant)r+   rD   provider_redirect_policyprovider_policy)consumer_cluster_interfacer   consumer_interface_nameconsumer_redirect_policy_tenantconsumer_tenantconsumer_redirect_policyconsumer_policyr0   )r+   elements)cluster_interface_device$provider_connector_cluster_interface)provider_connector_redirect_policy_tenant"provider_connector_redirect_policy$consumer_connector_cluster_interface)consumer_connector_redirect_policy_tenant"consumer_connector_redirect_policyconsumer_subnet_ipsrj   r   r   r   +mso_schema_site_contract_service_graph_specr     s    !%54It!u-1/~.
 37ELm  pA  LB  3C+/UE_arDs+t-1/~.
 37ELm  pA  LB  3C+/UE_arDs+t fu= r   c                  N    t        t        dd      t        dg dd            S )Nr@   Tre   )rQ   iamacmr   )rg   certificate_storerj   r   r   r   listener_ssl_certificates_specr    s'    ut,E3LW[\ r   c            
      |    t        t        d      t        d      t        dddg      t        dddg            S )Nr@   rf   Tr   rq   r   )rh   ri   anp_nameepg_namerj   r   r   r   $listener_rules_provider_epg_ref_specr	    s;    5!54%A54%A	 r   c                      t        t        d      t        dt              t        d      t        d      t        d      t        d      t        d      t        d      t        d      	      S )NrF   rf   r@   r   rT   )	rZ   r'  r   intervalr^   unhealthy_thresholduse_host_from_rulesuccess_coderY   )r.   r   r   r   r    listener_rules_health_check_specr    sZ    u5*<=u5!%  e,V,u%u
 
r   c                     t        d$i dt        dd      dt        d      dt        dd      d	t        d      d
t        d      dt        d      dt        ddt        t                    dt        dt        t                    dt        d      dt        dt              dt        dt                     dt        dddg      dt        d      dt        d      dt        d      dt        d      dt        d      dt        d      dt        dt              dt        d      d t        dt        t                    d!t        dt                     d"t        dg d#      S )%Nrg   r@   Tre   floating_iprf   priorityrF   rY   r   actionaction_typer   r  r   rZ   r'  provider_epgr.   r   url_typeoriginalcustom
custom_urlredirect_host_nameredirect_pathredirect_queryresponse_coderesponse_bodyredirect_protocolredirect_portredirect_codehealth_checktarget_ip_type)unspecifiedr   	secondaryr   )r.   r0   r   r   r   r	  r   r  r   r   r   listener_rules_specr&    s    ut,e$ 540 u	
 u  edDAY<Z[ ud3L.MN u 5*<= 8:
 5:x*@A  U#!"  U+#$ &%& ''( &)* &+, E3EF-. &/0 t4N/OP12 46
3: 0WX; r   r   )J
__future__r   r   r   r+   __metaclass__ry  r   r  r   r  ry  r   r   ansible.module_utils.basicr   r   ansible.module_utils.sixr	   ansible.module_utils.six.movesr
   +ansible.module_utils.six.moves.urllib.parser   r   ansible.module_utils.urlsr   ansible.module_utils._textr   r   ansible.module_utils.connectionr   <ansible_collections.cisco.mso.plugins.module_utils.constantsr   r   r   r   r   r   #requests_toolbelt.multipart.encoderr   r  ImportErrorr   r/   r>   rc   rk   rn   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  objectr  r  r   r  r	  r  r&  r   r   r   <module>r4     s   A @  	 	 
    + 3 ( 6 J / 9 6 "D 
 !1h, 
/dDSf Sfl("q4  "!"s   0C" "C,+C,