import json
import os
from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkcore.http.http_config import HttpConfig
from huaweicloudsdkdrs.v3.drs_client import DrsClient
from huaweicloudsdkdrs.v3.model.batch_list_job_details_request import BatchListJobDetailsRequest
from huaweicloudsdkdrs.v3.model.batch_list_job_status_request import BatchListJobStatusRequest
from huaweicloudsdkdrs.v3.model.batch_list_progresses_request import BatchListProgressesRequest
from huaweicloudsdkdrs.v3.model.batch_pause_job_req import BatchPauseJobReq
from huaweicloudsdkdrs.v3.model.batch_query_job_req_page import BatchQueryJobReqPage
from huaweicloudsdkdrs.v3.model.batch_query_progress_req import BatchQueryProgressReq
from huaweicloudsdkdrs.v3.model.batch_restore_task_request import BatchRestoreTaskRequest
from huaweicloudsdkdrs.v3.model.batch_retry_req import BatchRetryReq
from huaweicloudsdkdrs.v3.model.batch_stop_jobs_request import BatchStopJobsRequest
from huaweicloudsdkdrs.v3.model.page_req import PageReq
from huaweicloudsdkdrs.v3.model.pause_info import PauseInfo
from huaweicloudsdkdrs.v3.model.query_jobs_req import QueryJobsReq
from huaweicloudsdkdrs.v3.model.retry_info import RetryInfo
from huaweicloudsdkdrs.v3.model.show_job_list_request import ShowJobListRequest
from huaweicloudsdkdrs.v3.region.drs_region import DrsRegion
import time
class PauseAndRetryJobDemo:
def __init__(self):
pass
@staticmethod
def main(args):
ak = os.environ["HUAWEICLOUD_SDK_AK"]
sk = os.environ["HUAWEICLOUD_SDK_SK"]
auth = BasicCredentials(
ak=ak,
sk=sk,
)
config = HttpConfig.get_default_config()
config.ignore_ssl_verification = True
config.proxy_protocol = "http"
client = DrsClient.new_builder() \
.with_credentials(credentials=auth) \
.with_http_config(config=config) \
.with_region(region=DrsRegion.CN_NORTH_4) \
.build()
job_infos = PauseAndRetryJobDemo.__show_job_list(client)
if (job_infos is None or len(job_infos) == 0):
return
query_job_resp_list = PauseAndRetryJobDemo.__batch_list_job_details(client)
if (query_job_resp_list is None or len(query_job_resp_list) == 0):
return
if (PauseAndRetryJobDemo.__pause_job_fail(client)):
return
status = PauseAndRetryJobDemo.__get_status(client)
PauseAndRetryJobDemo.__retry_job(client, "")
PauseAndRetryJobDemo.__batch_list_progresses(client)
@staticmethod
def __show_job_list(client):
"""
查询租户任务列表
@param client
@return
"""
request = ShowJobListRequest()
query_jobs_req = QueryJobsReq()
query_jobs_req.name = "<YOUR JOB NAME OR JOB id>"
query_jobs_req.engine_type = "mysql"
query_jobs_req.db_use_type = "sync"
query_jobs_req.enterprise_project_id = "<YOUR JOB ENTERPRISE PROJECT ID>"
query_jobs_req.net_type = "eip"
query_jobs_req.service_name = "<YOUR SERVICE NAME>"
query_jobs_req.status = "CONFIGURATION"
tags = {}
query_jobs_req.tags = tags
query_jobs_req.per_page = 10
query_jobs_req.cur_page = 1
request.body = query_jobs_req
request.x_language = "en-us"
show_job_list_response = client.show_job_list(request)
print(show_job_list_response.jobs)
return show_job_list_response.jobs
@staticmethod
def __batch_list_job_details(client):
"""
批量查询任务详情
@param client
@return
"""
batch_list_job_details_request = BatchListJobDetailsRequest()
batch_query_job_req_page = BatchQueryJobReqPage()
jobs = []
jobs.append("<YOUR JOB ID>")
batch_query_job_req_page.jobs = jobs
page_req = PageReq()
page_req.cur_page = 1
page_req.per_page = 5
batch_query_job_req_page.page_req = page_req
batch_list_job_details_request.body = batch_query_job_req_page
batch_list_job_details_response = client.batch_list_job_details(batch_list_job_details_request)
print(batch_list_job_details_response.results)
return batch_list_job_details_response.results
@staticmethod
def __pause_job_fail(client):
"""
暂停任务
@param client
@return
"""
batch_stop_jobs_request = BatchStopJobsRequest()
batch_pause_job_req = BatchPauseJobReq()
jobs = []
pause_info = PauseInfo()
pause_info.job_id = "<YOUR JOB ID>"
pause_info.pause_mode = "target"
jobs.append(pause_info)
batch_pause_job_req.jobs = jobs
batch_stop_jobs_request.body = batch_pause_job_req
batch_stop_jobs_response = client.batch_stop_jobs(batch_stop_jobs_request)
print(batch_stop_jobs_response)
if (batch_stop_jobs_response.http_status_code != 202):
print(batch_stop_jobs_response)
return True
return False
@staticmethod
def __retry_job(client, status):
"""
续传任务
@param client
"""
current_time = time.time()
while ("PAUSING" != status):
aaa = int(round(time.time()))
bbb = int(round(current_time))
if (int(round(time.time())) - int(round(current_time)) < 20):
continue
current_time = time.time()
status = PauseAndRetryJobDemo.__get_status(client)
batch_restore_task_request = BatchRestoreTaskRequest()
batch_retry_req = BatchRetryReq()
retry_infos = []
retry_info = RetryInfo()
retry_info.job_id = "<YOUR JOB ID>"
retry_infos.append(retry_info)
batch_retry_req.jobs = retry_infos
batch_restore_task_request.body = batch_retry_req
batch_restore_task_response = client.batch_restore_task(batch_restore_task_request)
print(batch_restore_task_response)
@staticmethod
def __get_status(client):
"""
获取任务状态
@param client
@return
"""
batch_list_progresses_request = BatchListJobStatusRequest()
batch_query_job_req_page = BatchQueryJobReqPage()
jobs = []
jobs.append("<YOUR JOB ID>")
batch_query_job_req_page.jobs = jobs
batch_list_progresses_request.body = batch_query_job_req_page
batch_list_job_status_response = client.batch_list_job_status(batch_list_progresses_request)
return batch_list_job_status_response.results[0].status
@staticmethod
def __batch_list_progresses(client):
"""
批量查询任务进度
@param client
@return
"""
batch_list_progresses_request = BatchListProgressesRequest()
batch_query_job_req_page = BatchQueryProgressReq()
job_ids = []
job_ids.append("<YOUR JOB ID>")
batch_query_job_req_page.jobs = job_ids
batch_list_progresses_request.body = batch_query_job_req_page
batch_list_progresses_response = client.batch_list_progresses(batch_list_progresses_request)
print(batch_list_progresses_response)
return batch_list_progresses_response.results
if __name__ == "__main__":
PauseAndRetryJobDemo().main(any)