export default async function initCloudrain() { let debug_button = $('.cloudbrain_debug').data('debug') let debug_again_button = $('.cloudbrain_debug').data('debug-again') let timeid = window.setInterval(loadJobStatus, 15000); let timeidShow = window.setInterval(loadShowJobStatus, 15000); $(document).ready(loadJobStatus); $(document).ready(loadShowJobStatus); function loadJobStatus() { $(".job-status").each((index, job) => { const ID = job.dataset.jobid; const repoPath = job.dataset.repopath; // const computeResource = job.dataset.resource const versionname = job.dataset.version const status_text = $(`#${ID}-text`).text() const finalState = ['STOPPED', 'CREATE_FAILED', 'UNAVAILABLE', 'DELETED', 'RESIZE_FAILED', 'SUCCEEDED', 'IMAGE_FAILED', 'SUBMIT_FAILED', 'DELETE_FAILED', 'KILLED', 'COMPLETED', 'FAILED', 'CANCELED', 'LOST', 'START_FAILED', 'SUBMIT_MODEL_FAILED', 'DEPLOY_SERVICE_FAILED', 'CHECK_FAILED'] if (finalState.includes(status_text)) { return } // const diffResource = computeResource == "NPU" ? 'modelarts/notebook' : 'cloudbrain' $.get(`/api/v1/repos/${repoPath}/${ID}?version_name=${versionname}`, (data) => { const ID = data.ID || data.JobID const status = data.JobStatus const duration = data.JobDuration $('#duration-' + ID).text(duration) if (status != status_text) { $('#' + ID + '-icon').removeClass().addClass(status) $('#' + ID + '-text').text(status) finalState.includes(status) && $('#' + ID + '-stop').removeClass('blue').addClass('disabled') } if (status === "RUNNING") { $('#ai-debug-' + ID).removeClass('disabled').addClass('blue').text(debug_button).css("margin", "0 1rem") $('#model-image-' + ID).removeClass('disabled').addClass('blue') } if (status !== "RUNNING") { // $('#model-debug-'+ID).removeClass('blue') // $('#model-debug-'+ID).addClass('disabled') $('#model-image-' + ID).removeClass('blue').addClass('disabled') } if (["CREATING", "STOPPING", "WAITING", "STARTING"].includes(status)) { $('#ai-debug-' + ID).removeClass('blue').addClass('disabled') } if (['STOPPED', 'FAILED', 'START_FAILED', 'CREATE_FAILED', 'SUCCEEDED'].includes(status)) { $('#ai-debug-' + ID).removeClass('disabled').addClass('blue').text(debug_again_button).css("margin", "0") } if (["RUNNING", "WAITING"].includes(status)) { $('#ai-stop-' + ID).removeClass('disabled').addClass('blue') } if (["CREATING", "STOPPING", "STARTING", "STOPPED", "FAILED", "START_FAILED", "SUCCEEDED", "COMPLETED", "CREATE_FAILED"].includes(status)) { $('#ai-stop-' + ID).removeClass('blue').addClass('disabled') } if (["STOPPED", "FAILED", "START_FAILED", "KILLED", "COMPLETED", "SUCCEEDED"].includes(status)) { $('#ai-delete-' + ID).removeClass('disabled').addClass('blue') } else { $('#ai-delete-' + ID).removeClass('blue').addClass('disabled') } }).fail(function (err) { console.log(err); }); }); }; function loadShowJobStatus() { $(".ui.accordion.border-according").each((index, job) => { const jobID = job.dataset.jobid; const repoPath = job.dataset.repopath; const versionname = job.dataset.version // ['IMAGE_FAILED','SUBMIT_FAILED','DELETE_FAILED','KILLED','COMPLETED','FAILED','CANCELED','LOST','START_FAILED'] // if (job.textContent.trim() == 'IMAGE_FAILED' || job.textContent.trim() == 'SUBMIT_FAILED' || job.textContent.trim() == 'DELETE_FAILED' // || job.textContent.trim() == 'KILLED' || job.textContent.trim() == 'COMPLETED' || job.textContent.trim() == 'FAILED' // || job.textContent.trim() == 'CANCELED' || job.textContent.trim() == 'LOST') { // return // } let status = $(`#${versionname}-status-span`).text() if (['IMAGE_FAILED', 'SUBMIT_FAILED', 'DELETE_FAILED', 'KILLED', 'COMPLETED', 'FAILED', 'CANCELED', 'LOST', 'START_FAILED', 'SUCCEEDED', 'STOPPED'].includes(status)) { return } let stopArray = ["KILLED", "FAILED", "START_FAILED", "KILLING", "COMPLETED", "SUCCEEDED", "STOPPED"] $.get(`/api/v1/repos/${repoPath}/${jobID}?version_name=${versionname}`, (data) => { //$(`#${versionname}-duration-span`).text(data.JobDuration) $(`#${versionname}-status-span span`).text(data.JobStatus) $(`#${versionname}-status-span i`).attr("class", data.JobStatus) // detail status and duration //$('#'+versionname+'-duration').text(data.JobDuration) $('#' + versionname + '-status').text(data.JobStatus) if (stopArray.includes(data.JobStatus)) { $('#' + versionname + '-stop').addClass('disabled') } if (data.JobStatus === "COMPLETED") { $('#' + versionname + '-create-model').removeClass('disabled').addClass('blue') } }).fail(function (err) { console.log(err); }); }); }; function assertDelete(obj, versionName, repoPath) { if (obj.style.color == "rgb(204, 204, 204)") { return } else { const delId = obj.parentNode.id let flag = 1; $('.ui.basic.modal') .modal({ onDeny: function () { flag = false }, onApprove: function () { if (!versionName) { document.getElementById(delId).submit() } else { deleteVersion(versionName, repoPath) } flag = true }, onHidden: function () { if (flag == false) { $('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut(); } } }) .modal('show') } } function deleteVersion(versionName, repoPath) { const url = `/api/v1/repos/${repoPath}` $.post(url, { version_name: versionName }, (data) => { if (data.StatusOK === 0) { location.reload() } }).fail(function (err) { console.log(err); }); } $('.ui.basic.ai_delete').click(function () { const repoPath = this.dataset.repopath const versionName = this.dataset.version if (repoPath && versionName) { assertDelete(this, versionName, repoPath) } else { assertDelete(this) } }) function stopDebug(ID, stopUrl) { $.ajax({ type: "POST", url: stopUrl, data: $('#stopForm-' + ID).serialize(), success: function (res) { if (res.result_code === "0") { $('#' + ID + '-icon').removeClass().addClass(res.status) $('#' + ID + '-text').text(res.status) if (res.status === "STOPPED") { $('#ai-debug-' + ID).removeClass('disabled').addClass('blue').text(debug_again_button).css("margin", "0") $('#ai-image-' + ID).removeClass('blue').addClass('disabled') $('#ai-model-debug-' + ID).removeClass('blue').addClass('disabled') $('#ai-delete-' + ID).removeClass('disabled').addClass('blue') $('#ai-stop-' + ID).removeClass('blue').addClass('disabled') } else { $('#ai-debug-' + ID).removeClass('blue').addClass('disabled') $('#ai-stop-' + ID).removeClass('blue').addClass('disabled') } } else { $('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); } }, error: function (res) { console.log(res) } }) } $('.ui.basic.ai_stop').click(function () { const ID = this.dataset.jobid const repoPath = this.dataset.repopath stopDebug(ID, repoPath) }) function stopVersion(version_name, ID, repoPath) { const url = `/api/v1/repos/${repoPath}/${ID}/stop_version` $.post(url, { version_name: version_name }, (data) => { if (data.StatusOK === 0) { $('#ai-stop-' + ID).removeClass('blue') $('#ai-stop-' + ID).addClass('disabled') refreshStatus(version_name, ID, repoPath) } }).fail(function (err) { console.log(err); }); } function refreshStatus(version_name, ID, repoPath) { const url = `/api/v1/repos/${repoPath}/${ID}/?version_name${version_name}` $.get(url, (data) => { $(`#${ID}-icon`).attr("class", data.JobStatus) // detail status and duration $(`#${ID}-text`).text(data.JobStatus) if (["STOPPED", "FAILED", "START_FAILED", "KILLED", "COMPLETED", "SUCCEEDED"].includes(data.JobStatus)) { $('#ai-delete-' + ID).removeClass('disabled').addClass('blue') } }).fail(function (err) { console.log(err); }); } $('.ui.basic.ai_stop_version').click(function () { const ID = this.dataset.jobid const repoPath = this.dataset.repopath const versionName = this.dataset.version stopVersion(versionName, ID, repoPath) }) function getModelInfo(repoPath, modelName, versionName, jobName) { $.get(`${repoPath}/modelmanage/show_model_info_api?name=${modelName}`, (data) => { if (data.length === 0) { $(`#${jobName}`).popup('toggle') } else { let versionData = data.filter((item) => { return item.Version === versionName }) if (versionData.length == 0) { $(`#${jobName}`).popup('toggle') } else { location.href = `${repoPath}/modelmanage/show_model_info?name=${modelName}` } } }) } $('.goto_modelmanage').click(function () { const repoPath = this.dataset.repopath const modelName = this.dataset.modelname const versionName = this.dataset.version const jobName = this.dataset.jobname getModelInfo(repoPath, modelName, versionName, jobName) }) function debugAgain(ID, debugUrl, redirect_to) { if ($('#' + ID + '-text').text() === "RUNNING") { window.open(debugUrl + 'debug') } else { $.ajax({ type: "POST", url: debugUrl + 'restart?redirect_to=' + redirect_to, data: $('#debugAgainForm-' + ID).serialize(), success: function (res) { if (res['WechatRedirectUrl']) { window.location.href = res['WechatRedirectUrl'] } else if (res.result_code === "0") { if (res.id !== ID) { location.reload() } else { $('#' + ID + '-icon').removeClass().addClass(res.status) $('#' + ID + '-text').text(res.status) $('#ai-debug-' + ID).removeClass('blue').addClass('disabled') $('#ai-delete-' + ID).removeClass('blue').addClass('disabled') $('#ai-debug-' + ID).text(debug_button).css("margin", "0 1rem") } } else { $('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); } }, error: function (res) { console.log(res) } }) } } $('.ui.basic.ai_debug').click(function () { const ID = this.dataset.jobid const repoPath = this.dataset.repopath const redirect_to = this.dataset.linkpath debugAgain(ID, repoPath, redirect_to) }) }