5?$)lbFe6u0MbgERcqgH2PI}n8vXDJKs|30i*@#ACDgE6B- z+=32tWrf?0tWvAtqpC={Ski5xwD7YV%3D#FJI@clD_JccS*MfAG^)hg$DawqhV)e< zDe7@yio{l`fL)HL6QV3I1#54n93$Nrr<7?#iC0~4EQ~s64<*S_32RwpSYrp3XzaTd z6|y@DA%&jRtMfQct)h)6Tq`fd8&M+l2V{iP7{kK~R}ezZwms z%-$K=g6)O3wHkG0n`!_LK-2`MPpMHQ5|T)?YZhcPL8(Za=%SbX{|?QE1MsRqEvIL- z(mYq*^sqE2^V=C8l_7E=fSZI%rD#Kn#Du7ynjs~`ivN`ne(0Aes~u!$me%O657Vm` zy{trH5_fvb4yFhx5)=B!q!1^81&3&l?40;b$AG&UD<6FJom#XQN24+E=0b{$H^Qa# zvi_ztj`_7du><<44<+x~zgJX-)EIqsp4e5qm*p1~NkeihA|9TVbqmAD)KjL~eUE*6 zmxSS puT*Q-X!gr;ojPsKq4EvNN~r9L9L>n=S}D{CmeE#S;#c?h9{ zp14w^5x(_4u?H@!3PVAC#I&?jIC$S7VQKLYQC3wqg6K>*MG{lb?43i8F!%Rn^;^te zeJp;DYQ=hTJ~8UUmd{~f9LIUYs3PrS#kD@Mam#WrDBhyx!*RQ5am$1b;d-Cg-X@0d zbc*m)5`J2P!#qWigTyR8Onuc|I}WWjws~&0&KBnhSw}L7?9g4Cy@4NBGO&brYIB+p z>~*d(P-7>N>dS;zBq{LEW3(@#U5N|062Wx|Mbi48?#b#i%}4#8wG{ 1{->UBw8{6~E}R#W>PN@xe)c5$Uh NRTN*HB$+HTp(C^5VY&w((7`;9rCFB<~NAWM&C-|PjGsrK9Vwsvn9Wd}S z%`}z}sbRCnVDrm!{~E2opQQiC6>!4#>G1F#>J22KjVY7S8SSU9M}GF@(Js_Vd0U&B zHAifu`0ki+mNaPCuUB6Zl6U`Y(%n2{xFDAR@vcju#U #7GM;xqF}RYMj@ znUse =);9G8Q%aib zDp88hXd`FtuxvPSJMC_a6sKGM;sSpXDl?$H1IDeABj8>5^>Uc=%zF`_ C9^K~~(XC*OfD7ylxQixfC{^!{+p$%jP( zvy^UBnGCs_;?t7^SbMbg^cl f};)gpz(bkfWKXOD=_wr9bMH;QswK$sTk|NWS(|fZrU8^H! z4b6r (+wGAxmLquWoAB^T6|kApYlmh!3rso65Qy9oV=(8zOQZt zvc%t`RPhrp(RQaSs)g^W)w|?wC{Yl6*A^G#%wc@Gu1Ho8e>y7xsWlR2Sz{+D8HPDq z9LE+d3CI-LBRBV_Xcf%Mu`YpR@Q01w%M?kd@muSDr^h-EJSR$^uuuqF@)xGa;= y_c=PkRzjHgXuYFpH!FEnt?3KVu{TLHJFpWY X>8T$fJ)D{WBk$ z2LG&E2U0jnV6fy@rcs>K5v&qs;`r-e+RU({PNmr*`fF=z!0#8g?MH-l5&&nYKF7%o z`S~=G0#rY(EFH(a!&*ly&FHglzkZ@XNvKI^N#vvoVR$~CFCI?8f??0)%a)08N-GTm z#E6;GriCey;Or`qaIE;*+*BLoal+{-k?`v(5^sMA>#x`$>Y-V)RkNQs=43H`^6j^) zrc>l|Pd_E5-E>&EX-aV z30Bu4DKoZUzlemyiF8(
Ddl5rR*+R4YvxZ%C1p$(Nim zG|<-C(c(~IF&O^y5B)=$$x28$)M8b0xp|#+Uk!Fqv>er^Y8EGjKL~}Ljl#C$s0(!L z@$OA_7w7vs8U_Z4jQD9~IEr#Jmt%clY;7XTgimTnkaFlZcUDK!Ur)%&rv1HBCX3iE zzU(r%WAfdhA1mVD4gWH4=t=lre({A+n0bf><|f~v-LPUXYR}Zv6j}65H{2i#|MB}; zS=eg8=qHuoH*ArV0h_?dc0RGEop~ngyWjq-Y}MzTQ>MsTdel-RH+aZyGWg4{x*Fy^ z`UpJqz 1CP#~3qHJ8;_tuyhFkBr6Ii25 zR*)ia*vL_EAJRxmlBflJ|3eRn^bQ?143_=)qpS=?R>MKFN+iTcj(KNCndVFDS~-Ly z- &>P0CI%Zel tIiG >&rth?CLO{ zw7f*}JE269ha-w4M0B~f*Y9N}Iz8iXUn $DKxpMM3Sv*7AaL+SN_yyq$L$*XJ?1+FO&+%0e@5!Npx1!G#uR4 z*7k)1G{*-Dhg+qQn2wqv86kLMcO5Q;$!6h1e7gM^Rg+oN70HN5#LsPtkhViXLHF NN zGEtP*H12M9Z4krd#uF8%yW-o8GL7K$oFb(};{g>H;{g?h7a&RVI_ejM)i^F1agng2 zWtv3hX+
pzW zlX63k+^nxyR6IW8T9NT6a5b9og-qL2U4IB}HaQeqPKRPR8s`FT#euzrI7Tb}3Jd*9 z)o9~!(Ukx n~b-GPdah)Ak ZfbFFF#&_ha@0?Z)R~}&IAvUWSW$?G|1A*+ShTJ*{P +!$nieSQAs=62V2`^K9BIlU1iAP7~s#lzew$`Meyne2Ik#KD>8ad755H-*4) zcM%Erk_VUMXRY)yx1Kdf+`CK{9`XSiFTXu;N*k^edJzv%J=crmd&(ebohXi!;*=qG zTmtS(059MCy|~cd&;62&m*5G5EDHuRf|a$6#>wW8TmsHX0Bg)TtTFx0VYH4ZrUr>M zq7Q3C(|5pFXP4*X63~_a)|h2jW0q(`xStX;gG_|;t=v}+FCjJ(5PmEv^zRvqvZHR0 zIBL2MM@@Uif>~ZBmw*`wBne3u^eD)F-b^05uu(I}@~WB%cr~$e*RR^;oag5fFem{$ z1t9~^8{A?L+!k0=43albZRv<-_JRbWw7|esgTw)wML2M?uNUOWY2XrYL;`|upOS){ z?;XLVg2WYr TVRXItftnr4L(fBNf96?)dyMl?30lMgL9IhB%R--=k$wa7heso z8~Nk!jZj%r4-Ji5p>gw8z=0OnXIOt2*e`a2_GmyK;C{^G?DEI*J7SR7L`}n5v56s# z)^o=XHbtu_Svh31_wAMqL-EO-Jqavc`Wwu9aX!@5(b8pm?#lB=!x0A$vxmfDZl`WN zvu%*&6}6WKAo#dNJ}hNx#nrAm&yS5U>JdDuC=H(3J4X+s%cfOf%{KndC&b##O(C3c z (0k--^Yf|V^!s&}^U{O`8OW2)5o1f-`?+?$1RG%#| zJ4a9yF@5v>N_gn;x1v~LXHjoIb9-kX+P-AisU$b|Z>z;xZgb(_O*J-EbFCKK74lUz z2cXaViV&+)2WP?gy T;L}P46V|0AF#Ej&u8sw5u1yF>|NG;bA2*PLOE%4-@TVQETbY3!2 zz(2?K&?3o`@w1+M2fkeF{+-d=7w5x?N9_mu4<88K($hRC3q7K&9J*!7AZdOPjnPyd zJ%X*KSux1<4!raqmNvsxKh^=-tt;-6gK}X|c8V*woj`iZrT0L4yYu_Uk2!pAxb*C! zoFLJ2IPi*u2k?r7n~V}>*tkk7YH?UISZEZnn{cr*NHv~LSyT((Rkx@mS&n;izg!re z=N-d5>7pr?c~Q&w;B6N{zn!;NOG?N%!6%%7eahF2FlWdhal-#AM0TJNgwcTUl0i!O z-PqI)`+Qy{jk4umab%&maKRQ58<|hJ1ZzaxqGQ+f+`b3Qo^rWeG;y6DZ~GchSeU&! z5)%;zX3DB+E(!*`V~mj)ie>tCxWb1ujcJ5+=x6p$tsMMG1zuVl{XXUckNg+D#R+>m zE-f_$UVYqfOU+JEagnzT+DV`hD?nWU>@TKczY*`E_m=Z&4XGt18X!9Hn;NZTL-BKP zRQ4p7M`Z)pIX?N4sfOs$0-85%9Q4Td#PKv*B*rv8(uy8kgN)_cR6VJ=ZIHjL8xM6` z!bcH(LJI6R;3GZKBBt%~aRqE`vo s2FF z(HHrThJGd2tER
oMyyJ?Wi{u&F7P5RBX0|tI> zn|-P=txm1{Fft#C9b5o!b $|`Gq# p3vTHESEQTbW>!N48v z4u!cVTmrNVwW1=JRahuAuvA$MiN<&aOW;rY5?KECI8|dL%-^jU1HZ1<-nW;VDu}fu z)tYA9uDF=stZ!=#Wy#6O5SyWN6o%4Kt!Ts;X;hj `zX!0|Ep{fYfGbf-g^2rIOpWU zL~wsjrm4PSq$#46>u)nkMwf)c_GqS*@sL4c^?9!}f&0B90ov4TWi*wVu>UJJHj;Ys z=>0`Qe0HWY^NQY)p7$xifz-K-%8)^_2>$f01js0N=w|LjybFG)6Q@+X%N3^#2U5o} zDToGHT2=cHi{MXhOJFgc(ewU+<`x9d{3g|wCZ;*PErbN7uA_zw1QTSTU;=AO!Wtbv zX{8C<`@>Ce*Ghgbu0)ic@zP~fL=11TdPXJY2_d6A9FLwf U!0Gq^ddbqU}W z$Ga&vH%RL;^hD0*@Elm0do=5)30sOAs=4!q1aP!9gDCOgYJnrYK@z9Jssv~u0M(Xe zkAEGGi_}lBxlhw7%{-sF1bldE)$!^{JT~4Wuny-eZyqR{){4l&kGOf7YD@0CApxHd z4DRj?QaBY(NZ_hI-7O9HkWnt&6t=X|36eMtgA%B$tRH}VNTI|aJO_)B1m2qe4bTpa zv#xs3Fa^|v?S;2_nQ`ZRUkgKU=^b~mkw9y(y@YOL+b%Z6Cw{3p-NUxK$(Sz4ihPjY zn2V>v3vVnC^KETv77f$r*{EM1nhy&OF*j$4XVQyJSf|dO?U6H5#xoCSOTY)d?R>az z*>i_jX_FjZDMNbAfPMPCsY>*I{ojWHJKU+7Mv-(MBGrnxq%jPJ4lI87+4sZZ)gt<3 zTAQ=%g>#m-tq5&GP(v-o(QzgP*$1np59u`>cG>PG)ifTdA^{<=Rls$0D^TaVsw8_h z%FQ!%zFu_%@~wXssS{`F=n416DNn=Nzhs*LG{Md6;Gg_!13dMo`R}ilMF^S%Ya~QE zQzs+65A3niJdNCm5iR(9`%)j$nC26MXHRp{+}tA8ibjo*n4wy z<(0gc3( zbu{4f#s>3-Y_^=P4xcKdZlr|)3%j}?yukmtW2eCxS3Y2x6sjR<%al<^bCp!%(cP71 z-1ub;e0s!;z%0P#<#qeV7Zj4-vyhi(aYzDp&v;p^ XWtv`?YD+KPUad!SJf$U< ;y=?lutWx2|-x3_?El>Gxp4H_I)R z^W5y~At$T5rM%Kid*!BxwWZmG0qnRCKdun^#lo^ZDGf&bS?L3fg2pwRxpqrjvucd^ z-FnZ4yv%)6fqlMiV0S?0miwL)YeXx?n39|%){0ITqm)5v!k)gP`O9P36p2}bmX^)@ z9dZpnN`%sP$U7DKmR!d`6Y`12sEEf$h!QBRtoa+yw(1oxoVq#6>V^#H1}VBp%8sK$ zsmz=dXQeEfVCiXd86C}g(o_p~<|KgkNRGmLBtI7==L`C74M5;Ub0|1;BneEO{t_%( z`DY|B-Si}%58im{R$UmU66xzqwdFNG)x+EWn(Nat8V>uSTJ$C(vcD{h=rTNA?McQ+ zJcrr{UcFdHO)*}sAs>JKL-^#&AJxb<9rxx_w}H>>77o*;XlJ0o8|p9GbvtzT!Q#UT z?4n87{McL#78m%%?qg@$LJ(?jSxCpZ_6f_n^Nck#ZiNf4o8idCri{8dQ?Gy>w==)T zk>z*l`R6embC!1dh#R&9WK$+D4EMt!JyM+_Gw$)=DV(P=CL{)#bRY!VR H9YX}>+(n!LV5lyczQ;Bj3BZ;;gw74;Db_Q$4eR!8TD7y`mD5g;R@VN zc3epsY;W?kJtO6M0S0SF+1O2}4@tz8SJj@3x9Gm%1w!>`aI+7&YVCTUsR_5;ya({6 z;X=RL#kh)}MrHdr)X%g_=#1U7;ZzG#H+IXln_qdOvdka}c{~j6xM`5IHq )OV=1|aiUFYLqOE;O^K7)b*vrV#VhGfl(HLYva-ljU-GUkfj0M-s;~krJO|-1 zh>NPsU2 ?Y1s&gRfxxcr-?JJBedUujP8X0DNUMKOo zflFzOR7O}0Ns)NZM+@%5^WNwJ5x32m8Tos8gdYwpFg~hhrIw`WiJQir3VRRj&q(A? zi3C>GwZZXtpjL}hJD(-ErQUIUGvLMn;sI{bXz%$2-`J9ZoJW*|sTw2!#Y5AT?yaDs z^0izZ-XOL7h|aIJ7Mxl<_NC$6aSy?kt?~)-wA5rc7q4g=J#x5OHXdhE0x$iu6(-~1 z&08HfR{b@+#&189cWas?*AZ~(yrUAKra_ih)}0#&2L7YWz{6Yuv5-J{a{zv+YlX_D zAk^Y&g_@QCWa8rXF*s!sZzHhEfgGtkH4T!0@HBy1JWU`+nt}Vd1h@pOOTZ`i&Mzv+ z(X8ln4U&qDho-A_@$j5n0#THJAS@{<@b9fxVnlg6ww% z!FN0Px#JSx5-=tK+*TE~_(m_Mp+2M(L0MJJb$FNEOlchVa|v(>giC<-IMSSBc#3w6 zX@ewGWmUD81Ove*wb8np^61<-uy)NFLxl_)JQyy${0dFj@#DsZrOllCa9A8g%zS7X z{IhOdC`}8F05+`O0Mj45KLpD>dU+U3q-T43JKT2DO^}h<9nQPpBIwzxS18L5-+c$K zy!0Xr+I28oa{1+ MV(~4_ z&G6Tse*(R IPF=sB|mp5Xz z|NHU_`02+V;hOQ{ZP^jw-2zy; FX=m9B`1BJ`uw=u}IWuR#_=z_fhG&3Bk3Kfc7(f5?Q+RUT<08l*haC!6 zjT zcW&zT;Q?J_z&IEv){x| dWx4(4o8Zqseh-Bs zdER^Hoe;=gdv`8Ce{hC;98Bva3uRV#s2Sd~XHP|}`QV4|zX$$Yzh;YqFp>;DnLl6b z2P;e1cmD%4={WM}W8mxm`%0NbH%xM%k5*=u`aV%IU`kh$7qv93wqkUNGMR|i$emMC zklWj2HdSzQZ>uVbj>zIde+k}gmk^@}G#D}(n_$e%oiz& 82Y^q}p-!p?g4UYpd?>{EIHaTJ*6nw948o48TML)qd2(j6@5i zQ!8W3mMt>u1%=jj^2m_b4B$v=Qc+=!aYaTb&vGA94R2AQpW0$icxkB}HNT|J=nFOS zh$CR9op*wVXU`V1zxVcAQZ!-y#~*nlEKX^lN`UVcFNWh!90T3EclOJaFf2UjmRsRI zthsJh@Waxzp6?>v^fK>0bZ7{~s0=1gy(g5%4G-0R)m7DDO<1+Es2{F$2FA6NSsV*v z*&A_#@%D}(+=j@p8d6G_*n|}X@!(f!e6;-ZMV |*IH17dGcz;ArW7@&l)u~VoXo()=dF__%EDTK!X7 8*jb^2biXZ!73wYgm&eMUzE{~hnt$3#2PXZ;<>ZrP5wymZl 2W6^)N-B>LSrVLbe{YE>v(enGxy7!S?rsO>@t z20YBT^g!>OA~!NUBPLpMa{MxMcim>}Wb(a-?*q5vl*#l59{}pxs@<+kh&TSbL6n1l zrx;ARPkzN6jYwZR;d(K>rlwj(2MbKPegf<=V1TSI&C;wq_uOkQ_;R6olmEVH)8Ol` zzJ$B)Q2)@Bm6nR5*5j@lZ>4BQ^WY$6ExpqP1zDXhm!l zY|@rvleUL6j{Cco1aSAo99-~yZM<`x5C$n#LRm%4Mm*-LL>kBai75dz!ntUK*CY~m z31^T} Blcpi3F0(3Z9w^U)*oSYo>-O}zB?>X$;AazuNqqk4u=xx;Y!s(Eb zFiDXvEKL|jEi%Fl(xl+ Cbb1Hw1pIB* zMjAKBIMR5<=FKIrr9B(3vB|=l$FgwECjNq1L0^zgT5iD02+ AnX_k-s|Z&sIw4%4;1C+eByOl q%7j;w(=}PQDh8F8$Jz1jZ>*+#qczuDrIkPoNd>Scu?JHqazSR-f&PU#iwP;L_ zQH*zCa)UIf!K$h)JGKT}-oPg5aFbcP3^?BL^GJ_;|21fwfiA bU@#+C zS^E)!9%ulZgGeNRQ!x(~75FDfqPSN_0^A^VgoEo=uL=YM;Wx4B 8i}NY|!EX!3PS?p>6bS>9FU(B%xWtg`-uV6gq2uBz~O;2Ueq zhO{K;nVXwi8xQn4Nn@8W$nu)T-2-i{%bXM*$K|#Jgo XdcB+_CP_%TphrRW^Uh-R z7Pf>m$g=ACV}tGO?|VzsoEj%2fKw#xxZ@-np9y)SNWvLpX=QB{&L!qKp?r?R!x9kS z`I3U%3p`ArCDIbcAj>OiZ@}Xjr&*E$&lI;3NcE-lOry62c%$D{83uLg&hG*99ej z(vKu~|<5?8GcqP89vgQ|VjPa^H z=jq1LbOA@zoAA_zvEIEF^Z)=r07*naRL*0M9>%z 0mR8hmES+OuWL?v)la6g?V%xTD+jcUsZEIrN6Wh*&6DJef zc1}O |NPnNx$&%^8k~4URw;@hiQ>&R*wpweWDg=naK?H zO0mV$(vT}J1t{pUabHuL>5HDofp!R8ZRII~{Y{3fuWPfu5 ~*eU$@`1op2@>f+}qXvgi z!nAumCU}pHJP&*!dBNxKzw(Q0ju$ZWG&Y7qwyO&F$xdAK`a*!-g8}kaZQ7o}N=kUt zY~*~?_b;b<=&;547P1{#8J+?v#& 8<_P=1(ZM|=9(I>gb7(7}pl;wf5NNyy-VcI}Jma=yIu zc2p|r>9|h&M7ClbtN&7+y{--iMIA1;WfWPE7Pk3PR?VuR+}>!WRK4xqeegcMa^ED8 z4P?}(g#WYeUf&SR2yw1^!dUbdvV2*QNn+#6f|zP#cMW*D5K}vr1_h^NjOfaHVmsLt zh90ViL^Jl@p%Y9yanQrT!*)l<)^bOXZuFvh$fnw&lai0_M#ci5BVU%tfE+nam|z7S z70Owqp~^8zbJw-A1AGwJJ*D@A)6~)G4ne7VB<^75sUVM^#6#^THNWvKN7^DA#Q?_h zV^h9}+kqiyRhr0CPF;P7sBO}td!iFK(PQO<_i=zZfX|o_h()%e5wLKJn~YbCWq_p+ zvVlrfUEyp#@~ap!>hfIP0WNs|81*I?JQ#%hzpE&Ze2l65a?|7+TJXS=M-IgtbT5J~ z;AZlzw!uNRi-rqU@$b)}S!IQ2kTq(7amD+Aog8%RoLu;ccxmw#Edpy504Sf;Y5k-5 z&Fq`}T!UBjOSR)Bz|Y4XiWCVK*0Z}p zSZ^^oG@D7B@GI}1;VY5P9??{!o_U|PaGQ-y^UxLhOe>ekpey?cygsO_>r3#8y&o`i zAKo4OVjC`fpVOD|JIpb|l+eXM4UYI}x>XKfS{fxDcv{Y%VKIj4ZKMYQ6Rc|v8Eou6 zemsMGhM#bOH!LExS=|JG{^O6~|L)hbUvtIbM48EVi$8XYD}181__tMfw5XEj;kQhM z4I*}u>XMOEV*PbC9O<2Ek%k2y#={^U+)nN572ySDwGQfg g#f!361eMyK=VKB6i%YO&ADYIPsvZFkGkK`g>TG1+cBJ zsqP Z-f1TszoTKk#kirgFcCB2=Pxw6@D&Cyj6Aq_x zb<=Z~9jfjEugZoyLoCGUHsdq&pql9jD56nkXSyMC=R@*0oBwoCqs1?HfmPs5ELT&q z!d|9lNX2nXPR&i5G~~r}Jp KF)XV@rgTyfUPsONMH;0+_4z#z@#$FlT(VKYb4@$2oabB2)5EV`Qgp8H}%Oe zq#1Cw7I$h=5W`Fn|M8+)EiF1X_Jg%+?NI!N$YufVh46uar&hyh%ssYlj1azdCJckk zv3l9btWgfn&wL8cr|a6eV9}>}r{=u~jj!PtTWkA}MaDixngas=9VM=}hMoe&`s9k# zV>e XhtNhW0wi+r?Tj!K;vMWoQgMh5)3|;X?4eP0Wy3yMUDtP; zbmnx$-;iFL?$$Ra4fwibs&QVY$=+HGm1~#;wbSD58)g$!*H5%q3~x9`e2;aQuj%`& zUFAcm(#OKrKYr-u+yBDkWXY-}M^N-BU}kU)*|FN0b~6%Gr}4kaBiuG#syB`E`n>a& zlx7?&4GeMetHXlwv4R@Cujg)Z=OO#8|Nb0YX%!iDHCc65NB?K`mwl?DC_5R4>Y_7~ zWwmmN!_co<;@OK|h)7rImt5MwUUNTnOb)+&UaRM)yIbLYvyS-7g05jd9^ps+-wWf{ z&S+v898OhP+^h&O+JudDWg6`A&-a5;z@vQr>Xd=2mdwi06A}DtsD{zVcF*&vM?4Ox zyma^LlD&SBhMG o8#PuKAhA2Ic(kOL5Gi*braq@Gth%miEY<8^&tW$*YC@ zfCx*&&m|PxtDaXtftLtlO^I_Taf%e+^3o7{26dk3mL||kBI)PP_OYkwAa+Ua#ZA4% zIY`YfEiAMo;0bGRNxOcPp{rsJsriSEQQr^y{b);YHdbX!c-*XwXsbj|#xe6-x>&2l zZ3L*q3LGELq|f!ckhqx}bMXhHfIgE2y$usQpIzsh7qET1eQ9iP^`GGk)XVHrI?#zs zfG8Hy*~?t8Zx5^9OO@HzI?UD`U#n*P%cX{MgKQ7hxe@`7T-1IYmw$f}TNPJ`LV}*^ zn}6S>N}- Em1V$|izP=(Dk(_*S~ScUI4TnyNhLFcy!iVJAtl|!@w3Uz3{ z36* z8KJu+-{(xL#ht(A%QPgKELQwd&=+~rX=GwFki8&FcgpCL5KEY7bzW}vw3iqDlwBW; z2eCM8Cr0XV$~)E8zjLbk>}qZ*v%-472+z02#%vrrYWAt$;>BSG+iKOuPx0x$V!D^z zsLoG8wKl+vPv@aS$2Ip<1tZ@+^v0-`!86Rq%{w=-DVfPxD;?HP<6le(<|P9^-cFNB zt${$PQIo-_n7nSYcQb|U)OW80>x|T(G1uIEOPqh{Vhl3&jHSUN$bFXoLQ~s*LW5r` zTFn-h{O^nFmAtZFn2s=qX^*TAR?BQsJ#tYw;pO$`O)GQF5}f=hCX5%F>)HgItGnW0 z&9LQ_6FM{R<2{-KMtT6t75l1pH7s#iUAtqmpHZy8B9E2y%QM9P5;_0c?D789>9T%Q z*3!CGjxcFU$B 8B>fFszua@wlB*;4)mW%xB7l*X%j&h;2x0Or1?H>T*M14l8 z!&Ze`g2|NNp#d;Uox0tjrLCLw^%={Q%YRN!Gco=+r2LQQXiLqoT&D;!x`CzF4#hFk zHqY%zf~!sT?5+a8Q-OGSDB%0c)+5C;XSBeG;7ycet ^=4)h4-ktFpW(8aJvlUI|hM+=2 zs%!F%!zagkx;03}PnLjhug*H2Hm#;OV yO0(U#`=*}J~=g3d9 cc?;H9DXuq$>3!LkFfKf0N0ty)i265a&&Q;wUJU!w0@G|3tVeRlju{hm%{gFk@d zn!)n5#_~v?BZr7+a~SjV@8_^qc5nKl-U`o!?N)EZ+Bs}acZjD>*N$-wl@ptRGXnXV z10JMt^2>x?H%y+dGhs^qDtg9^@&-O*OWCgn2+dtf==!()41=3fhxw!xMl0fkkV9#i z-?gZtl@PSmTS{#m&(mc_h`;ap#=>z(3(K _3(xVR<1?4}kRztKqce?s}NkhXgqGMNg3k@HwiK65vb$ z*>-{WUrG-|>Hcw&hofbet%dL-vLU6uSK5VlKQmuZ)?CbOTc}r|g;c!R#nKpZjiv7d zuh+#Q@X6{k^LuIH5H+1D@ejTY4w&ZFzY?k9vOZ>+&qz#t)EzJh$-dBzP8??zTYg^9 z4}z`^(66LktsIWA;Dd{#(nQ#)mtW90W+lFS{O+hsJW8acPEYGILLMpDKNGeDF(rO9 zLz$Vovu1@2aT9^^i8)wO 3dML;HfR6hHe1Oe7>Vc6Cr4+M_m!@|6&)1YD z%+-dGO<#-D)!h-hl>V}_PSZ>#v5?_B2^b(XaV b{&(%2v;RWdo!7$QBDIYWm z%`cX?s0*(@H_YDXw5 ~@aYGC6j0LKiyo6l9<4Ux6!_Wy z)H%W)0ch`*LRn!DCu0Hj7k7DsHDHg?$JUr+{Rj)ebFmf^r@dViR>DujS=MyBPf%Y& z-G#^b=aWW%b@nNPzx|tE%g%vk{_rP-veM8k478#YzF((cX2t}ObU>ez%*}92r0P!# zEK(t~q51 FXt)6|Mw#O#j}cq_7yDC?Hjr z-AdWR+)TMQo9|1(;*fWYQgmt%!Pv%)%daJ1F$9H=)|v>^_QBQVBF@e%_hyS`UB6r| z8lP3oC`Ee&WIFr!X~4)zV4PT>gqm>~?Ho5$Ua3;mzJetCZ53)J#30;O#Cml=vy^Gtiysd~Dx#e<51j0&ugO7N$JA&Wr0WBN1lJS98Thoev7-N`}ibn_f zJTZ|Bb;>DlEcd{XzsTf(+cT-$oQ^Had&WK?`%gYl8xbo{VA4%sG7$*Jvif9kn(62~ z5AuA@8_I&;%6T?p)KD-xg~aYo&21Ba^t?*&FBs%|{5EhIZie!hg3NzaCEHCm#03(z zwqhUn{W;(b;Rle`3T7JxA%Faa6gnOVWXWQ?PCSvp;g(CNW+q`yLiZj<*l&KPlo#;! z#{{>u!|g?Z{(ziVuX7#~j)nenMnT|bQtg&i#q}RC>U3~m)^7}D#W=wlg1(YJbfC{V zV+J!2KdL&X$zztPefngMOG2l>4{DJ}1dcUAjZ~L-d4KA7H6wLxTD=LBBjf@Sn(5Ab zoUXx#-8MLk>y^9*C0f2_nTG`Ct(Y&*M0i5;{~23nU-NM)*F_a33*IzJ$;XO!2Qy zIS-$20R>U63AsnsWjNCR-TKS*Equ3?qV5ZM8Pz4YQ4O3+ULj6ucHnO24o_`4eis}b z_y3@ >y5`u2q+YBds+*afII+VlBgX>ZROPNak2s$1)Kn9s zrkPPNnaqODm1{QsqAN2x*3}vrg3Szr^tyU}a |USAwvx`Q!adI f=+c< zg!UC(8U-1JIce$rOAO!hkN=&1yXPR?M&=)$Q)FzGhBkXX3lv{V |IEIE zs%*5*CMZNDleyDzWO;7z>{um=&1h@pYL|6+x95~D9dw}==`C~uffx6^a|!$Q%MEys zV)qNPZ}Se+nAOC+<-n#-y&HV~4>7EVE5yI_!kMT2e542u55EkF4WP{q5m9-4hgA*y z%i_iD*K#M7Xj@m}#hGmH%x$EZW3n4$A?I-FpN;b8V4iLLs<}{knRsyoMmrQ~;Wl#% zhD5o{iVcBD+A91l5_rp^OHJ3z9yf<~OBnFmiHEVo0gGo@!r=9Y_&_I=)4JMJ2dh5Y zC|HTe9(FY~#J`F_d8Jl9n#3D{+3^vPi5eyfdj%OVEs5GhQqo<4R_uLXrqgMfWOv4Q z9%pL5>z=RM^#I&f0t;nVUuIk%vX+7pGpnim7+7S9=lN;yixCz>SDs5!n$FT&Ddtmc zB02lvD^MHj>+Ql0K4_y`Z`gKJwQiq1?axPWM!@^3KI2#vz+E^*I|PdHIv9-2q5Us{ zJrO_BQ^g(|SDy#xDj`&64Sj$|h>WE(riEFm40AYq6BFmTtUv>p&=^ym%LKm)PRCKe zedPv-WV`;*HRPUyC;PygsZamSY_(key-j*v!c jz zfk(KeyI<>@1TiK*=v6He<4vBBn}oSw?1#Cz*MFrRgp3hl!$Ej)O8^-`Y@IMsO{7>Y zC7hIvOlvO#8$I~cSBna2{tI~w-@$GpBF_$7r|!|*rjSNfDUZv4QyekPzh36w>%s}b zp0F%8C@3VLoe)6jerSW}Hac?NRolE+%0AfCy)a4G#bKKLD=H)KB19!l25_VO1?fS5 z{%~?_QLu2q&d$2Px49K->+$#}z9}V_9o5yuECaEDz?=CGKb=t_Wo{5~#X}ybOQ3%2 zszy1mw=0FT&TnL9$+P9C6-xOt+c`r|5U CDim}HgtjmlOYJ)Mjjt zBE>zoJ1TzG{P*`=)!VZ5Hi<1QEgibLA%7Tj+@w{SllPm*f4XssjOVuN^GyFp{{g%4 zIEUf BhR({C3Vx z-86Cx*aopOyk~6ZJ*c0tSK2^Dezsa}gEU6cyYL5asP0eu0keJs=1dlFic0$)Q3IaR z%KYF~51 ush$)&wg=PXERA BlRV<2AEzz|dvyxExKV#}eeEg{f8 zL^hDG2UsQ#3~%jdXX4z0_1(fvjvkx;!dRZz;r EXuzxt>le_J}=kSml zHM^JKqu5FTXsE|u^YS*GfjnDg3dpkOx~5BY0gG8;YJy@=g;av1GmKawNPG 3Gk#j1QI~E} z6;1};ovwyPny` Nuw~;dWo6+<7fvmsPyYUkqq7DRtfBTyf?ahY0 z-W_iv hO6L AU=kk^=)A{s+f~M z=yA-Pd%xK~V8=JS9jq5YwuM8Wz}_)1Fd`1E?Cl|1aB1P4bcb#0S6OAcURzE`LjFul zgab!=b>PU*zvpV!ZVvVn!Uh{3x<3Zt8tDY8%< Tdrhm`EknTo}5g^2<#=N-CleAb3Isc ``xETqC za9T^##QDSWw0^#`yY?Gl$W`bam8oe&rXGC?a*dSrH~g{o*ODl~RP!#WMCjv+#^+nL zadMfUXP>ba_0DpwZmBTW{>5+eUGaau^l*3xeD6ysPV2ucaUrmF-ySaE0zP^*SQXXH zF}fe}zx$^n%0Suww%N^Zrzp(aJU#s(pRrx32|v#FlVE$P?|V~ei7hLu1?qZE&kow) zoQO&h&UhsV0RH*bGE!3KEyUsNzFOvm12Hdfovh1zqjHJtBrZO(cPmmSZ>DsF x6L4aJ`clXW+A? ziUDEXoc~uC*1)Q5eOU5kE86}zQ;EawHzvsEII|#}>~4iP^KO=NWVx6fs8UL|WxavZ z(9e}YEI3RVVbL#Mhf}VXY=NA7UpB%&+~0uqhiF F7u5t0+>dP zwAIp0qpwu-*Nz%Ck;=oeO^ 0y-h zeNo^M(|vw~>GVifOca`2itq7fi_`ru-Y|o3e($FU^#SEjz)i0YP#u8V`@!m#@=-Ns zsaEe6&i8dhBohdmKAiQaQdy7v@Blx9Vtluz{%ALorZPAy6s{IUB80)x^MxTJCyx>= z?Jd2jd%Jga$?bRCAaWKvwP2HZG#00%YK}6!ak%SPi;J#rN9U(@h4MwoEY6B8Lyhfh zYEr>D(LT *o*M|vmpB$9d`fM@=zfh3m? z)K*Yri8mMg!p5w}x?Sq_aw7EyZ{Ga5@(+ZO?>oolZc%YM#MtMmGz)V^N)P ;$Z zy-02YQd+Ep9D<*BH!Yj?+euwr<81Qs4UckS;X2o)jjjgEbC3D8!s4HQZcF6Dxgyu3 z%;5|#e|H)NhLVz21(XR_oDD{;mv;C;Ns3|+5NeEq5LG;kAP1_xvbwD@X|+sx3Vx22 z$_{s^kptys4p1cflL-eo@pHWtUix!c9N7ljp$qn>&V`KQvB`QLTC`+)_d)pMi>)+j z(oeU0e1=&Nxo(JXrWIu~{$l~N&d!unT$+4QmT)ZdF=R+*yCn}tX=T;GE4VSO+61S> z{Py;eQ6b#-g>lIiT&=CG=S=qEXA}kBu;aNo?kpmU<8cta-`TpW8&|f69>=3(bi7@> z9Vy{lhKZtx>^k!f$cz ?GdSt3Ox45B(LIw6 z;-%$fsezxLOITZGMW;1k7yl5>jgNERBSX~9a=iN<9&XHobY}E42spOnI_~aRoD-!I z5M_#k$jm+Z)r1*9P01hh9UR(zDimb|jM|%&sr~}f)t#~{a%Ow~7cgOI;ZDf2gzS&& zS3(VXwC(pUf28jBb*$Yn-}^O5D S0V=srz*&T z>yd?B7#7J36zwx+8|4Ae7NRID?o Q1$O^p74P|OR zOV1Ej3fmy`v65M2+0f0xY29DNlSVo4;3}J|5{B_d6OodNa&(?qtR*=uj@P-BaH4i+ zEC2<-NjO{RkT0}S($eVb)R03lG2;(i7aq|DqszZCl|2^i+wcINuo0J~@dn;D7FC}m zPBw(_)}2cMe_oIGhuhwAiqI9#$}Mi)H?EPRi?%2%FeO7-IuF)-^8Jh+9s4>$x5S$T zjJ@66-P7>MxpYKX05SKj3%3Ty@5RXQg%gxLZZ=Z~R)EdeVyw(Jm87f~$3AMuKMEb! z{%b{!*1yzDrMHgr{bAXnu_rD&R<>{U?q_3~D;}?x?i7c-1~!~mA}}~TmgTTLwmfOI z5stZ?r?K0QueyvUd+uHh$%73wYXT=HVYjx}C;1q{+tLr-9i8C%_Swl$WbTs%gs~4X z=ViJdl4S#IM%%wZp`xn=Q@u#Tu6v)irHG7A#{;zRW3Yc7C{NQ02>O2WYilt&U56|> znfMoRjTb^mS`*IZCwx3%3R0=8-l92%R;FAhON6~zQ|G8I(ixAFqdXYH>;=k~bZk=| z^Iu_@g7XP8+%ffpO8z#`gins7qPYo(XFS@lfN=r)T8BZ~NnKQI3(bmrL`4o(`TwZnNd!tHyuOMN4&-X7p2Wk2CH^`jcwfCl3?a@`|rAGUnjUv2s zAfxzP{ eWf9%nNL^a}ei7TKZDs1&v~ zN597rEEc!&eDZw9RB{_|1FutYqiSz9A(44ETo8nXxnX{K=<64whr!oA3O;V5kal0Y z1^Tw#ZK=yJa5YREkQN#slPd&=JvqrS*oXHO_8*qJbl|?Q#r{apNQX;hYwH-Y`yLw@ z6apC*P2^v}-Rm}iL_)vD&E0@22%pXA2zfTf>$f0MVdR=OA@2W8c+`{`vFxDxYpnDa z=`tm}73wHjJ2<>lpgX&`EoqpoyasjtuhR+s5@X=`HxdhG&Qq#6HpvVXBV>AVvZ}w- zEMhnYl`B^dAO~2zjE;_LxGU1oGIm(bSZ(VH!I%afjtw$|s*n %Y1-QU?$^$$TX3`p&B$7p! z5Rzd>K20}FEj!XbfJa|XX@Hit96im0AOUSw(Y9F{OY|bKE)#z5tR(F4CveUr8AQR6 zFN(A(L%fpfuZf9Gq8Q2(^+toDweLt94IW>zY(MZ)p^igu))+D3f0c >HOE2wF~EpWH7!l+T6pRSk=+f{QE8RbqeT%@3SB`%b>#hk54 zQd)OreYG`B77%%Qebu1~SBI!hasbb W1Mr%C zo??#DO}Gq>$pR&?g-l~(Ivi&4$ST7y5$6DaW3^%CpBOMZXW8cMZx#ujyDO^2H98_g zjC#BT453XJp7NFCWCVl^paYy7dBE}T$QWD|np2=0g|wDAkIzX=Gsu-9G|U|Jo12qI zH#3?Cq%@#zwY#IlUKZ}(Acmu(uG$F(4N$P#*~d&yk4-zxn{IlXs+5AxAx*ndZhyCq z7POoHwbPSBVnI)DIdMVLLG|Yr^W|j_QmOOizZSAU!y_YQe?)m}wh`WAXU9Z2(Du%9 zOwDJpPk3|fdn19F?=%DNOs%k&W!F|3 H?)X|y_6JHh#8}Xw)kZh5jgKPnkCG~FJ#pIuw4&hw4W{_OvOed#0bfrbkz>n z_;!vdhPE|Ec~JYZfK@*FG4WmUCCgaG$v9QKjN%%JRoXvOI*s !M*4-N|PK3;XN) z=?~bSs3N!>#}qxr3H@YR^iv{CAqW&|00|(vh^^5`T;Nu9AQ%FJF0d##5~8t)B$&`0 z1+ >5N+0P>_)QpH{?0%=g>R$-{z24jt+>HU^g%j6 zzs{gd&E1$p2;@x|a!!f@E&u4iF6Ji9-3nyFgoWnbC;G@ dBSu80B0W(em+hKKx&26Gg49!Z646$0~IY ^?*+sY%VB1OFo`J9|4K zovk{J(auatN>B=By|SR0EvDXC0g~WK_`bjsCOVN^mhDO))-Y3B8}c%{#*r!pS=oT< zlW1tJ-!AWW!>T*&&8GZIz&|E*9B-6%JRGPGl?%qc5Q#Ti(b+_on+T9kqR&DyW&Bn# zc)dE~m#ht>n3FicWv-~`yCizcLB;{xC+Wx#a-Q5jXQV7!$(cZVa!7ocr_$0=34E@z zojv^@4TU_wPI63L%S&BkSEw+qO@o^IusE-@XDxcbsyQ}N0>1w$irkA$2bMh8bCueM zL9s#`)~q!m@&Fb49Fj^Uy{HRyv=HcQ`OSzqy?QrmhNd&*HiS0@6l9*qX(O#ke^{)y zuhCi1KEi6(a>P^tIAKEzmxl3x3%!;A0XJ)Uf@D9b<1SarS}6eTdM`#T>Wnn$q*_DS z5FC}F3_3A5w(_WKQismB6D+jOhY|}a*9rMU&+U2x_urlC+Ny31nh0iTg%c8KLZ8ya z6-b(mBmk?8m6Y^Us^)j$+ZaJmW&qK!L5ieh9DRE9QH!3vBL45IDDOI`Wz^??@x*8d zI9ZSRzfMS3b-xh4{}s63;=w~+x_{(9Ri+g3S4iE$BnG4BQy)^XfL^ST7m$`1yzE?t zeLsthc%UFsHhB@k!cqp>9}OD3F%V!>M2{g^En~+~H_N6EZp01qN(Z8o`Jtf;gJ2jY zSGFIZvISztx_XC9oOhFCiMtRxNwtMSIj|FG4hw(4_6WRY9)ziYiuEf3N{Bwe#pj2K z6CGPx!6`Xmk2@qx6>of Kekl@*z`o!-G+=J;_qSC|Zhh`@T*KV^=dN0?VSID=_Yjg_-f- z){(RC6p8K=o``P7ks1pf8U{i$In%CpNI$;hADkVX9#N`9LuT{e3TBm|_mPy{-RW7H zU-EPLKN2>JO(XY#PbNW!W&|?fPu>5kV$Z^g!?8Xe)a6OTv<8 g z5{MjS4I!foZ=wK9lJpOt CBw%@>RvHMW=R z!F==qhr*Rk#e{^x=UBO9?pwnXvK4GOFqRltB1K?TAWvM-Cu*eNqAy9Eu5PID87`?J z;MFKlB9#CbH1R&{)CTOd{QO&}g+GZJLx_Z6S)i?wl1nO91y)b@@+HDn*;ULaxT69W zV0QS*5Hc8gN{$wf7ZPh0bZOaMrGr6_qR3-1!dG|5(o3Tq9mESD};R!-#?xrGf~E zeG7@UMl~y&KCm-Uk3%~y2Ja=)4xDDm*R7Fs6H9+k5%;SX56s%78Ss+E>`xYzs4(jy zs3f8+Km1>kn%zU51-Gz5Gu}&S7b9wgcG|>5K=Qze>!fc~zdfm-2R_qkEO=pouEM1^ zxJT^4P$mc(IY^4EAJhZeZz_Iv`CLQ1=%bN}m0BvS)w^(JIm@FzdsP;{KnX>fjzkDN zm@IIz33_SMkNaeoa-5Dz8ymQW@L*;EF-+OAyvuigkemy@Ail~9J;ef{#W+B7e$yR# zUJck4I|!StkiC^qLQuPA=QZ>F?2gfJ(wwAZUx~44ekP3CfwRY}a+db}yYSQo5B2 zL@$9i1jFZ$r)yr#ll*wz`Cfu#X$HlR22WK0A%y4kOgnnh^ILZ)ox-iXn;+tirPnoT z{1=hkS7dU4HmF61Ar2lXG>o>BUQSWvC@m|?D( i5x^u8x@o!5WKxM zDl2ps2S-{GI)V+j9izwpnle>;Tw5DR95CO#cX+a+l&Ihv-EYDkJVczw< z 5NDZB{1Zz8u_sc|%>ohZIX1euJ-=+--qU{= zsYEM)M}nXvhV-+xFOH|UpyQvKCkH?LhJc%X@^SVW#kUCDw?vJW_|HfQHRvad&DP&v zzwn M#f(ZnyxspgowX? z%%G@qT;;Ac#$#)5mqVWf@LwziKoR4s_SL|en%6&*3~{V&gkYNxHPvFHR!u)rKZ=%v zM81J>MBW1D`V;J ^o zc)0fK6py5jV{eJ541 Qic6+K~SctE-X=%NrfNe;*pRgkKoh{A%Y8z+)lq+a1# zFGz;XCd#g%IcolY&muwq%_){sB7gcbEyqJ64>~!^e&n6VmHI|UGfq9}h?|`FKPy2{ zi^nYd`d%{NTTar)wwp#|fo>Kw;*ED5>@gUVAw&AV{}T%I;l2~|v&SHQEbF8~dA}vn z8$w%2&l|BFAJ3Cu0dGv085m#S@)n=~6pJnMGH>{Qw7@n69; ^7~O83&}%L&o;6DzqJpN`Y*%%G}#oN@AQ#U zqaFvSPAKi@85W=*zRJdx5aLY80C&9^+D`kd%fmX#d@G^38kH1B4lL#dMUEvOWmBIy z8UKF{5wXA&xVROLoEO;jIH;Q~@3>Wx8VDEtJQHhH$aVGpdjk8PRUmX|K1dt;Sixl& z>~ES6^B7%|VH&BF%I+vMo3{Dh*gbz@D$f7h55xvn>yMk|IKzxg%Fy!?D+!+F+%OP@ zszN&mmN*2i^?x>m;9OjJSq0pJ^z<_al6E8FQB)8U-f@U^?vylRawAD(LH`%5epXP0 zpNe(D?^VaylRdc1%XwiG8zG1l+`^N}9flOivHz{mP7=s 2udU} zpn|GTh>>rFN?&h;Mv86t72PL}G!-%N;D5`E9MlhEq}aq3FUuucuP8v^d3IBxloQ;n z_41&z{Y1&|=7>uGewV&?0Gj@zKA00py}wr_qI>X#ik~$vqz0&-t*9aT&c@y>uP)lv z%w?5P6mAx`*DE1lBhnTrbOTOPUA4Ok!-_w}3X|U*Y(mwVA<|fjenEb?BSM%F1SwjE z$#A)aQ`i0=A|)#i%jPvacC5DfliPa>m0UwiS+TWfFL|3G!}iA?UK$w&YTT=>A&i@c zeDi*Evu228PfKg|Idv>3{YPgfWefZRvZ~_REVX dd)%_g-8EZVV`QfLmygA=4dJn4wkRR3S5V;zgM;VCVQR4!Vno2 zBSS#O
P)7HozL#ekJ0YaRPbWk13X6|gXFwg#hJ 3hS=!oQQy0 MCN;rv0#O^@ GDTy^3EBB z^wJ_cq)}{%v1swXnlB6v`!z6y3>KfT0XFg9dSKJp{+dkEq&x_S9ow-z6G#Vjp?0tf zYAOrc+WYHa{9{}l#G%C>jeYAz^2+jD(a~otZqE20^tb%PcU-<6Kl#8|%7 a)aJCxJKhTu$^8FGri*hZ6?0V#eoDMORi?o~W3r za5qVeVik@#br` R^bvI+!B}4rK4MrCh9T$>RYklgv~loe`!+aU*aIeyseU`}X~~P&W)R3f*^rPM z0Ss_vZT-&4IKT2=Z-0$&^pgAnu~>Iu3H<5PWW-vhS_+6mv~fndaLw&k87-SaU+dD0 zn>*P*5#O7>VGj`ELNFC%F=~+Z*>v%=aOLgBs)-O38@lZt`#*MTa*`)WAgCQ}AJ~Qm z?9|fbt@z8j5#|dXK167zeV%DwY`^CrJxrdPwc|m{aZcMqN^{nu6> %cwyVuQ6<^>q zt)gIVaofG;Mw~7aV~B|bC@wHVY+&3JHIvcHZA$;z#Dq)|^@}A75;q*TWBbIfKu~Ee zi6gZIFBP>MZ`rFB)H560m=r7Lx~=Uy?Q+&ELy#j9$lQ{CB!n|+bh|fi!bIHMbNVZ& z@!aN8bb|ek%=O5_d@EW6z%HO^bvWR4_gFzJNt|R2k3w6wP|uOcB6Y0c%#rCLomx*M zCg(s?OT#4Q1dk1aOUcDz`D<2s(h~>udc-k5x)G*naFf~S9G8?zJ2aA428+R!m|I1= z)t1YQuD3W*OSP_ky>I_YtibHEww;?jQ0M|{)%npdpa+IW$Bs @a9Lpbel%Ao&nl%T|3v#kJUJRfvoxrkL&8)h zPmR36cO)SCi g&2l!6k#hqDXJ)x z*^96T{fv6}s%O_TLD2CLeOOa;6|yU=;~fXRtFci2eZd&S58)VoAy`<7erI-Efx5I* z85L9rZKKASWBm_Lh+>2;t6il;(?3$7+PMou2AqZvnCcxnDW+*RUr91dyWdHutH_T< zF)RhF-gkvNf RAh|FndYJDDe68mG zdLzK!vLz^@k$OlKBuLwD?u3~87AqhQlAUvk^xHJ1@7(b*HpIDTpmr3TW{H3cw{L)T zxWx2WNh)&VTo)V@w*o_Pcitsh;Gr-yVkMjJrVE;%U _(OczNj*FE p{?*<0p_Ys_N_#oC+>@vjR&^NxE%|5R*V~NgbnJt*+hztLngF*ab zGK0l+4H|i%aBO&4o_&$7sZi4MLbEb5PZ@{h3j{|A%!9#~2Tdla-3{zkVyzh&g3oZx z+vU}&)tM}`40B{JKraGdnH2)}kBYA~=350}w1qKmd||chUacBs90+}VIi-c)0{4$= z)!WTiMR{cgRBG`}36GwCie#U(xz|)x1x1wim1A4(_H^bWpv@uZqSn!u2!WrWC=J+m zyv07B>BHTTxj|UBHqOK|!Zv+mN=v}1Y?c|gHKXRe{f1wiE8h?)KlHMbi %Z z!x|H?%W}E;a`A)^bdlF)iCHnQrDLj*CYk0n)Sj{v0W~yh8W^sGD`=|XNwpJ^$&Svm zy6U~8X+QZuBt8_4GK~ef)=TKDgwbgYe>g vmK6Zg16%w&+$4HvFB_pR-EWc%Km+G&qh3H+L)<8C@05*Q%Z zN4?;l#Q1YM2O#LMWb3p^34s24SOxGIQK+b6FU)S&iCn=Z;;$qfwmxv3B-ZQ_Q|YL{ zU)c+v`V>jxt|-?|+S>l3Ejr1Jev_1*&QJDqGy@`g$`}_-P(Cj_R<@{QoVRGD$4qKQ zS+P@XfFqKAO;Cp%ZZuEDQ4>TDcY0flLtvE;K)Xe=4tm7A_PLX1`Zd&QEW$6QiEsh@ zPT_3WX6IIrBNy!d>dxpN;q29D(>{{2`sGI%jpG&|8c!qP_iHueLf5L5Kf`{GAJxu0 z#722D*OaqYCKto5urZS%*(Wg~=4c3J>KowD$|Vo!W`9pmp u&^cTmOjm_7F8ij(7}JSY;YUJh^jV+r`)-#KGo%3Q zeD8!AP%ycEb7(sdmQkrx#W1H<(ej)O3=#C1=w5!gT$&qln%e{opPdn2hPw%Ng{P+B zaEE@bXRF+kA|d%CxNff%i47X|&O$9UpkNSQbG+JRaP43A&f|RxQ*+dZXxR4I<)Fh; z>M>@xU-6#Y=C#v07$=A;cwK0J8C>g+PEsr7r^6WlMg~augKY4h5Y%YJz~kI}6UQcQ z#12TlJoGs+>B5#8*68oh7xe=CG#R3QZ$G7q{_@xvF}zZj@C{4VBxnwBwogrL3rn07 zCSZ}u_T6VT%pk5fHog83%t1jSpbk{tw+vP1K5MRIavasa`EwB!tsEcg6?D0gI3Mxm z1EUQxxx)r%2XC}49C@0w=KN?!Rzgbl;7Wf@q7;uJ0kp&?C)(~ih2=?(i+rRAvs_uW zG)E|`mYuiKyK5!*8xNuQi}d}z>}4Ie+s2t=U@yqeHQQq@-<$66Y!}h7L6r-5u@I*o z>HLXx+-0D{Df?zf46Y>og(WGNafr*h3`vswuTL%K!gqV*-X1WKvxf>=ifTmQgjq<5 zZ=uF&Q!KxFtYV{G?es(DyJaMJ|0#lJ+_HbDwIJ)|#rNSFB`<>e-ih_F_k5?@_2icL zHy-r~2nZ{Uw3x8kqetxBvv{Cxv}kQd5EuKitnim<3(uP7yjuda7zt=AohdhB59W^V z?q9);z!^N5AFEk2jQ3SW80p#QM?bOx)|=rh7+>_xX!0h%m*+DE)H6~DlT?LH2ytL; zMoD7)AYpGB`b1vXp-yXdkKeM1M@RulQbbVn3Y mQ`Ub%T3*Nh( z!YUbk(K!x19mdjc`r678UEnqMRk;08`jzJ z2~x55h?E@0(PL@)p^8804NH9 z_Ct@)7}`#f=OqnG2bgYlPQ3ml@MCv!Ox_=ItG6r0)G;V`7QM=b+03AM{wEYJ1Pt8v zG(^~d7NvcUh Wvj%*2BdV=*sO9{k6!D|W}X3mKAGGPN=;%E zUQvJr53XE>KJO$03^JYf3NI&q$|$!~YLrMKz`ic!P?_vwVmKtfO2qL~>OkpvbeK7n zNe25_mB7v0|Lf_S1N(TsXk**9jmEas*iPEmw$a!&+Sqnuqd{Za_S=4c@4fuJnVp@_ z-Pt?mo^$TRr>JO<$Eon^;|ap$v@b}b&U2;H;DPw_AQ v^vBT6`;UXlvWtR^~9W7loaISZ{ zE=z)g9?f5jjYPw)ky*{>p@)Y0C-6DL-c?g0VcKz ogU x}M_-X~PGE`z_^Y8hro2wlk8u=ttV;652Yqx90ed&h7`v36C84V}MTn%qNe(97r z6el48J2D=&l$t3D+Ea290H=!}Ll1O7H9{Wo^#n}B*9?ctz^0)uTlrzJ<*H9B!exw? z=b~&!)@+*~HwG9xe At40X*wnUQ){t{qRa! vH3=Fh2W`8M}2{2og%?iea@OqS{+&(947 zjw7MUP_qgF!738`m$Nhlxd}*aT)Xg$52%F#{)PDTe_~-4$ZMa-2z}fN;VxeF|E|k9 zyh`FU_rY;BN(UWIVJ^++mFyTDn6~r|Re9%+uT%vf_I)J*o0SK-CmPN=Uos`c{!(e# zMP!yxV)jL{y6g)+RlYNTtaPHcHh(Xy6=@JG*iahx4nnzL;Qb1FSj7gPB@!MVGh8gd z#GRB}B*o^!iU->o(9@^db@CqN2xK-&2}gJU{Pcltl*Mk}GXYYRN&S*XGm?H_h3%sK zJ&bZ#l(-t i3!fL2Sxvn;xx?QAsyl`kQ66&@;*~Ep7A<|U?iC-+hRMWqP^OTdk zRy9fQ-04}Z(E5{+U `EaI+5EzD;-!AkF=1%9KN5mYBfXnUBE>#?{I z&QQg1S~o-WpEUc@g8GNi4R#Ce*E}Z0<*zDtR<~>A$w*-j7>4tLVC>llY64>lUIBlQ z7!Mi%4V$3}^lHD_L!mb`wC2o&lpq11Kr^r+N8FLiRsst4TzH ErC z#ZiZymcx2X$O%?$v0d?4EM@d}**2fK-JV7`1u&M Ci?2@0Y5|3? z`IOe^k00@LTU*I86@?{K+Y!PDXh!hDf*suC4AxZIpN>z=8XhiE-w_f^>CglHVO!7K zM3{F_=p#CIPkPK}{KZKQU@BJ|(a+qj5AT*UWtu}ZxF0g!j=oX4400qj>)<)Xv@x@& zYmxM}eF-u!V<#vkIhGTF5Tyvv9qcP&-w02`_5p2?&qS CGm=w_bv?J2rm=mutKx5H|okGDKZ+M(4Q6yvX zV7-wD_$YU+FZ~hYgg!yrxv_e%AKu!&UwKX=D9c<1KvUT?3@jUdpWOQyR^o3G1Tvhr z5WNumBk~}&TDFwZ^*3B->6+RvacLPFLbmi!IgJ6}?9;o=?JKZ-(IsW{g>K4}TAnm* zo+Y>%*D(lmx=lx6K({cjhPIz0iT<}Cdq(mMg_$<`?&z@02nucRJPh~eG53yYn4G{l zlRgO;996zbNpHqvE{sfnL)NtLYvUI7o~DNSz*G1^ANHpG9jz22-IRA;Ix_LcrBvQ^ zP}|QwqP?4qjH`u}xz7-KLh2>?dfUd|a6@-;q>QXz$X^y$(0`+a-;jd2!d&&o$%dK= zr?^(n^@x*@!Qjk!i9J4ylgto_Tbby#whnORD_mf>2yof0gD)wiLrP$Mh7$?tc7qNH z@gx8GWfjD `b3P~V$6IOfkv$C`~lQy*H;&ef= z30Lmt>(v1_$5CR3F#5ani1aa@5p0>1zr~cva`SEPF_5Nz1*b8N^;MdSjF!(j0 zbH?&&SYOij2~W8K>$C@!{f*heXuiugm)46P6s>ki>UW*^79P76_<9*xAohCswjT85 zw^SKRV6VWN=Y+28OeZ2z?;5{hxU`p=I7STyM^d{te(&&TS`%GJu>NPI-ZyV1i-88s zFyS7+2m|{hzva<&flhNh|8ZD^V<)KLUzZ-$*W^VD93kK0{z>A<{fpryggP=Z;0_}F zrv12wxtH3oI;oh2lh|{Kyr%!N`&s7h4SnYL8R*U)`0SFxo6M^>vkMK+-<-73RAQm< z93B~Pl1D@_94H_!@s(Aa!~~|3+dm_}bBwMyXWCRa_E4K*x8DtNWyTPBbYf3^=W07a z*4XZ5I&mhvfD$XEo*GOLwpHyH8kWd_^O|6z**$KC9a^9k>DBOs*wtNjTpwm>4r6Wx zKh_jaLuj$bw6w+ma9(RY=i;lROI~D0YOw3_>B5|vAM7g=aOw4`$A}Q7KsCx4%5H2V zqhj~2S(7_qP0WllO9={STSkhL_a|o1*dA1gB0Je%>HLXmkjaa*^99(fD$@#xsW08; z`%en3TJJTFp=117{)p-}y5uYfLS76bLz1EJK(uz*X>(Ymc;yZ3JLJtL!2HGtJUPMh z*a?j@`Yb> l!v)P0@8x%# pwu*zYu;{`$0O5`#l(@e9&*cZCi1=C`k(as8J=-OYAR6G|neWa=mz zHK%TUF>8M%Ba95l63&){Zi+Q|{H{FA?JB8!TrAtTHE_Ar!J%6`wqe@6KFiumencWH zW6Y-0YB0|L3iW9gYL&ph`}E6@CzTb$yLw`GdMBEVguu_tcXa-W$eAD2DnfPq^#=Xd zTQbp-tHb9531r-KIe|M04%t?uaMF(o0sV(poldAn7Wva-cb}hRyg5upsXv$29^{u( zc6T53%eeQC4%U#CWa~MSx)2Jye>)zoEYHTi$|H$LtN^VQns@a|zKYrnsnf`Qlax?k z6MOBV36)?NFL3+`d`}-`cQ{~*H5tST+P$e})*Qfj?VJJUPnk5kTvN~POq?{vr|~-< zE`H4w0`gnE+u^+M0ac@%uTBl@MpKP^q@<)iV`Ylhpzj_3vOZTJ>-!Mkmz0&~wnluQ z@o$D(b(`#E?6ea`7Iq5bMs(J1MQJANMz2Z-H{5Wxn5UlQs^oVbcXEm@t-rpf+59Fi z!~sp)$+VwU`Cgm2W6y=6uqRqMeiWneG)Q*7dXvtMW~@Q|U2@EG1N0UCKse$2RZ@m! zaJg<}zBNZJOLA8hGm!Bn?|KZ4JC*uFL-k|C=P)MN$l=rOLtI@gTb2Ndu(KN{y+@s= zf8-$Y3d}Ej-+<7BaTUT_aRQ>OqK-!gNe9P1^dRhXzgNOMN HO?8K9e-^F4i1gW z^$&*5nYsr;-ej9@5Dt%Idyvhtd=nC1vL `Evd^v& #7Cl$NtWrc3D*Fkn5A^jx6s{n_dWl Vni)0-eVYQ5%a92;&+8ck`@=vB*U#bA}? z1^~t^rpk}n{cCaR0=>T9dPoA=ky=c$u6Bfj3em0qPVaMdjI69mf5}Uk!>O*-U7!$G z4S8(?UzO7ux|kJCx3wa)f2>d+lS%wkB>vPWtukPJXkEb0h#ncSY55y=w6CsxEMe4N zRs^i<1FZL6?YDXqL@X^>&)Wm_#OIbS4I}azz>raXTyw*`yZoaaRf(B&__R3c;2cfS z`hZP;);Rvi)=z-17r9u&a5o+m&Z9pkLd^V$QfY!01pylgf>c(BR7tEzJ90L$K-fy; zgw6EKUFL_uOAdB}w%qgxGvWP8PgB3Vhgqz69Q 4!UZO~`p`Rv4OC7!zi0mJ>Y-y*eC-SQf<=HM~Vpp8A2kI;}B}-PVL4!#_wN zm@v`UqoEij?UTO5jUrqPV&?NiD)&aveDI_@(wb~(`_p&r&;=tLM7wVB@LN+#pXR20 z5aww!*ebWyPf}`n@LazuDi%CZcd^n1-Y8P++v72x4muva;<#{FZi4XxW?GcMc8G=R zUk} Mw;Lq{y*Tp2b2ylg{Mz0J^pN{Z0&!&dU4>|}E9-PT9Prq4F zdvaMZpaP4#pt&q8^4yU%dl%Mkv^qJdE~(@YYvcI7$Z7PoYK*dgd8Z#A5vPjUp!H%B zWC_qpN$xh +-V(YP#)xDaSl6n>;C_2;eH z{5%FlbciB2kr*V;x++*Z7Qw%l3i@Lzd~)@nw>bxTYbGIRE1!lUMW-aFt_Z4E9lV1c zs1KtKsO<;o`ZvHX)+FfBTineH@e#F~f6KR) ocbwWLD5`F1$@EZ*FDFQ< z#r{5Qn%xrOBESMRn@_U8Ohv~s7C0!_Vk+lh^wxx83;zaQgwnlyxphVF%uR9&hdN4^ z9WXAhLs3z{L8nwIe1Am6Ojz@MS1mqFtknjGOTP%rlnna2M=^;ID5itEIlk*{myFY2 z0*dGe)A|%hs@ICvJ=4U0H*|yPeC~77s&lheQ{(2~LA~hMwL1D+;;Xhmok-`%H}zPj z#CoygIDP4+W&h$X$dY)nt)S6db^uTiuCB3$=Up+~RI9&d!X*7InW?R&7Dm(G<*v0n zZi4qQzf=*ahxkQt&tO>+jZw_(#p+ DFP}WXgQFA_O@p)RW2Utx~ORFe>myo!P{4=8&RI z6EXw%9LL)?cOmf$kwQtUU<#l-VaC{!sq;`#QuQj3zk=U-1Pg&7Hx Bbe9?IoshnD+l(#SV=yvyuL>o-8 zCTAk+yk%F}+U# G( 2v5Xk<&avq6&{xKZO@IrWFrsMoWXkOXC6JPhTWi!NP?$nPRU^l z+Q8f-6{WDa`$O(+W9ijll%CO1LejbgJFgk8K&@wen4K;yt9Gw=LF6#yZYzah46_H; zTq!(VY|8O(VjQ1ztT#GnH+$G;{rSTIsOflmV`X7%nCkqer&vtBF*`k%hCn6AKv^I( zTuEbg`qdIJEYJUVsD*DKm`@}JpUu=R*@3b+b**?ConZ!Qrc7;_hdG8%Nu-0 @XS50z=d-|tpDGIa+GwZmtA3cRQ;jA`$_&z @%FU*eD5#+u$-a-L8m29%ndG{p&tbwW7}y#W*G&y0qU(xP60i*s{GRs z#mb4A`A*r)fle+<0q0%Z$D>?*CMng>6Bt|OT^(B+QTilFVRGw7$2b&$i8@5xQ#C=; zGrV_8Cg00AgD_@m%;;auz}U?SNzgzM8^ n*4-ZbJVDJfr~@H9c`WULtdkG&!v zqf4;t)@(xmqDX~*b*#JIA>utkD $=opg{wgWEw74%bFDJ7u?kPR!bbOEk~4 zuiJoQ^5BXGqp5ZW3wI2^^L8|F>R_zpTBENUemdj%9#n>O*(T>*R=Nn<^WKfj`PPgd zd#Ky1W)q&7sWUQD8c51c__xUp?l5N_Djn@dT#-B7cimto 2<9WdJ#9;1pTEWZJw zLk;Vgtr?O9A8>`d%Iz)nFN$dMsU*s{g{*?rcQ2H~@w4nR?U2PJ+6RzSr(E0z{u23+ zDsMxuEXd?NSW6)6j?6phU^;N#L*MF9-Xe>68^Al>=MvYzS2l5YcL&YnMQL(?cAJPNhQ~4CYop`F
ZBN*t~p`(w6 iVI5AV%E3 z`2b@DU_dx*I9kT4xQA Y5iyUOg4duTT0w&-4Q{D6jK$|WmBL%Jqs&_QfBVWP$tdpkX-k1B|Fm-amgFlB3 z%&deG5(AE$<6T1syU3H^Cm+Q4uU1@Z=0E>85 n(Pp(beh6aJr=B*M94jMW~K5gD<>>pve)#|-;PXe zme(vh!?+GRpTGzNoQk*2x8E|i2MUxn{fI7~ov)vd=L_;lHZ9etE>))$!yE5h@~-=R z8!8(yx(%-h-@0Atlhg9<=0?mEq m z=T`CCYPEiOp^6t73M+&fot=?eshc`CBvN#c8Kx-Zaj%%J9`!Rik$0Un#&2?mohMk2 z?Y6@ZgjZx75V0B}DxCvLH$HyWeO8aR(Vz7XBU;EllW{^X`Zc@5v3)Iu{)n3SqKV|( zIg07GI}Ap)^FN&}J+AlL0;rBfB28HEjMtt%VZJ|}uSZASs7J)bg+mj2Vz9BZ2amC5 zqMbkOB70n(w`?u)4Z&6x{j{qyz+NC!%vE)tS}Z$9;)<@N1>Sh47~C%SiDvgJ#81vg z4&I$C@CT@i?xha7)yxyC}p=qaFH2AbjcX4G-7c8B;T{u47V! zP_9bNS0uoR`SoP2?P_9y+W0M`V|yaDPT)>QTV)mnJx2;0G`4|ixZ-a~S=neknP{Rp zQA`s&FM2CsM{?X3thkF$xd24_+|{4xbX~8;Q=OWj8xX1p8=?vdz@gbvbR!adqY%O; zhqmC*QhvB?p$oJOk)!WlI~<$xIn`FT-_k~17WUgYkoI7wlcDqkydKKRv26;Oy?2L} zk-rE49ahidI<(EV_sJzgaLyLo@q)s+TX*u*3~`@zo(twR1akPpLvx@EZ@BCoe<3-5 zn3l) o2d*+s@Y5zU*TgiG9lzZ8(@L(99DQMZQ^5$l}K%R5!ZZDGI$Dm~2_U zpoLedVWs>ySxc)sOou=x_E28v6fk$Yt#a>OWb6?!Fd(YUEfLzrK@w P_^*ft95y&+ zmWK=DMRiG|k4k7i7OFc>=t$|j+n#qCrj1q?8AUUGh eS&?E2O*{XOT@dKopTS&3=e zhT10bF8|T};pJf&cxb!TybFFg5rZEJ-Mus+-g-UoOTAz0;-*h5ghv#${w^bwbsQ!* z4B;9#eBG?;bCB2 xhWg1H@umTAW9RFRpD{@@R4WGp!KKJ5rfR z)hrx|5behZk>6RJr1|@E+5OdT(>PHmy7O0RrLcvCh55N!V`t999VGfxW*~xfiS7vY z;wm)zmH;mTjUBI6#6wp5?xt&85>*w{&S ec+vKo&=IS;!;GGSi(#9d@9X7IJ zK%_Bc jNkD pWbk$s}PEX33uCi^uI#;AwFnZ`5^d z6r`92s-%!dil8DCC-wNEZs=J@DP+?&rNFhhL$8CdzB@q+Yh{{h&>5q7f400xm+y zgS6EC0|1U^g}@@Y4Y%n-UZAEJY=}MIU~7=ybNJkz-e>M8E!Vv(AM3pK$J*0Q-i2=3 zPX)#X2*CAN@AlRdyC6QZS&Aq*lc^+(ZZ#Rq%q*l6e3deE8OpV51ec8_#;_8xu;omPuJ;e~#3=C|Yqu9#TU(6=G3M&_`D`MR zCq){3-eENn`Q9O?^IT@J!*vs^7jS2BsGqnzBlBrwMe2Eh!_)W|lueAX Xw|F zzc;o9k)VnUM&?4IUs6z_qTse!rrudi(F~!O14sT=y@rb389LCk)fvHDdxuYh$P64P z;9r|lq5o~PrIzKf{o9PWSj<+$#;LPSU;6;lJbXgGDcup?^%z-B08OuMCxJHv2n#)7 z ?ZnLGhqHc24Y1@B6Ymy8ERQCs>b2i9NcFe>4*qF%0v>D zxnQ3G0D4$zJzJ?~!B{!|bVT|Md~u!5NHI5+l(^W3b)AQN5yIDb-Rg4RZgzBs%3QE~ z8;3#?tyqnlJu-#V;}d;Z0b6vo90%8`0nDctf!=>2i}1|t(zU|(v>rd!<@>Q|u%>$3 zR%E{EiID;-tb;vgy?#gACs~AUib2FW&Pq6E`Dm7;z+fT#jp%!4i^VDa!6&$hL0tA) z6h0Q>vJD2wl`Kz|#lnfgct!~rO(W+reE;u0 fr!~TfP?(Rm z=Hn1Oohv+LHG|fRl^HBbua5--BKw4sk%@_kAw(P3yTfnIV=)#)+vWIlk_Lm0X%bOR zX7U*8!7f~QK~=v$r KP0je<2+sS-Ccwb{Pm2y8Zu)kbTKp-n%c`7BO(~5#4)x4D# z VZNnX zPJ#!;=`+T^uQgE`u;C)L?G#Rg{b-Y(b98vNUHRv@lNaNvMR*Zk(CaQ@>BuIX1;_uF z@9QJD#gD$u77uv)?YX${GWlyazO7RmLJIsag9x$KTLV9Btpk>aR9*0?Va*`GF$8?# z8FaO8aB1hgK+}+MA&1A!NVZY`^`X1|-ZQQ%o^=}N2Z_mYo?%JpTyUrggKBRu(}d4N zK89{U;_^gzG2db@-PY0Kk>xPmMe2wo0|QAlWUw1z6Rg;Nua36JQ;0#adld&7hf0_$ z6a+=bPHBd|Sh@1TV @4vKniiU<(EB~(PdSqqbhO|T$yOr+XqJ>|u5u?N z=OvHN9*unqewX0E5WW!-Q~V>=@@#82rTU>w`Lx z8VNHf?aG#hlUK}{w;u;bR#(6VEfN#z_}K=(_*RRzoLg*} B)RZ*=ANqS8?!weWjBM zQg0Kf797(Q`HVwDoGvaxHQsK9JN7+$^mos})>%)1f-Cgny%t~nWKxC{?m-DePei?X z9uLOI$cV5|u`_sLpupXxfrHm{n;n%r4_k{@AJjwd$w~#b&C|1GjdrbVBX8l&w 8pPRJHm)6^E5zE`!gpY^#o?AMoT`#wh@=R=*Oo^TWN@Xlh*p1V|iBK+2d4>z}S zYnuGkp!dn)uR1+)&>*k1*r*5a$z3jY!a_d X{8QE@+Mmv&L@}Mt$KUM-#-Lu)1VHTV{!Qe?)T7xT G7cqll{`N zZettjv;Z#mLRzZd+*ryv$M@SEjGUB$KFDPgo0Y+}R6-%YwXEfS*CAf&mdI&tlXbH& z`3bzo>Gh5P#ta(Tx*}s$SZ>0mZ=l(+UFm8ggSLZzUAa}2|4ul^F9$xOnD1Y%b|Al> z{LOD{6sIA>O(CW4P(S570y_^12>-gWXy)lj9dcP&Q-T!pC%j8-Z+FH6ju-B+sk+Hd z@CW^^KqqugMpl%3|6`UXCmRkTus5fPEDB9QpOjwT_59I6=x`LbyfpNl5owb!+AVh# zc9La_H8B?%*Qg39aQ45g(1mh-AMReVX-PYRU%Md)cB7$_(fqQ&NQXgT4dY|2hOKi( zf4wY(hZlAt{11=-D4i*E3VLy8KhzqLBXdzW;O5pTESyI(nzl@;85Frrou&RC0u&(% z;vKE(FlHS_lR?XnR1QRGcc{f{4AaJa!T(27NQgkyepEOd525h${vKD?=8>ohasfUZ z&qQ=%x #5+o{QL!u2lS{R=yf6|Q9d1rx+=l5~Yn*SXKqk(ex&LD1|Baml!F`dS z7ku%oHGrxLJWeYl)~iIT{xjWLJQdL1;s3%u%6TBrztWt4{FS+{8Jg0Tr;~QS#ll>L z-hCNmp4s7eQa`$w_(!<{mIw{(D9Hr%Vv-LlT)oIdz_fM}Z60n85fRbTZYR(%!kQ*B z93PG_61Y+TjNs8X*1#K+ZYaWuj!9iCL9|>fl@U=y;#ts{SNV|b{XY~a!V0V$rdy)t zC%H1KhJ>pGcqIX?G;(i9fo56sc>+bZKQr?FEaiVt7y|^iR(jFW`V@njIj!M#C?F}G z75?Y2(deNcC?J~?_su2xAM%8v0$>vtklCi$1S+EAKwoBQp?vm7S0smzfK!^H*^XLb z2%3Ki(^+8 ^9p=KS6C@RX%Q&l=i&j-SGF@113Y22C_v2$h?wI*hP7wEe*V=n z9nyIYiI_-~5rJB<<9>VLp6 _7#ew=vYX`2`KsG!mCc z%hTcm&-_LaFi>t4+aV}dqrYtl7j*y)xC!_P!+nu0805@$-}aJqGRLOj{Re>xlR$7k zfuwzZgZ7S238W}${XivwJSHy7H_4Fq$qa7jnWh>E9t%MGFNp9^gt;6%3Cf5Ps+2aD zx3F@6$~8vuh;Wy==C@` c!GhEOKs9@aj|^QO81HD64w1T+_Hox7472pn zT>?r?HJhwGCr7}ig({@YgDw`32uG0hRw+||x0{qzV2q%tD-zfG8qdZ_K{x)JEc#sH zOnZZ|2uJM;u=sFf0b=DH!kF&9iWVn|kdc^4h4DdZ(hb n zls~^=NtKm=6b1z4AhmlDR!uste~|3392}stdXmMU=#qfn!VzZc>e#MPm{1C 1?q#6 zy8HI-ogJ2yR5ed{!$&Id!wRrFC~Ef%uE}1pxjfi Hyl_8@f_(!3&65^1pKoufFo(v5%5QI(`ANq~# z&c2<5kKGm8m=x>-4G3{&+9-FtK(bsVSIpJn{OxIOg3NO_9f)=y7!(88i(HSP9SI(> zCJDm`{T48#;n+?x)i&U^9c;c9U=rfAKFyYMLl>Yb7j~kl9M8&v5F79X?4|}lVI3a1 zgcmjCsxdzU4im|7zVa!0dK1hmzZG(;#Zaj;xRYfaexy>}oVQhMaJTc4mdr zDxr^Lav}_bBoKB+oixoO5O5xXkP{{Eo>Lq+h^Np6w!ZWU(fMa&0U&}A>6piH1mzl6 zcprQxsFK1(g8>o$e#8XwrYM`%MKi|ZL#H;VT}di%$JS=w;>FOtp$w5PsUk?$*Ahn^ z+^+pm6BETnze8bYG61U-$`+*2gCr2T8S$j1Mtr)NTyBV^q{G(e>-1xG)b->L5IP}f z9j?!*>ous9sLfu=AzPNx;yt;qIOeht{Xi(2r3 Date: Thu, 2 May 2024 17:06:26 -0500 Subject: [PATCH 60/65] =?UTF-8?q?test:=20=E2=9C=85=20Add=20tests=20for=20D?= =?UTF-8?q?NA=20Center=20integration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/dna_center/tests/__init__.py | 1 + .../tests/dna_center/tests/fixtures.py | 28 + .../tests/fixtures/expected_areas.json | 27 + .../fixtures/expected_areas_wo_global.json | 19 + .../tests/fixtures/expected_buildings.json | 44 + .../fixtures/expected_dnac_location_map.json | 32 + .../expected_dnac_location_map_wo_global.json | 27 + .../tests/fixtures/expected_floors.json | 94 + .../tests/fixtures/get_device_detail.json | 32 + .../fixtures/get_device_detail_recv.json | 34 + .../tests/fixtures/get_devices.json | 190 ++ .../tests/fixtures/get_devices_recv.json | 192 ++ .../tests/fixtures/get_locations.json | 161 ++ .../tests/fixtures/get_locations_recv.json | 163 ++ .../tests/fixtures/get_port_info.json | 1734 ++++++++++++++++ .../tests/fixtures/get_port_info_recv.json | 1736 +++++++++++++++++ .../tests/test_adapters_dna_center.py | 272 +++ .../tests/test_adapters_nautobot.py | 348 ++++ .../tests/dna_center/tests/test_basic.py | 17 + .../tests/dna_center/tests/test_jobs.py | 55 + .../dna_center/tests/test_models_nautobot.py | 305 +++ .../dna_center/tests/test_utils_dna_center.py | 226 +++ 22 files changed, 5737 insertions(+) create mode 100644 nautobot_ssot/tests/dna_center/tests/__init__.py create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures.py create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas_wo_global.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/expected_buildings.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map_wo_global.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/expected_floors.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail_recv.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/get_devices.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/get_devices_recv.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/get_locations.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/get_locations_recv.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info.json create mode 100644 nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info_recv.json create mode 100644 nautobot_ssot/tests/dna_center/tests/test_adapters_dna_center.py create mode 100644 nautobot_ssot/tests/dna_center/tests/test_adapters_nautobot.py create mode 100644 nautobot_ssot/tests/dna_center/tests/test_basic.py create mode 100644 nautobot_ssot/tests/dna_center/tests/test_jobs.py create mode 100644 nautobot_ssot/tests/dna_center/tests/test_models_nautobot.py create mode 100644 nautobot_ssot/tests/dna_center/tests/test_utils_dna_center.py diff --git a/nautobot_ssot/tests/dna_center/tests/__init__.py b/nautobot_ssot/tests/dna_center/tests/__init__.py new file mode 100644 index 000000000..ebe4cc44f --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/__init__.py @@ -0,0 +1 @@ +"""Unit tests for nautobot_ssot_dna_center plugin.""" diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures.py b/nautobot_ssot/tests/dna_center/tests/fixtures.py new file mode 100644 index 000000000..21d1efbe8 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures.py @@ -0,0 +1,28 @@ +"""Create fixtures for tests.""" + +import json + + +def load_json(path): + """Load a json file.""" + with open(path, encoding="utf-8") as file: + return json.loads(file.read()) + + +LOCATION_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_locations.json") +EXPECTED_DNAC_LOCATION_MAP = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_dnac_location_map.json") +EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL = load_json( + path="./nautobot_ssot_dna_center/tests/fixtures/expected_dnac_location_map_wo_global.json" +) +RECV_LOCATION_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_locations_recv.json") +DEVICE_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_devices.json") +RECV_DEVICE_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_devices_recv.json") +DEVICE_DETAIL_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_device_detail.json") +RECV_DEVICE_DETAIL_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_device_detail_recv.json") +PORT_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_port_info.json") +RECV_PORT_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_port_info_recv.json") + +EXPECTED_AREAS = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_areas.json") +EXPECTED_AREAS_WO_GLOBAL = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_areas_wo_global.json") +EXPECTED_BUILDINGS = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_buildings.json") +EXPECTED_FLOORS = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_floors.json") diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas.json b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas.json new file mode 100644 index 000000000..6cc27c5b4 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas.json @@ -0,0 +1,27 @@ +[ + { + "additionalInfo": [], + "id": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Global", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteNameHierarchy": "Global" + }, + { + "additionalInfo": [ + { + "attributes": { + "addressInheritedFrom": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "type": "area" + }, + "nameSpace": "Location" + } + ], + "id": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "NY", + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteNameHierarchy": "Global/NY" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas_wo_global.json b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas_wo_global.json new file mode 100644 index 000000000..82ac71770 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas_wo_global.json @@ -0,0 +1,19 @@ +[ + { + "additionalInfo": [ + { + "attributes": { + "addressInheritedFrom": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "type": "area" + }, + "nameSpace": "Location" + } + ], + "id": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "NY", + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteNameHierarchy": "Global/NY" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_buildings.json b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_buildings.json new file mode 100644 index 000000000..ac16ff183 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_buildings.json @@ -0,0 +1,44 @@ +[ + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "country": "United States", + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + "type": "building" + }, + "nameSpace": "Location" + } + ], + "id": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Building1", + "parentId": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9/5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteNameHierarchy": "Global/NY/Building1" + }, + { + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "country": "United States", + "address": "", + "latitude": "40.72947644312811", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "building", + "longitude": "-73.99464143036406" + } + } + ], + "name": "DC1", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "aa197d0e-75e2-4d46-bf51-97781931d034", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034", + "siteNameHierarchy": "Global/DC1" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map.json b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map.json new file mode 100644 index 000000000..44ac44d7b --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map.json @@ -0,0 +1,32 @@ +{ + "9e5f9fc2-032e-45e8-994c-4a00629648e8": { + "name": "Global", + "loc_type": "area", + "parent": null + }, + "49aa97a7-5d45-4303-89dd-f76dfbfc624a": { + "name": "Floor1", + "loc_type": "area", + "parent": null + }, + "5c59e37a-f12d-4e84-a085-ac5c02f240d4": { + "name": "Building1", + "loc_type": "area", + "parent": null + }, + "3f07768d-6b5c-4b4d-8577-29f765bd49c9": { + "name": "NY", + "loc_type": "area", + "parent": null + }, + "aa197d0e-75e2-4d46-bf51-97781931d034": { + "name": "DC1", + "loc_type": "area", + "parent": null + }, + "0ca6155d-207d-4760-961a-7e49149a684a": { + "name": "Main Floor", + "loc_type": "area", + "parent": null + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map_wo_global.json b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map_wo_global.json new file mode 100644 index 000000000..a14247d27 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map_wo_global.json @@ -0,0 +1,27 @@ +{ + "49aa97a7-5d45-4303-89dd-f76dfbfc624a": { + "name": "Floor1", + "loc_type": "area", + "parent": null + }, + "5c59e37a-f12d-4e84-a085-ac5c02f240d4": { + "name": "Building1", + "loc_type": "area", + "parent": null + }, + "3f07768d-6b5c-4b4d-8577-29f765bd49c9": { + "name": "NY", + "loc_type": "area", + "parent": null + }, + "aa197d0e-75e2-4d46-bf51-97781931d034": { + "name": "DC1", + "loc_type": "area", + "parent": null + }, + "0ca6155d-207d-4760-961a-7e49149a684a": { + "name": "Main Floor", + "loc_type": "area", + "parent": null + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_floors.json b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_floors.json new file mode 100644 index 000000000..2685b8204 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/expected_floors.json @@ -0,0 +1,94 @@ +[ + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "type": "floor" + }, + "nameSpace": "Location" + }, + { + "attributes": { + "height": "10.0", + "length": "100.0", + "offsetX": "0.0", + "offsetY": "0.0", + "width": "100.0" + }, + "nameSpace": "mapGeometry" + }, + { + "attributes": { + "member.umbrellaEnabled.direct": "0", + "member.umbrellaNotReady.direct": "2", + "member.umbrellaReady.direct": "0", + "member.umbrellaReadyNotEnabled.direct": "0" + }, + "nameSpace": "UMBRELLA" + }, + { + "attributes": { + "floorIndex": "1", + "rfModel": "95095" + }, + "nameSpace": "mapsSummary" + }, + { + "attributes": { + "ETAReady": "true", + "member.compatibleWithNaasOnly.direct": "0", + "member.etaCapable.direct": "2", + "member.etaEnabled.direct": "0", + "member.etaEnabledNaasOnly.direct": "0", + "member.etaNotReady.direct": "0", + "member.etaReady.direct": "2", + "member.etaReadyNotEnabled.direct": "2" + }, + "nameSpace": "ETA" + } + ], + "id": "49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Floor1", + "parentId": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "siteNameHierarchy": "Global/NY/Building1/Floor1" + }, + { + "parentId": "aa197d0e-75e2-4d46-bf51-97781931d034", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "address": "", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "floor" + } + }, + { + "nameSpace": "mapGeometry", + "attributes": { + "offsetX": "0.0", + "offsetY": "0.0", + "length": "100.0", + "width": "100.0", + "height": "10.0" + } + }, + { + "nameSpace": "mapsSummary", + "attributes": { + "rfModel": "95095", + "floorIndex": "1" + } + } + ], + "name": "Main Floor", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "0ca6155d-207d-4760-961a-7e49149a684a", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034/0ca6155d-207d-4760-961a-7e49149a684a", + "siteNameHierarchy": "Global/DC1/Main Floor" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail.json b/nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail.json new file mode 100644 index 000000000..06f6b4f7b --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail.json @@ -0,0 +1,32 @@ +{ + "collectionStatus": " ", + "communicationState": "UNREACHABLE", + "cpuScore": -1, + "deviceGroupHierarchyId": "/d47e8608-46fa-4a02-93b1-da92a5ff6c22/56ba076d-0820-4d31-8127-85f5de26962b/", + "deviceSeries": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "haStatus": "Non-redundant", + "ip_addr_managementIpAddr": "10.10.20.80", + "lastBootTime": 1668346366541, + "location": "Global/NY/Building1/Floor1", + "macAddress": "70:01:B5:5D:1B:00", + "maintenanceMode": false, + "managementIpAddr": "10.10.20.80", + "memoryScore": -1, + "nwDeviceFamily": "Switches and Hubs", + "nwDeviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "nwDeviceName": "spine1.abc.in", + "nwDeviceRole": "CORE", + "nwDeviceType": "Cisco Catalyst38xx stack-able ethernet switch", + "osType": "IOS-XE", + "overallHealth": -2, + "platformId": "WS-C3850-24P-L", + "ringStatus": false, + "serialNumber": "FCW2212D05S", + "siteHierarchyGraphId": "/9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a/", + "softwareVersion": "16.12.3", + "stackType": "NA", + "tagIdList": [ + "lan_access_9300" + ], + "timestamp": 1676317680000 +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail_recv.json b/nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail_recv.json new file mode 100644 index 000000000..3b1c048e5 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail_recv.json @@ -0,0 +1,34 @@ +{ + "response": { + "collectionStatus": " ", + "communicationState": "UNREACHABLE", + "cpuScore": -1, + "deviceGroupHierarchyId": "/d47e8608-46fa-4a02-93b1-da92a5ff6c22/56ba076d-0820-4d31-8127-85f5de26962b/", + "deviceSeries": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "haStatus": "Non-redundant", + "ip_addr_managementIpAddr": "10.10.20.80", + "lastBootTime": 1668346366541, + "location": "Global/NY/Building1/Floor1", + "macAddress": "70:01:B5:5D:1B:00", + "maintenanceMode": false, + "managementIpAddr": "10.10.20.80", + "memoryScore": -1, + "nwDeviceFamily": "Switches and Hubs", + "nwDeviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "nwDeviceName": "spine1.abc.in", + "nwDeviceRole": "CORE", + "nwDeviceType": "Cisco Catalyst38xx stack-able ethernet switch", + "osType": "IOS-XE", + "overallHealth": -2, + "platformId": "WS-C3850-24P-L", + "ringStatus": false, + "serialNumber": "FCW2212D05S", + "siteHierarchyGraphId": "/9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a/", + "softwareVersion": "16.12.3", + "stackType": "NA", + "tagIdList": [ + "lan_access_9300" + ], + "timestamp": 1676317680000 + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_devices.json b/nautobot_ssot/tests/dna_center/tests/fixtures/get_devices.json new file mode 100644 index 000000000..54b7273ef --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/get_devices.json @@ -0,0 +1,190 @@ +[ + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-12-31 12:01:05", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.6.4a, RELEASE SOFTWARE (fc3) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Fri 26-Oct-18 18:15 by mcpre", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "leaf1.abc.inc", + "id": "d354c924-f8ac-425f-b167-999f157e35e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "d354c924-f8ac-425f-b167-999f157e35e8", + "interfaceCount": "0", + "inventoryStatusDetail": " ", + "lastUpdateTime": 1675903366371, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "00:72:78:54:d1:00", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.81", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "C9300-48U", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "ACCESS", + "roleSource": "AUTO", + "serialNumber": "FCW2214L0VK", + "series": "Cisco Catalyst 9300 Series Switches", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.6.4a", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst 9300 Switch", + "upTime": "94 days, 10:46:37.35", + "uptimeSeconds": 8163651, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-11-09 13:20:46", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.6.4a, RELEASE SOFTWARE (fc3) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Fri 26-Oct-18 18:15 by mcpre", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "leaf2.abc.inc", + "id": "1c5f3896-9cac-40f8-85b3-64d2ae38f171", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1c5f3896-9cac-40f8-85b3-64d2ae38f171", + "interfaceCount": "0", + "inventoryStatusDetail": " ", + "lastUpdateTime": 1675903366362, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "50:61:bf:ec:07:80", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.82", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "C9300-48U", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "ACCESS", + "roleSource": "AUTO", + "serialNumber": "FCW2214L0UZ", + "series": "Cisco Catalyst 9300 Series Switches", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.6.4a", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst 9300 Switch", + "upTime": "91 days, 11:22:03.89", + "uptimeSeconds": 7906611, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-11-09 13:32:46", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Gibraltar], Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M), Version 16.12.3, RELEASE SOFTWARE (fc5) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2020 by Cisco Systems, Inc. Compiled Mon 09-Mar-20 18:", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "spine1.abc.in", + "id": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "interfaceCount": "0", + "inventoryStatusDetail": " ", + "lastUpdateTime": 1675903366428, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "70:01:b5:5d:1b:00", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.80", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "WS-C3850-24P-L", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "CORE", + "roleSource": "MANUAL", + "serialNumber": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.12.3", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst38xx stack-able ethernet switch", + "upTime": "91 days, 11:10:06.50", + "uptimeSeconds": 7905891, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "api.meraki.com", + "bootDateTime": null, + "collectionInterval": "NA", + "collectionStatus": "Unreachable", + "description": "MR42", + "deviceSupportLevel": "Supported", + "errorCode": "MERAKI-UNREACHED", + "errorDescription": "NCIM12014: The Meraki device or Meraki dashboard is unreachable. For connectivity issues of Meraki dashboard please ensure the API key is correct. The collection status of the device/dashboard would be updated in the next resync of Meraki dashboard if the connectivity issue is recovered and/or the API key is corrected.", + "family": "Meraki Access Point", + "hostname": "", + "id": "531bbc5a-aa8f-52f1-9a60-fc29d1c91860", + "instanceTenantId": "6df67d101bd46e119c129e91", + "instanceUuid": "531bbc5a-aa8f-52f1-9a60-fc29d1c91860", + "interfaceCount": "0", + "inventoryStatusDetail": "NA", + "lastUpdateTime": 1681833374231, + "lastUpdated": "2022-12-03 10:32:09", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "99:26:55:bb:56:42", + "managedAtleastOnce": false, + "managementIpAddress": "10.10.10.80", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "MR42", + "reachabilityFailureReason": "NA", + "reachabilityStatus": "Unreachable", + "role": "UNKNOWN", + "roleSource": "MANUAL", + "serialNumber": "R3JE-OYG4-RCDE", + "series": "Meraki Access Point", + "snmpContact": "", + "snmpLocation": null, + "softwareType": null, + "softwareVersion": null, + "tagCount": "0", + "tunnelUdpPort": null, + "type": "MR42", + "upTime": null, + "uptimeSeconds": -1, + "waasDeviceMode": null + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_devices_recv.json b/nautobot_ssot/tests/dna_center/tests/fixtures/get_devices_recv.json new file mode 100644 index 000000000..d0f6a55e8 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/get_devices_recv.json @@ -0,0 +1,192 @@ +{ + "response": [ + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-12-31 12:01:05", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.6.4a, RELEASE SOFTWARE (fc3) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Fri 26-Oct-18 18:15 by mcpre", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "leaf1.abc.inc", + "id": "d354c924-f8ac-425f-b167-999f157e35e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "d354c924-f8ac-425f-b167-999f157e35e8", + "interfaceCount": "0", + "inventoryStatusDetail": " ", + "lastUpdateTime": 1675903366371, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "00:72:78:54:d1:00", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.81", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "C9300-48U", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "ACCESS", + "roleSource": "AUTO", + "serialNumber": "FCW2214L0VK", + "series": "Cisco Catalyst 9300 Series Switches", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.6.4a", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst 9300 Switch", + "upTime": "94 days, 10:46:37.35", + "uptimeSeconds": 8163651, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-11-09 13:20:46", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.6.4a, RELEASE SOFTWARE (fc3) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Fri 26-Oct-18 18:15 by mcpre", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "leaf2.abc.inc", + "id": "1c5f3896-9cac-40f8-85b3-64d2ae38f171", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1c5f3896-9cac-40f8-85b3-64d2ae38f171", + "interfaceCount": "0", + "inventoryStatusDetail": " ", + "lastUpdateTime": 1675903366362, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "50:61:bf:ec:07:80", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.82", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "C9300-48U", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "ACCESS", + "roleSource": "AUTO", + "serialNumber": "FCW2214L0UZ", + "series": "Cisco Catalyst 9300 Series Switches", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.6.4a", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst 9300 Switch", + "upTime": "91 days, 11:22:03.89", + "uptimeSeconds": 7906611, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-11-09 13:32:46", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Gibraltar], Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M), Version 16.12.3, RELEASE SOFTWARE (fc5) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2020 by Cisco Systems, Inc. Compiled Mon 09-Mar-20 18:", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "spine1.abc.in", + "id": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "interfaceCount": "0", + "inventoryStatusDetail": " ", + "lastUpdateTime": 1675903366428, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "70:01:b5:5d:1b:00", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.80", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "WS-C3850-24P-L", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "CORE", + "roleSource": "MANUAL", + "serialNumber": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.12.3", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst38xx stack-able ethernet switch", + "upTime": "91 days, 11:10:06.50", + "uptimeSeconds": 7905891, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "api.meraki.com", + "bootDateTime": null, + "collectionInterval": "NA", + "collectionStatus": "Unreachable", + "description": "MR42", + "deviceSupportLevel": "Supported", + "errorCode": "MERAKI-UNREACHED", + "errorDescription": "NCIM12014: The Meraki device or Meraki dashboard is unreachable. For connectivity issues of Meraki dashboard please ensure the API key is correct. The collection status of the device/dashboard would be updated in the next resync of Meraki dashboard if the connectivity issue is recovered and/or the API key is corrected.", + "family": "Meraki Access Point", + "hostname": "", + "id": "531bbc5a-aa8f-52f1-9a60-fc29d1c91860", + "instanceTenantId": "6df67d101bd46e119c129e91", + "instanceUuid": "531bbc5a-aa8f-52f1-9a60-fc29d1c91860", + "interfaceCount": "0", + "inventoryStatusDetail": "NA", + "lastUpdateTime": 1681833374231, + "lastUpdated": "2022-12-03 10:32:09", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "99:26:55:bb:56:42", + "managedAtleastOnce": false, + "managementIpAddress": "10.10.10.80", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "MR42", + "reachabilityFailureReason": "NA", + "reachabilityStatus": "Unreachable", + "role": "UNKNOWN", + "roleSource": "MANUAL", + "serialNumber": "R3JE-OYG4-RCDE", + "series": "Meraki Access Point", + "snmpContact": "", + "snmpLocation": null, + "softwareType": null, + "softwareVersion": null, + "tagCount": "0", + "tunnelUdpPort": null, + "type": "MR42", + "upTime": null, + "uptimeSeconds": -1, + "waasDeviceMode": null + } + ] +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_locations.json b/nautobot_ssot/tests/dna_center/tests/fixtures/get_locations.json new file mode 100644 index 000000000..643dc7c68 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/get_locations.json @@ -0,0 +1,161 @@ +[ + { + "additionalInfo": [], + "id": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Global", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteNameHierarchy": "Global" + }, + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "type": "floor" + }, + "nameSpace": "Location" + }, + { + "attributes": { + "height": "10.0", + "length": "100.0", + "offsetX": "0.0", + "offsetY": "0.0", + "width": "100.0" + }, + "nameSpace": "mapGeometry" + }, + { + "attributes": { + "member.umbrellaEnabled.direct": "0", + "member.umbrellaNotReady.direct": "2", + "member.umbrellaReady.direct": "0", + "member.umbrellaReadyNotEnabled.direct": "0" + }, + "nameSpace": "UMBRELLA" + }, + { + "attributes": { + "floorIndex": "1", + "rfModel": "95095" + }, + "nameSpace": "mapsSummary" + }, + { + "attributes": { + "ETAReady": "true", + "member.compatibleWithNaasOnly.direct": "0", + "member.etaCapable.direct": "2", + "member.etaEnabled.direct": "0", + "member.etaEnabledNaasOnly.direct": "0", + "member.etaNotReady.direct": "0", + "member.etaReady.direct": "2", + "member.etaReadyNotEnabled.direct": "2" + }, + "nameSpace": "ETA" + } + ], + "id": "49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Floor1", + "parentId": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "siteNameHierarchy": "Global/NY/Building1/Floor1" + }, + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "country": "United States", + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + "type": "building" + }, + "nameSpace": "Location" + } + ], + "id": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Building1", + "parentId": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9/5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteNameHierarchy": "Global/NY/Building1" + }, + { + "additionalInfo": [ + { + "attributes": { + "addressInheritedFrom": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "type": "area" + }, + "nameSpace": "Location" + } + ], + "id": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "NY", + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteNameHierarchy": "Global/NY" + }, + { + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "country": "United States", + "address": "", + "latitude": "40.72947644312811", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "building", + "longitude": "-73.99464143036406" + } + } + ], + "name": "DC1", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "aa197d0e-75e2-4d46-bf51-97781931d034", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034", + "siteNameHierarchy": "Global/DC1" + }, + { + "parentId": "aa197d0e-75e2-4d46-bf51-97781931d034", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "address": "", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "floor" + } + }, + { + "nameSpace": "mapGeometry", + "attributes": { + "offsetX": "0.0", + "offsetY": "0.0", + "length": "100.0", + "width": "100.0", + "height": "10.0" + } + }, + { + "nameSpace": "mapsSummary", + "attributes": { + "rfModel": "95095", + "floorIndex": "1" + } + } + ], + "name": "Main Floor", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "0ca6155d-207d-4760-961a-7e49149a684a", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034/0ca6155d-207d-4760-961a-7e49149a684a", + "siteNameHierarchy": "Global/DC1/Main Floor" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_locations_recv.json b/nautobot_ssot/tests/dna_center/tests/fixtures/get_locations_recv.json new file mode 100644 index 000000000..99dcf9409 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/get_locations_recv.json @@ -0,0 +1,163 @@ +{ + "response": [ + { + "additionalInfo": [], + "id": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Global", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteNameHierarchy": "Global" + }, + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "type": "floor" + }, + "nameSpace": "Location" + }, + { + "attributes": { + "height": "10.0", + "length": "100.0", + "offsetX": "0.0", + "offsetY": "0.0", + "width": "100.0" + }, + "nameSpace": "mapGeometry" + }, + { + "attributes": { + "member.umbrellaEnabled.direct": "0", + "member.umbrellaNotReady.direct": "2", + "member.umbrellaReady.direct": "0", + "member.umbrellaReadyNotEnabled.direct": "0" + }, + "nameSpace": "UMBRELLA" + }, + { + "attributes": { + "floorIndex": "1", + "rfModel": "95095" + }, + "nameSpace": "mapsSummary" + }, + { + "attributes": { + "ETAReady": "true", + "member.compatibleWithNaasOnly.direct": "0", + "member.etaCapable.direct": "2", + "member.etaEnabled.direct": "0", + "member.etaEnabledNaasOnly.direct": "0", + "member.etaNotReady.direct": "0", + "member.etaReady.direct": "2", + "member.etaReadyNotEnabled.direct": "2" + }, + "nameSpace": "ETA" + } + ], + "id": "49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Floor1", + "parentId": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "siteNameHierarchy": "Global/NY/Building1/Floor1" + }, + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "country": "United States", + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + "type": "building" + }, + "nameSpace": "Location" + } + ], + "id": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Building1", + "parentId": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9/5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteNameHierarchy": "Global/NY/Building1" + }, + { + "additionalInfo": [ + { + "attributes": { + "addressInheritedFrom": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "type": "area" + }, + "nameSpace": "Location" + } + ], + "id": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "NY", + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteNameHierarchy": "Global/NY" + }, + { + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "country": "United States", + "address": "", + "latitude": "40.72947644312811", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "building", + "longitude": "-73.99464143036406" + } + } + ], + "name": "DC1", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "aa197d0e-75e2-4d46-bf51-97781931d034", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034", + "siteNameHierarchy": "Global/DC1" + }, + { + "parentId": "aa197d0e-75e2-4d46-bf51-97781931d034", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "address": "", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "floor" + } + }, + { + "nameSpace": "mapGeometry", + "attributes": { + "offsetX": "0.0", + "offsetY": "0.0", + "length": "100.0", + "width": "100.0", + "height": "10.0" + } + }, + { + "nameSpace": "mapsSummary", + "attributes": { + "rfModel": "95095", + "floorIndex": "1" + } + } + ], + "name": "Main Floor", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "0ca6155d-207d-4760-961a-7e49149a684a", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034/0ca6155d-207d-4760-961a-7e49149a684a", + "siteNameHierarchy": "Global/DC1/Main Floor" + } + ] +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info.json b/nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info.json new file mode 100644 index 000000000..b04e643f7 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info.json @@ -0,0 +1,1734 @@ +[ + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "ee436e67-103a-4c46-863d-8b80cff3217d", + "ifIndex": "1", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ee436e67-103a-4c46-863d-8b80cff3217d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:00", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334399/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "GigabitEthernet0/0", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "0", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "uplink to 3750x TOR switch", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "23ade28d-9cf1-49ae-80b2-5836c913375a", + "ifIndex": "8", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "23ade28d-9cf1-49ae-80b2-5836c913375a", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:01", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334382/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "access", + "portName": "GigabitEthernet1/0/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "823", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "P2P link leaf1", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "eb24abea-a4dd-4728-b822-8c3d788369d5", + "ifIndex": "9", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "eb24abea-a4dd-4728-b822-8c3d788369d5", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:02", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334379/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "trunk", + "portName": "GigabitEthernet1/0/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "P2P link leaf2", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "1fe26fc6-2eef-4b0b-904f-f52460ca96ec", + "ifIndex": "10", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1fe26fc6-2eef-4b0b-904f-f52460ca96ec", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:03", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334377/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "trunk", + "portName": "GigabitEthernet1/0/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "58210717-ef8a-49a8-b43f-5cb3fd933f2e", + "ifIndex": "11", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "58210717-ef8a-49a8-b43f-5cb3fd933f2e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:04", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334376/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "98728bdf-9c6e-4905-8a30-69b253482a10", + "ifIndex": "12", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "98728bdf-9c6e-4905-8a30-69b253482a10", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:05", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334386/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/5", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "adad089b-bd87-4136-8caa-ca2e814e28c7", + "ifIndex": "13", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "adad089b-bd87-4136-8caa-ca2e814e28c7", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:06", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334385/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/6", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "ebf20f5f-7df1-424f-ad61-ace9405a3834", + "ifIndex": "14", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ebf20f5f-7df1-424f-ad61-ace9405a3834", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:07", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334384/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/7", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "9af59679-f6d5-42c8-aa44-e101887988f0", + "ifIndex": "15", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "9af59679-f6d5-42c8-aa44-e101887988f0", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:08", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334383/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/8", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "23c7074a-cce4-4bcb-b460-b03cedef3bfc", + "ifIndex": "16", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "23c7074a-cce4-4bcb-b460-b03cedef3bfc", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:09", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334375/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/9", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f010ed49-1191-4030-a845-df30636a4fe1", + "ifIndex": "17", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f010ed49-1191-4030-a845-df30636a4fe1", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0a", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334426/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/10", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "48031539-1f20-4e3b-8618-44567dd87253", + "ifIndex": "18", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "48031539-1f20-4e3b-8618-44567dd87253", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0b", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334427/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/11", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f88ee01f-ce5e-485c-92c7-98c196795136", + "ifIndex": "19", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f88ee01f-ce5e-485c-92c7-98c196795136", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5: 5d: 1b: 0c", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334428/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/12", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "151b413e-e8af-4248-9499-88eee4a048ae", + "ifIndex": "20", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "151b413e-e8af-4248-9499-88eee4a048ae", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0d", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334429/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/13", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "3c1588e1-a935-460a-88d3-421eefc6d178", + "ifIndex": "21", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "3c1588e1-a935-460a-88d3-421eefc6d178", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0e", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334430/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/14", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f5785599-742c-4680-83ea-372219f4ae76", + "ifIndex": "22", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f5785599-742c-4680-83ea-372219f4ae76", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0f", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334431/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/15", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "566844af-a3fb-41cb-b88a-fc8d391e89e7", + "ifIndex": "23", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "566844af-a3fb-41cb-b88a-fc8d391e89e7", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:10", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334432/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/16", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "0579dd30-2bdc-4598-a32b-50f7218c3a8d", + "ifIndex": "24", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "0579dd30-2bdc-4598-a32b-50f7218c3a8d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:11", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334433/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/17", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f75ff274-b3af-4b5d-b5a6-27a2d66a631e", + "ifIndex": "25", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f75ff274-b3af-4b5d-b5a6-27a2d66a631e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:12", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334434/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/18", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "b2426dd1-77ea-4cb0-a9b1-92bdc3e58406", + "ifIndex": "26", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "b2426dd1-77ea-4cb0-a9b1-92bdc3e58406", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:13", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334435/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/19", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "1a1e44d9-bf0f-441d-8a49-e21d9aa1236e", + "ifIndex": "27", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1a1e44d9-bf0f-441d-8a49-e21d9aa1236e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:14", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334388/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/20", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "62644411-ccc9-4e77-adeb-12a57ca9c3d5", + "ifIndex": "28", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "62644411-ccc9-4e77-adeb-12a57ca9c3d5", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:15", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334389/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/21", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "096777bb-e1e9-4f48-9061-bb00f92b2d5d", + "ifIndex": "29", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "096777bb-e1e9-4f48-9061-bb00f92b2d5d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:16", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334391/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/22", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "024333e5-f925-41ac-88be-fb00245ab5c4", + "ifIndex": "30", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "024333e5-f925-41ac-88be-fb00245ab5c4", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:17", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334393/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/23", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "c70b02fe-2323-4ebf-8d66-b87575d4ab0f", + "ifIndex": "31", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "c70b02fe-2323-4ebf-8d66-b87575d4ab0f", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:18", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334395/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/24", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "3741dd1b-05af-48f8-abb4-12f930138bbe", + "ifIndex": "32", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "3741dd1b-05af-48f8-abb4-12f930138bbe", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:19", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334394/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "730b927a-6179-4990-b922-ac02926568a4", + "ifIndex": "33", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "730b927a-6179-4990-b922-ac02926568a4", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1a", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334392/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "7d11d9ce-b713-4bac-988a-e7a8a52a64b9", + "ifIndex": "34", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "7d11d9ce-b713-4bac-988a-e7a8a52a64b9", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1b", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334390/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "459b3850-52fb-441e-9881-b6fd911796ab", + "ifIndex": "35", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "459b3850-52fb-441e-9881-b6fd911796ab", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1c", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334380/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": [ + { + "address": { + "ipAddress": { + "address": "10.2.2.2" + }, + "ipMask": { + "address": "255.255.255.0" + }, + "isInverseMask": false, + "lazyLoadedEntities": null + }, + "lazyLoadedEntities": null, + "type": "IPV4_PRIMARY" + } + ], + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "7d1f94cf-b701-4f9d-8984-1cc3da2ec79a", + "ifIndex": "44", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "7d1f94cf-b701-4f9d-8984-1cc3da2ec79a", + "interfaceType": "Virtual", + "ipv4Address": "10.2.2.2", + "ipv4Mask": "255.255.255.0", + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334436/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1514", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Loopback0", + "portType": "Service Module Interface", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "8000000", + "status": "up", + "vlanId": "0", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "2d390a18-1b00-4265-bea1-01b288db4c59", + "ifIndex": "36", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "2d390a18-1b00-4265-bea1-01b288db4c59", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1d", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334401/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "40d6bf96-1442-4b94-842a-ec0d6719c92e", + "ifIndex": "37", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "40d6bf96-1442-4b94-842a-ec0d6719c92e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1e", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334400/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "e0144968-3088-4b55-81e7-b89b9e1dd66d", + "ifIndex": "38", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "e0144968-3088-4b55-81e7-b89b9e1dd66d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1f", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334403/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "e9506d33-8725-4617-b6a1-d3e88541b6e1", + "ifIndex": "39", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "e9506d33-8725-4617-b6a1-d3e88541b6e1", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:20", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334402/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "DOWN", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "49792a78-1400-4711-a6b0-3eaa90c0331e", + "ifIndex": "43", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "49792a78-1400-4711-a6b0-3eaa90c0331e", + "interfaceType": "Virtual", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:47", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334381/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan1", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": [ + { + "address": { + "ipAddress": { + "address": "10.10.20.80" + }, + "ipMask": { + "address": "255.255.255.0" + }, + "isInverseMask": false, + "lazyLoadedEntities": null + }, + "lazyLoadedEntities": null, + "type": "IPV4_PRIMARY" + } + ], + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "0a71a595-df83-4fbf-964d-9889e11a75c2", + "ifIndex": "45", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "0a71a595-df83-4fbf-964d-9889e11a75c2", + "interfaceType": "Virtual", + "ipv4Address": "10.10.20.80", + "ipv4Mask": "255.255.255.0", + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:66", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334387/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan823", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "823", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "ed6ce0b8-fa3a-43fd-9ac8-d03afb5fb24c", + "ifIndex": "46", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ed6ce0b8-fa3a-43fd-9ac8-d03afb5fb24c", + "interfaceType": "Virtual", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:51", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334378/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan848", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "848", + "voiceVlan": "" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info_recv.json b/nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info_recv.json new file mode 100644 index 000000000..5c6a7dba3 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info_recv.json @@ -0,0 +1,1736 @@ +{ + "response": [ + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "ee436e67-103a-4c46-863d-8b80cff3217d", + "ifIndex": "1", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ee436e67-103a-4c46-863d-8b80cff3217d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:00", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334399/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "GigabitEthernet0/0", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "0", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "uplink to 3750x TOR switch", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "23ade28d-9cf1-49ae-80b2-5836c913375a", + "ifIndex": "8", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "23ade28d-9cf1-49ae-80b2-5836c913375a", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:01", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334382/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "access", + "portName": "GigabitEthernet1/0/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "823", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "P2P link leaf1", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "eb24abea-a4dd-4728-b822-8c3d788369d5", + "ifIndex": "9", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "eb24abea-a4dd-4728-b822-8c3d788369d5", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:02", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334379/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "trunk", + "portName": "GigabitEthernet1/0/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "P2P link leaf2", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "1fe26fc6-2eef-4b0b-904f-f52460ca96ec", + "ifIndex": "10", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1fe26fc6-2eef-4b0b-904f-f52460ca96ec", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:03", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334377/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "trunk", + "portName": "GigabitEthernet1/0/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "58210717-ef8a-49a8-b43f-5cb3fd933f2e", + "ifIndex": "11", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "58210717-ef8a-49a8-b43f-5cb3fd933f2e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:04", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334376/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "98728bdf-9c6e-4905-8a30-69b253482a10", + "ifIndex": "12", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "98728bdf-9c6e-4905-8a30-69b253482a10", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:05", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334386/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/5", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "adad089b-bd87-4136-8caa-ca2e814e28c7", + "ifIndex": "13", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "adad089b-bd87-4136-8caa-ca2e814e28c7", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:06", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334385/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/6", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "ebf20f5f-7df1-424f-ad61-ace9405a3834", + "ifIndex": "14", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ebf20f5f-7df1-424f-ad61-ace9405a3834", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:07", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334384/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/7", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "9af59679-f6d5-42c8-aa44-e101887988f0", + "ifIndex": "15", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "9af59679-f6d5-42c8-aa44-e101887988f0", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:08", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334383/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/8", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "23c7074a-cce4-4bcb-b460-b03cedef3bfc", + "ifIndex": "16", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "23c7074a-cce4-4bcb-b460-b03cedef3bfc", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:09", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334375/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/9", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f010ed49-1191-4030-a845-df30636a4fe1", + "ifIndex": "17", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f010ed49-1191-4030-a845-df30636a4fe1", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0a", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334426/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/10", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "48031539-1f20-4e3b-8618-44567dd87253", + "ifIndex": "18", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "48031539-1f20-4e3b-8618-44567dd87253", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0b", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334427/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/11", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f88ee01f-ce5e-485c-92c7-98c196795136", + "ifIndex": "19", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f88ee01f-ce5e-485c-92c7-98c196795136", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5: 5d: 1b: 0c", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334428/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/12", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "151b413e-e8af-4248-9499-88eee4a048ae", + "ifIndex": "20", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "151b413e-e8af-4248-9499-88eee4a048ae", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0d", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334429/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/13", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "3c1588e1-a935-460a-88d3-421eefc6d178", + "ifIndex": "21", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "3c1588e1-a935-460a-88d3-421eefc6d178", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0e", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334430/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/14", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f5785599-742c-4680-83ea-372219f4ae76", + "ifIndex": "22", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f5785599-742c-4680-83ea-372219f4ae76", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0f", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334431/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/15", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "566844af-a3fb-41cb-b88a-fc8d391e89e7", + "ifIndex": "23", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "566844af-a3fb-41cb-b88a-fc8d391e89e7", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:10", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334432/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/16", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "0579dd30-2bdc-4598-a32b-50f7218c3a8d", + "ifIndex": "24", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "0579dd30-2bdc-4598-a32b-50f7218c3a8d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:11", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334433/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/17", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f75ff274-b3af-4b5d-b5a6-27a2d66a631e", + "ifIndex": "25", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f75ff274-b3af-4b5d-b5a6-27a2d66a631e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:12", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334434/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/18", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "b2426dd1-77ea-4cb0-a9b1-92bdc3e58406", + "ifIndex": "26", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "b2426dd1-77ea-4cb0-a9b1-92bdc3e58406", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:13", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334435/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/19", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "1a1e44d9-bf0f-441d-8a49-e21d9aa1236e", + "ifIndex": "27", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1a1e44d9-bf0f-441d-8a49-e21d9aa1236e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:14", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334388/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/20", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "62644411-ccc9-4e77-adeb-12a57ca9c3d5", + "ifIndex": "28", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "62644411-ccc9-4e77-adeb-12a57ca9c3d5", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:15", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334389/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/21", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "096777bb-e1e9-4f48-9061-bb00f92b2d5d", + "ifIndex": "29", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "096777bb-e1e9-4f48-9061-bb00f92b2d5d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:16", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334391/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/22", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "024333e5-f925-41ac-88be-fb00245ab5c4", + "ifIndex": "30", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "024333e5-f925-41ac-88be-fb00245ab5c4", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:17", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334393/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/23", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "c70b02fe-2323-4ebf-8d66-b87575d4ab0f", + "ifIndex": "31", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "c70b02fe-2323-4ebf-8d66-b87575d4ab0f", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:18", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334395/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/24", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "3741dd1b-05af-48f8-abb4-12f930138bbe", + "ifIndex": "32", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "3741dd1b-05af-48f8-abb4-12f930138bbe", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:19", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334394/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "730b927a-6179-4990-b922-ac02926568a4", + "ifIndex": "33", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "730b927a-6179-4990-b922-ac02926568a4", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1a", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334392/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "7d11d9ce-b713-4bac-988a-e7a8a52a64b9", + "ifIndex": "34", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "7d11d9ce-b713-4bac-988a-e7a8a52a64b9", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1b", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334390/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "459b3850-52fb-441e-9881-b6fd911796ab", + "ifIndex": "35", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "459b3850-52fb-441e-9881-b6fd911796ab", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1c", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334380/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": [ + { + "address": { + "ipAddress": { + "address": "10.2.2.2" + }, + "ipMask": { + "address": "255.255.255.0" + }, + "isInverseMask": false, + "lazyLoadedEntities": null + }, + "lazyLoadedEntities": null, + "type": "IPV4_PRIMARY" + } + ], + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "7d1f94cf-b701-4f9d-8984-1cc3da2ec79a", + "ifIndex": "44", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "7d1f94cf-b701-4f9d-8984-1cc3da2ec79a", + "interfaceType": "Virtual", + "ipv4Address": "10.2.2.2", + "ipv4Mask": "255.255.255.0", + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334436/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1514", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Loopback0", + "portType": "Service Module Interface", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "8000000", + "status": "up", + "vlanId": "0", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "2d390a18-1b00-4265-bea1-01b288db4c59", + "ifIndex": "36", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "2d390a18-1b00-4265-bea1-01b288db4c59", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1d", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334401/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "40d6bf96-1442-4b94-842a-ec0d6719c92e", + "ifIndex": "37", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "40d6bf96-1442-4b94-842a-ec0d6719c92e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1e", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334400/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "e0144968-3088-4b55-81e7-b89b9e1dd66d", + "ifIndex": "38", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "e0144968-3088-4b55-81e7-b89b9e1dd66d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1f", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334403/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "e9506d33-8725-4617-b6a1-d3e88541b6e1", + "ifIndex": "39", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "e9506d33-8725-4617-b6a1-d3e88541b6e1", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:20", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334402/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "DOWN", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "49792a78-1400-4711-a6b0-3eaa90c0331e", + "ifIndex": "43", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "49792a78-1400-4711-a6b0-3eaa90c0331e", + "interfaceType": "Virtual", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:47", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334381/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan1", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": [ + { + "address": { + "ipAddress": { + "address": "10.10.20.80" + }, + "ipMask": { + "address": "255.255.255.0" + }, + "isInverseMask": false, + "lazyLoadedEntities": null + }, + "lazyLoadedEntities": null, + "type": "IPV4_PRIMARY" + } + ], + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "0a71a595-df83-4fbf-964d-9889e11a75c2", + "ifIndex": "45", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "0a71a595-df83-4fbf-964d-9889e11a75c2", + "interfaceType": "Virtual", + "ipv4Address": "10.10.20.80", + "ipv4Mask": "255.255.255.0", + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:66", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334387/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan823", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "823", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "ed6ce0b8-fa3a-43fd-9ac8-d03afb5fb24c", + "ifIndex": "46", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ed6ce0b8-fa3a-43fd-9ac8-d03afb5fb24c", + "interfaceType": "Virtual", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:51", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334378/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan848", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "848", + "voiceVlan": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/tests/test_adapters_dna_center.py b/nautobot_ssot/tests/dna_center/tests/test_adapters_dna_center.py new file mode 100644 index 000000000..2b18d8e35 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/test_adapters_dna_center.py @@ -0,0 +1,272 @@ +"""Test DNA Center adapter.""" + +import uuid +from unittest.mock import MagicMock + +from django.core.exceptions import ValidationError +from django.contrib.contenttypes.models import ContentType +from django.test import override_settings +from nautobot.dcim.models import Device, DeviceType, Interface, Manufacturer, Location, LocationType +from nautobot.extras.models import CustomField, JobResult, Status, Role +from nautobot.ipam.models import IPAddress, IPAddressToInterface, Prefix, Namespace +from nautobot.core.testing import TransactionTestCase +from nautobot_ssot_dna_center.diffsync.adapters.dna_center import DnaCenterAdapter +from nautobot_ssot_dna_center.tests.fixtures import ( + LOCATION_FIXTURE, + EXPECTED_DNAC_LOCATION_MAP, + EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL, + DEVICE_FIXTURE, + DEVICE_DETAIL_FIXTURE, + PORT_FIXTURE, + EXPECTED_AREAS, + EXPECTED_AREAS_WO_GLOBAL, + EXPECTED_BUILDINGS, + EXPECTED_FLOORS, +) +from nautobot_ssot_dna_center.jobs import DnaCenterDataSource + + +@override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": True}}) +class TestDnaCenterAdapterTestCase( + TransactionTestCase +): # pylint: disable=too-many-public-methods, too-many-instance-attributes + """Test NautobotSsotDnaCenterAdapter class.""" + + databases = ("default", "job_logs") + + def setUp(self): + """Initialize test case.""" + super().setUp() + self.dna_center_client = MagicMock() + self.dna_center_client.get_devices.return_value = DEVICE_FIXTURE + self.dna_center_client.find_address_and_type.side_effect = [ + ("", "floor"), + ("", "building"), + ("", "area"), + ] + self.dna_center_client.find_latitude_and_longitude.return_value = ("", "") + self.dna_center_client.get_device_detail.return_value = DEVICE_DETAIL_FIXTURE + self.dna_center_client.get_model_name.return_value = "WS-C3850-24P-L" + self.dna_center_client.parse_site_hierarchy.return_value = { + "areas": ["Global", "NY"], + "building": "Building1", + "floor": "Floor1", + } + self.dna_center_client.get_port_info.return_value = PORT_FIXTURE + self.dna_center_client.get_port_type.return_value = "virtual" + self.dna_center_client.get_port_status.return_value = "active" + + self.job = DnaCenterDataSource() + self.job.debug = True + self.job.job_result = JobResult.objects.create( + name=self.job.class_path, task_name="fake task", user=None, id=uuid.uuid4() + ) + self.dna_center = DnaCenterAdapter(job=self.job, sync=None, client=self.dna_center_client, tenant=None) + self.dna_center.job.logger.warning = MagicMock() + self.dna_center.job.logger.error = MagicMock() + self.dna_center.job.logger.info = MagicMock() + self.dna_center.dnac_location_map = EXPECTED_DNAC_LOCATION_MAP + + self.sor_cf = CustomField.objects.get(label="System of Record") + self.status_active = Status.objects.get(name="Active") + self.hq_area = Location.objects.create( + name="NY", location_type=LocationType.objects.get(name="Region"), status=self.status_active + ) + self.loc_type = LocationType.objects.get(name="Site") + self.hq_site = Location.objects.create( + name="HQ", parent=self.hq_area, location_type=self.loc_type, status=self.status_active + ) + self.hq_site.validated_save() + + cisco_manu = Manufacturer.objects.get_or_create(name="Cisco")[0] + catalyst_devicetype = DeviceType.objects.get_or_create(model="WS-C3850-24P-L", manufacturer=cisco_manu)[0] + core_role, created = Role.objects.get_or_create(name="CORE") + if created: + core_role.content_types.add(ContentType.objects.get_for_model(Device)) + + self.test_dev = Device.objects.create( + name="spine1.abc.in", + device_type=catalyst_devicetype, + role=core_role, + serial="FCW2212D05S", + location=self.hq_site, + status=self.status_active, + ) + self.test_dev.validated_save() + self.intf = Interface.objects.create( + name="Vlan823", type="virtual", device=self.test_dev, status=self.status_active + ) + self.intf.validated_save() + + self.namespace = Namespace.objects.get_or_create(name="Global")[0] + + self.prefix = Prefix.objects.create( + prefix="10.10.20.0/24", + status=self.status_active, + namespace=self.namespace, + ) + self.addr = IPAddress.objects.create( + address="10.10.20.80/24", + parent=self.prefix, + status=self.status_active, + ) + self.ip_to_intf = IPAddressToInterface.objects.create( + ip_address=self.addr, + interface=self.intf, + ) + + def test_build_dnac_location_map(self): + """Test Nautobot adapter build_dnac_location_map method.""" + self.dna_center.dnac_location_map = {} + actual = self.dna_center.build_dnac_location_map(locations=LOCATION_FIXTURE) + expected = EXPECTED_DNAC_LOCATION_MAP + self.assertEqual(actual, expected) + + @override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": False}}) + def test_build_dnac_location_map_wo_global(self): + """Test Nautobot adapter build_dnac_location_map method without global.""" + self.dna_center.dnac_location_map = {} + actual = self.dna_center.build_dnac_location_map(locations=LOCATION_FIXTURE) + expected = EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL + self.assertEqual(actual, expected) + + def test_parse_and_sort_locations(self): + """Test Nautobot adapter parse_and_sort_locations method.""" + actual = self.dna_center.parse_and_sort_locations(locations=LOCATION_FIXTURE) + expected = EXPECTED_AREAS, EXPECTED_BUILDINGS, EXPECTED_FLOORS + self.assertEqual(actual, expected) + + @override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": False}}) + def test_parse_and_sort_locations_wo_global(self): + """Test Nautobot adapter parse_and_sort_locations method without Global region.""" + self.dna_center.dnac_location_map = EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL + actual_areas, actual_buildings, actual_floors = self.dna_center.parse_and_sort_locations( + locations=LOCATION_FIXTURE + ) + self.assertEqual(actual_areas, EXPECTED_AREAS_WO_GLOBAL) + self.assertEqual(actual_buildings, EXPECTED_BUILDINGS) + self.assertEqual(actual_floors, EXPECTED_FLOORS) + + def test_load_locations_success(self): + """Test Nautobot SSoT for Cisco DNA Center load_locations() function successfully.""" + self.dna_center.load_areas = MagicMock() + self.dna_center.load_buildings = MagicMock() + self.dna_center.load_floors = MagicMock() + self.dna_center_client.get_location.return_value = [{"name": "NY"}] + self.dna_center.load_locations() + self.dna_center_client.get_locations.assert_called() + self.dna_center.load_areas.assert_called_once() + self.dna_center.load_buildings.assert_called_once() + self.dna_center.load_floors.assert_called_once() + + def test_load_locations_failure(self): + """Test Nautobot SSoT for Cisco DNA Center load_locations() function fails.""" + self.dna_center_client.get_locations.return_value = [] + self.dna_center.load_locations() + self.dna_center.job.logger.error.assert_called_once_with( + "No location data was returned from DNAC. Unable to proceed." + ) + + def test_load_areas_w_global(self): + """Test Nautobot SSoT for Cisco DNA Center load_areas() function with Global area.""" + self.dna_center.load_areas(areas=EXPECTED_AREAS) + area_expected = [ + "Global__None", + "NY__Global", + ] + area_actual = [area.get_unique_id() for area in self.dna_center.get_all("area")] + self.assertEqual(area_actual, area_expected) + self.dna_center.job.logger.info.assert_called_with( + "Loading area NY. {'additionalInfo': [{'attributes': {'addressInheritedFrom': '3f07768d-6b5c-4b4d-8577-29f765bd49c9', 'type': 'area'}, 'nameSpace': 'Location'}], 'id': '3f07768d-6b5c-4b4d-8577-29f765bd49c9', 'instanceTenantId': '623f029857259506a56ad9bd', 'name': 'NY', 'parentId': '9e5f9fc2-032e-45e8-994c-4a00629648e8', 'siteHierarchy': '9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9', 'siteNameHierarchy': 'Global/NY'}" + ) + + @override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": False}}) + def test_load_areas_wo_global(self): + """Test Nautobot SSoT for Cisco DNA Center load_areas() function without Global area.""" + self.dna_center.dnac_location_map = EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL + self.dna_center.load_areas(areas=EXPECTED_AREAS) + area_expected = [ + "NY__None", + ] + area_actual = [area.get_unique_id() for area in self.dna_center.get_all("area")] + self.assertEqual(area_actual, area_expected) + + def test_load_areas_with_validation_error(self): + """Test Nautobot SSoT for Cisco DNA Center load_areas() function with a ValidationError.""" + self.dna_center.add = MagicMock() + self.dna_center.add.side_effect = ValidationError(message="Area load failed!") + self.dna_center.load_areas(areas=EXPECTED_AREAS_WO_GLOBAL) + self.dna_center.job.logger.warning.assert_called_with("Unable to load area NY. ['Area load failed!']") + + def test_load_buildings_w_global(self): + """Test Nautobot SSoT for Cisco DNA Center load_buildings() function with Global area.""" + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + building_expected = ["Building1", "DC1"] + building_actual = [building.get_unique_id() for building in self.dna_center.get_all("building")] + self.assertEqual(building_actual, building_expected) + + def test_load_buildings_wo_global(self): + """Test Nautobot SSoT for Cisco DNA Center load_buildings() function without Global area.""" + self.dna_center.dnac_location_map = EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + building_expected = ["Building1", "DC1"] + building_actual = [building.get_unique_id() for building in self.dna_center.get_all("building")] + self.assertEqual(building_actual, building_expected) + + def test_load_buildings_duplicate(self): + """Test Nautobot SSoT for Cisco DNA Center load_buildings() function with duplicate building.""" + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + self.dna_center.job.logger.warning.assert_called_with("Building DC1 already loaded so skipping.") + + def test_load_buildings_with_validation_error(self): + """Test Nautobot SSoT for Cisco DNA Center load_buildings() function with a ValidationError.""" + self.dna_center.add = MagicMock() + self.dna_center.add.side_effect = ValidationError(message="Building load failed!") + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + self.dna_center.job.logger.warning.assert_called_with("Unable to load building DC1. ['Building load failed!']") + + def test_load_floors(self): + """Test Nautobot SSoT for Cisco DNA Center load_floors() function.""" + self.dna_center.load_floors(floors=EXPECTED_FLOORS) + floor_expected = ["Building1 - Floor1__Building1", "DC1 - Main Floor__DC1"] + floor_actual = [floor.get_unique_id() for floor in self.dna_center.get_all("floor")] + self.assertEqual(floor_actual, floor_expected) + + def test_load_floors_missing_parent(self): + """Test Nautobot SSoT for Cisco DNA Center load_floors() function with missing parent.""" + self.dna_center.dnac_location_map = {} + self.dna_center.load_floors(floors=EXPECTED_FLOORS) + self.dna_center.job.logger.warning.assert_called_with("Parent to Main Floor can't be found so will be skipped.") + + def test_load_devices(self): + """Test Nautobot SSoT for Cisco DNA Center load_devices() function.""" + self.dna_center.load_ports = MagicMock() + self.dna_center.load_devices() + self.assertEqual( + {f"{dev['hostname']}" for dev in DEVICE_FIXTURE if dev.get("hostname")}, + {dev.get_unique_id() for dev in self.dna_center.get_all("device")}, + ) + self.dna_center.load_ports.assert_called() + + def test_load_ports(self): + """Test Nautobot SSoT for Cisco DNA Center load_ports() function.""" + self.dna_center.load_devices() + expected_ports = [] + for dev in DEVICE_FIXTURE: + if dev.get("hostname"): + for port in PORT_FIXTURE: + if port.get("portName"): + expected_ports.append(f"{port['portName']}__{dev['hostname']}") + actual_ports = [port.get_unique_id() for port in self.dna_center.get_all("port")] + self.assertEqual(expected_ports, actual_ports) + + def test_load_ports_validation_error(self): + """Test Nautobot SSoT for Cisco DNA Center load_ports() function throwing ValidationError.""" + self.dna_center.add = MagicMock(side_effect=ValidationError(message="leaf3.abc.inc not found")) + mock_device = MagicMock() + mock_device.name = "leaf3.abc.inc" + self.dna_center.load_ports(device_id="1234567890", dev=mock_device) + self.dna_center.job.logger.warning.assert_called_with( + "Unable to load port Vlan848 for leaf3.abc.inc. ['leaf3.abc.inc not found']" + ) diff --git a/nautobot_ssot/tests/dna_center/tests/test_adapters_nautobot.py b/nautobot_ssot/tests/dna_center/tests/test_adapters_nautobot.py new file mode 100644 index 000000000..356b3c3fd --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/test_adapters_nautobot.py @@ -0,0 +1,348 @@ +"""Unit tests for the Nautobot DiffSync adapter.""" + +import uuid +from unittest.mock import MagicMock, patch +from diffsync.exceptions import ObjectNotFound +from django.contrib.contenttypes.models import ContentType +from nautobot.dcim.models import ( + Manufacturer, + Location, + LocationType, + Device, + DeviceType, + Platform, + Interface, +) +from nautobot.extras.models import Status, JobResult, Role +from nautobot.ipam.models import IPAddress, Namespace, Prefix, IPAddressToInterface +from nautobot.core.testing import TransactionTestCase +from nautobot_ssot_dna_center.jobs import DnaCenterDataSource +from nautobot_ssot_dna_center.diffsync.adapters.nautobot import NautobotAdapter + + +class NautobotDiffSyncTestCase(TransactionTestCase): + """Test the NautobotAdapter class.""" + + databases = ("default", "job_logs") + + def __init__(self, *args, **kwargs): + """Initialize shared variables.""" + super().__init__(*args, **kwargs) + self.ny_region = None + self.hq_site = None + self.loc_type = None + self.floor_loc = None + + def setUp(self): # pylint: disable=too-many-locals + """Per-test-case data setup.""" + super().setUp() + self.status_active = Status.objects.get(name="Active") + + job = DnaCenterDataSource() + job.job_result = JobResult.objects.create( + name=job.class_path, task_name="fake task", user=None, id=uuid.uuid4() + ) + self.nb_adapter = NautobotAdapter(job=job, sync=None) + self.nb_adapter.job = MagicMock() + self.nb_adapter.job.logger.info = MagicMock() + self.nb_adapter.job.logger.warning = MagicMock() + + def build_nautobot_objects(self): # pylint: disable=too-many-locals, too-many-statements + """Build out Nautobot objects to test loading.""" + self.loc_type = LocationType.objects.get(name="Region") + global_region = Location.objects.create(name="Global", status=self.status_active, location_type=self.loc_type) + global_region.custom_field_data["system_of_record"] = "DNA Center" + global_region.validated_save() + self.ny_region = Location.objects.create( + name="NY", location_type=self.loc_type, parent=global_region, status=self.status_active + ) + self.ny_region.custom_field_data["system_of_record"] = "DNA Center" + self.ny_region.validated_save() + self.loc_type = LocationType.objects.get(name="Site") + self.hq_site = Location.objects.create( + parent=self.ny_region, name="HQ", status=self.status_active, location_type=self.loc_type + ) + self.hq_site.custom_field_data["system_of_record"] = "DNA Center" + self.hq_site.validated_save() + + self.loc_type = LocationType.objects.get(name="Floor") + self.floor_loc = Location.objects.create( + name="HQ Floor 1", + parent=self.hq_site, + location_type=self.loc_type, + status=self.status_active, + ) + self.floor_loc.custom_field_data["system_of_record"] = "DNA Center" + self.floor_loc.validated_save() + + cisco_manu = Manufacturer.objects.create(name="Cisco") + csr_devicetype = DeviceType.objects.create(model="Cisco Catalyst 9300 Switch", manufacturer=cisco_manu) + leaf_role = Role.objects.create(name="LEAF") + leaf_role.content_types.add(ContentType.objects.get_for_model(Device)) + spine_role = Role.objects.create(name="SPINE") + spine_role.content_types.add(ContentType.objects.get_for_model(Device)) + ios_platform = Platform.objects.create(name="IOS", napalm_driver="ios") + leaf1_dev = Device.objects.create( + name="leaf1.abc.inc", + location=self.floor_loc, + status=self.status_active, + device_type=csr_devicetype, + role=leaf_role, + platform=ios_platform, + serial="FCW2214L0VK", + ) + leaf1_dev.custom_field_data["system_of_record"] = "DNA Center" + leaf2_dev = Device.objects.create( + name="leaf2.abc.inc", + location=self.floor_loc, + status=self.status_active, + device_type=csr_devicetype, + role=leaf_role, + platform=ios_platform, + serial="FCW2214L0UZ", + ) + leaf2_dev.custom_field_data["system_of_record"] = "DNA Center" + spine1_dev = Device.objects.create( + name="spine1.abc.in", + location=self.floor_loc, + status=self.status_active, + device_type=csr_devicetype, + role=spine_role, + platform=ios_platform, + serial="FCW2212D05S", + ) + spine1_dev.custom_field_data["system_of_record"] = "DNA Center" + spine1_dev.validated_save() + + unknown_role = Role.objects.create(name="UNKNOWN") + unknown_role.content_types.add(ContentType.objects.get_for_model(Device)) + meraki_ap = Device.objects.create( + name="", + location=self.floor_loc, + status=self.status_active, + device_type=DeviceType.objects.create(model="MR42", manufacturer=cisco_manu), + role=unknown_role, + platform=Platform.objects.create(name="meraki", napalm_driver="meraki"), + serial="R3JE-OYG4-RCDE", + ) + meraki_ap.custom_field_data["system_of_record"] = "DNA Center" + meraki_ap.validated_save() + + leaf1_mgmt = Interface.objects.create( + device=leaf1_dev, + name="Management", + status=self.status_active, + mtu=1500, + type="virtual", + mac_address="aa:bb:cc:dd:ee:f1", + ) + leaf1_mgmt.custom_field_data["system_of_record"] = "DNA Center" + leaf1_mgmt.validated_save() + leaf2_mgmt = Interface.objects.create( + device=leaf2_dev, + name="Management", + status=self.status_active, + mtu=1500, + type="virtual", + mac_address="aa:bb:cc:dd:ee:f2", + ) + leaf2_mgmt.custom_field_data["system_of_record"] = "DNA Center" + leaf2_mgmt.validated_save() + spine1_mgmt = Interface.objects.create( + device=spine1_dev, + name="Management", + status=self.status_active, + mtu=1500, + type="virtual", + mac_address="aa:bb:cc:dd:ee:f3", + ) + spine1_mgmt.custom_field_data["system_of_record"] = "DNA Center" + spine1_mgmt.validated_save() + + ap_mgmt = Interface.objects.create( + device=meraki_ap, + name="Management", + status=self.status_active, + mtu=1500, + type="virtual", + mac_address="aa:bb:cc:dd:ee:f4", + ) + ap_mgmt.custom_field_data["system_of_record"] = "DNA Center" + ap_mgmt.validated_save() + + test_ns = Namespace.objects.create(name="Global") + + leaf1_pf = Prefix.objects.create( + prefix="10.10.10.0/24", + namespace=test_ns, + status=self.status_active, + ) + leaf1_ip = IPAddress.objects.create( + address="10.10.10.1/24", + parent=leaf1_pf, + status=self.status_active, + ) + leaf1_ip.custom_field_data["system_of_record"] = "DNA Center" + leaf1_ip.validated_save() + + IPAddressToInterface.objects.create(ip_address=leaf1_ip, interface=leaf1_mgmt) + + leaf1_mgmt.device.primary_ip4 = leaf1_ip + leaf1_mgmt.device.validated_save() + + leaf2_pf = Prefix.objects.create( + prefix="10.10.11.0/24", + namespace=test_ns, + status=self.status_active, + ) + leaf2_ip = IPAddress.objects.create( + address="10.10.11.1/24", + parent=leaf2_pf, + status=self.status_active, + ) + leaf2_ip.custom_field_data["system_of_record"] = "DNA Center" + leaf2_ip.validated_save() + + IPAddressToInterface.objects.create(ip_address=leaf2_ip, interface=leaf2_mgmt) + + leaf2_mgmt.device.primary_ip4 = leaf2_ip + leaf2_mgmt.device.validated_save() + + spine1_pf = Prefix.objects.create( + prefix="10.10.12.0/24", + namespace=test_ns, + status=self.status_active, + ) + spine1_ip = IPAddress.objects.create( + address="10.10.12.1/24", + parent=spine1_pf, + status=self.status_active, + ) + spine1_ip.custom_field_data["system_of_record"] = "DNA Center" + spine1_ip.validated_save() + + IPAddressToInterface.objects.create(ip_address=spine1_ip, interface=spine1_mgmt) + + spine1_mgmt.device.primary_ip4 = spine1_ip + spine1_mgmt.device.validated_save() + + ap_pf = Prefix.objects.create( + prefix="10.10.13.0/24", + namespace=test_ns, + status=self.status_active, + ) + + ap_ip = IPAddress.objects.create( + address="10.10.13.1/24", + parent=ap_pf, + status=self.status_active, + ) + ap_ip.custom_field_data["system_of_record"] = "DNA Center" + ap_ip.validated_save() + + IPAddressToInterface.objects.create(ip_address=ap_ip, interface=ap_mgmt) + + ap_mgmt.device.primary_ip4 = ap_ip + ap_mgmt.device.validated_save() + + def test_data_loading(self): + """Test the load() function.""" + self.build_nautobot_objects() + self.nb_adapter.load() + self.assertEqual( + ["Global__None", "NY__Global"], + sorted(loc.get_unique_id() for loc in self.nb_adapter.get_all("area")), + ) + self.assertEqual( + ["HQ"], + sorted(site.get_unique_id() for site in self.nb_adapter.get_all("building")), + ) + self.assertEqual( + ["HQ Floor 1__HQ"], + sorted(loc.get_unique_id() for loc in self.nb_adapter.get_all("floor")), + ) + self.assertEqual( + ["", "leaf1.abc.inc", "leaf2.abc.inc", "spine1.abc.in"], + sorted(dev.get_unique_id() for dev in self.nb_adapter.get_all("device")), + ) + self.assertEqual( + [ + "Management__", + "Management__leaf1.abc.inc", + "Management__leaf2.abc.inc", + "Management__spine1.abc.in", + ], + sorted(port.get_unique_id() for port in self.nb_adapter.get_all("port")), + ) + self.assertEqual( + [ + "10.10.10.1__Global", + "10.10.11.1__Global", + "10.10.12.1__Global", + "10.10.13.1__Global", + ], + sorted(ipaddr.get_unique_id() for ipaddr in self.nb_adapter.get_all("ipaddress")), + ) + + def test_load_regions_failure(self): + """Test the load_regions method failing with loading duplicate Regions.""" + self.build_nautobot_objects() + self.nb_adapter.load() + self.nb_adapter.load_regions() + self.nb_adapter.job.logger.warning.assert_called_with("Region NY already loaded so skipping duplicate.") + + @patch("nautobot_ssot_dna_center.diffsync.adapters.nautobot.OrmLocationType") + @patch("nautobot_ssot_dna_center.diffsync.adapters.nautobot.OrmLocation") + def test_load_floors_missing_building(self, mock_floors, mock_loc_type): + """Test the load_floors method failing with missing Building.""" + mock_floor = MagicMock() + mock_floor.name = "HQ - Floor 1" + mock_floor.parent = MagicMock() + mock_floor.parent.name = "Missing" + mock_floor.tenant = None + mock_floor.id = uuid.uuid4() + mock_loc_type.objects.get.return_value = mock_loc_type + mock_floors.objects.filter.return_value = [mock_floor] + self.nb_adapter.get = MagicMock() + self.nb_adapter.get.side_effect = [ObjectNotFound()] + self.nb_adapter.load_floors() + self.nb_adapter.job.logger.warning.assert_called_with( + "Unable to load building Missing for floor HQ - Floor 1. " + ) + + def test_sync_complete(self): + """Test the sync_complete() method in the NautobotAdapter.""" + self.nb_adapter.objects_to_delete = { + "ipaddresses": [MagicMock()], + "prefixes": [MagicMock()], + "ports": [MagicMock()], + "devices": [MagicMock()], + "floors": [MagicMock(), MagicMock()], + "sites": [MagicMock()], + "regions": [], + } + self.nb_adapter.job = MagicMock() + self.nb_adapter.job.logger.info = MagicMock() + + deleted_objs = [] + for group in ["ipaddresses", "prefixes", "ports", "devices", "floors", "sites"]: + deleted_objs.extend(self.nb_adapter.objects_to_delete[group]) + + self.nb_adapter.sync_complete(diff=MagicMock(), source=MagicMock()) + + for obj in deleted_objs: + self.assertTrue(obj.delete.called) + self.assertEqual(len(self.nb_adapter.objects_to_delete["ipaddresses"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["prefixes"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["devices"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["ports"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["floors"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["sites"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["regions"]), 0) + self.assertTrue(self.nb_adapter.job.logger.info.called) + self.assertTrue(self.nb_adapter.job.logger.info.call_count, 5) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[0].startswith("Deleting")) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[1].startswith("Deleting")) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[2].startswith("Deleting")) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[3].startswith("Deleting")) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[4].startswith("Deleting")) diff --git a/nautobot_ssot/tests/dna_center/tests/test_basic.py b/nautobot_ssot/tests/dna_center/tests/test_basic.py new file mode 100644 index 000000000..b306ae8c8 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/test_basic.py @@ -0,0 +1,17 @@ +"""Basic tests that do not require Django.""" + +import unittest +import os +import toml + +from nautobot_ssot_dna_center import __version__ as project_version + + +class TestVersion(unittest.TestCase): + """Test Version is the same.""" + + def test_version(self): + """Verify that pyproject.toml version is same as version specified in the package.""" + parent_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) + poetry_version = toml.load(os.path.join(parent_path, "pyproject.toml"))["tool"]["poetry"]["version"] + self.assertEqual(project_version, poetry_version) diff --git a/nautobot_ssot/tests/dna_center/tests/test_jobs.py b/nautobot_ssot/tests/dna_center/tests/test_jobs.py new file mode 100644 index 000000000..54cdc1abd --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/test_jobs.py @@ -0,0 +1,55 @@ +"""Test DNA Center Jobs.""" + +from django.test import TestCase +from django.urls import reverse + +from nautobot_ssot_dna_center import jobs + + +class DnaCenterDataSourceJobTest(TestCase): + """Test the DNA Center DataSource Job.""" + + def test_metadata(self): + """Verify correctness of the Job Meta attributes.""" + self.assertEqual("DNA Center to Nautobot", jobs.DnaCenterDataSource.name) + self.assertEqual("DNA Center to Nautobot", jobs.DnaCenterDataSource.Meta.name) + self.assertEqual("DNA Center", jobs.DnaCenterDataSource.data_source) + self.assertEqual("Sync information from DNA Center to Nautobot", jobs.DnaCenterDataSource.description) + + def test_data_mapping(self): + mappings = jobs.DnaCenterDataSource.data_mappings() + + self.assertEqual("Areas", mappings[0].source_name) + self.assertIsNone(mappings[0].source_url) + self.assertEqual("Locations", mappings[0].target_name) + self.assertEqual(reverse("dcim:location_list"), mappings[0].target_url) + + self.assertEqual("Buildings", mappings[1].source_name) + self.assertIsNone(mappings[1].source_url) + self.assertEqual("Locations", mappings[1].target_name) + self.assertEqual(reverse("dcim:location_list"), mappings[1].target_url) + + self.assertEqual("Floors", mappings[2].source_name) + self.assertIsNone(mappings[2].source_url) + self.assertEqual("Locations", mappings[2].target_name) + self.assertEqual(reverse("dcim:location_list"), mappings[2].target_url) + + self.assertEqual("Devices", mappings[3].source_name) + self.assertIsNone(mappings[3].source_url) + self.assertEqual("Devices", mappings[3].target_name) + self.assertEqual(reverse("dcim:device_list"), mappings[3].target_url) + + self.assertEqual("Interfaces", mappings[4].source_name) + self.assertIsNone(mappings[4].source_url) + self.assertEqual("Interfaces", mappings[4].target_name) + self.assertEqual(reverse("dcim:interface_list"), mappings[4].target_url) + + self.assertEqual("IP Addresses", mappings[5].source_name) + self.assertIsNone(mappings[5].source_url) + self.assertEqual("IP Addresses", mappings[5].target_name) + self.assertEqual(reverse("ipam:ipaddress_list"), mappings[5].target_url) + + def test_config_information(self): + """Verify the config_information() API.""" + config_information = jobs.DnaCenterDataSource.config_information() + self.assertEqual(config_information, {"Instances": "Found in Extensibility -> External Integrations menu."}) diff --git a/nautobot_ssot/tests/dna_center/tests/test_models_nautobot.py b/nautobot_ssot/tests/dna_center/tests/test_models_nautobot.py new file mode 100644 index 000000000..ddc13d361 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/test_models_nautobot.py @@ -0,0 +1,305 @@ +"""Test the DiffSync models for Nautobot.""" + +from unittest.mock import MagicMock, patch +from diffsync import DiffSync +from nautobot.dcim.models import ( + Location, + LocationType, + DeviceType, + Manufacturer, +) +from nautobot.extras.models import Status, Role +from nautobot.tenancy.models import Tenant +from nautobot.core.testing import TransactionTestCase +from nautobot_ssot_dna_center.diffsync.models.nautobot import ( + NautobotArea, + NautobotBuilding, + NautobotFloor, + NautobotDevice, +) + + +class TestNautobotArea(TransactionTestCase): + """Test the NautobotArea class.""" + + def setUp(self): + super().setUp() + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.diffsync.region_map = {} + self.region_type = LocationType.objects.get(name="Region") + self.diffsync.locationtype_map = {"Region": self.region_type.id} + self.diffsync.status_map = {"Active": Status.objects.get(name="Active").id} + + def test_create(self): + """Validate the NautobotArea create() method creates a Region.""" + status_active = Status.objects.get(name="Active") + self.diffsync.status_map = {"Active": status_active.id} + global_region = Location.objects.create(name="Global", location_type=self.region_type, status=status_active) + self.diffsync.region_map = {"Global": global_region.id} + ids = {"name": "NY", "parent": "Global"} + attrs = {} + result = NautobotArea.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, NautobotArea) + self.diffsync.job.logger.info.assert_called_once_with("Creating Region NY.") + region_obj = Location.objects.get(name=ids["name"], location_type__name="Region") + self.assertEqual(region_obj.name, ids["name"]) + self.assertEqual(region_obj.parent.name, ids["parent"]) + + def test_create_missing_parent(self): + """Validate the NautobotArea create() method with missing parent Region.""" + ids = {"name": "TX", "parent": "USA"} + attrs = {} + NautobotArea.create(self.diffsync, ids, attrs) + self.diffsync.job.logger.warning.assert_called_once_with("Unable to find Region USA for TX.") + + +class TestNautobotBuilding(TransactionTestCase): + """Test the NautobotBuilding class.""" + + databases = ("default", "job_logs") + + def setUp(self): + super().setUp() + + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.diffsync.status_map = {"Active": Status.objects.get(name="Active").id} + ga_tenant = Tenant.objects.create(name="G&A") + self.diffsync.tenant_map = {"G&A": ga_tenant.id} + reg_loc = LocationType.objects.get(name="Region") + ny_region = Location.objects.create(name="NY", location_type=reg_loc, status=Status.objects.get(name="Active")) + loc_type = LocationType.objects.get(name="Site") + self.diffsync.locationtype_map = {"Region": reg_loc.id, "Site": loc_type.id} + self.sec_site = Location.objects.create( + name="Site 2", parent=ny_region, status=Status.objects.get(name="Active"), location_type=loc_type + ) + self.sec_site.validated_save() + self.diffsync.site_map = {"NY": ny_region.id, "Site 2": self.sec_site.id} + self.test_bldg = NautobotBuilding( + name="Site 2", address="", area="NY", latitude="", longitude="", tenant="G&A", uuid=self.sec_site.id + ) + self.test_bldg.diffsync = self.diffsync + + def test_create(self): + """Validate the NautobotBuilding create() method creates a Site.""" + ids = {"name": "HQ"} + attrs = {"address": "123 Main St", "area": "NY", "latitude": "12.345", "longitude": "-67.890", "tenant": "G&A"} + ny_area = Location.objects.get_or_create( + name="NY", location_type=LocationType.objects.get(name="Region"), status=Status.objects.get(name="Active") + )[0] + ny_area.validated_save() + self.diffsync.region_map = {"NY": ny_area.id} + result = NautobotBuilding.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, NautobotBuilding) + self.diffsync.job.logger.info.assert_called_once_with("Creating Site HQ.") + site_obj = Location.objects.get(name=ids["name"], location_type__name="Site") + self.assertEqual(site_obj.name, ids["name"]) + self.assertEqual(site_obj.parent.name, attrs["area"]) + self.assertEqual(site_obj.physical_address, attrs["address"]) + self.assertEqual(site_obj.tenant.name, attrs["tenant"]) + + def test_update_w_tenant(self): + """Validate the NautobotBuilding update() method updates a Site with a tenant.""" + update_attrs = { + "address": "456 Wall St", + "latitude": "23.456", + "longitude": "-78.901", + "tenant": "G&A", + } + actual = NautobotBuilding.update(self=self.test_bldg, attrs=update_attrs) + self.test_bldg.diffsync.job.logger.info.assert_called_once_with("Updating Site Site 2.") + self.sec_site.refresh_from_db() + self.assertEqual(self.sec_site.physical_address, update_attrs["address"]) + self.assertEqual(str(self.sec_site.latitude).rstrip("0"), update_attrs["latitude"]) + self.assertEqual(f"{self.sec_site.longitude:.3f}", update_attrs["longitude"]) + self.assertEqual(self.sec_site.tenant.name, update_attrs["tenant"]) + self.assertEqual(actual, self.test_bldg) + + def test_update_wo_tenant(self): + """Validate the NautobotBuilding update() method updates a Site without a tenant.""" + update_attrs = { + "address": "456 Wall St", + "latitude": "23.456", + "longitude": "-78.901", + "tenant": "", + } + NautobotBuilding.update(self=self.test_bldg, attrs=update_attrs) + self.sec_site.refresh_from_db() + self.assertIsNone(self.sec_site.tenant) + + def test_delete(self): + """Validate the NautobotBuilding delete() method deletes a Site.""" + ds_mock_site = MagicMock(spec=Location) + ds_mock_site.uuid = "1234567890" + ds_mock_site.diffsync = MagicMock() + ds_mock_site.diffsync.job.logger.info = MagicMock() + mock_site = MagicMock(spec=Location) + mock_site.name = "Test" + site_get_mock = MagicMock(return_value=mock_site) + with patch.object(Location.objects, "get", site_get_mock): + result = NautobotBuilding.delete(ds_mock_site) + ds_mock_site.diffsync.job.logger.info.assert_called_once_with("Deleting Site Test.") + self.assertEqual(ds_mock_site, result) + + +class TestNautobotFloor(TransactionTestCase): + """Test the NautobotFloor class.""" + + databases = ("default", "job_logs") + + def setUp(self): + super().setUp() + + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + ga_tenant = Tenant.objects.create(name="G&A") + self.diffsync.tenant_map = {"G&A": ga_tenant.id} + loc_type = LocationType.objects.get(name="Site") + self.diffsync.locationtype_map = {"Site": loc_type.id, "Floor": LocationType.objects.get(name="Floor").id} + self.hq_site, _ = Location.objects.get_or_create( + name="HQ", location_type=loc_type, status=Status.objects.get(name="Active") + ) + self.diffsync.site_map = {"HQ": self.hq_site.id} + self.diffsync.floor_map = {} + self.diffsync.status_map = {"Active": Status.objects.get(name="Active").id} + + def test_create(self): + """Test the NautobotFloor create() method creates a LocationType: Floor.""" + ids = {"name": "HQ - Floor 1", "building": "HQ"} + attrs = {"tenant": "G&A"} + result = NautobotFloor.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, NautobotFloor) + self.diffsync.job.logger.info.assert_called_with("Creating Floor HQ - Floor 1.") + floor_obj = Location.objects.get(name=ids["name"], location_type__name="Floor") + self.assertEqual(floor_obj.name, ids["name"]) + self.assertEqual(floor_obj.parent.name, self.hq_site.name) + self.assertEqual(floor_obj.tenant.name, attrs["tenant"]) + + def test_update_w_tenant(self): + """Test the NautobotFloor update() method updates a LocationType: Floor with tenant.""" + floor_type = LocationType.objects.get(name="Floor") + mock_floor = Location.objects.create( + name="HQ - Floor 2", + location_type=floor_type, + parent=self.hq_site, + status=Status.objects.get(name="Active"), + ) + mock_floor.validated_save() + test_floor = NautobotFloor(name="HQ - Floor 2", building="HQ", tenant="", uuid=mock_floor.id) + test_floor.diffsync = self.diffsync + update_attrs = { + "tenant": "G&A", + } + actual = NautobotFloor.update(self=test_floor, attrs=update_attrs) + test_floor.diffsync.job.logger.info.assert_called_once_with( + "Updating Floor HQ - Floor 2 with {'tenant': 'G&A'}" + ) + mock_floor.refresh_from_db() + self.assertEqual(mock_floor.tenant.name, update_attrs["tenant"]) + self.assertEqual(actual, test_floor) + + def test_update_wo_tenant(self): + """Test the NautobotFloor update() method updates a LocationType: Floor without tenant.""" + # I hate having to duplicate with above method but we can't have in setUp and test for ContentTypes. + floor_type, _ = LocationType.objects.get_or_create(name="Floor") + mock_floor = Location.objects.create( + name="HQ - Floor 2", + location_type=floor_type, + parent=self.hq_site, + status=Status.objects.get(name="Active"), + ) + mock_floor.validated_save() + test_floor = NautobotFloor(name="HQ - Floor 2", building="HQ", tenant="", uuid=mock_floor.id) + test_floor.diffsync = MagicMock() + test_floor.diffsync.job.logger.info = MagicMock() + update_attrs = { + "tenant": None, + } + NautobotFloor.update(self=test_floor, attrs=update_attrs) + test_floor.diffsync.job.logger.info.assert_called_once_with("Updating Floor HQ - Floor 2 with {'tenant': None}") + mock_floor.refresh_from_db() + self.assertIsNone(mock_floor.tenant) + + def test_delete(self): + """Validate the NautobotFloor delete() method deletes a LocationType: Floor.""" + ds_mock_floor = MagicMock(spec=Location) + ds_mock_floor.uuid = "1234567890" + ds_mock_floor.diffsync = MagicMock() + ds_mock_floor.diffsync.job.logger.info = MagicMock() + mock_floor = MagicMock(spec=Location) + mock_floor.name = "Test" + mock_floor.parent.name = "HQ" + floor_get_mock = MagicMock(return_value=mock_floor) + with patch.object(Location.objects, "get", floor_get_mock): + result = NautobotFloor.delete(ds_mock_floor) + ds_mock_floor.diffsync.job.logger.info.assert_called_once_with("Deleting Floor Test in HQ.") + self.assertEqual(ds_mock_floor, result) + + +class TestNautobotDevice(TransactionTestCase): + """Test NautobotDevice class.""" + + def setUp(self): + super().setUp() + + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.ga_tenant = Tenant.objects.create(name="G&A") + self.diffsync.tenant_map = {"G&A": self.ga_tenant.id} + + self.status_active = Status.objects.get(name="Active") + self.diffsync.status_map = {"Active": self.status_active.id} + self.ids = { + "name": "core-router.testexample.com", + } + self.attrs = { + "floor": "HQ - Floor 1", + "management_addr": "10.10.0.1", + "model": "Nexus 9300", + "platform": "cisco_ios", + "role": "core", + "site": "HQ", + "serial": "1234567890", + "status": "Active", + "tenant": "G&A", + "vendor": "Cisco", + "version": "16.12.3", + } + self.diffsync.site_map = {} + self.diffsync.floor_map = {} + self.diffsync.device_map = {} + self.diffsync.objects_to_create = {"devices": []} # pylint: disable=no-member + + @patch("nautobot_ssot_dna_center.diffsync.models.nautobot.LIFECYCLE_MGMT", True) + def test_create(self): + """Test the NautobotDevice create() method creates a Device.""" + hq_site = Location.objects.create( + name="HQ", status=self.status_active, location_type=LocationType.objects.get(name="Site") + ) + hq_floor = Location.objects.create( + name="HQ - Floor 1", status=self.status_active, location_type=LocationType.objects.get(name="Floor") + ) + self.diffsync.site_map = {"HQ": hq_site.id} + self.diffsync.floor_map = {"HQ - Floor 1": hq_floor.id} + + NautobotDevice.create(self.diffsync, self.ids, self.attrs) + self.diffsync.job.logger.info.assert_called_with("Creating Version 16.12.3 for cisco_ios.") + new_dev = self.diffsync.objects_to_create["devices"][0] + self.assertEqual(new_dev.role, Role.objects.get(name=self.attrs["role"])) + self.assertEqual( + new_dev.device_type, + DeviceType.objects.get( + model=self.attrs["model"], manufacturer=Manufacturer.objects.get(name=self.attrs["vendor"]) + ), + ) + self.assertEqual(new_dev.platform.network_driver, self.attrs["platform"]) + self.assertEqual(new_dev.serial, self.attrs["serial"]) + self.assertTrue(new_dev.location_id) + self.assertEqual(new_dev.location_id, hq_floor.id) + self.assertEqual(new_dev.tenant_id, self.ga_tenant.id) + self.assertTrue(new_dev.custom_field_data["os_version"], self.attrs["version"]) diff --git a/nautobot_ssot/tests/dna_center/tests/test_utils_dna_center.py b/nautobot_ssot/tests/dna_center/tests/test_utils_dna_center.py new file mode 100644 index 000000000..e04385a1a --- /dev/null +++ b/nautobot_ssot/tests/dna_center/tests/test_utils_dna_center.py @@ -0,0 +1,226 @@ +"""Tests of DNA Center utility methods.""" + +from unittest.mock import MagicMock, patch, create_autospec +from requests import Response +from parameterized import parameterized +from nautobot.core.testing import TestCase +from dnacentersdk.exceptions import dnacentersdkException +from nautobot_ssot_dna_center.tests.fixtures import ( + DEVICE_DETAIL_FIXTURE, + DEVICE_FIXTURE, + LOCATION_FIXTURE, + PORT_FIXTURE, + RECV_DEVICE_DETAIL_FIXTURE, + RECV_DEVICE_FIXTURE, + RECV_LOCATION_FIXTURE, + RECV_PORT_FIXTURE, +) +from nautobot_ssot_dna_center.utils.dna_center import DnaCenterClient + + +class TestDnaCenterClient(TestCase): # pylint: disable=too-many-public-methods + """Test DNA Center Client and Calls.""" + + databases = ("default", "job_logs") + + def setUp(self): + """Setup DNAC instance.""" + self.url = "https://dnac.testexample.com" + self.username = "testuser" + self.password = "testpassword" # nosec B105 + self.verify = False + self.dnac = DnaCenterClient(self.url, self.username, self.password, verify=self.verify) + self.dnac.conn = MagicMock() + self.dnac.conn.sites.get_site_count.return_value = {"response": 4} + self.dnac.conn.devices.get_device_count.return_value = {"response": 3} + + self.mock_response = create_autospec(Response) + self.mock_response.message = MagicMock() + self.mock_response.response = MagicMock() + self.mock_response.response.request = MagicMock() + self.mock_response.status_code = MagicMock() + self.mock_response.message.return_value = "Unable to connect to DNA Center!" + self.mock_response.response.return_value = {} + self.mock_response.status_code.return_value = 401 + + @patch("nautobot_ssot_dna_center.utils.dna_center.api.DNACenterAPI") + def test_connect_success(self, mock_api): + self.dnac.connect() + mock_api.assert_called_once_with( # nosec B106 + base_url="https://dnac.testexample.com:443", username="testuser", password="testpassword", verify=False + ) + self.assertIsNotNone(self.dnac.conn) + + @patch("nautobot_ssot_dna_center.utils.dna_center.api.DNACenterAPI") + def test_connect_error(self, mock_api): + self.dnac.conn = None + mock_api.side_effect = dnacentersdkException(self.mock_response) + with self.assertRaises(dnacentersdkException): + self.dnac.connect() + mock_api.assert_called_once_with( # nosec B106 + base_url="https://dnac.testexample.com:443", password="testpassword", username="testuser", verify=False + ) + self.assertIsNone(self.dnac.conn) + + def test_get_locations(self): + """Test the get_locations method in DnaCenterClient.""" + self.dnac.conn.sites.get_site.return_value = RECV_LOCATION_FIXTURE + actual = self.dnac.get_locations() + self.assertEqual(actual, LOCATION_FIXTURE) + + def test_get_locations_catches_api_error(self): + """Test the get_locations method in DnaCenterClient catches dnacentersdkException.""" + self.dnac.conn.sites.get_site.side_effect = dnacentersdkException(self.mock_response) + with self.assertLogs(level="ERROR") as log: + self.dnac.get_locations() + self.assertIn("Unable to get site information from DNA Center.", log.output[0]) + + def test_find_address_and_type(self): + """Test the find_address_and_type method in DnaCenterClient.""" + mock_info = [ + { + "attributes": { + "address": "123 Main St, New York, NY 12345", + "country": "United States", + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + "type": "building", + }, + "nameSpace": "Location", + } + ] + actual = self.dnac.find_address_and_type(info=mock_info) + expected = ("123 Main St, New York, NY 12345", "building") + self.assertEqual(actual, expected) + + def test_find_latitude_and_longitude(self): + """Test the find_latitude_and_longitude method in DnaCenterClient.""" + mock_info = [ + { + "attributes": { + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + }, + "nameSpace": "Location", + } + ] + actual = self.dnac.find_latitude_and_longitude(info=mock_info) + expected = ("38.581405819248886", "-121.49309067224416") + self.assertEqual(actual, expected) + + def test_get_devices(self): + """Test the get_devices method in DnaCenterClient.""" + self.dnac.conn.devices.get_device_list.return_value = RECV_DEVICE_FIXTURE + actual = self.dnac.get_devices() + self.assertEqual(actual, DEVICE_FIXTURE) + + def test_get_devices_catches_api_error(self): + """Test the get_devices method in DnaCenterClient catches dnacentersdkException.""" + self.dnac.conn.devices.get_device_list.side_effect = dnacentersdkException(self.mock_response) + with self.assertLogs(level="ERROR") as log: + self.dnac.get_devices() + self.assertIn("Unable to get device information from DNA Center.", log.output[0]) + + def test_get_device_detail(self): + """Test the get_device_detail method in DnaCenterClient.""" + self.dnac.conn.devices.get_device_detail.return_value = RECV_DEVICE_DETAIL_FIXTURE + actual = self.dnac.get_device_detail(dev_id="1234567890") + self.assertEqual(actual, DEVICE_DETAIL_FIXTURE) + + def test_get_device_detail_catches_api_error(self): + """Test the get_device_detail method in DnaCenterClient catches dnacentersdkException.""" + self.dnac.conn.devices.get_device_detail.side_effect = dnacentersdkException(self.mock_response) + with self.assertLogs(level="ERROR") as log: + self.dnac.get_device_detail(dev_id="1234567890") + self.assertIn("Unable to get device detail information from DNA Center.", log.output[0]) + + def test_parse_site_hierarchy(self): + """Test the parse_site_hierarchy method in DnaCenterClient.""" + mock_location_map = { + "1": { + "loc_type": "area", + "name": "Global", + }, + "2": { + "loc_type": "area", + "name": "NY", + }, + "3": { + "loc_type": "building", + "name": "Building1", + }, + "4": {"loc_type": "floor", "name": "Floor1"}, + } + actual = self.dnac.parse_site_hierarchy(location_map=mock_location_map, site_hier="1/2/3/4") + expected = { + "areas": ["Global", "NY"], + "building": "Building1", + "floor": "Floor1", + } + self.assertEqual(actual, expected) + + def test_get_port_info(self): + """Test the get_port_info method in DnaCenterClient.""" + self.dnac.conn.devices.get_interface_info_by_id.return_value = RECV_PORT_FIXTURE + actual = self.dnac.get_port_info(device_id="1234567890") + self.assertEqual(actual, PORT_FIXTURE) + + def test_get_port_info_catches_api_error(self): + """Test the get_port_info method in DnaCenterClient catches dnacentersdkException.""" + self.dnac.conn.devices.get_interface_info_by_id.side_effect = dnacentersdkException(self.mock_response) + with self.assertLogs(level="ERROR") as log: + self.dnac.get_port_info(device_id="1234567890") + self.assertIn("Unable to get port information from DNA Center.", log.output[0]) + + mock_port_types = [ + ("SVI", {"portType": "Ethernet SVI"}, "virtual"), + ("Service Module Interface", {"portType": "Service Module Interface"}, "virtual"), + ("FastEthernet", {"portType": "Ethernet Port", "portName": "FastEth0"}, "100base-tx"), + ("GigabitEthernet", {"portType": "Ethernet Port", "portName": "GigabitEthernet0/1"}, "1000base-t"), + ("Number port", {"portType": "Ethernet Port", "portName": "0/1"}, "other"), + ] + + @parameterized.expand(mock_port_types, skip_on_empty=True) + def test_get_port_type(self, name, sent, received): # pylint: disable=unused-argument + """Test the get_port_type method in DnaCenterClient.""" + actual = self.dnac.get_port_type(port_info=sent) + self.assertEqual(actual, received) + + mock_port_status = [ + ("Maintenance", {"adminStatus": "DOWN", "status": "down"}, "Maintenance"), + ("Failed", {"adminStatus": "UP", "status": "down"}, "Failed"), + ("Planned", {"adminStatus": "DOWN", "status": "up"}, "Planned"), + ("Active", {"adminStatus": "UP", "status": "up"}, "Active"), + ] + + @parameterized.expand(mock_port_status, skip_on_empty=True) + def test_get_port_status(self, name, sent, received): # pylint: disable=unused-argument + """Test the get_port_status method in DnaCenterClient.""" + actual = self.dnac.get_port_status(port_info=sent) + self.assertEqual(actual, received) + + def test_parse_hostname_for_role_success(self): + """Validate the functionality of the parse_hostname_for_role method success.""" + hostname_mapping = [(".*EDGE.*", "Edge"), (".*DMZ.*", "DMZ")] + hostname = "DMZ-switch.example.com" + result = self.dnac.parse_hostname_for_role(hostname_map=hostname_mapping, device_hostname=hostname) + self.assertEqual(result, "DMZ") + + def test_parse_hostname_for_role_failure(self): + """Validate the functionality of the parse_hostname_for_role method failure.""" + hostname_mapping = [] + hostname = "core-router.example.com" + result = self.dnac.parse_hostname_for_role(hostname_map=hostname_mapping, device_hostname=hostname) + self.assertEqual(result, "Unknown") + + def test_get_model_name_single_model(self): + """Validate the functionality of get_model_name method with single model in string.""" + test_model = "CSR1000v" + result = self.dnac.get_model_name(models=test_model) + self.assertEqual(result, "CSR1000v") + + def test_get_model_name_multiple_models(self): + """Validate the functionality of get_model_name method with multiple models in string.""" + test_models = "CSR1000v, CSR1000v, CSR1000v" + result = self.dnac.get_model_name(models=test_models) + self.assertEqual(result, "CSR1000v") From 26c6d9a3f26c38c94b338aed9f096db7811e3c86 Mon Sep 17 00:00:00 2001 From: Justin Drew <2396364+jdrew82@users.noreply.github.com> Date: Thu, 2 May 2024 17:06:57 -0500 Subject: [PATCH 61/65] =?UTF-8?q?feat:=20=E2=9C=A8=20Add=20original=20proj?= =?UTF-8?q?ect=20name=20to=20conflicting=20apps=20list.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nautobot_ssot/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nautobot_ssot/__init__.py b/nautobot_ssot/__init__.py index 7f9afbb22..1494f8f78 100644 --- a/nautobot_ssot/__init__.py +++ b/nautobot_ssot/__init__.py @@ -17,6 +17,7 @@ "nautobot_ssot_aci", "nautobot_ssot_aristacv", "nautobot_ssot_device42", + "nautobot_ssot_dna_center", "nautobot_ssot_infoblox", "nautobot_ssot_ipfabric", "nautobot_ssot_servicenow", From a0f3ef1ed574b2485e6dcf60464daa964aeff56e Mon Sep 17 00:00:00 2001 From: Justin Drew <2396364+jdrew82@users.noreply.github.com> Date: Thu, 2 May 2024 19:04:35 -0500 Subject: [PATCH 62/65] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Correct=20tests=20f?= =?UTF-8?q?older=20for=20dna=5Fcenter=20and=20correct=20imports=20for=20ne?= =?UTF-8?q?w=20folder=20structure/file=20locations.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/dna_center/{tests => }/__init__.py | 0 .../tests/dna_center/{tests => }/fixtures.py | 0 .../{tests => }/fixtures/expected_areas.json | 0 .../fixtures/expected_areas_wo_global.json | 0 .../fixtures/expected_buildings.json | 0 .../fixtures/expected_dnac_location_map.json | 0 .../expected_dnac_location_map_wo_global.json | 0 .../{tests => }/fixtures/expected_floors.json | 0 .../{tests => }/fixtures/get_device_detail.json | 0 .../fixtures/get_device_detail_recv.json | 0 .../{tests => }/fixtures/get_devices.json | 0 .../{tests => }/fixtures/get_devices_recv.json | 0 .../{tests => }/fixtures/get_locations.json | 0 .../fixtures/get_locations_recv.json | 0 .../{tests => }/fixtures/get_port_info.json | 0 .../fixtures/get_port_info_recv.json | 0 .../{tests => }/test_adapters_dna_center.py | 6 +++--- .../{tests => }/test_adapters_nautobot.py | 4 ++-- .../tests/dna_center/{tests => }/test_jobs.py | 2 +- .../{tests => }/test_models_nautobot.py | 2 +- .../{tests => }/test_utils_dna_center.py | 4 ++-- .../tests/dna_center/tests/test_basic.py | 17 ----------------- 22 files changed, 9 insertions(+), 26 deletions(-) rename nautobot_ssot/tests/dna_center/{tests => }/__init__.py (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures.py (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/expected_areas.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/expected_areas_wo_global.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/expected_buildings.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/expected_dnac_location_map.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/expected_dnac_location_map_wo_global.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/expected_floors.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/get_device_detail.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/get_device_detail_recv.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/get_devices.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/get_devices_recv.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/get_locations.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/get_locations_recv.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/get_port_info.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/fixtures/get_port_info_recv.json (100%) rename nautobot_ssot/tests/dna_center/{tests => }/test_adapters_dna_center.py (98%) rename nautobot_ssot/tests/dna_center/{tests => }/test_adapters_nautobot.py (98%) rename nautobot_ssot/tests/dna_center/{tests => }/test_jobs.py (97%) rename nautobot_ssot/tests/dna_center/{tests => }/test_models_nautobot.py (99%) rename nautobot_ssot/tests/dna_center/{tests => }/test_utils_dna_center.py (98%) delete mode 100644 nautobot_ssot/tests/dna_center/tests/test_basic.py diff --git a/nautobot_ssot/tests/dna_center/tests/__init__.py b/nautobot_ssot/tests/dna_center/__init__.py similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/__init__.py rename to nautobot_ssot/tests/dna_center/__init__.py diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures.py b/nautobot_ssot/tests/dna_center/fixtures.py similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures.py rename to nautobot_ssot/tests/dna_center/fixtures.py diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas.json b/nautobot_ssot/tests/dna_center/fixtures/expected_areas.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas.json rename to nautobot_ssot/tests/dna_center/fixtures/expected_areas.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas_wo_global.json b/nautobot_ssot/tests/dna_center/fixtures/expected_areas_wo_global.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/expected_areas_wo_global.json rename to nautobot_ssot/tests/dna_center/fixtures/expected_areas_wo_global.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_buildings.json b/nautobot_ssot/tests/dna_center/fixtures/expected_buildings.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/expected_buildings.json rename to nautobot_ssot/tests/dna_center/fixtures/expected_buildings.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map.json b/nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map.json rename to nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map_wo_global.json b/nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map_wo_global.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/expected_dnac_location_map_wo_global.json rename to nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map_wo_global.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/expected_floors.json b/nautobot_ssot/tests/dna_center/fixtures/expected_floors.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/expected_floors.json rename to nautobot_ssot/tests/dna_center/fixtures/expected_floors.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail.json b/nautobot_ssot/tests/dna_center/fixtures/get_device_detail.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail.json rename to nautobot_ssot/tests/dna_center/fixtures/get_device_detail.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail_recv.json b/nautobot_ssot/tests/dna_center/fixtures/get_device_detail_recv.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/get_device_detail_recv.json rename to nautobot_ssot/tests/dna_center/fixtures/get_device_detail_recv.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_devices.json b/nautobot_ssot/tests/dna_center/fixtures/get_devices.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/get_devices.json rename to nautobot_ssot/tests/dna_center/fixtures/get_devices.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_devices_recv.json b/nautobot_ssot/tests/dna_center/fixtures/get_devices_recv.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/get_devices_recv.json rename to nautobot_ssot/tests/dna_center/fixtures/get_devices_recv.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_locations.json b/nautobot_ssot/tests/dna_center/fixtures/get_locations.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/get_locations.json rename to nautobot_ssot/tests/dna_center/fixtures/get_locations.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_locations_recv.json b/nautobot_ssot/tests/dna_center/fixtures/get_locations_recv.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/get_locations_recv.json rename to nautobot_ssot/tests/dna_center/fixtures/get_locations_recv.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info.json b/nautobot_ssot/tests/dna_center/fixtures/get_port_info.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info.json rename to nautobot_ssot/tests/dna_center/fixtures/get_port_info.json diff --git a/nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info_recv.json b/nautobot_ssot/tests/dna_center/fixtures/get_port_info_recv.json similarity index 100% rename from nautobot_ssot/tests/dna_center/tests/fixtures/get_port_info_recv.json rename to nautobot_ssot/tests/dna_center/fixtures/get_port_info_recv.json diff --git a/nautobot_ssot/tests/dna_center/tests/test_adapters_dna_center.py b/nautobot_ssot/tests/dna_center/test_adapters_dna_center.py similarity index 98% rename from nautobot_ssot/tests/dna_center/tests/test_adapters_dna_center.py rename to nautobot_ssot/tests/dna_center/test_adapters_dna_center.py index 2b18d8e35..c7e805066 100644 --- a/nautobot_ssot/tests/dna_center/tests/test_adapters_dna_center.py +++ b/nautobot_ssot/tests/dna_center/test_adapters_dna_center.py @@ -10,8 +10,8 @@ from nautobot.extras.models import CustomField, JobResult, Status, Role from nautobot.ipam.models import IPAddress, IPAddressToInterface, Prefix, Namespace from nautobot.core.testing import TransactionTestCase -from nautobot_ssot_dna_center.diffsync.adapters.dna_center import DnaCenterAdapter -from nautobot_ssot_dna_center.tests.fixtures import ( +from nautobot_ssot.integrations.dna_center.diffsync.adapters.dna_center import DnaCenterAdapter +from nautobot_ssot.tests.dna_center.fixtures import ( LOCATION_FIXTURE, EXPECTED_DNAC_LOCATION_MAP, EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL, @@ -23,7 +23,7 @@ EXPECTED_BUILDINGS, EXPECTED_FLOORS, ) -from nautobot_ssot_dna_center.jobs import DnaCenterDataSource +from nautobot_ssot.integrations.dna_center.jobs import DnaCenterDataSource @override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": True}}) diff --git a/nautobot_ssot/tests/dna_center/tests/test_adapters_nautobot.py b/nautobot_ssot/tests/dna_center/test_adapters_nautobot.py similarity index 98% rename from nautobot_ssot/tests/dna_center/tests/test_adapters_nautobot.py rename to nautobot_ssot/tests/dna_center/test_adapters_nautobot.py index 356b3c3fd..f2675780d 100644 --- a/nautobot_ssot/tests/dna_center/tests/test_adapters_nautobot.py +++ b/nautobot_ssot/tests/dna_center/test_adapters_nautobot.py @@ -16,8 +16,8 @@ from nautobot.extras.models import Status, JobResult, Role from nautobot.ipam.models import IPAddress, Namespace, Prefix, IPAddressToInterface from nautobot.core.testing import TransactionTestCase -from nautobot_ssot_dna_center.jobs import DnaCenterDataSource -from nautobot_ssot_dna_center.diffsync.adapters.nautobot import NautobotAdapter +from nautobot_ssot.integrations.dna_center.jobs import DnaCenterDataSource +from nautobot_ssot.integrations.dna_center.diffsync.adapters.nautobot import NautobotAdapter class NautobotDiffSyncTestCase(TransactionTestCase): diff --git a/nautobot_ssot/tests/dna_center/tests/test_jobs.py b/nautobot_ssot/tests/dna_center/test_jobs.py similarity index 97% rename from nautobot_ssot/tests/dna_center/tests/test_jobs.py rename to nautobot_ssot/tests/dna_center/test_jobs.py index 54cdc1abd..1c1e45f80 100644 --- a/nautobot_ssot/tests/dna_center/tests/test_jobs.py +++ b/nautobot_ssot/tests/dna_center/test_jobs.py @@ -3,7 +3,7 @@ from django.test import TestCase from django.urls import reverse -from nautobot_ssot_dna_center import jobs +from nautobot_ssot.integrations.dna_center import jobs class DnaCenterDataSourceJobTest(TestCase): diff --git a/nautobot_ssot/tests/dna_center/tests/test_models_nautobot.py b/nautobot_ssot/tests/dna_center/test_models_nautobot.py similarity index 99% rename from nautobot_ssot/tests/dna_center/tests/test_models_nautobot.py rename to nautobot_ssot/tests/dna_center/test_models_nautobot.py index ddc13d361..33dc86a93 100644 --- a/nautobot_ssot/tests/dna_center/tests/test_models_nautobot.py +++ b/nautobot_ssot/tests/dna_center/test_models_nautobot.py @@ -11,7 +11,7 @@ from nautobot.extras.models import Status, Role from nautobot.tenancy.models import Tenant from nautobot.core.testing import TransactionTestCase -from nautobot_ssot_dna_center.diffsync.models.nautobot import ( +from nautobot_ssot.integrations.dna_center.diffsync.models.nautobot import ( NautobotArea, NautobotBuilding, NautobotFloor, diff --git a/nautobot_ssot/tests/dna_center/tests/test_utils_dna_center.py b/nautobot_ssot/tests/dna_center/test_utils_dna_center.py similarity index 98% rename from nautobot_ssot/tests/dna_center/tests/test_utils_dna_center.py rename to nautobot_ssot/tests/dna_center/test_utils_dna_center.py index e04385a1a..795a8158f 100644 --- a/nautobot_ssot/tests/dna_center/tests/test_utils_dna_center.py +++ b/nautobot_ssot/tests/dna_center/test_utils_dna_center.py @@ -5,7 +5,7 @@ from parameterized import parameterized from nautobot.core.testing import TestCase from dnacentersdk.exceptions import dnacentersdkException -from nautobot_ssot_dna_center.tests.fixtures import ( +from nautobot_ssot.tests.dna_center.fixtures import ( DEVICE_DETAIL_FIXTURE, DEVICE_FIXTURE, LOCATION_FIXTURE, @@ -15,7 +15,7 @@ RECV_LOCATION_FIXTURE, RECV_PORT_FIXTURE, ) -from nautobot_ssot_dna_center.utils.dna_center import DnaCenterClient +from nautobot_ssot.integrations.dna_center.utils.dna_center import DnaCenterClient class TestDnaCenterClient(TestCase): # pylint: disable=too-many-public-methods diff --git a/nautobot_ssot/tests/dna_center/tests/test_basic.py b/nautobot_ssot/tests/dna_center/tests/test_basic.py deleted file mode 100644 index b306ae8c8..000000000 --- a/nautobot_ssot/tests/dna_center/tests/test_basic.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Basic tests that do not require Django.""" - -import unittest -import os -import toml - -from nautobot_ssot_dna_center import __version__ as project_version - - -class TestVersion(unittest.TestCase): - """Test Version is the same.""" - - def test_version(self): - """Verify that pyproject.toml version is same as version specified in the package.""" - parent_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) - poetry_version = toml.load(os.path.join(parent_path, "pyproject.toml"))["tool"]["poetry"]["version"] - self.assertEqual(project_version, poetry_version) From 47b6db36e4bbfcebe200f029128bc8f053b37367 Mon Sep 17 00:00:00 2001 From: Justin Drew <2396364+jdrew82@users.noreply.github.com> Date: Thu, 2 May 2024 19:05:05 -0500 Subject: [PATCH 63/65] =?UTF-8?q?build:=20=E2=9E=95=20Add=20dnacentersdk?= =?UTF-8?q?=20dependency=20for=20DNA=20Center=20integration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 609 ++++++++++++++++++++++++------------------------- pyproject.toml | 5 + 2 files changed, 309 insertions(+), 305 deletions(-) diff --git a/poetry.lock b/poetry.lock index e0d827150..072b637b2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -397,33 +397,33 @@ files = [ [[package]] name = "black" -version = "24.4.0" +version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436"}, - {file = "black-24.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf"}, - {file = "black-24.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad"}, - {file = "black-24.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb"}, - {file = "black-24.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8"}, - {file = "black-24.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745"}, - {file = "black-24.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070"}, - {file = "black-24.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397"}, - {file = "black-24.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2"}, - {file = "black-24.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33"}, - {file = "black-24.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965"}, - {file = "black-24.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd"}, - {file = "black-24.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1"}, - {file = "black-24.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8"}, - {file = "black-24.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d"}, - {file = "black-24.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3"}, - {file = "black-24.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665"}, - {file = "black-24.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6"}, - {file = "black-24.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e"}, - {file = "black-24.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702"}, - {file = "black-24.4.0-py3-none-any.whl", hash = "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e"}, - {file = "black-24.4.0.tar.gz", hash = "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641"}, + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] @@ -753,28 +753,28 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] [[package]] name = "cloudvision" -version = "1.19.1" +version = "1.20.0" description = "A Python library for Arista's CloudVision APIs and Provisioning Action integrations." optional = true python-versions = ">=3.7.0" files = [ - {file = "cloudvision-1.19.1-py3-none-any.whl", hash = "sha256:76249cd7054f515f0e20084489beecccfa83d48563b5db11a6f2493ed6e54a52"}, - {file = "cloudvision-1.19.1.tar.gz", hash = "sha256:f865cc7a5e324fbd6259454f5e2b056c381566349e797e0ddce2131b52d971e1"}, + {file = "cloudvision-1.20.0-py3-none-any.whl", hash = "sha256:ccdc8116184d808226a1cbb8c678a6e4f338d67537d469c41231e37cb31aa00f"}, + {file = "cloudvision-1.20.0.tar.gz", hash = "sha256:33760b93aa1d4267acd195432cbb5b6228e6c00d965b9127d6d7ec276c70badf"}, ] [package.dependencies] cryptography = ">=42.0.4,<43.0.0" -grpcio = ">=1.46.0" +grpcio = ">=1.53.0" msgpack = ">=1.0.3" -protobuf = ">=3.20.1,<4.0" +protobuf = ">=4.22.5,<5.0" requests = ">=2.20.1" -types-protobuf = ">=3.20.1,<4.0" +types-protobuf = ">=3.20.4.6,<4.0" types-PyYAML = ">=6.0.7" types-requests = ">=2.27.25" typing-extensions = ">=4.2.0" [package.extras] -dev = ["black (==24.3.0)", "flake8 (==3.8.4)", "grpcio-tools (==1.46.0)", "isort (==5.11.4)", "mypy (==0.950)", "mypy-protobuf (==3.2.0)", "numpy (==1.26.4)", "pytest (==7.1.2)", "pyyaml (==6.0.1)", "twine (==4.0.1)", "types-attrs (>=19.1.0)", "wheel (==0.38.4)"] +dev = ["black (==24.3.0)", "flake8 (==3.8.4)", "grpcio-tools (>=1.53.2)", "isort (==5.11.4)", "mypy (==0.950)", "mypy-protobuf (==3.2.0)", "numpy (==1.26.4)", "pytest (==7.1.2)", "pyyaml (==6.0.1)", "twine (==4.0.1)", "types-attrs (>=19.1.0)", "wheel (==0.38.4)"] [[package]] name = "colorama" @@ -874,63 +874,63 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" -version = "7.4.4" +version = "7.5.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, - {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, - {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, - {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, - {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, - {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, - {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, - {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, - {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, - {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, - {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, - {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, - {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, - {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, + {file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, + {file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, + {file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, + {file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, + {file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, + {file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, + {file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, + {file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, + {file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, + {file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, + {file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, + {file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, + {file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, + {file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, + {file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, + {file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, + {file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, + {file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, + {file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, + {file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, + {file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, + {file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, ] [package.extras] @@ -1462,6 +1462,23 @@ files = [ "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} django = ">=3.0" +[[package]] +name = "dnacentersdk" +version = "2.6.11" +description = "Cisco DNA Center Platform SDK" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "dnacentersdk-2.6.11-py3-none-any.whl", hash = "sha256:b66cee835cb804047a31faee372be219711f784216a977bec0d5e7d80b78e516"}, + {file = "dnacentersdk-2.6.11.tar.gz", hash = "sha256:81ca926e3fab1c7c0a721a87c2480cdf5b7a48da0bc1b7dc3829f89b9cef659a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.16.2,<3.0.0" +future = ">=0.18.3,<0.19.0" +requests = ">=2.27.1,<=2.40.0" +requests-toolbelt = ">=1.0.0,<2.0.0" + [[package]] name = "dnspython" version = "2.6.1" @@ -1533,13 +1550,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2024.4.1" +version = "2024.5.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf-spectacular-sidecar-2024.4.1.tar.gz", hash = "sha256:68532dd094714f79c1775c00848f22c10f004826abc856442ff30c3bc9c40bb4"}, - {file = "drf_spectacular_sidecar-2024.4.1-py3-none-any.whl", hash = "sha256:8359befe69a8953fea86be01c1ff37038854a62546225551de16c47c07dccd4e"}, + {file = "drf_spectacular_sidecar-2024.5.1-py3-none-any.whl", hash = "sha256:089fdef46b520b7b1c8a497a398cde9336c3f20b115835baeb158dc4138d743d"}, + {file = "drf_spectacular_sidecar-2024.5.1.tar.gz", hash = "sha256:1ecfbe86174461e3cf78a9cd49f69aa8d9e0710cb5e8b35107d3f8cc0f380c21"}, ] [package.dependencies] @@ -1587,6 +1604,20 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +[[package]] +name = "fastjsonschema" +version = "2.19.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] name = "flake8" version = "5.0.4" @@ -1756,13 +1787,12 @@ files = [ [[package]] name = "future" -version = "1.0.0" +version = "0.18.3" description = "Clean single-source support for Python 3 and 2" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, - {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, + {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, ] [[package]] @@ -1934,69 +1964,61 @@ colorama = ">=0.4" [[package]] name = "grpcio" -version = "1.62.2" +version = "1.63.0" description = "HTTP/2-based RPC framework" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "grpcio-1.62.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:66344ea741124c38588a664237ac2fa16dfd226964cca23ddc96bd4accccbde5"}, - {file = "grpcio-1.62.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5dab7ac2c1e7cb6179c6bfad6b63174851102cbe0682294e6b1d6f0981ad7138"}, - {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:3ad00f3f0718894749d5a8bb0fa125a7980a2f49523731a9b1fabf2b3522aa43"}, - {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e72ddfee62430ea80133d2cbe788e0d06b12f865765cb24a40009668bd8ea05"}, - {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53d3a59a10af4c2558a8e563aed9f256259d2992ae0d3037817b2155f0341de1"}, - {file = "grpcio-1.62.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1511a303f8074f67af4119275b4f954189e8313541da7b88b1b3a71425cdb10"}, - {file = "grpcio-1.62.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b94d41b7412ef149743fbc3178e59d95228a7064c5ab4760ae82b562bdffb199"}, - {file = "grpcio-1.62.2-cp310-cp310-win32.whl", hash = "sha256:a75af2fc7cb1fe25785be7bed1ab18cef959a376cdae7c6870184307614caa3f"}, - {file = "grpcio-1.62.2-cp310-cp310-win_amd64.whl", hash = "sha256:80407bc007754f108dc2061e37480238b0dc1952c855e86a4fc283501ee6bb5d"}, - {file = "grpcio-1.62.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c1624aa686d4b36790ed1c2e2306cc3498778dffaf7b8dd47066cf819028c3ad"}, - {file = "grpcio-1.62.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:1c1bb80299bdef33309dff03932264636450c8fdb142ea39f47e06a7153d3063"}, - {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:db068bbc9b1fa16479a82e1ecf172a93874540cb84be69f0b9cb9b7ac3c82670"}, - {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2cc8a308780edbe2c4913d6a49dbdb5befacdf72d489a368566be44cadaef1a"}, - {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0695ae31a89f1a8fc8256050329a91a9995b549a88619263a594ca31b76d756"}, - {file = "grpcio-1.62.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88b4f9ee77191dcdd8810241e89340a12cbe050be3e0d5f2f091c15571cd3930"}, - {file = "grpcio-1.62.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a0204532aa2f1afd467024b02b4069246320405bc18abec7babab03e2644e75"}, - {file = "grpcio-1.62.2-cp311-cp311-win32.whl", hash = "sha256:6e784f60e575a0de554ef9251cbc2ceb8790914fe324f11e28450047f264ee6f"}, - {file = "grpcio-1.62.2-cp311-cp311-win_amd64.whl", hash = "sha256:112eaa7865dd9e6d7c0556c8b04ae3c3a2dc35d62ad3373ab7f6a562d8199200"}, - {file = "grpcio-1.62.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:65034473fc09628a02fb85f26e73885cf1ed39ebd9cf270247b38689ff5942c5"}, - {file = "grpcio-1.62.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d2c1771d0ee3cf72d69bb5e82c6a82f27fbd504c8c782575eddb7839729fbaad"}, - {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:3abe6838196da518863b5d549938ce3159d809218936851b395b09cad9b5d64a"}, - {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5ffeb269f10cedb4f33142b89a061acda9f672fd1357331dbfd043422c94e9e"}, - {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404d3b4b6b142b99ba1cff0b2177d26b623101ea2ce51c25ef6e53d9d0d87bcc"}, - {file = "grpcio-1.62.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:262cda97efdabb20853d3b5a4c546a535347c14b64c017f628ca0cc7fa780cc6"}, - {file = "grpcio-1.62.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17708db5b11b966373e21519c4c73e5a750555f02fde82276ea2a267077c68ad"}, - {file = "grpcio-1.62.2-cp312-cp312-win32.whl", hash = "sha256:b7ec9e2f8ffc8436f6b642a10019fc513722858f295f7efc28de135d336ac189"}, - {file = "grpcio-1.62.2-cp312-cp312-win_amd64.whl", hash = "sha256:aa787b83a3cd5e482e5c79be030e2b4a122ecc6c5c6c4c42a023a2b581fdf17b"}, - {file = "grpcio-1.62.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:cfd23ad29bfa13fd4188433b0e250f84ec2c8ba66b14a9877e8bce05b524cf54"}, - {file = "grpcio-1.62.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:af15e9efa4d776dfcecd1d083f3ccfb04f876d613e90ef8432432efbeeac689d"}, - {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:f4aa94361bb5141a45ca9187464ae81a92a2a135ce2800b2203134f7a1a1d479"}, - {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82af3613a219512a28ee5c95578eb38d44dd03bca02fd918aa05603c41018051"}, - {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ddaf53474e8caeb29eb03e3202f9d827ad3110475a21245f3c7712022882a9"}, - {file = "grpcio-1.62.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79b518c56dddeec79e5500a53d8a4db90da995dfe1738c3ac57fe46348be049"}, - {file = "grpcio-1.62.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a5eb4844e5e60bf2c446ef38c5b40d7752c6effdee882f716eb57ae87255d20a"}, - {file = "grpcio-1.62.2-cp37-cp37m-win_amd64.whl", hash = "sha256:aaae70364a2d1fb238afd6cc9fcb10442b66e397fd559d3f0968d28cc3ac929c"}, - {file = "grpcio-1.62.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:1bcfe5070e4406f489e39325b76caeadab28c32bf9252d3ae960c79935a4cc36"}, - {file = "grpcio-1.62.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:da6a7b6b938c15fa0f0568e482efaae9c3af31963eec2da4ff13a6d8ec2888e4"}, - {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:41955b641c34db7d84db8d306937b72bc4968eef1c401bea73081a8d6c3d8033"}, - {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c772f225483905f675cb36a025969eef9712f4698364ecd3a63093760deea1bc"}, - {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07ce1f775d37ca18c7a141300e5b71539690efa1f51fe17f812ca85b5e73262f"}, - {file = "grpcio-1.62.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:26f415f40f4a93579fd648f48dca1c13dfacdfd0290f4a30f9b9aeb745026811"}, - {file = "grpcio-1.62.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:db707e3685ff16fc1eccad68527d072ac8bdd2e390f6daa97bc394ea7de4acea"}, - {file = "grpcio-1.62.2-cp38-cp38-win32.whl", hash = "sha256:589ea8e75de5fd6df387de53af6c9189c5231e212b9aa306b6b0d4f07520fbb9"}, - {file = "grpcio-1.62.2-cp38-cp38-win_amd64.whl", hash = "sha256:3c3ed41f4d7a3aabf0f01ecc70d6b5d00ce1800d4af652a549de3f7cf35c4abd"}, - {file = "grpcio-1.62.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:162ccf61499c893831b8437120600290a99c0bc1ce7b51f2c8d21ec87ff6af8b"}, - {file = "grpcio-1.62.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f27246d7da7d7e3bd8612f63785a7b0c39a244cf14b8dd9dd2f2fab939f2d7f1"}, - {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:2507006c8a478f19e99b6fe36a2464696b89d40d88f34e4b709abe57e1337467"}, - {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a90ac47a8ce934e2c8d71e317d2f9e7e6aaceb2d199de940ce2c2eb611b8c0f4"}, - {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99701979bcaaa7de8d5f60476487c5df8f27483624f1f7e300ff4669ee44d1f2"}, - {file = "grpcio-1.62.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:af7dc3f7a44f10863b1b0ecab4078f0a00f561aae1edbd01fd03ad4dcf61c9e9"}, - {file = "grpcio-1.62.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fa63245271920786f4cb44dcada4983a3516be8f470924528cf658731864c14b"}, - {file = "grpcio-1.62.2-cp39-cp39-win32.whl", hash = "sha256:c6ad9c39704256ed91a1cffc1379d63f7d0278d6a0bad06b0330f5d30291e3a3"}, - {file = "grpcio-1.62.2-cp39-cp39-win_amd64.whl", hash = "sha256:16da954692fd61aa4941fbeda405a756cd96b97b5d95ca58a92547bba2c1624f"}, - {file = "grpcio-1.62.2.tar.gz", hash = "sha256:c77618071d96b7a8be2c10701a98537823b9c65ba256c0b9067e0594cdbd954d"}, + {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, + {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, + {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, + {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, + {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, + {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, + {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, + {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, + {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, + {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, + {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, + {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, + {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, + {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, + {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, + {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, + {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, + {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, + {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, + {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, + {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.62.2)"] +protobuf = ["grpcio-tools (>=1.63.0)"] [[package]] name = "h11" @@ -3144,13 +3166,13 @@ testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest [[package]] name = "nautobot" -version = "2.2.2" +version = "2.2.3" description = "Source of truth and network automation platform." optional = false python-versions = "<3.12,>=3.8" files = [ - {file = "nautobot-2.2.2-py3-none-any.whl", hash = "sha256:4a77b13d60f004815007d519f29602bba5b9ff899d235bb055a64ce9b6f461ce"}, - {file = "nautobot-2.2.2.tar.gz", hash = "sha256:502fd0bf8691900b1c86c307e8bb3765990890a02e656c4af8e0b9cc3b7cc6f4"}, + {file = "nautobot-2.2.3-py3-none-any.whl", hash = "sha256:2e0a3cc8d9c5738fda1b75ac4914aa60d9b6eae1bfe969c7aa1d29c515de9674"}, + {file = "nautobot-2.2.3.tar.gz", hash = "sha256:565cc3039069d31ed2c9176b29c72f64c88356ba167118605887b1757168db77"}, ] [package.dependencies] @@ -3195,16 +3217,16 @@ psycopg2-binary = ">=2.9.9,<2.10.0" python-slugify = ">=8.0.3,<8.1.0" pyuwsgi = ">=2.0.23,<2.1.0" PyYAML = ">=6.0,<6.1" -social-auth-app-django = ">=5.4.0,<5.5.0" +social-auth-app-django = ">=5.4.1,<5.5.0" svgwrite = ">=1.4.2,<1.5.0" [package.extras] -all = ["django-auth-ldap (>=4.7.0,<4.8.0)", "django-storages (>=1.14.2,<1.15.0)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[openidconnect,saml] (>=4.5.3,<4.6.0)"] +all = ["django-auth-ldap (>=4.7.0,<4.8.0)", "django-storages (>=1.14.2,<1.15.0)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[saml] (>=4.5.3,<4.6.0)"] ldap = ["django-auth-ldap (>=4.7.0,<4.8.0)"] mysql = ["mysqlclient (>=2.2.3,<2.3.0)"] napalm = ["napalm (>=4.1.0,<4.2.0)"] remote-storage = ["django-storages (>=1.14.2,<1.15.0)"] -sso = ["social-auth-core[openidconnect,saml] (>=4.5.3,<4.6.0)"] +sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"] [[package]] name = "nautobot-capacity-metrics" @@ -3575,18 +3597,19 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, + {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "prometheus-client" @@ -3634,33 +3657,22 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "3.20.3" -description = "Protocol Buffers" +version = "4.25.3" +description = "" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, - {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, - {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, - {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, - {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, - {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, - {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, - {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, - {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, - {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, - {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, - {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, - {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, - {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, - {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, - {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, - {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, - {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, - {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, - {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, - {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, - {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] [[package]] @@ -4345,13 +4357,13 @@ pyyaml = "*" [[package]] name = "redis" -version = "5.0.3" +version = "5.0.4" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.3-py3-none-any.whl", hash = "sha256:5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d"}, - {file = "redis-5.0.3.tar.gz", hash = "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580"}, + {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, + {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, ] [package.dependencies] @@ -4363,104 +4375,90 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2024.4.16" +version = "2024.4.28" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb83cc090eac63c006871fd24db5e30a1f282faa46328572661c0a24a2323a08"}, - {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c91e1763696c0eb66340c4df98623c2d4e77d0746b8f8f2bee2c6883fd1fe18"}, - {file = "regex-2024.4.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10188fe732dec829c7acca7422cdd1bf57d853c7199d5a9e96bb4d40db239c73"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:956b58d692f235cfbf5b4f3abd6d99bf102f161ccfe20d2fd0904f51c72c4c66"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a70b51f55fd954d1f194271695821dd62054d949efd6368d8be64edd37f55c86"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c02fcd2bf45162280613d2e4a1ca3ac558ff921ae4e308ecb307650d3a6ee51"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ed75ea6892a56896d78f11006161eea52c45a14994794bcfa1654430984b22"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd727ad276bb91928879f3aa6396c9a1d34e5e180dce40578421a691eeb77f47"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7cbc5d9e8a1781e7be17da67b92580d6ce4dcef5819c1b1b89f49d9678cc278c"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:78fddb22b9ef810b63ef341c9fcf6455232d97cfe03938cbc29e2672c436670e"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:445ca8d3c5a01309633a0c9db57150312a181146315693273e35d936472df912"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:95399831a206211d6bc40224af1c635cb8790ddd5c7493e0bd03b85711076a53"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7731728b6568fc286d86745f27f07266de49603a6fdc4d19c87e8c247be452af"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4facc913e10bdba42ec0aee76d029aedda628161a7ce4116b16680a0413f658a"}, - {file = "regex-2024.4.16-cp310-cp310-win32.whl", hash = "sha256:911742856ce98d879acbea33fcc03c1d8dc1106234c5e7d068932c945db209c0"}, - {file = "regex-2024.4.16-cp310-cp310-win_amd64.whl", hash = "sha256:e0a2df336d1135a0b3a67f3bbf78a75f69562c1199ed9935372b82215cddd6e2"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1210365faba7c2150451eb78ec5687871c796b0f1fa701bfd2a4a25420482d26"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ab40412f8cd6f615bfedea40c8bf0407d41bf83b96f6fc9ff34976d6b7037fd"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd80d1280d473500d8086d104962a82d77bfbf2b118053824b7be28cd5a79ea5"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb966fdd9217e53abf824f437a5a2d643a38d4fd5fd0ca711b9da683d452969"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20b7a68444f536365af42a75ccecb7ab41a896a04acf58432db9e206f4e525d6"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b74586dd0b039c62416034f811d7ee62810174bb70dffcca6439f5236249eb09"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8290b44d8b0af4e77048646c10c6e3aa583c1ca67f3b5ffb6e06cf0c6f0f89"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2d80a6749724b37853ece57988b39c4e79d2b5fe2869a86e8aeae3bbeef9eb0"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3a1018e97aeb24e4f939afcd88211ace472ba566efc5bdf53fd8fd7f41fa7170"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8d015604ee6204e76569d2f44e5a210728fa917115bef0d102f4107e622b08d5"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:3d5ac5234fb5053850d79dd8eb1015cb0d7d9ed951fa37aa9e6249a19aa4f336"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0a38d151e2cdd66d16dab550c22f9521ba79761423b87c01dae0a6e9add79c0d"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159dc4e59a159cb8e4e8f8961eb1fa5d58f93cb1acd1701d8aff38d45e1a84a6"}, - {file = "regex-2024.4.16-cp311-cp311-win32.whl", hash = "sha256:ba2336d6548dee3117520545cfe44dc28a250aa091f8281d28804aa8d707d93d"}, - {file = "regex-2024.4.16-cp311-cp311-win_amd64.whl", hash = "sha256:8f83b6fd3dc3ba94d2b22717f9c8b8512354fd95221ac661784df2769ea9bba9"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80b696e8972b81edf0af2a259e1b2a4a661f818fae22e5fa4fa1a995fb4a40fd"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d61ae114d2a2311f61d90c2ef1358518e8f05eafda76eaf9c772a077e0b465ec"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ba6745440b9a27336443b0c285d705ce73adb9ec90e2f2004c64d95ab5a7598"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295004b2dd37b0835ea5c14a33e00e8cfa3c4add4d587b77287825f3418d310"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aba818dcc7263852aabb172ec27b71d2abca02a593b95fa79351b2774eb1d2b"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0800631e565c47520aaa04ae38b96abc5196fe8b4aa9bd864445bd2b5848a7a"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08dea89f859c3df48a440dbdcd7b7155bc675f2fa2ec8c521d02dc69e877db70"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeaa0b5328b785abc344acc6241cffde50dc394a0644a968add75fcefe15b9d4"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4e819a806420bc010489f4e741b3036071aba209f2e0989d4750b08b12a9343f"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c2d0e7cbb6341e830adcbfa2479fdeebbfbb328f11edd6b5675674e7a1e37730"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:91797b98f5e34b6a49f54be33f72e2fb658018ae532be2f79f7c63b4ae225145"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:d2da13568eff02b30fd54fccd1e042a70fe920d816616fda4bf54ec705668d81"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:370c68dc5570b394cbaadff50e64d705f64debed30573e5c313c360689b6aadc"}, - {file = "regex-2024.4.16-cp312-cp312-win32.whl", hash = "sha256:904c883cf10a975b02ab3478bce652f0f5346a2c28d0a8521d97bb23c323cc8b"}, - {file = "regex-2024.4.16-cp312-cp312-win_amd64.whl", hash = "sha256:785c071c982dce54d44ea0b79cd6dfafddeccdd98cfa5f7b86ef69b381b457d9"}, - {file = "regex-2024.4.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2f142b45c6fed48166faeb4303b4b58c9fcd827da63f4cf0a123c3480ae11fb"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87ab229332ceb127a165612d839ab87795972102cb9830e5f12b8c9a5c1b508"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81500ed5af2090b4a9157a59dbc89873a25c33db1bb9a8cf123837dcc9765047"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b340cccad138ecb363324aa26893963dcabb02bb25e440ebdf42e30963f1a4e0"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c72608e70f053643437bd2be0608f7f1c46d4022e4104d76826f0839199347a"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe2305e6232ef3e8f40bfc0f0f3a04def9aab514910fa4203bafbc0bb4682"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:03576e3a423d19dda13e55598f0fd507b5d660d42c51b02df4e0d97824fdcae3"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:549c3584993772e25f02d0656ac48abdda73169fe347263948cf2b1cead622f3"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:34422d5a69a60b7e9a07a690094e824b66f5ddc662a5fc600d65b7c174a05f04"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5f580c651a72b75c39e311343fe6875d6f58cf51c471a97f15a938d9fe4e0d37"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3399dd8a7495bbb2bacd59b84840eef9057826c664472e86c91d675d007137f5"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d1f86f3f4e2388aa3310b50694ac44daefbd1681def26b4519bd050a398dc5a"}, - {file = "regex-2024.4.16-cp37-cp37m-win32.whl", hash = "sha256:dd5acc0a7d38fdc7a3a6fd3ad14c880819008ecb3379626e56b163165162cc46"}, - {file = "regex-2024.4.16-cp37-cp37m-win_amd64.whl", hash = "sha256:ba8122e3bb94ecda29a8de4cf889f600171424ea586847aa92c334772d200331"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:743deffdf3b3481da32e8a96887e2aa945ec6685af1cfe2bcc292638c9ba2f48"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7571f19f4a3fd00af9341c7801d1ad1967fc9c3f5e62402683047e7166b9f2b4"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df79012ebf6f4efb8d307b1328226aef24ca446b3ff8d0e30202d7ebcb977a8c"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e757d475953269fbf4b441207bb7dbdd1c43180711b6208e129b637792ac0b93"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4313ab9bf6a81206c8ac28fdfcddc0435299dc88cad12cc6305fd0e78b81f9e4"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d83c2bc678453646f1a18f8db1e927a2d3f4935031b9ad8a76e56760461105dd"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df1bfef97db938469ef0a7354b2d591a2d438bc497b2c489471bec0e6baf7c4"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62120ed0de69b3649cc68e2965376048793f466c5a6c4370fb27c16c1beac22d"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2ef6f7990b6e8758fe48ad08f7e2f66c8f11dc66e24093304b87cae9037bb4a"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8fc6976a3395fe4d1fbeb984adaa8ec652a1e12f36b56ec8c236e5117b585427"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:03e68f44340528111067cecf12721c3df4811c67268b897fbe695c95f860ac42"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ec7e0043b91115f427998febaa2beb82c82df708168b35ece3accb610b91fac1"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c21fc21a4c7480479d12fd8e679b699f744f76bb05f53a1d14182b31f55aac76"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:12f6a3f2f58bb7344751919a1876ee1b976fe08b9ffccb4bbea66f26af6017b9"}, - {file = "regex-2024.4.16-cp38-cp38-win32.whl", hash = "sha256:479595a4fbe9ed8f8f72c59717e8cf222da2e4c07b6ae5b65411e6302af9708e"}, - {file = "regex-2024.4.16-cp38-cp38-win_amd64.whl", hash = "sha256:0534b034fba6101611968fae8e856c1698da97ce2efb5c2b895fc8b9e23a5834"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7ccdd1c4a3472a7533b0a7aa9ee34c9a2bef859ba86deec07aff2ad7e0c3b94"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f2f017c5be19984fbbf55f8af6caba25e62c71293213f044da3ada7091a4455"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:803b8905b52de78b173d3c1e83df0efb929621e7b7c5766c0843704d5332682f"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:684008ec44ad275832a5a152f6e764bbe1914bea10968017b6feaecdad5736e0"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65436dce9fdc0aeeb0a0effe0839cb3d6a05f45aa45a4d9f9c60989beca78b9c"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea355eb43b11764cf799dda62c658c4d2fdb16af41f59bb1ccfec517b60bcb07"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c1165f3809ce7774f05cb74e5408cd3aa93ee8573ae959a97a53db3ca3180d"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cccc79a9be9b64c881f18305a7c715ba199e471a3973faeb7ba84172abb3f317"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00169caa125f35d1bca6045d65a662af0202704489fada95346cfa092ec23f39"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6cc38067209354e16c5609b66285af17a2863a47585bcf75285cab33d4c3b8df"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:23cff1b267038501b179ccbbd74a821ac4a7192a1852d1d558e562b507d46013"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d320b3bf82a39f248769fc7f188e00f93526cc0fe739cfa197868633d44701"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:89ec7f2c08937421bbbb8b48c54096fa4f88347946d4747021ad85f1b3021b3c"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4918fd5f8b43aa7ec031e0fef1ee02deb80b6afd49c85f0790be1dc4ce34cb50"}, - {file = "regex-2024.4.16-cp39-cp39-win32.whl", hash = "sha256:684e52023aec43bdf0250e843e1fdd6febbe831bd9d52da72333fa201aaa2335"}, - {file = "regex-2024.4.16-cp39-cp39-win_amd64.whl", hash = "sha256:e697e1c0238133589e00c244a8b676bc2cfc3ab4961318d902040d099fec7483"}, - {file = "regex-2024.4.16.tar.gz", hash = "sha256:fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea"}, + {file = "regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d"}, + {file = "regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f"}, + {file = "regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630"}, + {file = "regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6"}, + {file = "regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17"}, + {file = "regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150"}, + {file = "regex-2024.4.28-cp38-cp38-win32.whl", hash = "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58"}, + {file = "regex-2024.4.28-cp38-cp38-win_amd64.whl", hash = "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1"}, + {file = "regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc"}, + {file = "regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962"}, + {file = "regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4"}, ] [[package]] @@ -4591,28 +4589,28 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] [[package]] name = "ruff" -version = "0.4.1" +version = "0.4.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2d9ef6231e3fbdc0b8c72404a1a0c46fd0dcea84efca83beb4681c318ea6a953"}, - {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9485f54a7189e6f7433e0058cf8581bee45c31a25cd69009d2a040d1bd4bfaef"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2921ac03ce1383e360e8a95442ffb0d757a6a7ddd9a5be68561a671e0e5807e"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eec8d185fe193ad053eda3a6be23069e0c8ba8c5d20bc5ace6e3b9e37d246d3f"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa27d9d72a94574d250f42b7640b3bd2edc4c58ac8ac2778a8c82374bb27984"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f1ee41580bff1a651339eb3337c20c12f4037f6110a36ae4a2d864c52e5ef954"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0926cefb57fc5fced629603fbd1a23d458b25418681d96823992ba975f050c2b"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6e37f2e3cd74496a74af9a4fa67b547ab3ca137688c484749189bf3a686ceb"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd703a5975ac1998c2cc5e9494e13b28f31e66c616b0a76e206de2562e0843c"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b92f03b4aa9fa23e1799b40f15f8b95cdc418782a567d6c43def65e1bbb7f1cf"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1c859f294f8633889e7d77de228b203eb0e9a03071b72b5989d89a0cf98ee262"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b34510141e393519a47f2d7b8216fec747ea1f2c81e85f076e9f2910588d4b64"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6e68d248ed688b9d69fd4d18737edcbb79c98b251bba5a2b031ce2470224bdf9"}, - {file = "ruff-0.4.1-py3-none-win32.whl", hash = "sha256:b90506f3d6d1f41f43f9b7b5ff845aeefabed6d2494307bc7b178360a8805252"}, - {file = "ruff-0.4.1-py3-none-win_amd64.whl", hash = "sha256:c7d391e5936af5c9e252743d767c564670dc3889aff460d35c518ee76e4b26d7"}, - {file = "ruff-0.4.1-py3-none-win_arm64.whl", hash = "sha256:a1eaf03d87e6a7cd5e661d36d8c6e874693cb9bc3049d110bc9a97b350680c43"}, - {file = "ruff-0.4.1.tar.gz", hash = "sha256:d592116cdbb65f8b1b7e2a2b48297eb865f6bdc20641879aa9d7b9c11d86db79"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"}, + {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"}, + {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"}, + {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"}, + {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, ] [[package]] @@ -4716,13 +4714,13 @@ files = [ [[package]] name = "social-auth-app-django" -version = "5.4.0" +version = "5.4.1" description = "Python Social Authentication, Django integration." optional = false python-versions = ">=3.8" files = [ - {file = "social-auth-app-django-5.4.0.tar.gz", hash = "sha256:09ac02a063cb313eed5e9ef2f9ac4477c8bf5bbd685925ff3aba43f9072f1bbb"}, - {file = "social_auth_app_django-5.4.0-py3-none-any.whl", hash = "sha256:28c65b2e2092f30cdb3cf912eeaa6988b49fdf4001b29bd89e683673d700a38e"}, + {file = "social-auth-app-django-5.4.1.tar.gz", hash = "sha256:2a43cde559dd34fdc7132417b6c52c780fa99ec2332dee9f405b4763f371c367"}, + {file = "social_auth_app_django-5.4.1-py3-none-any.whl", hash = "sha256:7519f186c63c50f2d364457b236f051338d194bcface55e318a6a705c5213477"}, ] [package.dependencies] @@ -4731,13 +4729,13 @@ social-auth-core = ">=4.4.1" [[package]] name = "social-auth-core" -version = "4.5.3" +version = "4.5.4" description = "Python social authentication made simple." optional = false python-versions = ">=3.8" files = [ - {file = "social-auth-core-4.5.3.tar.gz", hash = "sha256:9d9b51b7ce2ccd0b7139e6b7f52a32cb922726de819fb13babe35f12ae89852a"}, - {file = "social_auth_core-4.5.3-py3-none-any.whl", hash = "sha256:8d16e66eb97bb7be43a023d6efa16628cdc94cefd8d8053930c98a0f676867e7"}, + {file = "social-auth-core-4.5.4.tar.gz", hash = "sha256:d3dbeb0999ffd0e68aa4bd73f2ac698a18133fd11b3fc890e1366f18c8889fac"}, + {file = "social_auth_core-4.5.4-py3-none-any.whl", hash = "sha256:33cf970a623c442376f9d4a86fb187579e4438649daa5b5be993d05e74d7b2db"}, ] [package.dependencies] @@ -5390,9 +5388,10 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [extras] aci = ["PyYAML"] -all = ["Jinja2", "PyYAML", "cloudvision", "cvprac", "dnspython", "ijson", "ipfabric", "ipfabric-diagrams", "nautobot-device-lifecycle-mgmt", "netutils", "oauthlib", "python-magic", "pytz", "requests", "requests-oauthlib", "six"] +all = ["Jinja2", "PyYAML", "cloudvision", "cvprac", "dnacentersdk", "dnspython", "ijson", "ipfabric", "ipfabric-diagrams", "nautobot-device-lifecycle-mgmt", "netutils", "oauthlib", "python-magic", "pytz", "requests", "requests-oauthlib", "six"] aristacv = ["cloudvision", "cvprac"] device42 = ["requests"] +dna-center = ["dnacentersdk"] infoblox = ["dnspython"] ipfabric = ["httpx", "ipfabric", "ipfabric-diagrams", "netutils"] nautobot-device-lifecycle-mgmt = ["nautobot-device-lifecycle-mgmt"] @@ -5402,4 +5401,4 @@ servicenow = ["Jinja2", "PyYAML", "ijson", "oauthlib", "python-magic", "pytz", " [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "cd710f5c319a47e01c925b15ded4986b7dd40575ee65813234016f2511ffbbc6" +content-hash = "cecf0df3b54631d7e9c5d1f2c22ae89c3a1e1b3c21b031f5d174b6ba56507c68" diff --git a/pyproject.toml b/pyproject.toml index 9eedc577f..a46e8cd3e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,6 +51,7 @@ requests = { version = ">=2.21.0", optional = true } requests-oauthlib = { version = ">=1.3.0", optional = true } six = { version = ">=1.13.0", optional = true } httpx = { version = ">=0.23.3", optional = true } +dnacentersdk = "^2.5.6" [tool.poetry.group.dev.dependencies] bandit = "*" @@ -118,6 +119,7 @@ all = [ "requests", "requests-oauthlib", "six", + "dnacentersdk", ] aristacv = [ "cloudvision", @@ -126,6 +128,9 @@ aristacv = [ device42 = [ "requests", ] +dna_center = [ + "dnacentersdk", +] infoblox = [ "dnspython", ] From b59841e21f688251329b65ecd49fd3c0edc10ecb Mon Sep 17 00:00:00 2001 From: Justin Drew <2396364+jdrew82@users.noreply.github.com> Date: Fri, 3 May 2024 07:29:47 -0500 Subject: [PATCH 64/65] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Fix=20imports=20for?= =?UTF-8?q?=20new=20pathing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dna_center/diffsync/adapters/dna_center.py | 6 +++--- .../integrations/dna_center/diffsync/adapters/nautobot.py | 2 +- .../integrations/dna_center/diffsync/models/dna_center.py | 2 +- .../integrations/dna_center/diffsync/models/nautobot.py | 8 ++++++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/nautobot_ssot/integrations/dna_center/diffsync/adapters/dna_center.py b/nautobot_ssot/integrations/dna_center/diffsync/adapters/dna_center.py index dd4cfbef7..53ec15dbb 100644 --- a/nautobot_ssot/integrations/dna_center/diffsync/adapters/dna_center.py +++ b/nautobot_ssot/integrations/dna_center/diffsync/adapters/dna_center.py @@ -9,8 +9,8 @@ from django.core.exceptions import ValidationError from nautobot.tenancy.models import Tenant -from nautobot_ssot_dna_center.constants import DNAC_PLATFORM_MAPPER, PLUGIN_CFG -from nautobot_ssot_dna_center.diffsync.models.dna_center import ( +from nautobot_ssot.integrations.dna_center.constants import DNAC_PLATFORM_MAPPER, PLUGIN_CFG +from nautobot_ssot.integrations.dna_center.diffsync.models.dna_center import ( DnaCenterArea, DnaCenterBuilding, DnaCenterDevice, @@ -20,7 +20,7 @@ DnaCenterPort, DnaCenterIPAddressonInterface, ) -from nautobot_ssot_dna_center.utils.dna_center import DnaCenterClient +from nautobot_ssot.integrations.dna_center.utils.dna_center import DnaCenterClient class DnaCenterAdapter(DiffSync): diff --git a/nautobot_ssot/integrations/dna_center/diffsync/adapters/nautobot.py b/nautobot_ssot/integrations/dna_center/diffsync/adapters/nautobot.py index 78fc66ac0..23affdcf8 100644 --- a/nautobot_ssot/integrations/dna_center/diffsync/adapters/nautobot.py +++ b/nautobot_ssot/integrations/dna_center/diffsync/adapters/nautobot.py @@ -28,7 +28,7 @@ from nautobot.ipam.models import Prefix as OrmPrefix from nautobot.tenancy.models import Tenant as OrmTenant from nautobot_ssot.jobs.base import DataTarget -from nautobot_ssot_dna_center.diffsync.models.nautobot import ( +from nautobot_ssot.integrations.dna_center.diffsync.models.nautobot import ( NautobotArea, NautobotBuilding, NautobotDevice, diff --git a/nautobot_ssot/integrations/dna_center/diffsync/models/dna_center.py b/nautobot_ssot/integrations/dna_center/diffsync/models/dna_center.py index 9e08f2a77..6a0b385ba 100644 --- a/nautobot_ssot/integrations/dna_center/diffsync/models/dna_center.py +++ b/nautobot_ssot/integrations/dna_center/diffsync/models/dna_center.py @@ -1,6 +1,6 @@ """Nautobot SSoT for Cisco DNA Center DiffSync models for Nautobot SSoT for Cisco DNA Center SSoT.""" -from nautobot_ssot_dna_center.diffsync.models.base import ( +from nautobot_ssot.integrations.dna_center.diffsync.models.base import ( Area, Building, Floor, diff --git a/nautobot_ssot/integrations/dna_center/diffsync/models/nautobot.py b/nautobot_ssot/integrations/dna_center/diffsync/models/nautobot.py index 5a97a06d8..d3358874f 100644 --- a/nautobot_ssot/integrations/dna_center/diffsync/models/nautobot.py +++ b/nautobot_ssot/integrations/dna_center/diffsync/models/nautobot.py @@ -14,8 +14,12 @@ ) from nautobot.extras.models import Role from nautobot.ipam.models import IPAddress, IPAddressToInterface, Prefix, Namespace -from nautobot_ssot_dna_center.diffsync.models import base -from nautobot_ssot_dna_center.utils.nautobot import add_software_lcm, assign_version_to_device, verify_platform +from nautobot_ssot.integrations.dna_center.diffsync.models import base +from nautobot_ssot.integrations.dna_center.utils.nautobot import ( + add_software_lcm, + assign_version_to_device, + verify_platform, +) try: import nautobot_device_lifecycle_mgmt # noqa: F401 From 342c94c1d9270eece8e6510384e0bd819dd91eaa Mon Sep 17 00:00:00 2001 From: Justin Drew <2396364+jdrew82@users.noreply.github.com> Date: Fri, 3 May 2024 07:33:38 -0500 Subject: [PATCH 65/65] =?UTF-8?q?build:=20=F0=9F=8F=97=EF=B8=8F=20Add=20se?= =?UTF-8?q?ttings=20for=20DNA=20Center=20integration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- development/nautobot_config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/development/nautobot_config.py b/development/nautobot_config.py index 12c20c603..75d154a41 100644 --- a/development/nautobot_config.py +++ b/development/nautobot_config.py @@ -194,6 +194,7 @@ "enable_aci": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ACI")), "enable_aristacv": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ARISTACV")), "enable_device42": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_DEVICE42")), + "enable_dna_center": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_DNA_CENTER")), "enable_infoblox": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_INFOBLOX")), "enable_ipfabric": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_IPFABRIC")), "enable_servicenow": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_SERVICENOW")), @@ -214,6 +215,10 @@ "device42_role_prepend": "", "device42_ignore_tag": "", "device42_hostname_mapping": [], + "dna_center_import_global": is_truthy(os.getenv("NAUTOBOT_DNAC_SSOT_DNA_CENTER_IMPORT_GLOBAL", True)), + "dna_center_import_merakis": is_truthy(os.getenv("NAUTOBOT_DNAC_SSOT_DNA_CENTER_IMPORT_MERAKIS", False)), + "dna_center_update_locations": is_truthy(os.getenv("NAUTOBOT_DNAC_SSOT_DNA_CENTER_UPDATE_LOCATIONS", True)), + "dna_center_show_failures": is_truthy(os.getenv("NAUTOBOT_DNAC_SSOT_DNA_CENTER_SHOW_FAILURES", True)), "infoblox_default_status": os.getenv("NAUTOBOT_SSOT_INFOBLOX_DEFAULT_STATUS", "active"), "infoblox_enable_sync_to_infoblox": is_truthy(os.getenv("NAUTOBOT_SSOT_INFOBLOX_ENABLE_SYNC_TO_INFOBLOX")), "infoblox_import_objects_ip_addresses": is_truthy(