From de92efc0f911086e015394bf340a7c340553a789 Mon Sep 17 00:00:00 2001 From: cloudnull Date: Fri, 22 Mar 2019 11:35:04 -0500 Subject: [PATCH] Add the manila service to OSA This change adds manila to our playbook lineup and will allow deployers to use the shared filesystem as a service solution in their deployments. Depends-On: I4d95bfc15d09b7b7c0b997d7eab91509b0c63885 Change-Id: I63ee785d3241d92ea94c07f89882000cae7a0ff6 Signed-off-by: cloudnull --- ansible-role-requirements.yml | 4 + deploy-guide/source/configure.rst | 2 + doc/source/admin/troubleshooting.rst | 7 ++ .../contributor/role-maturity-matrix.html | 9 ++ .../reference/architecture/storage-arch.rst | 15 +++ .../reference/figures/manila-overview.png | Bin 0 -> 76637 bytes etc/openstack_deploy/conf.d/manila.yml.aio | 7 ++ .../conf.d/manila.yml.example | 16 ++++ .../env.d/aio_metal.yml.example | 6 ++ .../openstack_user_config.yml.example | 73 ++++++++++++++ etc/openstack_deploy/user_secrets.yml | 11 +++ inventory/env.d/manila.yml | 57 +++++++++++ inventory/group_vars/haproxy/haproxy.yml | 9 ++ inventory/group_vars/horizon_all.yml | 1 + inventory/group_vars/manila_all.yml | 33 +++++++ inventory/inventory.ini | 6 ++ .../repo_packages/openstack_services.yml | 7 ++ playbooks/os-manila-install.yml | 89 ++++++++++++++++++ playbooks/setup-openstack.yml | 1 + ...la-dashboard-support-4fcddedffb83bc28.yaml | 5 + tests/roles/bootstrap-host/defaults/main.yml | 5 + tests/roles/bootstrap-host/tasks/main.yml | 7 ++ .../tasks/prepare_aio_config.yml | 3 + .../tasks/prepare_loopback_manila.yml | 77 +++++++++++++++ .../templates/user_variables_manila.yml.j2 | 47 +++++++++ tests/test_inventory.py | 13 +++ 26 files changed, 510 insertions(+) create mode 100644 doc/source/reference/figures/manila-overview.png create mode 100644 etc/openstack_deploy/conf.d/manila.yml.aio create mode 100644 etc/openstack_deploy/conf.d/manila.yml.example create mode 100644 inventory/env.d/manila.yml create mode 100644 inventory/group_vars/manila_all.yml create mode 100644 playbooks/os-manila-install.yml create mode 100644 releasenotes/notes/add-horizon-manila-dashboard-support-4fcddedffb83bc28.yaml create mode 100644 tests/roles/bootstrap-host/tasks/prepare_loopback_manila.yml create mode 100644 tests/roles/bootstrap-host/templates/user_variables_manila.yml.j2 diff --git a/ansible-role-requirements.yml b/ansible-role-requirements.yml index b03ebcd4ed..96ec4efb5f 100644 --- a/ansible-role-requirements.yml +++ b/ansible-role-requirements.yml @@ -138,6 +138,10 @@ src: https://git.openstack.org/openstack/openstack-ansible-os_magnum version: master trackbranch: master +- name: os_manila + scm: git + src: https://git.openstack.org/openstack/openstack-ansible-os_manila + version: master - name: os_masakari scm: git src: https://git.openstack.org/openstack/openstack-ansible-os_masakari diff --git a/deploy-guide/source/configure.rst b/deploy-guide/source/configure.rst index d14dc6cddd..0bd0bb9b4e 100644 --- a/deploy-guide/source/configure.rst +++ b/deploy-guide/source/configure.rst @@ -152,6 +152,8 @@ OpenStack service roles - :role_docs:`os_magnum` +- :role_docs:`os_manila` + - :role_docs:`os_masakari` - :role_docs:`os_neutron` diff --git a/doc/source/admin/troubleshooting.rst b/doc/source/admin/troubleshooting.rst index 95a4ee06fc..7b3b866c85 100644 --- a/doc/source/admin/troubleshooting.rst +++ b/doc/source/admin/troubleshooting.rst @@ -232,6 +232,13 @@ The following table lists the commands to restart an OpenStack service. # service cinder-backup restart # service cinder-scheduler restart # service cinder-volume restart + * - Block Storage service + - .. code-block:: console + + # service manila-api restart + # service manila-data restart + # service manila-share restart + # service manila-scheduler restart * - Object Storage service - .. code-block:: console diff --git a/doc/source/contributor/role-maturity-matrix.html b/doc/source/contributor/role-maturity-matrix.html index 6c427ec04d..b453fd994d 100644 --- a/doc/source/contributor/role-maturity-matrix.html +++ b/doc/source/contributor/role-maturity-matrix.html @@ -243,6 +243,15 @@ ✔ ✔ + + os_manila + Stein + Incubated + ✔ + ✘ + ✘ + ✘ + os_masakari Stein diff --git a/doc/source/reference/architecture/storage-arch.rst b/doc/source/reference/architecture/storage-arch.rst index 8429ab3070..3031ecb615 100644 --- a/doc/source/reference/architecture/storage-arch.rst +++ b/doc/source/reference/architecture/storage-arch.rst @@ -7,6 +7,7 @@ OpenStack has multiple storage realms to consider: * Object Storage (swift) * Image storage (glance) * Ephemeral storage (nova) +* Filesystem storage (manila) Block Storage (cinder) ~~~~~~~~~~~~~~~~~~~~~~ @@ -163,3 +164,17 @@ the storage device, the Compute host, the hypervisor, and the instance. +----+---------------------------------------------------------------------+ | 3 | The hypervisor presents the disk as a device to the instance. | +----+---------------------------------------------------------------------+ + +Filesystem storage (manila) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The shared filesystem service (manila) can be configured to provide file +systems on a variety of storage back ends as supported by the +`manila_store drivers`_. + +.. figure:: ../figures/manila-overview.png + :width: 600px + + The diagram shows a basic overview of the manila service. + +.. _manila_store drivers: https://docs.openstack.org/manila/latest/configuration/shared-file-systems/drivers.html diff --git a/doc/source/reference/figures/manila-overview.png b/doc/source/reference/figures/manila-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..ef42721d89ccf07fd924fee1adfaac653370e3ab GIT binary patch literal 76637 zcmeFZRX`kD*DZ>>yL*CLaA@4!EjR=V?ry;y0>Rzg-MtCH-QC@t=Cc3&<@?WhzmMm& zs(RI0Q^y>0R);GoNFpN;Ab^2^Axle%sepk&_=ACgZ^FTRT;Z5n-30@KqOuefRgxAJ zB~x;=Gqbcd1q0(o4_4o>TT#Oj2)9!yz!4a zcQvL~9nigd{=>7ubHI0?zaqwOVA+_4uO60EUX?jP^(&zmCoxMtV!D1-7IL=yNP#i_ z&lm<%FZRRu$rf=0+@G`fbCAM4Ww&SK>Qp#|Vvj90u@C+ulJe-RRg)}MH|)!!Wi!m` z4bkNcClo|EM6yo?hWiwdnqPrj5I$y-?gYCMt^)?pv1rEJY-9k5H=MAgZcErkVHRIs z`P0a8Vv9M}p_%m^l_}lj_EaxW>m{SG)uaVAe4YMYtt(t`q4AdJQntpRx>ef95Bf3o zdD{}+zT$|81)6X z{udgL4T~m+@g>8mmYYVKy)r&!sRn5d8v8+Of9k)cjzUnze(NqC+x3U_7i_5PD1jcE z=H+6`!?~8#w6d)#6<)4N(^f`&`;yA1A3IEI)BdY3k@OErn`@=#;{)V;ECM<21V83b~5HE7xDqC?Yn>1Y6+??fxnU(*PpTw znqwB!a4n{v!pZjX_M$)|INI=H)6MwM+}(62x~SpsDkxpQ3i;54DUUB*5Im2?fRQHE8x;sXL(hn$+>uMyK6rOZVt!rlnNP?kcAMIh%PPyY`Gv<%0h5%Udj*FDMyFf1 zCd)v1pi2rp5*G;e-a;f0G&z2Vnd)L;veULA;3lp!(TeI;(d?dTQ=G;8x?*E`ZK`q8d z%0=*A#YMnpK=F<hb;JsidxC9XS(l$UE*{;; zaN5!$!(Hf~>EE5Qwo*rfq`zo?W=r5%m|&T3%znvu@fjMm8}EF`Ku<0aiak``ypzd!uA^YIYd|9j~F ziQxZFE671RJZuTtUHuM8p!2Y21dPX6s~!F6NmcPeG#Aa-W-{aV0u8#iskQZc2>-&c zeA{T7&E?xoPe_e$;tc${!mISvNx7Ms@V^G$Gl_u)&fU;axo^w-PL1mKRwraW5uV38 z`nFMx6r?>Ctif*a)y1Xnb**-L+2PW`ZJJoeZv|?U^rCttmiR2VkWIwpr6XQuySkxC z^|JHMh1~4bwp%!}7?c{`ag7KA{3iKdk6=L!_;9e4VoS?86{yAZ1qEhv>dG$W@;Sq6 z%oqF3<^?jQQAyU5xrv+2{nIe)h3J`7?WM^mFgwk)u2#-8ofTy@7xda*{Sn5+b<)=> zv@Bg-^qZkrm6%SK9JGzB(jhBUIksf{>8ih8+5U+P!X8iHxma*?pi32-`?B5Y*LrP_ z=Yb)*FTfmWRgcIf4+yKMNnYLnF8HP&WNe2WJ_AkI-3yC4G4zOLmwp(CNBbWy@A(QJ z2G%f7Jp=hFg3eQiTB+qWhm*$jSiEL_Ie8a<>FTBt zWtvNfe;EE!1>bDDGsyctG38@>8WKYLU|*LYkH(1f0ar5%s*|&;Mdc%+#S3z9lV>-& zom*6(7854+jL!4T>BSa=ZH`+AK>;FI`&#d;VZbkJ;$`fE3F56

Bi36vCu}l`R_&8(|d2$ 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
^dbov3 z@epfnhrNEth>!Z@xEs^hzv#yN&~@gaH>T5Ny+3~GeF#^9gBpR_>~fbRBu~#YI;r0u zJ%XVpCB>`NIhC`wFvh~!RZHnPvz20pP#m3>ai9e46qsVUf~z&WEXYVp-yXyPqyzT~ z#bZ$ETs1$!mkfj`{X5)mQs}<{$*aYpk~068(CqZz_Tbyv>{yQi>S8~IQw^8y#jrO< zI>!B+{b(k*Ba0P~hQ>$7)kVx|gkLg-P8a4y8}Fh_SSDzo@kB^}b=VU|Cogw3HL13z zzTWsgZ$SZi#TLhKA0NX37qeRciCW9X8#O9S)6HP3n%XBs{Ka_hN#rUpEQsHgVu%dfe+!FwH zyp&E9goyWjRUA+b8pmm9DBjbhw67*zf9!p5co~oHN+Lu-%iXvR)Mre_591EpAYa)S zTT;|BQ&X|lo2|`jZouK%2T*nqLSVH;Le&B6M1kNaB>|50BDwX_GKcl)h*2 zX{IbR_!UxgK=2I3Sr%h&oV*%de@|Xx`e6i7kT|a-%7h0CYo!pg5oMZBi@?c<9YJHQ zkfBaM(0r1;6X)6qaKYFg_3lmiySZpFJNRj(EF0X$3VinVdHHgrEGcw2nru!Cc~)2h zw?%7P?YWT;4WmQ$(#Ey?xFtKBJ6$$!-Qk!ZLLftGhHemtKc;L5SYr>32FTUEmfsrEyNvJ8v(gah0QRj@|F6!CnOAdrEectOwi{UF8{mY#4H*t8>TVR91gO~rCmt0!uPC?H`5p5GQ>I9`*?H+_qwBH$9una!)HGH%VU=;6*IJO|cl+OY}lHi8Fnu0&&;*Ed^EFG9a4jRh;G8^!`G#O+ouo+Sya z2(+n3q+=p~jyV@6jkP^v0qCIsPivG+k`)E=?cTJDlcads|xlBNTOXlF|gjdqAD`HH({1|@HX!6BvTQQ z|Hkw}JaU_?6}j0K8}z+nf7MYY#Rcn4^j}W~6sTrIArfd}I0=J5RAeR;1NOGaQ?KOmolPJbd52}~BT8g05Ax)oV6^$T^1?Wf;uu#hvO$1m>H z$+4s@lwKnmyBSQF(8kqkJ9qgtEruxN&~8TYZz&kr{C@8R=qCJ#8=wBHd;NWgLveg3Up%&|tcQ zd9)-HHc#)a2CId$aoY(^sQ{jWP}a zq3{M<@@8uq^g5-i6NckBGb6yciMyo}{a~(vsf>gEDp6~dBC3{x0vNrJ6 z;=GekNe^5x^uAdLl}ryx@jk7*D7*$?IH3+!yI8i=TB>^((=JLSHUD9`a$NFhRuh?` z$QhHCgO=KO@m)As;;`cEvS87|)B`&XDfL7ljrF?<$x>yw4$~D}O!!<=A$>u;Hg>+O zGKLbZb79d14hf1&wuHHPNCn?Z>Sj4D^b=drsp4dpzUz-E z0>Fhu+H}KNS>>$_%h{ZEXlp6tkdmcezu@$Wqot(tyt8Wqk&ohKU*C@2EdHV{HTQk4 zbx7+`YA~{?v~iJ0wQ*(Tq6v+6ooPRFai|q7Gx2>F!)Xh4g;%ZtBviDCSD2I*XA5PP z^rRvvi=eZDf%St)DhQFN{}h~M9V{v#Ds0 z1}kszpKzTp#3U6W`${MX>RpCGe4M{*VosFdp#Mr>ADy>j4U~R>vyDaG?<7~=33Ppi ziP8%bB}1i1D}87wkuc6JH`LwTK3|EjI7(l79}s5Ehrwi0X z*9P)Nl@CWh^X_l=FoMOKHlPypo3`_*njrZwH-`;_VX$jpxOfz6PE2CrMl&`DO>u&l zgpbvY{xR8hEBf8@YW+;YPnod!L4U#g3{aX^j~Cujj!@5zWmiXEI8E_E&0Oh>G;EFk zu|ndgqV=e(K$tR(fRGzTvYq^ACM7AcR@y8*h7DOT1;FWtGS|P(^I7~b`IXxqN3rG; zr<$xgCSSdd)ots0Pj$uCo9{`lyS;8UJ6KVCuV3C@mXCKg(KHKx#i_1Fh_D*fo=|J996JxxEn}9!n&`YwRGLn7J%OYhq1hy$VLqfhzczgv;EEl^VMk zOrSwuL_-QJl~nLut*;tWk-&Vq_GAEF-P=oq;~4_2g0sX8kf>LgL|-^501g--qeNzM z!AhSs1o}dXxSxdj5eH`>4sP`)CycWdV#U_+ME9o2fZ4GQb(8Dy7|pM(n-@kWnADO* zKr&!ZS!%=$o18z6ip1xW%EQWrIds|sT8|w9;kTzD&T#Z)VDb*WM1D5g<&uy$1K)== zAQifhTofHsDM06NJe8(^7Q!B|Y|w1*wKImJXW@O;ZtyD$C2r|5GUE}g{cJ!~V8{6H zcjMgy74j=%b%E%m_lk}uIt)PjAB@Q(caVhA)l}`oB#ix%Sd%>^m{D0dVP#Z*<>KJu zp1-~U>Qd>nR#(dQn59Fc>JxgWTjr!KqG2);Cb3z`n}hB-L*Dnd8~0MT@c02Z2Ixwc z>$Gw#C5kN!s!PYE!ro-6P6!VFZZs<_+k*=QKzfL#5YNgj{rcVy31_5-0|)pFNw7IRe!1ApKkU8ycvXQ$)D8~|g|HZ}w40Fr zua?bqAF;y9>T8L1%WnpRP# zGuoF3w0VN+v$79?-e%t4C`USVm{199$i4wm{>b0ltjcN8oKelG>pd3ZXbVP;FxvQf z+kPXbh6d!V*B{&qXJCVg*O5ljLV$fEGgQWMIQ4Q`w2T^uoMhB?18tOv(CZ!F+KpT|< zBzVlQ z6E`_^o*Aoj#Hy{x+C9=*0Yux*Bop2;7MwULYZEt59g<_Mo@c-@XuT(~Ta+RYLkn35E8S}W-RKp=f5oO$0ZTBozgyZlNW1+=rKm1vJ zA)iI$`b}Mb zpBO8ROVRyW0WQ;Zs>_u!k;m`DuiF;<22?r5-6!R2R!T)iU4K#Bi%o7dZdij25+k_c z_ssWPoNA}U2ab`Gi~d;Gim0>`{hBE80vlhHT|QM|2rx5|0L+-wePB5Dn{{KemWqhj zqac07^hX6cWxs@}lQmP3t9X2%soK->a#KP0dU4AQec@kSh7hYYay{3@TB1blimIbu zuYT;x$rl5({=}vY8lU#A^Gs-hUwcRha4HE#igJ9^jEb=;DrnYiHNTM6vM~LTwB1BW z1Ll#uIl#&y%%7bW!W2+N7^d z6vJ8BT_RXRhn;jZP4)6V4+)dc^@rdUM9O|RWmH58C9jvJu|@_}R*pi{<==JsOl>(b zBy{69Rz?=mwI2v1Un2$G$iQ}0?)mM1W>`gD+em~&Tzd~8cdGg>gfNIbDfe*L;wj_A zi^f_a#v6;A@hE=&@EU6~AzG1nk7^oU#^^Y&NWamq*=~5Tvw;YPOUv07&Y%Q~t*J>O zt7+-p=uaO1y{s=;2_^wPQE^^fZK)$+mAc;D82#nkj9y`y=(42L<0orXK2M7HYCOHp zCYgu+-3XspT}~LQMp#vtae2DZvcv(Nbfr4cY=qQ;vSp~qMBm?)z5LliboeUIOD*|& zr^jF&8b&8H&a81`Uj78t8d2FLuo6A@2$vmB=^{0rEm17T75}HhxDGJ3$-t7SEW7$% zcJDJ@xpUhhaAAsAjeuQ;hjj&JTD~S}^*b7GKg|&|+|>@z03ONd z;j~74_Mv={B5U)D@wUbpaf9p*mvQtC*r4@L!FciHU1}|l-U?}DMdX-E=l>0@Q~Zhp z;LcBuBdJERQLp%*{U(`K%<84!JX1Y7tR#!!+_|QG1C>2B9--El7MR zVw?+ULH-l3rdZ5sb0hNOq)uaAa<6c6Se<-tV`=JYIR|7+u0i3L;> zEWIjKQ>~)Zv+m+cwBVnyUM_04{Sj)0l=RkkvTZq4Rnc$Q9zC)tx3@Yd>XdntIoT3| ztwcvQ_@`F|257>{>w^C$HVDFjvW~%^{HGPkfqwIkfMGnw4y^F|e|08BnC^@mggENm4i{b5HDaI;m-Khh zEYVfH%2_sv8C1i7R(?TJGgS7fRxXu6_)%&DglB8NIy~73o`XHFtZiRk&plGwv~k86I1H1csgSf zYY8d*t_|p-#AN%!)e!o!4Sa zHc59m6e{n@%SEvK9CtbJxjNv-rzGqXGZFQg9T-BqBgBVg_O6E~rHAyaYKyvXP%qnz4+I{nQr< z>U}=X7N3R-DrOsDNN+!gQXN_Odtmak4*FkjyN#Lr=D7{fa3}3S+6x17q;z-CdH{!drFW z*{6wR_#W|HQ;b?5yili_v%gu|9Pi_3-}UZb-4Hp`5b}5w96K>SZpOr(UC2c&6%x!< z#L!)u)2}B(uQajhp6cF=UpC)WcxoQ5V?%1QGqwG@AF~?9=e4u?)`beItQmrjV#{S;D&`G`jKPFTxWt;RCY{UTM##kVBPv zbKmPQge9PiCpHo5iYYX0ZQ<&?Ea9*HYXEPp$9d{C7x09y+*o*I*CMGpSS*K6&fzfE zv71<4#7`$=k`Hbo-XZ+S6qP4%WGqapA`6s@oy<1<0lY5VtTuv6ZdjN76Y0sNoW%_B zM2$2tEqCu$<9q=IIXy7(H9d?b#{p#iL_bL+M~V~xvPW@ngOVTIkv%Ilq5 zNoqlfGGYJBTa2pPV1)J&`BgR1ro;5Z5Pb@nQ?+UyZ1s=`+cEWaC|;KP)xGxvi?Day z^V7lJ9E*I|QI{M=kbC#|t5DOK9IvLE;BFp*ivIEf^6=M?!zT;=ZELV#6>u$Jzx7U>$mzMN#iz% z(K`n~W_kxhK?B>1B)weEMnGbMdilLh^25a-;-fe>qK|K$A$#LQJnQ@EVw+XRNnLqF z0w6TPTmu#bT9Xv4BcYLAiD6=8O#Ho6&wE3+LWB6riL=0dk)Lr&7gyVa*IyS6Q;_|s z%1kJ`b1%agfvMXES!0u*<)LpojkOLu1&|uaFc~>+w;xl@<#3e$Ck>FagK6V%jGI0& zip%A!j@K|)PKb?Yb6mJTgtgD&G&uMd#aVaG6cIy>&i6oK^H$_jVYoL>9; ze^~&QoM~FKZ~}`KVe!>-2@|RdZ6fqni%k<7z=9JDR7QkYY*Mjy=hy0L0T3HMq_x?l z1x*|Wy?~DoR%~pTdZCHi98;+n;yW2;jx2L6wDB-s!0rTfdAd00P68d5T zW3OgI4TQw{D)p(_CZgpW3-kvW9-IWk-e(`c8TIEBw zVz(ov{aRqbU?>HBm@+;?FEd|(a%y}Kh%po0+wG4ykcB8)CuwK8OCR$7_G~AS2tvSI zj5K6;V!k&~b?iV9l~3kW_mTM!KIPtf3I&E@b`s|39X^%{oj~zOEo|O*Mj-V;8HAv~cp(zAU+foP}fGQe#kz+jcs(JGPCE zosM>FoA18v=lg!|T2-~zs$*5nInOaB=K|9(;I+1@Kh2`IhaPpVu^HlTyKYPC=lhI_ zk1?uma7g`AKL75pZzA4uCF_1aXfvn0lqz@jVPUelTe`) zqyGL@2wJ-Gr|pHTEP>q(jS1V5&X z^e;xe02J9a#~xRcawj>G37l-PMpjIcUROyh6`hCJO42Opo18RNvy2Z4=VPS>;V+2* zrgGw&Ec8%Mo`JX=_@oWDk&z)Q^=@?lDZ-0RslUq38=|mlo(AP%Ud!~jOW4Oo(FsD~g?y^+8I}Ex99R%_hbh(aOX5DuU7ab;VvAA`z|-^~ z4;M(=@gkiFOrU*)d7&mCxk7SOQ6)}RuS+apCJ4%3@VD4dJS2lx>mm!_(mgF*s8hDZ zBLF=o50r?IR;B)5JO%;QiNai(7O&SY5*rpspzj^K_fXOKFa?|GUEHW&X6mkdmiYtm zbrD~UI`YG+ciG28u%pCn;!9-f-7O8{JvJuL?MJ`)UZv6Il-LsG|4#WgAuw9kx(jdm zPsn4lW^h(&!(518isd6l|0CXj0g*4naCNuS z7zwEzYJAS4Mj!JzOWLZL1?bA~W#HAw$W!61mG8&=gxB5;A` z9#Bvicgr}BipGva`(5wMNQmg-R)rCBL}Z1A`{MtNlOmY&{3BJ^@xLeL7a0&k*;7V=$^75V0_V4rPGX7v|K>L| zkQpQ!)^c7h<-ZFWrr^uWTm9cj{UPMIVa3`5rv>whM#@5fb0BoP0kmo|oL2!J&~J^3 zGJ{`Dpgqq5FZAF4ge0a@{g17K08@_*)Vc$KgR&gaNIcotk^r7}cS}O8nd$#~NDw6o zIx^>04H3j4!Gf|;>J`AKb^F=l+SdN>09-_{J*92Sa2e_i7}R>ZP@Z$OS9^Z84{e?z z9~})>t3|M{+ML}Z(+EtY*7`z7hI`q`L<8OMr5aN5P5SSCrj*er0I^8fYBLbfOlvYvb7n%HL3kX2Mi_Xi(Gr6w|Tg$xWkawHQ$Okm9$)urRvumaA z9J)%Min6j}ZhgDcJ`@}b{I&+roC+EmnhO;(FE0;>yCMRyC#p}sdPSQXi^KgM#}8-B z6-f#caKC8u(EKpj9i%Hyb2&*l3Vgnaw~pH`l{J4_3DSU?x46&gTN8JVXgHZ)nFg`V zndq)`f9D@2S?@XST%vc6PsxosEFAEW)KiO_JL1Y>*MN*SJA~W^H7B+LG^r0L4%Y5( zH^|z%KdabTnTMNjRt&tPm1>;mD6cOS>3}?zF6m7;WEO@w7AMM7TbqC>&|po!sC1<$i)P zIh&g@PGp&1xbXKM9tXeAp!<#C8Ul7;V&3+`@s5hm-j)HA(bg9^^(5k-**W((C40-` zbWamyk4E>FvJCFDVoDks*a&2z(e)+^r`J2Py`FG1PGExxU<(8A&-drC0^tzm3KiMY z`zJE~dUFj@fft6L&6C5?Ut8pE2sdt{-SY&coheMHfF4JA(JxPn%~R7;6_x#+F9Yc3w1{rMV()c;!YqN|bK%Gc!m8Cy?7iAtF2{9V1L_K%3)s_e)%%k{Sv>?-Fsc z`Esn8cSJE*R6-Lto%c6gewpE;qVUMh&d$Nv1pPrE6sKSB;_OVGTc_U>&B0xzcx@wz zdd!OgTl-!xIL?%=@5PCddQL^iRMQk>3n9-?&LFR(4Yy}T5-ov$Pd_+B;&a8CUC4|i3-aaxF&xI0C9CjK{~ zfDGRoJy6$_)?mC4)b(P3=K)=lw}QudZN-Et*m`!k(?;&=(-2!)TOpLWYI~sus8-3cW9nTDAgm$Xf6y?%!A_ByMES_B-7=Ct`JBQHlsd zw-ufxrJEd8;oEln^=AS1b2-M+Cd$s___2QS)P32us=3t~tzP%$R;v%Ei`7IwcJOGx ze6ItZw>*9TJRjyIq)Ky8ThHLiCCeA!VyJR>-0`v z9glNneD7p(dEDUMpDu@9?~f^RT_zykEmobzT}W5UQA>_nOipsWb*rMJZ-JWzGZ4g` zs4lMdenKGN_eSSE;Y^)qO18Y9`9_tpL@TNG%zbvFy4yNFLyf}k>gWJgoF5;TwXo1U zwDS4h>?}mk7yYprU!GRAwii5Tu@cxc#ev**(Cl>)Hho(Djv=`#`a#<))~MS+U)fW^ z1UyGYL5$k%H0Q624an3J4u|uKvY9U1anciJm$Gme`?q`AuU-J#9ks%h{bVfQ@@68% z4l|XBhZ{3YyAM@K1=m4WlVaA#>TAASVH|P^lb4C=)jsUeEo$G+#BD z{_1@&@TDj_9-FMbWFrzT6R3Riz{x=|l^qp5+q}nG6JSEjy_lF^vS){YxWD)9w`baY zMJW-CxA2_Y39M01&6mnz0X<74?|)j4xBsksxtn5gI{J&lKG2Z?qd+98P}?9kYcn=a z_n0YW8;(o_w2U<`zz9Rdp{;>GAMT`~X1sCS1#btS8lIebr0%zO4n+CvDl)3Kf(hP@ zlVwUlA?O{v#HUz6f7{#c^y-lY`|=Hxb1FcgcvY6eCp_YKdI|DuM`t`3=}{`?(TCxk zTKB#60*U9-u<(G@%x;6Hs~|K2(X(2`$G7Rn9!7|{BZeO?H0E{g0-L#!f5F5vqE0 zj9T4meX5Ak{5|q&Wxg};pSoNhfNz?3!}eic zr6xB}yjMf&;$7bhxQE(Rg9CRgTvI$;{@wn=;MBN6d2QT4ImO=Sd$yd~zaFCR+Y#Ri z2eRGl+O%1Hn^dEVh9dnMFIm73_le9>hCqDFO*D`}-w7Se#Ks2RUx_u$*Ov#eZTe$x z%E@*J&A%9nmx9puMwni^xk5oK#>sGM5!i{DoD>zygV4?;+3GIDr$;Y0h|?Iw_p$y# zXV}!05(g$H_xwoPJmaE5shGUYLK|-EjDmD)899v2t5jft^Ocw<<$NirTZ5_h25dBu zJ^2r$=*adqq2K#cnsI+|aWO#H-V~{D(ow^!AE8!~5zF-vrL!bIjedd89GU+CW$m|V zg`-yMRilsK+ktfZ;kJ;A^E+p2dw*N_E8d2gCI#q6r12=O2nhJZA>QML6haYKTlA)G zYWF)My5Og&a`g@YnFOcENEkeIaV8I5bezp{FS~i%FVuYaRDn_5K{3zgDYBCF9tzXP zkBg?+{wqFzouB38iwC&w)i3Yw#VLJ6Wym%OvE4s%3fj3`q&1~L^znDpvd3><1N?=T z;;~)W8Cq0?2LfP^Rg!X(BHSq;Z&Xu%#TLMKzIN=Z>sy7mqC(UQ->^@lOpAj!WF>)g zVr`F(#|Wkz{sBu6{AxEfTRhZeH|<}iU8&Y!qESfPs<&%OaY`ANPx6BoRai~Eo#+TB ziRz-5+6jh)XZC)uoNnl}XBNieajkgxP-u5m%EnJRTaPmTxpTTuS8M;RgGDYf`PlP% z^c&F|)N-e{$JC79Gtn5v<@8nJHqgyYv5kt(v@ccA$iyUM)gVBR)Vbx<;2%qT>BW2x zZxIqcvEM@C{y~(k#q5ScLxqVOP?mV3pGA-p4ncujplcVAz8w)Sz)0Qai7Ng;sifcl z?jf7X7Sno?rcqFU%}eE@;L`f;lftigotGO z_1yOz=P-^qd+V70_cX>VA$!HSR4EkZ_4YF2<}(~z^X;!U{uWU=w`&^*&##RL48I&F z_e1RLwCz*-N|Fr>m`nuFrm~RQS<3+3i;OktcH+rJ8i6n()MG2Y3LG_uea5{l?irz72XRR!)nS1 zJw&-TaE{c;(O-Zlp3jt`l0BE>8F3F%2Skj#M6Tlrs#0sHM1jq4_GnEWiO+FUw8_?{k{n5=yt zyUn@nIb@l_hg3NCe|;)0FFPWE6_Fv)4lSAA^b zVb8>FLS%}Bm1qWObTf(I0Rw9c5-bib$U8h_xjKQbdZmdNTwh<`^X;_!TuoA*iUnYd zRl|EYdM;(JB3jDY!KRaX5L9cbQm(-Mz}9oPR`m*e=w<4x^JvZ`uM9=QEW})*Gl1$n z&T(9=o}SzNG1+t>NtuqtFx~BNnN>WC5_BfH4MNXdP*KH2op`-*Im#?@k3xIFG(q7Ut4$cn7-rCZ$@IR6z&U>IIeeBbQ^?Jej&*(l zD|gDq=P{;`e(#rUNwRg0vOikIdcVKksmmY0E_!pYei*tw`fgq{+>ZbgtfmX-FhVw8>`%3!PUk_#LHS~O^vHOd$G#9jo-df&e zd5Okb56iRZgM^jy$}D;O1_m0g@|TVXfM%=3k|92u6%?ZwQw`EU`U_Id)^TjNK7Y9B z3I;#YQy0C`giS2JNB4fZj`mpz1PlpP$X1~6hvnN5!lh*QyVfLZ)koHV7#49Fa zfgAx+KGLzU#jWitM0s=#*8w}92#flV*ED7at})m-k5U#hkK`|-k$arO$GgxC?(isz zeq1P;i^bOD(2?R3cCk##%I(%0^~I(?!XJir$n~)BvDr*j8l?`Qf*_d8DagOoR`rfw zJSso5XDG(^GD@u#-;{>}de=2d$iShIY6``MJet&;m`e#vtSkcYGN~HtGour&SGPEL zqxx28yZ2yXXdVGM&Gfxzy|M;12ZH-7(C}a-jL30OpBqw@`l)b`(ckX|lLz+O>$Q(z zwdAB=7*AWt0d|+;Z{x>H>aD$F z2ffb5jy5Tj@*uh6k6q!x$67Kp!sd_+W-FGVn~idsX>6#$7J*P6jy8#B9|fN;6NYO^ z>`AQ6E*rt4q!-cJP3Cc_nyw<>t%k}wD1gJ~Z6810^cfwdQavjvJ&*lOl8#eH`Zim- zr>%bR=Jgj8<_!3?DD^udBP_ez5_-gUf8J<%aK*jSdCi=q>X;?>?BdQ?Uj;j}S4}Mi zS_Pu$Ed{T$y!u{KJJHsn~?v55d%9fTP zGzm?FWy!i~^0bGdLvBPbnMpUiq6FOllUEzhmC?}!vW2EBwk+Mg!9Q{*aNp`P)QWPU zd#eVI`G!Umv~{|mV-RSv z=-c@?6+1AZW zTb#&XYDGccoLO>`2CyvIN@DX|%IH&0r>kdHsGV>Rn{g2;36vk*Rla0T80?yMKOd^w zmhOZu&+-Qjy5KcjHh(b_cKCNiZE1j?jh=yK1e9Z<+m;`s%k=5E^mw*ZCW;kCGL{X zwc`HctQ{P#v1!>XGBrZe`>n71ec0z(tHGIvy@EtA{$sMqpBtEU!l1kd%9k2n07A?S zwK3fv8H{V(0mPlHi{GPq8Q#-+>V?!}GY)DoO?{Xf)0@*VPY_@dqW!vzyLU$%$ur%f z9sU!87C~eUKa61D=M6dqC`?5r>2yxgl8x8e?gw9_k^2>=r#>PQh<)%-uw3-6Ps1_m znN)C~w43Mhy#_~%smvAfqUtC7D3Z<2w;}b`ZE|uzO|q~qmfn`kq`Q|Y6dSHeSi!V1 zNJV|@dk%rG)-xwimyL{oAE2f*YANNTe8b%`k;#}VgzG&RP>WRrZWyhhjbaiKE03x% zbhDL4%2pg6fo#v9^5rp=Z-re2z=~c5G=f-p4b1 zD75~65jSsR5%Y8x41D5HV8S56bbmDqPh9X~um3^m*C8oi7(gZw-N> zR@YUHZlUuZUOH|iebTN2wTL7I3j%7!^QRtw-H7Cb5^{F%L|ROZ3N0zHKO5dmOdmQX3@eH?g`^&Dm$4Hy7O+lBGso2k4 z_};IWhNHuk2v@DVskkh2t2~FaP0I zFj5g_@$HVk?b)K$16`g{`({KVvT68o`sVU_%wn}DNn@c@*2We+=s+xQI9O+D_%2ro zM|WT|)205kAxRRfhdUjpRZ-MU$kinoLw&@R)JS~{Ka6vkAHUGpoq9Hel$^*3W-GMqxoF=(U zM!il``Cq%heAF(&Rk5X4JJXlc%0Es;IO<;i`M2~pK)egkhi99?iEK<0u<8v!hpd4C z^%ro=rm!<|7?}PYew@81(8l=hC>m6Ct%46Sj8YpWuz|<@0^8Hh4YTz+j=u?3{E6|w zD#(>nu*3_ZU};90N53#HbubS>l>D|$P4jD-ySa-Afi8~#+;5YKj0_yu1EwD`8-#}H z!y;E=eboBKzcjNjJe3J1DeyyoPrG}?fh#+=l%j9*bs;PY*E`_B0_gd(mH08cUg zcs@XVpBlA1{t{pM)CnPJrF6xL0{&zHim2}$LZRfqcquw0T!;i%QL7>*{wBUx(9qD( zrtBHCl@-fA_ehJvmgOj2s!CW&6$+aGFE{HDfr7RJ>`?0mWC+rOwlSgrtitic9F6}W zi?_ybPX1=ka8#e8Rm<@%m6+g;|E?3HA$Yp|J35;>rnV44-%9vNG`O~H4JAPV>?=Fq zrH}SQmBnkrtx-Xsd4(zF`!WXG@z8^`?2_E?r%rQvBsNj?*U$d%4x8;HaX4u1c3?Aa?Wsr7MD?hw z=WyO-;jNYd)Zo^Z9x14tb#p?N2)9dVP!eo`Eh1|(lY5<99b8m_8vp)EtxjaYAy1ZL zL;dgM)#}62T~9M)1(@lB;E5%mcoL}}Ih@6ivyo!nfnSA%BPYST{%NjkP8fMzr*;%B||Fa~a1{uwVaSS4o!3ketk>?rL zcgAi^ZB~f9SzU=bg!v9PY8if^p7z71#`hGt<>xctvNRwBzo6OWSRu-C;(Yr3^)+af z|7xK$CKTDgqVX~7zN>L0nO`mU=N@^mcc~h3rT%DVok#{dgP+Jf$Vr0j_r8ta{n4~x z&)VR0`UoMvci^gny<{FcA?pn6I2t7@D=Wni?0ITlUcA6+e9_djW{#C0!o>F0dDV;_ zokJ-^y*Xc3vlR(JO@S(jI#ox9G7mQAnJr0Ifarf z3o1Bf>(_0H`-0ed^dq&?*1m@TMtHWsi}C)M%>1F!Hh~O@nf0)`q;HeWwSNVO-7Ct*=Vs4c=Xxrq*pbjL z1S9B~j_}(TlCadm1GDv;_ve0ie*RP2E*(Gb(4ckD86ikJe&`MK;e_gFTW@(g`t2YC zQK^_Ouz-8GKN`0v{Z-`=JFypw!+Jwld%NB1=QB>{GA>r>?IqgVl;(cAQ2OK5#75oI zlZ#S0^H(jSncIjhg>Md}bT=^Xa~m;OFbUT3I@S z4rP*H-8XQ(#_$}v3sXK$tMXSF^y>|SRH4!4j?UVL!{v-ktB-B|^iZO5QRZBC-yP|;G~=v9jyNYPZhSI!U4t7n50mFy~LU(2m( zZZ{}q;U+Yy(mF`~I+PIg;zcu)hOKB6X}h!ZvFiAeBpsgY))FLWb$_pW4YQ`K&BZt&ikymhD4BgAzFd{A%IsVEf`at%YifESFZU=&T#zrs@Mkh+&Q8ejQGVd!i_?p% z5=w4Tg5ABqAXAhFo7ZuCEBNiL#xvRD6jS})R4i|T#y{2@2Q-!$Ce*2Ife7eT`q76v zD^HsXOma0kjf_8ZH=kgFnwQA*>s4p zgDb+>k@J+tw4Tz^t;x%3YwRxuqz<+KTyAIbJg=iHo^mGuN7ezoL9Z^U{zbSM9o=lV zxr2mWsLFG_T8#86|MMmpD!QJ!l%LyOd*A2NKcJTiGWjZV#<6ZS2?+_5JWSI0@%dqK zf$e1^Ghc^x(fK&ZKi0SP?7oGaidZBkh(bgY$5Yq?V)Xi=l_@dl5p zheh0a`Y26t-uT{|t2&{>_a&GX&0{snQTsb?W1}4>UNNEIjfxVz($N3TCgW>i_ae%C^`#8)vd# z2OR4>t)92W6FAJ-kE{RmYCGIfagJVT)kS>&Ofup0&^w%B>Pw{@u0Om!%rL0qd`QXL`y4gwUHI-LdJIZ#L= z(fP~AUmxg{arHwXOh^jpL!ha5A3{Gtuxt*|M;!W)5GKnW=i!tlf>V)QzIFg3aU$8dO!SwwO5n`t^kaj{$_! z*ts8Xh&J~Xq#y_l{-Kh=m>2eO8WYr;Thf}HkOMjv z!7HpK@tW~gwf)PDTB$>JtIb&a@)p_@J-Dbw~4qXY8XJ=F`{7CTH_Hc$xfaFcR{#?9N)3d4@iP5q2#NHubQNN`a^n1#Qk;1IS zq>y+hUj$k|wGW+QwGNHHWo);DY`z5}(S`MuoTHMoAgCSdv} zoHJ~m3SWyMe^wQ6Cqgde2>{(AYO8`?Ry0v|u|(oSQWg!EVU4Osw|=-xgQdTZ4ZN3f zAT2~w0iEJfJkCF-D)lufBdURt83OCi z7d!vtFvlJ(-48oe>wIUm(d~GJ?RLc08&0ayPF^UV8T#7Y7lz7#7jxZ@@D&a7QAziP z(eYQAg`t|1!eZ9;`796vK z`=XzkkkzQIv^NOS`gwnsPNiy~*!T$m(%>Db@_}KswER9#Y|)QWicRc-BXE?N=-VUsUL$5#Xh(ZQENmMNV5oCnr9Js?ibb^mGvs-fTfl(eB-Ilu?H} zEA}oF$!``se)RyI(U$x_Fvq64b9>BO`Od000?dA7sI|L!`!VxQ?7z(;ljqJd-Gcjf zZzgu)`YQ1}ul>(?QqnPug+C7K!j!`Pj&HjJYc0F^0nlvMqgOh#)d147xCMmNn$6hg zpG;iz`e5%MlBwSf7}0U4)bis&b|=PMvmFV>kc&$0s=!Uo+?v(hy-uFq@#%!rTbrj21jujO$iPm8n#iBL~AFubk6NW$!mBQ%3*kJwJ zGHj?i4w7$MemuLJ_AefM%#M8aYT0m%cfo_z=B!G zoos!b_jy-B6yxf&vh6uFMTdT)Y19L0S+&AS#I;TygN`3*Qr+F-`dCV;=L-82Fp4kb z;-k#H6DvIfCPjQ>XOmR$)R-3Mu5Eh`J%8cB^;!MS-JCm_f!bG0z=-!Q;8CJ!Ft$p4DCA%} zjqby#L;aJ6+Siu1H1kvl)P*M7MaCdIM)?})ptB3nEZhjQ!TfA3dieL-6jd2k0a@t? z0A5WYi?mu}wNGyUAm;RD>|5g7{@SGETeF+xj{U>onwXE*oGbmyhbxU%*m)1}#qDXV ze&Fjx)OsAVXG}rG%=&nJNJpTI{0=eUcjCQ>lb}tCsH~*1X2yi)=P8rpr3`zrokqAy z*U1sVWfZ>mRKnD`gc=J*SM2`rJxi~JV0Q}#4CLQo?e-$F9-WFxzckAGx;)`wkNA@& zcZfXA4MYb&Py9dhxS;{QC_;ymPFG#B<1+LjA{;22j4(`$(qo(#ohxct7j=vR5zm6p zV@2G;nQt`-;lAqmcY73QLY+@|)i<=DAL_Hn9_##CJxmv!2ShR|{BzZ97V zt!zEGB?m51DVHU%a=bgWm^MQGm%4&sD$hAcuTAqb7d_F+X zzoYJ;3++Qy2HV?|jKdlm+~1wX6PPyX#@dS9;pvO#^3^VmQbXD7HYHJnH3{8kQ91p( zqb+rIINJJo{MXu>bGk_3t(tAlE7Bk~Ue-B1=`j((+C$;ns*_gfsq9g4JSlG-OMLa^ zI{CvtFzN5atN!?g#4l#YuQo?UMSrkYjA|>I!$S#HG{MO@$s^+kq~*i`-E#{?4Q-4y z8d_F#J`GWm+TLQoR^4*)#SdnQC%OU!XSX6M!Ffz(cymitl%Fm~85xE+ECOENS@9ai z+ERp9LxnH1D^Q@LTx^k!9ZZ!68$>%p8Q^Vmjp3QbK5vkTx?DXucy*w?IF7!Xo(XQ8 zR9D|5d!8Aqr&>*?dOYxAPYJ+6lZAf31fh#~T3wg+W*meCc*2sCKrXS!6 zR2UjKy5V!VNi|A`*ot7{cr*BaD!cN}r?2RBna;W~T@ItHY$pKFsjaL{LFzZXPUM$} z%OwO6;*{pfqnc?5I%9OlP`lRgQzdOvbtN?``>C@SqKzBX;`D@jw@XF%#oJ|Vd`tSW zT~Dfafvl+uvPUYXnn55vera}-9rJmt_#!U!J+W0P=FVBI;Hits(v`W7%>m#3W*#i7 z)m26f;D4H(Kbo%2dD!x3EEh(5v9B>o9vb1FHI+1LFMN2n&Ww5gyWsNonssA zU1nHbx}NdN;tPMt%rF&mzrvA)PLmBIPreqnm*nG^O@j6_L}Z`fVa*hv#7n}k!5#(L z!Ms_DrG7GRAhRjGJ$xCt=kuQ6gA|NMA~mo&J31m6e10sneMvEmjQmpP3CLJm-uh>? zl?)XRgf6O@q96iStzJvfcdC<79#t(~`-mp)L_k5<&h2SAhZpg|gi+1*bsl*+YpOJnogM zE$WGSOfyHSX`%Pqs`Iihzj3YeBt3tjZH9>8m-a`2w$eA>Ybawm z9!@?`UE;qD3D{OBXWZ+2gL*%-8N?2ELjAnIUMBUt+K@{;MF^ z+s+kP%Dpdqdg^|e_dcJ$c)Ctgk#1DHm5By|q9{>^w?R&D0C^B6Arx5lcz=_`EoE8Xt&ZN7+>@*kod87iRTp|nTwQE2?yB`GQ z)_#(OLvhPM`Wfs)zAu>YW!^0nbwf_^`2*a?f4@!`mzB0aMSy8;1OyKQD^q> zkr=*ur+6-j>iYtR)>NEnS+@ zjc`b}`GI5GjFR4f<*^!LfGUMg4fc$|l}XHWfqR+X)BDIuWPIF@Q)Lu$qV-L?-$0J2AWx z+zTUgn2iGBR{m!BI@^a z(n!&*#osporI7F>?6spF2N$2B)4Xf250V}Fu)4P^aNVa%j>%^5uN=EmW}Q7^IF`Pi z{r!bT*x~)mg%gymvE2mwcdE~eH)Wp)?nfPzJ!8$-Zk1mpyRPil_x3%oet>kGUt97M?3_5=oZ={>aU8iy3jNvC@x~vKA zwkw&y^?cp!1Zn~MxklL<`9ro-AfN@bYhK-P@i2SlCJcO-6Hb(VN3qMyE8tT-D+cX> zbscWthyI$PtDo*&hY14uLsM9R;AmGEfkXmDDHIfAua4iSt7WP8BH_G0WKb{zZRFKJ zUnCkM-b4}J5awL4qh9aBw*Q)PMDjMainr4cY1jE2Q17?49LUVZ zs3Y?NjW33D#ioE~v+hS>cisNAQv;&a1rQxS5ls3LV#e;v=fOzMi|%_dPQri9n37)q zzZU?{z`j|DfkPUnGQT9nkbF3@F!8vTNvG#S2%3UhIXg+-ihgV6&$9IxHm9>xfq&eQ zHlMkEry@?Df_*V0HP>PdFMu%k)em6IVab5pD>ML7WTg3lLT7RjcF|7cXfjApGY0~I z0TD_a=P+ zYI4(-%B|_pVTsC~At<}^@rIUCC&*1 z^_H(XDDCmOouya^p1%V@4i^p&RspF8NSeneQ_z8B3VSzV`yiCE+~i=c1d}Zwp+K*C z%Aet&Fy+Ao+HgPBmvM^fpGbtEZj&SggS|V0s|m)28uw{XPR4&1uQGZ##2^!v{oB*A zq6rbIrItnkPRVI`zySFS@|z75Z`1AIlZn)g}qjc?W++jO+NRTU^PnHeY`;*@qOdNAI$L>y(kbJ7r zf?r3)V%)z^B#{LMOBKH5o^_iduh*GQG<5KCy6Rz{^O8YOo&n!IuBw_~BC|X(!CYN) z4v;H-4ayvSp05?Mszk`WYT^~i!3aXW%%56yy>Hg@AA;R_;+H)$J;PUir!a;34~>XT zmfAr?f@n2C`;zCUx18~FfAnizGa)Ze-)mFNg1hGbflYDH$DJXw=?)Q>i`y1#kRDyO zdfj>NibEhmO9d_CM?1EN5?xh|g9stts)A*OG;~v`arxT^_Jt;*%D@wp4gQklG|xn1 z)YuaXU6OMfl%$?!{5`W;S*8vRFpXaJX7je|wo->T8Y-q5G@MF8h~g2UVRIN2qZB1AvQS2u}{G)R15+oc$TszQZ7&G0Wd>JHo0 zb)Uh}$_GtxhNtVh5wOUWkzvHgF-ZI~{ezhI!N3e!0FK3s?wwg{_PwS~mMlza-@Bf| z^K{Z7I?JCSvUcW{^KJA!sxGfl5?5>X+{a-J*?pLQ~?&m#Fp3dvnorT1;#39D{VJG&#Pkp9nQT~Ny}dr1cmj0A=uwua zA*jL}q`JW6R=Rho?9&GPqL7iHN}@t`f8Z=)Ah%N_s_lI|F z>|y@Ruo8TfkWP$teBM~N9ziw?w{LE4uFu*7;D=a4WQQwOD>Mcl0K^4;_~D0w6Hjd| z^I2nExNvuOx2U)P;0J4*VtK%+5DU4C84m!!)d1Lq%UB(P_XT(ZVdaG$-7UU+g0n&f z>4tbq(4qx^qU;!V8pP%Hg)K)Hz`FJZ-TUxcRLg|WZ$12DdX(|s^efNe{9F41o=iwD z6I0uhzOmmOw}&WU!A4riCwun4zfZ63ucpe~FVIi#=l5RpYASKiAfxR;TYJMt(XEj- zVgJsfyXkG7mlg3l%n3ob1Eg>4dNvQ`cLAz};D1Evhs}LcN@z8!eCKb!O;2n&M76d1 z>5-rQTv!Fytthm4nDT?tCPfFzcC*X_695|2E-XGje(sRiJK`%}K_suiBh9f}Kx4+qbLz_VzaG9vF*hbft{|j(4#h z-U?0fx$D%G_AgyuN(bYTsU^(5rNEVQJ9`XXuCTB{K0Pp$ZD(`~bq#zz>Nv$cRQPq^HQ8abDb8$hK|UEUb?1 z=&!HFFd_Wke`jI~MFe3uH6hudLmd1+MpVa}dm=_DmQJ2LIkA(CrQ%EOrdv4iqvDM} z(%oPECjIe^3Mykx!0%sDY~zTD%{5#?6Ve-Q{~OgEG5S09cl`WLqc1=B9a@x9Lx1`2 zZ_;;v_9)e)tfcS!;tLJ|X>Dz-q4r=WrA>wh2*P807A?%R-&fH9)gR>^bUV7i$T`vbcB?*FEj%854J`BS=Xj(saBPNdK+b#q;5Gm3EsyBS+= zqfO3?a_{4~xr-KL(z?=A0-);q$xm#Y)m)pyIAJ4{-C9jdChr}7 z$qlRMs$14k0Ve`o{C^*M@4`A)!iyDFHB{w*<^&OxOz#8sd)JWFjH$>l*%xZUC*WP(%&YVfGbikGV)?050y}~l+ z%zN0@`F-UA{uF2Y7KTj#J$3t#3{pEZ8rRkyl_IQi7%;%v4ZYiz6gvNopU^pBOttZCx!5>!*uiI&GeBnK}-T^I&Stb*s%|)IWqq zFz+QN&lm-N&>tv#Aaz{&&5_h56^UJpwucz_#c**+b@!?~yfEFXi+uEn94VmM{tWvhl;mr0ZCVT!8 zyM8$j%%7#yuE<1Xv)ws#G^h4sdg6&E=*K_) zvE6-L`SIWX{#c?U1uc)X}jIt zt|kH0z(n9K!83FJ{r8J!@Z+L$7yvqsCF|!zkl6kXitjoto;P<|;K84X_P`4Ganad^ z04a3Q%7Ck|@gTLIt{2H*O7^%r^o0Mn-~8q`G|bQ1wi)L+P68RbC}I=yn~w;u#aT=T zr<9O%N1G}tD(KID{xgjP1=9yJFCZm5+a2e2bdDdcv=@e8d30b}0PT$4EW2;H_7qnL ziHi!QKYVThMR0a)5Wma@_$Klj%yLH`tc9*yM-gBCG6iv5(%;^zrmsA*$D^&-dbEYE zy#FJ5`m4)DRxo0q9(dq^Nx5^})nHUCx#ymHL>aL+_BGPAzu8Vh?E3VCAi3rX5AUS^ zytIVg-f@ybJaLgpoO6I*Fq@O6QA2MC?fLg%m(O(lST?!KCkU_u;Zg;NQCz98zyP>m zvS*dUhY=I@ahCv;;{OkT6dBA>QRcKJDE$R!hU*{GWaZ7*4%3!$?+m(DMfT9DC`+0b zTkT)Qaeyy%Pb4Yq&0R@ZZPm1S^JZc72B4U%z#{ysU;RpeO2qy(8i==3uDL&FIpwxg z65PPB!e4N~13kTAwsl{WGygkB~^6g z&3Qmt0H5O8r-z)h04hq~RozZ|Pj=Adi?S%9w1h&~jWx_J4Ib_*yLflbFaL-ye1Rfv zyiwHpz4yf<^yNnoSKxW6Xy~TR<)`V&CD}B+Fi%)@5W}Hx8+pD3mRG<>`N}J=q}#vr zC5qte!+&f$DO~scT-MK%g1Ewm-Z@Ttha)M8iC+_j^@GDb*#`Bw!#M)^hC9!pMQ4}M z{~YY2=J3e_f*)QvOMMBstkD46tFW|zQU$<9NeofkzKGS+v({-&V|NwLH^3d-%5dA^ z0|_f1Cb)P30s#i6l00A8OuHPA61zhmslh{ZPf`-AHCIr3L!Ge3qfL_u;{f>k+0T9^&eg!+a(nScuhVfkV*%uM>H>qB&nvqOTeVMtllA~yZM?3@k@DFX-GO2SqdvGwjQX=lSgF@Kdi451f9^K~? zV&9U?SbF+v%c(3UURXB}$AP$%$$s#h(Fb0px7~J|a4#a!;iu0Zrtd#}&?`XLqMiKj zGP}E#{@?X;sOeN2z5U{DI^!Yhqs4W{R*Gk3)2-jSm@;#c#WS(uhwr*2@#W0luh6@k z+~$M^@G3>M15Efh!GeST5oL~LfIPTs)f2!afFxW{_+83`25x=*2tB;Neqw_MmQWeu zKa)?>ECa4z_2vK8kw~xijMBg;+vit*Kqd9N#eKZth8yUTOD<7FNQ(4JYBQFEMY;5K+rk~Ui|>OE}7C~vXT-TPJg*|5naO8 zK*%uP;C=>zBOI^eNeN-+>$gomm%(48a(b`Mr#t}s z6azqT+PO*L3B7Kk!0RR?&6)1gRUBf#RE<{KZgT4<9ol9n9X zOfd{_AV{K9+JkTd#JZwANK!%;Jd*xEk)mY1H*;(q+G8XO*-$g#NvYjVv+8zG$e9sg z5eI7k+Ju-zP%^C&VrY z#Xv$2CWK?4O$fn23?$lwTH%hq4z^`LtzTcl)aQH01%{HB9O9PfqA? zr^H2uibQ}rHx*GVFGEK7A7$wM_i2a&ZAXqD7u%fu6U14Qq5RN?u3bwZY<`9S?7)Kg zou|sFvT>qLqqFDs)c)ZiL3G#o)9IcIXHZ&vgt!b|90)i@H2{D@yiA-GycEG>wtDqy zDw{KhLO7Tl^5*_Vk@39a_-HvKXV2@Y{Ug~b`X8)=4~{g`@g0>^#;)OHjuFh|5=N2H z;dJa!9Syq>pO}`FNK4n1(lV~<5gZmmmwo*?IvAZu{UM&q*^&UzQ%{LJ?_@M^`fPP44EO7d`h5a)g%9^zoYPi&z~8qocLkkHp6(G) z6W!lQb80@K{H7zqLaA;PV)698BaLi<+?%(`Ww*Hc8hXp=43_7e+(yal8rF(ln~>>y zoT+!pr!8d)nu)|9?XlikpYj0kS_Xi~==FpoMu*WI8w=@6=M+&6#|J8MhSTHWA|9!# zq7fd^jWE3fr*F|29>MTa%=F=r6vXb#ARcW6b39ux2a<=dTOe3PmC?m@i67f~l2D!G zC?{Z;UEmhJWnDgf^}J##$(nfZF={(<^``2AZ{Q#J82Nlb~QCX4bsswNQ=Jrw#Nqo5&(|sU;Z_h2JT=0_&W~* zKwG^95%l$O6Yrg-p%AJW4r7owNNFL%<2-?T`y=S*t!cJSBen;R3{yI1noesyM#)`` z6v>t*OlKH4Ai)E5VjDTD7JP9?l<>3!p*@{-G_8f(!?Ac#1Kr%7UTzO+?G$TI*?Q96i1*OsKx zrv<>%Ly(FOA}XbvaMU}SyGT~AYeMLor`MIemb9lv|{ zX3FLy4n?l{%wOnO`vA3b=3ZlXB>nXp>j=7l9$sgf8&79Bqa6|eDtAN9&7^@l-#SVU z?(v)j&{ki6o?1^iY!y`Gk&XmqA7=od=X^@qR(WyV8_zJ}Ki)mmBqnq%FC~gr&q$$J z)8c4GMl9v0Mp1lJm~a<|Fj~Y1y_2W9)?PYV-%UsAyXd3J7TU*@Gmae%UR0iomx6m1 z(>EU9PwDaDv}R^1l|dIAD_EEoO$lr{jb-|haJF!D^$!VsG_?1#rL&9m(M8*jwb4#K z-cx*jE_TbM!@k7?-I!82iD><-RC=K;ga(o(0;j*(bB5ZPU>ab*k7GOcWaQA1GZVz+ z;9ry?H6S&>AOIlA%TmN~fokwK#4qTrz0u>X0P%V)TLUqPRb_JVY( z7o$5jv2|B38-2}xZ*k#l@(`(ksiy&ZCD}Zsjg8S0gE3rVcYmaAqKBuh?~C&$aYEVL zKF<1$u}*05c6)-^B*KJA-oEUVyq^DmWp!?w2?sMet(2SeG_WXrgub<8fMUY}!7i%T zL%B_AKx)9K2E6?)Phf)QHBqCPyGk41Wy0q`mRJUVceD&rS-&~Lk8bC3e5lE6Mq%DO zE(8!b-zEtF&G?l0ahq0TPQ=Z)(v70T5z34?Lw7G8pfCejc&=Q-o5#en3Bz?qkvCf^ zuO&5LJ`H%=4s;${|J0N)^_={%i!FeGDiIvZbbIR%r8CP|HhkSamQAex)m)BmUIZsk zno!Q}9-(zT=AdMAhk61N07~<*JDv@v&yf*5LU+s`r0I#S{e#4ZpP{s<(U(w3(g=NN z9+E(O|59>V5vl{0a~$Z!V^le+&4w0>m;y$M)WB5MK(H50fUr89qjCSf!u5VdvPJ;j zgiy9--P$%pxnsaDo{esCKD2IulktYQQL3-`;pPK?(>P}P!meSO&#v-7k-!9i-X1mv z%F{5(ek{otX6`Tn~ zCtECmf6lz zxD+Q?0zfq6qQW8Cl;@uyFoQFmv)PIVDwrD*A}QR7uNn4DWy0+%*?PEOjCkDT8zT>t z8t_vMc*_77&#`|OXsmxPcgNBI1>`4^uIm`4x&77vYucdoHg7ySw^(7`(y>S8z^f2$RhQiRmV`1WtFsg6L=JlFgMGu+o6HT)G}I{TGe32F_5Cjs+0=fePZw3kGcdZhbCu zY+1zde`;C9)jvujjJbkyxyp(np{&?jlcKmx)x*1wG$!*+I$?RT=bUBKX6R99S4Kg$bDkO+d9$m`p!4H?i=ijUmoY8_2>IUv6% zS|Bo6CCTF*YXAUHD+pghJRn!S)c$0(p2=?G7)!ilu@7+5J&XG}NyPTc%i;hZuS{dG zmaYTXu4h+pl!32WjwS&ll2P#OTzW8>-NI6&2BwMzJpV2~L!XOp8!zn!y(07X?Es{H zS;5(>mofmfCm9TCkR0L-i5`plQ)gYPuUj0(bYMaD+pFH+6U#R+_=~lnjzCBT2}}Se zvw%JEzhLv6NcfnYq7TewayIW3)2&BP+LPIG|El*(h#>kVa|Fit0Y@N`KlCJlvt+Jj z5a>v9R2D#GUmW|TT$a~z z9GfEnAjtBPW$TN~_m`%M`_r}!o}YOU{o2i5TVK~bOtUmeGU|)ZHwkZ|x=qe52P6QD zHt1$^R#|d?eGM$+_&gnB*Z9r=fHNFW!)P;r#}C#lWb<(B?nMK9JsZO^&HlbxT^MQG zoVkQu!}C<}f!a3W$V?jwg;nv3YzcHGp+tLr?RvC~FVw0;uA4*yo`hkjT$yvwSb@v=5l` zSx^2>3T^b6@P^Lac8zQfnwR1|4J_4h|EjN!k(?uH7`+T&^*PkbrO6|7`&{#K1m?5# z4oM&O&3D=_Zs-LbtG34|EIGH&0-58;tAa$D~gld zaT<9JsR6fZAjHNXX|fl(mH|j{xaIrk@y-Nl8PN~jnC$g@aeO)hx!YTYDAKuCD|yla z7$f5TS}dxq*wam1@CYFm(3^4zTmFnD!EJ_Rx@Z@oox-;0R9{p%q-5MtXxtwL>qIh&!_zEi#h%Q7aCN^e0CEr(TNq*i~rN> z%Tms=xin56MC$EtYuh!;r`h^RZkHPHsRq(Cne^^x4BUzrYB>M)^heNJy@5mff)a0E zY#p?jz+g|0M!}E0bLjuZfRy9@QbX*!R<*}^GaI;s-Q^qXWJzn=Hl1SxqgmHx5oiBj z0ulg*vUTPAmzSF5o&&zDgYBiG^*xCP=z_E8LPs`Z+_Kk(~?2bCxe4t75i(GY=1`wO! zEJ3qE4fCT9!^dlE8j1fK;6dZox)3UF4(2I@+6SEZH+5H!9iK-{{_J>f;uxeLLdmz^ zw~PimgC)>b0*I~ifnd6mUtT-=oU?`|^3C|ut&2pZ5?kk%+ocA4seui-i4@7yM}2On zQH%H0om_4VZbh{`+@3^jBgXhS)yJ8A86a>^BqoL_9M=ZR-U_yEt<#Vi>-7VK&@Hz3 zS@aHYuq`WOkgkgBaIlyD&-q*tB$0u;r|;3H8T{FxqSbHM*w%S$HT)>r9M8}B1cBD|3&g;hAZs1eH zVRUOlHhrfloqpGrM9}+wcDuv+>PYZ9^mJ7aaQf+$#&gs*{9ejs;ox%jwE(Z*Fe}5U zW(2GS5L!s!kLo+$T}$78`XJr^S_Sn6NC9W3?yv`UcGmrirnGYAe_eMlMKhNl5=g>% z2m%u59*)O8*fMI}gO#tQE13Rkc|Xl!kg3R3GY0A2PbMGprku~+a{w?Tceo;#b1dJX z{vpy5KpQz%KfipAvWYa&AW8Iv^E2poH!q;P)G6@cGonDbkEu2A<5l_e&m*U4U=knM zP3(TWG`7>CpN9v+=^vcv_&ξzP_SmCL|zHe0f0GnmO^>)$l-tu#KM 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 F`yVD)cP;<` literal 0 HcmV?d00001 diff --git a/etc/openstack_deploy/conf.d/manila.yml.aio b/etc/openstack_deploy/conf.d/manila.yml.aio new file mode 100644 index 0000000000..c4ad902b6b --- /dev/null +++ b/etc/openstack_deploy/conf.d/manila.yml.aio @@ -0,0 +1,7 @@ +manila-infra_hosts: + aio1: + ip: 172.29.236.100 + +manila-data_hosts: + aio1: + ip: 172.29.236.100 diff --git a/etc/openstack_deploy/conf.d/manila.yml.example b/etc/openstack_deploy/conf.d/manila.yml.example new file mode 100644 index 0000000000..efa07e13f7 --- /dev/null +++ b/etc/openstack_deploy/conf.d/manila.yml.example @@ -0,0 +1,16 @@ +# The infra nodes that will be running the manila services +manila-infra_hosts: + infra1: + ip: 172.20.236.111 + infra2: + ip: 172.20.236.112 + infra3: + ip: 172.20.236.113 + +manila-data_hosts: + data1: + ip: 172.20.236.121 + data2: + ip: 172.20.236.122 + data3: + ip: 172.20.236.123 diff --git a/etc/openstack_deploy/env.d/aio_metal.yml.example b/etc/openstack_deploy/env.d/aio_metal.yml.example index dd0d0d07a5..44de09f29d 100644 --- a/etc/openstack_deploy/env.d/aio_metal.yml.example +++ b/etc/openstack_deploy/env.d/aio_metal.yml.example @@ -69,6 +69,12 @@ container_skel: magnum_container: properties: is_metal: true + manila_container: + properties: + is_metal: true + manila_data_container: + properties: + is_metal: true masakari_monitors_container: properties: is_metal: true diff --git a/etc/openstack_deploy/openstack_user_config.yml.example b/etc/openstack_deploy/openstack_user_config.yml.example index 9bab1abaa1..4af00b3cd0 100644 --- a/etc/openstack_deploy/openstack_user_config.yml.example +++ b/etc/openstack_deploy/openstack_user_config.yml.example @@ -716,6 +716,79 @@ # rbd_secret_uuid: "{{ cinder_ceph_client_uuid }}" # # +# Example: +# +# Use the cephfs (NATIVE) backend with manila: +# +# container_vars: +# manila_default_share_type: cephfs1 +# manila_backends: +# cephfs1: +# driver_handles_share_servers: False +# share_backend_name: CEPHFS1 +# share_driver: manila.share.drivers.cephfs.driver.CephFSDriver +# cephfs_conf_path: /etc/ceph/ceph.conf +# cephfs_auth_id: manila +# cephfs_cluster_name: ceph +# cephfs_enable_snapshots: False +# filter_function: "share.size >= 0" +# goodness_function: "share.size >= 0" +# +# +# Use the cephfs + NFS backend with manila: +# +# container_vars: +# manila_default_share_type: cephfsnfs1 +# manila_backends: +# cephfsnfs1: +# driver_handles_share_servers: False +# share_backend_name: CEPHFSNFS1 +# share_driver: manila.share.drivers.cephfs.driver.CephFSDriver +# cephfs_ganesha_server_ip: 172.16.24.200 +# cephfs_protocol_helper_type: NFS +# cephfs_conf_path: /etc/ceph/ceph.conf +# cephfs_auth_id: manila +# filter_function: "share.size >= 0" +# goodness_function: "share.size >= 0" +# +# +# Example: +# +# Use the lvm backend with manila: +# +# container_vars: +# manila_default_share_type: nfs-share1 +# manila_backends: +# nfs-share1: +# share_backend_name: NFS_SHARE1 +# share_driver: manila.share.drivers.lvm.LVMShareDriver +# driver_handles_share_servers: False +# lvm_share_volume_group: manila-shares +# lvm_share_export_ip: "10.1.1.1" +# filter_function: "share.size >= 0" +# goodness_function: "share.size >= 0" +# +# +# +# Example: +# +# Use the generic backend with manila: +# +# container_vars: +# manila_default_share_type: generic +# manila_backends: +# generic: +# share_backend_name: GENERIC +# share_driver: manila.share.drivers.generic.GenericShareDriver +# driver_handles_share_servers: True +# service_instance_flavor_id: 100 +# service_image_name: manila-service-image +# service_instance_user: manila +# service_instance_password: manila +# interface_driver: manila.network.linux.interface.BridgeInterfaceDriver +# filter_function: "share.size >= 0" +# goodness_function: "share.size >= 0" +# # -------- # # Level: log_hosts (optional) diff --git a/etc/openstack_deploy/user_secrets.yml b/etc/openstack_deploy/user_secrets.yml index 5627756bb7..381332b674 100644 --- a/etc/openstack_deploy/user_secrets.yml +++ b/etc/openstack_deploy/user_secrets.yml @@ -274,3 +274,14 @@ congress_service_password: ## panko passwords panko_container_db_password: panko_service_password: + +## manila passwords +manila_container_mysql_password: +manila_oslomsg_rpc_password: +manila_profiler_hmac_key: +#NOTE: Please uncomment those +# if you want to split rpc and notify users +# Please also wire the appropriate userid in +# your user variables. +#manila_oslomsg_notify_password: +manila_service_password: diff --git a/inventory/env.d/manila.yml b/inventory/env.d/manila.yml new file mode 100644 index 0000000000..8eb230eeca --- /dev/null +++ b/inventory/env.d/manila.yml @@ -0,0 +1,57 @@ +# Copyright 2019, Rackspace US, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +component_skel: + manila_api: + belongs_to: + - manila_all + manila_scheduler: + belongs_to: + - manila_all + manila_data: + belongs_to: + - manila_all + manila_share: + belongs_to: + - manila_all + +container_skel: + manila_container: + belongs_to: + - manila-infra_containers + contains: + - manila_api + - manila_scheduler + manila_data_container: + belongs_to: + - manila-data_containers + contains: + - manila_data + - manila_share + properties: + is_metal: true + +physical_skel: + manila-data_containers: + belongs_to: + - all_containers + manila-data_hosts: + belongs_to: + - hosts + manila-infra_containers: + belongs_to: + - all_containers + manila-infra_hosts: + belongs_to: + - hosts diff --git a/inventory/group_vars/haproxy/haproxy.yml b/inventory/group_vars/haproxy/haproxy.yml index 972c6e0cad..b70405c5e2 100644 --- a/inventory/group_vars/haproxy/haproxy.yml +++ b/inventory/group_vars/haproxy/haproxy.yml @@ -266,6 +266,15 @@ haproxy_default_services: haproxy_backend_options: - "httpchk GET / HTTP/1.0\\r\\nUser-agent:\\ osa-haproxy-healthcheck" haproxy_service_enabled: "{{ groups['magnum_all'] is defined and groups['magnum_all'] | length > 0 }}" + - service: + haproxy_service_name: manila + haproxy_backend_nodes: "{{ groups['manila_all'] | default([]) }}" + haproxy_ssl: "{{ haproxy_ssl }}" + haproxy_port: 8786 + haproxy_balance_type: http + haproxy_backend_options: + - "httpchk HEAD / HTTP/1.0\\r\\nUser-agent:\\ osa-haproxy-healthcheck" + haproxy_service_enabled: "{{ groups['manila_all'] is defined and groups['manila_all'] | length > 0 }}" - service: haproxy_service_name: masakari_api haproxy_backend_nodes: "{{ groups['masakari_api'] | default([]) }}" diff --git a/inventory/group_vars/horizon_all.yml b/inventory/group_vars/horizon_all.yml index c5938cbdcc..18f7619d50 100644 --- a/inventory/group_vars/horizon_all.yml +++ b/inventory/group_vars/horizon_all.yml @@ -19,6 +19,7 @@ horizon_enable_cinder_backup: "{{ hostvars['localhost']['cinder_service_backup_p horizon_enable_heat_ui: "{{ (groups['heat_all'] is defined) and (groups['heat_all'] | length > 0) }}" horizon_enable_ironic_ui: "{{ (groups['ironic_all'] is defined) and (groups['ironic_all'] | length > 0) }}" horizon_enable_magnum_ui: "{{ (groups['magnum_all'] is defined) and (groups['magnum_all'] | length > 0) }}" +horizon_enable_manila_ui: "{{ (groups['manila_all'] is defined) and (groups['manila_all'] | length > 0) }}" horizon_enable_masakari_ui: "{{ (groups['masakari_all'] is defined) and (groups['masakari_all'] | length > 0) }}" horizon_enable_designate_ui: "{{ (groups['designate_all'] is defined) and (groups['designate_all'] | length > 0) }}" horizon_enable_octavia_ui: "{{ (groups['octavia-infra_all'] is defined) and (groups['octavia-infra_all'] | length > 0) }}" diff --git a/inventory/group_vars/manila_all.yml b/inventory/group_vars/manila_all.yml new file mode 100644 index 0000000000..0ac500afb9 --- /dev/null +++ b/inventory/group_vars/manila_all.yml @@ -0,0 +1,33 @@ +--- +# Copyright 2019, Rackspace US, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Set the available protocol list +manila_enabled_share_protocols: + - NFS + - CIFS + - CEPHFS + +_manila_default_share_type: "{{ (manila_backends | default({})).keys() }}" +manila_default_share_type: "{{ ((_manila_default_share_type | length) > 0) | ternary(_manila_default_share_type[0], null) }}" + +# V1 api config +manila_service_publicuri: "{{ openstack_service_publicuri_proto|default(manila_service_proto) }}://{{ external_lb_vip_address }}:{{ manila_service_port }}" +manila_service_internaluri: "{{ openstack_service_internaluri_proto|default(manila_service_proto) }}://{{ internal_lb_vip_address }}:{{ manila_service_port }}" +manila_service_adminuri: "{{ openstack_service_adminuri_proto|default(manila_service_proto) }}://{{ internal_lb_vip_address }}:{{ manila_service_port }}" + +# V2 api config +manila_service_v2_publicuri: "{{ openstack_service_publicuri_proto|default(manila_service_proto) }}://{{ external_lb_vip_address }}:{{ manila_service_v2_port }}" +manila_service_v2_internaluri: "{{ openstack_service_internaluri_proto|default(manila_service_proto) }}://{{ internal_lb_vip_address }}:{{ manila_service_v2_port }}" +manila_service_v2_adminuri: "{{ openstack_service_adminuri_proto|default(manila_service_proto) }}://{{ internal_lb_vip_address }}:{{ manila_service_v2_port }}" diff --git a/inventory/inventory.ini b/inventory/inventory.ini index 41e843b15f..fdc1cc1cc8 100644 --- a/inventory/inventory.ini +++ b/inventory/inventory.ini @@ -135,6 +135,12 @@ ironic_server [magnum_all] +[manila_all:children] +manila_api +manila_scheduler +manila_data +manila_share + [masakari_all:children] masakari_api masakari_engine diff --git a/playbooks/defaults/repo_packages/openstack_services.yml b/playbooks/defaults/repo_packages/openstack_services.yml index 2a5fe4f9c8..9ed6d8d1f1 100644 --- a/playbooks/defaults/repo_packages/openstack_services.yml +++ b/playbooks/defaults/repo_packages/openstack_services.yml @@ -147,6 +147,13 @@ keystone_git_project_group: keystone_all keystone_git_track_branch: master +## Manila service +manila_git_repo: https://git.openstack.org/openstack/manila +manila_git_install_branch: 54bce0a9ca07952cd97cd2bc8641f81ab2c49af5 # HEAD as of 22.03.2019 +manila_git_project_group: manila_all +manila_git_track_branch: master + + ## Neutron service neutron_git_repo: https://git.openstack.org/openstack/neutron neutron_git_install_branch: c42287eef395886c1f32e21ac5b2370f8dc7ca28 # HEAD as of 23.03.2019 diff --git a/playbooks/os-manila-install.yml b/playbooks/os-manila-install.yml new file mode 100644 index 0000000000..864b1a52c4 --- /dev/null +++ b/playbooks/os-manila-install.yml @@ -0,0 +1,89 @@ +--- +# Copyright 2018, Rackspace US, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- name: Install manila services + hosts: "manila_all" + gather_facts: "{{ osa_gather_facts | default(True) }}" + user: root + environment: "{{ deployment_environment_variables | default({}) }}" + vars_files: + - "defaults/repo_packages/openstack_services.yml" + - "defaults/{{ install_method }}_install.yml" + tags: + - manila + pre_tasks: + # In order to ensure that any container, software or + # config file changes which causes a container/service + # restart do not cause an unexpected outage, we drain + # the load balancer back end for this container. + - include_tasks: common-tasks/haproxy-endpoint-manage.yml + vars: + haproxy_backend: manila_api-back + haproxy_state: disabled + when: + - "'manila_api' in group_names" + - "groups['manila_api'] | length > 1" + + - name: Configure container (non-nfs) + include_tasks: "common-tasks/os-{{ container_tech | default('lxc') }}-container-setup.yml" + vars: + list_of_bind_mounts: "{{ manila_container_bind_mounts }}" + when: + - not is_metal + - manila_default_store == "file" + - (manila_nfs_client is not defined) or (manila_nfs_client | length == 0) + + - name: Configure container (nfs) + include_tasks: "common-tasks/os-{{ container_tech | default('lxc') }}-container-setup.yml" + when: + - not is_metal + - (manila_default_store != "file") or (manila_nfs_client is defined) + + - name: Configure log directories (on metal) + include_tasks: common-tasks/os-log-dir-setup.yml + vars: + log_dirs: + - src: "/openstack/log/{{ inventory_hostname }}-manila" + dest: "/var/log/manila" + + - include_tasks: common-tasks/unbound-clients.yml + when: + - hostvars['localhost']['resolvconf_enabled'] | bool + + roles: + - role: "os_manila" + when: + - inventory_hostname in groups['manila_api'] + - role: "os_manila" + when: + - not inventory_hostname in groups['manila_api'] + + post_tasks: + - include_tasks: "common-tasks/rsyslog-client.yml" + vars: + rsyslog_client_log_rotate_file: manila_log_rotate + rsyslog_client_log_dir: "/var/log/manila" + rsyslog_client_config_name: "99-manila-rsyslog-client.conf" + + # Now that container changes are done, we can set + # the load balancer back end for this container + # to available again. + - include_tasks: common-tasks/haproxy-endpoint-manage.yml + vars: + haproxy_backend: manila_api-back + haproxy_state: enabled + when: + - "'manila_api' in group_names" + - "groups['manila_api'] | length > 1" diff --git a/playbooks/setup-openstack.yml b/playbooks/setup-openstack.yml index dd859e4e17..db33e944bf 100644 --- a/playbooks/setup-openstack.yml +++ b/playbooks/setup-openstack.yml @@ -35,6 +35,7 @@ - import_playbook: os-tacker-install.yml - import_playbook: os-blazar-install.yml - import_playbook: os-masakari-install.yml +- import_playbook: os-manila-install.yml # This is not an OpenStack service, but integrates with Keystone and must be # deployed afterward. diff --git a/releasenotes/notes/add-horizon-manila-dashboard-support-4fcddedffb83bc28.yaml b/releasenotes/notes/add-horizon-manila-dashboard-support-4fcddedffb83bc28.yaml new file mode 100644 index 0000000000..eaac26594b --- /dev/null +++ b/releasenotes/notes/add-horizon-manila-dashboard-support-4fcddedffb83bc28.yaml @@ -0,0 +1,5 @@ +--- +features: + - The os_horizon role now has support for the horizon manila-ui dashboard. The + dashboard may be enabled by setting ``horizon_enable_manila_ui`` to ``True`` + in ``/etc/openstack_deploy/user_variables.yml``. diff --git a/tests/roles/bootstrap-host/defaults/main.yml b/tests/roles/bootstrap-host/defaults/main.yml index 731d3a5e3f..2649cf04bf 100644 --- a/tests/roles/bootstrap-host/defaults/main.yml +++ b/tests/roles/bootstrap-host/defaults/main.yml @@ -66,6 +66,11 @@ bootstrap_host_loopback_nova: yes # Size of the Nova loopback disk in gigabytes (GB). bootstrap_host_loopback_nova_size: 1024 # +# Boolean option to deploy the loopback disk for Manila +bootstrap_host_loopback_manila: yes +# Size of the Manila loopback disk in gigabytes (GB). +bootstrap_host_loopback_manila_size: 1024 +# # Boolean option to deploy the loopback disk for machines bootstrap_host_loopback_machines: yes # Size of the machines loopback disk in gigabytes (GB). diff --git a/tests/roles/bootstrap-host/tasks/main.yml b/tests/roles/bootstrap-host/tasks/main.yml index 20dfaf7433..ee6781c5af 100644 --- a/tests/roles/bootstrap-host/tasks/main.yml +++ b/tests/roles/bootstrap-host/tasks/main.yml @@ -110,6 +110,13 @@ tags: - prepare-loopback +# Prepare the Manila data storage loopback disks +- include: prepare_loopback_manila.yml + when: + - bootstrap_host_loopback_manila | bool + tags: + - prepare-loopback + # Prepare the Ceph cluster UUID and loopback disks - include: prepare_ceph.yml when: diff --git a/tests/roles/bootstrap-host/tasks/prepare_aio_config.yml b/tests/roles/bootstrap-host/tasks/prepare_aio_config.yml index 1e9f08a812..7bd2f24202 100644 --- a/tests/roles/bootstrap-host/tasks/prepare_aio_config.yml +++ b/tests/roles/bootstrap-host/tasks/prepare_aio_config.yml @@ -190,6 +190,9 @@ - src: user_variables_barbican.yml.j2 dest: user_variables_barbican.yml condition: "{{ 'barbican' in bootstrap_host_services }}" + - src: user_variables_manila.yml.j2 + dest: user_variables_manila.yml + condition: "{{ 'manila' in bootstrap_host_services }}" - name: Copy modified cinder-volume env.d file for ceph scenario copy: diff --git a/tests/roles/bootstrap-host/tasks/prepare_loopback_manila.yml b/tests/roles/bootstrap-host/tasks/prepare_loopback_manila.yml new file mode 100644 index 0000000000..ed4fe4bfe6 --- /dev/null +++ b/tests/roles/bootstrap-host/tasks/prepare_loopback_manila.yml @@ -0,0 +1,77 @@ +--- +# Copyright 2015, Rackspace US, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +- name: Create sparse manila file + command: "truncate -s {{ bootstrap_host_loopback_manila_size }}G /openstack/manila.img" + args: + creates: /openstack/manila.img + register: manila_create + tags: + - manila-file-create + +- name: Run the systemd service role + include_role: + name: systemd_service + private: true + vars: + systemd_services: + - service_name: "loop-manila" + config_overrides: + Unit: + Description: no + After: systemd-udev-settle.service + Before: lvm2-activation-early.service + Wants: systemd-udev-settle.service + Service: + RemainAfterExit: yes + service_type: oneshot + execstarts: + - /bin/bash -c "/sbin/losetup $(/sbin/losetup -f) /openstack/manila.img" + - /sbin/pvscan + execstops: + - /bin/bash -c "losetup -d $(losetup -l | awk '/manila.img/ {print $1}')" + enabled: yes + state: started + systemd_tempd_prefix: openstack + tags: + - manila-config + +- name: Get loopback device + shell: "losetup -l | awk '/manila.img/ {print $1}'" + changed_when: false + register: manila_losetup + tags: + - skip_ansible_lint + +- name: Make LVM physical volume on the manila device + shell: "pvcreate {{ manila_losetup.stdout }} && touch /openstack/manila.pvcreate" + args: + creates: "/openstack/manila.pvcreate" + tags: + - skip_ansible_lint + - manila-lvm-pv + +- name: Run pvscan + command: "pvscan" + changed_when: false + tags: + - manila-lvm-pv + +- name: Add manila-shares volume group + lvg: + vg: manila-shares + pvs: "{{ manila_losetup.stdout }}" + tags: + - manila-lvm-vg diff --git a/tests/roles/bootstrap-host/templates/user_variables_manila.yml.j2 b/tests/roles/bootstrap-host/templates/user_variables_manila.yml.j2 new file mode 100644 index 0000000000..20b8cd99fd --- /dev/null +++ b/tests/roles/bootstrap-host/templates/user_variables_manila.yml.j2 @@ -0,0 +1,47 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +tempest_plugins: + - name: manila-tempest-plugin + repo: https://git.openstack.org/openstack/manila-tempest-plugin + branch: master + +tempest_test_whitelist: + - manila_tempest_tests.tests.scenario.test_share_basic_ops + +tempest_tempest_conf_overrides: + share: + image_with_share_tools: manila-service-image + image_password: manila + enable_protocols: nfs + enable_ip_rules_for_protocols: nfs + enable_ro_access_level_for_protocols: nfs + suppress_errors_in_cleanup: true + share_creation_retry_number: 3 + run_ipv6_tests: False + +manila_backends: + nfs-share1: + share_backend_name: NFS_SHARE1 + share_driver: manila.share.drivers.lvm.LVMShareDriver + driver_handles_share_servers: False + lvm_share_volume_group: manila-shares + lvm_share_export_ip: "172.29.244.100" + generic: + share_backend_name: GENERIC + share_driver: manila.share.drivers.generic.GenericShareDriver + driver_handles_share_servers: True + service_instance_flavor_id: 100 + service_image_name: manila-service-image + service_instance_user: manila + service_instance_password: manila + interface_driver: manila.network.linux.interface.BridgeInterfaceDriver diff --git a/tests/test_inventory.py b/tests/test_inventory.py index b51d60a5fa..07fb04a1a3 100644 --- a/tests/test_inventory.py +++ b/tests/test_inventory.py @@ -278,6 +278,19 @@ class TestAnsibleInventoryFormatConstraints(unittest.TestCase): 'magnum-infra_hosts', 'magnum_all', 'magnum_container', + 'manila_all', + 'manila_api', + 'manila_container', + 'manila_data', + 'manila-data_all', + 'manila_data_container', + 'manila-data_containers', + 'manila-data_hosts', + 'manila-infra_all', + 'manila-infra_containers', + 'manila-infra_hosts', + 'manila_scheduler', + 'manila_share', 'masakari_all', 'masakari_api', 'masakari_api_container',