From a11ae4386fb0ecfd6fb25fea01c3938bc4a5f8bc Mon Sep 17 00:00:00 2001 From: waylon <1158341873@qq.com> Date: Tue, 18 Jul 2023 15:28:17 +0800 Subject: [PATCH] =?UTF-8?q?minor:=20=E4=BA=91=E5=8C=BA=E5=9F=9F=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=E5=85=A8=E9=87=8F=E5=88=87=E6=8D=A2=E4=B8=BA=E7=AE=A1?= =?UTF-8?q?=E6=8E=A7=E5=8C=BA=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/features/variables_engine.md | 2 +- docs/release.md | 10 +-- en_docs/features/variables_engine.md | 2 +- gcloud/utils/cmdb.py | 8 +-- gcloud/utils/ip.py | 8 +-- locale/en/LC_MESSAGES/django.mo | Bin 113505 -> 113735 bytes locale/en/LC_MESSAGES/django.po | 60 ++++++++--------- locale/en/LC_MESSAGES/djangojs.mo | Bin 38523 -> 38514 bytes locale/en/LC_MESSAGES/djangojs.po | 62 +++++++++--------- locale/zh_hans/LC_MESSAGES/django.mo | Bin 93125 -> 93195 bytes locale/zh_hans/LC_MESSAGES/django.po | 56 ++++++++-------- locale/zh_hans/LC_MESSAGES/djangojs.mo | Bin 32671 -> 34161 bytes locale/zh_hans/LC_MESSAGES/djangojs.po | 58 ++++++++-------- packages/blueking/component/apis/cc.py | 7 +- packages/blueking/component/apis/nodeman.py | 2 +- pipeline_plugins/cmdb_ip_picker/utils.py | 9 +-- .../collections/sites/open/cc/base.py | 22 +++---- .../sites/open/cc/batch_update_host/v1_0.py | 9 ++- .../collections/sites/open/cc/ipv6_utils.py | 34 +++++----- .../open/docs/job/fast_push_file/v2_0.md | 4 +- .../open/docs/job/job_local_content_upload.md | 2 +- .../open/docs/nodeman/nodeman_create_task.md | 4 +- .../docs/nodeman/nodeman_plugin_operate.md | 2 +- .../base_service.py | 19 ++---- .../all_biz_fast_push_file/base_service.py | 25 +++---- .../job/execute_task/execute_task_base.py | 15 ++--- .../sites/open/job/execute_task/legacy.py | 9 ++- .../open/job/fast_execute_script/v1_0.py | 19 ++---- .../open/job/fast_execute_script/v1_1.py | 19 ++---- .../sites/open/job/fast_push_file/v1_0.py | 27 +++----- .../sites/open/job/fast_push_file/v2_0.py | 33 +++------- .../job/local_content_upload/base_service.py | 26 +++----- .../sites/open/nodeman/create_task/legacy.py | 18 ++--- .../sites/open/nodeman/create_task/v2_0.py | 23 ++----- .../sites/open/nodeman/create_task/v3_0.py | 27 +++----- .../sites/open/nodeman/create_task/v4_0.py | 23 ++----- .../sites/open/nodeman/plugin_operate/v1_0.py | 16 ++--- .../sites/open/nodeman/plugin_operate/v2_0.py | 11 ++-- .../job/all_biz_fast_execute_script/v1_0.js | 6 +- .../job/all_biz_fast_execute_script/v1_1.js | 6 +- .../atoms/job/all_biz_fast_push_file/v1_0.js | 4 +- .../atoms/job/all_biz_fast_push_file/v1_1.js | 4 +- .../atoms/job/fast_execute_script/v1_0.js | 2 +- .../atoms/job/fast_execute_script/v1_1.js | 2 +- .../atoms/job/fast_execute_script/v1_2.js | 2 +- .../atoms/job/fast_push_file/v1_0.js | 4 +- .../atoms/job/fast_push_file/v2_0.js | 4 +- .../atoms/job/fast_push_file/v2_1.js | 2 +- .../atoms/job/job_fast_execute_script.js | 2 +- .../atoms/job/job_fast_push_file.js | 2 +- .../atoms/job/job_push_local_files/v1_0_0.js | 2 +- .../atoms/job/job_push_local_files/v2_0.js | 2 +- .../atoms/job/job_push_local_files/v2_1.js | 2 +- .../atoms/job/local_content_upload/v1_0.js | 2 +- .../atoms/job/local_content_upload/v1_1.js | 2 +- .../atoms/nodeman/create_task/legacy.js | 2 +- .../atoms/nodeman/create_task/v2_0.js | 2 +- .../atoms/nodeman/create_task/v3_0.js | 6 +- .../atoms/nodeman/create_task/v4_0.js | 6 +- .../atoms/nodeman/plugin_operate/v1_0.js | 4 +- .../atoms/nodeman/plugin_operate/v2_0.js | 2 +- .../components/utils/sites/open/utils.py | 30 ++++----- pipeline_plugins/resource_replacement/base.py | 14 ++-- .../resource_replacement/test_cc_suites.py | 49 +++----------- .../variables/collections/sites/open/cc.py | 32 +++------ .../docs/cmdb/var_set_module_ip_selector.md | 2 +- .../variables/cmdb/var_cmdb_ip_filter.js | 4 +- .../static/variables/cmdb/var_ip_picker.js | 2 +- .../cmdb/var_set_module_ip_selector.js | 2 +- version_logs_md/V3.10.6_2021-11-25.md | 2 +- version_logs_md/V3.16.0_2022-02-16.md | 2 +- version_logs_md/V3.5.2_2020-02-07.md | 2 +- version_logs_md/V3.6.39_2021-05-13.md | 2 +- version_logs_md/V3.6.42_2021-06-29.md | 2 +- version_logs_md/V3.7.1_2021-09-03.md | 2 +- 75 files changed, 368 insertions(+), 522 deletions(-) diff --git a/docs/features/variables_engine.md b/docs/features/variables_engine.md index f2aea706e8..eae8c20271 100644 --- a/docs/features/variables_engine.md +++ b/docs/features/variables_engine.md @@ -68,7 +68,7 @@ class AgentInstallService(Service): ### IP选择器 可以选择业务下的静态 IP 列表,也可以选择业务拓扑或者输入业务拓扑某些层级的动态生成 IP,变量的值是当前业务下合法的主机内网 IP, -用户可以选择是否包含云区域信息,多个用英文逗号 `,` 分隔,如 `127.0.0.1,127.0.0.2` 或 `0:127.0.0.1,0:127.0.0.2`(假设 IP 所在云区域 ID 是 0), +用户可以选择是否包含管控区域信息,多个用英文逗号 `,` 分隔,如 `127.0.0.1,127.0.0.2` 或 `0:127.0.0.1,0:127.0.0.2`(假设 IP 所在管控区域 ID 是 0), 不合法的IP(包括非IP字符和非当前业务下的IP)都会被自动过滤掉。 ### 下拉框 diff --git a/docs/release.md b/docs/release.md index ff9ea26a18..f5148353f3 100644 --- a/docs/release.md +++ b/docs/release.md @@ -152,7 +152,7 @@ - 修复ProjectConfig和StaffGroup接口无权限中心校验问题 - improvement - 注册所有常用操作到IAM - - 从ip_str中匹配IP信息在纯IP格式和云区域ID:IP格式下支持host_innerip为多ip情况 + - 从ip_str中匹配IP信息在纯IP格式和管控区域ID:IP格式下支持host_innerip为多ip情况 ## 3.7.0 @@ -279,7 +279,7 @@ - bugfix - 修复集群资源筛选变量导入excel数据时ip列为空问题 - 修复修复 lazy 类型变量支持预渲染引入的问题问题 - - 修复集群模块选择器手动输入 IP 可能会输出位于多个云区域下重复 IP 的问题 + - 修复集群模块选择器手动输入 IP 可能会输出位于多个管控区域下重复 IP 的问题 - 修复无法选择非标准空闲机池模块下 IP 的问题 - 修复表格tag操作按钮在任务执行开始后禁用态不生效问题 - improvement @@ -325,7 +325,7 @@ - 密码变量中公私钥支持从环境变量中读取 - 任务节点强制失败后支持重试和跳过 - 职能化任务通过普通任务打开时重定向到职能化任务链接 - - 优化批量修改主机属性插件校验逻辑,支持云区域ID:IP的填写方式 + - 优化批量修改主机属性插件校验逻辑,支持管控区域ID:IP的填写方式 - 插件列表按照版本号递增排序 - 优化 快速执行脚本v1.0版本 脚本名称模糊匹配问题 - IP 选择器筛选条件支持自定义分隔符 @@ -1177,7 +1177,7 @@ ## 3.5.2 - 新功能 - - IP 选择器支持配置值是否带云区域 ID + - IP 选择器支持配置值是否带管控区域 ID - 后端添加版本日志功能 - 优化项 - 用户第一次进入应用时,为其在常用业务中初始化有权限的业务 @@ -1411,7 +1411,7 @@ - 非数据列表页面添加返回按钮,用户可以快速返回到之前的数据列表页面 - 二级导航的父级允许点击,默认打开二级导航列表的第一项 - 二级导航列表选中态样式优化 - - IP 选择器样式多处优化,去掉静态IP选择列表中云区域中多余右括号 + - IP 选择器样式多处优化,去掉静态IP选择列表中管控区域中多余右括号 - 导出流程弹窗和编辑周期任务弹窗按钮添加loading效果 - bug fix - 修复数据统计时间筛选条件右侧点展开关闭弹窗击无效的问题 diff --git a/en_docs/features/variables_engine.md b/en_docs/features/variables_engine.md index 149b0f0869..6c35467f80 100644 --- a/en_docs/features/variables_engine.md +++ b/en_docs/features/variables_engine.md @@ -68,7 +68,7 @@ It has been updated to "IP selector". This might be removed in future versions. ### IP Selector You can select a static IP list in the business, select the dynamically generated IPs from business topology or input the dynamically generated IPs from certain layer of business topology. The value of the variable is the legal intranet IP of the host machine in the current business. -The user can decide whether to include cloud region information. Multiple IPs are separated by comma `,` For example, `127.0.0.1,127.0.0.2` or `0:127.0.0.1,0:127.0.0.2` (assuming the cloud region ID of these IPs is 0). +The user can decide whether to include BK-Net information. Multiple IPs are separated by comma `,` For example, `127.0.0.1,127.0.0.2` or `0:127.0.0.1,0:127.0.0.2` (assuming the BK-Net ID of these IPs is 0). Illegal IPs (including non-IP characters and IPs not in the current business) will be automatically filtered. ### Dropdown Box diff --git a/gcloud/utils/cmdb.py b/gcloud/utils/cmdb.py index f3fc856cb7..2b535ddcab 100644 --- a/gcloud/utils/cmdb.py +++ b/gcloud/utils/cmdb.py @@ -105,7 +105,7 @@ def get_business_host(username, bk_biz_id, supplier_account, host_fields, ip_lis :type host_fields: list :param ip_list: 主机内网 IP 列表 :type ip_list: list - :param bk_cloud_id: IP列表对应的云区域 + :param bk_cloud_id: IP列表对应的管控区域 :type bk_cloud_id: int :return: [ @@ -122,7 +122,7 @@ def get_business_host(username, bk_biz_id, supplier_account, host_fields, ip_lis """ kwargs = {"bk_biz_id": bk_biz_id, "bk_supplier_account": supplier_account, "fields": list(host_fields or [])} - # 带云区域的主机数据查询 + # 带管控区域的主机数据查询 if ip_list and bk_cloud_id: kwargs["host_property_filter"] = { "condition": "AND", @@ -191,7 +191,7 @@ def get_business_host_ipv6(username, bk_biz_id, supplier_account, host_fields, i :type host_fields: list :param ip_list: 主机内网 IP 列表 :type ip_list: list - :param bk_cloud_id: IP列表对应的云区域 + :param bk_cloud_id: IP列表对应的管控区域 :type bk_cloud_id: int :return: [ @@ -237,7 +237,7 @@ def get_business_set_host_ipv6(username, supplier_account, host_fields, ip_list= :type host_fields: list :param ip_list: 主机内网 IP 列表 :type ip_list: list - :param bk_cloud_id: IP列表对应的云区域 + :param bk_cloud_id: IP列表对应的管控区域 :type bk_cloud_id: int :return: [ diff --git a/gcloud/utils/ip.py b/gcloud/utils/ip.py index 48cb5f1ded..fec98cf2b3 100644 --- a/gcloud/utils/ip.py +++ b/gcloud/utils/ip.py @@ -11,8 +11,8 @@ specific language governing permissions and limitations under the License. """ import ipaddress -import re import logging +import re from enum import Enum ip_pattern = re.compile(r"(?^fG$yXN=D1z4zWrh(63?*LA)BeLX9mweD5++H0@9&zUjLjTcFdzf3Z_ZlFK{&#M;Uc^~>b zFS4iSHKLp#%JVjQp4YUu=k>uqu`zb1(2RDUU>eGQMSEUyOy1X-0Ts_>hFiQECL`X! zY>7!Jzunghcm>Hs5U7CDF+U!`)c6Y)!xxwm!}@t%S}cL-u_l(lHkchJVHR9&?!t7G zPh0uA`4YKKFKz#T=cOW(p}*(V$57P3eNYn_gL`llro@f|oV_qJtA`#5|PGpicA%L(n(KnHsq} zUJk5_Q}7);fo-wTU{(zS%gLl5^VIyuOg6;DGhjaIbE8gB2UBB9Oo!btHx5B9>1@n^ zaaab|V=lam>F_VqN~DbOysVtxOG`!r6vnjJ5H+EDBLhOr4a3Hcjy zk9fVIo>v(!VMELm>n73_wb$mF`+{-q|4lM!sK`7lI3uqBs$2szVGGoiN1=9m461&t z#b=@hUW{6qBdCdi3J4pI{NnzTsRr=l6<{(FvNM2I_z;jW^!ni_LYIgZK{f z48BeI0cOH_BRsDFcEZd!5jBy;s0pk@-O7#F0ncEd6`4XKJx`8CP2^ilk3XTV;GxA| zTRizF*DfcjU13zas;G%HMNPB^R>gNv?e<&ww3Sni=KiZ9_h>g@DJ(^~I%>edsF{zq z`uEI*=qJ7gb;2)E?Jr|Se1N(TZ;V^XRG5=u0n~VPP%orrV_1I$-m*YfEs-fm0 z)PM)g6WE0E1uTbQW8IRzjcT_Ybzz6Bd=53SYpBis%<3})#<`^`fO?*5qXy`Ky0Ss2 z-980%g%7O$Z>&Q(84q;@Y>M-7GU~+Hxv&TfM~(LZD!vT$SZ>9v7`SB(UZZA~e7x&W z2;ZVy&dM{fHRZ+F2p?h=EI+}uZ;o2hPN;z+u_lf~P4IKnO20sDPH$qcU%<;kCLQH` z7>?ypR~l*MSk%N;qi)F&)Cull4*U;mVU9^|w|6lkQCHp%)qbQo$Lcp?3-+J)DH%Pt zzR9jbS~C}FB1KS3SJ~pt%#IjJyf35R1PoQ~QH$52=F6Ka6FR(@>$gE~=)cU^rt%tbkeSqZ}^w?~aX1_SlU%p#+K z&zm>RN9JqP5+h1HnA1_WdYRR4nQG7fegazR(^hd6 z)$xIq|20!ib0^4(YM%!+ff8m_RKG@;3_Dvq3bpBC@KYZvipMEed5`taNhaY8r{AoG z+FTvY;pSY_3AdR0&96}_a^AdV-bYRJ4^+Q|Gu;a=E!Lx4J3vOy<23vk51V@@;Yo2$*O zsP+di8joRKmNfhW_o>!$wyPh5MX8^NI`J0NCf<*FZ+wTWe89VJ6-nl}jycUR96`e( zs3lx&ZbuDx6m?~1P%CuL{M$@D*S&y3F}NwsXlzOQ!I)al{}D3j37j==p-%7ut75`9 zTRPOOX@+Xw9(6^1QF~=P>O{*>?LNXnxEVFxkLE4&vDEYb4;gh#G0!zjhq|)dR<3|r z%DSj~H`sg+^HW}f`a*F6)$h5Pnh%8Fy+=)`CMLtis0(O=0cCoT$%Lb<;sbLvYUZDz z1~_VdYyN0nH-AO7e`fj?xN%dX;`vY)TFS~57qI@Ss7D|Vw#K#?gJ0uuYdCwM8|XvS zQt!avy*KY+KH|PbE?xjjQm$d;!I+8ibaRFI*&^0oOLvlhK4e~)nHIYN%VJsLZ(~E8 zWnRDJNG=YDq_LU}Lh#6_3#cErx86<&(E&@HGH*l*>d0WwVpoIy3rvCLTd*x>K%|w2;C{*@aW0nqP|p%8hBL9ja@X$%)P-F}eOSH1Y?yNe8yN%T$>>cq*#al5 zoOPx9RP1UFKuvHgw!sfj6TgL-vBWAj!TOk*avQS;YSRtDbU50aiCkE~TTVt-w$=r_ z?WoPR*W$-eS8&$KkIdJYm3Z>iu76&$1nPZJ6*aM@sEPNq`r%lJ@+3^IHQPj{7J*$D ziZ4+U%KnkFAl9H<7Inf{)P&wgZMsbs|IYjs)j#1H_p@bMOiMX8X224taq3|3`+sLL z+FWC#&-1>(e3VnIb1P9AHDFa_$-G8pOH{k|SQy8m?(I5M`@^V}JZ0qz_!;HfSOJ%; zXZ_XS9GNcoGpb|dkDU!rOV`%yZH~73_pvk+UV=yQ)CO0c{fX;;Y?JdWCSjZ_=55q@ zA8fMc|2YAjD8XiT3o>B{;!#_|ber4sP+t}%pQ=@kMavX?Hu>nSW>K@Y#n1=F~SRK!!_DII&!INU9aP7EQA?L{hdW^=)TYXh+U=FB+!ED35;e{c zbF#V63~VH$nIA;Ga898Hx{o@sx0B!dKsM}(qp>gkgiWz7J4&};4(dc-V%WCX~s{i?k1TCCKQ?Yol&KUu!VLd8X zxV@AW)xI+J!Ir37vlr9o`M(&<@C5?1Qt=YiAl+U!P)Q7@Tn9DK5Y&mLTKzmLuSZ?L zPAl)X`ma%s>1EW4c>CPADKHb~_i|aFi~^MFo1HBlW92F4Qq%-KH9tpP@k!JPu3GsX zW~2N!>egoB14Hdfp)Rm420#CMlF@*}QIE|eE6+uJHmpDme8+rb{)Oj=Cp^GK@Ywx` z8t2(TcOu{C?!*~UD_9aWPFGaBKA*Gxn$a)Y!GnDe8RvQ1yYyWJZ&jV}^X;I!r~a#BB2;)C6~-uIL)BOvDeN zsDY+_<8Hw`RQV`|;u-9TPjCgcJHfXge2!gw-2XKv`Q##y;FP<^0n`lVVgkNDU%HN|V{sc9FL}%SsvH}=Ixjl}=gBYpjzx;RZ%9f&L{sro> z`3@`N1Ju$LIOm?@dZ-ihHOHY&G#g9ec1(@8Fgrd)jhpIwXLhroFgdoj z1`*~!a}4SP)2zJL%3q;2;h(7f34d^(38}CWyqh9r4mp!jPHo46D z=OeR+KvBGc;h6kq_wzsn)Bx=-(V)YOHwjfg8}r~w)C3PB^#SiV z8O`hm7w~>DpP}Nu8_tZVfeTu>8fxH{sC(QU^(Kr)op_2l7u9ct`I*H}VoyE)7s*Kech zdzynWBjs@zC`)E8ne0Bk1!G^zH-F(fJvO`NCUnnygnr^LP$$ZA-<_zFIR$m1t*Bdb z0Cms5H6Nl@BIH+oXN38GW&L%}8WPYwibQo7jlFOQ>V4pQ;9eXhungt)I2dPOZhVdE zpW~skl-U3^eiu}`QRX6x?|#Vo>*Mr$0wI{A{Q3F4;_zN@1bK0|qGNU$S>4t79nT_E<}w|D(ug=KEhdzeer$ z^Ozm~K;84yf4LLaM%~ki_;==2>_q$l>M3gQpIf1KQ2m#nZozts@4|7E&!HacmY$D){~_~^ z=kpHX0@R7#^7(=T^haIEC@asz7L*sGuIRqiXHVb@PBa{~67^BH>Md-EF;+fiUNiqr z5by;bt1Jn9!B=p3)C4-3gE0@~cd-_(!-{wh3u0&@U+`nO5o$uCP>WXh;M*I`iAtZ@gk<4b8S<em>vV;75$M6Jja z)Hw4kz5+{A4s5c(HPiqPt^A)ElGGRc1A=VWi{0K8b<4g?=JT2+;47P1B&E+Ak&rJk zseImU;*Zk$yjQeepMjO4ygHN5yFtGbS$y6>+>|xA0s*gYHlJ6B2BRXv+ix~JDH{x|B166JKJ#-x<9qBgA`t6(Km|6!=7WroG)Vu+sq(`0nw%cwWi zZ>Zhu%jFBcGAp8PMQhB3y;1F^pq`q=R=*Ls4(||Z_aDW+cm}m%m2>-o-!EF@e999r z`21(dsEx=Ix1hr{Tp&x%kO+2;V#fxDW z<)#==$H8R$I0bdWb*R0t8+GCn<|T}w{3~i{yM+3@Ik*@{V$r<5;J*p2!4#BJhq(!7 zL*2@Pm=a5(CR#O&=U;)Y1oSxcMcs-~s17qwOF9pA#S2lp_7l_O8m2z%w#>tP&OWd4BYxc4sZrV{`#E z;A7N8(id?{oeTB2hZdYTFM8g0h1MTC&-K%&yQM}a##!Nqb58Jwc@ie`1`+wWVG4V2Lt?5 zt9jTwi+X;qqbB&$%1OiB`ymf%;7VpK)Od}o+}g?=Q7hdObt?jxj`xqZoQ&?}HjKgp zSQ7IV_XWS2wLvZ6Zq$_>LGAV*Q768P+AFtED-%+}jh79zGWpFiW-ZjMYJmYYm`O%g zwgmNQwE;EL$5;tNO1fK6AIDJcjJm>$sD3w4<2*M1MNK%Ql)KW*sB$^%jx|shys{L} ze>9m*1e#-J{xv}rQK%CPK@B|G;?q!HF6W^><@Tah;0M%_{*1ckf1{r7kTPzMq($we za16t0sQwXUc>eX=jwPTIF0+cY*oN|9)Cn?{b(Po^e8-}A!*ud&LV0FsfP!nH{ zdTKVI+U+*KMos9afMxEZuKX`6Cobn+Fqu#T)yCkP4An6bwTolTF{lfehiU@Wdd zy=bzPcm0ZCcgj^!D-ih5GJ8-1evg{zCDeo-So}}aO8kp@-jh^tw;~^wqTC3z`Np6= zJ*S~2eh9S!r>uMtHPO4sg#^4uWb_>WhdM#dimpRG)C5YPCRWADwNY2p95vAh)MrMF z)lWvfFJ_}wY8`3@AXop(TNYw6* z!Qh({%Tk_!HSsX&`Sw-!c~7xAYT~78xQSOnou?iK^df0(f%ax3s>2W~k22pyJuPvl zE82m28ZMeQQMcqF>K^}tI#H6E?iOZ1jhh{HA$e=s=YL77sETu`sEb`$$_rSAa{1cs zjn^0TDjtMdk*Vm%1s30pdU2gWt;_?|-tp={Wpf0c?>U<5cAO_l!(XJe8 zuD}A6kD^|w_fbogtbsEdY63-2_r9Ll0yUAhQ77(Y4nj?ABx)k>qS`G&CKT}2l2M1x zP@Cg()OWP6EdDL(MCZ+Gr~&SqFD#z0p=*~4wQ^Zd?Fyj2%9X+AxXI$H8|fDF{B0$p z-FytSx$a>odX3!`=S9WKU@dH7<@Zr;YP zm7f3a$u!6OP2Eqov8d&D~}TMQyHPsC!!mTVoB>#OI?8L9I^OW48EvPoAD<4@o{UOf6XXe8#iDs)Mm_w8ZaC+P&td&MGer*;+;?z&=<7_ z#-RGI!}_=ti{T5@cwueb1rX z*1dWD%aEB!pc?MN*7yu7VuL>JvtT@iQ-0UVJ5fuy4|NL;p)TM%D_=srm>#0qC60Cz zO@S(BMO{Fy=zuTyS8U+~H1ko|0B56i^F`D>%+c2k5Qh5hRtj|`4X`P8!uZsr$PLg`!p${wC_4rySzimqM*vb<_)~F=|h>LQSZTISO?v-@}x8{^wg@6>4UiP!rgN_3)V0 zCy(J*u#_{RPA~@5ej@5#&$Rdo)C+7K>Zv(~MezyhmgXAjCRPpuYS@&FAEQwNzK42l z=iyY`iCXfiv2IB_A}>TQ8vWQGb%pPvZsBrVfa`GyRv+e8<|ovJ-9i2I{B#)4zjkNH zaJL8Y;s7>7A=JHFFvi{EwWxc18Fh80Yi8X3zNFabINa^LXou z=Ztr^cms~1d=S@Qr3o}xPUh+apSJ;`IypQ2VQ@npB8d2ul1 z=J-AyLcPkHO>y7zFQQ&JY2S5bLcQ3sV<@%>kSRiD80vXki8|3XYj6xpQoe&)fy`6g z66Z$kfr6-baa8~EsFkaax|Quvo3b0~Li(YehOwxL1!j?{MJCP~oJVcCyQqPRO>+ZR zL46Tvf`zdcj=D$V%MF z?pig|UD;b7xGV08now`l7nb4J4M(Fsq%L73zQ79DX|~&Bai|Gz#=Lj|wNkGzy*~d_ z%yHlUbD?%;ZPX@ff$T-E3u-BQngh%csHL5Nx&`lBc|PhXScRJCM$|Z4(2qMYKc2@V zdj9_=6Nd@rx)UuxE!9fYQm#dvV4ryu^`qGd)P(P&Ciuei;@qxJfqJp!MYSuBTB$my zr>+|Y^kNuBMw@IEYKhOGR^W#D2z5pOSUJf&cfyRQdz>59zJ$fAS-b&iybf01+vyZ$EY{kE7Th_;{x|_TNZW2 z%}|>!0`>e436Rl;L>%fDha0gm-bZbcvJ2e=I-)*wqEV0GT-4s!jGgf)YNB}-xnIW> zH@l-IHW&3?S%%sJTTvGtI7vn`yN`Mi{euOu&|)`WOVqvZhB|Q{)NY=H8hE>YR1jX&ZrgYhnjdCYDssX?(G?DhSyM=E_{`HqgKMnlmplk6RqZ7Ryn`dM;Y9V zUGOPtm$v-K?dlGw73hZA&9T@JC*nRliKFq|HSWFPTkBRT3F^wTqi$7I)aI>^8m|=w zij(O@MlY24s3qHp_3<3)gxS`)`huvvP~U8U`Y`E$qp&Z|!rM3yhpu<=n>dDY=Z}5C zzn;5@TB%MOc>eX`>9@gcs%5C9UX6M_KgC9DqNAu=67q@9+l7TuS8yG*>7JwB?P)gg zy@2+mQ4@{Z?5=zns@*!&*YU%sTldrEfV;xK2xvx0x3~#pLEVA^s3j|oT8T=ii8Vl- zpabf$iaoKZKN0nm%tw8OY%sT2{SMTd@hjBk3|zH}Ur`#;L*c40SEYzpn5!8iziMo~FTKqCDYzsTqXk$Asb+BB#c`%xXkQG1{^>O_rESJ)2q6pTQPGaj`mXQFP=G1NFep!(l1 z@1r*Hll?sZJg&j7%$d3QhbZv&^-d|sk&J0R!GhF%fqLH;CoR!N;aJR*5`Q$K&wC_o z-rCgnBY)oN&r&W+`j1!l-N>eUNeQU}?!;W_apY9POqJ%aa|gO1@4k7PBfHWuaF;pyhwT_CSQ@d zRP?$_Odl@eurcabPdZOI1#Jt{_9dwV`Ff->#Bbt3+Wbpge}=_RYu=yg$gz;Lfcl&X z*dj$Z!FM#cL7*TN)kvdg{2B+L4nC8D$7%kXi?&NC^8>GUjr=d9LG;zJ%Gy14MK1w$ zm8r{0`pnw2qV6U6y1}+J*x+Pdlgcm=9l6Obq@#{?G+a!1lPd=Q`vI{Mw7rTg;tn>< z(Wok|-=S_B=?eK-Seh2U(IP)d$A31W@*#}amehp0w@Ax~MUqO!g*M6%9bzr7Q}Yd} z2<6o{m>zYoA?ht$-sVfzD@#5xaeW@$Aw`jj(Y7lo8*v@W8OKL{1o?EduNC)Uqa1+; z!8-j(q&vpbs(tFB^`mYPF}|Gz zkB^Ai5m%vcxftq){C!SEroP@~Ur0ek_AtBzfeI!AbJ^ z&YG7A?IQLW`J#;RHR&+v%_A3W{R9S(`q5UO-fRN~g_Z;=Fo-T}zv3MC>2RC4jw|G^ zl5}if;GH&jW;*ySUo~z{lMK10SdUFaQ<46mS1)?yqvZkKFL{#xX)VIz?l;Mi=^6Ez zY-Ejon%V|&*_ze}d|>TXG0J*7M;~G@t@UW~`ueG(HlwGuHZH=uhs+`yqovg?vC5^m zoAj8mW{^&i-$eAKS@nqt7urX)?-h zSzc|vwDDqzy(SeRHk>q&_#AA`c@_}=oN^OwlmZm8QJ79;1eM2e9BO$@ivFCgN#H zH5ljs<&s#z+8nf#wV>@gVmG zDLh2#M$$2i7UxJhvJu-&&w6olT4X5vjM6%y)2yXhl%i!*(gpJ6ursYU#GPu9CGZ!e zbd*MuZc{rBb$ss#{!;Nf+Wc*!{b=#uh@H25C-Pf$R?^?(btJ%Eq}kT*CY~XsCjCVH zY0k4Z0dLm{)*+oW4EE+f4{RdYSe6%7_kmSj#4PmdOln8nzqC#AM*sPg6H@L^yG69A ziANIf^2i*RNYx*Nb`UCzqp>JyDDg>@bu_}}lyw}mSQ}HZZloO4KO$C~RD^ssVtuSn zfKwl$JdnDM7=J9$SB5(T+gZb+QL(Z(M_`;X4g=RVa+4{s(KnmUdg-XuF;K z7}^ygWg(xFb^-D__F_?D-(%$jycBe_C-4)2Oc;M0v%$;92XG;=r}1s9{yq9dQ+L?P zYF?Q1Ht`;`eMJ5j@)=a7&3MZBuo~q;!M~g$pd&5m9V+w#uZ}1hB(g#CkY7T+k)8Ym z`CP=F-~?iaX}^s8N@7{qA;n2a$&VxzB3_?V-THn;ej@24<-k)iI)2481X^M({GHe+ zQc}`hQgQ~$$)NSrj`TfkdXw%EKT7=o@;XXmR@&+KoOFdWg4l7=+w?0%c{qJWk@B)j zz10M_#6`8q({3}lVT5Z~cm2>fh4MFaJxeM@ia(AJzeIZT$U%P{53F4$>>Bq|n;d~H zM1Q9?Es=-T>Jj<(NPja*P10SG{;vqDY1@zdERv2diS40JO3M7U!OKc&YjwA6tSgjb zX?vNrZyp;dlcmi%kd3-V8CGnKT9REn67^ycx9a%$SWiSC|@FVr0zpf z0_vhE>o`DJKm1<}me>r`-Ju^>&89xAfdaN=O=SEt=A54f(H$ z6(D7?_u{ zkFC=ri`V3&xkwr5tRoXCC8<5-4x}$hQ|a@KDmfllyHoV9`Njm&*yMkr{zFone)*Jw z4*O{|!A|xB=TSM3cqj6$EFMLhkBFb7+yZ}kW8kCYeD_4y$d`_*HoHvRz{t6A zH6m8H%D@MozfoCs$G?%=k|z0O%c{Gx*6;YVf8`|c`QKxP|4+X6sI0yn+eSA}9$)F3 zyt$0!<38Qp@_)0LcVyqQA%A@Nt1HFgv(K*tO3&PPXT=JCqq?3u-JM|h{}hY)@9$r9 zZ_Aq7d-j#w(f{i01UAHuHaBwrPd@h6y^#2Lx5vlhuOP1Q%RE_XHwkYZ727R3a$Myx z(Syeo8{+~yy1cBAEw}~?XJ+tSPdX^ZuN7L@FQcz~z@MT_aewQm0fUA|`5U$LM~#dg z8XGmRXOw?h}h^s1B>~i21fMgALSnyHNrnUDrP7#wT+GF?e85kXxQNBfxZ1b zM)@P7dPNNDANxPeheyOj2m3{hjE#xtsiFM*uUABL|6wsvu19t25-~8+9}(Gi*w9#i z-$6b6Lx=V388vjMzYnt+6f?>nJBXhBIYso)!TlpfX_%O(*qBiZH>dYq`rk`SreSn# zyScUs$&qUGAcmGh-cPXh=FDxGIE4ceo8DFw;@sVHp z_-e;@rnX6;_=-t$d`08)d*=AY7j>u8eg6OCip8&wKYFOY4|`#rFTF3m z@W*`LzEtt!a>B6P=RflGO%@+%w8@vdpd0`H-0A-bqzL!dkLW*iVT(<^th?82@*Pb5 F{{W$fRCWLW delta 23460 zcmZwO2bfJq{QvQD_1;!r>|#aP)q9Jqmeso;dSAWQaEac_>YYT19>OMibV4K{q9c4fF(u`HqCGD$#_!@xiHc`3^IE(#CL&(RtceLJ zH|pZ~z1(D45GaXbFcSBc{cD z7!Q9%UBCs@gzx$-lc0wSWH-xUC=EWroHz(|;v%cxfFYERq6WH+$?&C_u&3v7cf7P% z8HeL=Jb(?cVlOTR{d37AA#>M!X8L-&crpy5J_Blia+m_EVQOrG*{}<0Nhe?sPR63R z471`HOpT9GD-o}c=VfGkFEJT)kONa;Bx*wSF+R4yxY!O8U?=Q=JuH3(*|**~oP}lk zdR`g)38OG+KR1zvsJ%Ac+#HB=|Id+0Nky{$ff;#OQ03y74y&N9{8Q9!?~JPNWAV>X z9Zy58Oe|`mhf(cLqRzW)#1<@x2@a+yIfNj%p)I;|;L*G;dInJPr+BHD@@75t@;qGgb`R0d*N(cgX;G~E||ByR}aNYi5*7WlAEXjl8kaImlGo?S3o@lBhB%s{-sHHB18gQJ&=VEEfYf*dQ2I`7lqE<5DSXWMMW<#w&II6w~X2o*oSEd=6oHz(I z@FJ{=n@}A;GvkhPT&!E zFX3fWM?0pt_6Jc{^fT(pZ&>-R`Nra@r@HnT&0MHGQv`ME{83iX1~U=pVde3tj%QnW zk@=Om-8^9aglc~oqwxmjU`1Z{+}y@@n$(wo7qq& zhFiG^>dGouxe011JD_ge409dkqI?MTMdL2&y!5l31~Z;q=^ifW(E%z^1B7o5ZTtD*`4U1@!5(A4aRA;kM)LyWn~H;RYycMqvfwjZg#5MonlVYLA?>_+vBam+t&9Oiq1aOvU(K1u{Wc z7u8XFR7b;5n`@Eu@eK#VC>L1eCfESALM>1$*2V0NYBvb;;$qB%M^NprqAu_O`W1LV zW*f#|?Y=bbL^XJVE$}s}-KT4uol*C^zd7DqX!RSh2ov6k`|-h7uKe{ncm9p_&PVH6 z{{(dOhJcK}!3~@YHDG$wKsiyjpoGPnm>tYMrr(^5C1^k2%0J;2CUP0I38!yz{Vv_a z`fGqK7C403B_F+Gmz?-qWD&rr9v z_!f7o8~QEN9d*THF%8C8c@^fSycILxMNETFPXt>I1}uR=SQWL~n_0Ox zYMe2se*7~nv(o(5`~lU`71WhHKy{Sl8#i!vY)!cgw#0?l1z%!K?7)W7E!ct@=nm$= z|4_h3Ets4&V}l*l$C2+xs5r{;!~`=%-oKezzOp_YNEGL{r_v_ zxO_llqMRQ6y0?YMs9{ai6}GbSa8!pgP>;Qg~-}yQ2iG~ zU0@5$hP}*bd;M-E8wsex za0Gsh+7m_m-@7X>jj0G!LJiyybwUf&V>1BD<5G)XHlLX(_q)d}4{BnqP)pnm$KZIZ zh$#-Z`g*8w{4L37Njjkh9BU1h;tl zF?S0#p(b`2v*Tabj`6)@$GIv3y>KI@`hlzV@jT;al(U|6_jmznf}62D9z#9%1%7mo z?_yLr!6}v-`=bWDidpdiYU0U$auW!_LVErq$#kHi4-Ud}r~&Hz?5=D(s-xdgkIg+S zg9(0dD;J4jlv|?)7-P;uUFkY3geNftzQN3x{51VCzL!TCEN)gb>!5abb4-kVEdH4} z!JLB{;0r6CvGP^aCQNh2ou3VZDCfb_SPuQe$P6H(d-oJI&@0r;;=}pA(=Y_^sfK#B0Cm4qL%bD zhT{v&k71YG&ja;Q9rVFmI0m(e*P&MOxcQrT1Jee^>SbsUa~uqK0wa9Qg7M>mN)e z>tF63l}4RV2RmX<)N_9p^?rzV*Zo#30(((zjoI*L)IEM^Cb;LySy25KLA9%GcDMNC zd#ry6D%KE4hQDJp-ougD_&ys6&tY{e@xXnLABl}A??YW_hQHnUxiOq_F;u)Ymcw4C z{x;x1Ecno^>}o$5-P4VzrTHEc;|0`&Zdm;z)D^^gN9@K!mg+fo&Qi5nCiLPym_&lkNaPPjAlOmg>yD)x356${(V>!FQNuc`LDaDnJ^>e z;+OzyVaQj0@$HJ)aR}zZMVJrwW0;=*`($)NnwQQH)V+&9ZK`spf$F0+Q&&{` zaX67Ho@M2b|Li=o9O@~lX--E?^bG2jT*SnT?>!)+4qsSB{MW8QM$`ntQT35#ZSzx9 zhn-Oq?rCv9YJkb+QY=Jy3pT*(sPjs`;rZ8+en=)2MxmClDQdvBs4MS@n#g#IFEQ8Q zr^LU-5}5X_TcH}L^E;t#K|hO+!eNw`q8{t4p3finLQuo=d3y=8Lk*PE=L>XD8g(UA zt=tsrQ0|DjqU~1yCu*WEQ7aJ?#}~L&Ik7I~3Ra$Ot~Zay@%sXg)eQnUX&5)In?P=} zJcbZ&fRWf2OW`)u3+VwC#PsppgsP$*$AQ=u_hMDd5#JYB@@UkG_d>1A5I-3$`2@^{ zGf`LkHKxUbs1wekmh`&$(0pwsN#M@QfSGBR57oX3YDMa!`e|$NZdin}f3OACqXz!Y z$|ub8Sef`O?8t5pPv{HWvYCl|Ud=ds-!q>l@p%K|^6{J8=RKy~u2jxVX;>-Rtw`(h zuF}u(^geGluFnuy0l(KJqtDAjgTa`ZiWPhkCB<)0E3*%^Cyt>WzuztX3Ux*Cf}JTa zA?1vyy%36Ju{7%Z{-|9)$>K9HnV$b2$!Oqea`>_k2!VFl3AB78GeVm0OG4TAS&*rW;6g5zUl_OCD)I#0EmY5uS zpeFDc#>45T^JZgqT#MSYComN6p(dU@#Kpr=o4p45bz)C4p*R{f;7Zh9*p3?bn0X%i zP`-m&+UB7?ZwAi8L6|SQFYxL41ty`KJcpZbM%1nR0Cj5%q9$542hYC(EePmwh(_It zL8ucZqLwrUb;WZ~yLK(=iY{Y%e1%$xG&$Y9&VU*qKkB?Xs0p>h_}By4t6smHezz$G z5$H?6Zxv5)1m)*=3I~Px0)L$zmCG0SF?<9@5Z{AY@Gfe}6Mf(d{54)4)U9fUnn-8V zN>4-*Rnj~@FBEg*Y>YxZMpsZBK1WR?Q(m{!VW`I~FX~nl#&TE(Tj6AE zjrUNGX{~(DPf#n<#_9KZlF=0pL(O=mxg0gq&8X*hAL_)jsK@IDYAGLCJVm%0APcI$ z4^S&p79+7HYQj@dD?SGk>G@wwMgy%vUCDMUp9wTzAS>TDUz^Dz+;g23HSywBu8f%| zH%ARPz#NX+)MKqYO=ZUS=91AZScbYsyD;!VLfzy0*a82=Lf9(5FYuLZI%;X3qOSN2 z>L~~+U~fXy9tuURST$6CjZrJv7X8ZfvcPcEJ)CUiW2h_p4fQE@3pLUF1$}{EAXG!$ zno&3u=cBGLT_JZ~HdO!l&9bNoS3_NBgF-z23iKh+8b3qL@G?f@9juKF3cL6U)Bqb% z9miVy5Qb6y8TIM+47K#Bi@1R@q4q*4)N@}AwRdV2;rZ9S??NCa4ncLW1ob?BhZ^v_ z#jjxl%CAua)GO*XQ&ZH1v_{?gE~o)VTm5V-Pk9k);ula)(``Q)HGE>mE9NGY&dh~c zk>Xa4M7?6nIC2A?VS$q)Aq&xy!vXns|`2s%^_K9>8U4{CJwGOo+2QU;=Q4{}yn9^Xan=C`QL6;{oC6Do(=BP~(! zo*0Satb7dhCcKLI@GWZd<*V)s{B?d+EJS%427dp)kBm0eNz9K|u^y(Z;XeJ^U>(Yv zQO~be(--(Lx;$2=xDz#j1hw2Ai9&6*7O1_|8Fg!WVtpKnn)r|C*Dk(AMl*bkdhRpT zb{%9xEqz{GjfHU>p2rE;rjE}Wg?CZyde(I>uz{#I>J-e5t59#mqvlQ2`yx&~o_}R> z)N?beXx2t8aWmAW>S~TfJ#NcUd*&O|l^!;KMqTkGD_=)V?19Cfq4vOQizlnk^B;Iq z)pw6cHVmaf1Zv4@p*n1e+KjDH9Y&)%>TU56sK;!A#pj|fU=?Z)#G=l>hE?${Mqm+t z1J_|I)D?9??Sa9lTe2FpLI+S^P_CmkSHgyFWpbe=^bu+TQK(zm*vj2e6B&vh;AAX- zTQS7P^LLGmI*ilUJwBnR$1gwX!=yZFB_dHB)k3vziCTfr%t@$;EI{3o75Er8U`1T^ ziCgLG*p~8rq+h>Rw~6bxIclKpRvwHRV4^u6|6#^!@Lycg%;#OhdCgtBp?oj|+M{mi zeAKP`0=4vOQSXPX=05yD&;LmaJVl-8YvrDTq^K)Sg^FiK?c#9MKvCE?4*yaLwPHWC zab85-%Dbpr@*34o(zb5tv!GV01_u89PXjV~?Aqg2jK)fswVltKh;8s=yoc(rSbI02 zil}%^EP}JJARa+ICC^b4Ptw6nEG?=WhT&KM{hC=bGMaH$a~SFhr=gZ^iN#l=Ch#3< za~`q!>*hVwO8kRr7r&#sr9r4o8G^b6B~Y8XQb(SDRkS0ZH{cM|6->pVxChJQW2}#b zI=NrJjY54E?85xG-^veBEBOp{L9b93ki4@ir$@b*@}Sy9cJ{lOR<%Gw)D<+v8W@e5 z;5O8AdjcadDB9h_MyM-of%b-a=emehG)CQ{ zmZ*E!8TC{QMGY_xwRsk!R$wLSaa)J_ey|<$;18&FPp$qx)H^?6SJ!U{sy}}b3q+x2 z^eJiu`dN82>IxU5CbACIQ7meJQ>cM|L$$kyy2me3E0M69+x5Yyy;dEy^q)HYUTZSi zY#lHZ`=L6Rjk>}WsHIzjKjGKNZ_d2WySs@l>)}>lGwQ{(6N}?{)C5!ZbSs(xHG%A? z@rqz-J^ztpbj1x&OW)4Q-BDLC40UBQP!n5-di>Qg+LUs5MtKe&^uhg4g%~Gz78eki${VvoV zI&AUts2A8Dm>*xGKb%Z>A9qhbLCvfus^M4+#V=4D9z;F2KjJuifLihaech7ILSBg8 z7Z{4GP#1Otbqmko9K4DPa8N&P5gtOjPCJu9E#8JOYA$s=PkjE zBYoai7>nz$&F5~QN-XulZ@lxTm1H-!gTu z6b%|;cASFwa1&~CUO)}>m({<U{9Z?8EV4esFf^b<(jA!X^MKf`eWevpF~ERDHgSqw^3L6+>9UNW*&r!XF*LU zAL?Efvv?JYH?VjMRDV6JewfuyLQQOT49~wh{EC2P9E&>PAZiIuTlsg?Ko88fs0pN+ z<>Hx9n=Kr5ei7939f|6{DXPCts1@sr>Tl>Qo_D>$CKFJHYpvoNYj_CN!AVrd7g3w^ zFRTB@e2qFk{%p6oQlj3Jc~PIL)lgU57WLE&Kt1MT{bcmYU4s>IFILAmbKG92g&Mdo z>ci!8)Z?}ewFeGkbG(RZS8A^NwcE$$VARCcp*Hn4)E+pBx^VvuGMZVOdG3Xi9&=NU zM0FUA+O>mF1CK=Q{za&cS6Kae)MK>`8{jGIz>}MEzAx|(4kj${dHaapK=r$FVW1y= z{wJfQ+JQRp0_yX-z#{kfwMSj)1k^;AU|!sUn$RWGWBMGmLRl8O6|I80!se)@9)iPg z5vpD0B|iT74$ogDGWiJ%$8oqG_2MbE)D2t@HRFzEf7A+%MooM@YDrI^?(J=?g)dN> zuIe)P=B$sSDbK@pm~}aSvGNM-Oaw!ow-+%Anq?dsmB6&Qrtj8iZQ7vc`QfrD}B z7w-L#=}Wg#*-%$r1a+$#qBd_!RDaRvFFExEBy6qE+m4Z_D|mt0bjjDbS9or0OZ)1miEdc$u6#SH-9FUgcmZ|mo~-w~D-7D; zW|SQ@fx@U4#YdM7Zz#);eImu z@Tq~i*FCUF9Nx{Sj(^>#llc+c2 zAE?dge_<8zwzv~BpgIgkH7JZ)iSno`uY$UFjWH5CVi8<}`c%7!x{%*dD|yS}|DY!L zFY1DmZ4H$9_y1(Hloe4O)WAAe2X)VvqONEc>K6Qjn#dKa{~P;IPWFv^Ed8iku^OM? z9@P0;wz>WfqsqrIv7Y}cWTFV%Mm@)cx4QYGr~as?$)jim(YaqNM5L2W~=Q2FoN zt(k(_q_eHO%v^)&Z!>B$UPTT33^kDyJ9z$ekAukQ1rdT;+PtV4mqDHQF=`JqM-9{- z^8Q0KogCQqi`&A1pchcIa5g5yqBr(LH-<1l8&D!7bC@?oEzhkZV_)0w-ps9(U=BhNYy!cC+>7%?@RJJ6434;j-kvuDe%9X))0%(dfHKha!KmzQ_dWdsYUm6LEz8p?_B7aT{LK;3Z4*R8*gbz(8nXwo7YWU`YLzeh^;Ub!9RtCVk( zuE%^|BdEhcBC(|RkL*?m;u^=%vbOc`gT+rV$}D2XnZhT;z98R;n0|J7N=nRm=dm+& zdhINUY4LGR{~dCLiH333YvgAVuRUiaB43KSz%jB6$5`xBUX?}U%~n@yQ6}uRiO27>b8>pAU_q0(BeKV@{n}IF_lkA zkDrig5Nk|YN~}GpXiWBMLD4B~>_4bEM#@il1@`5PN>~H+7B0aE?~Y>R6A{$iABR`OQYT8$hSzImH{~%E3{sX$Qqi9uyR#|CrnR1Msot}6MgJKUQa6v-SJu}mVs^xote)DRkaB(klc`@xem(iNq-vaV z6LS%JhGp>-ZXsUwy{n%|xi@hgo#L`BZSd%FYlL-#4oKyp_n^0g3~>x*Nmih$IsMOkI7WCf`6v9TTU;lZH%tOURmp5 zBu7rwv|WR?G77t7C}zT{Bvv?>qHW7?!fUE zf3~4vJ7RI@Jem`WP_9Jz^O*c~O6I>u=?$%Z!u_PSBprij@heG37GklS85J|5PEg+G zl)fT5$y%yKF+QV7A9CI~ z%eN%IMWd45kk=6(qe(G#-c6iJ->LDEYvS#S!wwrwqeE1rwT7zuk@8)eNG6u$U#pvD zCtk$NoY#ufgt}I=P5j>ZvneN_+>Le%Y4Z^tj2T%kDCUp4iTuxqY$pp{$jQXY;!x^;v-WG~=xfruV;lKfv);&0oTo8>%7FfUU31jf2>Vht8Ym>nsmU*YMxhraCD&UWBil8(~~;TW(4KjSe|ko z?q%S;0D+%%MpBVN1&$6hNNAnrAkS}{0{>QCbtlP(5_^iH8RP)5rR0|p%Rr|ENJ+>K zB83yLMvAnFe@lK0=|{@{AlJ{g8!~AKG{DOEh}dA#0rI;r869Pz(dz3&blX|$Q@{)8*o>H3** z4CND?dYV*>^zKMO`~s;d>D`gdrtrYpwZt|t=Nkn3zoy9}YJ-UUZLJ=YpF(;?41p`^}~M^d*H z)01+NTG1{(eFym|%qK;Xx)H2R!+$xc5oH~JVRB4KOh;BTxed6E`dy?ST{YhkTxL0D zr_Dq>g8i_Zwb@L075Rkp71-e4TW4Ve!pX<6PCmlK#6BiAfqXym|B?PB{|_CEBYj6I zOe`Mh{o@|x)U+Fmi>#s{<#)$qGHK&6zK;fJso20EFGzPNZ^eQ%m`D1L{Kv#*k}t}V zWuUC%S7H}9ZwZDHKTm!l`5n~v!QwX9_vQ>cZ#v%R{4gvUSJ%(UjbQ){Gn4mI5llKk zCpwxqyrIP29UE!8g2G8+IW3-ySZ>aL#(7nUwV=Maov;~)6E9D_j#7AoHt}M*f0Dsp zklagZH(^JcZaHh24c8Js!&!fmejxvh)Q^-)UD*-A`FF|ZCjKq?o7T@Zvm|z>?)_sm zu|4{b*-k|oYMx*(f(_^(iKa-b9OcWTU#MF~iceiP$~yK^E{0bFC0+v5-J3A7f7*RW3Sp3suo@|8 z%&{iH-9IHamNc8QyOK(fZ%wP-*omZLS>R9iM|avBBxNOq5b9}dHgV1*%EL(Y$zQ>w zsH3#ac1}#ara}HwocSFo0cnJ_s7b3Y$^SqsFDbLd=aElpXJ@sM0$uV)9?Fl^j&z@V zL(&G?fA+uHy(ab>%@)({nC{+53P0NbzmV6l&Q2O-@sAjE1NjV`tRo#MDXAIdPf15f z6FKLEDmfllyOW$#>AeZ0w8>whei>BptAi<5D zD{p)|F{b6T$1&yGEdQV4qnI;oXKszxVPnF$H+Ia}`fax|2?CiHeFnHpKmLncff+X^ z@3^^iX=t^|9<5yA|IbH+-q|_t_Qo%7e7mF2)(J!EB@XoR$EXcOm5GUots4m3iQStk z5ZHJ*BH$mF{afc>xfCZ*JM?NcmsxuKcCtWZ%EKdpiN!Q~5t6Q5x1Rmmw~B5*tjy5p zUc(}W2FhEfzbKh0ew(&E2XvSl66u>WH&Z%a^*I%NCFcH}%6IPns#v`uoiB0xO6n|j zO*UV*1StX?h4$&tDY|EmHr-+~=ko1H5I+!{dm-GnyF{R^F5YG82O9oQ*_}u^BD8&n zj&1sP>lYf`H?&afoCx2=gl?d@3%>N_j9pO7m#nx2)<^p)zF(K2i!V=}ByJ{c`gCYB zx5`Xk`1|DnGkqgsbHw--#Bo!L-9Oux#`j)}*b8%fJCfUlG2WC!?^VvtzrmL+YoL3# Tg4OE2Tfukb*e)A~f-~H(0`MIv^zOU1L*dFWA#w>R?X4#t0&+Y9v&gpo^se{!L z9A_7f!W@`T!Eth8O$^1Rm>avIKMuq|d<6^R2+W2)b0vmRPDh=$8}r}+48oHY9M=gZ zIZH((Uc$Wi1T{dOijGqk^P>jtVD`nVlt*G7oPgPJA*#POu?VJP2p+_|coH?ipRgp} ztmt|t#C%F9qI+J_qOGiyJA+R1a)eib!=o92C& zBo`G=Q5WW_?9DV1wSw|iZh>m=iTQD`m8W1d<%OtQwH@Q|W7I@%p$2?{1u$zBuiq#v zP1&tOq7zb30}MlT=%VgSN4`6=kkD)regj)F{)b&}adbcDuPNE!*s$YvbZ>yC* zL?-Au2T3%6GpL=ofZF;SsAu3ls)L894zgDB+H;}m3!v&tpzd)wE7w6SAQAb`>Bv9K z(OG~x?-15weCI5QIwiV+6j2skjhZVBib9N!S)! z;!(3ub;l`7IR#5GzO$4>9qq?lORT&JD^lKL z<(rtF@| zqRy{@ns^eby@!>PQR5A(#r`XqW(~{DbUR@?>J}Wb`s3zzs1C22x6KEr6+S@?oVB)R zK2$%^s9RSSHExaC?7z0UB^8=+8?!&Eg9+vw)D|yC4ZO|DyRZo5lc?)&quPV&cmw9d z!jvPhC{{szFWRH}ALCjw!(3vfnVV4q@3rz7)GfJa<-6unGo-H9aY3`BSqZfRby58_ zMNPo%O_GmfD5_x^Y6YuM7o?k8P+PYfb>0_NzJ%J!yQu2|>v`9OV0X&lsDV<=N#=Y{ z*LjnqA}4G>b#xx}$-ITSmk&`B@#oRk069_ReAp3-pavL;n&1>G`^>k^O{nYkpw2sp z?ezYiv4+wOyl0^jYM^SUj%!{jrAC*Fjy_9Q820WcA}ww_>)H*P2^#67~C03#rq{>pu~7ep}Q8 z2BE7J&ao4gqrPP6s0;Vw06d5(7@z2Mv;ukMopn~eY~D8i#vt0WH}Q4=19`f|?3KKKJ>!-h?~^ID+pc^6du z04on~!v3qHDR$yQ^DXl|)GrtxqE_^Ul~15Lyo9>`uK5&o>q2-CVlWhST@|w?22*Z; zy1s>L4c$@qxDTqsQK+AWQ?U^GP#tYX{czcdI^VyUcTdAn9mb>T>!4QJ2Gw6z)V=SI z>SvPa&Lq){7NAaCf$CtLm3Nzm&C}+O=1udVnYFohi}IoRD}(C48mixVsP9cXWWuhK zLQwqQ{_gpqi~>it@I?Gadz`Z$ck#;ActpjJE?b=^{o#%<z zjK{@T2ld{cLM`kLy81?EZSVd5pN!#@(@`hv!)kcS%Go~6r%+pe$?ES}eU2_(zmZsq_6l9te|6N^8d6LbGw&H{;BDqN<|Av5>go+t6ZMq0 zLf!k$7>RvRw{9|)!HrlPzeSz*$R(*ol8t@Ry-Y;iqcN!Wbp`67*^V0E3~Fb-N3HM= z)B>`yud0tgbsT3_M?Kt)t=!V=iiN3n`;$bHOt*$LR^EaU)E`9+a2eIn@2H79L=6(_N-$Z@6)}T6k-`r&$LcM0EPy;wGdFO>< z1B!*Q2=+qtJJH%_m`kia4Rh=L-$0^!vI{lfcc`tsZso^ja8G+UQRh{`Tv#8qQ%R`$ z6x8)2tvt)hucIdXF6#W>>%I)VD2T)`-OfLcj` zWbfIDMLm2CQMay()%V6|$}Wat8fs^@n}?Fw|14CTr9xYG9>eh(YKxv?7)JEHg8O+;Nk54E5)48(Md$M^fO|C;f6D&$Y7nclP$pP(M5 zfd1aYR2+3)8B~2GEQ)PV0}R7nI1&rvS=0{P$E;W&#jB4(-P+nNNlua`SQ0y;wrB!s zix*)4rePUehg#W5)Op{dR(J=4FmQl(%R*4~(WnJgK}{eLwZknj8@kCP8fb_)!JLm8 zcopixwdVV%31^_5{!h#ksD6Gxo&Ou^Ry;sGL;eH#+W;0oJ?xQ4Kd#f9q&yW}yb5O) zs)J>yr*<`JXLe&O{)pKzc#yZUe5hxk1ZvBhU=Hkux+TL=J1`1ka3*SDn=teJ-%g^H ze2T5{Bx;4l276nYfNHOX+VVuy)^)b}mobF$tEh=jz(P3P%4w(_co(%pA6flZ7@_z7 z8>_g5IVs=A+88jzvjOUDn2eg>8>oBzD+c3T)V+R;db&ej@m3gaMxxrIP_J=i)We&I z?go-%5C*E6(-_2)P$pl zdABYWwIh{=asRb-FH#YQ?NKLA!CW{Swbd)Eyar2A-iA^5U)0n55cNYW&v5Tqh{Ix( zlTa&7#VY8t@)xLnuMKDaHQ*g8p2I&eH|9_ER#F00jzevAEz~V)jJmEpYQ^0!ANE0Y zJQ}rt$*2V`vieo1>(-l_T@rP?6LsPN)PToO_wqZ`r}Yx*L-Qx<=`AqATUlY$?+G&&HOM%;c?85w^8>#Xr%Y>ltm3x%dCeQ zppn_!Y-@HwEvOgjnRpd7&Umlgb*7VO3+I_j&9_h|rei2>My>n+=EZ}U55GlC;0CIn z-%&gH2(=U0MtKVfGfShctAhdh`QMI219e88Bj;t*fM26#d==HKkbZ-v$GHIJeCy)cIT*FCyHMPGb?npuyr-T=v{*YZ_VNApoD+KPIp z_Fx1aK~3NirsFl7hx5mIJN4Xn{w_>82GxHOY6m-wXaBWzJ*m*jlTj;6!8|wu8{iCV zj7P0LY=U=P3Dl01K~1O<@}JXyebyTtEB_mNVTj8Fx{wS(o$v)}W~WeF zc@Fhy{S`IyTjo8~#2=%s^PA{>%0L zl#cq+ZA1;U2i5Tb)PSc@9iB%GbOY7#ZSx`Ox`0Xic7(yGiF8BtKNJfwzB7tMGg*v! z7Sd1yY(%}MJ5e1SK~3m5s-p|23Ei>!fXUuM@}h2GA=HFQS~&rAeND3|X1@QONQ%(V z9d*ygp=LNA)xlEKfU8j}&cHZ4h?(C7^C{~5kSX3m!cpaD)WcU6YhfoWfv;m#ZlAM{ zL@WLsi{fL9#^!%9`zdSM9uspHp5F;LG5$AmGng2qG8w+ zr=xb_Bx>ugqIM{3uD6rVVR6bO=d%Cms3{e7aU5y|`>`$NpXYtEQ&2m#6*uA6s2!U! z-<#lU%t?72YU_7k4LpJcFld1{(W01xas||aYPlr3uqA41x}m;k!>xV}>M37g?He&W z<y#$RLq&bmQ{4{rLF$AW zuqWz*A*haBER1QW6&yhQj5vnc>g%Xmlf~y5jM}MCRDXr6J~mVCe>_Pp8mig}jZg!& z%{+l$p-?j)h??L~E2mofXw>-=Q7c}ATEH^Qi>omax1)CYFAT%LCHx-2_)b9*ZDChb z2P0539*Y`y8fxI#sDb8V9Ii&~z?Z0dehzirUDVV581-QbTC zoHSbJ6LTo*j_K%0`3Is7p`(D=jeIltQyi@Zjx9trLU&P*=wUne2%e^Vnb=G4mC;{* z3pwlUgk*e?N*(QpJwCtUVeUM#BDC;^IDZpQ$VU;w$Unqq$2d!FVI}Hc#%&mdVR)C& z@rj2snDR%&Zek{N-HFQNpAvc=bo9_|^7Ab%Ue>)xQQxqah~J2zoVJFzN?aiRCI(Tj zw>2O6B-F8qya%B}Z@7*%#1QKAQ$$B9`AOn)@+(9&@+?G7o{JSE~hEwkMRNe@DOfA9Tf33gwf;aPk+3^1kR2VQw+9e;

jHd2; zJVNv%|BjeIUKP({U7UhC$`RiXy@)2nGTL;UB65=FA~smv*Jc~qYLb7XN37fT!-WXa+!C^&&kx&$@95OW9}S*XiK#98@stee^5{SVe`lvi2X zdg`|kD}D7!MYb3J~8BV}12v z!hEe`0-{Gz((wb4&Q%da4o1=O7WsAG^-`tWNHT|L2Jfhe;}&K8%vqaR;#UTpV@GfD zdc+nYFTIta{zYr=f~|rMVzDlHc^zfZ$WHMw+wl6>X#FP$QKbh zUL(3$uJS|6-ym;GyheE${s*TKo5-&bIx0{ukH?5zeMqB#;z5P7Y92fyOH4~e^kj-%8~!(GHwRd9Tp`LD~PO>&77 z@(_i{!--PFL1Gwn^>HHhC3IZIKP_K~J1y@>+ejjX2(mg-=PJ>f$U)s~?0^TYy-ET} zJ1cCaaS0Jl+20-(ikZKnq$=T9=W9|XvesO(ibQL>aszqhJA$>S+mAXXkmn|TxARo@ zsV}WeWS)jrv(*gteOV?lGhttEt+w6{Eg`kk4r{MJR?dE!eei(fR<^ zC+|%(A|HsyQO91)>Pspc<_3~Aq~Lv|;+O;R)w|%oN zPn>jl;zF;<_aweykfn_hs{fP5X1tfsDvOmf9#`z+moc?+czEppbm;tV|FPHiF2A<< z9Su`DV|mlJ1D|zQqxH0Z(m}rXq=mc{^E&rqqd^u)x{&(@zyn-1=X6y^fSU&$7znpE82POATjj~w`Ug&!^ QT=qqk{GR2F7grAWKl4J$vH$=8 delta 11140 zcmY+}2Yip$9>?(~3lR|#Bt*zSjE0CkVi&RZY!G{e8a1N)V^p}de+RCjEv1Umpc*Y5 zlwPVv)o5$0YH87`UaIcro9Cx>pV$3)pWiv>InO!g8Gm)}Z1R1u$#-iJA5W^|I47z& zPJOJJ=r}uY6b50Ls*V$kiC735Uie4aF~in{2D{?4(b8{NsiM915p=lW%k0nY^q3pL&%EQQOl0Pez2+>e^z zX^g{*NglUDKsDD;)I>_72C8TEPg{K_)I>&E`!p;=J_og;&8Q1*xAu=wJ9)_3PoXAo z&b;QKP>_mSs1qNdW?G=SyMofFyaB4cBWl1t7>>iSD9*6^*P28`B zJAp8aAorA{pslKb6|jqSn1;Gw7HYs3QP03mt3P0Vg+-~qh#K%7Y9|WSbk7e*-J&u$ z9cx4qxQ8PS)+M?^Iow!Nn9vE^M* z3+Rpf&l$-dHMqXBmV!E-#m0COHE@;Mt~F5;N=99%IcfqO%v99Ghoi>Hz;IlE<8d9f z#S(QKXCe;8c6dQ@eWyxY$Ek$VFdjFe20D&i@G9zUs9VpSPy^Hip2jBF$?9LS`jr?# z{acoQf=T3GTJFocu3Hv@9<8h_1#NX@Ye+^-pfiTyVARAiP+RyqYJhBv#?MjD&X1^P zrAV^v9BQ0oRR0dBi4V5+amnnzDl)8Nmbt<@ZZ>nQ{s8J0oVEHZ=55q1`^yYy;N}HT z3k*YDr=(c{HBQY2?7!|^BPul04ydgjfSU0Tb1G^8uek=b#hXzV{><_(uoU_CsPh9F zy6usu3&vs;K82;Rm4|{pAj44?SY)m=-!gZapQ0{&)bi`7Tk^Z*c^kRo6ftAW%4R*Y zC2B&Rt`sz2U(^I9VG(=*RlfqY!fezDIp#jp&K*JZJ7@Vl)K2E*RnmDSQ0K*9Dpo>W zXRfQqdD$x7Ft=h79X>=2bPM&x^W#z1y$nGO7=gM#tmPH3J9#zK1?Hh9xXkhm<__}{ z4AlGoB?WangL>Vr=Qi-kZR$P?Em0S0gBrNA)%Uadf#wKnA8UHB75(R1ehU4_ub`fd zA25{bJAYBoLsPh!d!aDI8u+>H8?<)BVHj>GW`4#Q^6-GR0sufDU}@;}Ug7H)ee=Apeb z>eiLB`otFOzkZ#PsgNU3D_d?IHkt3EPW%j~;!)HVwrlA+5Vd0&s0nAGZslqmh`(Vz z?3v>B>yNtSqf^*_HF&IIj&)dOt~1{?_o9By4x?6d&ho3M0q>zEl9wAVi=b{@43@#N zsPkHx9X%8Rspx?kpuaVYMeW37)IjsCemUyLWR11|jJkzBt=;oWpw6p^T39mb{N|{B zolz4QX?n&{&;&A29cQ5iSYr8FbDO!xJY=3WubOvIx8{-MMccUJ$D+o43iW+yh%DIS zbfHk4ih*v0vmCX>Z(#x4Z5~9;{3P;*I^UY5*$(CX&2^}LKVS*`1@)HX=Qp4wmGNcN4nD#V zEX=F06k|}Y`F7O8PGIie|F2VMNJWdTj#CV?P#sobE!=MT4dicQj&C=&y$=&|GEpTP)v)p|pQx_1CQaq2ZXZ*vUl-esXK{DyhZylL&B zz1@jdM&0|`sPmr23Ydl!aUMqFPE@~B9tz16uAuH^Ec>OEcSF6e&!HZgg{Ym`ike^! zYGp@JJ8;?ZUr__+VV`9f>fw&IJl?F1QPg`HQ;4L{*BYi+J_p08UyHiH2dIG#qb70! zb%F0t6Zz5dhnDB>pe~{3K}@w9FO{PO+lS7%UoivLcL~hqb7F7 z>aSx{^53x(*6r(#+Y>cTKQrCxGcZK&|8xp*bXbDwxC1rgPb@!aUP2B0i{%CTxqoYp zMD0{X)cH+N=eM`KzvZJ*6P|(UzZBy<6gE;w#3NV)AE5>)lIH$bZ9HnrlQ0JBW4I4* z4T3YFzx!XqlhB_$69e!CtDlF($-U-g^8k9fGQvd)L+DUzpnKwK^dnz~n$TOQ56T{l z#-pf}+(tb+K7-tcG75F;s-f!ZV+{7dLYRSC*gSL9AokyvifvSA>$YPt{1~-Gr!fp~ zVL|jC?EWWO80xj{ipOv&YKPjh3VphJqQ)D9I)5x`L9;Oc|Akd>@euZ3GyaGQ`8jH) z$F1XK)IGnBc`)Blw_gaVJ_1W)Ez||NV;c6xDEtt$1K(g?d}#Fn!`xdN=b;cxLuD+7 z^-)_i0JX&v&>v@GWt@jvSq`e-0n`f5q9*t=>XzNL`uxM)1(iZgpbBb-Yhgb0w4`EA4CfLezjOQBUz&)K2Ze@^}^VW5JQ`N{gdj=ZdIX&<=xeBcTp>N54Exb*a5#rO)Ng$-QpUk_WGz>&>FRseXM>679gL1n)pmCf%7bX6SV_d zFhuYFr`B)+_0)f3`L7sE{s0?b;3(IYsD4?f39d%n`&$@@_fXG-&uI5)FN#`Vq#2EB zFN+?%*L5i9X>N@ha5(ZAcfy`^pYAc(mVAkM9?Os?jB(pLp>EAstcUYauk}IH4je+= zf)m&r&!Z+>ZY=w+dzUcQ-ICg~ksI6XQ`Fe~e--*$94)t_DLVbXW zjdP!cB#b5RhFa)ktbxnMvHz+#LWKstiMrtLSP~y%2$mS{uB0L=PeN^V6VxqggF3Gl zYQVn5mU#^R&-~Vf<56?r?y^VU# zT}UkI?+uMnPkS%a4);Or%rMmTGEr}dCyRn+_BQ5T*gEV(&HNBX<5yS|@1pK~&;<84 zArW<h&xFUBKtUIpVIAh7ws5Jr!h9XoZzC4MY}Cs4VJLo% zMetkH1a70o`2)3+`nNajL@;V05xH{zD^t*k%}@jOL|v#4@*FusP!~LldWwHS4R{Z= zbN-X;M+tSouBiG{%SWQl8*h0gYWz9aT<`x93cA2))N6DdH4(qbuK7>{2BS_aiJCxJ ztcyvg3#X%Q#dE0hC!_jLLp?iLs9U_i+FwDBIb0DJ8pw-U(GJu@wHL$jOVk9e;X1sD3()(#yHhb!`43U@3RBsCU7#Bk+QL-SjtoMr zd^l=lqp&b$U{jorE%2z-M@)0itBBf>DyRw7M*ioti$Kr~xmaE_55!?=E)2`=|@Io$ij8h9&g= z52c_B&qUq(rKka4MZK19q6XTHn!rb>fsUXiaLMZLq9*P)!@XresD*`F9)mhR!K{b= zT;EBdP>P0jsC%4_TCoQ;z--h77o%3V787s>>NUJ<-a_?%h+0VAnQk76de};0GNxcz z%)**n-`Pw-E53rI@g~M#@GQ5!3Toim*b1AVA1**mUHKs|)V(H}3N z7H|!<&_B>qhC==q+!a?rJ?%A712;iUq`f%?1IWF&3zwUnX1lLhP?q~ou-mW#?SXUL ze?O>(tI0=TF$|jP{)1%fT=stm6>F)`Obh(WeHKb0V>*>kug$xtnIFN{cpj^&eV)6L zRMagRjjeDdYA24Mw*E3|hYHPicd|Ifk;lzv|20qxDjMNr?2b9u8ABJie`6Vp+NsUB z8IPm3Fms{1b4yVZU5>%H19b~N#d>%KBe3Wq_q@s&MBd0lK`U#6Ix!WsMI%sOvKdyt z0`;_Su=d@UpZqxL+4#=#Yu0`Tb$;Mt_tP7L8n+&5qMfh+dPY&uOs1GwSc%+=n)zO= zfe%m5cQjI61By5P_J*0*EJNiL&Z_!#aVsTT)F?XDHNok zp>=47y5KXp9rzxgW&W5H-Lw)Qo4LF1!$RVK3@JuV4ahK<&WSsC#`Gb>0Ki(;o1W`(Z1HT6uz55A`gh zV7dnAMau?pTo4HW&d+g=ORzYS^!dZHGVhCW!;+c+jX z@O4V5L^E$%Ot@!1rI~8v7-80?T$l0@BFXAD;ZR~aaf1 zp5v5s{M*HO&3Z2&*B!e`-j6s>G`6-9W*^$$q3lCUvGccKEkZv}dPG07z8~XB@~gy$ z#A0H&eoxn1he6nqN*!H@54=8cVfxlM(X{YT-xFJi zhr}rA^~@HdJQEudn<@7pbm$G&v6dJ`-LTw@rBFUb{D=G+QHQcW5zI5PgZ#7))A-iA zEk4Y1k?O|>ucp(6{1d!~JlMI%yJl6?N2)h%1u>lbA$G@}#C+l-LdRg2+&`D_ z=N{@0VR>xl!~N91;dLPT5^cQ~%Y;{0K}pA}F1dehq;3qQ6T~>m^@v1oOxZ9`8S5RS z=bvLVF`2pxc$nx;d`q5*wedS_f-j(sr-;+U03w!ng*F{u5h0Wd5gV-Tq}hqK29!V2 zLs^dGbK(y14533Gp89ln&3mkDc%3a|H_0j!ONpA~flRjo<-^1&;>n|sE#-S}Ot~=6 zcABnRkLi>@q`G_i%bsWS-xh4K3 z3R8$x*7g?VY~|j@@sT|#I9b+Gm=WfXZ&sxpztMJy@@GU@%D-bAJ|JdMzDww6K|~Pe zh^a(3J@he?De1UKtmBO0M6@b67E=Dndp$nh6Gh3FXie>#xo!N*B6&FFb(SZPKRyOf zZc1z=LYZ?#8d_QVd)U#+52#PEvd*omKR8wsXQ{tMl;($SQTbrcQovEACMn-lOTQN;4w%IWt$@f-2@$fA%#%(jX%xqA5fIfYA{ z6h@SwT#Se(?h|9FYl4~h__$2@56l0=omTEihe^Z;BA?aioF9k|L@;&pu^aBU_F9P) zx>&N6Mt;Jb2y#De@8iRd!URh;cvC7yCNCsQB0AZb8!5LX4v{w`_EOd{jdEe)SK{%p z&-+@%$imI7W}6x0{i0&zup4wLYaJu4r2sS0|9hb$k$5k+#H&QzH^i5gi(ceAh&9AA z@i7Tyy&WrsdGbuGWAQW&rR|*#62Q3JLRbrevwylmRy~mb9MFVlxA0U8)dKWI3jQ0-$P^v^{nRW?b!RJ+zZ|4UEL?QP%bqxF#mv&qn{fX zoi=t*nzzN^2Kk%jrj3=(8{GVf*6dS*Z}~o%e=)44Pvk${qf?qW|CeR^j`+D~w*T}( z0Z*Le9h246n>u^s|5v4WBeFU_QI$O=D98Lr!m*eMCtwsV!|Zs#@^>%`al%$^|Lm0vSToDG^&4$3)|Ul0S=-r_n~m3&Jqg`eVV zJck-Lw!7!CXx>QF{@2j2hPzbsIJ`ogdC?y3z;#g_dm*m~ZzwjwlUN(G_Vm0k?2THP zv8eq&LERH8Q2XydJ$~P#CVT}8;@zICzs@W?*7GW32~2`RQ9F)84LI5I%TagrYHQzy z8t^dcL@rwX5AzvjC7-C5J76xA$*AXf9#+SrsGBtPK+pRLtD#mR z>mYZ4{HPNtjXLAHW)su|TB9yechriG4CJ}~v#ErW_&ku{ZZ*F*e?Sd*1GBLbe_%f1 zkijlr8uJrZL>;I%>OjL#Psdc$dt{~M_oK%9QR?~sh00L8jj6E1`_BHT0sRvejQ*V6}@8jpyHRPrA@}HG+;VZ9D#W- zC#qiqv#r_Fd>^&n7>g&OPGFA3-=J1($55`nmi`V2nP3=$V`kJ6S3&LA*Zjy_jJjF3 zpw4J7YC`8x6TNQUHUBnWo590f|Ip#~{6|@$AZq3@7FWhB#0{_+_QNB%AJgL}AGo{x zbIeG*%e;s=h#y*sDYA=^t|F&7;9ly^J}a~ z{1jVZ$vDsB!SJS`4(J=@c@?lI>cj@3R%#g5MgMpzTEa8tO^hIZhT0*N6_T0o6U=Jy zT6~B2ThuG|Jci>_)Z?1^LuU)r&G(tP8g;yF$OQb}2`U*#gpYPJi$-1B@|Xr|n5|F~ z>4iFjfv9Ue%Hj#A3C%`bicOY3fg1lZ>cEds`z0Eq&m3l(l1f$*jZgy*LM^%9;^i1Z zydG2IZq%2^)2IX9L|u}EW6{UQIcl8Q1q|o--fJq_A$+`>SuRu@ zjo)H<8uBzSHL>#sAtY>C@A zjralbIpd9*%J(_Ej}@>4jau@-sB0W=u0b96AZolzm>X|l7=}!DXPgsL5f?^X!iv*b zf888SEzt`#z$ny!lg&k_9oM6tj=iY;uA(OL1nXhQ47W0EQ2WooJh&XS#U9-qolxIgJ|Nvb8_7IN@wJPB^N)0BZayW<%6* z+9Bikz5bRMj(UN7f?DF0mfwduvkRz!o?vzK&2bZ{X*M?7;#u0eVI((Y>A7ya7W3Sh z4?>;55=^V-f0Z@t3?%qgiaOvcGjhHgpd4xft;}wy7u6utO*R5`X7T1qRR68!A@dw2 zC;tl;(DQ$f%7+-fz%BU#)C`wmYFv#OaR=&Vx`5^JmF3HQ>e`!|{jenMAEPF)3nTCt z@(S^8V-@WCnLYpOsOU^~qR#vfYR6mn0X{bSE_D6wpw9FWYC?$?xrrCVC5iZ;LhXOy zbGPKbqTDZg;> zQ0z_o8|nZ}zI0!&JD?^Qhk9D3V>E8SZg>NSVePM2e;r`oSME%5uW|!5!f^8KF$RaC zR%Qd{z%!@=JT-$?y8~rL9jF3k!v3g=uADkjIlsQo|0P@IHia1qAgB}{@XzIOfEqgKY>gGvf26H$-V9E*Q4e@DGgo}%vZ zBwV;v30MuRir=qu_e97>H*f}2zbI^mrBScqDcA?UMXg}AO@Yq>zgLq=K@#s_7F>#2 z+P#<)&!d+9AJjy{zjfv^i=kGq5^4onU=Vgh^^Y}&m}5~ZF+CvHf37tw!t^w(Mm=tO zQ3GB^4Rq7uN2nF~*W%>gxe2F7^~-~5FM%nsI_h3%hH0=r>I6q)UOoS_sOW&ZurOXk zUE8Fa-GHUd>ZqAFvADIx-BAPf#lSsa?UT&8s0l5{^tj3LN71i_i&V7qw^0X3y2Twh zC2HUZiwl`$Enf>YU|ZBU15ryq8uh}Ngj$i6=0;TiJ?0Nv?DPK~i7qs}z?s;7D_@oI zA?jwyvdt}JHOx!g6!mz3$_s1~u_G)Ft`?)xO?O zB^{MrSRBt`CLhbVi*LHb*>`*10-TDPP~JW6w^z|vmAEl#;MwMG)WE-^F3D5WrA@Ne znG3Z7H830cJ5Y(BG6r>R7NK_7gx&Ex>hUbQ&ppSnSd4fE4#0z`$Ft;qw|{f9H)`C` zsP={C4$EJ`k{sWAMrAY|3LS9YZr5Q2;*p2~EL!B9Mgx<)@^R(y_?eVo~G zH^Fu%oUs^5`w-O4ISX}ZzCj)62I>;rM~xSJ(%nPZFo-xW`gMS!RB~c7)Lr}mY9$t% zYf$&bR@6YJPy^qw_C%+6)|p@$)PA3xc4zpNxfQFD|K1Ea<0jJh4A);v+lqu{+#40Y zZ%#lR_*2xt>&;!}F;xFc=3R^?euYi3@L6}Dv8eGUVQQR(8gIo})?a6|frJip%o?s^ zTjB@EUFy|2XLmDd$AuQJ!Z_kXSP-k7cb|TPa5wQJ)VOsn@J9{oh??L!OpDk3RJ4>& zuo0&I!Nr}-ICDPguKgCX<9SSv&oK+8yvRo_7Q)=v19hNjsGEBacE+GfJQ3I%lc0YC zm6TMrq7HBbwN$rJXZpx|WhVd8%{(KjJwNJhE{)o+mgSpZQQ{63&qST^Vv9F8{oZaW z)o3`5vAT&a+t=wUyjF?haURyY%9$nLOX)Sfw_(V2zKF12%Ny=HVS<~USD${pQ4`sE z%efyl!4u|H%iqT!?mzEYphAz|_~e6N)Dot_QdkCa;y^5bb1^v{K;2BIF>o!hF!2-A zNJCTZJOH4z)zr~{^$M@z_;e@>P7=oLy2JS-*9DK)qD~4N$tDq+EubK3B_rqu? zDxVK^#wE=fr~|jabl4LUVI2B3(=k+{a3SjE+J(yhin_U8q6Uck!(H>jW;u){UmJA^ zH{vLKj?HlBUH2Fs$7IA&_ni67lJ{7DHB=^%1M6W59EdvLC=A8vSPYk=-guX+{VD29 zg6_M=I0SVQ=R%EJ9TQ_COo%No3AVv**y%p&uZF{xIEJ%`i#%{&C=OvQV&9)`0(CGq z@hEd8rXoIx8S$FM&rpwN(ueMZA~BdaAF6+G%UAPL(SVInkKu6ZFafp0Jc~cae8d}2 zXLuD;;D4z7gCDsG6hY?EQD-p4T!2x; zU!eLO!E|^D)$cxP>Hk4}Y={2s#)-xt;uwpoT3p}a7MMfNf5$+DAB|B1t}-`cUE%{+ z0#iSAD^mm2Z!zi&*I2w8b!m>HR^l$|=}G#`_0Nquf#Mcd!>SzLYfPmS&c@kz0yS`# z=kD)yLr@32gv#H-V)z_0Vu2U#z|~Rxx?&3)h)wVa*2ai`+zY82YGvZkuK_-yk^vW^ z2KWxs;C|GMFJM8ug*vm)f8C$!3ZrhKfvEk4p~f3;`9-LkdWE%bLXEc9t=SWG;P)*aiMn?tq6Usft-wmu0bg1^P&i=1I-cEJ|20Vy_r}Y51?++WC?wNKi5@2?H`fIjh_=a5x-ZI ziq5#YSdl!niOUzo{KRE2g`WRz zRCJ(07={xtGcK|GPSk+s%*!~G_&VwmwNC1cMXlU$3_Mk+OSRbCU>?Lum^a;W`!m>-(+Q8()b)Cp}zP3UAYpFc3u zDVTV26F7`|(S(M&iRD9G+ft}ETP3pzYC>I6C(s*p ziHBJ{2APoGn?^;~Vy!hCMjhZh>cDqVJHEoo7?jSPK^@e+06pbm82;_En#_zw2NVNt%o z51Y49H*w*tZpr(hF7Xs|CF%rrXJ!30;8_y-7W*^m6`Yh8x6U{VY9e`2*RTxg-l%VJ zSJeK)Py>!P=b`pnje0t^qxQRqn#cpJhe@;h-O@D6?gp5Qd1zRKn!sVy0nS+aHS-bb zj1%Q>?}zuWIq^hP|DRD4x`(<%uTk%jtT}ywKVXzX-Hc28R5a7wsF|IzhC8SMlIHRS zz6oVQ4NwbpfOk>ty)7Pvxl+TKpdBY4`}W#7iu{19fJnP~$v6yMv#!(cHK%fxh7QOL=@rfE25gki zop~SBjtfu|S#J5w7T-c0@VOb5-|b%#HGw8(2h@wI59%I!9|M2?n-ZvS2B;l2ntRL> zn4J7&EP%h^hZtJGE%_|e1V2T+a8{r$<#(ui=@gd7=aw&7(6u*|ynno&RP=m~MonM~ zYDo{`c)X5Puty=+z6y0Fn^9-J$MQep2gLWx9)(@MUr{S}7d4?*sCy-MG|#{OURQ{U z4t%P(Tk@Y!ak3J=z;8Cga4qo&Y|kaiSJD^wbKQhe?w(0p+MQ7ZcBNl&)YCB^dty)- z7Z1eV#J`}%uNTAfA4#QkjGN(5)Z;P<^=Y^UyWv$FhE>bD1MEPZN!D_1pgO3Vu_eaf zK-9{tK|KY>P%H4zOjzC>CqsFje;ueaiA)%an%OvWhPlXGje3l>psx8z%U?2YnU7K9 zzP32Jf{V+e?xlXH{Xg(i(VJ}?mce-#hi6gOs8L1Nu_bC{I-w>w7WG(7xA+J12I_tC z5OtS(m3)Ce*JVWgxo&?IcTXg(?#A_}rlO9SP+ysfqF%)xV;}qmwS<{#xX*&hs2|Px zqP}W93;> z;H%>f9E2J;y~TOV5|*!m8m~EO{NCu-(vP5`7tT1;HCtkSjoM+GdD`;7VHfg$;Y@5< z*BAJ6-5;oXCA^+n$qJ|ytB-m-hhkZrfqG0&)Z_Wr4ng(Z%nM=(;!3EyeF$o)=V47; zkE!tm>c{Y84V;BgE71gX0L)4G!FH!qvYUB3H zfx78RVH<3W?Qsq2=1taC6XE&mM`aj^-%%Ypw{zEa4{E@_QD^cRb2cC_Z&}wswc@VY#S@TvGo`1bMpOa{cdAqs;#i0%`4)wfG zMGd$Zbw+DY2Rdl^E7+F!4(cYY*3E8a)P8dDQ;bFYx!eaj1c- z_3#D$Ue^XS!Bwc4UqLP918juJdb+r+In<0t-L&6ec07q1_c7{m4T|*z{#=*GPemWM zolpmwh`PJCVP{Ox%NO`tP&d>IWew^>Y9s0Z`%o)&9d)L6&F5y~-frS)QSCWVH*-e=Yq&T`s^%j@w|y4RT8 zR^l5<+BO+)Ti*wI{&hBQw)!;eqhz-Zf70+P18Mt~Tw%%u$}r**P7Pqp~MH-({>evdzn0u_>YuetW-?zlS zQ_|DknNotH7mK!Wlu`7_P2U6*ZAWn_xh?nrr<3c}lYa_P{vk0RE76#Sy0#IvV;BSf zK)p2iMHJmg`crIT@{a>O`FWALwh;V+w*2%jhuZSS7bz3rZ%Oo+Y&YcY418+1cK2VF z7iZ5tv>l*LTRQ4NX#1Q#+o+eL1XDJX8%M4v_2+n(ICK1oa$&V+lZocAStxVJ)+HWFk2l*= zDqm7gQ~sbWihhZyhgzS>au98o=s1B6@zggW zA9r3Hxnh(W^eKZO5TJ zO}RkkD(Y)OQ!I~TY{y*GKc#4ENSii&$iAe#JS8jjWARHXgjU|7CfhpE^N{s^LhiiP zOHsegUR8;!Ti@Em>!|OG|GPqA{kOk?uRUtKPkBLWb9$$y=v#)iOw>OjU(1Doe(=O zSW0Tj0@`w8S?h3y{`%=6Ir&+ZyNEsM(}K3Jx5mmrJtu9a@h3`!gnahC*{aa_LksrX zPR(^d@^7|C@_C5QVJ{4!VT3h~d8^+F+dm`w*R=db`i->u7qma5`28fFQE5TPx3`Ss zHjwb)&y+V?Aq_~}26x+F!-yx*p|Fk7#Jo%XBl?V{Z5j1{-VB0sh(DnC>k(w4!Ve1i zBI2E3hg;O=Qj$_i5FfA|YvWzwAoAxhoHBu;?Y6@^hgry-rJSeU3cwf#PR!4R-eyV?%G+B9+P)^Sh_aowNB9Z*{6y(bTYXBc_}?o>v`(DkVes-1I{@p}ZDcY9Ms%;Ie%c*yAq4$}M6i)mfWguZE4SgC$VaLaJBqp?$BC@OeT69A**d2enS~c{_X9G#ZPFP65qF4n12_| zgNRPil9@7%Qr~*Lj}5F|kUmiqZGFv9>XoSfZhgiQ_h1%pwo_DU(KeEjl>EoU$0_&N z=K{I5`n}8F*84lmK&PgZ@-|3uI;EpDr&J~P9WJG$Vt`YW52+_4pO$(DN?FQbinby6 z9_5b3i{txN&+hlwBdKNjxQ^aLa*4>5wzw4aFQ`|vcrfj^$Q7XsCbx=MTTPCfjhwa+ ztWLfxWrXD_;v-58+8>br*ZmfV4`-6MNN&bZJJsEEXhJ+KzDSLT^iPPYQM45$t1TwJ zQ;o35tYov2NsK?BexB6!10`kr>>63h|4eP3?NdZeY!Sp~F%^5oT3bh)O<5J_!CMV? z#XqVM*7_ZKrJ$t*nTC{-)R$3CQeQ|Z$eaffH^W!NH7VIBx!7+#wx&(nLE@jO-$ZRw z<2%(1^9PezOO%6pj@*X(^mTNdiW zaXAAlvwREN$4B3K6m5+t`RVf-uTf@F-fa1)Y@*zxJvrsD4y-)W4+9LrNubJ&4QV724k3GSa?raP32N8)S3aI=*-QHyByZm*UMlHcxKl%bvu#&0YVlFH2aJ mx&<3_8{8qbYh28T*a2|`M!3Yrlqa%9yqVPhkF)?bM)WRvjoxb{T0-O~ksyK?y+kh&AzE}o5IuT{ z2vLJbM34~W_x{}dSS#QE;CI&AdF|)f`|PvNKIPtP^2zxm`_3i#xDXOgmw=S5-|X2X1_1J=SM*aQ<}D@=-Qu`715{2}Z_d<>^zu{S-h9PYU&)qOp@eFmK#2wrvNQGQI zuQ)csPs~fm#C@+wM|Xfqs57aDI@32%EAS3hz)vt89HzI9IrgylZHtFl z{2}UQoM^5`P3XMj_}&dFb@2g~!uT$3$p)f29z~tuj~3rUU9zVbg_*eXqOlaJe>2nx zbh7vztV---8T<~X;lJo>;Lo~w9;@jsK@E_!yE|Yw>M_ZUI`h`30}nv;n}WPDy!qG| zA7gE--NP+$0%~QxMD4!;b*~&n?SH)o*I&=&pCmNn#65Z0U^wc`Dr04Ai@Leyqjp?| z8gRYkkD%`MQ`UYJHQpbn6MSj;biLgE(U_fl!CtJt4%omN-Z#gY(@_UrZ1GAAA>M=< zcsFVVPNNQ3ptsAH$2j5!sGE5#YT}=x_W#o2jlL!JU{)HAn0GLiIC&qpV?i^{tbtmA zCa9I_gBp0OwNF8Hrr}uijrR&c$rB zw8c>qtzdCg%u8G!wclWKv^m+FhuUwY#cPMK{yKx5mNLQ>L^0G3<;_}VGt|sGS=5It3n!Rouo7{$;qJ4f9r9p!n^4Eg_W_?X=(nb#Gn<7v^95KJzd|kH6H}j5QN+=x z{^iXoIDxpf#b+@a@g>wN_8DfvY$M#`TGspkx%Yf;ud8^cPzStfR#tOiM2#s z+pd@v`wYmd5P(E^6S} zsB5>};v<-f_yUIEEeywhPzMYh?Jh|H8Q@DOYMdP(x(OeW9N#-ZMFXG5eE1x-WO>H8 z9V(+H*1+PHxRJOkmcgix_=LnJr~|AucVcl4d>HrOi;rErdz|a{a6IdulpO+}xEUo! z9ViWIpiHPsk{h)Wah7jm_Am#Tqp&pnCRw~6*Ky!esBu2})H%ys^(pJGH`^`}1@H&d zg#JZMAkjn@r@=|Y8L%HN! z^+}|`7N~339d+{!vv>+>fMuuw*PHuM`&~di9k)^YCHc%vBn#FfE`?f|QKJsHg^{a^ zE$@d|UGf+3#0@Qe$&BLhv zKTAFTcP;S`rX)@>o0kx##Ss{fTJl|}3GT-*JdTn03+iTiiWM<-j>~s6hnfjkn)X$w z30y-zipqT|yi2^$xt>=Ar=U8VL7mA})KcHIe2RJe6erGTPC@lc^|?FK45$g^LruIf zE_jXKji_;-E^;fLY%%MvM5)D|*BPteYFvhGxkk;Fc;5TO>zBHlsOU0xW;L)2`Sz%% zV=wl=63bmY7kd+@T;UEl1hW!crRhR@rVIG|yrL9j>9S`4h`0 zUgdTSGqa)w&TnxWi+f;7^0QF;FU4?NgK_vB4oCkvm84XLedRiiLd|#rhT>|hj@v8_ zaD9|dje4O(q3-emxH1txG_flF{k};c}>c^)W5BwtOGVr{~|NqJh7_BDe>2 zO&_3kjNRlcike_Wi>q1O2z8*AsEPHq_Ce+-)WjyCPGr92H=?hGJyf*BCs7A@U>%;I z22Q%!O(2t*8kH0t}q+-I|x3W^9Cdk@P_wU_5Hzd8h;L!h(1mwO`sD?w?+=p(fr5b%`dR+Nb+e z(ov|Zz_{9%VGD9{t9&lyD>Zdh!p~y8ES%Y zN1Zh=D{&Ll&G|O!(o8@d=v&k!ID{JSCMLy~m>iQHWBql2G*oh7G1Oh$0(GGG&2gxE zV>)V}Rj7gYS^FgJw@o$v^5n@gn{4PRhS z-9(s?xaCFOhQ$4GCg!`unI+=G>SzA30q9Y>1^Sxln^aJKUy2o%CrXYT5Ci%_9VZX8dYKS6{6LX^uP#1N;mKct`umpa9dgHCL_T#8Cxr&i^ z3w0BF_uK)ZF$rOQOpHY_DVD^pSpFXCuZD#r^mr`AshIqC_l05})*?QSnn3nH+`ZAv z9FA$UA8G;{Ek1^NJb%Vee25_!xbOO>MCGG=DtV~nMLmWMtwVd%4sTif9_A+=hdRRz zr~yu)_P>IfK=MCbKD${MTaho1xp5lmUfGUX3I7xo9q32YCAf|)G30^!dtE1U1EwLL z^e=aS45&C3b*3dy6R3^)cH5g$cFmPFlLgHihpM~ye$@{3V7`^tZL{?%a% z2@SX(btY#~`P=4W%uby6nLA)ERC^P%gV`5#;Gq_eMBP&pQRB`;t-zP4<0X2|`l}(` zbN9127e)}bM;%}gYJgD|Pq26vW+lJa+>Ls3UPkSg_=Pjf%!*op{1}B*QRBAvtwT@L z(hjzGtU1kGggUb|sF{Cb`Tgc8)QMa{UBbUC{|t2rLtb)2^640Z-xHto0>P)kpB-?O zP3CFT4F5D!C30~-)R|Q`8=LJ>XVS+UY>u$@@mP%Z8CV?;qHfYOi39p`o$pnpq5)!F za|g(eI+HS}Gp=Jcvi6p!OVky$q{A#f6*Cbpw0N6&z&wK*?<(eCC2nJWeg20gbq!^( z03G5{XW9#OpdpwMKgBG#)be{!1D-c8;}GJTs7ur?nX?~iybmz=RH06AiRAd+CQBT` z*NHEo2F{k;nF|{d7eqZa!%+iFFz2HVunsHWE{mU`RyHKWjT4TFGh<%NiN1EMPeryi zyPE@16B%joSkxIzvv@UX#kQfA{+1a?5eR-^i9&s7RYvXC#~fpRo+97}@77HubVlEz zCUOcj(<|m3^P%~|OrFy9PiID(1yK`^v-ow4Ca#Z7u`eFLJt=*6jXw!>clkopOm~=P zQJ)2WSe!mpAo#Vq5bEA&XAU&Sqt18%X2Zkg9n?4>sRO~E`Gv6-acAEutFRJ@N7xce zr3nQ8UN;eo5_@5R;IHChs59%2TB#wZ52FuJD|py>&%1`h+{1FzoMd< zZa}?aPob{mBh>SnCY`ex>gJncu0$Ph3u*#KP%oOua5u3cs25QM)QhdU*#b48p2!LK zUVkdO*27)G`xrH$si;e_-ttFK2e^Pb@O{*NiPHzX%9sju0&k#J=55rHe_-)qOhx=P zhT%>O*Yp1a6&>&z>Y5~qKwc1aQ3FlQ;AXtgT!9*R4d%nss1K~cWO)M8GE`l4e z0+zuC*cS6g(yr%!tSUGSi*w*bxChTD~|TVq@ZosQ$m8#`_(0i2{Bu*D)4*kcdOwjEhh+-Hn>q3CrI>4G@w$ z5d7+u1@$7TgE~M5RC`~GN1!gzrFa(&C6bu01d60P$vB z)PY)}2I_6`Ak@<^7PZ8SEWZJ4dC&_n2?nkd=J~v?F z{O-*Aq4t}Ln#eNCZ?X6m>VQwpOa<(m)C9Jo zmh^iZgV(SM_AKn$SD{X13+l}GSpF9rO8mRovxw_=9fSY>-#sdtkyq5sJRj=sbwyDJ zK2g#w`Om00v{WGYFP@ojHSut4%OxsUIuQJG-S{%@o=H~LolsWnLch|er(+KGz!Y&j z|4Iyq3k3gOcNKMj2IaWs*amee-a|bu6HuRqtFbFy#&@xLd3S)Fs1u2;;Kr$kx*1zx zIUImmnboML;AjP&e;wcf37Mp#J5VI*K;4QVqb4{8^|3w0;`8PW z)cfQC>LyS0dLa1cIzKZN{k?8q6?apFRCfcXLv_r8`pQ%i^(r2ReQ+&m3A5F3p9NJ> zzXjjIXq<;y(H)ozkE53UF>0a_HG}$I4p;Gtpq8)#Y6Tjj?&deGy{q|->7!O+f|+3X z*{E@rqaL>%sPWEP`xT4tVH$n@|80q6wcL!;qGp&A_06T2<*Q;o;^wG`0g}Q_X zQTshLlht+;OpnS(S)3QOGDR>%&wmx`P|s|Ix>ns#XENCG6D&UqwZvbbR^XtuA4d&* z$>RIwbIYfwlybVl`1Gwo`=gPMSEPP6=%*qQuhoPt^E27-UCTZ6hM ze#X?8xSm_Fbg0L$0+z+*sK;?qJ)VEsnI&g{oFoc z-bbxO`UbYtsK+)h>OE2wHGW6b(=rfs-02N`_wL?CLTCOf>YrX7p{{k@8}8=mjB4+T z>2WBQ#7UT$H{V|DMSQtoAo%CHI*r_fZeR@g-%#VGYV5{sWDfJGXyB!&YqAb?ZTFa0 zQ7e$B3BOt~3iTNfkGeFiQT_X4H=K-m4F5(wuDP1JpWF4ZKk-P^WB34rmo{xPSIL7K zxFV`UEAw5;&p>?`t;dmg2lXwsPjmO3?hrO74r$@u2OUr+Gy(OabS`SY3pfPZvgW{{re-Uqjt=kFhm|wRRKk zjkcDTHCe+n@$MjK`W`a4tGta+Xo$E+6!E2}kmFeOR5RZD^YoP{gg*u~d7`%HeKMmWE zUxd0zU!cyoR9ClOBUIcDhvQJxQ}Rz&-+jvE?iL9Cy)GU#@C$qc(|338_AaQIPeTo~ z0vqC9iz9ltd@-{=>Za|9u{ahr?kWsE-dL9Ss!v7FX;e>lpsJ|5dmwhg?N|e&d%2bA zhI+O3MIGRM)TNk%TA`)pI&&9l;zumLjJlbBL+$53vxcO-`LRhN95ql4)Q(Lo?q&|a zYUD>C_mFplqOB|6Ax4rYLTO0-3(9ut8`Oy{e`5ZRDyx5rg^B-3#PfHbfG5eTMw!n} z+8WaMYMV;_)i#q#4&sZ}k6+y01?oBI-`;ZS%c6RjC{4+2C%&nqZ4>d9_5D-Nzs}~> z_AZq@H0HJr4~TCtkhYEFic`*5TUqkql+48XiWWneOZ*2#pAE;!_s84B$0(~PueJ}V z7bK|UGxO80vbcqvex&gUrH-vaIrBT~mxw+cDVvFZvs@?ol%nXxqU~eKNc!YwoFo)& zM{yy!ZTLGTkn7rm{}iS?B{3JP(wLsQwhwH_j0}8%dU^7nQ*?ji$0Xz*QNK;S0(EVv za5-^d`d3121rv(JMft6X9+B;VeKFoO2LC&W|CVIWw`lvGHfo zLT*jM$Z{Edo_UWKkoTSS(#!tUrcWqsmuO#0du2vmiie4{rAI#7y%*&8NcINU7@wMY zXfs)T5&cULmkaLc{<9%b@V(-K$~4xYx|mYIrM!&^rOHS9V`dThBAkJwPj7rJNF)y_b9on<9RxMLWk+(zQI0}5#&l!YS5Q4w6>&oI7Qz%v}L6}j(jZ_2LBsFE;Wnv4$;T7^`oSryxJnEJS1L+1?l%L z{pV3?lUqt@=KA{HO_JI=;0kPndtGBNA8fNL7KZa^%Y)^u^#uJ(P)|*MhUI?59`tEN zTju|amB;F*@G>PnF`vY*w(4{qVZnau*o;ADlYh0vkS{=d7W-l<8irZpnE&)!Vf#n2 ze;vzzLqFf@D{23WGD?Z3RGQQAzgrZ!jU-;ftCUyUKh*0`TGM}*4K|GUQ#ur}F&dk{ zlOIQ)4{2LQ{rRgwa2D}!ieHZ)E0vB4s2^pAU#ZWgq@a`~{@!-1jdzJtl0Su6D4$TY z-EnwlF$cMmlylTaQ-)Aa!=zHNUkPkQu8W&w!u-lfs+XZXmY5%D-d0Ko<<+*Cw)V7r zO=2NsCv6Y$4RSxx_7>Ks)J?cuIjU_^T5r?3#zxpl556pWhj2cAh9Q)L^wGAO`iB&4 zJfL1TM!Fb`cO=?FH}{)<_7cRv_*! zt;NV>rpE!Y+P=m$l#j^&cl((*J^dciHaVehwT%95ng6s?OkkS^`i8N zrD*GKhEuOf{Wt6L5pj1$f3=;YQkOQLl8pR#;vXo#u}@=4JN-+{Kh}E-W}s6ON=3@+ zlrrp?kHyA1I@#Cng_3y%Qy#@;yb{dpMZ#tHp~F`c{wi6SGGO%k*&_ zy$R%!kt=I)IqEB^SF(5r?KjAkqzokY6|uIO961*`ZDCl8d_3g?%T>WYDK%*Sll%+! z??QaFCiyGLO&HD~+V;?)8S#{aVl|>7{wAtP(N>DAwu%WIYh=utlWa~h$?+_vc8%Tz zOq(#RMs&ri)MnZ~#jG_O@fqsr*sG7Vb;fCwudL5d+@0`ejf|}h(JKutrO3QNiKD)l za)SB-N+ISvkhm!Z=v$Lq4oW`i8}Loqv>hP6O#K#W`z)bj&5V91nYBb&*gHG*Z>j%4 zkDJ!3I*uhjp0b+y`?PEOm-;?(wJ4J*lPLYk?V@P=7C*PT;$E~b#T1ky;xeu>& z)P5rQ2Fcf$$YtVWl-%SJTt^~a|I{0ktBlw28>~$!P5lqrUt&>819IyqPl9{#QA6(4 zmYn>*7QDqjqXf56bU1CD#*s-%iC`l0TyyY`yV2C&r_T}wSZ4WFwoib*^(fk2Pzuv0 z5pBOvpQfa31#lDPI_;?`M_zrJPNVZV5*~v*!Lhc3$V#b3{yRHZMcSK@OGaFU(wq84 zEKQ%5)YDR5L7)4SMC5uAm&c!J`|lP-`}%>kZ-gekzV);9?VFED60F>5Guu_hcT5>5 z{Mn5OTW`#tA5*)UM=uxrZ@pm5?QJuEUA^S`=B-87Pk0z#RHJMkA^8OKi&2qb)jB!mn3;1U8{BElu021SffAfRX(5ivzHC<1<<648oEktI&Y zk$G1xtiyECP8XeF9A{dm4CA5;rz@AvvY{;@scY&~)Gt?cl zIH)VABd8uR?%L%m6-!&mvUV3B1wsmh6bKy+zx$!#jd>TK6VM`_{lnx+OPY3CURYg& z=6fWhAwaF6wFUJBsVDfgxRx$8jgFD`jx1a43Zx-J3qu$z*{ z5t_0UNb`WEY>;}A&NOctvspZTXO?Z|Im=Ts2q_!1(%XU*2{A-#KYi0Yww5R1i(P>< zTM(99O&eQwT%fWg%QS6}0w4{cK+8NG+Gx<-K{nBMRkO@?#RN}fD3At#mbZD~`ZZ9E z7O2D1qG|o0QfOy`9)r$q&9cW`5p|Aa8IzjL@MOE$m?33?v=c@^^%7DyZlh_!)AYR2 zO{Civn-WqJkY)(#@n+N2d84*bwnu)b%WVZx>$maK3e~M?c>YP-#CJvB0%=re>Nli~ z0@eEV)%@xUA#7{?(w|sX}opP=8U?Q71A6)>MNvUAzf|F`^6?(LLJ2(|knqCh40LQ{XBmqU9An%EhUkR79Bt7~a`;h6m(U{H@B%^Y;z{nOQj zl_hxX;=qw|V`0_y>jM#2picKfQ@^0PrWr3psP#0}HfjACiyaBcAJT3}ziWGLKVA<; z>yUP9LDNXk6bUWQ@;QK%H%+yV+UPit9&%f{++MyLg{t}m@j}?#K^haJ43KtU`nJ7d zr{%-ZBBUP~XwY*&>KTN0sLp41H>mK8+xKKyHOM`?_huO{yXAo1aJnBn1->>BlMbn? zP&5dy_K(bN*l2#Y0=why6>dC-FL%W%FDq(1L%Vb%&-eDk54!>kL{Nq=@wO(yGnglQAMlHfWjq zL(M_$K^kQ}HjQ-j*=ywRlm1BSdRW zUvzA@5gm?JAk7&hPe|i{wC^G9P)KW;2AAc#>*?@o= znvT{X?L0`c0?8j*>Df|eXVqr*$I()OuvhCvBwkZD-lOb2y)5E07vPQ(j0DTc zwewv3-ayJ;(BzM%Z3R^{<#SyX+ekB!71FO4q<%pfNkLOyv|5j*x=&iRW3kMTY>-|9 zNG%jdZJ~+MT=$rL>pUNu5t8jcBKu`9|Mv9K^8Bwz>dUE<6ViwvtwVvdIncE2pt@EY z@7(f=ZS~{PFKC;$0Lcr|>jG(g(s<8dTe}xyRv?WHQr`+%-O4YVjUj#AlfNz}A`((d zP>Xv(>IbAl2U0dscG8u0o@6Gn7i#qkvY|to4JbcGR^+0R)g9BB6=nO3ITa11PgacC zyZus}1(4zjq{ToxPxJF%j?GdaMWU6wlMqL=bsl1#v*A}_vZ366-}P$+QR`VV=T;@Y zjiy5;ohwb+y1yE81Szth@jYN&LW>6zxX-oyW%g2;DSLL5gZ^VK^@`p5Ds89aKR(0E)Q5!i^+hx>)$7i!_ z#(kkGwDHZ{FMYbIZv@Y?{=?S)mcNNxczV7EpnNx8zXl!k9O=fYvYni7$9oHHl&!P3 zRL1rb_wISePnb7(dPd4L-dnLZ^jyS48dX8-@tg&1o!a@Nw`!k4?`GK=S0K$1v|U~| zdds#a-ixgcb+`>un~)+4q*W_u@=N1=qesd6ew=WSYz0yaXlfNw-U8|Ds>i0U`bKR{ zc~j*Nsf7a7t!g0+_K(@@{xrr1DYBr+A5AYhG^BaE++Vd7ZmO*sa(_=V0`%&&e&l2UHuzJKXEcS-5buBZsskM%j{Dw#b@@oMl zZt2s3p+tv}(;rsvTpu<3o+5e?&u6#?JDKT;%Fq3=ALyQk_d7d-<$>^@K~P#MLtEHYr404l>2aOWQ*%w(2Qr2w##eju{HTVmg*U-vBq4D zESo*J_C!u^)yu6|Jf;H8crD6(#OT)^?cOX)e_S)DEoNsPKamz4WjFrIsm&Jp*yw>V z|3ko@jkv(hS=Kr-ND%}|DwttU#4n-Rm|FyT>esfrx)6BF+Dh*V3_d-II~e3|wA+8jrGjQQFn3=Vn(?_|$6XulW$0 zzF0S;Epj33=tSACzFn`tqmF9rb>%kkhy8gQ+kS4>%i&?Z`u&E+x$QTfKQyzOe0KBb zHT1UuddO2y)~-hYPil&jeaC0`^t+NSuFvAMdue)qx0Zb~~3?QRubKeRFZ`cRjupI<+8yt&3V?%38; z<0I4SR@Op3o_#Q#-@T_;y)(T%TdH|~Jp1$38jqa&RV_>U)4Si*HYRGc(MZ{EYaS(psuD(V~Nt4wO(7Jv!^C`eB=qW#)32Lk_Vy zpT=lxBZruC<&YjD%^~FUj64;3KHuN<)yseIT(8&H`}%(G>%Q*$zV5?sE`A<3T;AbEkQY>%_#TkFv_v7*{mww zZW*ktT*r8Imbye;t8PU(^L?71P%Bh(mzyWV##HSZGny=v(Q{C)XeG+IY(aT{cG;;_ zz1=MLw>nuK%B{;sxvsS+qc>~51LYj|qs&^ad4+23zH#hUw?rqVYLv_(qCb zwF4+;aSF%Dq5q)Mm_p{m?m=B>Jt3ZMX`PK}PIWwX!(w~^LwSx~#zEK%_h3_O{fIGH z_!P?Y`_H5+AFr)!?8=3^u3>rfW7OzVHx?`ozbj_m68%28*ayoh-yvo2MO)KY9keZTD+ z>gk;Jgc~(l%|SVbTnxoU7>h-^{b!WN=B(zjlyW5@_GoBAWHy<+LbFizD#SKeW)o|9 zyG?w`n95{1>X%rR{432DU>)+MC_lFwu@aVI81BTHcm(Upq$%vd$x8;Tt*LfY4cGYiPb2Vb{u8Y zWvuTXJ+O|~m($bDIbU6cvUMZMF%N0I9R1ga^0f_o-tCu$GA>*59F(Kwq8zONnR zA}ses_tX9z$}{qZ4Gm9;&+hF$ozqcfTB&(4%BUYuZtMy4;GcFvxF<2QkK1Z7oN6A* zaf?vSuT=9rD6^EQ7i>_yR}(Y)x<#3YvNaFo9VkSZtyuj5W!6*b@3x>`QewtS?lG8) zvUP`gP(7hmsPf^HaUnJ_A|*MMtS;GDlrzmmS-C~(DwG?x9_7aG(fky;Rr?{r6F0h_ zn==R7$}A{be?*EjtYH#!$( z&U~zdB`C+*fbuHtLz%TgHLton1cy;?fK_ms)@P$!*)o)utyJs3s+Tc>zk#zNBZD&s zxVc#Q$RuC-K=%r*Ksn-3^&AG1|An7o&};5KrmB-s#xF%?HbuyX$?QcI%EbN4t=1Tn zag#KkgK{qxyZWuBSO;uV52(jb-o}e|ZG*0Hse{}FTa@XhXg(MDO)^VR7VxS~it3s? z;&nI5sx#Ha>Kb*6x)M zG+%+C1vKuYWZg1iZ z*kZ3WiSnJG*pTg;(PA(m?N?$N5l9pg>j-JRh@p&mgoq&~5mSgx)R*Hd?2Gb5^Qf78 z`f~gKO~`FuM1G@HmFa)9g)y=5(<$FgY$V#UeHXEnKA)L?+5vhm5)To%HuBb#fvXwu zBr%c7Q+Ne`CLSf05PWp}O`gN0#7B(jjA=w8`WNv=ljZx0S{UJ_pGnAiOl70#iPG4F!vBTeEVX2j9{R?%KO>P>|cR1O5#9(5Nj^2xF zb<}10S=yJ)UiwXlX~aHq-YQc=x6j8u#A40w!x?sW)2Lpvv@%Bh94&i(iDOaPF^B0y zZ6q;_d=t@z$RPJ%AL0yAK|D-NezVH#%eQ&Lipk`4=d17k%q_FCZmZ*4M|A|1gM_qJ z4l@P+OPnS`h>=7lW1mFc2s43LLjD5LorojOQu~8=hL}n&Ek$)1e;Lu~N$qi>BbV5< zS+MVGYF`moiS@+IZ8^yt#?HgpH_i1D{VmkqB>1M7mc&rv6GB=f@fc&u@mt+*1jcHA zfefNul9%97iVKMz!~o(Gq8V|X0k;sNiEqfIJ>mH0-y*FKw<(_J&ZEfM5>x-#&dl^f zsNF^MBW|>r^hXm965A=ZzG>SgTkMJIF^ozx9X=iJC0~K5I+CA9Q;Gf&9rHa#lBeSH zI7G+ICclmTBRCOP*-p))!^e?zBzq9o<8l1L4r?Ce%b_RjH;4b_WUs1QF8iBYF~PnzxrC?K_7VOMNl@$!>cUe>ux0#@*qYL;oG35%D+i zAw$NXw5REpx?M~Qyq#Jy7UMM;K-*6|M=hF2C!{q{Tj3${w}_=$lkKI%XD+t^Eh0na z()UpthdH)YiwNH$vNvzqV=nn&LfZS(I}^LAHePnakD+zBHH)6lx}MI^zR|g5%qPdboxIL6EvSsU)nbET38uZ z`YZej;bdX}agpaG diff --git a/locale/zh_hans/LC_MESSAGES/djangojs.po b/locale/zh_hans/LC_MESSAGES/djangojs.po index 4178e5bdc9..9e34d0cbef 100644 --- a/locale/zh_hans/LC_MESSAGES/djangojs.po +++ b/locale/zh_hans/LC_MESSAGES/djangojs.po @@ -1419,15 +1419,15 @@ msgstr "目标服务器" #: pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_1.js:163 msgid "" "请输入IP 地址,多IP可用空格、换行分隔\n" -" 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单" +" 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单" msgstr "" "请输入IP 地址,多IP可用空格、换行分隔\n" -" 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单" +" 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单" #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_0.js:361 #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js:488 -msgid "请输入IP 地址,多IP可用空格、换行分隔, 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单" -msgstr "请输入IP 地址,多IP可用空格、换行分隔, 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单" +msgid "请输入IP 地址,多IP可用空格、换行分隔, 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单" +msgstr "请输入IP 地址,多IP可用空格、换行分隔, 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单" #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_0.js:365 #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js:492 @@ -1449,9 +1449,9 @@ msgstr "添加" #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_0.js:387 #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js:514 #, fuzzy -#| msgid "云区域ID" -msgid "云区域ID(默认为0)" -msgstr "云区域ID" +#| msgid "管控区域ID" +msgid "管控区域ID(默认为0)" +msgstr "管控区域ID" #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_0.js:400 #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js:527 @@ -1467,8 +1467,8 @@ msgid "执行目标" msgstr "执行目标" #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js:486 -msgid "请输入IP 地址,多IP可用空格、换行分隔非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单" -msgstr "请输入IP 地址,多IP可用空格、换行分隔非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单" +msgid "请输入IP 地址,多IP可用空格、换行分隔非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单" +msgstr "请输入IP 地址,多IP可用空格、换行分隔非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单" #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js:555 #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_1.js:453 @@ -1562,8 +1562,8 @@ msgstr "源文件" #: pipeline_plugins/components/static/components/atoms/nodeman/create_task/v4_0.js:337 #: pipeline_plugins/components/static/components/atoms/nodeman/create_task/v4_0.js:688 #: pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v1_0.js:93 -msgid "云区域ID" -msgstr "云区域ID" +msgid "管控区域ID" +msgstr "管控区域ID" #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_0.js:59 #: pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_0.js:211 @@ -1825,8 +1825,8 @@ msgstr "输入IP, 多个用英文逗号 `,` 或换行分隔" #: pipeline_plugins/components/static/components/atoms/job/fast_push_file/v1_0.js:77 #: pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_0.js:76 -msgid "跨业务用【云区域ID:IP】" -msgstr "跨业务用【云区域ID:IP】" +msgid "跨业务用【管控区域ID:IP】" +msgstr "跨业务用【管控区域ID:IP】" #: pipeline_plugins/components/static/components/atoms/job/fast_push_file/v1_0.js:156 #: pipeline_plugins/components/static/components/atoms/job/job_fast_push_file.js:139 @@ -1838,8 +1838,8 @@ msgstr "请输入绝对路径" #: pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_0.js:220 #: pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_1.js:318 -msgid "IP必须填写【云区域ID:IP】或者【IP】格式之一" -msgstr "IP必须填写【云区域ID:IP】或者【IP】格式之一" +msgid "IP必须填写【管控区域ID:IP】或者【IP】格式之一" +msgstr "IP必须填写【管控区域ID:IP】或者【IP】格式之一" #: pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_1.js:174 msgid "【IP】" @@ -2759,8 +2759,8 @@ msgstr "说明" #: pipeline_plugins/components/static/components/atoms/nodeman/create_task/v3_0.js:522 #: pipeline_plugins/components/static/components/atoms/nodeman/create_task/v4_0.js:689 -msgid "一行只能对应一个云区域ID" -msgstr "一行只能对应一个云区域ID" +msgid "一行只能对应一个管控区域ID" +msgstr "一行只能对应一个管控区域ID" #: pipeline_plugins/components/static/components/atoms/nodeman/create_task/v4_0.js:274 msgid "是否安装最新版本插件" @@ -2807,8 +2807,8 @@ msgid "主机ID" msgstr "主机ID" #: pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v1_0.js:119 -msgid "请选云区域" -msgstr "请选云区域" +msgid "请选管控区域" +msgstr "请选管控区域" #: pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v1_0.js:234 msgid "插件操作" @@ -2905,8 +2905,8 @@ msgid "原始IP" msgstr "原始IP" #: pipeline_plugins/variables/static/variables/cmdb/var_cmdb_ip_filter.js:26 -msgid "IP为【IP】(云区域ID为0)、【云区域ID:IP】格式之一,多个用换行分隔" -msgstr "IP为【IP】(云区域ID为0)、【云区域ID:IP】格式之一,多个用换行分隔" +msgid "IP为【IP】(管控区域ID为0)、【管控区域ID:IP】格式之一,多个用换行分隔" +msgstr "IP为【IP】(管控区域ID为0)、【管控区域ID:IP】格式之一,多个用换行分隔" #: pipeline_plugins/variables/static/variables/cmdb/var_cmdb_ip_filter.js:39 msgid "GSE AGENT状态" @@ -2921,8 +2921,8 @@ msgid "不在线" msgstr "不在线" #: pipeline_plugins/variables/static/variables/cmdb/var_cmdb_ip_filter.js:53 -msgid "输出带云区域" -msgstr "输出带云区域" +msgid "输出带管控区域" +msgstr "输出带管控区域" #: pipeline_plugins/variables/static/variables/cmdb/var_cmdb_ip_filter.js:67 msgid "输出分隔符" @@ -2969,8 +2969,8 @@ msgstr "通过配置平台拓扑获取" #: pipeline_plugins/variables/static/variables/cmdb/var_ip_picker.js:77 #: pipeline_plugins/variables/static/variables/cmdb/var_set_module_ip_selector.js:62 -msgid "IP必须填写【云区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的" -msgstr "IP必须填写【云区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的" +msgid "IP必须填写【管控区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的" +msgstr "IP必须填写【管控区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的" #: pipeline_plugins/variables/static/variables/cmdb/var_ip_picker.js:110 msgid "拓扑树" @@ -3748,8 +3748,8 @@ msgstr "文本框" #~ msgid "手动添加" #~ msgstr "手动添加" -#~ msgid "云区域" -#~ msgstr "云区域" +#~ msgid "管控区域" +#~ msgstr "管控区域" #~ msgid "状态" #~ msgstr "状态" @@ -3839,8 +3839,8 @@ msgstr "文本框" #~ msgid "搜索分组" #~ msgstr "搜索分组" -#~ msgid "变量值是否带云区域:" -#~ msgstr "变量值是否带云区域:" +#~ msgid "变量值是否带管控区域:" +#~ msgstr "变量值是否带管控区域:" #~ msgid "组件禁用态" #~ msgstr "组件禁用态" diff --git a/packages/blueking/component/apis/cc.py b/packages/blueking/component/apis/cc.py index 8a25043085..096331d2e7 100755 --- a/packages/blueking/component/apis/cc.py +++ b/packages/blueking/component/apis/cc.py @@ -646,7 +646,7 @@ def __init__(self, client): client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/search_cloud_area/", - description="查询云区域", + description="查询管控区域", ) self.list_set_template = ComponentAPI( client=self.client, @@ -655,10 +655,7 @@ def __init__(self, client): description="查询集群模板", ) self.add_host_lock = ComponentAPI( - client=self.client, - method="POST", - path="/api/c/compapi{bk_api_ver}/cc/add_host_lock/", - description="新加主机锁", + client=self.client, method="POST", path="/api/c/compapi{bk_api_ver}/cc/add_host_lock/", description="新加主机锁", ) self.delete_host_lock = ComponentAPI( client=self.client, diff --git a/packages/blueking/component/apis/nodeman.py b/packages/blueking/component/apis/nodeman.py index bc21009dd7..db2170051b 100644 --- a/packages/blueking/component/apis/nodeman.py +++ b/packages/blueking/component/apis/nodeman.py @@ -79,7 +79,7 @@ def __init__(self, client): ) self.cloud_list = ComponentAPI( - client=self.client, method="GET", path="/api/c/compapi{bk_api_ver}/nodeman/api/cloud/", description="查询云区域" + client=self.client, method="GET", path="/api/c/compapi{bk_api_ver}/nodeman/api/cloud/", description="查询管控区域" ) self.plugin_operate = ComponentAPI( client=self.client, diff --git a/pipeline_plugins/cmdb_ip_picker/utils.py b/pipeline_plugins/cmdb_ip_picker/utils.py index 871183bb1d..bdac41364e 100644 --- a/pipeline_plugins/cmdb_ip_picker/utils.py +++ b/pipeline_plugins/cmdb_ip_picker/utils.py @@ -20,11 +20,12 @@ from gcloud.conf import settings from gcloud.exceptions import ApiRequestError from gcloud.utils import cmdb -from gcloud.utils.ip import format_sundry_ip, extract_ip_from_ip_str from gcloud.utils.handlers import handle_api_error -from .constants import NO_ERROR, ERROR_CODES +from gcloud.utils.ip import extract_ip_from_ip_str, format_sundry_ip + from ..components.collections.sites.open.cc.base import cc_parse_path_text from ..components.utils.sites.open.utils import cc_get_ips_info_by_str, cc_get_ips_info_by_str_ipv6 +from .constants import ERROR_CODES, NO_ERROR logger = logging.getLogger("root") get_client_by_user = settings.ESB_GET_CLIENT_BY_USER @@ -686,9 +687,9 @@ def get_bk_cloud_id_for_host(host_info, cloud_key="cloud"): ... ] } - :param cloud_key: 云区域 ID 键, defaults to 'cloud' + :param cloud_key: 管控区域 ID 键, defaults to 'cloud' :type cloud_key: str, optional - :return: 主机云区域 ID + :return: 主机管控区域 ID :rtype: int """ diff --git a/pipeline_plugins/components/collections/sites/open/cc/base.py b/pipeline_plugins/components/collections/sites/open/cc/base.py index 355ffea55c..0085701b0e 100644 --- a/pipeline_plugins/components/collections/sites/open/cc/base.py +++ b/pipeline_plugins/components/collections/sites/open/cc/base.py @@ -13,31 +13,31 @@ import logging from abc import ABCMeta +from collections import Counter from enum import Enum from functools import partial -from collections import Counter from django.utils import translation from django.utils.translation import ugettext_lazy as _ -from pipeline.core.flow.io import StringItemSchema from pipeline.core.flow.activity import Service +from pipeline.core.flow.io import StringItemSchema -from gcloud.utils import cmdb from gcloud.conf import settings +from gcloud.utils import cmdb +from gcloud.utils.handlers import handle_api_error from gcloud.utils.ip import ( + IpRegexType, + extract_ip_from_ip_str, get_ip_by_regex, get_ip_by_regex_type, - ipv6_pattern, ip_pattern, - extract_ip_from_ip_str, - IpRegexType, + ipv6_pattern, ) -from gcloud.utils.handlers import handle_api_error from pipeline_plugins.components.collections.sites.open.cc.ipv6_utils import ( - get_ipv6_host_list, + get_hosts_by_hosts_ids, get_ipv4_host_list, get_ipv4_host_with_cloud_list, - get_hosts_by_hosts_ids, + get_ipv6_host_list, get_ipv6_host_list_with_cloud_list, ) from pipeline_plugins.components.utils.sites.open.utils import cc_get_ips_info_by_str, cc_get_ips_info_by_str_ipv6 @@ -157,7 +157,7 @@ def cc_get_host_by_innerip_with_ipv6( if not ipv6_host_list_result["result"]: return ipv6_host_list_result - # 查IPV6带云区域 + # 查IPV6带管控区域 ipv6_host_with_cloud_list_result = get_ipv6_host_list_with_cloud_list( executor, bk_biz_id, supplier_account, ipv6_list_with_cloud_id, is_biz_set=is_biz_set ) @@ -169,7 +169,7 @@ def cc_get_host_by_innerip_with_ipv6( if not ipv4_host_list_result["result"]: return ipv4_host_list_result - # 查询ipv4带云区域 + # 查询ipv4带管控区域 ipv4_host_with_cloud_list_result = get_ipv4_host_with_cloud_list( executor, bk_biz_id, supplier_account, ipv4_list_with_cloud_id, is_biz_set=is_biz_set ) diff --git a/pipeline_plugins/components/collections/sites/open/cc/batch_update_host/v1_0.py b/pipeline_plugins/components/collections/sites/open/cc/batch_update_host/v1_0.py index 7582b8a045..bba5c29593 100644 --- a/pipeline_plugins/components/collections/sites/open/cc/batch_update_host/v1_0.py +++ b/pipeline_plugins/components/collections/sites/open/cc/batch_update_host/v1_0.py @@ -15,15 +15,14 @@ from functools import partial from django.utils.translation import ugettext_lazy as _ - -from pipeline.core.flow.activity import Service -from pipeline.core.flow.io import StringItemSchema, ArrayItemSchema, ObjectItemSchema from pipeline.component_framework.component import Component +from pipeline.core.flow.activity import Service +from pipeline.core.flow.io import ArrayItemSchema, ObjectItemSchema, StringItemSchema from gcloud.conf import settings from gcloud.utils.handlers import handle_api_error from pipeline_plugins.base.utils.inject import supplier_account_for_business -from pipeline_plugins.components.collections.sites.open.cc.base import cc_format_prop_data, CCPluginIPMixin +from pipeline_plugins.components.collections.sites.open.cc.base import CCPluginIPMixin, cc_format_prop_data from pipeline_plugins.components.utils import chunk_table_data, convert_num_to_str from pipeline_plugins.components.utils.sites.open.utils import plat_ip_reg @@ -124,7 +123,7 @@ def execute(self, data, parent_data): update_host_message = [] for host_property_dir in host_property_copy: inner_host_ip = host_property_dir["bk_host_innerip"] - # 兼容填写云区域ID:IP的情况, 只获取对应IP, 判断ipv4 + # 兼容填写管控区域ID:IP的情况, 只获取对应IP, 判断ipv4 if plat_ip_reg.match(inner_host_ip) and ":" in inner_host_ip: inner_host_ip = inner_host_ip.split(":")[1] diff --git a/pipeline_plugins/components/collections/sites/open/cc/ipv6_utils.py b/pipeline_plugins/components/collections/sites/open/cc/ipv6_utils.py index f2bd1db59c..7540a44cf8 100644 --- a/pipeline_plugins/components/collections/sites/open/cc/ipv6_utils.py +++ b/pipeline_plugins/components/collections/sites/open/cc/ipv6_utils.py @@ -40,7 +40,7 @@ def compare_ip_list(host_list, ip_list, host_key="bk_host_innerip"): def compare_ip_with_cloud_list(host_list, ip_list): """ - 对比带云区域的云区域是否有多了或者少了的情况, 返回的是 bool, message 的格式 + 对比带管控区域的管控区域是否有多了或者少了的情况, 返回的是 bool, message 的格式 @param host_list: 主机列表 [{"bk_host_innerip": "127.0.0.1", "bk_cloud_id":"2"}] @param ip_list: ["2:127.0.0.1"] @param host_key: host_key: 取ip的字段 为了适配IPV4 OR IPV6 @@ -65,7 +65,7 @@ def compare_ip_with_cloud_list(host_list, ip_list): def compare_ipv6_with_cloud_list(host_list, ip_list): """ - 对比带云区域的云区域是否有多了或者少了的情况, 返回的是 bool, message 的格式 + 对比带管控区域的管控区域是否有多了或者少了的情况, 返回的是 bool, message 的格式 @param host_list: 主机列表 [{"bk_host_innerip_ipv6": "0000:00000:0000:0000:0000", "bk_cloud_id":"2"}] @param ip_list: ["2:[0000:00000:0000:0000:0000]"] @return: @@ -89,7 +89,7 @@ def compare_ipv6_with_cloud_list(host_list, ip_list): def check_ip_cloud(ip_host_with_cloud_list, bk_host_innerip_key="bk_host_innerip"): """ - 检查cc查询结果中,是否有云区域+ip重复的主机 + 检查cc查询结果中,是否有管控区域+ip重复的主机 @param ipv4_host_with_cloud_list: [{"host_id":1,"bk_host_innerip": "127.0.0.1", "bk_cloud_id":"2"}, {"host_id":2,"bk_host_innerip": "127.0.0.1", "bk_cloud_id":"2"}] @return: ["2:127.0.0.1"] @@ -167,7 +167,7 @@ def get_ipv6_hosts(executor, bk_biz_id, supplier_account, ipv6_list, is_biz_set= def get_ipv4_hosts_with_cloud(executor, bk_biz_id, supplier_account, ipv4_list_with_cloud_id, is_biz_set=False): """ - 根据ipv4带云区域的列表查询主机,这个和get_ipv4_hosts地方在于,会将查出来的机器把ip和目标云区域匹配的拿出来,抛弃不匹配的,再去校验匹配而来的主机 + 根据ipv4带管控区域的列表查询主机,这个和get_ipv4_hosts地方在于,会将查出来的机器把ip和目标管控区域匹配的拿出来,抛弃不匹配的,再去校验匹配而来的主机 @param executor: 执行人 @param bk_biz_id: 业务id, 当is_biz_set=True可以不传 @param supplier_account:服务商 @@ -220,17 +220,17 @@ def get_ipv4_hosts_with_cloud(executor, bk_biz_id, supplier_account, ipv4_list_w ) return [] - # 在ipv6语境下需要确认查出来的这一批主机,有没有ip和云区域一样,但是host_id不一样的,有的话要直接抛异常 + # 在ipv6语境下需要确认查出来的这一批主机,有没有ip和管控区域一样,但是host_id不一样的,有的话要直接抛异常 exist_repeated_host = check_ip_cloud(ipv4_host_with_cloud_list) if exist_repeated_host: raise Exception( "list_biz_hosts[ipv4] query failed, " - "the host with the same IP address and cloud area is displayed," + "the host with the same IP address and BK-Net is displayed," "repeated_list = {}".format(exist_repeated_host) ) - # 查出来的数据需要根据最初始的云区域:ip 列表清洗出来用户想要的那一部分主机 + # 查出来的数据需要根据最初始的管控区域:ip 列表清洗出来用户想要的那一部分主机 for ip_info in ipv4_host_with_cloud_list: - # 清洗出来所有带云区域带ip + # 清洗出来所有带管控区域带ip plat_ip = "{}:{}".format(ip_info.get("bk_cloud_id", -1), ip_info.get("bk_host_innerip", "")) if plat_ip in ipv4_list_with_cloud_id: ipv4_host_with_cloud_valid.append(ip_info) @@ -240,7 +240,7 @@ def get_ipv4_hosts_with_cloud(executor, bk_biz_id, supplier_account, ipv4_list_w def get_ipv6_hosts_with_cloud(executor, bk_biz_id, supplier_account, ipv6_list_with_cloud_id, is_biz_set=False): """ - 根据ipv6带云区域的列表查询主机,这个和get_ipv6_hosts地方在于,会将查出来的机器把ip和目标云区域匹配的拿出来,抛弃不匹配的,再去校验匹配而来的主机 + 根据ipv6带管控区域的列表查询主机,这个和get_ipv6_hosts地方在于,会将查出来的机器把ip和目标管控区域匹配的拿出来,抛弃不匹配的,再去校验匹配而来的主机 @param executor: 执行人 @param bk_biz_id: 业务id, 当is_biz_set=True可以不传 @param supplier_account:服务商 @@ -295,16 +295,16 @@ def get_ipv6_hosts_with_cloud(executor, bk_biz_id, supplier_account, ipv6_list_w ) return [] - # 在ipv6语境下需要确认查出来的这一批主机,有没有ip和云区域一样,但是host_id不一样的,有的话要直接抛异常 + # 在ipv6语境下需要确认查出来的这一批主机,有没有ip和管控区域一样,但是host_id不一样的,有的话要直接抛异常 exist_repeated_host = check_ip_cloud(ipv6_host_with_cloud_list, bk_host_innerip_key="bk_host_innerip_v6") if exist_repeated_host: raise Exception( "[get_ipv6_hosts_with_cloud] is failed " - "the host with the same IP address and cloud area is displayed," + "the host with the same IP address and BK-Net is displayed," "repeated_list = {}".format(exist_repeated_host) ) - # 查出来的数据需要根据最初始的云区域:ip 列表清洗出来用户想要的那一部分主机 + # 查出来的数据需要根据最初始的管控区域:ip 列表清洗出来用户想要的那一部分主机 for ip_info in ipv6_host_with_cloud_list: plat_ip = "{}:[{}]".format(ip_info.get("bk_cloud_id", -1), ip_info.get("bk_host_innerip_v6", "")) if plat_ip in ipv6_list_with_cloud_id: @@ -421,7 +421,7 @@ def get_ipv6_host_list(executor, bk_biz_id, supplier_account, ipv6_list, is_biz_ def get_ipv4_host_with_cloud_list(executor, bk_biz_id, supplier_account, ipv4_list_with_cloud_id, is_biz_set=False): """ - # 查询所有ip_v4带云区域带主机,并选出指定的ip,如果ip+cloud_id重复,则报错 + # 查询所有ip_v4带管控区域带主机,并选出指定的ip,如果ip+cloud_id重复,则报错 @param executor: 执行人 @param bk_biz_id: 业务id @param supplier_account: @@ -454,7 +454,7 @@ def get_ipv4_host_with_cloud_list(executor, bk_biz_id, supplier_account, ipv4_li def get_ipv6_host_list_with_cloud_list(executor, bk_biz_id, supplier_account, ipv6_list_with_cloud, is_biz_set=False): """ - # 查询所有ip_v6带云区域带主机,并选出指定的ip,如果ip+cloud_id重复,则报错 + # 查询所有ip_v6带管控区域带主机,并选出指定的ip,如果ip+cloud_id重复,则报错 @param executor: 执行人 @param bk_biz_id: 业务id @param supplier_account: @@ -550,7 +550,7 @@ def cc_get_host_by_innerip_with_ipv6_across_business(executor, bk_biz_id, ip_str ip_str ) - # 查询ipv6带云区域的主机 + # 查询ipv6带管控区域的主机 ipv6_host_with_cloud_valid = get_ipv6_hosts_with_cloud( executor, bk_biz_id, supplier_account, ipv6_list_with_cloud_id, is_biz_set ) @@ -572,7 +572,7 @@ def cc_get_host_by_innerip_with_ipv6_across_business(executor, bk_biz_id, ip_str ipv4_absent_innerip = compare_ip_list_and_return(host_list=ipv4_host_list, ip_list=ipv4_list) - # 提取ipv4带云区域的列表, 确定有哪些没查出来的 + # 提取ipv4带管控区域的列表, 确定有哪些没查出来的 ipv4_host_with_cloud_valid = get_ipv4_hosts_with_cloud( executor, bk_biz_id, supplier_account, ipv4_list_with_cloud_id, is_biz_set ) @@ -584,7 +584,7 @@ def cc_get_host_by_innerip_with_ipv6_across_business(executor, bk_biz_id, ip_str host_list = [{"bk_host_id": host_id} for host_id in host_id_list] # 本业务查到的host集合 host_list = ipv6_host_list + ipv4_host_list + ipv4_host_with_cloud_valid + host_list + ipv6_host_with_cloud_valid - # 返回依次表示 本业务查到的ip列表,没查到的ipv4列表,没查到的ipv4带云区域列表,没查到的ipv6列表 + # 返回依次表示 本业务查到的ip列表,没查到的ipv4列表,没查到的ipv4带管控区域列表,没查到的ipv6列表 return ( host_list, list(ipv4_absent_innerip), diff --git a/pipeline_plugins/components/collections/sites/open/docs/job/fast_push_file/v2_0.md b/pipeline_plugins/components/collections/sites/open/docs/job/fast_push_file/v2_0.md index 587c5fc21b..eee0e00e71 100644 --- a/pipeline_plugins/components/collections/sites/open/docs/job/fast_push_file/v2_0.md +++ b/pipeline_plugins/components/collections/sites/open/docs/job/fast_push_file/v2_0.md @@ -18,7 +18,7 @@ 是或否 - 源文件: - - IP:跨业务用【云区域ID:IP】 + - IP:跨业务用【管控区域ID:IP】 - 文件路径: 文件的绝对路径 - 执行账户: 执行操作的账户 @@ -32,7 +32,7 @@ 手动填写(manual)或 单行自动扩展(auto) - 分发配置: - - IP:跨业务用【云区域ID:IP】 + - IP:跨业务用【管控区域ID:IP】 - 目标路径: 文件的绝对路径 - 执行账户: 执行操作的账户 diff --git a/pipeline_plugins/components/collections/sites/open/docs/job/job_local_content_upload.md b/pipeline_plugins/components/collections/sites/open/docs/job/job_local_content_upload.md index 9e095d6e01..b04b5def9b 100644 --- a/pipeline_plugins/components/collections/sites/open/docs/job/job_local_content_upload.md +++ b/pipeline_plugins/components/collections/sites/open/docs/job/job_local_content_upload.md @@ -17,7 +17,7 @@ - 文本内容 - 目标IP: - IP必须填写【云区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的 + IP必须填写【管控区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的 - 目标账户: 请输入在蓝鲸作业平台上注册的账户名 diff --git a/pipeline_plugins/components/collections/sites/open/docs/nodeman/nodeman_create_task.md b/pipeline_plugins/components/collections/sites/open/docs/nodeman/nodeman_create_task.md index eaca900b9a..5625f2a55e 100644 --- a/pipeline_plugins/components/collections/sites/open/docs/nodeman/nodeman_create_task.md +++ b/pipeline_plugins/components/collections/sites/open/docs/nodeman/nodeman_create_task.md @@ -14,7 +14,7 @@ - 业务ID: -- 云区域ID: +- 管控区域ID: - 节点类型: @@ -78,7 +78,7 @@ - 安装Agent: - 选择安装Agent必须在直连区域内安装,也就是云区域ID为0 + 选择安装Agent必须在直连区域内安装,也就是管控区域ID为0 - 安装Proxy: diff --git a/pipeline_plugins/components/collections/sites/open/docs/nodeman/nodeman_plugin_operate.md b/pipeline_plugins/components/collections/sites/open/docs/nodeman/nodeman_plugin_operate.md index 94443ac02f..5861f4d651 100644 --- a/pipeline_plugins/components/collections/sites/open/docs/nodeman/nodeman_plugin_operate.md +++ b/pipeline_plugins/components/collections/sites/open/docs/nodeman/nodeman_plugin_operate.md @@ -18,7 +18,7 @@ - 填写方式:指定主机的填写方式,可选主机IP和主机ID - 主机IP:主机IP 多个用英文逗号 `,` 分隔 - - 云区域ID: 选择业务云区域ID + - 管控区域ID: 选择业务管控区域ID - 主机ID:主机ID 多个用英文逗号 `,` 分 - 插件类型: 可选 官方插件, 第三方插件, 脚本插件 diff --git a/pipeline_plugins/components/collections/sites/open/job/all_biz_fast_execute_script/base_service.py b/pipeline_plugins/components/collections/sites/open/job/all_biz_fast_execute_script/base_service.py index f1fd8b0ce7..e5d170f78d 100644 --- a/pipeline_plugins/components/collections/sites/open/job/all_biz_fast_execute_script/base_service.py +++ b/pipeline_plugins/components/collections/sites/open/job/all_biz_fast_execute_script/base_service.py @@ -14,12 +14,13 @@ from django.utils import translation from django.utils.translation import ugettext_lazy as _ +from pipeline.core.flow.io import ArrayItemSchema, IntItemSchema, ObjectItemSchema, StringItemSchema + +from gcloud.conf import settings from gcloud.constants import JobBizScopeType +from gcloud.utils.handlers import handle_api_error from pipeline_plugins.components.collections.sites.open.job import JobService -from pipeline.core.flow.io import StringItemSchema, ObjectItemSchema, IntItemSchema, ArrayItemSchema from pipeline_plugins.components.utils import get_job_instance_url, has_biz_set -from gcloud.conf import settings -from gcloud.utils.handlers import handle_api_error __group_name__ = _("作业平台(JOB)") @@ -65,16 +66,10 @@ def inputs_format(self): schema=StringItemSchema(description=_("执行脚本的目标机器账户")), ), self.InputItem( - name=_("脚本超时时间"), - key="job_target_account", - type="int", - schema=IntItemSchema(description=_("脚本超时时间")), + name=_("脚本超时时间"), key="job_target_account", type="int", schema=IntItemSchema(description=_("脚本超时时间")), ), self.InputItem( - name=_("脚本超时时间"), - key="job_target_account", - type="int", - schema=IntItemSchema(description=_("脚本超时时间")), + name=_("脚本超时时间"), key="job_target_account", type="int", schema=IntItemSchema(description=_("脚本超时时间")), ), self.InputItem( name=_("执行目标信息"), @@ -85,7 +80,7 @@ def inputs_format(self): item_schema=ObjectItemSchema( description=_("单条目标 IP 信息"), property_schemas={ - "bk_cloud_id": StringItemSchema(description=_("云区域ID, 默认为0")), + "bk_cloud_id": StringItemSchema(description=_("管控区域ID, 默认为0")), "ip": StringItemSchema(description=_("待执行目标机器 IP,多IP请使用;分隔")), }, ), diff --git a/pipeline_plugins/components/collections/sites/open/job/all_biz_fast_push_file/base_service.py b/pipeline_plugins/components/collections/sites/open/job/all_biz_fast_push_file/base_service.py index cf755a7de7..cc05f0453b 100644 --- a/pipeline_plugins/components/collections/sites/open/job/all_biz_fast_push_file/base_service.py +++ b/pipeline_plugins/components/collections/sites/open/job/all_biz_fast_push_file/base_service.py @@ -11,18 +11,18 @@ specific language governing permissions and limitations under the License. """ from functools import partial + from django.utils import translation from django.utils.translation import ugettext_lazy as _ +from pipeline.core.flow.io import ArrayItemSchema, ObjectItemSchema, StringItemSchema -from pipeline.core.flow.io import StringItemSchema, ArrayItemSchema, ObjectItemSchema - +from gcloud.conf import settings from gcloud.constants import JobBizScopeType +from gcloud.utils.handlers import handle_api_error from pipeline_plugins.base.utils.inject import supplier_account_for_business -from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin from pipeline_plugins.components.collections.sites.open.job.base import JobScheduleService -from pipeline_plugins.components.utils import has_biz_set, batch_execute_func, get_job_instance_url, loose_strip -from gcloud.conf import settings -from gcloud.utils.handlers import handle_api_error +from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin +from pipeline_plugins.components.utils import batch_execute_func, get_job_instance_url, has_biz_set, loose_strip __group_name__ = _("作业平台(JOB)") @@ -44,7 +44,7 @@ def inputs_format(self): item_schema=ObjectItemSchema( description=_("待分发文件信息"), property_schemas={ - "bk_cloud_id": StringItemSchema(description=_("云区域ID, 默认为0")), + "bk_cloud_id": StringItemSchema(description=_("管控区域ID, 默认为0")), "ip": StringItemSchema(description=_("机器 IP")), "files": StringItemSchema(description=_("文件路径, 多个用换行(\\n)分隔")), "account": StringItemSchema(description=_("执行账户")), @@ -53,10 +53,7 @@ def inputs_format(self): ), ), self.InputItem( - name=_("上传限速"), - key="upload_speed_limit", - type="string", - schema=StringItemSchema(description=_("MB/s")), + name=_("上传限速"), key="upload_speed_limit", type="string", schema=StringItemSchema(description=_("MB/s")), ), self.InputItem( name=_("下载限速"), @@ -73,7 +70,7 @@ def inputs_format(self): item_schema=ObjectItemSchema( description=_("待分发至目标信息列表"), property_schemas={ - "bk_cloud_id": StringItemSchema(description=_("云区域ID, 默认为0")), + "bk_cloud_id": StringItemSchema(description=_("管控区域ID, 默认为0")), "job_ip_list": StringItemSchema(description=_("待分发机器 IP,多IP请使用;分隔")), "job_target_path": StringItemSchema(description=_("分发目标绝对路径,(可用[FILESRCIP]代替源IP)")), "job_target_account": StringItemSchema(description=_("执行账户,输入在蓝鲸作业平台上注册的账户名")), @@ -109,9 +106,7 @@ def get_file_source(self, data, parent_data): { "file_list": [_file.strip() for _file in item["files"].split("\n") if _file.strip()], "server": server, - "account": { - "alias": loose_strip(item["account"]), - }, + "account": {"alias": loose_strip(item["account"])}, } ) diff --git a/pipeline_plugins/components/collections/sites/open/job/execute_task/execute_task_base.py b/pipeline_plugins/components/collections/sites/open/job/execute_task/execute_task_base.py index c4e1dbfa24..51a80a361a 100644 --- a/pipeline_plugins/components/collections/sites/open/job/execute_task/execute_task_base.py +++ b/pipeline_plugins/components/collections/sites/open/job/execute_task/execute_task_base.py @@ -11,23 +11,18 @@ specific language governing permissions and limitations under the License. """ -from functools import partial from copy import deepcopy +from functools import partial from django.utils import translation from django.utils.translation import ugettext_lazy as _ +from pipeline.core.flow.io import ArrayItemSchema, IntItemSchema, ObjectItemSchema, StringItemSchema -from pipeline.core.flow.io import ( - StringItemSchema, - IntItemSchema, - ArrayItemSchema, - ObjectItemSchema, -) +from gcloud.conf import settings +from gcloud.utils.handlers import handle_api_error from pipeline_plugins.components.collections.sites.open.job import JobService from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin from pipeline_plugins.components.utils import get_job_instance_url, get_node_callback_url, loose_strip -from gcloud.conf import settings -from gcloud.utils.handlers import handle_api_error __group_name__ = _("作业平台(JOB)") @@ -110,7 +105,7 @@ def build_ip_list(self, biz_across, val, executor, biz_cc_id, data, ip_is_exist) ignore_ex_data=True, ) - # 匹配不到云区域IP格式IP,尝试从当前业务下获取 + # 匹配不到管控区域IP格式IP,尝试从当前业务下获取 if not result: result, server = self.get_target_server( ip_str=val, diff --git a/pipeline_plugins/components/collections/sites/open/job/execute_task/legacy.py b/pipeline_plugins/components/collections/sites/open/job/execute_task/legacy.py index fdabbae143..fbf15f5c44 100644 --- a/pipeline_plugins/components/collections/sites/open/job/execute_task/legacy.py +++ b/pipeline_plugins/components/collections/sites/open/job/execute_task/legacy.py @@ -12,13 +12,16 @@ """ from functools import partial + from django.utils.translation import ugettext_lazy as _ -from pipeline.core.flow.io import BooleanItemSchema -from .execute_task_base import JobExecuteTaskServiceBase from pipeline.component_framework.component import Component +from pipeline.core.flow.io import BooleanItemSchema + from gcloud.conf import settings from gcloud.utils.handlers import handle_api_error +from .execute_task_base import JobExecuteTaskServiceBase + __group_name__ = _("作业平台(JOB)") get_client_by_user = settings.ESB_GET_CLIENT_BY_USER @@ -44,5 +47,5 @@ class JobExecuteTaskComponent(Component): bound_service = JobExecuteTaskService form = "%scomponents/atoms/job/job_execute_task.js" % settings.STATIC_URL output_form = "%scomponents/atoms/job/job_execute_task_output.js" % settings.STATIC_URL - desc = _("跨业务选项打开时IP参数需要按照(云区域ID:IP)格式填写,否则会尝试从本业务下获取IP信息") + desc = _("跨业务选项打开时IP参数需要按照(管控区域ID:IP)格式填写,否则会尝试从本业务下获取IP信息") version = "legacy" diff --git a/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_0.py b/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_0.py index 82c2926737..8e41e6f09d 100644 --- a/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_0.py +++ b/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_0.py @@ -33,22 +33,17 @@ from django.utils import translation from django.utils.translation import ugettext_lazy as _ - -from pipeline.core.flow.io import ( - StringItemSchema, - ObjectItemSchema, - BooleanItemSchema, -) from pipeline.component_framework.component import Component -from pipeline_plugins.components.collections.sites.open.job import JobService -from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin -from pipeline_plugins.components.utils import get_job_instance_url, get_node_callback_url +from pipeline.core.flow.io import BooleanItemSchema, ObjectItemSchema, StringItemSchema +from api.utils.request import batch_request from gcloud.conf import settings from gcloud.constants import JobBizScopeType -from gcloud.utils.handlers import handle_api_error from gcloud.exceptions import ApiRequestError -from api.utils.request import batch_request +from gcloud.utils.handlers import handle_api_error +from pipeline_plugins.components.collections.sites.open.job import JobService +from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin +from pipeline_plugins.components.utils import get_job_instance_url, get_node_callback_url __group_name__ = _("作业平台(JOB)") @@ -114,7 +109,7 @@ def inputs_format(self): name=_("是否允许跨业务"), key="job_across_biz", type="bool", - schema=BooleanItemSchema(description=_("是否允许跨业务(跨业务需在作业平台添加白名单),允许时,源文件IP格式需为【云区域ID:IP】")), + schema=BooleanItemSchema(description=_("是否允许跨业务(跨业务需在作业平台添加白名单),允许时,源文件IP格式需为【管控区域ID:IP】")), ), self.InputItem( name=_("目标 IP"), diff --git a/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_1.py b/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_1.py index 5c18fd7839..858fb339f5 100644 --- a/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_1.py +++ b/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_1.py @@ -33,24 +33,19 @@ from django.utils import translation from django.utils.translation import ugettext_lazy as _ - -from pipeline.core.flow.io import ( - StringItemSchema, - ObjectItemSchema, - BooleanItemSchema, -) from pipeline.component_framework.component import Component +from pipeline.core.flow.io import BooleanItemSchema, ObjectItemSchema, StringItemSchema from api.utils.request import batch_request +from gcloud.conf import settings +from gcloud.constants import JobBizScopeType from gcloud.exceptions import ApiRequestError +from gcloud.utils.handlers import handle_api_error from pipeline_plugins.components.collections.sites.open.job import JobService -from pipeline_plugins.components.utils import get_job_instance_url, get_node_callback_url from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin -from ..base import GetJobHistoryResultMixin +from pipeline_plugins.components.utils import get_job_instance_url, get_node_callback_url -from gcloud.conf import settings -from gcloud.constants import JobBizScopeType -from gcloud.utils.handlers import handle_api_error +from ..base import GetJobHistoryResultMixin __group_name__ = _("作业平台(JOB)") @@ -116,7 +111,7 @@ def inputs_format(self): name=_("是否允许跨业务"), key="job_across_biz", type="bool", - schema=BooleanItemSchema(description=_("是否允许跨业务(跨业务需在作业平台添加白名单),允许时,源文件IP格式需为【云区域ID:IP】")), + schema=BooleanItemSchema(description=_("是否允许跨业务(跨业务需在作业平台添加白名单),允许时,源文件IP格式需为【管控区域ID:IP】")), ), self.InputItem( name=_("目标 IP"), diff --git a/pipeline_plugins/components/collections/sites/open/job/fast_push_file/v1_0.py b/pipeline_plugins/components/collections/sites/open/job/fast_push_file/v1_0.py index 7d6e5a3262..56860efdd2 100644 --- a/pipeline_plugins/components/collections/sites/open/job/fast_push_file/v1_0.py +++ b/pipeline_plugins/components/collections/sites/open/job/fast_push_file/v1_0.py @@ -11,26 +11,20 @@ specific language governing permissions and limitations under the License. """ -from functools import partial from copy import deepcopy +from functools import partial from django.utils import translation from django.utils.translation import ugettext_lazy as _ - -from pipeline.core.flow.io import StringItemSchema, ArrayItemSchema, ObjectItemSchema, BooleanItemSchema from pipeline.component_framework.component import Component - -from pipeline_plugins.components.collections.sites.open.job import JobService -from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin -from pipeline_plugins.components.utils import ( - get_job_instance_url, - get_node_callback_url, - loose_strip, -) +from pipeline.core.flow.io import ArrayItemSchema, BooleanItemSchema, ObjectItemSchema, StringItemSchema from gcloud.conf import settings from gcloud.constants import JobBizScopeType from gcloud.utils.handlers import handle_api_error +from pipeline_plugins.components.collections.sites.open.job import JobService +from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin +from pipeline_plugins.components.utils import get_job_instance_url, get_node_callback_url, loose_strip __group_name__ = _("作业平台(JOB)") @@ -46,7 +40,7 @@ def inputs_format(self): name=_("是否允许跨业务"), key="job_across_biz", type="bool", - schema=BooleanItemSchema(description=_("是否允许跨业务,如果允许,源文件IP格式需为【云区域ID:IP】")), + schema=BooleanItemSchema(description=_("是否允许跨业务,如果允许,源文件IP格式需为【管控区域ID:IP】")), ), self.InputItem( name=_("源文件"), @@ -71,10 +65,7 @@ def inputs_format(self): schema=StringItemSchema(description=_("文件分发目标机器 IP,多个用英文逗号 `,` 分隔")), ), self.InputItem( - name=_("目标账户"), - key="job_account", - type="string", - schema=StringItemSchema(description=_("文件分发目标机器账户")), + name=_("目标账户"), key="job_account", type="string", schema=StringItemSchema(description=_("文件分发目标机器账户")), ), self.InputItem( name=_("目标路径"), @@ -112,9 +103,7 @@ def execute(self, data, parent_data): { "file_list": [_file.strip() for _file in item["files"].split("\n") if _file.strip()], "server": server, - "account": { - "alias": loose_strip(item["account"]), - }, + "account": {"alias": loose_strip(item["account"])}, } ) # 获取目标IP diff --git a/pipeline_plugins/components/collections/sites/open/job/fast_push_file/v2_0.py b/pipeline_plugins/components/collections/sites/open/job/fast_push_file/v2_0.py index 142a3f7cb8..3225585360 100644 --- a/pipeline_plugins/components/collections/sites/open/job/fast_push_file/v2_0.py +++ b/pipeline_plugins/components/collections/sites/open/job/fast_push_file/v2_0.py @@ -11,26 +11,21 @@ specific language governing permissions and limitations under the License. """ -from functools import partial from copy import deepcopy +from functools import partial from django.utils import translation from django.utils.translation import ugettext_lazy as _ - -from pipeline.core.flow.io import StringItemSchema, ArrayItemSchema, ObjectItemSchema, BooleanItemSchema from pipeline.component_framework.component import Component -from pipeline_plugins.components.collections.sites.open.job.base import JobScheduleService -from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin -from pipeline_plugins.components.utils.common import batch_execute_func -from pipeline_plugins.components.utils import ( - get_job_instance_url, - loose_strip, - chunk_table_data, -) +from pipeline.core.flow.io import ArrayItemSchema, BooleanItemSchema, ObjectItemSchema, StringItemSchema from gcloud.conf import settings from gcloud.constants import JobBizScopeType from gcloud.utils.handlers import handle_api_error +from pipeline_plugins.components.collections.sites.open.job.base import JobScheduleService +from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin +from pipeline_plugins.components.utils import chunk_table_data, get_job_instance_url, loose_strip +from pipeline_plugins.components.utils.common import batch_execute_func __group_name__ = _("作业平台(JOB)") @@ -46,7 +41,7 @@ def inputs_format(self): name=_("是否允许跨业务"), key="job_across_biz", type="bool", - schema=BooleanItemSchema(description=_("是否允许跨业务,如果允许,源文件IP格式需为【云区域ID:IP】")), + schema=BooleanItemSchema(description=_("是否允许跨业务,如果允许,源文件IP格式需为【管控区域ID:IP】")), ), self.InputItem( name=_("源文件"), @@ -65,10 +60,7 @@ def inputs_format(self): ), ), self.InputItem( - name=_("上传限速"), - key="upload_speed_limit", - type="string", - schema=StringItemSchema(description=_("MB/s")), + name=_("上传限速"), key="upload_speed_limit", type="string", schema=StringItemSchema(description=_("MB/s")), ), self.InputItem( name=_("下载限速"), @@ -83,10 +75,7 @@ def inputs_format(self): schema=StringItemSchema(description=_("文件分发目标机器 IP,多个用英文逗号 `,` 分隔")), ), self.InputItem( - name=_("目标账户"), - key="job_account", - type="string", - schema=StringItemSchema(description=_("文件分发目标机器账户")), + name=_("目标账户"), key="job_account", type="string", schema=StringItemSchema(description=_("文件分发目标机器账户")), ), self.InputItem( name=_("目标路径"), @@ -124,9 +113,7 @@ def execute(self, data, parent_data): { "file_list": [_file.strip() for _file in item["files"].split("\n") if _file.strip()], "server": server, - "account": { - "alias": loose_strip(item["account"]), - }, + "account": {"alias": loose_strip(item["account"])}, } ) diff --git a/pipeline_plugins/components/collections/sites/open/job/local_content_upload/base_service.py b/pipeline_plugins/components/collections/sites/open/job/local_content_upload/base_service.py index fe49de1f9a..d73b74796e 100644 --- a/pipeline_plugins/components/collections/sites/open/job/local_content_upload/base_service.py +++ b/pipeline_plugins/components/collections/sites/open/job/local_content_upload/base_service.py @@ -14,15 +14,14 @@ from functools import partial from django.utils.translation import ugettext_lazy as _ - from pipeline.core.flow.activity import Service, StaticIntervalGenerator -from pipeline.core.flow.io import StringItemSchema, ObjectItemSchema, IntItemSchema, BooleanItemSchema +from pipeline.core.flow.io import BooleanItemSchema, IntItemSchema, ObjectItemSchema, StringItemSchema -from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin -from pipeline_plugins.components.utils import get_job_instance_url from gcloud.conf import settings from gcloud.constants import JobBizScopeType from gcloud.utils.handlers import handle_api_error +from pipeline_plugins.components.collections.sites.open.job.ipv6_base import GetJobTargetServerMixin +from pipeline_plugins.components.utils import get_job_instance_url __group_name__ = _("作业平台(JOB)") @@ -40,23 +39,17 @@ class BaseJobLocalContentUploadService(Service, GetJobTargetServerMixin): def inputs_format(self): return [ self.InputItem( - name=_("生成文件名[后缀]"), - key="local_name", - type="string", - schema=StringItemSchema(description=_("生成文件名")), + name=_("生成文件名[后缀]"), key="local_name", type="string", schema=StringItemSchema(description=_("生成文件名")), ), self.InputItem( - name=_("文本内容"), - key="local_content", - type="string", - schema=StringItemSchema(description=_("文本内容")), + name=_("文本内容"), key="local_content", type="string", schema=StringItemSchema(description=_("文本内容")), ), self.InputItem( name=_("目标IP"), key="job_ip_list", type="string", schema=StringItemSchema( - description=_("IP必须填写【云区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的") + description=_("IP必须填写【管控区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的") ), ), self.InputItem( @@ -66,16 +59,13 @@ def inputs_format(self): schema=StringItemSchema(description=_("请输入在蓝鲸作业平台上注册的账户名")), ), self.InputItem( - name=_("目标路径"), - key="file_path", - type="string", - schema=StringItemSchema(description=_("目标路径")), + name=_("目标路径"), key="file_path", type="string", schema=StringItemSchema(description=_("目标路径")), ), self.InputItem( name=_("是否允许跨业务"), key="job_across_biz", type="boolean", - schema=BooleanItemSchema(description=_("是否允许跨业务,如果允许,源文件IP格式需为【云区域ID:IP】")), + schema=BooleanItemSchema(description=_("是否允许跨业务,如果允许,源文件IP格式需为【管控区域ID:IP】")), ), ] diff --git a/pipeline_plugins/components/collections/sites/open/nodeman/create_task/legacy.py b/pipeline_plugins/components/collections/sites/open/nodeman/create_task/legacy.py index 1d11b9469a..503aa4cc4d 100644 --- a/pipeline_plugins/components/collections/sites/open/nodeman/create_task/legacy.py +++ b/pipeline_plugins/components/collections/sites/open/nodeman/create_task/legacy.py @@ -15,18 +15,12 @@ import rsa from django.utils.translation import ugettext_lazy as _ - -from api.collections.nodeman import BKNodeManClient -from pipeline.core.flow.activity import Service, StaticIntervalGenerator from pipeline.component_framework.component import Component +from pipeline.core.flow.activity import Service, StaticIntervalGenerator +from pipeline.core.flow.io import ArrayItemSchema, IntItemSchema, ObjectItemSchema, StringItemSchema from pipeline.utils.crypt import rsa_decrypt_password -from pipeline.core.flow.io import ( - IntItemSchema, - StringItemSchema, - ArrayItemSchema, - ObjectItemSchema, -) +from api.collections.nodeman import BKNodeManClient from gcloud.conf import settings from gcloud.utils.ip import get_ip_by_regex @@ -211,10 +205,10 @@ def inputs_format(self): name=_("业务 ID"), key="biz_cc_id", type="int", schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), ), self.InputItem( - name=_("云区域 ID"), + name=_("管控区域 ID"), key="nodeman_bk_cloud_id", type="string", - schema=StringItemSchema(description=_("节点所在云区域 ID")), + schema=StringItemSchema(description=_("节点所在管控区域 ID")), ), self.InputItem( name=_("节点类型"), @@ -239,7 +233,7 @@ def inputs_format(self): key="nodeman_hosts", type="array", schema=ArrayItemSchema( - description=_("主机所在云区域 ID"), + description=_("主机所在管控区域 ID"), item_schema=ObjectItemSchema( description=_("主机相关信息"), property_schemas={ diff --git a/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v2_0.py b/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v2_0.py index 7a3d9f1956..89adb8d22c 100644 --- a/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v2_0.py +++ b/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v2_0.py @@ -13,23 +13,17 @@ import itertools from django.utils.translation import ugettext_lazy as _ - -from api.collections.nodeman import BKNodeManClient from pipeline.component_framework.component import Component -from pipeline.core.flow.io import ( - IntItemSchema, - StringItemSchema, - ArrayItemSchema, - ObjectItemSchema, -) +from pipeline.core.flow.io import ArrayItemSchema, IntItemSchema, ObjectItemSchema, StringItemSchema +from api.collections.nodeman import BKNodeManClient from gcloud.conf import settings -from gcloud.utils.crypto import encrypt_auth_key, decrypt_auth_key +from gcloud.utils.crypto import decrypt_auth_key, encrypt_auth_key from pipeline_plugins.components.collections.sites.open.nodeman.base import ( NodeManBaseService, get_host_id_by_inner_ip, - get_nodeman_rsa_public_key, get_host_id_by_inner_ipv6, + get_nodeman_rsa_public_key, ) __group_name__ = _("节点管理(Nodeman)") @@ -171,7 +165,7 @@ def execute(self, data, parent_data): try: one["bk_host_id"] = bk_host_id_dict[inner_ip] except KeyError: - data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认云区域是否正确".format(inner_ip))) + data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认管控区域是否正确".format(inner_ip))) return False # 组装其它可选参数, ip数量需要与inner_ip一一对应 @@ -208,10 +202,7 @@ def execute(self, data, parent_data): def inputs_format(self): return [ self.InputItem( - name=_("业务 ID"), - key="bk_biz_id", - type="int", - schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), + name=_("业务 ID"), key="bk_biz_id", type="int", schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), ), self.InputItem( name=_("操作对象"), @@ -220,7 +211,7 @@ def inputs_format(self): schema=ObjectItemSchema( description=_("需要操作的对象"), property_schemas={ - "nodeman_bk_cloud_id": StringItemSchema(description=_("云区域 ID")), + "nodeman_bk_cloud_id": StringItemSchema(description=_("管控区域 ID")), "nodeman_node_type": StringItemSchema( description=_("节点类型,可以是 AGENT(表示直连区域安装 Agent)、 PROXY(表示安装 Proxy)") ), diff --git a/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v3_0.py b/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v3_0.py index 3681e2470e..610864ac50 100644 --- a/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v3_0.py +++ b/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v3_0.py @@ -13,23 +13,17 @@ import itertools from django.utils.translation import ugettext_lazy as _ - -from api.collections.nodeman import BKNodeManClient from pipeline.component_framework.component import Component -from pipeline.core.flow.io import ( - IntItemSchema, - StringItemSchema, - ArrayItemSchema, - ObjectItemSchema, -) +from pipeline.core.flow.io import ArrayItemSchema, IntItemSchema, ObjectItemSchema, StringItemSchema +from api.collections.nodeman import BKNodeManClient from gcloud.conf import settings -from gcloud.utils.crypto import encrypt_auth_key, decrypt_auth_key +from gcloud.utils.crypto import decrypt_auth_key, encrypt_auth_key from pipeline_plugins.components.collections.sites.open.nodeman.base import ( NodeManBaseService, get_host_id_by_inner_ip, - get_nodeman_rsa_public_key, get_host_id_by_inner_ipv6, + get_nodeman_rsa_public_key, ) __group_name__ = _("节点管理(Nodeman)") @@ -175,7 +169,7 @@ def execute(self, data, parent_data): try: one["bk_host_id"] = bk_host_id_dict[inner_ip] except KeyError: - data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认云区域是否正确".format(inner_ip))) + data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认管控区域是否正确".format(inner_ip))) return False # 组装其它可选参数, ip数量需要与inner_ip一一对应 @@ -210,10 +204,7 @@ def execute(self, data, parent_data): def inputs_format(self): return [ self.InputItem( - name=_("业务 ID"), - key="bk_biz_id", - type="int", - schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), + name=_("业务 ID"), key="bk_biz_id", type="int", schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), ), self.InputItem( name=_("节点类型"), @@ -239,7 +230,7 @@ def inputs_format(self): item_schema=ObjectItemSchema( description=_("主机相关信息"), property_schemas={ - "nodeman_bk_cloud_id": StringItemSchema(description=_("云区域ID")), + "nodeman_bk_cloud_id": StringItemSchema(description=_("管控区域ID")), "nodeman_ap_id": StringItemSchema(description=_("接入点")), "inner_ip": StringItemSchema(description=_("内网 IP")), "login_ip": StringItemSchema(description=_("主机登录 IP,可以为空,适配复杂网络时填写")), @@ -258,7 +249,7 @@ def inputs_format(self): item_schema=ObjectItemSchema( description=_("主机相关信息"), property_schemas={ - "nodeman_bk_cloud_id": StringItemSchema(description=_("云区域ID")), + "nodeman_bk_cloud_id": StringItemSchema(description=_("管控区域ID")), "nodeman_ip_str": StringItemSchema(description=_("IP")), }, ), @@ -275,4 +266,4 @@ class NodemanCreateTaskComponent(Component): bound_service = NodemanCreateTaskService form = "%scomponents/atoms/nodeman/create_task/v3_0.js" % settings.STATIC_URL version = VERSION - desc = _("v3.0版本支持多云区域主机新建任务 \n" "注意:节点类型PROXY仅支持非直连区域") + desc = _("v3.0版本支持多管控区域主机新建任务 \n" "注意:节点类型PROXY仅支持非直连区域") diff --git a/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v4_0.py b/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v4_0.py index 92248ed333..43eeb95e4c 100644 --- a/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v4_0.py +++ b/pipeline_plugins/components/collections/sites/open/nodeman/create_task/v4_0.py @@ -11,19 +11,13 @@ specific language governing permissions and limitations under the License. """ from django.utils.translation import ugettext_lazy as _ - -from api.collections.nodeman import BKNodeManClient from pipeline.component_framework.component import Component -from pipeline.core.flow.io import ( - IntItemSchema, - StringItemSchema, - ArrayItemSchema, - ObjectItemSchema, -) +from pipeline.core.flow.io import ArrayItemSchema, IntItemSchema, ObjectItemSchema, StringItemSchema +from api.collections.nodeman import BKNodeManClient from gcloud.conf import settings -from gcloud.utils.crypto import encrypt_auth_key, decrypt_auth_key from gcloud.utils.cmdb import get_business_host, get_business_host_ipv6 +from gcloud.utils.crypto import decrypt_auth_key, encrypt_auth_key from pipeline_plugins.base.utils.inject import supplier_account_for_business from pipeline_plugins.components.collections.sites.open.nodeman.base import ( NodeManBaseService, @@ -164,7 +158,7 @@ def execute(self, data, parent_data): try: one["bk_host_id"] = bk_host_id_dict[inner_ip] except KeyError: - data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认云区域是否正确".format(inner_ip))) + data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认管控区域是否正确".format(inner_ip))) return False # 组装其它可选参数, ip数量需要与inner_ip一一对应 @@ -205,10 +199,7 @@ def execute(self, data, parent_data): def inputs_format(self): return [ self.InputItem( - name=_("业务 ID"), - key="bk_biz_id", - type="int", - schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), + name=_("业务 ID"), key="bk_biz_id", type="int", schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), ), self.InputItem( name=_("节点类型"), @@ -234,7 +225,7 @@ def inputs_format(self): item_schema=ObjectItemSchema( description=_("主机相关信息"), property_schemas={ - "nodeman_bk_cloud_id": StringItemSchema(description=_("云区域ID")), + "nodeman_bk_cloud_id": StringItemSchema(description=_("管控区域ID")), "nodeman_ap_id": StringItemSchema(description=_("接入点")), "inner_ip": StringItemSchema(description=_("内网 IP")), "login_ip": StringItemSchema(description=_("主机登录 IP,可以为空,适配复杂网络时填写")), @@ -253,7 +244,7 @@ def inputs_format(self): item_schema=ObjectItemSchema( description=_("主机相关信息"), property_schemas={ - "nodeman_bk_cloud_id": StringItemSchema(description=_("云区域ID")), + "nodeman_bk_cloud_id": StringItemSchema(description=_("管控区域ID")), "nodeman_ip_str": StringItemSchema(description=_("IP")), }, ), diff --git a/pipeline_plugins/components/collections/sites/open/nodeman/plugin_operate/v1_0.py b/pipeline_plugins/components/collections/sites/open/nodeman/plugin_operate/v1_0.py index 929b3c145c..6c21b31aa9 100644 --- a/pipeline_plugins/components/collections/sites/open/nodeman/plugin_operate/v1_0.py +++ b/pipeline_plugins/components/collections/sites/open/nodeman/plugin_operate/v1_0.py @@ -12,12 +12,7 @@ """ from django.utils.translation import ugettext_lazy as _ from pipeline.component_framework.component import Component -from pipeline.core.flow.io import ( - ArrayItemSchema, - IntItemSchema, - ObjectItemSchema, - StringItemSchema, -) +from pipeline.core.flow.io import ArrayItemSchema, IntItemSchema, ObjectItemSchema, StringItemSchema from gcloud.conf import settings @@ -34,10 +29,7 @@ class NodemanPluginOperateService(NodeManBaseService, NodemanPluginIPMixin): def inputs_format(self): return [ self.InputItem( - name=_("业务 ID"), - key="bk_biz_id", - type="int", - schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), + name=_("业务 ID"), key="bk_biz_id", type="int", schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), ), self.InputItem( name=_("插件操作信息"), @@ -69,7 +61,7 @@ def inputs_format(self): "nodeman_host_input_type": StringItemSchema( description=_("主机填写方式"), enum=["host_ip", "host_id"] ), - "nodeman_bk_cloud_id": IntItemSchema(description=_("主机所在云区域 ID")), + "nodeman_bk_cloud_id": IntItemSchema(description=_("主机所在管控区域 ID")), "nodeman_host_ip": StringItemSchema( description=_("主机ip,多个以英文','分隔,nodeman_host_input_type值为host_ip时必填") ), @@ -100,7 +92,7 @@ def execute(self, data, parent_data): ip_str = host_info.get("nodeman_host_ip", "") host_result = self.get_host_list(executor, self.logger, bk_biz_id, ip_str, bk_cloud_id) if not host_result["result"]: - data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认云区域是否正确".format(host_result["message"]))) + data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认管控区域是否正确".format(host_result["message"]))) return False host = [int(host_id) for host_id in host_result["data"]] else: diff --git a/pipeline_plugins/components/collections/sites/open/nodeman/plugin_operate/v2_0.py b/pipeline_plugins/components/collections/sites/open/nodeman/plugin_operate/v2_0.py index dc2bc077c9..92648cd31e 100644 --- a/pipeline_plugins/components/collections/sites/open/nodeman/plugin_operate/v2_0.py +++ b/pipeline_plugins/components/collections/sites/open/nodeman/plugin_operate/v2_0.py @@ -29,10 +29,7 @@ class NodemanPluginOperateService(NodeManBaseService, NodemanPluginIPMixin): def inputs_format(self): return [ self.InputItem( - name=_("业务 ID"), - key="bk_biz_id", - type="int", - schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), + name=_("业务 ID"), key="bk_biz_id", type="int", schema=IntItemSchema(description=_("当前操作所属的 CMDB 业务 ID")), ), self.InputItem( name=_("插件操作信息"), @@ -61,7 +58,7 @@ def inputs_format(self): schema=ObjectItemSchema( description=_("主机信息内容"), property_schemas={ - "nodeman_bk_cloud_id": IntItemSchema(description=_("主机所在云区域 ID")), + "nodeman_bk_cloud_id": IntItemSchema(description=_("主机所在管控区域 ID")), "nodeman_host_ip": StringItemSchema( description=_("主机ip,多个以英文','分隔,nodeman_host_input_type值为host_ip时必填") ), @@ -85,7 +82,7 @@ def execute(self, data, parent_data): ip_str = data.inputs.nodeman_host_ip host_result = self.get_host_list(executor, self.logger, bk_biz_id, ip_str, bk_cloud_id) if not host_result["result"]: - data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认云区域是否正确".format(host_result["message"]))) + data.set_outputs("ex_data", _("获取bk_host_id失败:{},请确认管控区域是否正确".format(host_result["message"]))) return False host = [int(host_id) for host_id in host_result["data"]] @@ -98,4 +95,4 @@ class NodemanPluginOperateComponent(Component): bound_service = NodemanPluginOperateService form = "%scomponents/atoms/nodeman/plugin_operate/v2_0.js" % settings.STATIC_URL version = "v2.0" - desc = _("移除填写方式,只支持主机IP方式\n 云区域ID、主机IP支持 设置为变量 \n 云区域ID 支持AllowCreate \n") + desc = _("移除填写方式,只支持主机IP方式\n 管控区域ID、主机IP支持 设置为变量 \n 管控区域ID 支持AllowCreate \n") diff --git a/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_0.js b/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_0.js index c1bfe85dd2..d1d3c20ba7 100644 --- a/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_0.js @@ -356,9 +356,9 @@ attrs: { name: gettext("目标服务器"), pagination: true, - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, - empty_text: gettext("请输入IP 地址,多IP可用空格、换行分隔, 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + empty_text: gettext("请输入IP 地址,多IP可用空格、换行分隔, 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), table_buttons: [ { type: "add_row", @@ -384,7 +384,7 @@ tag_code: "bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID(默认为0)"), + name: gettext("管控区域ID(默认为0)"), validation: [ { type: "required" diff --git a/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js b/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js index e94ed8a15d..b717d3f5b6 100644 --- a/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js +++ b/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_execute_script/v1_1.js @@ -483,9 +483,9 @@ attrs: { name: gettext("执行目标"), pagination: true, - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, - empty_text: gettext("请输入IP 地址,多IP可用空格、换行分隔, 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + empty_text: gettext("请输入IP 地址,多IP可用空格、换行分隔, 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), table_buttons: [ { type: "add_row", @@ -511,7 +511,7 @@ tag_code: "bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID(默认为0)"), + name: gettext("管控区域ID(默认为0)"), validation: [ { type: "required" diff --git a/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_0.js b/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_0.js index c6b5a57c0c..b747dcd5cc 100644 --- a/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_0.js @@ -55,7 +55,7 @@ tag_code: "bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), placeholder: gettext("默认为0"), width: '90px', editable: true, @@ -207,7 +207,7 @@ tag_code: "bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), placeholder: gettext("默认为0"), width: '90px', editable: true, diff --git a/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_1.js b/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_1.js index f04d2d79d5..5e346f3957 100644 --- a/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_1.js +++ b/pipeline_plugins/components/static/components/atoms/job/all_biz_fast_push_file/v1_1.js @@ -182,7 +182,7 @@ tag_code: "bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), placeholder: gettext("默认为0"), width: '90px', editable: true, @@ -334,7 +334,7 @@ tag_code: "bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), placeholder: gettext("默认为0"), width: '90px', editable: true, diff --git a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_0.js b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_0.js index b6c9066055..6a14998b15 100644 --- a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_0.js @@ -618,7 +618,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_1.js b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_1.js index 719219d9b1..a728edd25f 100644 --- a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_1.js +++ b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_1.js @@ -592,7 +592,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_2.js b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_2.js index 00a9031499..fb65296b1a 100644 --- a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_2.js +++ b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_2.js @@ -689,7 +689,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v1_0.js b/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v1_0.js index baa171c300..278171b466 100644 --- a/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v1_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v1_0.js @@ -74,7 +74,7 @@ type: "input", attrs: { name: gettext("IP"), - placeholder: gettext("跨业务用【云区域ID:IP】"), + placeholder: gettext("跨业务用【管控区域ID:IP】"), width: '170px', editable: true, validation: [ @@ -125,7 +125,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_0.js b/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_0.js index 19aa5d45d1..39d5442e4c 100644 --- a/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_0.js @@ -73,7 +73,7 @@ type: "input", attrs: { name: gettext("IP"), - placeholder: gettext("跨业务用【云区域ID:IP】"), + placeholder: gettext("跨业务用【管控区域ID:IP】"), width: '170px', editable: true, validation: [ @@ -217,7 +217,7 @@ type: "textarea", attrs: { name: gettext("IP"), - placeholder: gettext("IP必须填写【云区域ID:IP】或者【IP】格式之一"), + placeholder: gettext("IP必须填写【管控区域ID:IP】或者【IP】格式之一"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_1.js b/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_1.js index 360a24a189..fbef88debc 100644 --- a/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_1.js +++ b/pipeline_plugins/components/static/components/atoms/job/fast_push_file/v2_1.js @@ -315,7 +315,7 @@ type: "textarea", attrs: { name: gettext("IP"), - placeholder: gettext("IP必须填写【云区域ID:IP】或者【IP】格式之一"), + placeholder: gettext("IP必须填写【管控区域ID:IP】或者【IP】格式之一"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/job_fast_execute_script.js b/pipeline_plugins/components/static/components/atoms/job/job_fast_execute_script.js index a15161827c..36027c4380 100644 --- a/pipeline_plugins/components/static/components/atoms/job/job_fast_execute_script.js +++ b/pipeline_plugins/components/static/components/atoms/job/job_fast_execute_script.js @@ -650,7 +650,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/job_fast_push_file.js b/pipeline_plugins/components/static/components/atoms/job/job_fast_push_file.js index 7972a2cfe8..629c47981a 100644 --- a/pipeline_plugins/components/static/components/atoms/job/job_fast_push_file.js +++ b/pipeline_plugins/components/static/components/atoms/job/job_fast_push_file.js @@ -108,7 +108,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v1_0_0.js b/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v1_0_0.js index 8a9233b7db..2f47ecd934 100644 --- a/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v1_0_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v1_0_0.js @@ -111,7 +111,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v2_0.js b/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v2_0.js index 286db1cd2c..c687ab27e3 100644 --- a/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v2_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v2_0.js @@ -238,7 +238,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v2_1.js b/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v2_1.js index 8dfb7eeb20..dcab97c69e 100644 --- a/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v2_1.js +++ b/pipeline_plugins/components/static/components/atoms/job/job_push_local_files/v2_1.js @@ -334,7 +334,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_0.js b/pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_0.js index 277221cbfc..e09fb9d34a 100644 --- a/pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_0.js @@ -43,7 +43,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_1.js b/pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_1.js index f2baa93252..ccafd72bcf 100644 --- a/pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_1.js +++ b/pipeline_plugins/components/static/components/atoms/job/local_content_upload/v1_1.js @@ -160,7 +160,7 @@ type: "textarea", attrs: { name: gettext("目标服务器"), - placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入云区域:IP,并确保已在作业平台添加白名单"), + placeholder: gettext("请输入IP 地址,多IP可用空格、换行分隔\n 非本业务IP请输入管控区域:IP,并确保已在作业平台添加白名单"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/nodeman/create_task/legacy.js b/pipeline_plugins/components/static/components/atoms/nodeman/create_task/legacy.js index 00bd091829..81c4999799 100644 --- a/pipeline_plugins/components/static/components/atoms/nodeman/create_task/legacy.js +++ b/pipeline_plugins/components/static/components/atoms/nodeman/create_task/legacy.js @@ -47,7 +47,7 @@ tag_code: "nodeman_bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v2_0.js b/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v2_0.js index 4aa0f719f9..aff01501db 100644 --- a/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v2_0.js +++ b/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v2_0.js @@ -77,7 +77,7 @@ tag_code: "nodeman_bk_cloud_id", type: "select", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), hookable: true, remote: true, items: [], diff --git a/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v3_0.js b/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v3_0.js index d171ca807d..a47a152b87 100644 --- a/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v3_0.js +++ b/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v3_0.js @@ -250,7 +250,7 @@ tag_code: "nodeman_bk_cloud_id", type: "select", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), width: "180px", remote: true, items: [], @@ -518,8 +518,8 @@ tag_code: "nodeman_bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID"), - placeholder: gettext("一行只能对应一个云区域ID"), + name: gettext("管控区域ID"), + placeholder: gettext("一行只能对应一个管控区域ID"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v4_0.js b/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v4_0.js index 15674a0c1e..d0457cf9bf 100644 --- a/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v4_0.js +++ b/pipeline_plugins/components/static/components/atoms/nodeman/create_task/v4_0.js @@ -334,7 +334,7 @@ tag_code: "nodeman_bk_cloud_id", type: "select", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), width: "180px", remote: true, items: [], @@ -685,8 +685,8 @@ tag_code: "nodeman_bk_cloud_id", type: "input", attrs: { - name: gettext("云区域ID"), - placeholder: gettext("一行只能对应一个云区域ID"), + name: gettext("管控区域ID"), + placeholder: gettext("一行只能对应一个管控区域ID"), hookable: true, validation: [ { diff --git a/pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v1_0.js b/pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v1_0.js index da43313008..5cade86e78 100644 --- a/pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v1_0.js +++ b/pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v1_0.js @@ -90,7 +90,7 @@ tag_code: "nodeman_bk_cloud_id", type: "select", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), hookable: true, remote: true, items: [], @@ -116,7 +116,7 @@ } else if (self.get_parent().get_child('nodeman_host_input_type')) { if (self.get_parent().get_child('nodeman_host_input_type').value === "host_ip" && !value.toString()) { result.result = false; - result.error_message = gettext("请选云区域"); + result.error_message = gettext("请选管控区域"); } } return result diff --git a/pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v2_0.js b/pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v2_0.js index 18a469497a..3977779805 100644 --- a/pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v2_0.js +++ b/pipeline_plugins/components/static/components/atoms/nodeman/plugin_operate/v2_0.js @@ -65,7 +65,7 @@ tag_code: "nodeman_bk_cloud_id", type: "select", attrs: { - name: gettext("云区域ID"), + name: gettext("管控区域ID"), hookable: true, remote: true, allowCreate: true, diff --git a/pipeline_plugins/components/utils/sites/open/utils.py b/pipeline_plugins/components/utils/sites/open/utils.py index 04e1ff3cfa..cd190b1473 100644 --- a/pipeline_plugins/components/utils/sites/open/utils.py +++ b/pipeline_plugins/components/utils/sites/open/utils.py @@ -22,11 +22,7 @@ from gcloud.conf import settings from gcloud.core.models import EngineConfig from gcloud.utils import cmdb -from gcloud.utils.ip import ( - extract_ip_from_ip_str, - get_ip_by_regex, - get_ipv6_and_cloud_id_from_ipv6_cloud_str, -) +from gcloud.utils.ip import extract_ip_from_ip_str, get_ip_by_regex, get_ipv6_and_cloud_id_from_ipv6_cloud_str from pipeline_plugins.base.utils.inject import supplier_account_for_business from pipeline_plugins.variables.utils import find_module_with_relation @@ -157,7 +153,7 @@ def get_ipv4_info_list_with_cloud_id(username, biz_cc_id, supplier_account, ipv4 ipv4_info_with_cloud_valid = [] for ip_info in ipv4_info_list: - # 清洗出来所有带云区域带ip + # 清洗出来所有带管控区域带ip plat_ip = "{}:{}".format(ip_info["host"].get("bk_cloud_id", -1), ip_info["host"].get("bk_host_innerip", "")) if plat_ip in ipv4_list_with_cloud_id: ipv4_info_with_cloud_valid.append(ip_info) @@ -208,7 +204,7 @@ def get_ipv6_info_list_with_cloud_id(username, biz_cc_id, supplier_account, ipv6 ipv6_info_with_cloud_valid = [] for ip_info in ipv6_info_list: - # 清洗出来所有带云区域带ip + # 清洗出来所有带管控区域带ip plat_ip = "{}:[{}]".format( ip_info["host"].get("bk_cloud_id", -1), ip_info["host"].get("bk_host_innerip_v6", "") ) @@ -294,7 +290,7 @@ def cc_get_ips_info_by_str_ipv6(username, biz_cc_id, ip_str, use_cache=True): if not ipv6_result: return {"result": False, "ip_result": [], "ip_count": 0, "invalid_ip": ipv6_data} - # ipv6带云区域 + # ipv6带管控区域 ipv6_list_with_cloud_id_result, ipv6_list_with_cloud_id_data = get_ipv6_info_list_with_cloud_id( username, biz_cc_id, supplier_account, ipv6_list_with_cloud_id ) @@ -336,7 +332,7 @@ def cc_get_ips_info_by_str(username, biz_cc_id, ip_str, use_cache=True): 1: IP,纯IP格式 2: 集群名称|模块名称|IP,集群名称|模块名称|IP 这种格式可以唯一定位到一 个IP(如果业务把相同IP放到同一模块,还是有问题) - 3: 云区域ID:IP,云区域ID:IP 这种格式可以唯一定位到一个IP,主要是兼容Job组件 + 3: 管控区域ID:IP,管控区域ID:IP 这种格式可以唯一定位到一个IP,主要是兼容Job组件 传参需要和获取Job作业模板步骤参数 @return: {'result': True or False, 'data': [{'InnerIP': ,'HostID': , 'Source': , 'SetID': , 'SetName': , 'ModuleID': , 'ModuleName': , 'Sets': , 'Module': },{}]} @@ -392,7 +388,7 @@ def cc_get_ips_info_by_str(username, biz_cc_id, ip_str, use_cache=True): } ) - # 格式3 云区域ID:IP + # 格式3 管控区域ID:IP elif plat_ip_reg.match(ip_str): plat_ip = [] for match in plat_ip_reg.finditer(ip_str): @@ -511,7 +507,7 @@ def get_biz_ip_from_frontend( if is_across: plat_ip = [match.group() for match in plat_ip_reg.finditer(ip_str)] ip_list = [{"ip": _ip.split(":")[1], "bk_cloud_id": _ip.split(":")[0]} for _ip in plat_ip] - err_msg = _("允许跨业务时IP格式需满足:【云区域ID:IP】。失败 IP: {}") + err_msg = _("允许跨业务时IP格式需满足:【管控区域ID:IP】。失败 IP: {}") else: var_ip = cc_get_ips_info_by_str(username=executor, biz_cc_id=biz_cc_id, ip_str=ip_str, use_cache=False) ip_list = [{"ip": _ip["InnerIP"], "bk_cloud_id": _ip["Source"]} for _ip in var_ip["ip_result"]] @@ -540,13 +536,13 @@ def get_repeat_ip(ip_list): repeat_ip_detail.setdefault(ip_info["ip"], []).append(ip_info["bk_cloud_id"]) return ",".join( - ["ip: {} 云区域{}".format(repeat_ip, value) for repeat_ip, value in repeat_ip_detail.items() if len(value) > 0] + ["ip: {} 管控区域{}".format(repeat_ip, value) for repeat_ip, value in repeat_ip_detail.items() if len(value) > 0] ) def get_biz_ip_from_frontend_hybrid(executor, ip_str, biz_cc_id, data, ignore_ex_data=False): """ - 处理前端ip,云区域:ip 混合输入的情况,最终提取出来的格式为: + 处理前端ip,管控区域:ip 混合输入的情况,最终提取出来的格式为: [ { "bk_cloud_id": 0, @@ -559,7 +555,7 @@ def get_biz_ip_from_frontend_hybrid(executor, ip_str, biz_cc_id, data, ignore_ex ip_str, biz_cc_id ) ) - # 先提取所有带云区域的ip + # 先提取所有带管控区域的ip plat_ip = [match.group().split(":") for match in plat_ip_reg.finditer(ip_str)] plat_ip_list = [{"ip": _ip, "bk_cloud_id": int(_cloud)} for _cloud, _ip in plat_ip] logger.info( @@ -575,7 +571,7 @@ def get_biz_ip_from_frontend_hybrid(executor, ip_str, biz_cc_id, data, ignore_ex ip_str, without_plat_ip_list ) ) - # 对于用户没有输入云区域的ip,则去当前业务下查询云区域 + # 对于用户没有输入管控区域的ip,则去当前业务下查询管控区域 if not without_plat_ip_list: return True, plat_ip_list @@ -595,10 +591,10 @@ def get_biz_ip_from_frontend_hybrid(executor, ip_str, biz_cc_id, data, ignore_ex return False, [] if len(ip_list) != len(set(without_plat_ip_list)): - # 这种情况应该是存在一个ip下有多个云区域的情况 + # 这种情况应该是存在一个ip下有多个管控区域的情况 if not ignore_ex_data: repeat_err_msg = get_repeat_ip(ip_list) - data.outputs.ex_data = "IP在多个云区域下重复,建议输入云区域:ip确定目标主机,详情: {}".format(repeat_err_msg) + data.outputs.ex_data = "IP在多个管控区域下重复,建议输入管控区域:ip确定目标主机,详情: {}".format(repeat_err_msg) return False, [] if not ip_list: if not ignore_ex_data: diff --git a/pipeline_plugins/resource_replacement/base.py b/pipeline_plugins/resource_replacement/base.py index 544ceefe08..91fb118298 100644 --- a/pipeline_plugins/resource_replacement/base.py +++ b/pipeline_plugins/resource_replacement/base.py @@ -18,9 +18,7 @@ from MySQLdb import Connection -from pipeline_plugins.components.collections.sites.open.cc.base import ( - cc_parse_path_text, -) +from pipeline_plugins.components.collections.sites.open.cc.base import cc_parse_path_text from pipeline_plugins.components.utils.sites.open.utils import ip_pattern logger = logging.getLogger("root") @@ -260,8 +258,8 @@ def to_new_topo_select(self, old_topo_select: str) -> str: def to_new_cloud_id(self, old_cloud_id: int) -> int: """ - 获得迁移后的云区域 ID - 规则:除直连区域(0)外,其他云区域 ID 按规定量偏移 + 获得迁移后的管控区域 ID + 规则:除直连区域(0)外,其他管控区域 ID 按规定量偏移 :param old_cloud_id: :return: """ @@ -275,7 +273,7 @@ def to_new_cloud_id(self, old_cloud_id: int) -> int: return new_cloud_id def to_new_ip_list_str_or_raise(self, old_ip_list_str: str) -> str: - # 匹配出所有格式为 云区域:IP 的输入 + # 匹配出所有格式为 管控区域:IP 的输入 local_ip_pattern = re.compile(r"(\d+:)?((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(?!\d)") cloud_ip_list: typing.List[typing.List] = [ @@ -291,7 +289,7 @@ def to_new_ip_list_str_or_raise(self, old_ip_list_str: str) -> str: _cloud, _ip = cloud_ip plat_ip_list.append(f"{self.to_new_cloud_id(int(_cloud))}:{_ip}") - # 最小处理原则,如果填写的 IP 不包含云区域,则不做处理,尽可能不修改用户数据 + # 最小处理原则,如果填写的 IP 不包含管控区域,则不做处理,尽可能不修改用户数据 if not plat_ip_list: logger.info(f"[to_new_ip_list_str_or_raise] {old_ip_list_str} not hit plat_ip, skip") return old_ip_list_str @@ -376,7 +374,7 @@ def to_new_cmdb_id_form(self, component: typing.Dict[str, typing.Any], key: str, def process_ip_list_str(self, node_id: str, schema_attr_data: typing.Dict[str, typing.Any]): """ - 处理 IP 列表字符串,将其中可能存在的云区域 ID 按规则偏移 + 处理 IP 列表字符串,将其中可能存在的管控区域 ID 按规则偏移 :param node_id: :param schema_attr_data: :return: diff --git a/pipeline_plugins/tests/resource_replacement/test_cc_suites.py b/pipeline_plugins/tests/resource_replacement/test_cc_suites.py index 1c68c50142..a384775b3e 100644 --- a/pipeline_plugins/tests/resource_replacement/test_cc_suites.py +++ b/pipeline_plugins/tests/resource_replacement/test_cc_suites.py @@ -66,9 +66,7 @@ def test_do_by_hook(self): "key": "${cc_ip_list}", "desc": "", "custom_type": "", - "source_info": { - local_base.FIRST_ACT_ID: ["cc_ip_list"], - }, + "source_info": {local_base.FIRST_ACT_ID: ["cc_ip_list"]}, "value": "2:127.0.0.1, 3:127.0.0.1", "show_type": "show", "source_type": "component_inputs", @@ -170,14 +168,7 @@ class CCCreateModuleSuiteTestCase(TestCase): "data": { "biz_cc_id": {"hook": False, "need_render": True, "value": 2}, "cc_set_select_method": {"hook": False, "need_render": True, "value": "topo"}, - "cc_set_select_topo": { - "hook": False, - "need_render": True, - "value": [ - "set_97", - "set_98", - ], - }, + "cc_set_select_topo": {"hook": False, "need_render": True, "value": ["set_97", "set_98"]}, "cc_set_select_text": {"hook": False, "need_render": True, "value": "测试业务>集群A\n测试业务>集群B"}, "cc_create_method": {"hook": False, "need_render": True, "value": "category"}, "cc_module_infos_template": { @@ -440,21 +431,11 @@ class CCVarCmdbSetAllocationSuiteTestCase(TestCase): "set_count": "1", "set_template_id": "set_102", "set_template_name": "test1207", - "host_resources": [ - {"id": "set_101", "label": "标准运维"}, - {"id": "set_102", "label": "test1207"}, - ], + "host_resources": [{"id": "set_101", "label": "标准运维"}, {"id": "set_102", "label": "test1207"}], "mute_attribute": "", "filter_lock": False, "shareEqually": "", - "module_detail": [ - { - "id": 232, - "name": "test", - "host_count": "1", - "reuse_module": "", - } - ], + "module_detail": [{"id": 232, "name": "test", "host_count": "1", "reuse_module": ""}], }, "separator": ",", }, @@ -478,10 +459,7 @@ def test_do(self): suite: base.Suite = suites.CCVarCmdbSetAllocationSuite(suite_meta, local_base.DBMockHelper(None, "", "")) suite.do("${VarCmdbSetAllocation}", self.PIPELINE_TREE["constants"]["${VarCmdbSetAllocation}"]) self.assertEqual( - [ - {"id": "set_10101", "label": "标准运维"}, - {"id": "set_10102", "label": "test1207"}, - ], + [{"id": "set_10101", "label": "标准运维"}, {"id": "set_10102", "label": "test1207"}], self.PIPELINE_TREE["constants"]["${VarCmdbSetAllocation}"]["value"]["config"]["host_resources"], ) self.assertEqual( @@ -489,14 +467,7 @@ def test_do(self): self.PIPELINE_TREE["constants"]["${VarCmdbSetAllocation}"]["value"]["config"]["set_template_id"], ) self.assertEqual( - [ - { - "id": 10232, - "name": "test", - "host_count": "1", - "reuse_module": "", - } - ], + [{"id": 10232, "name": "test", "host_count": "1", "reuse_module": ""}], self.PIPELINE_TREE["constants"]["${VarCmdbSetAllocation}"]["value"]["config"]["module_detail"], ) @@ -690,7 +661,7 @@ class CCVarSetModuleIpSelectorSuiteTestCase(TestCase): "value": { "var_ip_method": "manual", "var_ip_custom_value": "1:127.0.0.1\n2:127.0.0.1", - "var_ip_select_value": {"var_set": ["直连区域", "云区域"], "var_module": ["空闲机", "故障机"], "var_module_name": ""}, + "var_ip_select_value": {"var_set": ["直连区域", "管控区域"], "var_module": ["空闲机", "故障机"], "var_module_name": ""}, "var_ip_manual_value": {"var_manual_set": "all", "var_manual_module": "all", "var_module_name": ""}, "var_filter_set": "test", "var_filter_module": "test", @@ -756,10 +727,8 @@ def test_do(self): suite: base.Suite = suites.CCVarSetModuleSelectorSuite(suite_meta, local_base.DBMockHelper(None, "", "")) suite.do("${VarSetModuleSelector}", self.PIPELINE_TREE["constants"]["${VarSetModuleSelector}"]) self.assertEqual( - 10096, - self.PIPELINE_TREE["constants"]["${VarSetModuleSelector}"]["value"]["bk_set_id"], + 10096, self.PIPELINE_TREE["constants"]["${VarSetModuleSelector}"]["value"]["bk_set_id"], ) self.assertEqual( - [10219, 10218], - self.PIPELINE_TREE["constants"]["${VarSetModuleSelector}"]["value"]["bk_module_id"], + [10219, 10218], self.PIPELINE_TREE["constants"]["${VarSetModuleSelector}"]["value"]["bk_module_id"], ) diff --git a/pipeline_plugins/variables/collections/sites/open/cc.py b/pipeline_plugins/variables/collections/sites/open/cc.py index ed4a64dec3..1cb182c205 100644 --- a/pipeline_plugins/variables/collections/sites/open/cc.py +++ b/pipeline_plugins/variables/collections/sites/open/cc.py @@ -24,17 +24,11 @@ from gcloud.constants import Type from gcloud.core.models import Project from gcloud.utils.cmdb import get_business_host, get_business_host_by_hosts_ids -from gcloud.utils.ip import ( - extract_ip_from_ip_str, - get_ip_by_regex, - get_plat_ip_by_regex, -) +from gcloud.utils.ip import extract_ip_from_ip_str, get_ip_by_regex, get_plat_ip_by_regex from pipeline_plugins.base.utils.adapter import cc_get_inner_ip_by_module_id from pipeline_plugins.base.utils.inject import supplier_account_for_project from pipeline_plugins.cmdb_ip_picker.utils import get_ip_picker_result -from pipeline_plugins.components.collections.sites.open.cc.base import ( - cc_get_host_by_innerip_with_ipv6, -) +from pipeline_plugins.components.collections.sites.open.cc.base import cc_get_host_by_innerip_with_ipv6 from pipeline_plugins.components.utils import cc_get_ips_info_by_str from pipeline_plugins.components.utils.common import ip_re from pipeline_plugins.variables.base import FieldExplain, SelfExplainVariable @@ -117,8 +111,8 @@ class VarCmdbIpSelector(LazyVariable, SelfExplainVariable): "筛选条件和排除条件为 AND 关系\n" "- 筛选:会从IP列表中筛选出符合条件的IP\n" "- 排除:会从IP列表中去除符合条件的IP\n" - "变量值是否带云区域\n" - "- 是,返回格式为{cloud_id}:{ip},{cloud_id}:{ip}\n" + "变量值是否带管控区域\n" + "- 是,返回格式为{BK-Net_id}:{ip},{BK-Net_id}:{ip}\n" "- 否,返回格式为{ip},{ip}" ) @@ -147,7 +141,7 @@ def get_value(self): hosts = [] for host in ip_result["data"]: p_address = ipaddress.ip_address(host["bk_host_innerip"]) - # 如果是ipv6地址,则不携带云区域 + # 如果是ipv6地址,则不携带管控区域 if settings.ENABLE_IPV6 and p_address.version == 6: hosts.append(f'{host["bk_cloud_id"]}:[{host["bk_host_innerip"]}]') else: @@ -231,9 +225,7 @@ def _self_explain(cls, **kwargs) -> List[FieldExplain]: FieldExplain(key="${KEY._module}", type=Type.LIST, description="集群下的模块信息列表,元素类型为字典,键为模块名,值为模块下的主机列"), FieldExplain(key="${KEY.flat__ip_list}", type=Type.STRING, description="本次操作创建的所有集群下的主机(去重后),用 ',' 连接"), FieldExplain( - key="${KEY.flat__verbose_ip_list}", - type=Type.STRING, - description="返回的是本次操作创建的所有集群下的主机(未去重),用 ',' 连接", + key="${KEY.flat__verbose_ip_list}", type=Type.STRING, description="返回的是本次操作创建的所有集群下的主机(未去重),用 ',' 连接", ), FieldExplain( key="${KEY.flat__verbose_ip_module_list}", @@ -312,13 +304,7 @@ def _handle_value_with_ipv4(username, bk_biz_id, bk_supplier_account, host_field if not ip_list: return [] - hosts_list = get_business_host( - username, - bk_biz_id, - bk_supplier_account, - host_fields, - ip_list, - ) + hosts_list = get_business_host(username, bk_biz_id, bk_supplier_account, host_fields, ip_list,) return hosts_list @staticmethod @@ -408,7 +394,7 @@ class VarCmdbIpFilter(LazyVariable, SelfExplainVariable): @classmethod def _self_explain(cls, **kwargs) -> List[FieldExplain]: fields = [ - FieldExplain(key="${KEY}", type=Type.STRING, description="返回符合过滤条件的【云区域:IP】"), + FieldExplain(key="${KEY}", type=Type.STRING, description="返回符合过滤条件的【管控区域:IP】"), ] return fields @@ -439,7 +425,7 @@ def get_value(self): for host in match_result_ip: p_address = ipaddress.ip_address(host["ip"]) if p_address.version == 6: - # 针对于ipv6 需要保持ipv6+云区域的格式 + # 针对于ipv6 需要保持ipv6+管控区域的格式 result.append("{}:[{}]".format(host["bk_cloud_id"], host["ip"])) else: result.append("{}:{}".format(host["bk_cloud_id"], host["ip"])) diff --git a/pipeline_plugins/variables/collections/sites/open/docs/cmdb/var_set_module_ip_selector.md b/pipeline_plugins/variables/collections/sites/open/docs/cmdb/var_set_module_ip_selector.md index 0720375b34..09a9f04480 100644 --- a/pipeline_plugins/variables/collections/sites/open/docs/cmdb/var_set_module_ip_selector.md +++ b/pipeline_plugins/variables/collections/sites/open/docs/cmdb/var_set_module_ip_selector.md @@ -23,7 +23,7 @@ - 自定义输入ip - * `ip`: IP必须填写【云区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的 + * `ip`: IP必须填写【管控区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的 * `筛选集群`: 筛选集群名称,英文逗号分隔 * `筛选服务模板`: 筛选服务模板名称,英文逗号分隔 diff --git a/pipeline_plugins/variables/static/variables/cmdb/var_cmdb_ip_filter.js b/pipeline_plugins/variables/static/variables/cmdb/var_cmdb_ip_filter.js index ca397288c9..f0e96b0d8d 100644 --- a/pipeline_plugins/variables/static/variables/cmdb/var_cmdb_ip_filter.js +++ b/pipeline_plugins/variables/static/variables/cmdb/var_cmdb_ip_filter.js @@ -23,7 +23,7 @@ type: "textarea", attrs: { name: gettext("原始IP"), - placeholder: gettext("IP为【IP】(云区域ID为0)、【云区域ID:IP】格式之一,多个用换行分隔"), + placeholder: gettext("IP为【IP】(管控区域ID为0)、【管控区域ID:IP】格式之一,多个用换行分隔"), hookable: true, validation: [ { @@ -50,7 +50,7 @@ tag_code: "ip_cloud", type: "radio", attrs: { - name: gettext("输出带云区域"), + name: gettext("输出带管控区域"), items: [ {name: gettext("是"), value: true}, {name: gettext("否"), value: false}, diff --git a/pipeline_plugins/variables/static/variables/cmdb/var_ip_picker.js b/pipeline_plugins/variables/static/variables/cmdb/var_ip_picker.js index 6af45a587d..978dc76db1 100644 --- a/pipeline_plugins/variables/static/variables/cmdb/var_ip_picker.js +++ b/pipeline_plugins/variables/static/variables/cmdb/var_ip_picker.js @@ -74,7 +74,7 @@ type: "textarea", attrs: { name: gettext("IP"), - placeholder: gettext("IP必须填写【云区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的") + placeholder: gettext("IP必须填写【管控区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的") }, events: [ { diff --git a/pipeline_plugins/variables/static/variables/cmdb/var_set_module_ip_selector.js b/pipeline_plugins/variables/static/variables/cmdb/var_set_module_ip_selector.js index 3bf12c26ef..3b3b489f5c 100644 --- a/pipeline_plugins/variables/static/variables/cmdb/var_set_module_ip_selector.js +++ b/pipeline_plugins/variables/static/variables/cmdb/var_set_module_ip_selector.js @@ -59,7 +59,7 @@ hookable: true, attrs: { name: gettext("IP"), - placeholder: gettext("IP必须填写【云区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的"), + placeholder: gettext("IP必须填写【管控区域ID:IP】或者【IP】格式之一,多个用换行分隔;【IP】格式需要保证所填写的内网IP在配置平台(CMDB)的该业务中是唯一的"), validation: [ { type: "required" diff --git a/version_logs_md/V3.10.6_2021-11-25.md b/version_logs_md/V3.10.6_2021-11-25.md index d588446e88..00f4f88924 100644 --- a/version_logs_md/V3.10.6_2021-11-25.md +++ b/version_logs_md/V3.10.6_2021-11-25.md @@ -7,7 +7,7 @@ ### Optimizations 🦾 * 节点管理新建任务2.0插件认证密钥表单支持通过全局变量引用配置 by @DomineCore in https://github.com/Tencent/bk-sops/pull/4587 -* 全业务快速执行脚本云区域 ID 字段调整为必填 by @homholueng in https://github.com/Tencent/bk-sops/pull/4585 +* 全业务快速执行脚本管控区域 ID 字段调整为必填 by @homholueng in https://github.com/Tencent/bk-sops/pull/4585 * 节点管理新建任务插件认证方式为TJJ时auth_key为非必填 by @wheel-w in https://github.com/Tencent/bk-sops/pull/4594 diff --git a/version_logs_md/V3.16.0_2022-02-16.md b/version_logs_md/V3.16.0_2022-02-16.md index a102fc3e56..60c7fe2de3 100644 --- a/version_logs_md/V3.16.0_2022-02-16.md +++ b/version_logs_md/V3.16.0_2022-02-16.md @@ -8,7 +8,7 @@ * 项目模板中增加我的收藏功能 by @ywywZhou in https://github.com/Tencent/bk-sops/pull/4991 * 节点选择面板上增加开发插件跳转链接 by @ywywZhou in https://github.com/Tencent/bk-sops/pull/4945 * 表格tag行支持手动拖拽排序 by @luofann in https://github.com/Tencent/bk-sops/pull/4986 -* 节点管理新建任务插件v3.0支持多云区域IP操作 by @normal-wls in https://github.com/Tencent/bk-sops/pull/5011 +* 节点管理新建任务插件v3.0支持多管控区域IP操作 by @normal-wls in https://github.com/Tencent/bk-sops/pull/5011 * 子流程节点支持选择执行方案 by @luofann in https://github.com/Tencent/bk-sops/pull/5007 * 任务列表根据任务类型区分面板 by @luofann in https://github.com/Tencent/bk-sops/pull/4953 diff --git a/version_logs_md/V3.5.2_2020-02-07.md b/version_logs_md/V3.5.2_2020-02-07.md index 0c06f54818..188b4d5b5f 100644 --- a/version_logs_md/V3.5.2_2020-02-07.md +++ b/version_logs_md/V3.5.2_2020-02-07.md @@ -1,5 +1,5 @@ ### 新功能 - - IP 选择器支持配置值是否带云区域 ID + - IP 选择器支持配置值是否带管控区域 ID - 后端添加版本日志功能 ### 优化项 diff --git a/version_logs_md/V3.6.39_2021-05-13.md b/version_logs_md/V3.6.39_2021-05-13.md index 71bffb57b1..20a2d32bfe 100644 --- a/version_logs_md/V3.6.39_2021-05-13.md +++ b/version_logs_md/V3.6.39_2021-05-13.md @@ -11,7 +11,7 @@ - 密码变量中公私钥支持从环境变量中读取 - 任务节点强制失败后支持重试和跳过 - 职能化任务通过普通任务打开时重定向到职能化任务链接 - - 优化批量修改主机属性插件校验逻辑,支持云区域ID:IP的填写方式 + - 优化批量修改主机属性插件校验逻辑,支持管控区域ID:IP的填写方式 - 插件列表按照版本号递增排序 - 优化 快速执行脚本v1.0版本 脚本名称模糊匹配问题 - IP选择器筛选条件支持自定义分隔符 diff --git a/version_logs_md/V3.6.42_2021-06-29.md b/version_logs_md/V3.6.42_2021-06-29.md index 41056b5f58..31a2b9586a 100644 --- a/version_logs_md/V3.6.42_2021-06-29.md +++ b/version_logs_md/V3.6.42_2021-06-29.md @@ -2,7 +2,7 @@ ## bugfix - 修复集群资源筛选变量导入excel数据时ip列为空问题 - 修复修复 lazy 类型变量支持预渲染引入的问题问题 - - 修复集群模块选择器手动输入 IP 可能会输出位于多个云区域下重复 IP 的问题 + - 修复集群模块选择器手动输入 IP 可能会输出位于多个管控区域下重复 IP 的问题 - 修复无法选择非标准空闲机池模块下 IP 的问题 - 修复表格tag操作按钮在任务执行开始后禁用态不生效问题 diff --git a/version_logs_md/V3.7.1_2021-09-03.md b/version_logs_md/V3.7.1_2021-09-03.md index 3ccb17ada0..4c59f0d6b9 100644 --- a/version_logs_md/V3.7.1_2021-09-03.md +++ b/version_logs_md/V3.7.1_2021-09-03.md @@ -12,4 +12,4 @@ ## improvement - 注册所有常用操作到IAM - - 从ip_str中匹配IP信息在纯IP格式和云区域ID:IP格式下支持host_innerip为多ip情况 \ No newline at end of file + - 从ip_str中匹配IP信息在纯IP格式和管控区域ID:IP格式下支持host_innerip为多ip情况 \ No newline at end of file