From fecb2b445b504ba61cfc3fcd805e067771a118a5 Mon Sep 17 00:00:00 2001 From: Edgar Magana Date: Fri, 27 May 2016 16:39:38 -0700 Subject: [PATCH] Add content from DHCP in HA mode This commit adds the DHCP in HA mode configuration. It has been copied from the Admin Guide. Next step is to remove the content in the Admin Guide and inlcude the respective reference. Change-Id: I2ffdd3516a6f4468e6ff5a7b057f06bb5ea53dfc --- .../figures/demo_multiple_dhcp_agents.png | Bin 0 -> 52475 bytes .../source/misc-add-ha-for-dhcp.rst | 485 +++++++++++++++++- 2 files changed, 481 insertions(+), 4 deletions(-) create mode 100644 doc/networking-guide/source/figures/demo_multiple_dhcp_agents.png diff --git a/doc/networking-guide/source/figures/demo_multiple_dhcp_agents.png b/doc/networking-guide/source/figures/demo_multiple_dhcp_agents.png new file mode 100644 index 0000000000000000000000000000000000000000..38670395630643e349f5d2cff86a03b4c02045a6 GIT binary patch literal 52475 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 z

9UHko0Wm5v*Z@I3wk?&)mEHY~`$@KOa$ zeBpzPgRt-ZNihhhu4k9ck}yb|9>c5JOYgcyz^bjZK%}-b#Y|K%Uo0=1l0mCzRDtiq zP#CQH6ZHGjamhZvBf7Q5W-n`Vl3cpPdT41PYGru#B_};x_W__>0Bz2qX6mtcaQsrZ z_DgqHQyO~GpuT;CD>1Jhpj!xzd<7^8+unX3)Tt4o zv*Y=*Dfy6}%>zJ5RZxv?1TKxm4To4^s8YuJWoV5PS3~V!d%qfgAsd_-((`}o#R6wCS ze}Rw^mMB;k9F8&7i1m4;A-qBs8u%!IP9M$4mc+tG2)kP{A>|GO<*(T1W4<4pJxv&x zbhu@n>;>0Q%QiMMZ`K_h1&I&H%w1R!d3690kQMs}zLXQPM~`=}D*6v^Y-BQ{6l_zR zutwckMKl4ss^RDZBs$~Mm-s5Hqh2Ho=Nu}du6ScehzyZ>cg1&m;Skrd{DbR;lB{fal-ZMF-7Zl7WTmpW zKp?#854OV`0ak>qBA$uU7F86}c>jpZk-nGj7jX*8gL=bmHW+*loba(bU5u8%$0Qa# z+D=|8{pU`n^P|U@`gj^#k_zFfME;&8i00~2+v95rzK1PE8Qf`9Ud?&%!oKoTF+B+oshLwl zW~3q9tJMX2Oy&izj+My-8*WQ#1jPk+lqNk(J&w-b z3IfQDc5;$`#nx(`Ge~+w^gUN+Ky=ARq;P>^WO4n$SHbFNG5I@Zm1m= z9Me`2a(XFoQZo_=XnKThx|6-Mw~ zPCBLyf;D$7c1kBiZmxOyysZ#;u0S}uE)du{g}ORkBXH31z_q&>?eHz2Pg?9HOqoI= zS4r`TD?b(C*m*jGPFcdt2u~`cYr7+2os@Hrs$12JSOPqs4XBo7M<^!a^aR=blc7+76DmYSQI=5Y1y~G zuO~JF&n@yjl;s}E4njk)-iq9aNU{RrsZJXe)7%MlnO{a%N@&L|%h8gx6(U~?OpeVb z{hz!-yF{#&KVL!ytmr#jcCDY*(&|um^6%%{|8bnUJmC18>=~`PWEhNT-p%xcnLJo{ zna@bYd@oqMiLE}yuCZ#$2g+LGTRrnW$YMuS+!=UvG4x{F7K3-r44{$*OR)BHW^S7g zpodTvjn{!Uas4*?kt#mf*63p+^B(wcW3$3^Guk4@O{Ak#9vIq(8p83mZ?WSAX`~ z{*!lRrD}Kjf!qCM2BSa@O!RppiN_SZm-Zfg3j4M_b}nUEv4x9UHrybrCp#`_cZI0c z$gr`|Y8d(7w*Wr(32D@8`u!@%ZB_E98JvpSK|CuW=>;v(msU0zo}225?Dg}AWW{D&=g?z%-wA02&eo}-F-e)-d)0q($}`jov)t-6&>e%IeeM9ITx`7mgY%;N zFp3TzfwbJ$lcW!HqZX`D-{es4EBd1?P^R-Cxa`MYr|7G(Fm9zsMHdgJe)95I!#s+T zq`5r4x#^QYna=a6r;Ej3ElutEu*>2I7!`R~IOZsh&6bQpVKNd!_cM4=N+?k>{2F`u zIgGmay^AVWd*jD4T>$U-=y2WmDjNdK7rBnH-Jy&m#Ud%b?|*hsrBnf<)x{z@Diskh zcpM3Vg*Wo@gg%SGy=7C0K=YptAx*wgM^7j~;sZJEfC9~X=1vFFPe$YYH>HBtA4`P%f5F)sku1~7P~OSUvNX+bxaq?C&S@Q;V_jy`L_6& z>k~#rc0x-}nfOyWV4CI&@hE11qBlQ2^%J~t*vV;&AD9KS?nRKtMm}GZ=&4sk!MDln z!>_RH|Kvf7K4o=US zCDdGenUp-j%Tmn3=~$})OU>yfyKT3ww*KJE`58J#-pT3HizKb4UBy<&5A{UU`$M?% zG@8aMIBJ(llTRWKsu!me3;~Kw=XcKE+X|lKWs)o2Rt%3_``OU^-YceqL2(JL-j_U# z0zt44I-x$9j%bbc^aAE_8OslV?&-uIYkiC{P5H-3ffHq8?XmnMsQ0^{huzIER@Gdv zFUC7?@Jo`tbJV|=Uti411%v=Nu@Mqpf-_%Qm7*1vNI05NOFrM~_DtZMwg4xXF!Ste4M`-4yVHZf z!qaxjjk6@e4MxcyKKMklxaK@;-;7HwJXpJ*bTfDDTimOZk8&dYr^tgb9F(8!s;^Xn z$Eoq|{`nyzljlv!`Tk_sbT$+~`;M2-`6D8rj!l2!XzcvHM06hGH~?V4-!ZA)^=Yl~ zj;d*gL08L}0F=Jazpo1`zfhpPfLZRLa)`5LL1`-L*-92mhq&0SGDF6+o780Wi*sB- zCs=Yz)H>G&3)+^*~I;4@791KGp$fEizpdB121cVrd4|*lML>Dm%VXl@TW*m zw;3D>30Ta?gelv@snxqA*-Nxw=KL0+$BQBKbtm+-9!G9nuQvk`8}k?D^-rVy54=^D0L9}_ldOK1M;F3kXxykP$r8S{7TQ8LIFm=6`$g8nTa0Hwt2f7KpYt})sE6`?c#!c>e226z4|HGoh0 z2_l|4<`$Ftt9;1#SM5=W@B;o{#8a3c;zp0Y{{I#6fR1P~pfZ?b2ddOx2dsa}7jzqc z)gINI;&A?@mt;_ahP?{O$nJltdIKe+3L@UWAt3$np9UG3L8k@d*=%#9zlisL;Rq|O z23vp0!I%OhhheU7BY%Le-=i~XgNXB&oWj%olEd&Xf&YILA{9#i=%~)X2szvzF4_%$ zbt0q6qyUPVKZEPI$F#XADC8k+j{f1uCk0fO1&DhnNd@KT)7m$>?v40w(>4xt2mbk= z`qz29CyO=`^gkL{p|i`>6IHwz8cNq6tOouYL;F^qm`xUK*BVpkB%u8l2XY?uA8h**)35J zqK_x}ARl^EjXwpy8lGDdC$0CR{NpB8<=0=LBb4(VxbM0@H-R^SGIoDLB@dT*Kfi=d z9D!#rwVE!$=`h`&Q*~rbA@}k|>RnrX%~2b8Z3Z|7l{83x>K~Woe5Bxi)jLTMcC5Um z%RFM`tbI_>JR3oqwuj{yjN+{!*6JDDGbijw~NJ!T+!JzB(w6Cg>AQu;A{5;GUqt-QAr40fNJW zy95Y96WlGhLvRQZ+}+*XU2lO`^3~nd)k)QTb#?jUsbaG`+uhUh>z2x%(tCFvQH_rBhbq%wMe z>8`!<>VEwvONYb&r9?s@9Z$^s?ks!B@#Tq3##lZb^7Z1{;JH_jB|l0b zY8e!$CW=xQ=xKVL>Jg{Ah{z#WEOlj@#3`^ob4q|&B*m1_N@q(2V$_>)=oy;Ho;sF7 zh`zNmuak9Hn9w3t*r9gSD9f8v;N7hB=pA|UWr~Q1 zkh2O2uQVoP!r<=uiL}*W>-%H-0QFxUL5JUl8zEwSYdUQi~Jy)6-nv##&SVC9-h! z9{C=XWL^!c;-*e=@k!(<>Pil6f4V<}teFhg-fbx(#^a18iDrmBK0-9Ns$d6W z^(ABpv1B46wY#fj{A4TK`F+|qfdRx>03`pVIii2*gLeRi+=}Tav|Z4!VrZ1FgMpD7 z1gjC{k?Fgam))&mHN8Ne&-Fk8stx6DSZ&ZrIEm3$PBlrA7_mi_9s=E0pa7*^xIVFK z?w$sF3H&4`vRNFRc!TP{lrN7Tun-pFayY=P9z*Cf+cR>@U3`{fQLqwTsUVFn1A6kh z1oC3@mh&n56EU8fY0ABL2nn6$H{gtlxPo-Kb_bgWVDBLCkqx!$J-2e)aIaQ^{I5nd zY;A3=kC(N3gX{fIJv^{i<<4y~dzK8IC$GsD2y&is9E8B+VaxGBm}#0pRd14S@JW1C z>P28s`>F!RX5tZaMXNu=19V{iw_8IdMd~zjJ>P`WtR13&`c8DQF%GSke5*GlFSoQX zuX)m;jH@DFuLwT95h%&`a}?VuU;<79TZa!q^Pi@WN}wsERbmwexvNSeQ=lH3-_fp8 zR7laPcN5EN!(!y9j-6BKpdfl#U!ov)%ye}%FO9l13hA$i;{Vw1ime(A=ry()-`2Vh zA#0qPEi*Km&~akKx6ri!#nf{fej2mI^*9ack5$suPkQ(2^p(_b4n^HVkpzk1O+`cm17fTZ7A(F|jkz0KOXG zHL(nsJJlb}3v938PA{6UEby18zgtcC|B8*ZMLQuK(2F;k)GXrDEVWP|!1=LUFvxRO zcr@NDiS5=0&l@mfDp>D)Or6ZGj$H`VFH`wtb2V(kOdUfuo60S|@h{i)0vTWwObHX% z>%jHdD+;w30k)aO<*W5!eh`5yCU2UZLwl=eo9t26G7Hm2z2l6_a<-G=Q9Oo5C1TU~ zc$=mU&ajwOQk$#wUo{Usr$;{Onauuz1W)?N=l2-dzXWpr(UB_Gbol5Rt$K0)Ll7qc zf(3^Dvdo|1p0WNhOTa6C@vLLdu2o44&~U%lYP3HC0|Ed*W)Is7y#K@+7yv%jAtB%Y z%LJbZ`wci5w*MV6)&0&Nsq~tHdoykcn|VqJbQ3Vmu$F!Ji*m(B4Wj05W2e$1_LjQQ z*u1+Hf{g0d|2t&l1cPN)D2W8!{LyGD*W~pmlP^8#f8X^;tQ-y?lc=HPU;jZSsenu% zm&;84gG?UF*&lyaGyDgcPy#aXs-}(qQzlU;K(M6AXmh91TZPz8lq%5S>gdccbYh`; z++<{0<}xn*zW(B-AJl)wDI~>(^3L=It5;5U5nICkl!}Gq2dAae4HN7E#d%D`2 zDW^Y}GI-2xq#Bxmy8l10fK~%Q55kVTctAPv?`W$h1w0&*%ZB~WRwH0?gn?PE+T1r@ z`9q$;;$CbdZ?oq0XaOAQtu?F0Lhvvb50mfJ!E_ZBYF$CCY_l%z#=WIEyUz@+=zq669I* zF7a9mNcN=`Wn$PiM+Vm9pE5LKri zx2L+woOF8CX0r`gD0wwNQFANoU9h z9yU1dWNXMa8nMt^JHXTNVy1)fmnhf0P7VCVN;$Y64aD?$8`>QaKb_wf5;j~j-Z<}& zao@vcPVFU?OAg8l)^X2!objI4^D2$S-G?mwD|=}JOM~WCHn2vN%KQE!qM!sdnAgX)flC;%N<-H>fYJlScaW;bn^3*^aZwc(dC!e9BHk} zI3YpaeGQ|b<}3dW!V{GV62PC%FcWnBHoT*0cxW>BvLPrrPi&U3zSn7$F2R?#X#Dq}>Wj2r8F;&G z0l|@Ijmtd;hyoa+(1OYEe%Z>X{SSD7XFv4hDW5c4tXG=Ee~53V3mT9u>lZE&&BDv_qJ*lXk(i9W zM(|D94$=71vE*CzP0>j$cVWB0X;umoZ_am7e(0SN4Z5R;utMJ^C>p9T;7kx+SC!q> zKhE; z#1V=p_=oQct7GGIJ+2-!n#X_R5yo!`D`+}hj`Ld}X^ORNUKc69{I)ytx9tQ$kE8bJZMfb}uVG?wibZ;)vCJfrr&k50W(ad4h!`i{Db%vdeWtj+iLs_rrsN z+18fta50AQKJ(Wg0dWk6Qw#r3Vp1wa*ENiWkgmQ#@_iKvGDD2ScKM;|pluKgpL=$T zumiboA+)`BHLJg0TE~@B zZ_$Q!fYFEG{Z{@SG&}1<#7_D~>4a(tot_Nq#djjahvzLYBN&uBoaQ4ID34_pYARws zv;2-h!lMUQNSPxVZzpGFD;?AE+#jti9_RlG=A~AL=;!NKzzZ3GIv=Lc3KO??6 zV^6n4@@h=MpNglV%Y6&=%7QY>1T62=Y_iIO+aam?YiujC;m&FlTp#mM8Dn$+JEk;zsaZ7>5btKifrn9|{r;-?@9vl#?q|;)sNud$wh);wj(dJ5T zdg#>dWhv?}ayrZ5MZdDx2W{bfq%*bfq5eMUvk=<6Cog*qA4>Sk_uiwz+Ta29M>lS& z0VI>GmekNByA|g6yd8hJhaeMiCnTZ-#}D<5qn-lZ)=%Ld8Bom}FN656gB<%8jU4cx z%xrZVg2=;toM`Z?=6wh)GcZM}Bc)YKkKscdw=QXuP1oEGv|IxbWRl5vaFhzP_Mg}A zM5vn5Ff(>BUkH0|W66zfc~eZkC;o6#Jn13{9oL`l8`Z$MD!&>CkEovHigF%f}m5fXCi;50$i|j?G zvRKfB+k_q@7Tznv58sRYC2mNvQcaXG6?)<#EI;Z>a;{Nu4&c~tj|nym^R^6*X=ImE z6S7=9mmWyb7inry9N+}g`9fgC%u&#p(4`}*Ne|AbTJKDez zTJ6(46tPSzy`cwHgN{#J^nSQRkhox3c5yQol07OAuwHK_10DZ*}{kh5)pQBhy( zlq{lLVr>uu>^~f%TI;+M*WC(op<5n&?ly!O5wb(UH9BidX1TDqT~CE8CEc^l4}g5iQT0Iggip z-DjH~4KJ}?wnDBKG<&D`;?1Y_u#qzQg8LtLCw~#eRdAz>b|QU%Bx+6;zB$~Rczb$4 z2*0z?3!ciF&D0G~=t=I7KN^_|ZCtu4s?jh}eb2hMEaW!<6WADF53;?j*H6CxBU0!LWNM%gn<0 zI?i_tQ!vNJl8>AL#4^;>{z0F}1unc7##3hE zRRe3iIy>tUx%Wo}no%9dzQ||n5&o>k&jR^uf@WA5_a7-4`Qws?VO^;AA6ZUp0+8i^ zcH}GnT+%RnT+%R~V6y%vci{sEp#k|=U!mv}VGw4x+Kd2w4C&jq!|4Q*f2BfRxsQtn zW61`y=!2xhrImsy**Z|8)Z7EM5t;B}hU3vPP3KP<>jF?KvLK8Q4iSYGPH9f<2zK%J z%2JaF6#K@kNv+RQ4fC)3T&)(MQ1Ss@@8-`G3CJUBhU}mr|Byq89Z+bgI&B22TquB2 zp}TDX&iHOuDr{=PnumCUACaq}9R2wHm{ilpewIQC$qc>_cp)L7Q6~h1rb{U1m>3nY&@mn4;jj(K4$v=*KTAZp-x|f0~Cff zJP0p8Yo$>WEr{*Y_>Xbx<5R)A@aWCaOrYP)PFDaftW;niFk)~(^P=Wf-`2{iX(Odj z&|wlv3TOLejYB!^6ca_M*-j(7-7%^q*++h|N=?oQ5xxkA&G`&&h@fq%f(#|Cc-uFX zhcG5Sp$(+Sn5$qk7E>P|BCyIa-tp@AnXsqre5S%)jUker5IQJQ!u9{q>}pPo6sJ z_~WWvlRjWIno_FeY3NSK;GCBgyIwM6BF!%sOYt6-JFYzSHkJ<-Z}*)(yK+xTitF^! z-yZsk^+q*gzqMp;G1bJPSmY)}wxLHoX`J_I#3~kE{E?QU8=12m1P^m?%dqZQ3vr{e z$A9sHdr4hIZEE7^V4l6xC%_=}mf_ackdq#&gr&xBvO)y=~bekgaSzXD*T3&*JnNG4=|a z{E36+BeTFx3?io8dfYVk1^&&sR!Cdv{uC_VzIQzBxI0TuRi3!4w>3B&mYITd6@q)~ zVfw8lGKUp1?fVSbj~T3@)t?#c<)W@^VtILQA7aQ&c)m^KNyne;- zdVsL$Y*&t%7I&;j@13pXO6L}HQyOp;q#d zRtICe=%Q2Mj^-7nNyV>|q@GK4jrUFZ8!k?sUTpEa?+BfH))&L_&lpdm_;U_6U$~O5 zLxeunhI$@Lo;Y{CDhjFF&;^N$3?g+l6fYcymELzb)4xSsM$WFjSR-R#B5;QOmQ%iL z^G=;B2Ma1J?>*K#8e9siz#p>}gj`X=>JEXG`4O^uJ5ySdmAjw8_N*I;rr8{u?mZnB z#mvp@&M4WVn0MeR_iEvtkeWcUcHRykF&Ll3U(Fr7bKtvhZ`WsMCM&jy6}ViMlCZAR z9r!gNd`uxzJVVdE>07#vc;wJI#Fz?nck@S3q#!Fg9Xs0XA5uFLc^HD@Cd5%=~fZAnrrM`5&B*em{;{(iF*F*aEXGi|)eoSmjs6|F!xEciotI?G* zZ~`4o@%>+X9br%7#*`yVYCFPi$}}^mmazSnpm_+Dh=RK9bEYY~q+m-l>OeoaKL{3L z&l{pP^?OW*E9P5p!Lji^I%faEGhk`k(n(JF+)ScVowS_vmw=Xp8g$PHE}3sp$B`a zS@|Io9dz&o<=BKNDvK_@)-Y(5hx38&rrl({40`5#kKgVR`I1U#IO!YMw}jtQW0i*L zwyKw3WwHFaoOMhSt1A(nle`{=qSZ#z)-1S$mQ^iFB;njjQ{DtdCWfwd(MRHGm4JBa z=fIU9?Hz#GSrhbbqK&askl-?s9Zw0iINZoYXBm#+s$y;am#;nh3uy`3Qip&>F*SyH z4qxDqa^ytb;6e&o>2VDglQ}{eipBD;H9&jinF^&eDo9{xF^QA0qtzw`|EOk0&vw#z7?ZmG3Sd=g0DvLSB%qbxcg_mDCrxJd`pBEw<^Yq!{>rx-kdGTxIQ8d zncw$=Pt+>x;6wN8z4*ODD!P8Hp9mN!___j zeM5^d>{hcgzK<-0XZs5u?7K7kcx-O)zJbdL_i%m}ed~lC_f_xoU`f|Oz-7Uk>SNaOgFj!x}i=&MG5rlcrbC`igTkNdyvu96`^zMfJv7|9-xjQ^dq9k>E z`Eb4u{l5FUcjeN`vTIdj|BZJzG7~nj6MxQE0b1n*QWz7n!b0V`{K~Ua{kh8VIOud#@7OO(GH)Dh2c(Q1(7q!xl3;!RFz?)W zkeDd7?!NKBGqBMmo_u?f;^<}(k~eKNUjvejdOyced*sbvqI0~NU}W5_eBI*SaTbAr z_j8{jEO&L8gSuCeEe6qiDBz$mLmR_>TOuyM?w~R4fSQstsPV#NM5(ck|07S#F;+k8 zgw%n1{erQvj}a|xc(#5q>z?Hx#)OpOx0-$Dtpu907KyE_7Ib@js-fDxSMlf+%I7>| zNx9HHMWc8F79;Ou>+E~d1wM*YZEx|ctt}$ zTTkv#mgNMR-`>q#Fbu8p7Ee?TSN+U=?No!7t*-#G7e0DBcX=c!UCt@THitDj=y*Fe zT~Vr_E$>GiZ!?bf>Wq6PZSvNS`gC8uYaLZtw?YhS;Tpp|Yv*G_?V75KL%C$2^NG@J z8|UclFk0Sj!Wb(@?=MB91z!35am%r7tjgG(iCC=aESZtSnO{X@@U|kCDSnh6u`u#W zPA90{&&Z;Tv38aq;!l3PwRs5+h5W@DT(rp?C7E=KgmE7tjQ74e+I?$g#UnXQro^-j zslu@9dm5s_!xhYBsL5I5tz2=No5sUo;ZE-w+JJG%Ah%;*Jd1|Qgu87kS-}1e$V943 z?(0I)#^UO72K9GMrNF`s#1iSDvb!=(@1ErPxdF%kkJtMoF%-A42^$A^e|0LvdXiAj z#IGC-UhQIoX85uT^ZVKhB^8=B*|-9yAm;Uk(v!y<`G{|!`!76)mr_VjUVDK-WT05P zM4>C@mwngP7@Epkc2>k#a2Dd6xYrS7Ru3vpdE2r^odN5!K@8jrGb!!0K5L0Vp$mnK zo#iFDHNl-)46R~1X0~%?`^oy6OQOqY?&^4eUUjI+ivN9YDF?#i8^OH2p-uWBz8v#2-=r%VX0`@VYqUpbhPbuRSoM98N5dG8}mPi5w*e@$t=nJ?l@x2jW3^gUJ8)1wahw5LyyU zk8kxxhIQg1gkH!>dgTocJu45%)9d>*_!21}h>)j(7!|5tb8+3ZvB;}&rM}~XS0}o) zQ~kF%Y;_WV0+ctvP5fFi|#eA+o?%?fO^f>xrwC8rruEVco+RDuJL`85OOj^0SD4R zEi%SGGV^)`%!P%Tor1_evVf5VMmj8jmw)8vS+EFeeZyo>w+dhB<`Rl? zS)P;HGqdB@P2#zqBp+$N7sZo;X~6)3f=}z`K;h#%R{qqpon-noA^)b)xj34>R%Sw{ zQO(iw%*xKMO7LbpCa0YjN~wdy!ns^z-{+%-3U=Xo73=n0bQ7{HT$^Ph?s;Ref7&vV zFy*t}Hz`1DTzi&hqLQdVA(zDS{j@D=6qYogSN7Q5a)uDyeY2J=Np?17`nJ!a)~uu+ z!gQuly-ub!iq|t5E~9&Ou0b>5oF!LJ#^+k(bnMebe&gu&#KpEyog(ZM$nJNxrPA)U z=hy(A)ux8j60 zezDp_MJ;oY5GQLxemhN(ib6@8N;YD#yT(9azDj$Cf6 z-UXYaxrFX`Sn^z2(e3Lw2i>%{TCb=V%0xWf?!}X;Z&2nqDdZ6YB=;B5@>n<97L0bL zH5=13-zDaGm}MqwU*U15L}nk*^$o8%dJ5j_-o|)o0A zZfTeNT4Qc;*G$&>`?Sakp^G{BA3a9B%nYn|^}p(Ag*y_YbwZQTE<<BQ`{iGw^XuvXJN5u}Yo$)kXIl(-| zA@5QYAX?#xitvMZ55dIZoNyQ4PBO0}YCBI<*=@`!y}A;l8qB-HbKL$h{ByBrhWTWd z>U`X`(B+7wp`k`V@+*ZMgYzddlc)tL*Nc$7{E5;RXx0N#)ifUIsJ$^~_iv=TdK4Qm z7>td^tUmU{ab7-#2_X8GqHNx1v#|bVf&=(u)bgeuvwW!0nVc?&bL7#-J&7FYJK^x( zG^HMCpR-s${#>=W0y3grD_A4jjxSg*#5*nL##1hJN-LAf)~BH8=@~kBy$8p$;0ARI zS2CKJ0`K?~6#Y>Fc}RS@1E`YlCRetc$$2Gi%<$5Ns&vtymUheQzS4!c)i zS#2}-)$HwPlo1;rX42oaaJsWeObNG9)817`=(>xqO|`jHd#&I8M7nr#058x0K}-2} zpz!HMLRfxexDn;9Fwe=x+TxVOcx68rccZRK6ZoIrf zIDR{D#@XvAl<(W4p|8KXl`!d;AW7w+a1kHI&u07;)9r?ej{U|9oX}CWUgd(@V{c0I znB^HpY@lyGJS>9K#i zDP1KMOW-tr)5?(vkOMe~Md6E*E-n(pi2QB`JzB3E++bpWLIQ|{u^)nM;Vu=TkfP&? z7Qsp!d?c1rKY|wLJ^v%~4uCCHDOPl`90L&6_RS9wk7UCy&pdpF19%XCm(=)|hjBn5 zs&x9kVE@a50Kfz3&ypX0|MI{M@USx${N-OBUMm4S{Qsf;Uz3%!CWGN?AR)+yxBEH1 zIfez2!bQx_ek*hft}TE1(-v-@aGBlV$;61QCA{K5zt8}sUxo1SG#lW6TnDXsypc`J zu0`V%*zbXTQkDW5K9J?yGztd<%;y@f5sZ)bY)xTPj0|W?k2%H%vL>sL66%-D|E6t| z>VWC?k5M>2LC2@CRRU-AbJt--qmowf?lkeQ8m>!h^APc6 zRSfcbv;yZC4nDt^?#@@TbV)Ed8t~sRd!nusRd3y`;0+Ft{L|O-Z9pkUZ){pOWZx8q zh+xR61|v4Gh#t6wXOTNLkZ%yGSUNOt(S4eJILC0gkqfRBVPTXNc;Z3N1n_kMtjjO} z7W(4VNG2}5{z{ZPBXlCIGVc?0F{nGDR8|#Bg=X5uw1iJ5USfe(PWh_sJx{4pM7r;R zdH1uMYMKO`L|7q328mY_HawJ@OCV`OD_^o)pnR=-t-__I~WSi82Nc2 z_A|X~UbVT^VWjoKDiv~@OD8p{LP2AkMEZh#R3jl*kR?K?R`P3Hqi&$LnlfA5Y{quf zGPkP{7qOMCZ#qVP7Mjg*+`8N8yVIp5N%W^FU!nlgbPpDi*HFltnAY2dYp46|T<+)e z+VMj}Y>M2Uj%_j{b#fi^j+JyY3nfR~zRDCRZg$CUoAb!*P8e1i)5?W%44(Fd@6OOfpS$_#F=j1NLD}s#H&2*>2ud{e zGPow_*M8P*;M2dw(I^o|P*BJ)fnK~iqM^c)`!7C{i4p9{XHo56ZCX?EWawCyOJ!D4 z_tVPY%wxuY#Bv)#oDZq`5v9cr<2WrV?Bd(jwD%PaYHn>$3s??#%YLtMjvd}`*HixF zMYwn}!FDO2*ua!wNDS0!B)z>DM5GCtQ54Vm$48q3ERVXeOv25)jIMhr;yzLx5pb7p zHMm09*7}rhB0@t5A`agDSRxqXCDK|?zPliOP?_J8k2yMBW8@8ri)70U;tR1_1cF~7@$NU|ofqBm=2&49T z*Xa2%jsml!34G3icmslKJ){M^JCY3ld&#_qrP)X0HYWr8N4{;ut`n@=MO|3%#2^ZX zrNIgb_tk2|MlanYrQ?GaoE;TOg-RER(*{w1y5c^IClqrP6wXBZx0EEM(|s5?k{C-rslD6y%}v+wTs0Y_IUHJW zYH+;_2I8ld82AXKvC+>2nELnCyvi2bSZZ5{REsLwS8LNhJ&Ml9Qj+KQ-BFBVJR^Ch z@%JQpa+yM^R0F7oN2d=8`RX)A&hGh7CVc8NYPPbA@j)bk>}-!tkZ%>Xq=4+$R6+zs z=!=(n|JyU}HKl}|L{F!{$^$7ShjwvLS}SD|*M}mI4j!4Yer6e(OZEVyt@DhO0YUNj zZ|6MgaT@Ac6-9DrtaJp=Ac=)ypHra*SN+=g+2pL=QOp|m_3Moeh0)ou+~BF3sCMZ7 z0Hp43PX8EW5xa{+3f;Q-*Tcm;z|C`aB3130A$+Yz$r%0qXW?Pe|@M! za-k2Zz+vjd$I$u)BefByE)fFJ<_XiIpDbZ z^~Ax$C{&umgiG_GPyhqz?+Ju%+O7H0l zvA6~1r(+=c+q3I@(j@F}U}pWIt!>Ruru6(1oC5gN%c-|O-ti9%B1OIQRR7dix9N#i Q0tWmO7nTt!643McFHOHtQ2+n{ literal 0 HcmV?d00001 diff --git a/doc/networking-guide/source/misc-add-ha-for-dhcp.rst b/doc/networking-guide/source/misc-add-ha-for-dhcp.rst index 266deb1338..2b96326bc5 100644 --- a/doc/networking-guide/source/misc-add-ha-for-dhcp.rst +++ b/doc/networking-guide/source/misc-add-ha-for-dhcp.rst @@ -2,9 +2,486 @@ Adding high availability for DHCP ================================= -FIXME (Simple note, needs to be added.) -DHCP agents -~~~~~~~~~~~ +This section describes how to use the agent management (alias agent) and +scheduler (alias agent_scheduler) extensions for DHCP agents +scalability and HA. -FIXME: Content needs to be written; see DHCP agents (http://docs.openstack.org/admin-guide/networking_multi-dhcp-agents.html) +.. note:: + + Use the :command:`neutron ext-list` client command to check if these + extensions are enabled: + + .. code-block:: console + + $ neutron ext-list -c name -c alias + +-----------------+--------------------------+ + | alias | name | + +-----------------+--------------------------+ + | agent_scheduler | Agent Schedulers | + | binding | Port Binding | + | quotas | Quota management support | + | agent | agent | + | provider | Provider Network | + | router | Neutron L3 Router | + | lbaas | Load Balancing service | + | extraroute | Neutron Extra Route | + +-----------------+--------------------------+ + +.. figure:: figures/demo_multiple_dhcp_agents.png + +There will be three hosts in the setup. + +.. list-table:: + :widths: 25 50 + :header-rows: 1 + + * - Host + - Description + * - OpenStack controller host - controlnod + - Runs the Networking, Identity, and Compute services that are required + to deploy VMs. The node must have at least one network interface that + is connected to the Management Network. Note that ``nova-network`` should + not be running because it is replaced by Neutron. + * - HostA + - Runs ``nova-compute``, the Neutron L2 agent and DHCP agent + * - HostB + - Same as HostA + +**Hosts for demo** + +Configuration +~~~~~~~~~~~~~ + +**controlnode: neutron server** + +#. Neutron configuration file ``/etc/neutron/neutron.conf``: + + .. code-block:: ini + + [DEFAULT] + core_plugin = linuxbridge + rabbit_host = controlnode + allow_overlapping_ips = True + host = controlnode + agent_down_time = 5 + +#. Update the plug-in configuration file + ``/etc/neutron/plugins/linuxbridge/linuxbridge_conf.ini``: + + .. code-block:: ini + + [vlans] + tenant_network_type = vlan + network_vlan_ranges = physnet1:1000:2999 + [database] + connection = mysql://root:root@127.0.0.1:3306/neutron_linux_bridge + retry_interval = 2 + [linux_bridge] + physical_interface_mappings = physnet1:eth0 + +**HostA and HostB: L2 agent** + +#. Neutron configuration file ``/etc/neutron/neutron.conf``: + + .. code-block:: ini + + [DEFAULT] + rabbit_host = controlnode + rabbit_password = openstack + # host = HostB on hostb + host = HostA + +#. Update the plug-in configuration file + ``/etc/neutron/plugins/linuxbridge/linuxbridge_conf.ini``: + + .. code-block:: ini + + [vlans] + tenant_network_type = vlan + network_vlan_ranges = physnet1:1000:2999 + [database] + connection = mysql://root:root@127.0.0.1:3306/neutron_linux_bridge + retry_interval = 2 + [linux_bridge] + physical_interface_mappings = physnet1:eth0 + +#. Update the nova configuration file ``/etc/nova/nova.conf``: + + .. code-block:: ini + + [DEFAULT] + use_neutron=True + firewall_driver=nova.virt.firewall.NoopFirewallDriver + + [neutron] + admin_username=neutron + admin_password=servicepassword + admin_auth_url=http://controlnode:35357/v2.0/ + auth_strategy=keystone + admin_tenant_name=servicetenant + url=http://100.1.1.10:9696/ + +**HostA and HostB: DHCP agent** + +- Update the DHCP configuration file ``/etc/neutron/dhcp_agent.ini``: + + .. code-block:: ini + + [DEFAULT] + interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver + +Commands in agent management and scheduler extensions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following commands require the tenant running the command to have an +admin role. + +.. note:: + + Ensure that the following environment variables are set. These are + used by the various clients to access the Identity service. + + .. code-block:: bash + + export OS_USERNAME=admin + export OS_PASSWORD=adminpassword + export OS_TENANT_NAME=admin + export OS_AUTH_URL=http://controlnode:5000/v2.0/ + +**Settings** + +To experiment, you need VMs and a neutron network: + +.. code-block:: console + + $ nova list + + +-------------------------------------+----------+--------+--------------+ + | ID | Name | Status | Networks | + +-------------------------------------+----------+--------+--------------+ + | c394fcd0-0baa-43ae-a793-201815c3e8ce| myserver1| ACTIVE | net1=10.0.1.3| + | 2d604e05-9a6c-4ddb-9082-8a1fbdcc797d| myserver2| ACTIVE | net1=10.0.1.4| + | c7c0481c-3db8-4d7a-a948-60ce8211d585| myserver3| ACTIVE | net1=10.0.1.5| + +-------------------------------------+----------+--------+--------------+ + + $ neutron net-list + +-------------------------+------+--------------------------------------+ + | id | name | subnets | + +-------------------------+------+--------------------------------------+ + | 89dca1c6-c7d4-4f7a- | | | + | b730-549af0fb6e34 | net1 | f6c832e3-9968-46fd-8e45-d5cf646db9d1 | + +-------------------------+------+--------------------------------------+ + +**Manage agents in neutron deployment** + +Every agent that supports these extensions will register itself with the +neutron server when it starts up. + +#. List all agents: + + .. code-block:: console + + $ neutron agent-list + + +--------------------------------------+--------------------+-------+-------+----------------+ + | id | agent_type | host | alive | admin_state_up | + +--------------------------------------+--------------------+-------+-------+----------------+ + | 1b69828d-6a9b-4826-87cd-1757f0e27f31 | Linux bridge agent | HostA | :-) | True | + | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | DHCP agent | HostA | :-) | True | + | ed96b856-ae0f-4d75-bb28-40a47ffd7695 | Linux bridge agent | HostB | :-) | True | + | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | DHCP agent | HostB | :-) | True | + +--------------------------------------+--------------------+-------+-------+----------------+ + + The output shows information for four agents. The ``alive`` field shows + ``:-)`` if the agent reported its state within the period defined by the + ``agent_down_time`` option in the ``neutron.conf`` file. Otherwise the + ``alive`` is ``xxx``. + +#. List the DHCP agents that host a specified network: + + In some deployments, one DHCP agent is not enough to hold all network + data. In addition, you must have a backup for it even when the + deployment is small. The same network can be assigned to more than one + DHCP agent and one DHCP agent can host more than one network. + +#. List DHCP agents that host a specified network: + + .. code-block:: console + + $ neutron dhcp-agent-list-hosting-net net1 + + +--------------------------------------+-------+----------------+-------+ + | id | host | admin_state_up | alive | + +--------------------------------------+-------+----------------+-------+ + | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | HostA | True | :-) | + +--------------------------------------+-------+----------------+-------+ + +#. List the networks hosted by a given DHCP agent: + + This command is to show which networks a given dhcp agent is managing. + + .. code-block:: console + + $ neutron net-list-on-dhcp-agent a0c1c21c-d4f4-4577-9ec7-908f2d48622d + + +------------------------+------+---------------------------------+ + | id | name | subnets | + +------------------------+------+---------------------------------+ + | 89dca1c6-c7d4-4f7a | | | + | -b730-549af0fb6e34 | net1 | f6c832e3-9968-46fd | + | | | -8e45-d5cf646db9d1 10.0.1.0/24 | + +------------------------+------+---------------------------------+ + +#. Show agent details. + + The :command:`agent-show` command shows details for a specified agent: + + .. code-block:: console + + $ neutron agent-show a0c1c21c-d4f4-4577-9ec7-908f2d48622d + + +--------------------+---------------------------------------------------+ + | Field | Value | + +--------------------+---------------------------------------------------+ + | admin_state_up | True | + | agent_type | DHCP agent | + | alive | False | + | binary | neutron-dhcp-agent | + | configurations |{ | + | | "subnets": 1, | + | | "dhcp_driver": "neutron.agent.linux.dhcp.Dnsmasq",| + | | "networks": 1, | + | | "dhcp_lease_time": 120, | + | | "ports": 3 | + | |} | + | created_at | 2013-03-16T01:16:18.000000 | + | description | | + | heartbeat_timestamp| 2013-03-17T01:37:22.000000 | + | host | HostA | + | id | 58f4ce07-6789-4bb3-aa42-ed3779db2b03 | + | started_at | 2013-03-16T06:48:39.000000 | + | topic | dhcp_agent | + +--------------------+---------------------------------------------------+ + + In this output, ``heartbeat_timestamp`` is the time on the neutron + server. You do not need to synchronize all agents to this time for this + extension to run correctly. ``configurations`` describes the static + configuration for the agent or run time data. This agent is a DHCP agent + and it hosts one network, one subnet, and three ports. + + Different types of agents show different details. The following output + shows information for a Linux bridge agent: + + .. code-block:: console + + $ neutron agent-show ed96b856-ae0f-4d75-bb28-40a47ffd7695 + + +---------------------+--------------------------------------+ + | Field | Value | + +---------------------+--------------------------------------+ + | admin_state_up | True | + | binary | neutron-linuxbridge-agent | + | configurations | { | + | | "physnet1": "eth0", | + | | "devices": "4" | + | | } | + | created_at | 2013-03-16T01:49:52.000000 | + | description | | + | disabled | False | + | group | agent | + | heartbeat_timestamp | 2013-03-16T01:59:45.000000 | + | host | HostB | + | id | ed96b856-ae0f-4d75-bb28-40a47ffd7695 | + | topic | N/A | + | started_at | 2013-03-16T06:48:39.000000 | + | type | Linux bridge agent | + +---------------------+--------------------------------------+ + + The output shows ``bridge-mapping`` and the number of virtual network + devices on this L2 agent. + +**Manage assignment of networks to DHCP agent** + +Now that you have run the :command:`net-list-on-dhcp-agent` and +:command:`dhcp-agent-list-hosting-net` commands, you can add a network to a +DHCP agent and remove one from it. + +#. Default scheduling. + + When you create a network with one port, you can schedule it to an + active DHCP agent. If many active DHCP agents are running, select one + randomly. You can design more sophisticated scheduling algorithms in the + same way as nova-schedule later on. + + .. code-block:: console + + $ neutron net-create net2 + $ neutron subnet-create net2 9.0.1.0/24 --name subnet2 + $ neutron port-create net2 + $ neutron dhcp-agent-list-hosting-net net2 + + +--------------------------------------+-------+----------------+-------+ + | id | host | admin_state_up | alive | + +--------------------------------------+-------+----------------+-------+ + | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | HostA | True | :-) | + +--------------------------------------+-------+----------------+-------+ + + It is allocated to DHCP agent on HostA. If you want to validate the + behavior through the :command:`dnsmasq` command, you must create a subnet for + the network because the DHCP agent starts the dnsmasq service only if + there is a DHCP. + +#. Assign a network to a given DHCP agent. + + To add another DHCP agent to host the network, run this command: + + .. code-block:: console + + $ neutron dhcp-agent-network-add f28aa126-6edb-4ea5-a81e-8850876bc0a8 net2 + Added network net2 to dhcp agent + $ neutron dhcp-agent-list-hosting-net net2 + + +--------------------------------------+-------+----------------+-------+ + | id | host | admin_state_up | alive | + +--------------------------------------+-------+----------------+-------+ + | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | HostA | True | :-) | + | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | HostB | True | :-) | + +--------------------------------------+-------+----------------+-------+ + + Both DHCP agents host the ``net2`` network. + +#. Remove a network from a specified DHCP agent. + + This command is the sibling command for the previous one. Remove + ``net2`` from the DHCP agent for HostA: + + .. code-block:: console + + $ neutron dhcp-agent-network-remove a0c1c21c-d4f4-4577-9ec7-908f2d48622d \ + net2 + Removed network net2 to dhcp agent + $ neutron dhcp-agent-list-hosting-net net2 + + +--------------------------------------+-------+----------------+-------+ + | id | host | admin_state_up | alive | + +--------------------------------------+-------+----------------+-------+ + | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | HostB | True | :-) | + +--------------------------------------+-------+----------------+-------+ + + You can see that only the DHCP agent for HostB is hosting the ``net2`` + network. + +**HA of DHCP agents** + +Boot a VM on net2. Let both DHCP agents host ``net2``. Fail the agents +in turn to see if the VM can still get the desired IP. + +#. Boot a VM on net2: + + .. code-block:: console + + $ neutron net-list + + +-------------------------+------+-----------------------------+ + | id | name | subnets | + +-------------------------+------+-----------------------------+ + | 89dca1c6-c7d4-4f7a- | | | + | b730-549af0fb6e34 | net1 | f6c832e3-9968-46fd-8e45 | + | | | -d5cf646db9d1 10.0.1.0/24 | + | 9b96b14f-71b8-4918-90aa-| | | + | c5d705606b1a | net2 | 6979b71a-0ae8-448c-aa87- | + | | | 65f68eedcaaa 9.0.1.0/24 | + +-------------------------+------+-----------------------------+ + + .. code-block:: console + + $ nova boot --image tty --flavor 1 myserver4 \ + --nic net-id=9b96b14f-71b8-4918-90aa-c5d705606b1a + + .. code-block:: console + + $ nova list + + +-------------------------------------+----------+-------+---------------+ + | ID | Name | Status| Networks | + +-------------------------------------+----------+-------+---------------+ + |c394fcd0-0baa-43ae-a793-201815c3e8ce |myserver1 |ACTIVE | net1=10.0.1.3 | + |2d604e05-9a6c-4ddb-9082-8a1fbdcc797d |myserver2 |ACTIVE | net1=10.0.1.4 | + |c7c0481c-3db8-4d7a-a948-60ce8211d585 |myserver3 |ACTIVE | net1=10.0.1.5 | + |f62f4731-5591-46b1-9d74-f0c901de567f |myserver4 |ACTIVE | net2=9.0.1.2 | + +-------------------------------------+----------+-------+---------------+ + +#. Make sure both DHCP agents hosting ``net2``: + + Use the previous commands to assign the network to agents. + + .. code-block:: console + + $ neutron dhcp-agent-list-hosting-net net2 + + +--------------------------------------+-------+----------------+-------+ + | id | host | admin_state_up | alive | + +--------------------------------------+-------+----------------+-------+ + | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | HostA | True | :-) | + | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | HostB | True | :-) | + +--------------------------------------+-------+----------------+-------+ + +**Test the HA** + +#. Log in to the ``myserver4`` VM, and run ``udhcpc``, ``dhclient`` or + other DHCP client. + +#. Stop the DHCP agent on HostA. Besides stopping the + ``neutron-dhcp-agent`` binary, you must stop the ``dnsmasq`` processes. + +#. Run a DHCP client in VM to see if it can get the wanted IP. + +#. Stop the DHCP agent on HostB too. + +#. Run ``udhcpc`` in the VM; it cannot get the wanted IP. + +#. Start DHCP agent on HostB. The VM gets the wanted IP again. + +**Disable and remove an agent** + +An administrator might want to disable an agent if a system hardware or +software upgrade is planned. Some agents that support scheduling also +support disabling and enabling agents, such as L3 and DHCP agents. After +the agent is disabled, the scheduler does not schedule new resources to +the agent. After the agent is disabled, you can safely remove the agent. +Remove the resources on the agent before you delete the agent. + +To run the following commands, you must stop the DHCP agent on HostA. + +.. code-block:: console + + $ neutron agent-update --admin-state-up False \ + a0c1c21c-d4f4-4577-9ec7-908f2d48622d + $ neutron agent-list + + +--------------------------------------+--------------------+-------+-------+----------------+ + | id | agent_type | host | alive | admin_state_up | + +--------------------------------------+--------------------+-------+-------+----------------+ + | 1b69828d-6a9b-4826-87cd-1757f0e27f31 | Linux bridge agent | HostA | :-) | True | + | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | DHCP agent | HostA | :-) | False | + | ed96b856-ae0f-4d75-bb28-40a47ffd7695 | Linux bridge agent | HostB | :-) | True | + | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | DHCP agent | HostB | :-) | True | + +--------------------------------------+--------------------+-------+-------+----------------+ + +.. code-block:: console + + $ neutron agent-delete a0c1c21c-d4f4-4577-9ec7-908f2d48622d + Deleted agent: a0c1c21c-d4f4-4577-9ec7-908f2d48622d + $ neutron agent-list + + +--------------------------------------+--------------------+-------+-------+----------------+ + | id | agent_type | host | alive | admin_state_up | + +--------------------------------------+--------------------+-------+-------+----------------+ + | 1b69828d-6a9b-4826-87cd-1757f0e27f31 | Linux bridge agent | HostA | :-) | True | + | ed96b856-ae0f-4d75-bb28-40a47ffd7695 | Linux bridge agent | HostB | :-) | True | + | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | DHCP agent | HostB | :-) | True | + +--------------------------------------+--------------------+-------+-------+----------------+ + +After deletion, if you restart the DHCP agent, it appears on the agent +list again.