2424from backend .db_meta .models import Machine
2525from backend .db_periodic_task .models import DBPeriodicTask
2626from backend .db_services .ipchooser .query .resource import ResourceQueryHelper
27- from backend .flow .consts import DEFAULT_INSTANCE
27+ from backend .db_services .taskflow .handlers import TaskFlowHandler
28+ from backend .flow .consts import DEFAULT_INSTANCE , FAILED_STATES , SUCCEED_STATES
29+ from backend .flow .engine .bamboo .engine import BambooEngine
30+ from backend .flow .engine .controller .mysql import MySQLController
31+ from backend .flow .models import FlowTree
32+ from backend .flow .plugins .components .collections .common .external_service import ExternalServiceComponent
33+ from backend .ticket .constants import TicketType
34+ from backend .utils .basic import generate_root_id
2835from backend .utils .string import base64_decode , base64_encode
2936
3037logger = logging .getLogger ("root" )
@@ -132,13 +139,21 @@ def query_admin_password(
132139 return admin_password_data
133140
134141 @classmethod
135- def modify_admin_password (cls , operator : str , password : str , lock_hour : int , instance_list : List [Dict ]):
142+ def modify_admin_password (
143+ cls ,
144+ operator : str ,
145+ password : str ,
146+ lock_hour : int ,
147+ instance_list : List [Dict ],
148+ is_async : bool = False ,
149+ ):
136150 """
137151 修改db的admin密码
138152 @param operator: 操作人
139153 @param password: 修改密码
140154 @param lock_hour: 锁定时长
141155 @param instance_list: 修改的实例列表
156+ @param is_async: 是否异步执行
142157 """
143158 # 获取业务信息,任取一台machine查询
144159 machine = Machine .objects .get (bk_cloud_id = instance_list [0 ]["bk_cloud_id" ], ip = instance_list [0 ]["ip" ])
@@ -172,7 +187,7 @@ def modify_admin_password(cls, operator: str, password: str, lock_hour: int, ins
172187
173188 # 填充参数,修改admin的密码
174189 db_type = db_type .pop ()
175- modify_password_params = {
190+ params = {
176191 # username固定是ADMIN,与DBM_MYSQL_ADMIN_USER保持一致
177192 "username" : DB_ADMIN_USER_MAP [db_type ],
178193 "component" : db_type ,
@@ -183,11 +198,37 @@ def modify_admin_password(cls, operator: str, password: str, lock_hour: int, ins
183198 "security_rule_name" : DBM_PASSWORD_SECURITY_NAME ,
184199 "async" : False ,
185200 }
186- data = DBPrivManagerApi .modify_admin_password (
187- params = modify_password_params , raw = True , timeout = DBPrivManagerApi .TIMEOUT
188- )["data" ]
201+
202+ # 同步执行直接调用接口,异步执行则返回任务ID
203+ if not is_async :
204+ resp = DBPrivManagerApi .modify_admin_password (params = params , timeout = DBPrivManagerApi .TIMEOUT , raw = True )
205+ data = resp ["data" ]
206+ else :
207+ data = root_id = generate_root_id ()
208+ params .update (ticket_type = TicketType .ADMIN_PASSWORD_MODIFY , bk_biz_id = bk_biz_id , created_by = operator )
209+ MySQLController (root_id = root_id , ticket_data = params ).mysql_randomize_password ()
189210 return data
190211
212+ @classmethod
213+ def query_async_modify_result (cls , root_id : str ):
214+ """
215+ 查询异步密码修改结果
216+ @param root_id: 任务ID
217+ """
218+ flow_tree = FlowTree .objects .get (root_id = root_id )
219+ # 任务未完成,退出
220+ if flow_tree .status not in [* FAILED_STATES , * SUCCEED_STATES ]:
221+ return {"status" : flow_tree .status , "data" : "" }
222+
223+ # 查询修改密码的节点id
224+ task_handler = TaskFlowHandler (root_id )
225+ node_id = task_handler .get_node_id_by_component (flow_tree .tree , component_code = ExternalServiceComponent .code )[
226+ 0
227+ ]
228+ # 查询输出数据
229+ resp = BambooEngine (root_id ).get_node_output_data (node_id ).data ["resp" ]
230+ return {"status" : flow_tree .status , "data" : resp ["data" ]}
231+
191232 @classmethod
192233 def _get_password_role (cls , cluster_type , role ):
193234 """获取实例对应的密码角色"""
0 commit comments