#4257 fix-4166

Merged
zouap merged 11 commits from fix-4166 into V20230531 11 months ago
  1. +15
    -0
      README.md
  2. +3
    -3
      routers/repo/grampus.go
  3. +41
    -0
      templates/custom/task_log.tmpl
  4. +29
    -9
      templates/repo/cloudbrain/benchmark/show.tmpl
  5. +30
    -10
      templates/repo/cloudbrain/inference/show.tmpl
  6. +20
    -44
      templates/repo/cloudbrain/trainjob/show.tmpl
  7. +36
    -44
      templates/repo/grampus/trainjob/show.tmpl
  8. +25
    -3
      templates/repo/modelarts/inferencejob/show.tmpl
  9. +30
    -6
      templates/repo/modelarts/trainjob/show.tmpl
  10. +32
    -3
      templates/repo/modelsafety/show.tmpl
  11. +347
    -524
      web_src/js/features/cloudbrainShow.js
  12. +46
    -9
      web_src/js/index.js

+ 15
- 0
README.md View File

@@ -172,6 +172,21 @@
> [attachment]
> PATH = /data/gitea/attachments
>
> ENABLED = true
> MAX_SIZE = 1048576
> ALLOWED_TYPES = */*
> MAX_FILES = 10
> STORE_TYPE = minio
> MINIO_ENDPOINT =
>
> MINIO_ACCESS_KEY_ID =
> MINIO_SECRET_ACCESS_KEY =
> MINIO_BUCKET =
> MINIO_LOCATION =
> MINIO_BASE_PATH = attachment/
> MINIO_USE_SSL = true
> MINIO_REAL_PATH =
>
> [log]
> MODE = file
> LEVEL = info


+ 3
- 3
routers/repo/grampus.go View File

@@ -1665,7 +1665,7 @@ func GrampusDownloadLog(ctx *context.Context) {
var content string
if nodeIdStr != "" {
nodeId, _ := strconv.Atoi(nodeIdStr)
if job.WorkServerNumber < 2 || nodeId > job.WorkServerNumber-1 {
if job.WorkServerNumber < 1 || nodeId > job.WorkServerNumber-1 {
ctx.NotFound("query parameter is wrong", nil)
return
}
@@ -1712,7 +1712,7 @@ func GrampusGetLog(ctx *context.Context) {
var content string
if nodeIdStr != "" {
nodeId, _ := strconv.Atoi(nodeIdStr)
if job.WorkServerNumber < 2 || nodeId > job.WorkServerNumber-1 {
if job.WorkServerNumber < 1 || nodeId > job.WorkServerNumber-1 {
ctx.NotFound("query parameter is wrong", nil)
return
}
@@ -1761,7 +1761,7 @@ func GrampusMetrics(ctx *context.Context) {
nodeIdStr := ctx.Params(":nodeId")
if nodeIdStr != "" {
nodeId, _ := strconv.Atoi(nodeIdStr)
if job.WorkServerNumber < 2 || nodeId > job.WorkServerNumber-1 {
if job.WorkServerNumber < 1 || nodeId > job.WorkServerNumber-1 {
ctx.NotFound("query parameter is wrong", nil)
return
}


+ 41
- 0
templates/custom/task_log.tmpl View File

@@ -0,0 +1,41 @@
<div class="log-header" style="display:flex;align-items:center;justify-content:space-between;">
<div>
<div class="node-select">
<select class="ui dropdown"></select>
</div>
</div>
<div style="display:flex;align-items:center;">
<a class="log-download disabled" href="javascript:;" style="display:flex;align-items:center;">
<i class="ri-download-cloud-2-line"></i>
<span style="margin-left: 0.3rem;">{{.i18n.Tr "repo.modelarts.download_log"}}</span>
</a>
{{ if .Full}}
<div class="full-log-dialog-exit" style="margin-left:1rem;color:#0366d6;cursor:pointer;display:flex;align-items:center;">
<i class="ri-fullscreen-exit-fill"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.exit_full_screen"}}</span>
</div>
{{else}}
<div class="full-log-dialog" style="margin-left:1rem;color:#0366d6;cursor:pointer;display:flex;align-items:center;">
<i class="ri-aspect-ratio-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.fullscreen_log_file"}}</span>
</div>
{{end}}
</div>
</div>
<div style="position:relative;border: 1px solid rgba(0,0,0,.2);padding-left:10px;margin-top:10px;{{ if .Full}}height:calc(100% - 118px);{{end}}">
<span>
<a title="{{$.i18n.Tr "repo.log_scroll_start"}}" style="position:absolute;right:-32px;cursor:pointer;" class="log_top"><i class="icon-to-top"></i></a>
</span>
<span>
<a title="{{$.i18n.Tr "repo.log_scroll_end"}}" style="position:absolute;bottom:-5px;right:-32px;cursor:pointer;" class="log_bottom"><i class="icon-to-bottom"></i></a>
</span>
<div class="ui message message" style="display:none;position:absolute;width:calc(100% - 20px);z-index:;margin-top:0px;">
<div class="msg"></div>
</div>
<div class="ui attached log log-scroll" {{ if .Full}} style="max-height:100%;height:100%;overflow:auto;" {{else}} style="height:300px !important;overflow:auto;"{{end}}>
<div class="ui inverted active dimmer">
<div class="ui loader"></div>
</div>
<div class="log-content"></div>
</div>
</div>

+ 29
- 9
templates/repo/cloudbrain/benchmark/show.tmpl View File

@@ -61,7 +61,7 @@
<a class="active item"
data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item log_bottom" data-tab="second{{$k}}"
<a class="item detail-log-tab" data-tab="second{{$k}}"
data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
</div>
<div class="ui tab active" data-tab="first{{$k}}">
@@ -339,6 +339,7 @@
</div>
</div>
<div class="ui tab" data-tab="second{{$k}}">
<!--
<div class="file-info">
<a id="{{.VersionName}}-log-down"
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info'
@@ -353,8 +354,8 @@
<i class="ri-aspect-ratio-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.fullscreen_log_file"}}</span>
</div>
</div>
<div
</div>
<div
style="position: relative;border: 1px solid rgba(0,0,0,.2);padding: 0 10px;margin-top: 10px;">
<span>
<a title="{{$.i18n.Tr "repo.log_scroll_start"}}" style="position: absolute; right: -32px;cursor: pointer;"
@@ -380,17 +381,36 @@
<input type="hidden" name="start_line" value>
<input type="hidden" name="init_log" value>
<pre id="log_file{{.VersionName}}"></pre>
</div>
</div>
</div>
</div>
-->
<div class="detail-log-content detail-log-content-{{.VersionName}}"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/cloudbrain/{{.ID}}/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/cloudbrain/{{.ID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n }}
</div>
<div class="ui modal full-log-dlg-{{.VersionName}} container" style="height:90%;margin:3rem auto;">
<div id="log-file-title" style="font-size: 16px;font-weight:600;padding:20px 30px 16px;">{{$.i18n.Tr "repo.modelarts.log_file"}}</div>
<div style="padding:0 50px 10px 30px;height:100%">
<div class="detail-log-fullscreen-content detail-log-fullscreen-content-{{.VersionName}}" style="height:100%;"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/cloudbrain/{{.ID}}/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/cloudbrain/{{.ID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n "Full" true }}
</div>
</div>
</div>
</div>

</div>
</div>
</div>
{{template "custom/max_log" .}}
<!-- {{template "custom/max_log" .}} -->
{{end}} {{template "base/paginate" .}}
</div>
<!-- 确认模态框 -->


+ 30
- 10
templates/repo/cloudbrain/inference/show.tmpl View File

@@ -67,7 +67,7 @@
<div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);">
<a class="active item"
data-tab="first">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item log_bottom" data-tab="third"
<a class="item detail-log-tab" data-tab="third"
data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item load-model-file" data-tab="four"
data-gpu-flag="true" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/cloudbrain/inference-job/{{.JobID}}/result_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
@@ -320,6 +320,7 @@
</div>
</div>
<div class="ui tab" data-tab="third">
<!--
<div class="file-info">
<a id="{{.VersionName}}-log-down"
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info'
@@ -334,8 +335,8 @@
<i class="ri-aspect-ratio-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.fullscreen_log_file"}}</span>
</div>
</div>
<div
</div>
<div
style="position: relative;border: 1px solid rgba(0,0,0,.2);padding: 0 10px;margin-top: 10px;">
<span>
<a title="{{$.i18n.Tr "repo.log_scroll_start"}}" style="position: absolute; right: -32px;cursor: pointer;"
@@ -361,12 +362,31 @@
<input type="hidden" name="start_line" value>
<input type="hidden" name="init_log" value>
<pre id="log_file{{.VersionName}}"></pre>
</div>
</div>
</div>
</div>
</div>
-->
<div class="detail-log-content detail-log-content-{{.VersionName}}"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/cloudbrain/{{.ID}}/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/cloudbrain/{{.ID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n }}
</div>
<div class="ui modal full-log-dlg-{{.VersionName}} container" style="height:90%;margin:3rem auto;">
<div id="log-file-title" style="font-size: 16px;font-weight:600;padding:20px 30px 16px;">{{$.i18n.Tr "repo.modelarts.log_file"}}</div>
<div style="padding:0 50px 10px 30px;height:100%">
<div class="detail-log-fullscreen-content detail-log-fullscreen-content-{{.VersionName}}" style="height:100%;"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/cloudbrain/{{.ID}}/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/cloudbrain/{{.ID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n "Full" true }}
</div>
</div>
</div>
</div>

<div class="ui tab" data-tab="four">
<input type="hidden" name="model{{.VersionName}}" value="-1">
@@ -392,7 +412,7 @@
</div>
</div>
</div>
{{template "custom/max_log" .}}
<!-- {{template "custom/max_log" .}} -->
{{end}}
</div>



+ 20
- 44
templates/repo/cloudbrain/trainjob/show.tmpl View File

@@ -97,11 +97,8 @@
<div class="{{if eq $k 0}}active{{end}} content">
<div class="content-pad">
<div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);">
<a class="active item"
data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>

<a class="item log_bottom" data-tab="third{{$k}}"
data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="active item" data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item detail-log-tab" data-tab="third{{$k}}" data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item load-model-file" data-tab="four{{$k}}" data-gpu-flag="true" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/cloudbrain/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
</div>
<div class="ui tab active" data-tab="first{{$k}}">
@@ -324,46 +321,25 @@
</div>
</div>
<div class="ui tab" data-tab="third{{$k}}">
<div class="file-info">
<a id="{{.VersionName}}-log-down"
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info'
href="/api/v1/repos/{{$.RepoRelPath}}/cloudbrain/{{.ID}}/download_log_file">
<i class="ri-download-cloud-2-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span>
</a>
<div class="file-info full-log-dialog" data-version="{{.VersionName}}" data-log="{{$.i18n.Tr "repo.modelarts.log_file"}}"
data-exit="{{$.i18n.Tr "repo.modelarts.exit_full_screen"}}" style="margin-left: 1rem;color:#0366d6;cursor: pointer;"
data-log-down="{{$.i18n.Tr "repo.modelarts.download_log"}}" data-href="/api/v1/repos/{{$.RepoRelPath}}/cloudbrain/{{.ID}}/download_log_file"
data-scroll-top="{{$.i18n.Tr "repo.log_scroll_start"}}" data-scroll-bottom="{{$.i18n.Tr "repo.log_scroll_end"}}">
<i class="ri-aspect-ratio-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.fullscreen_log_file"}}</span>
</div>
<div class="detail-log-content detail-log-content-{{.VersionName}}"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/cloudbrain/{{.ID}}/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/cloudbrain/{{.ID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n }}
</div>
<div style="position: relative;border: 1px solid rgba(0,0,0,.2);padding: 0 10px;margin-top: 10px;">
<span>
<a title="{{$.i18n.Tr "repo.log_scroll_start"}}" style="position: absolute; right: -32px;cursor: pointer;"
class="log_top" data-version="{{.VersionName}}"><i class="icon-to-top"></i></a>
</span>
<span class="log-info-{{.VersionName}}">
<a title="{{$.i18n.Tr "repo.log_scroll_end"}}" style="position: absolute; bottom: 10px;right: -32px;cursor: pointer;"
class="log_bottom" data-version="{{.VersionName}}"><i
class="icon-to-bottom"></i></a>
</span>
<div class="ui message message{{.VersionName}}" style="display: none;">
<div id="header"></div>
</div>
<div class="ui attached log log-scroll" id="log{{.VersionName}}" data-version="{{.VersionName}}"
style="height: 300px !important; overflow: auto;">
<div class="ui inverted active dimmer">
<div class="ui loader"></div>
<div class="ui modal full-log-dlg-{{.VersionName}} container" style="height:90%;margin:3rem auto;">
<div id="log-file-title" style="font-size: 16px;font-weight:600;padding:20px 30px 16px;">{{$.i18n.Tr "repo.modelarts.log_file"}}</div>
<div style="padding:0 50px 10px 30px;height:100%">
<div class="detail-log-fullscreen-content detail-log-fullscreen-content-{{.VersionName}}" style="height:100%;"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/cloudbrain/{{.ID}}/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/cloudbrain/{{.ID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n "Full" true }}
</div>
<input type="hidden" name="end_line" value>
<input type="hidden" name="end_line-max" value>
<input type="hidden" name="start_line-max" value>
<input type="hidden" name="start_line-max-copy" value>
<input type="hidden" name="start_line" value>
<input type="hidden" name="init_log" value>
<pre id="log_file{{.VersionName}}"></pre>
</div>
</div>
</div>
@@ -393,7 +369,7 @@
</div>
</div>
</div>
{{template "custom/max_log" .}}
<!-- {{template "custom/max_log" .}} -->
{{end}} {{template "base/paginate" .}}
</div>
<!-- 确认模态框 -->


+ 36
- 44
templates/repo/grampus/trainjob/show.tmpl View File

@@ -97,7 +97,7 @@
<div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);">

<a class="active item" data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item log_bottom" data-tab="second{{$k}}" data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item detail-log-tab" data-tab="second{{$k}}" data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
{{if ne .ComputeResource "GCU"}}
<a class="item metric_chart" data-tab="four{{$k}}" data-version="{{.VersionName}}" data-path="{{$.RepoRelPath}}/grampus/train-job/{{.JobID}}/metrics">{{$.i18n.Tr "cloudbrain.resource_use"}}</a>
{{end}}
@@ -354,50 +354,33 @@
</div>
</div>
<div class="ui tab" data-tab="second{{$k}}">
<div class="file-info">
<a id="{{.VersionName}}-log-down"
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info'
href="/api/v1/repos/{{$.RepoRelPath}}/grampus/train-job/{{.JobID}}/download_log">
<i class="ri-download-cloud-2-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span>
</a>
<div class="file-info full-log-dialog" data-version="{{.VersionName}}" data-log="{{$.i18n.Tr "repo.modelarts.log_file"}}" data-log-type="c2Net"
data-exit="{{$.i18n.Tr "repo.modelarts.exit_full_screen"}}" style="margin-left: 1rem;color:#0366d6;cursor: pointer;"
data-log-down="{{$.i18n.Tr "repo.modelarts.download_log"}}" data-href="/api/v1/repos/{{$.RepoRelPath}}/grampus/train-job/{{.JobID}}/download_log"
data-scroll-top="{{$.i18n.Tr "repo.log_scroll_start"}}" data-scroll-bottom="{{$.i18n.Tr "repo.log_scroll_end"}}">
<i class="ri-aspect-ratio-line"></i>
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.fullscreen_log_file"}}</span>
</div>
<div class="detail-log-content detail-log-content-{{.VersionName}}"
{{if eq .ComputeResource "NPU"}}
data-multiplenode="true"
{{end}}
data-noscroll="true"
data-logapiurl="{{$.RepoLink}}/grampus/train-job/{{.JobID}}/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/grampus/train-job/{{.JobID}}/download_log"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n }}
</div>
<div style="position: relative;border: 1px solid rgba(0,0,0,.2);padding: 0 10px;margin-top: 10px;">
<span>
<a title="{{$.i18n.Tr "repo.log_scroll_start"}}" style="position: absolute; right: -32px;cursor: pointer;"
class="log_top" data-version="{{.VersionName}}"><i class="icon-to-top"></i></a>
</span>
<span class="log-info-{{.VersionName}}">
<a title="{{$.i18n.Tr "repo.log_scroll_end"}}" style="position: absolute; bottom: 10px;right: -32px;cursor: pointer;"
class="log_bottom" data-version="{{.VersionName}}"><i
class="icon-to-bottom"></i></a>
</span>
<div class="ui message message{{.VersionName}}" style="display: none;">
<div id="header"></div>
</div>
<div class="ui attached log" id="log{{.VersionName}}"
style="height: 300px !important; overflow: auto;">
<div class="ui inverted active dimmer">
<div class="ui loader"></div>
<div class="ui modal full-log-dlg-{{.VersionName}} container" style="height:90%;margin:3rem auto;">
<div id="log-file-title" style="font-size: 16px;font-weight:600;padding:20px 30px 16px;">{{$.i18n.Tr "repo.modelarts.log_file"}}</div>
<div style="padding:0 50px 10px 30px;height:100%">
<div class="detail-log-fullscreen-content detail-log-fullscreen-content-{{.VersionName}}" style="height:100%;"
{{if eq .ComputeResource "NPU"}}
data-multiplenode="true"
{{end}}
data-noscroll="true"
data-logapiurl="{{$.RepoLink}}/grampus/train-job/{{.JobID}}/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/grampus/train-job/{{.JobID}}/download_log"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n "Full" true }}
</div>
<input type="hidden" name="end_line" value>
<input type="hidden" name="end_line-max" value>
<input type="hidden" name="start_line-max" value>
<input type="hidden" name="start_line-max-copy" value>
<input type="hidden" name="start_line" value>
<input type="hidden" name="init_log" value>
<pre id="log_file{{.VersionName}}"></pre>
</div>

</div>

</div>
<div class="ui tab" data-tab="five{{$k}}">
<div style="position: relative;border: 1px solid rgba(0,0,0,.2);padding: 0 10px;margin-top: 10px;">
@@ -418,9 +401,18 @@
<i class="ri-refresh-line metric_chart"
style="position: absolute;right: 25%;color:#3291f8;z-index:99;cursor: pointer;"
data-version="{{.VersionName}}"></i>
<div id="metric-{{.VersionName}}" style="height: 260px;width: 870px;">
<div class="node-select" style="display:none;">
<select class="ui dropdown"></select>
</div>
<div class="ui inverted active dimmer" style="display: none;">
<div class="ui loader"></div>
</div>
<div id="metric-{{.VersionName}}" style="height: 260px;width: 870px;"
{{if eq .ComputeResource "NPU"}}
data-multiplenode="true"
{{end}}
data-workservernumber="{{.WorkServerNumber}}"
></div>
</div>
<div class="ui tab" data-tab="third{{$k}}">
<input type="hidden" name="model{{.VersionName}}" value="-1">
@@ -451,7 +443,7 @@
</div>
</div>
</div>
{{template "custom/max_log" .}}
<!-- {{template "custom/max_log" .}} -->
{{end}} {{template "base/paginate" .}}
</div>
<!-- 确认模态框 -->


+ 25
- 3
templates/repo/modelarts/inferencejob/show.tmpl View File

@@ -58,7 +58,7 @@
<div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);">

<a class="active item" data-tab="first">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item log_bottom" data-tab="second" data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item detail-log-tab" data-tab="second" data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item load-model-file" data-tab="third" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/modelarts/inference-job/{{.JobID}}/result_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
</div>

@@ -306,6 +306,7 @@
</div>

<div class="ui tab" data-tab="second">
<!--
<div class="file-info">
<a id="{{.VersionName}}-log-down"
class='{{if and ($.canDownload) (eq .Status "KILLED" "FAILED" "START_FAILED" "STOPPED" "COMPLETED") }}ti-download-file{{else}}disabled{{end}} file-info'
@@ -348,7 +349,28 @@
</div>

</div>

-->
<div class="detail-log-content detail-log-content-{{.VersionName}}"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/modelarts/inference-job/{{.JobID}}/log"
data-logdownloadurl="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n }}
</div>
<div class="ui modal full-log-dlg-{{.VersionName}} container" style="height:90%;margin:3rem auto;">
<div id="log-file-title" style="font-size: 16px;font-weight:600;padding:20px 30px 16px;">{{$.i18n.Tr "repo.modelarts.log_file"}}</div>
<div style="padding:0 50px 10px 30px;height:100%">
<div class="detail-log-fullscreen-content detail-log-fullscreen-content-{{.VersionName}}" style="height:100%;"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/modelarts/inference-job/{{.JobID}}/log"
data-logdownloadurl="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n "Full" true }}
</div>
</div>
</div>
</div>
<div class="ui tab" data-tab="third">
<input type="hidden" name="model{{.VersionName}}" value="-1">
@@ -374,7 +396,7 @@
</div>
</div>
</div>
{{template "custom/max_log" .}}
<!-- {{template "custom/max_log" .}} -->
{{end}}
</div>
<!-- 确认模态框 -->


+ 30
- 6
templates/repo/modelarts/trainjob/show.tmpl View File

@@ -133,7 +133,7 @@

<a class="active item"
data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item log_bottom" data-tab="second{{$k}}"
<a class="item detail-log-tab" data-tab="second{{$k}}"
data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item metric_chart" data-tab="four{{$k}}" data-version="{{.VersionName}}" data-path="{{$.RepoRelPath}}/modelarts/train-job/{{.JobID}}/metric_statistics?version_name={{.VersionName}}&statistic_type=each&metrics=">{{$.i18n.Tr "cloudbrain.resource_use"}}</a>
<a class="item load-model-file" data-tab="third{{$k}}" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a>
@@ -374,6 +374,7 @@
</div>
</div>
<div class="ui tab" data-tab="second{{$k}}">
<!--
<div class="file-info">
<a id="{{.VersionName}}-log-down"
class='{{if and (.CanModify) (eq .Status "KILLED" "FAILED" "START_FAILED" "STOPPED" "COMPLETED") }}ti-download-file{{else}}disabled{{end}} file-info'
@@ -418,15 +419,38 @@
</div>

</div>

-->
<div class="detail-log-content detail-log-content-{{.VersionName}}"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/log"
data-logdownloadurl="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n }}
</div>
<div class="ui modal full-log-dlg-{{.VersionName}} container" style="height:90%;margin:3rem auto;">
<div id="log-file-title" style="font-size: 16px;font-weight:600;padding:20px 30px 16px;">{{$.i18n.Tr "repo.modelarts.log_file"}}</div>
<div style="padding:0 50px 10px 30px;height:100%">
<div class="detail-log-fullscreen-content detail-log-fullscreen-content-{{.VersionName}}" style="height:100%;"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/log"
data-logdownloadurl="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n "Full" true }}
</div>
</div>
</div>
</div>
<div class="ui tab" data-tab="four{{$k}}" style="position: relative;">
<i class="ri-refresh-line metric_chart"
style="position: absolute;right: 25%;color:#3291f8;z-index:99;cursor: pointer;"
data-version="{{.VersionName}}"></i>
<div id="metric-{{.VersionName}}" style="height: 260px;width: 870px;">
data-version="{{.VersionName}}"></i>
<div class="ui inverted active dimmer" style="display: none;">
<div class="ui loader"></div>
</div>
<div id="metric-{{.VersionName}}" style="height: 260px;width: 870px;">
</div>
</div>
<div class="ui tab" data-tab="third{{$k}}">
<input type="hidden" name="model{{.VersionName}}" value="-1">
@@ -454,7 +478,7 @@
</div>
</div>
</div>
{{template "custom/max_log" .}}
<!-- {{template "custom/max_log" .}} -->
{{end}} {{template "base/paginate" .}}
</div>
<!-- 确认模态框 -->


+ 32
- 3
templates/repo/modelsafety/show.tmpl View File

@@ -54,7 +54,7 @@
<div class="content-pad">
<div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);">
<a class="active item" data-tab="first0">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
<a class="item log_bottom" data-tab="second0" data-version="">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item detail-log-tab" data-tab="second0" data-version="">{{$.i18n.Tr "repo.modelarts.log"}}</a>
<a class="item" data-tab="third0" data-version="">{{.i18n.Tr "modelsafety.evaluation_result"}}</a>
</div>
<div class="ui tab active" data-tab="first0">
@@ -271,6 +271,7 @@
</div>
</div>
<div class="ui tab" data-tab="second0">
<!--
<div class="file-info">
<a id="-log-down"
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}} file-info'
@@ -313,7 +314,29 @@
<input type="hidden" name="init_log" value>
<pre id="log_file"></pre>
</div>
</div>
</div>
-->
<div class="detail-log-content detail-log-content-{{.VersionName}}"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/cloudbrain/ID/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/cloudbrain/ID/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n }}
</div>
<div class="ui modal full-log-dlg-{{.VersionName}} container" style="height:90%;margin:3rem auto;">
<div id="log-file-title" style="font-size: 16px;font-weight:600;padding:20px 30px 16px;">{{$.i18n.Tr "repo.modelarts.log_file"}}</div>
<div style="padding:0 50px 10px 30px;height:100%">
<div class="detail-log-fullscreen-content detail-log-fullscreen-content-{{.VersionName}}" style="height:100%;"
data-multiplenode=""
data-logapiurl="{{$.RepoLink}}/cloudbrain/ID/log"
data-logdownloadurl="/api/v1/repos{{$.RepoLink}}/cloudbrain/ID/download_log_file"
data-workservernumber="{{.WorkServerNumber}}"
data-version="{{.VersionName}}">
{{template "custom/task_log" Dict "$" $ "i18n" $.i18n "Full" true }}
</div>
</div>
</div>
</div>
<div class="ui tab" data-tab="third0">
<style>
@@ -386,7 +409,7 @@
</div>
</div>
</div>
{{template "custom/max_log" .}}
<!-- {{template "custom/max_log" .}} -->
{{template "base/paginate" .}}
</div>
<!-- 确认模态框 -->
@@ -656,6 +679,12 @@
$(`[vtitle="Image"]`).attr('title', imageName);
$(`[vuser="User.Name"]`).text(res['User'] && res['User']['Name']);

// 日志
let logapiurl = $('[data-logapiurl]').attr('data-logapiurl');
$('[data-logapiurl]').attr('data-logapiurl', logapiurl.replace('ID', res.ID))
let logdownloadurl = $('[data-logdownloadurl]').attr('data-logdownloadurl');
$('[data-logdownloadurl]').attr('data-logdownloadurl', logdownloadurl.replace('ID', res.ID))

if (res.Spec) {
var SPEC = res.Spec;
var showPoint = false;


+ 347
- 524
web_src/js/features/cloudbrainShow.js View File

@@ -1,18 +1,4 @@
export default async function initCloudrainSow() {
function debounce(fn, delay) {
let timer;
return (...args) => {
// 判断定时器是否存在,清除定时器
if (timer) {
clearTimeout(timer);
}

// 重新调用setTimeout
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
}

function paddingZeros(str, len) {
str = str.toString();
@@ -21,467 +7,304 @@ export default async function initCloudrainSow() {
}
return str;
}
function escapeHTML(a){
a = "" + a;
return a.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");;
}

function timeFormat(date) {
return `${date.getFullYear()}-${paddingZeros(date.getMonth() + 1, 2)}-${paddingZeros(date.getDate(), 2)} ${paddingZeros(date.getHours(), 2)}:${paddingZeros(date.getMinutes(), 2)}:${paddingZeros(date.getSeconds(), 2)}`;
}
function logScroll(version_name, repoPath, ID, max = "", lines = 60) {
let container = document.querySelector(`#log${max}${version_name}`);
let scrollTop = container.scrollTop;
let scrollHeight = container.scrollHeight;
let clientHeight = container.clientHeight;
let scrollLeft = container.scrollLeft;
if (
(parseInt(scrollTop) + clientHeight == scrollHeight ||
parseInt(scrollTop) + clientHeight + 1 == scrollHeight ||
parseInt(scrollTop) + clientHeight - 1 == scrollHeight) &&
scrollLeft === 0
) {
let end_line = $(`#log${version_name} input[name=end_line${max}]`).val();
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({
"background-color": "#fff",
display: "block",
});
$.get(
`/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${end_line}&lines=${lines}&order=desc`,
(data) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: i18n.scrolled_logs_bottom_pls_retry,
});
} else {
$(`.message${version_name} #header`).text(i18n.scrolled_logs_bottom);
$(`.message${version_name}`).css("display", "block");
setTimeout(function () {
$(`.message${version_name}`).css("display", "none");
}, 1000);
}
} else {
if (end_line === data.EndLine) {
return;
} else {
$(`#log${version_name} input[name=end_line${max}]`).val(
data.EndLine
);
$(`#log${max}${version_name}`).append("<pre>" + escapeHTML(data.Content));
}
}
}
).fail(function (err) {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
console.log(err);
});
}
if (scrollTop == 0 && scrollLeft == 0) {
let start_line = $(
`#log${version_name} input[name=start_line${max}]`
).val();
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({
"background-color": "#fff",
display: "block",
});
$.get(
`/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${start_line}&lines=${lines}&order=asc`,
(data) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: i18n.scrolled_logs_top_pls_retry,
});
} else {
$(`.message${version_name} #header`).text(i18n.scrolled_logs_top);
$(`.message${version_name}`).css("display", "block");
setTimeout(function () {
$(`.message${version_name}`).css("display", "none");
}, 1000);
}
} else {
$(`#log${version_name} input[name=start_line${max}]`).val(
data.StartLine
); //如果变动就改变所对应的值
$(`#log${max}${version_name}`).prepend("<pre>" + escapeHTML(data.Content));
}
}
).fail(function (err) {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
console.log(err);
});
}
}
const fn = debounce(logScroll, 500);
$(".log-scroll").scroll(function () {
let version_name = $(this).data("version");
let ID = $(`#accordion${version_name}`).data("jobid");
let repoPath = $(`#accordion${version_name}`).data("repopath");
fn(version_name, repoPath, ID);
});
function scrollAnimation(dom, currentY, targetY, currentX) {
let needScrollTop = targetY - currentY;
let _currentY = currentY;
setTimeout(() => {
// 一次调用滑动帧数,每次调用会不一样
//取总距离的十分之一
const dist = Math.ceil(needScrollTop / 10);
_currentY += dist;
//移动一个十分之一
dom.scrollTo(currentX || 0, _currentY, "smooth");
// 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
if (needScrollTop > 10 || needScrollTop < -10) {
scrollAnimation(dom, _currentY, targetY);
} else {
dom.scrollTo(0, targetY, "smooth");
}
}, 1);
}

function logTop(e) {
let max = e.currentTarget.getAttribute("data-max") || "";
let lines = !!max ? 100 : 60;
$(".run_info").on('click', function () {
let version_name = $(this).data("version");
let logContentDom = document.querySelector(`#log${max}${version_name}`);
let ID = $(`#accordion${version_name}`).data("jobid");
let repoPath = $(`#accordion${version_name}`).data("repopath");
let start_line = $(`#log${version_name} input[name=end_line${max}]`).val();
$(`#log_file${max}${version_name}`).siblings("pre").remove();
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({
$(`#info${version_name} .ui.inverted.active.dimmer`).css({
"background-color": "#fff",
display: "block",
});
$.get(
`/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=&lines=${lines}&order=asc`,
`/api/v1/repos/${repoPath}/${ID}/job_event`,
(data) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
$(`#log${version_name} input[name=end_line${max}]`).val(data.EndLine); //如果变动就改变所对应的值
$(`#log${version_name} input[name=start_line${max}]`).val(
data.StartLine
$(`#info${version_name} .ui.inverted.active.dimmer`).css(
"display", "none",
);
$(`#log${max}${version_name}`).prepend("<pre>" + escapeHTML(data.Content));
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: i18n.scrolled_logs_top_pls_retry,
});
} else {
$(`.message${version_name} #header`).text(i18n.scrolled_logs_top);
$(`.message${version_name}`).css("display", "block");
setTimeout(function () {
$(`.message${version_name}`).css("display", "none");
}, 1000);
parseInfo(data, version_name)
})
});

function parseInfo(jsonObj, version_name) {
let html = "";
if (jsonObj != null) {
let podEventArray = jsonObj['JobEvents'];
if (podEventArray != null) {
for (let i = 0; i < podEventArray.length; i++) {
if (podEventArray[i]["reason"] != "") {
let time = podEventArray[i]["timestamp"] && new Date(podEventArray[i]["timestamp"])
html += `<p><b>[${podEventArray[i]["reason"]}]</b> <span>${time.toLocaleString()}</span></p>`
html += `<p>${podEventArray[i]["message"]}</p>`;
}
}
$.get(
`/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${data.StartLine}&lines=${lines}&order=asc`,
(data) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: i18n.scrolled_logs_top_pls_retry,
});
} else {
$(`.message${version_name} #header`).text(i18n.scrolled_logs_top);
$(`.message${version_name}`).css("display", "block");
setTimeout(function () {
$(`.message${version_name}`).css("display", "none");
}, 1000);
}
} else {
if (start_line === data.StartLine || start_line === "") {
return;
} else {
$(`#log${version_name} input[name=start_line${max}]`).val(
data.StartLine
);
$(`#log${max}${version_name}`).prepend("<pre>" + escapeHTML(data.Content));
}
}
}
).fail(function (err) {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
console.log(err);
});
scrollAnimation(logContentDom, logContentDom.scrollTop, 10);
}
).fail((err) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
throw err;
});
}
$(`#info${version_name} .info_text`)[0].innerHTML = html
}
function logBottom(e) {
let max = e.currentTarget.getAttribute("data-max") || "";
let lines = !!max ? 100 : 60;
let version_name = $(this).data("version");
let logContentDom = document.querySelector(`#log${max}${version_name}`);
let ID = $(`#accordion${version_name}`).data("jobid");
let repoPath = $(`#accordion${version_name}`).data("repopath");
$(`#log_file${max}${version_name}`).siblings("pre").remove();
let end_line = $(`#log${version_name} input[name=end_line${max}]`).val();
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({
"background-color": "#fff",
display: "block",
});
$.get(
`/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=&lines=${lines}&order=desc`,
(data) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
if (!data.CanLogDownload) {
$(`#${version_name}-log-down`)
.removeClass("ti-download-file")
.addClass("disabled");
$(`.max-full-log${version_name} #${version_name}-log-down`)
.removeClass("ti-download-file")
.addClass("disabled");
} else {
$(`#${version_name}-log-down`)
.addClass("ti-download-file")
.removeClass("disabled");
$(`.max-full-log${version_name} #${version_name}-log-down`)
.addClass("ti-download-file")
.removeClass("disabled");
}
$(`#log${version_name} input[name=end_line${max}]`).val(data.EndLine); //如果变动就改变所对应的值
if ($(this)[0].hasAttribute("data-tab")) {
$(`#log${version_name} input[name=end_line-max]`).val(data.EndLine);
$(`#log${version_name} input[name=start_line-max]`).val(
data.StartLine
);
$(`#log${version_name} input[name=start_line-max-copy]`).val(
data.StartLine
);

/* New Log Start */
function LogTool() {
this.$container = null;
this.version = '';
this.logApiUrlUrl = '';
this.logDownloadUrl = '';
this.workservernumber = 0;
this.nodeIndex = '0';
this.multipleNode = false;
this.noScroll = false;

this.content = '';
this.lines = 60;
this.order = 'desc';
this.startLine = '';
this.endLine = '';
this.scrollTop = 0;
this.loading = false;
}

LogTool.prototype.init = function (container, options) {
if (!container) return;
this.$container = container;
const data = container.data();
this.version = data.version;
this.logApiUrl = data.logapiurl;
this.logDownloadUrl = data.logdownloadurl;
this.multipleNode = data.multiplenode;
this.noScroll = data.noscroll;
this.workservernumber = data.workservernumber;

if (options) {
if (options.lines) this.lines = options.lines;
}
this.eventInit();
this.refresh();
};

LogTool.prototype.escapeHTML = function (str) {
return str.toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
};

LogTool.prototype.getLogs = function (callback) {
const _this = this;
_this.loading = true;
_this.$container.find('.log-scroll .dimmer').show();
let node_id = '';
if (this.multipleNode) {
node_id = this.nodeIndex;
}
$.ajax({
url: `/api/v1/repos${_this.logApiUrl}${node_id ? `/${node_id}` : ''}`,
type: 'get',
data: {
version_name: this.version,
base_line: this.order == 'desc' ? this.endLine : this.startLine,
lines: this.lines,
order: this.order,
},
dataType: 'json',
success: function (res) {
_this.loading = false;
_this.$container.find('.log-scroll .dimmer').hide();
if (res && res.CanLogDownload) {
_this.$container.find('.log-download').removeClass('disabled');
}
$(`#log${version_name} input[name=start_line${max}]`).val(
data.StartLine
);
$(`#log${max}${version_name}`).append("<pre>" + (escapeHTML(data.Content)||''));
$.get(
`/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=${lines}&order=desc`,
(data) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
if (data.Lines == 0) {
if (max) {
$("body").toast({
class: "black",
message: i18n.scrolled_logs_bottom_pls_retry,
});
} else {
$(`.message${version_name} #header`).text(i18n.scrolled_logs_bottom);
$(`.message${version_name}`).css("display", "block");
setTimeout(function () {
$(`.message${version_name}`).css("display", "none");
}, 1000);
}
} else {
if (end_line === data.EndLine || end_line === "") {
return;
} else {
$(`#log${version_name} input[name=end_line${max}]`).val(
data.EndLine
);
if ($(this)[0].hasAttribute("data-tab")) {
$(`#log${version_name} input[name=end_line-max]`).val(
data.EndLine
);
}
$(`#log${max}${version_name}`).append("<pre>" + escapeHTML(data.Content));
}
if (res.Lines > 0) {
if (_this.order == 'desc') {
_this.content += `${_this.escapeHTML(res.Content)}`;
_this.$container.find('.log-content').html(`<pre>${_this.content}</pre>`);
_this.endLine = res.EndLine;
if (_this.startLine === '') {
_this.startLine = res.StartLine;
}
} else if (_this.order == 'asc') {
const logEle = _this.$container.find('.log-scroll')[0];
const scrollHeight = logEle.scrollHeight;
const scrollTop = logEle.scrollTop;
_this.content = `${_this.escapeHTML(res.Content)}` + _this.content;
_this.$container.find('.log-content').html(`<pre>${_this.content}</pre>`);
_this.startLine = res.StartLine;
if (_this.endLine === '') {
_this.endLine = res.EndLine;
}
_this.stayScrollPos(scrollHeight, scrollTop);
}
).fail(function (err) {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
console.log(err);
});
} else {
if (_this.noScroll) {
_this.content = `${_this.escapeHTML(res.Content)}`;
_this.$container.find('.log-content').html(`<pre>${_this.content}</pre>`);
} else {
_this.showMessage(_this.order == 'desc' ? i18n['scrolled_logs_bottom'] : i18n['scrolled_logs_top']);
}
}
callback && callback();
},
error: function (err) {
console.log(err);
_this.loading = false;
_this.$container.find('.log-scroll .dimmer').hide();
_this.showMessage('请求错误');
}
})
};

let test = $(`#log_file${version_name}`).nextAll();
test.length !== 0 &&
$(`#log${version_name} input[name=init_log]`).val(test[0].innerHTML);
LogTool.prototype.scrollHandler = function (evt) {
if (this.loading) return;
const logEle = this.$container.find('.log-scroll')[0];
if (logEle) {
const scrollHeight = logEle.scrollHeight;
const clientHeight = logEle.clientHeight;
const scrollTop = logEle.scrollTop;
if (scrollTop != this.scrollTop) {
if (scrollTop == 0) {
this.order = 'asc';
this.getLogs();
} else if (scrollTop + clientHeight >= scrollHeight - 1) {
this.order = 'desc';
this.getLogs();
}
}
this.scrollTop = scrollTop;
}
};
LogTool.prototype.stayScrollPos = function (scrollHeight, scrollTop) {
const logEle = this.$container.find('.log-scroll')[0];
if (logEle) {
const scrollHeightNew = logEle.scrollHeight;
logEle.scrollTo({
top: scrollTop + (scrollHeightNew - scrollHeight),
behavior: 'instant',
});
}
};

scrollAnimation(
logContentDom,
logContentDom.scrollTop + 1,
logContentDom.scrollHeight - logContentDom.clientHeight - 10
);
LogTool.prototype.goBottom = function () {
this.refresh();
};

LogTool.prototype.goTop = function () {
this.content = '';
this.startLine = '';
this.endLine = '';
this.order = 'asc';
this.getLogs(() => {
const logEle = this.$container.find('.log-scroll')[0];
if (logEle) {
logEle.scrollTo({
top: 0,
behavior: 'smooth',
});
}
).fail((err) => {
$(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
"display",
"none"
);
throw err;
});
}
$(".log_top").click(logTop);
$(".log_bottom").click(logBottom);
$(".run_info").on('click', function () {
let version_name = $(this).data("version");
let ID = $(`#accordion${version_name}`).data("jobid");
let repoPath = $(`#accordion${version_name}`).data("repopath");
$(`#info${version_name} .ui.inverted.active.dimmer`).css({
"background-color": "#fff",
display: "block",
};

LogTool.prototype.refresh = function () {
this.content = '';
this.$container.find('.log-content').empty();
this.startLine = '';
this.endLine = '';
this.order = 'desc';
this.getLogs(() => {
this.scrollBottomAnimation();
});
$.get(
`/api/v1/repos/${repoPath}/${ID}/job_event`,
(data) => {
$(`#info${version_name} .ui.inverted.active.dimmer`).css(
"display", "none",
);
parseInfo(data,version_name)
})
});
};

function parseInfo(jsonObj,version_name){
let html = "";
if (jsonObj != null){
let podEventArray = jsonObj['JobEvents'];
if(podEventArray != null){
for(let i=0; i < podEventArray.length;i++){
if (podEventArray[i]["reason"] != "") {
let time = podEventArray[i]["timestamp"]&&new Date(podEventArray[i]["timestamp"])
html += `<p><b>[${podEventArray[i]["reason"]}]</b> <span>${time.toLocaleString()}</span></p>`
html += `<p>${podEventArray[i]["message"]}</p>`;
}
}
}
}
$(`#info${version_name} .info_text`)[0].innerHTML = html
}
// $(".log-scroll-max").scroll();
LogTool.prototype.scrollBottomAnimation = function () {
const logEle = this.$container.find('.log-scroll')[0];
if (logEle) {
const scrollHeight = logEle.scrollHeight;
const clientHeight = logEle.clientHeight;
logEle.scrollTo({
top: scrollHeight - clientHeight,
behavior: 'smooth',
});
}
};

$(".full-log-dialog").click(function () {
let version_name = $(this).data("version");
let log_type = $(this).data("log-type") || "";
let logContentDom = document.querySelector(`#log-max${version_name}`);
$(`.ui.modal.max-full-log${version_name}`)
.modal({
closable: false,
onShow: function () {
$(".ui.dimmer.modals").css({
"background-color": "rgb(136, 136, 136,0.7)",
LogTool.prototype.showMessage = function (msg) {
this.$container.find('.message .msg').text(msg);
this.msgTimer && clearTimeout(this.msgTimer);
this.$container.find('.message').fadeIn();
this.msgTimer = setTimeout(() => {
this.$container.find('.message').fadeOut();
}, 2000)
};

LogTool.prototype.showFullscreen = function () {
const version = this.version
$(`.ui.modal.full-log-dlg-${version}`).modal({
closable: false,
onShow: function () {
const detailLogContent = $(`.detail-log-fullscreen-content-${version}`);
if (detailLogContent.length) {
const logTool = new LogTool();
logTool.init(detailLogContent, {
lines: 100,
});
$(".log-scroll-max .ui.inverted.active.dimmer").css(
"display",
"none"
);
$(".file-info #log-file-title").text(
$(".full-log-dialog").data("log")
);
$(".file-info #log-file-exit").text(
$(".full-log-dialog").data("exit")
);
$(".file-info .log-file-down").text(
$(".full-log-dialog").data("log-down")
);
$(".file-info .log-file-down").text(
$(".full-log-dialog").data("log-down")
);
$(`.max-full-log${version_name} #${version_name}-log-down`).attr(
"href",
$(".full-log-dialog").data("href")
);
$(`.max-full-log${version_name} .log_top-max`).attr(
"title",
$(".full-log-dialog").data("scroll-top")
);
$(`.max-full-log${version_name} .log_bottom-max`).attr(
"title",
$(".full-log-dialog").data("scroll-bottom")
);
},
onVisible: function () {
$(`#log-max${version_name}`).append(
"<pre>" + $(`#log${version_name} input[name=init_log]`).val()
);
scrollAnimation(
logContentDom,
logContentDom.scrollTop + 1,
logContentDom.scrollHeight - logContentDom.clientHeight
);
if (log_type !== "c2Net") {
$(".log-scroll-max").bind("scroll", function () {
let version_name = $(this).data("version");
let ID = $(`#accordion${version_name}`).data("jobid");
let repoPath = $(`#accordion${version_name}`).data("repopath");
fn(version_name, repoPath, ID, "-max", 100);
});
}
}
},
onVisible: function () { },
onHide: function () { },
}).modal("show");
$(`.ui.modal.full-log-dlg-${version}`).find('.full-log-dialog-exit').off('click').on('click', function () {
$(`.ui.modal.full-log-dlg-${version}`).modal("hide");
});
};

$(".log_bottom-max").bind("click", logBottom);
$(".log_top-max").bind("click", logTop);
LogTool.prototype.eventInit = function () {
const _this = this;
this.$container.find('.log-download').attr('href', `${_this.logDownloadUrl}?version_name=${_this.version}`);
this.$container.find('.node-select').hide();
if (this.multipleNode) {
this.$container.find('.node-select').show();
this.$container.find('.node-select .ui.dropdown').dropdown({
values: new Array(this.workservernumber).fill(0).map((item, index) => ({
name: `节点 ${index + 1}`,
value: index.toString(),
selected: index === 0,
})),
allowTab: false,
}).dropdown('set value', '0');
this.$container.find('.log-download').attr('href', `${_this.logDownloadUrl}/${_this.nodeIndex}?version_name=${_this.version}`);
this.$container.find('.node-select .ui.dropdown').dropdown({
allowTab: false,
onChange: function (value) {
if (_this.nodeIndex == value) return;
_this.nodeIndex = value;
_this.$container.find('.log-download').attr('href', `${_this.logDownloadUrl}/${_this.nodeIndex}?version_name=${_this.version}`);
_this.refresh();
},
onHide: function () {
let startLine = $(
`#log${version_name} input[name=start_line-max-copy]`
).val();
$(`#log_file-max${version_name}`).siblings("pre").remove();
$(`#log${version_name} input[name=start_line-max]`).val(startLine);
});
}
this.$container.find('.log_top').off('click').on('click', () => {
this.goTop();
});
this.$container.find('.log_bottom').off('click').on('click', () => {
this.goBottom();
});
if (!this.noScroll) {
this.$container.find('.log-scroll').off('scroll').on('scroll', this.scrollHandler.bind(this));
}
this.$container.find('.full-log-dialog').off('click').on('click', () => {
_this.showFullscreen();
});
};

$(".log-scroll-max").unbind("scroll");
$(".log_bottom-max").unbind("click");
$(".log_top-max").unbind("click");
},
})
.modal("show");
$('.detail-log-tab').on('click', function () {
const self = $(this);
const version = self.data('version');
const detailLogContent = $(`.detail-log-content-${version}`);
if (detailLogContent.length) {
const logTool = new LogTool();
logTool.init(detailLogContent);
}
});
/* New Log End */

function loadLog(version_name) {
document.getElementById("mask").style.display = "block";
$.get(
`/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}/log?version_name=${version_name}&lines=50&order=asc`,
(data) => {
$("input[name=end_line]").val(data.EndLine);
$("input[name=start_line]").val(data.StartLine);
$(`#log_file${version_name}`).text(escapeHTML(data.Content));
document.getElementById("mask").style.display = "none";
}
).fail(function (err) {
document.getElementById("mask").style.display = "none";
console.log(err);
});
}
$(".refresh-status").click(function (e) {
let version_name = $(this).data("version");
let ID = $(`#accordion${version_name}`).data("jobid");
@@ -524,12 +347,12 @@ export default async function initCloudrainSow() {
} else {
setTimeout(() => {
$(".alert")
.html(data.Message)
.removeClass("alert-success")
.addClass("alert-danger")
.show()
.delay(1500)
.fadeOut();
.html(data.Message)
.removeClass("alert-success")
.addClass("alert-danger")
.show()
.delay(1500)
.fadeOut();
}, 520);
return;
}
@@ -549,7 +372,7 @@ export default async function initCloudrainSow() {
let timer = null
let last_version = ''
let datasetID = ''
$('.ui.accordion .export-dataset').on('click', function (e) {
$('.ui.accordion .export-dataset').on('click', function (e) {
const version_name = this.dataset.version;
const jobId = this.dataset.jobid;
const repoPath = this.dataset.repopath;
@@ -557,8 +380,8 @@ export default async function initCloudrainSow() {
const dataUrl = `${repoPath}/getcurrentdataset`
const exportUrl = `${repoPath}/export_exist_dataset`
const getProgressUrl = `${repoPath}/getprogress`
if (!initShowExportDataset && last_version===version_name) {
if (!initShowExportDataset && last_version === version_name) {
if (initShowNoDataset) {
$(".ui.export_dataset.modal").modal({
onShow: function () {
@@ -582,7 +405,7 @@ export default async function initCloudrainSow() {
const type = Number($('.ui.modal.export_dataset input[name="type"]').val())
const csrf = $('.ui.modal.export_dataset input[name="_csrf"]').val()
const desc = $('.ui.modal.export_dataset textarea[name="description"]').val() //,description:desc
let params = { _csrf: csrf, jobId: jobId, versionName: version_name, datasetId: datasetID, modelSelectedFile: fileList.join(';'), type: type,description:desc }
let params = { _csrf: csrf, jobId: jobId, versionName: version_name, datasetId: datasetID, modelSelectedFile: fileList.join(';'), type: type, description: desc }
postExportDataset(exportUrl, params, getProgressUrl)
} else {
$('.ui.export_dataset.modal .error.message').text(`${i18n['exportDataset']['please_select_file']}`).show()
@@ -590,26 +413,26 @@ export default async function initCloudrainSow() {
return false;
},
}).modal('show').modal('setting', 'closable', false)
} else {
} else {
$(".ui.no_export_dataset.modal").modal({
onShow: function () {
onShow: function () {
$('.ui.dimmer').css({ "background-color": "rgb(136, 136, 136,0.7)" })
},
}).modal("show")
}
} else {
} else {
$(`.ui.accordion #${version_name}-export-dataset .export-popup`).show()
$('.ui.export_dataset.modal .error.message').text('').hide()
$.get(dataUrl, (data) => {
$.get(dataUrl, (data) => {
initShowExportDataset = false
last_version = version_name
if (data.code === 0) {
datasetID = data.dataset.ID
getModelFileList(Fileurl, version_name, jobId)
getInitEXportDataset(getProgressUrl,data.dataset.ID,jobId,version_name)
getInitEXportDataset(getProgressUrl, data.dataset.ID, jobId, version_name)
$(".ui.export_dataset.modal").modal({
onApprove: function () {
onApprove: function () {
const modelFileSelectEle = $(".ui.export_dataset.modal #export-dataset-file .items").find('.file_item')
if (modelFileSelectEle.length !== 0 && canExportDataset) {
modelFileSelectEle.each(function (index) {
@@ -620,12 +443,12 @@ export default async function initCloudrainSow() {
const desc = $('.ui.modal.export_dataset textarea[name="description"]').val() //,description:desc
let params = { _csrf: csrf, jobId: jobId, versionName: version_name, datasetId: data.dataset.ID, modelSelectedFile: fileList.join(';'), type: type, description: desc }
postExportDataset(exportUrl, params, getProgressUrl)
} else {
} else {
$('.ui.export_dataset.modal .error.message').text(`${i18n['exportDataset']['please_select_file']}`).show()
}
return false;
},
onShow: function () {
onShow: function () {
$(`.ui.accordion #${version_name}-export-dataset .export-popup`).hide()
$('.ui.dimmer').css({ "background-color": "rgb(136, 136, 136,0.7)" })
},
@@ -635,12 +458,12 @@ export default async function initCloudrainSow() {
$('#export-dataset-type').off("click")
$('.ui.export_dataset.modal .error.message').text('').hide()
}
})
})
.modal("show")
.modal('setting', 'closable', false)
} else {
} else {
$(".ui.no_export_dataset.modal").modal({
onShow: function () {
onShow: function () {
$(`.ui.accordion #${version_name}-export-dataset .export-popup`).hide()
$('.ui.dimmer').css({ "background-color": "rgb(136, 136, 136,0.7)" })
},
@@ -649,48 +472,48 @@ export default async function initCloudrainSow() {
}
})
}
$('#export-dataset-select').on('click', function () {
$(this).find('#model-file-wrap').show()
})
$('#model-file-export').on('click','.delete.icon', function () {
$('#model-file-export').on('click', '.delete.icon', function () {
let fileEle = $(this).siblings('span').text()
$(this).parent().remove()
const $parentCheckbox = $('#model-file-result').find(`input[name="${fileEle}"]`).parent()
$parentCheckbox.checkbox('set unchecked')
})
$('.ui.modal.export_dataset #container').on('click', function (e) {
if ($(e.target).closest('#model-file-wrap').length === 0 && $(e.target).closest('#export-dataset-select').length !== 1) {
if ($(e.target).closest('#model-file-wrap').length === 0 && $(e.target).closest('#export-dataset-select').length !== 1) {
$(this).find('#model-file-wrap').hide()
}
})
$('#export-dataset-type').on('click', function (e,arg1) {
document.querySelectorAll('#export-dataset-type a').forEach((item) => {
item.classList.remove('active')
$('#export-dataset-type').on('click', function (e, arg1) {
document.querySelectorAll('#export-dataset-type a').forEach((item) => {
item.classList.remove('active')
})
if (arg1) {
$('#export-dataset-type a')[arg1].classList.add('active')
document.querySelector('input[name="type"]').value=arg1
} else {
document.querySelector('input[name="type"]').value = arg1
} else {
e.target.classList.add('active')
document.querySelector('input[name="type"]').value=e.target.dataset.type
document.querySelector('input[name="type"]').value = e.target.dataset.type
}
})
})
e.stopPropagation();
})
function getInitEXportDataset(getProgressUrl, datasetId, jobId,version_name) {
function getInitEXportDataset(getProgressUrl, datasetId, jobId, version_name) {
let setIntervalFlag = false
$('.ui.modal.export_dataset #model-file-export').empty()
$.get(getProgressUrl, { progressId: `${datasetId}_${jobId}_${version_name}` }, (data) => {
$.get(getProgressUrl, { progressId: `${datasetId}_${jobId}_${version_name}` }, (data) => {
const result = data && JSON.parse(data)
if (Object.keys(result).length > 0) {
if (Object.keys(result).length > 0) {
canExportDataset = false
let fileInitList = Object.keys(result).filter((item) => item !== '##type##')
$($('#export-dataset-type')).trigger('click',`${result['##type##']}`)
fileInitList.forEach((item) => {
if (result[item] === -1) {
$($('#export-dataset-type')).trigger('click', `${result['##type##']}`)
fileInitList.forEach((item) => {
if (result[item] === -1) {
let itemHtml = `<div data-index="${item}" class="file_item">
<span class="nowrap" style="width:80%" title="${item}">${item}</span>
<div class="file_error"><i class="ri-close-circle-line failed"></i><span>${i18n['exportDataset']['export_failed']}</span></div>
@@ -710,7 +533,7 @@ export default async function initCloudrainSow() {
</div>`
$('.ui.modal.export_dataset #model-file-export').append(itemHtml)
}
if (result[item] === 100) {
if (result[item] === 100) {
let itemHtml = `<div data-index="${item}" class="file_item">
<span class="nowrap" style="width:80%" title="${item}">${item}</span>
<div class="file_success"">
@@ -720,7 +543,7 @@ export default async function initCloudrainSow() {
</div>`
$('.ui.modal.export_dataset #model-file-export').append(itemHtml)
}
if (result[item] === 0) {
if (result[item] === 0) {
let itemHtml = `<div data-index="${item}" class="file_item">
<span class="nowrap" style="width:80%" title="${item}">${item}</span>
<div class="file_wait""><i class="ri-loader-2-line waiting spin"></i><span>${i18n['exportDataset']['exporting']}</span></div>
@@ -729,20 +552,20 @@ export default async function initCloudrainSow() {
setIntervalFlag = true
}
})
if (setIntervalFlag) {
if (setIntervalFlag) {
timer && clearInterval(timer)
timer = setIntervalImmediately(getProgress, 5000, getProgressUrl, `${datasetId}_${jobId}`)
timer = setIntervalImmediately(getProgress, 5000, getProgressUrl, `${datasetId}_${jobId}`)
}
}
})
}
function getModelFileList(Fileurl,version_name,jobId) {
function getModelFileList(Fileurl, version_name, jobId) {
$.get(Fileurl, { versionName: version_name, jobId: jobId }, (data) => {
$('.ui.modal.export_dataset #model-file-result').empty()
let html = ''
if (data.code === 0 && data.files.length !== 0) {
let dataFileList = data.files.sort((a, b) => {
if (data.code === 0 && data.files.length !== 0) {
let dataFileList = data.files.sort((a, b) => {
return a.FileName.localeCompare(b.FileName)
})
dataFileList.forEach(element => {
@@ -768,9 +591,9 @@ export default async function initCloudrainSow() {
<i class="delete icon" style="cursor:pointer"></i>
</div>`
$('.ui.modal.export_dataset #model-file-export').append(itemHtml)
},
onUnchecked: function() {
onUnchecked: function () {
let fileName = $(this).attr('name')
$('.ui.modal.export_dataset #model-file-export').find(`div[data-index="${fileName}"]`).remove()

@@ -780,40 +603,40 @@ export default async function initCloudrainSow() {
}).fail(function (err) {
console.log(err);
});
}
function getProgress(getProgressUrl,progressId) {
function getProgress(getProgressUrl, progressId) {
const $statusEle = $('#model-file-export .file_item').find('div')
let fileLength = $statusEle.length
let count = 0
$.get(getProgressUrl, { progressId: progressId }, (data) => {
$.get(getProgressUrl, { progressId: progressId }, (data) => {
const result = data && JSON.parse(data)
let sortResult = Object.keys(result).sort((a,b) => {
return fileList.indexOf(a)-fileList.indexOf(b)
let sortResult = Object.keys(result).sort((a, b) => {
return fileList.indexOf(a) - fileList.indexOf(b)
})
let filterResult = sortResult.filter((item) => item !== '##type##')
filterResult.forEach((item, index) => {
filterResult.forEach((item, index) => {
console.log(item)
if (result[item] === -1) {
if (result[item] === -1) {

if (!$($statusEle[index]).hasClass('file_error')) {
if (!$($statusEle[index]).hasClass('file_error')) {
$($statusEle[index]).replaceWith(`<div class="file_error"><i class="ri-close-circle-line failed"></i><span>${i18n['exportDataset']['export_failed']}</span></div>`)
}
count++
}
if (result[item] === -2) {
if (!$($statusEle[index]).hasClass('file_error')) {
if (!$($statusEle[index]).hasClass('file_error')) {
$($statusEle[index]).replaceWith(`<div class="file_error""><i class="ri-close-circle-line failed"></i><span>${i18n['exportDataset']['export_failed']}</span><span data-tooltip="${i18n['exportDataset']['export_has_same_file']}" data-inverted="" data-variation="tiny"><i class="ri-question-fill question"></i></span></div>`)
}
count++
}
if (result[item] === 100 ) {
if (!$($statusEle[index]).hasClass('file_success')) {
if (result[item] === 100) {
if (!$($statusEle[index]).hasClass('file_success')) {
$($statusEle[index]).replaceWith(`<div class="file_success""><i class="ri-checkbox-circle-line success" style="vertical-align: middle;"></i><span>${i18n['exportDataset']['export_success']}</span></div>`)
}
}
count++
}
console.log("count:",count)
console.log("count:", count)
if (count === fileLength) {
$(".ui.export_dataset.modal").modal('refresh')
timer && clearInterval(timer)
@@ -823,42 +646,42 @@ export default async function initCloudrainSow() {
$('.ui.modal.export_dataset .ui.approve').removeClass('disabled')
fileList = []
canExportDataset = false
$('#model-file-result.list .child.checkbox.checked').each(function () {
$('#model-file-result.list .child.checkbox.checked').each(function () {
$(this).checkbox('set unchecked')
})
return
}
})
})
}
function postExportDataset(url, params, getProgressUrl) {
$.post(url, params, (data) => {
if (data.code === '0') {
$('#model-file-export .delete.icon').each(function () {
function postExportDataset(url, params, getProgressUrl) {
$.post(url, params, (data) => {
if (data.code === '0') {
$('#model-file-export .delete.icon').each(function () {
$(this).replaceWith(`<div class="file_wait""><i class="ri-loader-2-line waiting spin"></i><span>${i18n['exportDataset']['exporting']}</span></div>`)
})
$('.ui.modal.export_dataset .ui.approve').addClass('disabled')
$('#export-dataset-select').off("click")
// $('.ui.modal.export_dataset').off("click")
getProgress(getProgressUrl,data.progressId)
getProgress(getProgressUrl, data.progressId)
timer && clearInterval(timer)
timer = setIntervalImmediately(getProgress,5000,getProgressUrl,data.progressId)
timer = setIntervalImmediately(getProgress, 5000, getProgressUrl, data.progressId)
}
})
}
function setIntervalImmediately(func, interval,...args) {
function setIntervalImmediately(func, interval, ...args) {
func(...args)
return setInterval(func,interval,...args)
return setInterval(func, interval, ...args)
};
// $('.ui.pointing.secondary.menu .item:eq(0)').click(function(e) {
// const self = $(this);
// setTimeout(function() {
// self.closest('.accordion').find('.refresh-status').trigger('click');
// }, 20);
// });
function refreshStatusShow(version_name, ID, repoPath) {
$.get(
@@ -901,10 +724,10 @@ export default async function initCloudrainSow() {
$(`#dir_list${version_name}`).empty();
let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`;
$.get(url, (data) => {
if (data.StatusOK == 0) { // 成功 0
if (data.Dirs) {
data.Dirs.length !==0 && $(`#${version_name}-result-down`).show()
data.Dirs.length !== 0 && $(`#${version_name}-result-down`).show()
renderDir(path, data, version_name, downloadFlag, gpuFlag);
}
if (init === "init") {
@@ -931,7 +754,7 @@ export default async function initCloudrainSow() {
gpuFlag
);
}
}else if (data.StatusOK == -1) { // 任务未结束 -1
} else if (data.StatusOK == -1) { // 任务未结束 -1
$(`#file_breadcrumb${version_name}`).empty();
$(`#dir_list${version_name}`).html(`<div style="height:200px;display:flex;justify-content:center;align-items:center;font-size:14px;color:rgb(16, 16, 16);">
<div style="display:flex;justify-content:center;align-items:center;height:24px;width:24px;margin-right:5px;">
@@ -939,7 +762,7 @@ export default async function initCloudrainSow() {
</div>
<span>${i18n['task_not_finished']}</span>
</div>`);
}else if (data.StatusOK == 1) { // 处理中 1
} else if (data.StatusOK == 1) { // 处理中 1
$(`#file_breadcrumb${version_name}`).empty();
$(`#dir_list${version_name}`).html(`<div style="height:200px;display:flex;justify-content:center;align-items:center;font-size:14px;color:rgb(16, 16, 16);">
<style>
@@ -971,7 +794,7 @@ export default async function initCloudrainSow() {
</div>
<span>${i18n['file_sync_fail']}</span>
</div>`);
}
}
} else if (data.StatusOK == 3) { // 等待同步 3
$(`#file_breadcrumb${version_name}`).empty();
$(`#dir_list${version_name}`).html(`<div style="height:200px;display:flex;justify-content:center;align-items:center;font-size:14px;color:rgb(16, 16, 16);">
@@ -1002,7 +825,7 @@ export default async function initCloudrainSow() {
console.log(err, version_name);
});
});

function renderSize(value) {
if (null == value || value == "") {


+ 46
- 9
web_src/js/index.js View File

@@ -5240,17 +5240,13 @@ function initChartsNpu() {

series: [],
};
const sortBy = (arr, k) =>
arr.concat().sort((a, b) => (a[k] > b[k] ? 1 : a[k] < b[k] ? -1 : 0));
$(".metric_chart").click(function (e) {
const repoPath = $(this).data('path')
let versionName = $(this).data("version");
let myCharts = echarts.init(
document.getElementById(`metric-${versionName}`)
);
const sortBy = (arr, k) => arr.concat().sort((a, b) => (a[k] > b[k] ? 1 : a[k] < b[k] ? -1 : 0));
function getChartData({myCharts, url, loadingEl}) {
loadingEl && loadingEl.show();
$.get(
`${window.config.AppSubUrl}/api/v1/repos/${repoPath}`,
url,
(res) => {
loadingEl && loadingEl.hide();
if (res.MetricsInfo) {
let filterDta = res.MetricsInfo.filter((item) => {
return ![
@@ -5298,7 +5294,48 @@ function initChartsNpu() {
}
}
);
}
const params = {
url: '',
myCharts: null,
loadingEl: null,
};
$(".metric_chart").click(function (e) {
if ($(this).hasClass('ri-refresh-line')) {
getChartData(params);
return;
}
const repoPath = $(this).data('path')
const versionName = $(this).data("version");
const chartEl = document.getElementById(`metric-${versionName}`);
const multipleNode = $(chartEl).data('multiplenode');
const loadingEl = $(chartEl).siblings('.ui.dimmer');
const workServerNumber = $(chartEl).data('workservernumber');
const url = `${window.config.AppSubUrl}/api/v1/repos/${repoPath}`;
const myCharts = echarts.init(chartEl);
if (multipleNode) {
const multipleNodeEl = $(chartEl).siblings('.node-select').show();
multipleNodeEl.find('.ui.dropdown').dropdown({
values: new Array(workServerNumber).fill(0).map((item, index) => ({
name: `节点 ${index + 1}`,
value: index.toString(),
selected: index === 0,
})),
allowTab: false,
}).dropdown('set value', '0');
multipleNodeEl.find('.ui.dropdown').dropdown({
allowTab: false,
onChange: function (value) {
params.url = url + '/' + value;
getChartData(params)
},
});
}
options && myCharts.setOption(options);
params.myCharts = myCharts;
params.url = multipleNode ? url + '/0' : url;
params.loadingEl = loadingEl;
getChartData(params)
});
}



Loading…
Cancel
Save