Rdag%woq2kS7BzCvD5L^FXr-h!Znr=}DK3sm{ziq~hQ&|$y>p`NBX)jM#I{{64QKhnQgc-GQ8a^CMXTfl9}rwsRNEvb+W6K+f?N7AfA7ISx_
zbiJrl``B%y4$-(Z&XJCuSahIm$!R2g;a=!(GWJ<~?j0uy&zB7vPwSp0+@hU)Q2$?P
zhMDXY^lTodIsT%$b1e74n$MPqBz4U9E7r>=dR9g0fm5R-rO7)5OHREqr26O_f;^SL
z2>N@GHXs);STfpmR$+p&=0Qy$9#~S9R@>D-P$%zYEW-C3kFpF}qh`;DW!(Mr*4k*%
z>mgs(oL+x+i?>i?{%E0t$eM^-L+j&R-(xRa+q59g9kdFGd4b;(6z3R~y>_bStnZ`x
zGuKn;#k&T(JS*)jxmjUz@90B}H$Z>kNf9($T1l~=KD8ms6)xhQ_}l&^?%
zPHm3L%d~}^`kU565+*JMOFXG;5~uHPU)phPM7*AM;m<3P#OUAuT|rKrP;B9l&h@lt
z2?da4btU*Fh-nqhkDjF0EWdfDZ;B4-e~zBA7~PhQn~>4l>Ru$9`RRA3*bBn(64FJ1
z>(WZ&{)a}6W`^ahZ5e1xSX<9tdOVPqp5uAc&7=4JAuE+L#EC+q>z&bV1Kk0Np?8*-
zlz%;nva&Po8uX+tRp^K(_0jOOOnLzqP_{Lx|#LebxzZrm%48l
Tl|Bpq?Fd^d2TO+e@%aA%bnOWX
literal 0
HcmV?d00001
diff --git a/public/img/domestic/iluvatar.svg b/public/img/domestic/iluvatar.svg
new file mode 100644
index 0000000000..922523b102
--- /dev/null
+++ b/public/img/domestic/iluvatar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/img/domestic/metax.svg b/public/img/domestic/metax.svg
new file mode 100644
index 0000000000..5587fbece6
--- /dev/null
+++ b/public/img/domestic/metax.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/self/dataset_preview.js b/public/self/dataset_preview.js
index 81620e1a0d..506523d816 100644
--- a/public/self/dataset_preview.js
+++ b/public/self/dataset_preview.js
@@ -1,754 +1,340 @@
-var img=new Image();
-
-var ip = getIp();
-
-
-
-var token = getCookie("_csrf");
-
-canvas = document.getElementById("myCanvas");
-context = canvas.getContext("2d");
-// canvas.width = document.getElementById("myCanvas").offsetWidth;
-// canvas.height = document.getElementById("myCanvas").offsetWidth/1280*720;
-
-canvas.width = document.getElementById("win_canvas").offsetWidth;
-canvas.height = document.getElementById("win_canvas").offsetHeight;
-
-
-
-
-var color_dict = {"car":"#0099CC", "person":"#FF99CC","point":"#00cc00","pointselected":"red"};
-var color_person = {"0":"#13c90c","1":"#fc0707","2":"#FF99CC","3":"#fceb07"};
-
-var rects=[];
-var masks=[];
-var pointShapes =[];
-
-var fileindex =0;
-var lastindex=false;
-var labeltastresult;
+(function () {
+ function DatasetPreview() {
+ this.ajaxTimeOut = 1000 * 60;
+ this.datasetData = DATASET_DATA;
+ this.supportImgReg = /(\.jpg|\.jpeg|\.png|\.gif|\.bmp)$/i;
+ this.supportTxtReg = /(\.txt|\.xml|\.html|\.json|\.py|\.sh|\.md|\.csv|\.log|\.js|\.css|\.ipynb)$/i;
+ this.data = {
+ filePath: [{ path: '', name: this.datasetData.path[0], ParenDir: '', marker: '' }],
+ dirMarkerChildrenMap: {},
+ fileContentMap: {},
+ currentPage: '',
+ };
+ this.currentFileList = [];
+ this.currentFile = '';
+ this.pageSize = 100;
+ this.getPathChildren();
+ this.eventInit();
+ }
-var pageSize = 12;
-var tableData;
-var tablePageData;
-var dataset_id = $('#hide_uuidid').val();
-var dbdatasetid = dataset_id;
-var textContent;
-var labelInfo;
+ DatasetPreview.prototype.renderFilePath = function () {
+ var container = $('#file_path_container').empty();
+ var filePath = this.data.filePath;
+ for (let i = 0, iLen = filePath.length; i < iLen; i++) {
+ var path = filePath[i];
+ var pathEle;
+ if (i == iLen - 1) {
+ pathEle = $(``);
+ } else {
+ pathEle = $(``);
+ }
+ pathEle.data('data', path);
+ container.append(pathEle);
+ }
+ };
-page(0,pageSize);
+ DatasetPreview.prototype.prevDirs = function () {
+ this.data.filePath.pop();
+ this.getPathChildren();
+ };
+ DatasetPreview.prototype.nextDirs = function (pathObj) {
+ this.data.filePath.push({
+ ...pathObj,
+ path: pathObj.FileName,
+ name: pathObj.FileName,
+ });
+ this.getPathChildren();
+ };
-function getCookie(name)
-{
- var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
-
- if(arr=document.cookie.match(reg))
-
- return unescape(arr[2]);
- else
- return null;
-}
+ DatasetPreview.prototype.showGetPathChildrenTimeout = function () {
+ $('#myCanvas_div .tabpannel.ui.form .query-timeout').show();
+ $('#filelist').hide();
+ }
-function list(current,pageSize){
- $.ajax({
- type:"GET",
- url:ip + "/gitea-dateset-item-page",
- headers: {
- authorization:token,
- },
- dataType:"json",
- data:{
- 'datasetId':dbdatasetid,
- 'startPage':current,
- 'pageSize':pageSize},
- async:false,
- success:function(json){
- tablePageData = json;
- tableData = json.data;
- labeltastresult = tableData;
- fileindex=0;
- if(lastindex){
- fileindex = pageSize - 1;
- }
-
- },
- error:function(response) {
-
-
+ DatasetPreview.prototype.getPathChildrenMore = function () {
+ var self = this;
+ var lastDir = this.data.filePath[this.data.filePath.length - 1];
+ var path = this.data.filePath.map((item) => item.path).join('/');
+ if (!lastDir) return;
+ $('#myCanvas_div .tabpannel.ui.form').addClass('loading');
+ $.ajax({
+ type: "get",
+ url: `/api/v1/attachments/get_dir`,
+ dataType: "json",
+ timeout: this.ajaxTimeOut,
+ data: {
+ _csrf: this.datasetData.csrf,
+ uuid: this.datasetData.uuid,
+ marker: lastDir.marker,
+ pageSize: this.pageSize,
+ prefix: lastDir.ParenDir ? '/' + lastDir.ParenDir.replace(/^\//, '') : '',
+ },
+ success: function (res) {
+ $('#myCanvas_div .tabpannel.ui.form').removeClass('loading');
+ if (res.result_code == 0) {
+ var result = res.data.sort((a, b) => {
+ var a1 = a.IsDir ? 1 : 0;
+ var b1 = b.IsDir ? 1 : 0;
+ return b1 - a1;
+ });
+ var fileList = [];
+ for (let i = 0, iLen = result.length; i < iLen; i++) {
+ const file = result[i];
+ if (self.currentFileList.findIndex(itm => `${itm.ParenDir}${itm.FileName}` == `${file.ParenDir}${file.FileName}`) >= 0) {
+ continue;
+ }
+ fileList.push(file);
+ }
+ self.data.dirMarkerChildrenMap[path + '-' + lastDir.marker] = result;
+ self.currentFileList = self.currentFileList.concat(fileList);
+ lastDir.marker = res.marker;
+ self.renderFileListAdd(fileList, result.length);
+ } else {
+ console.log(res);
}
- });
-}
-
-
+ },
+ error: function (err) {
+ $('#myCanvas_div .tabpannel.ui.form').removeClass('loading');
+ console.log(err);
+ if (err.statusText == 'timeout') {
+ self.showGetPathChildrenTimeout();
+ }
+ }
+ });
+ }
-function getTextContent(uuid,filename){
- $.ajax({
- type:"GET",
- url:ip + "/getgiteatext",
- headers: {
- authorization:token,
- },
- dataType:"text",
- data:{
- 'uuid':uuid,
- 'filename':filename
- },
- async:false,
- success:function(json){
- textContent = json;
-
+ DatasetPreview.prototype.getPathChildren = function () {
+ this.renderFilePath();
+ var lastDir = this.data.filePath[this.data.filePath.length - 1];
+ if (!lastDir) return;
+ var path = this.data.filePath.map((item) => item.path).join('/');
+ var cache = this.data.dirMarkerChildrenMap[path + '-' + lastDir.marker];
+ var self = this;
+ if (false && cache) {
+ self.currentFileList = cache;
+ this.renderFileList(cache);
+ } else {
+ $('#myCanvas_div .tabpannel.ui.form').addClass('loading');
+ $.ajax({
+ type: "get",
+ url: `/api/v1/attachments/get_dir`,
+ dataType: "json",
+ timeout: this.ajaxTimeOut,
+ data: {
+ _csrf: this.datasetData.csrf,
+ uuid: this.datasetData.uuid,
+ marker: '',
+ pageSize: this.pageSize,
+ prefix: lastDir.ParenDir ? '/' + lastDir.ParenDir.replace(/^\//, '') : '',
+ },
+ success: function (res) {
+ $('#myCanvas_div .tabpannel.ui.form').removeClass('loading');
+ if (res.result_code == 0) {
+ var result = res.data.sort((a, b) => {
+ var a1 = a.IsDir ? 1 : 0;
+ var b1 = b.IsDir ? 1 : 0;
+ return b1 - a1;
+ });
+ self.data.dirMarkerChildrenMap[path + '-' + lastDir.marker] = result;
+ lastDir.marker = res.marker;
+ self.currentFileList = result;
+ self.currentFile = '';
+ self.renderFileList(result);
+ } else {
+ console.log(res);
+ }
},
- error:function(response) {
-
+ error: function (err) {
+ $('#myCanvas_div .tabpannel.ui.form').removeClass('loading');
+ console.log(err);
+ if (err.statusText == 'timeout') {
+ self.showGetPathChildrenTimeout();
+ }
}
- });
-}
-
-
-
-/*
-function previewDataSetFile(uuid,filename){
- console.log('uuid=' + uuid + " filename=" + filename);
- loadimg(uuid,filename);
-}
-
-function loadimg(uuid,filename){
- img.src = ip + "/getgiteaimage?uuid=" + uuid + "&filename=" + filename;
- var fname = filename.substring(filename.lastIndexOf('/') + 1);
- $("#filename").text(fname);
-}
-*/
-
-function loadimg(){
- var length = labeltastresult[fileindex].pic_image_field.length;
-
- if(labeltastresult[fileindex].pic_image_field.substring(length - 5).toLowerCase() == ".json"
- || labeltastresult[fileindex].pic_image_field.substring(length - 4).toLowerCase() == ".xml"
- || labeltastresult[fileindex].pic_image_field.substring(length - 4).toLowerCase() == ".txt"
- || labeltastresult[fileindex].pic_image_field.substring(length - 4).toLowerCase() == ".csv"
- || labeltastresult[fileindex].pic_image_field.substring(length - 3).toLowerCase() == ".md"
- || labeltastresult[fileindex].pic_image_field.substring(length - 3).toLowerCase() == ".py"
- || labeltastresult[fileindex].pic_image_field.substring(length - 3).toLowerCase() == ".sh"){
-
- //文本
- canvas.style.display="none";
- document.getElementById("textcontent").style.display="block";
- getTextContent(dataset_id,labeltastresult[fileindex].pic_image_field);
- $('#textcontent').height(canvas.height-40)
- $("#textcontent").text(textContent);
- }else{
- if(labeltastresult[fileindex].pic_image_field.substring(length - 5).toLowerCase() == ".jpeg"
- || labeltastresult[fileindex].pic_image_field.substring(length - 4).toLowerCase() == ".jpg"
- || labeltastresult[fileindex].pic_image_field.substring(length - 4).toLowerCase() == ".bmp"
- || labeltastresult[fileindex].pic_image_field.substring(length - 4).toLowerCase() == ".gif"
- || labeltastresult[fileindex].pic_image_field.substring(length - 4).toLowerCase() == ".png"){
- canvas.style.display="block";
- document.getElementById("textcontent").style.display="none";
- img.src = ip + "/getgiteaimage?uuid=" + dataset_id + "&filename=" + labeltastresult[fileindex].pic_image_field;
- }else{
- canvas.style.display="none";
- document.getElementById("textcontent").style.display="block";
- $('#textcontent').height(canvas.height)
- $("#textcontent").text("暂不支持预览");
-
- }
- }
-
-
- var fname = tableData[fileindex].pic_image_field.substring(tableData[fileindex].pic_image_field.lastIndexOf('/') + 1);
- $("#filename").text(fname);
-}
-
-img.onload = function(){
-
-
- canvas.width = document.getElementById("win_canvas").offsetWidth;
- canvas.height = document.getElementById("win_canvas").offsetHeight-40;
- //调整画布大小
- // if ((img.width/img.height)<(canvas.width/canvas.height)){
- // canvas.width=canvas.height * img.width / img.height;
- // }
- // else{
- // canvas.height=canvas.width * img.height / img.width;
- // }
- drawimage();
-}
-
-function isEmpty(str){
- if(typeof str == "undefined" || str == null || str == ""){
- return true;
- }
- return false;
-}
-
-function drawimage() {
-
- parse_labelinfo(labeltastresult[fileindex].label_info);
-
- // 清除画布,准备绘制
- context.clearRect(0, 0, canvas.width, canvas.heigth);
- // modal_context.cleararc
-
- context.drawImage(img,0,0,img.width,img.height,0,0,canvas.width, canvas.height);
-
- for(var i=0; i
+
+ ${file.FileName}
+ `);
+ fileEl.data('data', file);
+ domC.append(fileEl);
}
- this.mouseonpoint = false;
- this.mouseonrect = false;
- this.isSelected = false;
- this.id =""; //标识
- this.blurred=false;//模糊不清的; 记不清的; 难以区分的; 模棱两可的
- this.goodIllumination = true; //照明
- this.frontview = true;//正面图
-};
-
-
-
-function maskar(x0,y0,type){
- this.type = type;
- this.points = [new point(x0,y0)];
- this.finish = false;
- this.mouseonpoint = false;
- this.mouseonmask = false;
- this.isSelected = false;
- this.getX1Y1 = function(){return [this.points[0].x,this.points[0].y]}
- this.getBound = function(){
- mlen = this.points.length;
- var minX = 999999999, minY = 999999999, maxX = -1, maxY = -1;
- for (var i = 0; i < mlen; i ++){
- if(minX > this.points[i].x){
- minX = this.points[i].x;
- }
- if(maxX < this.points[i].x){
- maxX = this.points[i].x;
- }
- if(minY > this.points[i].y){
- minY = this.points[i].y;
- }
- if(maxY < this.points[i].y){
- maxY = this.points[i].y;
- }
+ var lastDir = this.data.filePath[this.data.filePath.length - 1];
+ if (!lastDir) return;
+ if (length >= this.pageSize && lastDir.marker) {
+ domC.append(`${$('#lang-seemore').text()}
`);
}
- return [minX, minY, maxX, maxY];
- }
-
- this.id =""; //标识
- this.blurred=false;//模糊不清的; 记不清的; 难以区分的; 模棱两可的
- this.goodIllumination = true; //照明
- this.frontview = true;//正面图
-}
-
-function getCanvasLocationX(num){
- return Math.round(num * canvas.width/parseInt(img.width));
-}
-
-function getCanvasLocationY(num){
- return Math.round(num * canvas.height/parseInt(img.height));
-}
-
-
-function page(current,pageSize){
- list(current,pageSize);
- showfilelist();
- breadFiles();
- loadimg();
- setPage(tablePageData,pageSize);
-}
-
-
-getLabelInfo(dataset_id);
-showlabelflist();
-
-
-function nextPage(){
- var current = $('#displayPage1').text();
-
- page(current,pageSize);
-}
-
-function prePage(){
- var current =$('#displayPage1').text();
-
- if(current > 1){
-
- page(current - 2,pageSize);
- }
-}
-
-function goPage(){
- var goNum = $('#goNum').val();
+ };
- var pageTotal = $("#totalNum").text();
- var pageNum = parseInt(pageTotal/pageSize);
- if(pageTotal%pageSize!=0){
- pageNum += 1;
- }else {
- pageNum = pageNum;
+ DatasetPreview.prototype.renderFileList = function (files) {
+ var domC = $('#filelist').empty();
+ var findFile = false;
+ for (let i = 0, iLen = files.length; i < iLen; i++) {
+ const file = files[i];
+ const fileEl = $(`
+
+ ${file.FileName}
+
`);
+ fileEl.data('data', file);
+ domC.append(fileEl);
}
- if (goNum<=0){
- alert("请输入大于0的数值");
+ if (!findFile) {
+ this.currentFile = null;
+ this.renderPleseSelectFile();
}
- else if(goNum<=pageNum){
- page(goNum - 1,pageSize);
+ var lastDir = this.data.filePath[this.data.filePath.length - 1];
+ if (!lastDir) return;
+ if (files.length >= this.pageSize && lastDir.marker) {
+ domC.append(`${$('#lang-seemore').text()}
`);
}
- else{
- alert("不能超出总页码!");
- }
-}
+ };
-$("#goNum").keydown(function (e) {
- if (e.keyCode == 13) {
- goPage();
+ DatasetPreview.prototype.renderPreview = function (file) {
+ var fileName = file.FileName;
+ if (this.supportImgReg.test(fileName)) {
+ console.log('renderImage');
+ $('#textcontent').hide();
+ $('#win_canvas .select-file').hide();
+ $('#win_canvas .not-support').hide();
+ $('#imgcontent').attr('src', `/api/v1/attachments/get_image_content?uuid=${this.datasetData.uuid}&filePath=${file.ParenDir + file.FileName}&type=${this.datasetData.type}&_csrf=${this.datasetData.csrf}`).show();
+ } else if (this.supportTxtReg.test(fileName)) {
+ console.log('getFileText');
+ this.getFileText(file);
+ } else {
+ console.log('not support');
+ this.renderNotSupport();
}
-});
-
-
-function setPage(pageData,pageSize){
-
- if (isEmpty(pageData)){
- return;
- }
- var startIndex = pageData.current * pageSize;
- if(pageData.total > 0){
- startIndex = startIndex + 1;
- }
- if(startIndex < 10){
- $('#startIndex').text(" " + (startIndex));
- }else{
- $('#startIndex').text(startIndex);
- }
- var endIndex = pageData.current * pageSize + pageData.data.length;
- if(endIndex < 10){
- $('#endIndex').text(" " + (endIndex));
- }else{
- $('#endIndex').text(endIndex);
- }
-
- $('#totalNum').text(pageData.total);
- $('#displayPage1').text(pageData.current + 1);
-
-
-
- if(pageData.current == 0){
-
- $('#prePage').removeAttr("href");
- $('#prePage').attr('style','color:#f5f5f6;');
- }
- else{
- $('#prePage').attr("href","javascript:prePage()");
- $('#prePage').attr('style','color:#000;');
- }
-
- if((pageData.current + 1) * pageSize >= pageData.total){
-
- $('#nextPage').removeAttr("href");
- $('#nextPage').attr('style','color:#f5f5f6;')
- }
- else{
- $('#nextPage').attr("href","javascript:nextPage()");
- $('#nextPage').attr('style','color:#000;');
- }
+ };
- var pageTotal = pageData.total;
- var pageNum = parseInt(pageTotal/pageSize);
- if(pageTotal%pageSize!=0){
- pageNum += 1;
- }else {
- pageNum = pageNum;
+ DatasetPreview.prototype.renderNotSupport = function () {
+ $('#imgcontent').hide();
+ $('#textcontent').hide();
+ $('#win_canvas .select-file').hide();
+ $('#win_canvas .not-support').show();
}
- $("#totalPageNum").text(pageNum);
-}
-function clickfilelist(index){
- fileindex=index;
- loadimg();
- //drawimage();
- breadFiles()
- showfilelist();
-}
-
-function clickNext(){
- if(fileindex= tablePageData.total){
- return;
- }
- nextPage();
+ DatasetPreview.prototype.renderPleseSelectFile = function () {
+ $('#imgcontent').hide();
+ $('#textcontent').hide();
+ $('#win_canvas .not-support').hide();
+ $('#win_canvas .select-file').show();
}
-
-}
-
-
-function next(){
- if(fileindex0) {fileindex=fileindex-1;}
- loadimg();
- //drawimage();
- breadFiles();
- showfilelist();
-}
-
-
-// function showfilelist(){
-// var htmlstr="";
-// for (var i=0;i"+ fname+ " | ";
-// };
-// document.getElementById("filelist").innerHTML=htmlstr;
-// }
+ DatasetPreview.prototype.renderText = function (content) {
+ $('#imgcontent').hide();
+ $('#win_canvas .select-file').hide();
+ $('#win_canvas .not-support').hide();
+ $('#textcontent').empty().text(content).show();
+ };
-function showfilelist(){
- // var filename_title = $('a.section:first').text()
- // filename_title = filename_title.substring(0,filename_title.lastIndexOf('.'))
- var filename_index = labeltastresult[0].pic_image_field.indexOf("/",70);
- filename_title = labeltastresult[0].pic_image_field.substring(filename_index + 1);
- filename_title = filename_title.substring(0,filename_title.indexOf('/'))
- var htmlstr = '';
- // htmlstr += '';
- htmlstr += '
'
- htmlstr += '
'
- htmlstr += '
'
- htmlstr += ''
- htmlstr += '
'
-
- for (var i=0;i
70){
- var tmpIndex = labeltastresult[i].pic_image_field.indexOf("/",70);
- //console.log(tmpIndex)
- if(tmpIndex != -1){
- fname = labeltastresult[i].pic_image_field.substring(tmpIndex + 1);
- fname = fname.substring(fname.indexOf('/')+1);
+ DatasetPreview.prototype.getFileText = function (file) {
+ var cache = this.data.fileContentMap[file.ParenDir + file.FileName];
+ var self = this;
+ if (false && cache) {
+ self.renderText(cache);
+ } else {
+ $.ajax({
+ type: "get",
+ url: "/api/v1/attachments/get_txt_content",
+ headers: { authorization: this.datasetData.csrf, },
+ dataType: "json",
+ data: {
+ _csrf: this.datasetData.csrf,
+ uuid: this.datasetData.uuid,
+ type: this.datasetData.type,
+ filePath: file.ParenDir + file.FileName,
+ },
+ success: function (res) {
+ self.data.fileContentMap[file.ParenDir + file.FileName] = res.data;
+ const data = res.data || [];
+ if (res.result_code == 0) {
+ self.renderText(data.join(''));
+ } else if (res.result_code == -1) {
+ self.renderText(res.msg);
+ } else {
+ self.renderNotSupport();
+ }
+ },
+ error: function (err) {
+ console.log(err);
+ self.renderNotSupport();
}
+ });
}
-
- htmlstr += ''
- htmlstr += '
'
- if(i==fileindex){
- htmlstr += ''
- }
- else{
- htmlstr += ''
- }
- htmlstr += '
'
- htmlstr += '
'
};
- htmlstr += ''
- htmlstr += '
'
- htmlstr += '
'
- document.getElementById("filelist").innerHTML=htmlstr;
-}
-
-
-function breadFiles(){
-
- // for (var i=0;i
70){
- // var tmp_index = labeltastresult[i].pic_image_field.indexOf("/",70);
- // if(tmp_index != -1){
- // fname_full_path = labeltastresult[i].pic_image_field.substring(tmp_index + 1);
- // }
- // var fname_path = fname_full_path.split('/')
- // html_breadFile += ''+fname_full_path+'.zip'+'
'
- // for(var i=1;i / '
- // html_breadFile += ''+fname_path[i]+'
'
- // }
- // }
- // else{
-
-
-
- // }
- // }
- var fname_full_path=""
- var filename_title = $('a.section:first').text()
- filename_title = filename_title.substring(0,filename_title.lastIndexOf('.'))
- var tmp_index = tableData[fileindex].pic_image_field.indexOf("/",70);
- if(tmp_index != -1){
- fname_full_path = tableData[fileindex].pic_image_field.substring(tmp_index + 1);
+ DatasetPreview.prototype.offsetPrview = function (offset) {
+ var fileList = this.currentFileList.filter(function (item) { return !item.IsDir });
+ if (!fileList.length) {
+ this.renderPleseSelectFile();
+ return;
}
- var fname_path = fname_full_path.split('/')
- //console.log(fname_path)
- // var filename_text = tableData[fileindex].pic_image_field.substring(tableData[fileindex].pic_image_field.lastIndexOf('/')+1)
- var html_breadFile = ''
- // var source_name = filename_title+'.zip'
- // html_breadFile += ''+source_name+'
'
- // html_breadFile += ' /
'
- html_breadFile += ''+filename_title+'
'
- html_breadFile += ' /
'
- for (var i=0;i'+fname_path[i]+''
- html_breadFile += ' /
'
+ var file = this.currentFile;
+ var index = -1;
+ var nextIndex = 0;
+ if (file) {
+ index = fileList.findIndex(function (item) { return (item.ParenDir + item.FileName) == (file.ParenDir + file.FileName); });
+ index = Math.max(0, index);
+ nextIndex = (offset + index + fileList.length) % fileList.length;
}
-
- document.getElementById("breadFile").innerHTML=html_breadFile
-
-}
-
-function showlabelflist(){
- if(!isEmpty(labelInfo)){
- var resLabelInfo = JSON.parse(labelInfo)
- var textInfo = resLabelInfo["type"]
- var html_labelFile = ''
- for (var i=0;i${textInfo[i]}`
-
-
- }
- document.getElementById("labellist").innerHTML=html_labelFile
- setColor()
- }
- else{
- return
- }
-
-}
-function setColor(){
- colorinfo1 = ['rgba(0, 199, 255, 0.4)','rgba(114, 46, 209, 0.4)','rgba(188, 100, 164, 0.4)','rgba(153, 204, 0, 0.4)','rgba(51, 204, 153, 0.4)','rgba(255, 204, 51, 0.4)',
- 'rgba(71, 255, 71, 0.4)','rgba(255, 154, 71, 0.4)','rgba(71, 126, 255, 0.4)','rgba(71, 255, 255, 0.4)','rgba(255, 247, 71, 0.4)','rgba(196, 127, 255, 0.4)','rgba(233, 84, 100, 0.4)',
- 'rgba(255, 71, 204, 0.4)',' rgba(43, 199, 160, 0.4)']
- colorinfo2 = ['#00C7FF','#722ED1','#BC64A4','#99CC00','#33CC99','#FFCC33','#47FF47','#FF9A47','#477EFF','#47FFFF','#FFF747','#C47FFF','#E95464','#FF47CC','#2BC7A0']
- var el_span = document.querySelectorAll("span.labelInfo")
- for (var i=0;i {
+ var eleObj = $(item);
+ var data = eleObj.data('data');
+ if ((data.ParenDir + data.FileName) == (self.currentFile.ParenDir + self.currentFile.FileName)) {
+ eleObj.addClass('active');
+ self.renderPreview(data);
+ }
+ })
+ };
-}
-function getLabelInfo(uuid){
- $.ajax({
- type:"GET",
- url:ip + "/getlabelinfo",
- headers: {
- authorization:token,
- },
- dataType:"text",
- data:{
- 'uuid':uuid
- },
- async:false,
- success:function(json){
- labelInfo = json;
- },
- error:function(response) {
-
+ DatasetPreview.prototype.eventInit = function () {
+ var self = this;
+ $('#filelist').on('click', '.file-item', function () {
+ var eleObj = $(this);
+ var file = eleObj.data('data');
+ if (file.IsDir) {
+ self.nextDirs(file);
+ } else {
+ $('#filelist .file-item').removeClass('active');
+ eleObj.addClass('active');
+ self.currentFile = file;
+ self.renderPreview(file);
}
- });
+ }).on('click', '.file-more', function () {
+ self.getPathChildrenMore();
+ });
+ $('#file_path_container').on('click', '.section', function () {
+ var eleObj = $(this).parent();
+ var pathData = eleObj.data('data');
+ var index = self.data.filePath.findIndex(function (item) { return item.path == pathData.path });
+ var newPath = self.data.filePath.slice(0, index + 1);
+ self.data.filePath = newPath;
+ self.getPathChildren();
+ });
+ $('#myCanvas_div').on('click', '.prev_view_btn', function () {
+ self.offsetPrview(-1);
+ }).on('click', '.next_view_btn', function () {
+ self.offsetPrview(1);
+ });
+ };
-}
\ No newline at end of file
+ $(document).ready(function () {
+ window.DatasetPreviewController = new DatasetPreview();
+ })
+})();
diff --git a/routers/ai_task/ai_task.go b/routers/ai_task/ai_task.go
index d065b6321d..bbfbc095c3 100644
--- a/routers/ai_task/ai_task.go
+++ b/routers/ai_task/ai_task.go
@@ -2,6 +2,10 @@ package ai_task
import (
"archive/zip"
+ "net/http"
+ "net/url"
+ "strings"
+
"code.gitea.io/gitea/entity"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/cloudbrain"
@@ -13,9 +17,7 @@ import (
"code.gitea.io/gitea/routers/response"
"code.gitea.io/gitea/services/ai_task_service/schedule"
"code.gitea.io/gitea/services/ai_task_service/task"
- "net/http"
- "net/url"
- "strings"
+ "code.gitea.io/gitea/services/cloudbrain/resource"
)
func CreateAITask(ctx *context.Context, form entity.CreateReq) {
@@ -385,6 +387,47 @@ func GetNodeInfo(ctx *context.Context) {
ctx.JSON(http.StatusOK, response.OuterSuccessWithData(m))
}
+func GetImageInfoBySelectedSpec(ctx *context.Context) {
+ jobType := ctx.Query("job_type")
+
+ if models.JobType(jobType) == (models.JobTypeOnlineInference) {
+ jobType = string(models.JobTypeDebug)
+ }
+ log.Info("required jobType=" + jobType)
+ computeSourceName := ctx.Query("compute_source")
+ clusterType := ctx.Query("cluster_type")
+
+ computeSource := models.GetComputeSourceInstance(computeSourceName)
+ specId := ctx.QueryInt64("spec_id")
+ hasInternet := ctx.QueryInt("has_internet")
+
+ spec, err := resource.GetAndCheckSpec(ctx.User.ID, specId, models.FindSpecsOptions{
+ JobType: models.JobType(jobType),
+ ComputeResource: computeSourceName,
+ Cluster: clusterType,
+ HasInternet: models.SpecInternetQuery(hasInternet),
+ })
+
+ if err != nil || spec == nil {
+ ctx.JSON(http.StatusOK, response.OuterTrBizError(response.SPEC_NOT_AVAILABLE, ctx))
+ return
+ }
+
+ result, bizerr := task.GetAvailableImageInfoBySpec(entity.GetAITaskCreationImageInfoReq{
+ ClusterType: entity.ClusterType(clusterType),
+ ComputeSource: computeSource,
+ Spec: spec,
+ JobType: models.JobType(jobType),
+ UserID: ctx.User.ID,
+ })
+ if bizerr != nil {
+ log.Error("GetAITaskImageCreationInfo error,err=%v", bizerr)
+ ctx.JSON(http.StatusOK, response.OuterTrBizError(bizerr, ctx))
+ return
+ }
+ ctx.JSON(http.StatusOK, response.OuterSuccessWithData(result))
+}
+
func GetCreationRequiredInfo(ctx *context.Context) {
jobType := ctx.Query("job_type")
var isOnlineType bool
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index c820a3b738..a7b6b9f277 100755
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -59,10 +59,11 @@
package v1
import (
- "code.gitea.io/gitea/routers/reward/point"
"net/http"
"strings"
+ "code.gitea.io/gitea/routers/reward/point"
+
"code.gitea.io/gitea/services/memory"
"code.gitea.io/gitea/routers/response"
@@ -657,6 +658,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Post("/restart", reqWeChatStandard(), reqRepoWriter(models.UnitTypeCloudBrain), reqAITaskInRepo(), reqAdminOrAITaskCreator(), ai_task.RestartAITask)
m.Get("/debug_url", reqWeChatStandard(), reqRepoWriter(models.UnitTypeCloudBrain), reqAITaskInRepo(), ai_task.GetNotebookUrl)
m.Get("/creation/required", reqWeChatStandard(), reqRepoWriter(models.UnitTypeCloudBrain), ai_task.GetCreationRequiredInfo)
+ m.Get("/creation/image_by_spec", reqWeChatStandard(), reqRepoWriter(models.UnitTypeCloudBrain), ai_task.GetImageInfoBySelectedSpec)
m.Post("/output/reschedule", reqRepoWriter(models.UnitTypeCloudBrain), ai_task.RetryModelSchedule)
}, reqToken(), context.RepoRef())
@@ -758,14 +760,17 @@ func RegisterRoutes(m *macaron.Macaron) {
}, reqToken())
m.Group("/attachments", func() {
-
m.Get("/:uuid", repo.GetAttachment)
m.Get("/get_chunks", repo.GetSuccessChunks)
m.Get("/new_multipart", repo.NewMultipart)
m.Get("/get_multipart_url", repo.GetMultipartUploadUrl)
m.Post("/complete_multipart", repo.CompleteMultipart)
-
}, reqToken())
+ m.Group("/attachments", func() {
+ m.Get("/get_dir", repo.GetAttachmentDir)
+ m.Get("/get_image_content", repo.GetAttachmentImageContent)
+ m.Get("/get_txt_content", repo.GetAttachmentTxtContent)
+ })
m.Group("/attachments/model", func() {
m.Get("/get_chunks", repo.GetModelChunks)
m.Get("/new_multipart", repo.NewModelMultipart)
@@ -852,6 +857,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("/cloudbrainboard/cloudbrain/resource_queues", repo.GetResourceQueues)
m.Get("/cloudbrainboard/ai_center_overview", repo.GetCloubrainOverviewGroupByAiCenter)
m.Get("/cloudbrainboard/location", cloudbrainService.GetCloudbrainLocationInfo)
+ m.Get("/cloudbrainboard/card_data", repo.GetCartStatisticData)
m.Group("/cloudbrainboard", func() {
m.Get("/downloadAll", repo.DownloadCloudBrainBoard)
diff --git a/routers/api/v1/repo/attachments.go b/routers/api/v1/repo/attachments.go
index 413b367685..e092dcc9a9 100644
--- a/routers/api/v1/repo/attachments.go
+++ b/routers/api/v1/repo/attachments.go
@@ -54,6 +54,18 @@ func checkDatasetPermission(ctx *context.APIContext) string {
return ""
}
+func GetAttachmentDir(ctx *context.APIContext) {
+ routeRepo.GetDirSomeFiles(ctx.Context)
+}
+
+func GetAttachmentImageContent(ctx *context.APIContext) {
+ routeRepo.GetImageContent(ctx.Context)
+}
+
+func GetAttachmentTxtContent(ctx *context.APIContext) {
+ routeRepo.GetTxtContent(ctx.Context)
+}
+
func NewMultipart(ctx *context.APIContext) {
if errStr := checkDatasetPermission(ctx); errStr != "" {
ctx.JSON(200, map[string]string{
diff --git a/routers/api/v1/repo/cloudbrain.go b/routers/api/v1/repo/cloudbrain.go
index c5b2b5a88c..df1a6c1ca9 100755
--- a/routers/api/v1/repo/cloudbrain.go
+++ b/routers/api/v1/repo/cloudbrain.go
@@ -492,13 +492,14 @@ func GetCloudbrainTask(ctx *context.APIContext) {
if job.IsNewAITask() {
jobAfter, _ := task.UpdateCloudbrain(job)
ctx.JSON(http.StatusOK, map[string]interface{}{
- "ID": ID,
- "JobName": jobAfter.JobName,
- "JobStatus": jobAfter.Status,
- "SubState": "",
- "CreatedTime": jobAfter.CreatedUnix.Format("2006-01-02 15:04:05"),
- "CompletedTime": jobAfter.UpdatedUnix.Format("2006-01-02 15:04:05"),
- "JobDuration": jobAfter.TrainJobDuration,
+ "ID": ID,
+ "JobName": jobAfter.JobName,
+ "JobStatus": jobAfter.Status,
+ "DetailedStatus": jobAfter.DetailedStatus,
+ "SubState": "",
+ "CreatedTime": jobAfter.CreatedUnix.Format("2006-01-02 15:04:05"),
+ "CompletedTime": jobAfter.UpdatedUnix.Format("2006-01-02 15:04:05"),
+ "JobDuration": jobAfter.TrainJobDuration,
})
return
}
@@ -507,13 +508,14 @@ func GetCloudbrainTask(ctx *context.APIContext) {
routerRepo.GetAiSafetyTaskByJob(job)
job, err = models.GetCloudbrainByID(ID)
ctx.JSON(http.StatusOK, map[string]interface{}{
- "ID": ID,
- "JobName": job.JobName,
- "JobStatus": job.Status,
- "SubState": "",
- "CreatedTime": job.CreatedUnix.Format("2006-01-02 15:04:05"),
- "CompletedTime": job.UpdatedUnix.Format("2006-01-02 15:04:05"),
- "JobDuration": job.TrainJobDuration,
+ "ID": ID,
+ "JobName": job.JobName,
+ "JobStatus": job.Status,
+ "DetailedStatus": job.DetailedStatus,
+ "SubState": "",
+ "CreatedTime": job.CreatedUnix.Format("2006-01-02 15:04:05"),
+ "CompletedTime": job.UpdatedUnix.Format("2006-01-02 15:04:05"),
+ "JobDuration": job.TrainJobDuration,
})
} else {
jobAfter, err := cloudbrainTask.SyncCloudBrainOneStatus(job)
@@ -525,13 +527,14 @@ func GetCloudbrainTask(ctx *context.APIContext) {
}
ctx.JSON(http.StatusOK, map[string]interface{}{
- "ID": ID,
- "JobName": jobAfter.JobName,
- "JobStatus": jobAfter.Status,
- "SubState": "",
- "CreatedTime": jobAfter.CreatedUnix.Format("2006-01-02 15:04:05"),
- "CompletedTime": jobAfter.UpdatedUnix.Format("2006-01-02 15:04:05"),
- "JobDuration": jobAfter.TrainJobDuration,
+ "ID": ID,
+ "JobName": jobAfter.JobName,
+ "JobStatus": jobAfter.Status,
+ "DetailedStatus": jobAfter.DetailedStatus,
+ "SubState": "",
+ "CreatedTime": jobAfter.CreatedUnix.Format("2006-01-02 15:04:05"),
+ "CompletedTime": jobAfter.UpdatedUnix.Format("2006-01-02 15:04:05"),
+ "JobDuration": jobAfter.TrainJobDuration,
})
}
}
diff --git a/routers/api/v1/repo/cloudbrain_dashboard.go b/routers/api/v1/repo/cloudbrain_dashboard.go
index b0d1432228..430f0d22f3 100755
--- a/routers/api/v1/repo/cloudbrain_dashboard.go
+++ b/routers/api/v1/repo/cloudbrain_dashboard.go
@@ -9,6 +9,8 @@ import (
"strings"
"time"
+ "code.gitea.io/gitea/routers/response"
+
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/setting"
@@ -937,6 +939,7 @@ func GetCloudbrainsDetailData(ctx *context.Context) {
taskDetail.JobName = ciTasks[i].JobName
taskDetail.DisplayJobName = ciTasks[i].DisplayJobName
taskDetail.Status = ciTasks[i].Status
+ taskDetail.DetailedStatus = ciTasks[i].DetailedStatus
taskDetail.JobType = ciTasks[i].JobType
taskDetail.CreatedUnix = ciTasks[i].Cloudbrain.CreatedUnix
taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration
@@ -959,7 +962,7 @@ func GetCloudbrainsDetailData(ctx *context.Context) {
taskDetail.CardDuration = repo.GetCloudbrainCardDuration(ciTasks[i].Cloudbrain)
taskDetail.WaitTime = repo.GetCloudbrainWaitTime(ciTasks[i].Cloudbrain)
- if ciTasks[i].Cloudbrain.DeletedAt != nilTime || ciTasks[i].Repo == nil {
+ if ciTasks[i].Cloudbrain.DeletedAt != nilTime {
taskDetail.IsDelete = true
} else {
taskDetail.IsDelete = false
@@ -980,6 +983,28 @@ func GetCloudbrainsDetailData(ctx *context.Context) {
})
}
+func GetCartStatisticData(ctx *context.Context) {
+
+ dataType := ctx.QueryTrim("type")
+ category := ctx.QueryTrim("category")
+
+ if _, ok := models.XpuInfoType[dataType]; !ok {
+ ctx.Error(http.StatusBadRequest)
+ return
+ }
+ if _, ok := models.XpuInfoCategories[category]; !ok {
+ ctx.Error(http.StatusBadRequest)
+ return
+ }
+
+ result, err := models.GetXPUStatisticInfos(models.XpuInfoType[dataType], category)
+ if err != nil {
+ log.Error("can not get statistic info", err)
+ ctx.JSON(http.StatusOK, response.OuterSuccessWithData([]*models.XPUInfoStatisticShow{}))
+ }
+ ctx.JSON(http.StatusOK, response.OuterSuccessWithData(result))
+}
+
func GetCloudbrainsCreateHoursData(ctx *context.Context) {
recordCloudbrain, err := models.GetRecordBeginTime()
if err != nil {
diff --git a/routers/api/v1/repo/modelarts.go b/routers/api/v1/repo/modelarts.go
index 125c3fa0d8..9a13668a69 100755
--- a/routers/api/v1/repo/modelarts.go
+++ b/routers/api/v1/repo/modelarts.go
@@ -66,11 +66,12 @@ func GetModelArtsNotebook2(ctx *context.APIContext) {
}
ctx.JSON(http.StatusOK, map[string]interface{}{
- "ID": ID,
- "JobName": job.JobName,
- "JobStatus": job.Status,
- "JobDuration": job.TrainJobDuration,
- "StartTime": job.StartTime,
+ "ID": ID,
+ "JobName": job.JobName,
+ "JobStatus": job.Status,
+ "JobDuration": job.TrainJobDuration,
+ "StartTime": job.StartTime,
+ "DetailedStatus": job.DetailedStatus,
})
}
@@ -143,11 +144,12 @@ func GetModelArtsTrainJobVersion(ctx *context.APIContext) {
}
aiCenterName = cloudbrainService.GetAiCenterShow(job.AiCenter, ctx.Context)
ctx.JSON(http.StatusOK, map[string]interface{}{
- "JobID": jobID,
- "JobStatus": job.Status,
- "JobDuration": job.TrainJobDuration,
- "AiCenter": aiCenterName,
- "StartTime": job.StartTime,
+ "JobID": jobID,
+ "JobStatus": job.Status,
+ "DetailedStatus": job.DetailedStatus,
+ "JobDuration": job.TrainJobDuration,
+ "AiCenter": aiCenterName,
+ "StartTime": job.StartTime,
})
return
}
@@ -208,11 +210,12 @@ func GetModelArtsTrainJobVersion(ctx *context.APIContext) {
}
ctx.JSON(http.StatusOK, map[string]interface{}{
- "JobID": jobID,
- "JobStatus": job.Status,
- "JobDuration": job.TrainJobDuration,
- "AiCenter": aiCenterName,
- "StartTime": job.StartTime,
+ "JobID": jobID,
+ "JobStatus": job.Status,
+ "JobDuration": job.TrainJobDuration,
+ "AiCenter": aiCenterName,
+ "StartTime": job.StartTime,
+ "DetailedStatus": job.DetailedStatus,
})
}
diff --git a/routers/home.go b/routers/home.go
index 7a8a0de2af..3a113d47ad 100755
--- a/routers/home.go
+++ b/routers/home.go
@@ -56,7 +56,8 @@ const (
tplRepoSearch base.TplName = "explore/repos/search"
tplRoshmci base.TplName = "explore/ros-hmci"
- tplExploreCenterMap base.TplName = "explore/center_map"
+ tplExploreCenterMap base.TplName = "explore/center_map"
+ tplExploreDomestic base.TplName = "explore/domestic"
)
// Home render home page
@@ -820,6 +821,10 @@ func ExploreImages(ctx *context.Context) {
ctx.HTML(200, tplExploreImages)
}
+func ExploreDomestic(ctx *context.Context) {
+ ctx.HTML(200, tplExploreDomestic)
+}
+
func ExploreDataAnalysisUserTrend(ctx *context.Context) {
ctx.Data["url_params"] = "UserTrend"
ctx.HTML(200, tplExploreExploreDataAnalysis)
diff --git a/routers/org/teams.go b/routers/org/teams.go
index 17c424578b..9097aefe5e 100644
--- a/routers/org/teams.go
+++ b/routers/org/teams.go
@@ -6,6 +6,7 @@
package org
import (
+ "fmt"
"net/http"
"path"
"strings"
@@ -310,18 +311,37 @@ func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) {
}
t.Description = form.Description
if t.Authorize < models.AccessModeOwner {
- var units = make([]models.TeamUnit, 0, len(form.Units))
- for _, tp := range form.Units {
- units = append(units, models.TeamUnit{
- OrgID: t.OrgID,
- TeamID: t.ID,
- Type: tp,
- })
- }
- err := models.UpdateTeamUnits(t, units)
- if err != nil {
- ctx.Error(http.StatusInternalServerError, "LoadIssue", err.Error())
- return
+ log.Info("t.Authorize < models.AccessModeOwner")
+ if t.Authorize < models.AccessModeAdmin {
+ var units = make([]models.TeamUnit, 0, len(form.Units))
+ for _, tp := range form.Units {
+ units = append(units, models.TeamUnit{
+ OrgID: t.OrgID,
+ TeamID: t.ID,
+ Type: tp,
+ })
+ }
+ err := models.UpdateTeamUnits(t, units)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadIssue", err.Error())
+ return
+ }
+ } else {
+ log.Info("t.Authorize = models.AccessModeAdmin")
+
+ var units = make([]models.TeamUnit, 0, len(models.AllRepoUnitTypes))
+ for _, tp := range models.AllRepoUnitTypes {
+ units = append(units, models.TeamUnit{
+ OrgID: t.OrgID,
+ TeamID: t.ID,
+ Type: tp,
+ })
+ }
+ err := models.UpdateTeamUnits(t, units)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadIssue", err.Error())
+ return
+ }
}
}
t.CanCreateOrgRepo = form.CanCreateOrgRepo
@@ -335,7 +355,7 @@ func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) {
ctx.RenderWithErr(ctx.Tr("form.team_no_units_error"), tplTeamNew, &form)
return
}
-
+ log.Info("isAuthChanged=" + fmt.Sprint(isAuthChanged) + " isIncludeAllChanged=" + fmt.Sprint(isIncludeAllChanged))
if err := models.UpdateTeam(t, isAuthChanged, isIncludeAllChanged); err != nil {
ctx.Data["Err_TeamName"] = true
switch {
diff --git a/routers/repo/attachment_dir.go b/routers/repo/attachment_dir.go
new file mode 100644
index 0000000000..82e0074f82
--- /dev/null
+++ b/routers/repo/attachment_dir.go
@@ -0,0 +1,368 @@
+package repo
+
+import (
+ "bufio"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io"
+ "path"
+ "strings"
+ "time"
+
+ "golang.org/x/text/encoding/simplifiedchinese"
+
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/context"
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/redis/redis_client"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/storage"
+)
+
+type DirRedisCache struct {
+ DirList []storage.FileInfo
+ Marker string
+}
+
+func GetDirSomeFiles(ctx *context.Context) {
+ uuid := ctx.Query("uuid")
+ marker := ctx.Query("marker")
+ pageSize := ctx.QueryInt("pageSize")
+ prefix := ctx.Query("prefix")
+ cacheKey := uuid + prefix + marker + " " + fmt.Sprint(pageSize)
+ //delimiter := ctx.Query("delimiter")
+ attach, err := models.GetAttachmentByUUID(uuid)
+ if err == nil {
+ cacheResult, err := getAttachmentDirFromCache(cacheKey)
+ if err == nil {
+ log.Info("load from cache.")
+ ctx.JSON(200, map[string]interface{}{
+ "result_code": "0",
+ "data": cacheResult.DirList,
+ "marker": cacheResult.Marker,
+ })
+ return
+ }
+ if attach.Type == models.TypeCloudBrainOne {
+ re, marker, err := storage.GetDirsSomeFileMinio(setting.Attachment.Minio.Bucket,
+ setting.Attachment.Minio.BasePath+
+ models.AttachmentRelativePath(attach.UUID)+
+ attach.UUID, prefix, marker, pageSize)
+ if err == nil {
+ setAttachmentDirToCache(cacheKey, DirRedisCache{
+ DirList: re,
+ Marker: marker,
+ })
+ ctx.JSON(200, map[string]interface{}{
+ "result_code": "0",
+ "data": re,
+ "marker": marker,
+ })
+ return
+ }
+ } else if attach.Type == models.TypeCloudBrainTwo {
+ re, marker, err := storage.GetDirsSomeFile(setting.Bucket,
+ setting.BasePath+
+ models.AttachmentRelativePath(attach.UUID)+
+ attach.UUID, prefix, marker, pageSize)
+ if err == nil {
+ setAttachmentDirToCache(cacheKey, DirRedisCache{
+ DirList: re,
+ Marker: marker,
+ })
+ ctx.JSON(200, map[string]interface{}{
+ "result_code": "0",
+ "data": re,
+ "marker": marker,
+ })
+ return
+ }
+ }
+ }
+ ctx.JSON(200, map[string]interface{}{
+ "result_code": "-1",
+ "data": "",
+ })
+}
+
+func GetImageContent(ctx *context.Context) {
+ uuid := ctx.Query("uuid")
+ fileName := ctx.Query("filePath")
+ storageType := ctx.QueryInt("type")
+ if storageType == 0 {
+ getMinioImageContent(uuid, fileName, ctx)
+ } else {
+ if storageType == 1 {
+ getObsImageContent(uuid, fileName, ctx)
+ }
+ }
+}
+
+func GetTxtContent(ctx *context.Context) {
+ uuid := ctx.Query("uuid")
+ fileName := ctx.Query("filePath")
+ storageType := ctx.QueryInt("type")
+ if storageType == 0 {
+ getMinioTxtContent(uuid, fileName, ctx)
+ } else {
+ if storageType == 1 {
+ getObsTxtContent(uuid, fileName, ctx)
+ }
+ }
+}
+
+func getObsImageContent(uuid string, fileName string, ctx *context.Context) {
+ objectName := strings.TrimPrefix(path.Join(setting.BasePath+models.AttachmentRelativePath(uuid)+uuid, fileName), "/")
+ //log.Info("obs objectName=" + objectName)
+ body, err := storage.ObsDownloadAFile(setting.Bucket, objectName)
+ if err != nil {
+ log.Info("upload error.")
+ } else {
+ defer body.Close()
+ ctx.Resp.Header().Set("Content-Type", "image/jpg;charset=utf-8")
+ p := make([]byte, 1024)
+ var readErr error
+ var readCount int
+ // 读取对象内容
+ for {
+ readCount, readErr = body.Read(p)
+ if readCount > 0 {
+ ctx.Resp.Write(p[:readCount])
+ }
+ if readErr != nil {
+ break
+ }
+ }
+ }
+}
+
+func getObsTxtContent(uuid string, fileName string, ctx *context.Context) {
+ objectName := strings.TrimPrefix(path.Join(setting.BasePath+models.AttachmentRelativePath(uuid)+uuid, fileName), "/")
+ //log.Info("obs objectName=" + objectName)
+ body, err := storage.ObsDownloadAFile(setting.Bucket, objectName)
+ if err != nil {
+ log.Info("download error.")
+ ctx.JSON(200, map[string]interface{}{
+ "result_code": "-1",
+ "msg": "Read file error.",
+ "data": "",
+ })
+ return
+ } else {
+ readS3Body(body, ctx)
+ }
+}
+
+func readS3Body(body io.ReadCloser, ctx *context.Context) {
+ defer body.Close()
+ result := make([]string, 0)
+ r := bufio.NewReader(body)
+ size := 0
+ for {
+ line, err := r.ReadString('\n')
+ if err == io.EOF {
+ result = append(result, toUTF8(line))
+ size += len(line)
+ if !toDealLine(result, line, size, ctx) {
+ return
+ }
+ break
+ }
+ if err != nil {
+ log.Info("read error,err=" + err.Error())
+ break
+ }
+ result = append(result, toUTF8(line))
+ size += len(line)
+ if !toDealLine(result, line, size, ctx) {
+ return
+ }
+ }
+ ctx.JSON(200, map[string]interface{}{
+ "result_code": "0",
+ "msg": "",
+ "data": result,
+ })
+}
+
+func toDealLine(result []string, line string, size int, ctx *context.Context) bool {
+ log.Info("line count=" + fmt.Sprint(len(result)) + " size=" + fmt.Sprint(size))
+ if len(result) > 2000 || size > 2*1024*1024 {
+ ctx.JSON(200, map[string]interface{}{
+ "result_code": "-1",
+ "msg": ctx.Tr("repo.attachmentfilesizetobig"),
+ "data": "",
+ })
+ return false
+ }
+ return true
+}
+
+func toUTF8(line string) string {
+ lineBytes := []byte(line)
+ if isUtf8(lineBytes) {
+ return line
+ }
+ if isGBK(lineBytes) {
+ log.Info("this is gbk")
+ gbkBytes, err := simplifiedchinese.GBK.NewDecoder().Bytes(lineBytes) //gbk 转 utf-8
+ if err == nil {
+ return string(gbkBytes)
+ }
+ }
+ return line
+}
+
+func toGBK(line string) string {
+ lineBytes := []byte(line)
+ if !isGBK(lineBytes) {
+ gbkBytes, err := simplifiedchinese.GBK.NewEncoder().Bytes(lineBytes) //utf-8 转 gbk
+ if err == nil {
+ return string(gbkBytes)
+ }
+ }
+ return line
+}
+
+func isGBK(data []byte) bool {
+ length := len(data)
+ var i int = 0
+ for i < length {
+ //fmt.Printf("for %x\n", data[i])
+ if data[i] <= 0xff {
+ //编码小于等于127,只有一个字节的编码,兼容ASCII吗
+ i++
+ continue
+ } else {
+ //大于127的使用双字节编码
+ if data[i] >= 0x81 &&
+ data[i] <= 0xfe &&
+ data[i+1] >= 0x40 &&
+ data[i+1] <= 0xfe &&
+ data[i+1] != 0xf7 {
+ i += 2
+ continue
+ } else {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+func getMinioImageContent(uuid string, fileName string, ctx *context.Context) {
+ objectName := strings.TrimPrefix(path.Join(setting.Attachment.Minio.BasePath+models.AttachmentRelativePath(uuid)+uuid, fileName), "/")
+ //log.Info("minio objectName=" + objectName)
+ body, err := storage.Attachments.DownloadAFile(setting.Attachment.Minio.Bucket, objectName)
+ if err != nil {
+ log.Info("download error.")
+ } else {
+ defer body.Close()
+ ctx.Resp.Header().Set("Content-Type", "image/jpg;charset=utf-8")
+ p := make([]byte, 1024)
+ var readErr error
+ var readCount int
+ // 读取对象内容
+ for {
+ readCount, readErr = body.Read(p)
+ if readCount > 0 {
+ ctx.Resp.Write(p[:readCount])
+ }
+ if readErr != nil {
+ break
+ }
+ }
+ }
+}
+
+func getMinioTxtContent(uuid string, fileName string, ctx *context.Context) {
+ objectName := strings.TrimPrefix(path.Join(setting.Attachment.Minio.BasePath+models.AttachmentRelativePath(uuid)+uuid, fileName), "/")
+ //log.Info("minio objectName=" + objectName)
+ body, err := storage.Attachments.DownloadAFile(setting.Attachment.Minio.Bucket, objectName)
+ if err != nil {
+ log.Info("download error.")
+ ctx.JSON(200, map[string]interface{}{
+ "result_code": "-1",
+ "msg": "Read file error.",
+ "data": "",
+ })
+ return
+ } else {
+ readS3Body(body, ctx)
+ }
+}
+
+func preNUm(data byte) int {
+ str := fmt.Sprintf("%b", data)
+ var i int = 0
+ for i < len(str) {
+ if str[i] != '1' {
+ break
+ }
+ i++
+ }
+ return i
+}
+
+func isUtf8(data []byte) bool {
+ for i := 0; i < len(data); {
+ if data[i]&0x80 == 0x00 {
+ // 0XXX_XXXX
+ i++
+ continue
+ } else if num := preNUm(data[i]); num > 2 {
+ // 110X_XXXX 10XX_XXXX
+ // 1110_XXXX 10XX_XXXX 10XX_XXXX
+ // 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
+ // 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
+ // 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
+ // preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数
+ i++
+ for j := 0; j < num-1; j++ {
+ //判断后面的 num - 1 个字节是不是都是10开头
+ if data[i]&0xc0 != 0x80 {
+ return false
+ }
+ i++
+ }
+ } else {
+ //其他情况说明不是utf-8
+ return false
+ }
+ }
+ return true
+}
+
+func setAttachmentDirToCache(msgKey string, dirList DirRedisCache) {
+ msgMapJson, _ := json.Marshal(dirList)
+ redisValue := string(msgMapJson)
+ log.Info("set redis key=" + msgKey + " value=" + redisValue)
+ re, err := redis_client.Setex(msgKey, redisValue, 7*24*3600*time.Second)
+ if err == nil {
+ log.Info("re =" + fmt.Sprint(re))
+ } else {
+ log.Info("set redis error:" + err.Error())
+ }
+}
+
+func getAttachmentDirFromCache(msgKey string) (*DirRedisCache, error) {
+ valueStr, err := redis_client.Get(msgKey)
+ //msgMap := make(map[string]string, 0)
+ fileInfos := &DirRedisCache{}
+ if err == nil {
+ if valueStr != "" {
+ err1 := json.Unmarshal([]byte(valueStr), fileInfos)
+ if err1 != nil {
+ log.Info("unmarshal json failed. " + err1.Error())
+ return nil, err1
+ }
+ } else {
+ return nil, errors.New("cache is empty.")
+ }
+ } else {
+ log.Info("Failed to load from reids. " + err.Error())
+ return nil, err
+ }
+ return fileInfos, nil
+}
diff --git a/routers/repo/dir.go b/routers/repo/dir.go
index 81549e76ac..fbd91bf0db 100755
--- a/routers/repo/dir.go
+++ b/routers/repo/dir.go
@@ -127,6 +127,7 @@ func DirIndex(ctx *context.Context) {
ctx.Data["Path"] = dirArray
ctx.Data["Dirs"] = true
ctx.Data["Uuid"] = uuid
+ ctx.Data["Type"] = attachment.Type
ctx.Data["PageIsDataset"] = true
ctx.HTML(200, tplDirIndex)
diff --git a/routers/repo/download.go b/routers/repo/download.go
index f1b6e09b75..7a1c25bf85 100755
--- a/routers/repo/download.go
+++ b/routers/repo/download.go
@@ -43,7 +43,7 @@ func ServeData(ctx *context.Context, name string, reader io.Reader) error {
cs = "utf-8"
}
ctx.Resp.Header().Set("Content-Type", "text/plain; charset="+strings.ToLower(cs))
- } else if base.IsImageFile(buf) || base.IsPDFFile(buf) {
+ } else if base.IsImageFile(buf) {
ctx.Resp.Header().Set("Content-Disposition", fmt.Sprintf(`inline; filename="%s"`, name))
} else {
ctx.Resp.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, name))
diff --git a/routers/repo/grampus.go b/routers/repo/grampus.go
index ab9961ffba..42e5583db3 100755
--- a/routers/repo/grampus.go
+++ b/routers/repo/grampus.go
@@ -1356,13 +1356,14 @@ func GetGrampusNotebook(ctx *context.APIContext) {
}
ctx.JSON(http.StatusOK, map[string]interface{}{
- "ID": ID,
- "JobName": jobAfter.JobName,
- "JobStatus": jobAfter.Status,
- "AiCenter": aiCenterName,
- "CreatedTime": jobAfter.CreatedUnix.Format("2006-01-02 15:04:05"),
- "CompletedTime": jobAfter.UpdatedUnix.Format("2006-01-02 15:04:05"),
- "JobDuration": jobAfter.TrainJobDuration,
+ "ID": ID,
+ "JobName": jobAfter.JobName,
+ "JobStatus": jobAfter.Status,
+ "DetailedStatus": jobAfter.DetailedStatus,
+ "AiCenter": aiCenterName,
+ "CreatedTime": jobAfter.CreatedUnix.Format("2006-01-02 15:04:05"),
+ "CompletedTime": jobAfter.UpdatedUnix.Format("2006-01-02 15:04:05"),
+ "JobDuration": jobAfter.TrainJobDuration,
})
}
diff --git a/routers/response/response_list.go b/routers/response/response_list.go
index e37673b269..9a3b0c671c 100644
--- a/routers/response/response_list.go
+++ b/routers/response/response_list.go
@@ -37,3 +37,5 @@ var BRANCH_NOT_EXISTS = &BizError{Code: 2020, DefaultMsg: "The branch does not e
var MODEL_NUM_OVER_LIMIT = &BizError{Code: 2021, DefaultMsg: "The number of models exceeds the limit of 30", TrCode: "repo.debug.manage.model_num_over_limit"}
var DATASET_NUMBER_OVER_LIMIT = &BizError{Code: 2022, DefaultMsg: "The dataset count exceed the limit", TrCode: "ai_task.dataset_number_over_limit"}
var NOTEBOOK_EXCEED_MAX_NUM = &BizError{Code: 2023, DefaultMsg: "You can have up to 5 Debug Tasks, please try again after delete some tasks. ", TrCode: "ai_task.too_many_notebook"}
+var CAN_NOT_STOP_CREATING_JOB = &BizError{Code: 2024, DefaultMsg: "AI task is creating, can not be stopped", TrCode: "ai_task.can_not_stop_creating_job"}
+var NO_CENTER_MATCH = &BizError{Code: 2024, DefaultMsg: "", TrCode: "ai_task.no_center_match"}
diff --git a/routers/routes/routes.go b/routers/routes/routes.go
index 1c21f7c8fa..3938eb4ba2 100755
--- a/routers/routes/routes.go
+++ b/routers/routes/routes.go
@@ -431,6 +431,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("/data_analysis/Overview", routers.ExploreDataAnalysisOverview)
m.Get("/data_analysis/BrainAnalysis", routers.ExploreDataAnalysisBrainAnalysis)
m.Get("/center_map", reqSignIn, routers.CenterMapUI)
+ m.Get("/domestic", routers.ExploreDomestic)
}, ignSignIn)
m.Combo("/install", routers.InstallInit).Get(routers.Install).
diff --git a/services/ai_task_service/cluster/c2net.go b/services/ai_task_service/cluster/c2net.go
index 581e4535f0..d099f2c20a 100644
--- a/services/ai_task_service/cluster/c2net.go
+++ b/services/ai_task_service/cluster/c2net.go
@@ -59,7 +59,7 @@ func (c C2NetClusterAdapter) CreateOnlineInfer(req entity.CreateNoteBookTaskRequ
return convertGrampus2NoteBookRes(jobResult), nil
}
-func (c C2NetClusterAdapter) GetNotebookImages(req entity.GetImageReq) ([]entity.ClusterImage, bool, error) {
+func (c C2NetClusterAdapter) GetNotebookImages(req entity.GetImageReq, centerId ...string) ([]entity.ClusterImage, bool, error) {
processType := req.ComputeSource.FullName
images, err := grampus.GetImages(processType, string(req.JobType))
if err != nil {
@@ -69,15 +69,37 @@ func (c C2NetClusterAdapter) GetNotebookImages(req entity.GetImageReq) ([]entity
if images == nil || images.Infos == nil || len(images.Infos) == 0 {
return nil, true, err
}
- r := make([]entity.ClusterImage, len(images.Infos))
- for i, v := range images.Infos {
- r[i] = ConvertGrampusImageToStandard(v)
+
+ r := make([]entity.ClusterImage, 0)
+ for _, v := range images.Infos {
+ if hasIntersection(v.AICenterImage, centerId...) {
+ r = append(r, ConvertGrampusImageToStandard(v))
+ }
+ }
+ if len(r) == 0 {
+ return nil, false, nil
}
+
return r, false, nil
}
-func (c C2NetClusterAdapter) GetTrainImages(req entity.GetImageReq) ([]entity.ClusterImage, bool, error) {
- return c.GetNotebookImages(req)
+func hasIntersection(imageCenterInfos []models.AICenterImage, centerId ...string) bool {
+ if len(centerId) == 0 || len(imageCenterInfos) == 0 {
+ //如果没传centerId或者查询的镜像不含可用中心信息,不进行判断,直接返回true
+ return true
+ }
+ for _, aicenterImage := range imageCenterInfos {
+ for _, centerCode := range centerId {
+ if aicenterImage.AICenterID == centerCode {
+ return true
+ }
+ }
+ }
+ return false
+}
+
+func (c C2NetClusterAdapter) GetTrainImages(req entity.GetImageReq, centerId ...string) ([]entity.ClusterImage, bool, error) {
+ return c.GetNotebookImages(req, centerId...)
}
func ConvertGrampusImageToStandard(image models.GrampusImage) entity.ClusterImage {
@@ -658,12 +680,13 @@ func convertGrampusTrainJobResponse(job models.GrampusJobInfo) *entity.QueryTask
centerName = task.CenterName[0]
}
return &entity.QueryTaskResponse{
- StartedAt: timeutil.TimeStamp(job.StartedAt),
- CompletedAt: timeutil.TimeStamp(job.CompletedAt),
- Status: job.Status,
- CenterId: centerId,
- CenterName: centerName,
- JobId: job.JobID,
+ StartedAt: timeutil.TimeStamp(job.StartedAt),
+ CompletedAt: timeutil.TimeStamp(job.CompletedAt),
+ Status: job.Status,
+ DetailedStatus: job.DetailedStatus,
+ CenterId: centerId,
+ CenterName: centerName,
+ JobId: job.JobID,
}
}
diff --git a/services/ai_task_service/cluster/cloudbrain_one.go b/services/ai_task_service/cluster/cloudbrain_one.go
index f43b9902b8..cef48dd279 100644
--- a/services/ai_task_service/cluster/cloudbrain_one.go
+++ b/services/ai_task_service/cluster/cloudbrain_one.go
@@ -37,11 +37,11 @@ func (c CloudbrainOneClusterAdapter) CreateOnlineInfer(req entity.CreateNoteBook
return nil, nil
}
-func (c CloudbrainOneClusterAdapter) GetNotebookImages(req entity.GetImageReq) ([]entity.ClusterImage, bool, error) {
+func (c CloudbrainOneClusterAdapter) GetNotebookImages(req entity.GetImageReq, centerId ...string) ([]entity.ClusterImage, bool, error) {
return nil, true, nil
}
-func (c CloudbrainOneClusterAdapter) GetTrainImages(req entity.GetImageReq) ([]entity.ClusterImage, bool, error) {
+func (c CloudbrainOneClusterAdapter) GetTrainImages(req entity.GetImageReq, centerId ...string) ([]entity.ClusterImage, bool, error) {
return c.GetNotebookImages(req)
}
diff --git a/services/ai_task_service/cluster/cloudbrain_two.go b/services/ai_task_service/cluster/cloudbrain_two.go
index 6991504d12..95bbe77930 100644
--- a/services/ai_task_service/cluster/cloudbrain_two.go
+++ b/services/ai_task_service/cluster/cloudbrain_two.go
@@ -52,13 +52,19 @@ func (c CloudbrainTwoClusterAdapter) CreateNoteBook(req entity.CreateNoteBookTas
WorkspaceID: "0",
})
} else {
+ var poolId = poolInfos.PoolInfo[0].PoolId
+ for _, poolInfo := range poolInfos.PoolInfo {
+ if poolInfo.PoolName == t.Spec.QueueCode {
+ poolId = poolInfo.PoolId
+ }
+ }
jobResult, err = cloudbrain_two.CreateNotebook2(models.CreateNotebook2Params{
JobName: req.Name,
Description: req.Description,
Flavor: t.Spec.SourceSpecId,
Duration: t.AutoStopDuration,
ImageID: t.ImageId,
- PoolID: poolInfos.PoolInfo[0].PoolId,
+ PoolID: poolId,
Feature: models.NotebookFeature,
Volume: models.VolumeReq{
Capacity: setting.Capacity,
@@ -82,7 +88,7 @@ func (c CloudbrainTwoClusterAdapter) CreateOnlineInfer(req entity.CreateNoteBook
var cloudbrainTwoNotebookImages []entity.ClusterImage
-func (c CloudbrainTwoClusterAdapter) GetNotebookImages(req entity.GetImageReq) ([]entity.ClusterImage, bool, error) {
+func (c CloudbrainTwoClusterAdapter) GetNotebookImages(req entity.GetImageReq, centerId ...string) ([]entity.ClusterImage, bool, error) {
if cloudbrainTwoNotebookImages == nil || len(cloudbrainTwoNotebookImages) == 0 {
images := setting.StImageInfos.ImageInfo
cloudbrainTwoNotebookImages = make([]entity.ClusterImage, len(images))
@@ -99,7 +105,7 @@ func (c CloudbrainTwoClusterAdapter) GetNotebookImages(req entity.GetImageReq) (
var cloudbrainTwoTrainImages []entity.ClusterImage
-func (c CloudbrainTwoClusterAdapter) GetTrainImages(req entity.GetImageReq) ([]entity.ClusterImage, bool, error) {
+func (c CloudbrainTwoClusterAdapter) GetTrainImages(req entity.GetImageReq, centerId ...string) ([]entity.ClusterImage, bool, error) {
if cloudbrainTwoTrainImages == nil || len(cloudbrainTwoTrainImages) == 0 {
var versionInfos modelarts.VersionInfo
if err := json.Unmarshal([]byte(setting.EngineVersions), &versionInfos); err != nil {
diff --git a/services/ai_task_service/cluster/cluster_base.go b/services/ai_task_service/cluster/cluster_base.go
index ce66e16629..e877dfa2ad 100644
--- a/services/ai_task_service/cluster/cluster_base.go
+++ b/services/ai_task_service/cluster/cluster_base.go
@@ -48,7 +48,7 @@ type ClusterAdapter interface {
GetResourceUsage(opts entity.ClusterResourceUsageOpts) (*entity.ResourceUsage, error)
//GetImages return available list of clusters
//The second parameter will return true if image is no limit
- GetNotebookImages(req entity.GetImageReq) ([]entity.ClusterImage, bool, error)
- GetTrainImages(req entity.GetImageReq) ([]entity.ClusterImage, bool, error)
+ GetNotebookImages(req entity.GetImageReq, centerId ...string) ([]entity.ClusterImage, bool, error)
+ GetTrainImages(req entity.GetImageReq, centerId ...string) ([]entity.ClusterImage, bool, error)
CreateOnlineInfer(req entity.CreateNoteBookTaskRequest) (*entity.CreateNoteBookTaskResponse, error)
}
diff --git a/services/ai_task_service/task/cloudbrain_one_notebook_task.go b/services/ai_task_service/task/cloudbrain_one_notebook_task.go
index 701da0c47f..db1f67ca56 100644
--- a/services/ai_task_service/task/cloudbrain_one_notebook_task.go
+++ b/services/ai_task_service/task/cloudbrain_one_notebook_task.go
@@ -133,6 +133,16 @@ func (g CloudbrainOneNotebookTaskTemplate) CallCreationAPI(ctx *context.Creation
return response.SYSTEM_ERROR
}
form := ctx.Request
+
+ centerIds, bizErr := GetAvailableCenterIds(ctx.Spec, models.GetAvailableCenterIdOpts{
+ UserId: ctx.User.ID,
+ JobType: g.JobType,
+ HasInternet: form.HasInternet,
+ }, form.ComputeSource, form.ImageID, g.ClusterType)
+ if bizErr != nil {
+ return bizErr
+ }
+
req := entity.CreateNoteBookTaskRequest{
Name: form.JobName,
Tasks: []entity.NoteBookTask{
@@ -147,12 +157,8 @@ func (g CloudbrainOneNotebookTaskTemplate) CallCreationAPI(ctx *context.Creation
OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
AutoStopDuration: autoStopDurationMs,
Capacity: setting.Capacity,
- CenterID: ctx.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
- UserId: ctx.User.ID,
- JobType: g.JobType,
- HasInternet: form.HasInternet,
- }),
- Spec: ctx.Spec,
+ CenterID: centerIds,
+ Spec: ctx.Spec,
},
},
}
diff --git a/services/ai_task_service/task/cloudbrain_one_train_task.go b/services/ai_task_service/task/cloudbrain_one_train_task.go
index 4a8716a71e..6d16e82d55 100644
--- a/services/ai_task_service/task/cloudbrain_one_train_task.go
+++ b/services/ai_task_service/task/cloudbrain_one_train_task.go
@@ -97,6 +97,14 @@ func (g CloudbrainOneTrainTaskTemplate) CallCreationAPI(ctx *context.CreationCon
return response.SYSTEM_ERROR
}
form := ctx.Request
+ centerIds, bizErr := GetAvailableCenterIds(ctx.Spec, models.GetAvailableCenterIdOpts{
+ UserId: ctx.User.ID,
+ JobType: g.JobType,
+ HasInternet: form.HasInternet,
+ }, form.ComputeSource, form.ImageID, g.ClusterType)
+ if bizErr != nil {
+ return bizErr
+ }
req := entity.CreateTrainTaskRequest{
Name: form.JobName,
DisplayJobName: form.DisplayJobName,
@@ -108,17 +116,13 @@ func (g CloudbrainOneTrainTaskTemplate) CallCreationAPI(ctx *context.CreationCon
ImageUrl: strings.TrimSpace(form.ImageUrl),
Datasets: ctx.GetContainerDataArray(entity.ContainerDataset),
Code: ctx.GetContainerDataArray(entity.ContainerCode),
- CenterID: ctx.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
- UserId: ctx.User.ID,
- JobType: g.JobType,
- HasInternet: form.HasInternet,
- }),
- PreTrainModel: ctx.GetContainerDataArray(entity.ContainerPreTrainModel),
- BootFile: form.BootFile,
- OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
- LogPath: ctx.GetContainerDataArray(entity.ContainerLogPath),
- Params: form.ParamArray,
- Spec: ctx.Spec,
+ CenterID: centerIds,
+ PreTrainModel: ctx.GetContainerDataArray(entity.ContainerPreTrainModel),
+ BootFile: form.BootFile,
+ OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
+ LogPath: ctx.GetContainerDataArray(entity.ContainerLogPath),
+ Params: form.ParamArray,
+ Spec: ctx.Spec,
},
},
}
@@ -142,6 +146,14 @@ func (g CloudbrainOneTrainTaskTemplate) CallRestartAPI(ctx *context.CreationCont
return response.SYSTEM_ERROR
}
form := ctx.Request
+ centerIds, bizErr := GetAvailableCenterIds(ctx.Spec, models.GetAvailableCenterIdOpts{
+ UserId: ctx.User.ID,
+ JobType: g.JobType,
+ HasInternet: form.HasInternet,
+ }, form.ComputeSource, form.ImageID, g.ClusterType)
+ if bizErr != nil {
+ return bizErr
+ }
req := entity.CreateTrainTaskRequest{
Name: form.JobName,
DisplayJobName: form.DisplayJobName,
@@ -153,16 +165,12 @@ func (g CloudbrainOneTrainTaskTemplate) CallRestartAPI(ctx *context.CreationCont
ImageUrl: strings.TrimSpace(form.ImageUrl),
Datasets: ctx.GetContainerDataArray(entity.ContainerDataset),
Code: ctx.GetContainerDataArray(entity.ContainerCode),
- CenterID: ctx.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
- UserId: ctx.User.ID,
- JobType: g.JobType,
- HasInternet: form.HasInternet,
- }),
- PreTrainModel: ctx.GetContainerDataArray(entity.ContainerPreTrainModel),
- BootFile: form.BootFile,
- OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
- Params: form.ParamArray,
- Spec: ctx.Spec,
+ CenterID: centerIds,
+ PreTrainModel: ctx.GetContainerDataArray(entity.ContainerPreTrainModel),
+ BootFile: form.BootFile,
+ OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
+ Params: form.ParamArray,
+ Spec: ctx.Spec,
},
},
}
diff --git a/services/ai_task_service/task/cloudbrain_two_train_task.go b/services/ai_task_service/task/cloudbrain_two_train_task.go
index 071c925658..57fa0f1e93 100644
--- a/services/ai_task_service/task/cloudbrain_two_train_task.go
+++ b/services/ai_task_service/task/cloudbrain_two_train_task.go
@@ -115,24 +115,28 @@ func (g CloudbrainTwoTrainTaskTemplate) CallCreationAPI(ctx *context.CreationCon
}
}
form := ctx.Request
+ centerIds, bizErr := GetAvailableCenterIds(ctx.Spec, models.GetAvailableCenterIdOpts{
+ UserId: ctx.User.ID,
+ JobType: g.JobType,
+ HasInternet: form.HasInternet,
+ }, form.ComputeSource, form.ImageID, g.ClusterType)
+ if bizErr != nil {
+ return bizErr
+ }
req := entity.CreateTrainTaskRequest{
Name: form.JobName,
DisplayJobName: form.DisplayJobName,
Description: form.Description,
Tasks: []entity.TrainTask{
{
- Name: form.JobName,
- ResourceSpecId: ctx.Spec.SourceSpecId,
- ImageId: form.ImageID,
- ImageUrl: strings.TrimSpace(form.ImageUrl),
- Datasets: ctx.GetContainerDataArray(entity.ContainerDataset),
- Code: ctx.GetContainerDataArray(entity.ContainerCode),
- LogPath: ctx.GetContainerDataArray(entity.ContainerLogPath),
- CenterID: ctx.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
- UserId: ctx.User.ID,
- JobType: g.JobType,
- HasInternet: form.HasInternet,
- }),
+ Name: form.JobName,
+ ResourceSpecId: ctx.Spec.SourceSpecId,
+ ImageId: form.ImageID,
+ ImageUrl: strings.TrimSpace(form.ImageUrl),
+ Datasets: ctx.GetContainerDataArray(entity.ContainerDataset),
+ Code: ctx.GetContainerDataArray(entity.ContainerCode),
+ LogPath: ctx.GetContainerDataArray(entity.ContainerLogPath),
+ CenterID: centerIds,
PreTrainModel: ctx.GetContainerDataArray(entity.ContainerPreTrainModel),
BootFile: form.BootFile,
OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
diff --git a/services/ai_task_service/task/grampus_notebook_task.go b/services/ai_task_service/task/grampus_notebook_task.go
index 3648735d92..85868fd149 100644
--- a/services/ai_task_service/task/grampus_notebook_task.go
+++ b/services/ai_task_service/task/grampus_notebook_task.go
@@ -199,6 +199,14 @@ func (g GrampusNoteBookTaskTemplate) CallCreationAPI(ctx *context.CreationContex
return response.SYSTEM_ERROR
}
form := ctx.Request
+ centerIds, bizErr := GetAvailableCenterIds(ctx.Spec, models.GetAvailableCenterIdOpts{
+ UserId: ctx.User.ID,
+ JobType: g.JobType,
+ HasInternet: form.HasInternet,
+ }, form.ComputeSource, form.ImageID, g.ClusterType)
+ if bizErr != nil {
+ return bizErr
+ }
imageUrl := strings.TrimSpace(form.ImageUrl)
if form.ImageID != "" {
imageUrl = ""
@@ -215,12 +223,8 @@ func (g GrampusNoteBookTaskTemplate) CallCreationAPI(ctx *context.CreationContex
Code: ctx.GetContainerDataArray(entity.ContainerCode),
AutoStopDuration: autoStopDurationMs,
Capacity: setting.Capacity,
- CenterID: ctx.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
- UserId: ctx.User.ID,
- JobType: g.JobType,
- HasInternet: form.HasInternet,
- }),
- Spec: ctx.Spec,
+ CenterID: centerIds,
+ Spec: ctx.Spec,
},
},
}
diff --git a/services/ai_task_service/task/grampus_online_infer_task.go b/services/ai_task_service/task/grampus_online_infer_task.go
index cbcfbf26ab..f65e00930a 100644
--- a/services/ai_task_service/task/grampus_online_infer_task.go
+++ b/services/ai_task_service/task/grampus_online_infer_task.go
@@ -95,6 +95,14 @@ func (g GrampusOnlineInferTaskTemplate) CallCreationAPI(ctx *context.CreationCon
return response.SYSTEM_ERROR
}
form := ctx.Request
+ centerIds, bizErr := GetAvailableCenterIds(ctx.Spec, models.GetAvailableCenterIdOpts{
+ UserId: ctx.User.ID,
+ JobType: g.JobType,
+ HasInternet: form.HasInternet,
+ }, form.ComputeSource, form.ImageID, g.ClusterType)
+ if bizErr != nil {
+ return bizErr
+ }
imageUrl := strings.TrimSpace(form.ImageUrl)
if form.ImageID != "" {
imageUrl = ""
@@ -119,13 +127,9 @@ func (g GrampusOnlineInferTaskTemplate) CallCreationAPI(ctx *context.CreationCon
OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
AutoStopDuration: -1,
Capacity: setting.Capacity,
- CenterID: ctx.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
- UserId: ctx.User.ID,
- JobType: g.JobType,
- HasInternet: form.HasInternet,
- }),
- Spec: ctx.Spec,
- BootFile: ctx.Request.BootFile,
+ CenterID: centerIds,
+ Spec: ctx.Spec,
+ BootFile: ctx.Request.BootFile,
},
},
}
diff --git a/services/ai_task_service/task/grampus_train_task.go b/services/ai_task_service/task/grampus_train_task.go
index fe47a1cfd1..7c676cbcdb 100644
--- a/services/ai_task_service/task/grampus_train_task.go
+++ b/services/ai_task_service/task/grampus_train_task.go
@@ -131,6 +131,14 @@ func (g GrampusTrainTaskTemplate) CallCreationAPI(ctx *context.CreationContext)
return response.SYSTEM_ERROR
}
form := ctx.Request
+ centerIds, bizErr := GetAvailableCenterIds(ctx.Spec, models.GetAvailableCenterIdOpts{
+ UserId: ctx.User.ID,
+ JobType: g.JobType,
+ HasInternet: form.HasInternet,
+ }, form.ComputeSource, form.ImageID, g.ClusterType)
+ if bizErr != nil {
+ return bizErr
+ }
imageUrl := strings.TrimSpace(form.ImageUrl)
if form.ImageID != "" {
imageUrl = ""
@@ -140,17 +148,13 @@ func (g GrampusTrainTaskTemplate) CallCreationAPI(ctx *context.CreationContext)
DisplayJobName: form.DisplayJobName,
Tasks: []entity.TrainTask{
{
- Name: form.JobName,
- ResourceSpecId: ctx.Spec.SourceSpecId,
- ImageId: form.ImageID,
- ImageUrl: imageUrl,
- Datasets: ctx.GetContainerDataArray(entity.ContainerDataset),
- Code: ctx.GetContainerDataArray(entity.ContainerCode),
- CenterID: ctx.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
- UserId: ctx.User.ID,
- JobType: g.JobType,
- HasInternet: form.HasInternet,
- }),
+ Name: form.JobName,
+ ResourceSpecId: ctx.Spec.SourceSpecId,
+ ImageId: form.ImageID,
+ ImageUrl: imageUrl,
+ Datasets: ctx.GetContainerDataArray(entity.ContainerDataset),
+ Code: ctx.GetContainerDataArray(entity.ContainerCode),
+ CenterID: centerIds,
PreTrainModel: ctx.GetContainerDataArray(entity.ContainerPreTrainModel),
BootFile: form.BootFile,
OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
@@ -182,6 +186,14 @@ func (g GrampusTrainTaskTemplate) CallRestartAPI(ctx *context.CreationContext) *
return response.SYSTEM_ERROR
}
form := ctx.Request
+ centerIds, bizErr := GetAvailableCenterIds(ctx.Spec, models.GetAvailableCenterIdOpts{
+ UserId: ctx.User.ID,
+ JobType: g.JobType,
+ HasInternet: form.HasInternet,
+ }, form.ComputeSource, form.ImageID, g.ClusterType)
+ if bizErr != nil {
+ return bizErr
+ }
req := entity.CreateTrainTaskRequest{
Name: form.JobName,
DisplayJobName: form.DisplayJobName,
@@ -193,16 +205,12 @@ func (g GrampusTrainTaskTemplate) CallRestartAPI(ctx *context.CreationContext) *
ImageUrl: strings.TrimSpace(form.ImageUrl),
Datasets: ctx.GetContainerDataArray(entity.ContainerDataset),
Code: ctx.GetContainerDataArray(entity.ContainerCode),
- CenterID: ctx.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
- UserId: ctx.User.ID,
- JobType: g.JobType,
- HasInternet: form.HasInternet,
- }),
- PreTrainModel: ctx.GetContainerDataArray(entity.ContainerPreTrainModel),
- BootFile: form.BootFile,
- OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
- Params: form.ParamArray,
- Spec: ctx.Spec,
+ CenterID: centerIds,
+ PreTrainModel: ctx.GetContainerDataArray(entity.ContainerPreTrainModel),
+ BootFile: form.BootFile,
+ OutPut: ctx.GetContainerDataArray(entity.ContainerOutPutPath),
+ Params: form.ParamArray,
+ Spec: ctx.Spec,
},
},
}
diff --git a/services/ai_task_service/task/opt_handler.go b/services/ai_task_service/task/opt_handler.go
index d2d8338bf7..5937bce3b1 100644
--- a/services/ai_task_service/task/opt_handler.go
+++ b/services/ai_task_service/task/opt_handler.go
@@ -692,7 +692,7 @@ func (g DefaultCreationHandler) NotifyCreation(ctx *context.CreationContext) *re
func (DefaultCreationHandler) CheckNotebookCount(ctx *context.CreationContext) *response.BizError {
- if setting.NotebookStrategy.ClearEnabled && ctx.Request.JobType == models.JobTypeDebug {
+ if ctx.Request.JobType == models.JobTypeDebug {
count, err := models.GetNotebooksCountByUser(ctx.User.ID)
if err != nil {
log.Warn("can not get user notebook count", err)
diff --git a/services/ai_task_service/task/super_compute_task.go b/services/ai_task_service/task/super_compute_task.go
index d32fd8a3fd..06be39028f 100644
--- a/services/ai_task_service/task/super_compute_task.go
+++ b/services/ai_task_service/task/super_compute_task.go
@@ -29,7 +29,7 @@ func init() {
RegisterTask(models.JobTypeSuperCompute, entity.C2Net, t)
}
-func (g SuperComputeTaskTemplate) GetImages(computeSource models.ComputeSource) ([]entity.ClusterImage, bool, *response.BizError) {
+func (g SuperComputeTaskTemplate) GetImages(computeSource models.ComputeSource, centerId ...string) ([]entity.ClusterImage, bool, *response.BizError) {
c := g.GetMyCluster()
if c == nil {
log.Error("Get cluster failed")
diff --git a/services/ai_task_service/task/task_base.go b/services/ai_task_service/task/task_base.go
index 9f62eba2cf..6bce1e7bc9 100644
--- a/services/ai_task_service/task/task_base.go
+++ b/services/ai_task_service/task/task_base.go
@@ -60,7 +60,7 @@ type AITaskTemplate interface {
GetDebugUrl(cloudbrainId int64, fileName ...string) (string, *response.BizError)
GetOperationProfile(cloudbrainId int64) (*entity.OperationProfile, *response.BizError)
GetResourceUsage(opts entity.GetResourceUsageOpts) (*entity.ResourceUsage, *response.BizError)
- GetImages(computeSource models.ComputeSource) ([]entity.ClusterImage, bool, *response.BizError)
+ GetImages(computeSource models.ComputeSource, centerId ...string) ([]entity.ClusterImage, bool, *response.BizError)
GetSpecs(opts entity.GetSpecOpts) ([]*api.SpecificationShow, *response.BizError)
GetConfig(opts entity.AITaskConfigKey) *entity.AITaskBaseConfig
GetNodeInfo(cloudbrainId int64) ([]entity.AITaskNodeInfo, *response.BizError)
@@ -237,6 +237,10 @@ func (g DefaultAITaskTemplate) Stop(cloudbrainId int64) (*entity.AITaskBriefInfo
}
if err != nil {
+ log.Error("StopTask err.cloudbrainId=%d err=%v", cloudbrainId, err)
+ if models.IsErrCannotStopCreatingGrampusJob(err) {
+ return nil, response.CAN_NOT_STOP_CREATING_JOB
+ }
log.Error("StopTask err.cloudbrainId=%d err=%v", cloudbrainId, err)
return nil, response.NewBizError(err)
}
@@ -456,7 +460,7 @@ func (g DefaultAITaskTemplate) GetResourceUsage(opts entity.GetResourceUsageOpts
return res, nil
}
-func (g DefaultAITaskTemplate) GetImages(computeSource models.ComputeSource) ([]entity.ClusterImage, bool, *response.BizError) {
+func (g DefaultAITaskTemplate) GetImages(computeSource models.ComputeSource, centerId ...string) ([]entity.ClusterImage, bool, *response.BizError) {
c := g.GetMyCluster()
if c == nil {
log.Error("Get cluster failed")
@@ -470,12 +474,12 @@ func (g DefaultAITaskTemplate) GetImages(computeSource models.ComputeSource) ([]
images, customFlag, err = c.GetNotebookImages(entity.GetImageReq{
ComputeSource: computeSource,
JobType: g.JobType,
- })
+ }, centerId...)
} else {
images, customFlag, err = c.GetTrainImages(entity.GetImageReq{
ComputeSource: computeSource,
JobType: g.JobType,
- })
+ }, centerId...)
}
if err != nil {
log.Error("GetImages err.computeSource=%s err =%v", computeSource.Name, err)
diff --git a/services/ai_task_service/task/task_creation_info.go b/services/ai_task_service/task/task_creation_info.go
index 53560b4d85..82d67bf244 100644
--- a/services/ai_task_service/task/task_creation_info.go
+++ b/services/ai_task_service/task/task_creation_info.go
@@ -55,11 +55,6 @@ func GetAITaskCreationInfo(req entity.GetAITaskCreationInfoReq) (*entity.Creatio
//生成任务名称
result.DisplayJobName = t.GetDisplayJobName(req.User.Name)
- // 查询镜像列表
- if images, canUseAll, err := t.GetImages(*req.ComputeSource); err == nil {
- result.Images = images
- result.CanUseAllImages = canUseAll
- }
specsMap := make(map[string][]*structs.SpecificationShow, 0)
//查询有网资源规格
if specs, err := t.GetSpecs(entity.GetSpecOpts{
@@ -85,6 +80,12 @@ func GetAITaskCreationInfo(req entity.GetAITaskCreationInfoReq) (*entity.Creatio
specsMap["all"] = specs
}
result.Specs = specsMap
+ // 查询镜像列表
+ if images, canUseAll, err := t.GetImages(*req.ComputeSource); err == nil {
+ result.Images = images
+ result.CanUseAllImages = canUseAll
+ }
+
result.Config = entity.AITaskCreationConfig{
DatasetMaxSize: setting.DebugAttachSize * 1000 * 1000 * 1000,
}
@@ -96,3 +97,24 @@ func GetAITaskCreationInfo(req entity.GetAITaskCreationInfoReq) (*entity.Creatio
}
return result, nil
}
+
+func GetAvailableImageInfoBySpec(req entity.GetAITaskCreationImageInfoReq) (*entity.ImageRequiredInfo, *response.BizError) {
+ result := &entity.ImageRequiredInfo{}
+ t, err := GetAITaskTemplate(req.JobType, req.ClusterType)
+
+ if err != nil {
+ log.Error("param error")
+ return nil, err
+ }
+ centerIds := req.Spec.GetAvailableCenterIds(models.GetAvailableCenterIdOpts{
+ UserId: req.UserID,
+ JobType: req.JobType,
+ })
+
+ if images, canUseAll, err := t.GetImages(*req.ComputeSource, centerIds...); err == nil {
+ result.Images = images
+ result.CanUseAllImages = canUseAll
+ }
+ return result, nil
+
+}
diff --git a/services/ai_task_service/task/task_extend.go b/services/ai_task_service/task/task_extend.go
index f4b1f89a53..ec11d4f464 100644
--- a/services/ai_task_service/task/task_extend.go
+++ b/services/ai_task_service/task/task_extend.go
@@ -96,6 +96,7 @@ func getCloudBrainDatasetInfo4Local(uuid string, datasetname string, isNeedDown
link := ""
url := ""
isDelete := false
+ var size int64
attachment, err := models.GetAttachmentByUUID(uuidStr)
if err != nil {
log.Error("GetAttachmentByUUID failed:%v", err.Error())
@@ -106,6 +107,7 @@ func getCloudBrainDatasetInfo4Local(uuid string, datasetname string, isNeedDown
isDelete = true
} else {
name = attachment.Name
+ size = attachment.Size
dataset, err := models.GetDatasetByID(attachment.DatasetID)
if err != nil {
log.Error("GetDatasetByID failed:%v", err.Error())
@@ -128,6 +130,7 @@ func getCloudBrainDatasetInfo4Local(uuid string, datasetname string, isNeedDown
RepositoryLink: link,
IsDelete: isDelete,
UUID: uuidStr,
+ Size: size,
})
}
log.Info("dataset length=" + fmt.Sprint(len(datasetDownload)))
diff --git a/services/ai_task_service/task/task_service.go b/services/ai_task_service/task/task_service.go
index a1ef16fe46..f7a41d6b8c 100644
--- a/services/ai_task_service/task/task_service.go
+++ b/services/ai_task_service/task/task_service.go
@@ -11,6 +11,7 @@ import (
"strings"
"code.gitea.io/gitea/entity"
+ "code.gitea.io/gitea/manager/client/grampus"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/convert"
"code.gitea.io/gitea/modules/git"
@@ -100,6 +101,7 @@ func buildAITaskInfo(task *models.Cloudbrain, creator *models.User, config *enti
ID: task.ID,
JobID: task.JobID,
Status: task.Status,
+ DetailedStatus: task.DetailedStatus,
JobType: task.JobType,
DisplayJobName: task.DisplayJobName,
FormattedDuration: task.TrainJobDuration,
@@ -240,6 +242,8 @@ func StopAITaskByJobNameFromRemote(task *models.Cloudbrain, queryFunc QueryListF
return nil
}
+const DEFAULT_DETAILED_STATUS = "-"
+
func UpdateByQueryResponse(res *entity.QueryTaskResponse, task *models.Cloudbrain) error {
if res.JobId == "" {
return nil
@@ -260,6 +264,10 @@ func UpdateByQueryResponse(res *entity.QueryTaskResponse, task *models.Cloudbrai
newStatus := TransAITaskStatus(res.Status)
task.Status = newStatus
+ task.DetailedStatus = res.DetailedStatus
+ if res.DetailedStatus == "" || res.DetailedStatus == res.Status {
+ task.DetailedStatus = DEFAULT_DETAILED_STATUS
+ }
if res.StartedAt > 0 {
task.StartTime = res.StartedAt
}
@@ -722,6 +730,49 @@ func SyncAITaskStatus() {
}
}
}
+func GetAvailableCenterIds(specification *models.Specification, opts models.GetAvailableCenterIdOpts, computeSource *models.ComputeSource,
+ imageId string, clusterType entity.ClusterType) ([]string, *response.BizError) {
+ centerIds := specification.GetAvailableCenterIds(opts)
+
+ if len(centerIds) == 0 || imageId == "" || clusterType != entity.C2Net {
+ return centerIds, nil
+ }
+
+ processType := computeSource.FullName
+ images, err := grampus.GetImages(processType, string(opts.JobType))
+ if err != nil {
+ log.Warn("can not get image info from grampus", err)
+ return centerIds, nil
+ }
+ var imageCenterIds []string
+ for _, image := range images.Infos {
+ if image.ID == imageId {
+ for _, centerInfo := range image.AICenterImage {
+ imageCenterIds = append(imageCenterIds, centerInfo.AICenterID)
+ }
+ break
+ }
+ }
+ if len(imageCenterIds) == 0 {
+ return centerIds, nil
+ }
+
+ var intersectionCenterIds []string
+ for _, centerId := range centerIds {
+ for _, imageCenterId := range imageCenterIds {
+ if centerId == imageCenterId {
+ intersectionCenterIds = append(intersectionCenterIds, centerId)
+ break
+ }
+ }
+ }
+ if len(intersectionCenterIds) == 0 {
+ return intersectionCenterIds, response.NO_CENTER_MATCH
+ }
+
+ return intersectionCenterIds, nil
+
+}
func HandleNoJobIdAITasks() {
defer func() {
diff --git a/services/cloudbrain/resource/resource_specification.go b/services/cloudbrain/resource/resource_specification.go
index 9e79689c5f..6fe1284e86 100644
--- a/services/cloudbrain/resource/resource_specification.go
+++ b/services/cloudbrain/resource/resource_specification.go
@@ -290,6 +290,7 @@ func GetAndCheckSpec(userId int64, specId int64, opts models.FindSpecsOptions) (
return nil, nil
}
opts.SpecId = specId
+ opts.HasInternet = models.QueryAllSpecs
r, err := FindAvailableSpecs(userId, opts)
log.Info("FindAvailableSpecs result=%+v", r)
if err != nil {
diff --git a/services/cloudbrain/statistic.go b/services/cloudbrain/statistic.go
new file mode 100644
index 0000000000..328d32a5b9
--- /dev/null
+++ b/services/cloudbrain/statistic.go
@@ -0,0 +1,159 @@
+package cloudbrain
+
+import (
+ "code.gitea.io/gitea/modules/util"
+
+ "time"
+
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/log"
+)
+
+var pageSize = 500
+
+func CardStatistic() {
+ sevenDayStatistic()
+ thirtyDayStatistic()
+ daysAllStatistic()
+
+}
+
+func daysAllStatistic() {
+
+ daysStatistic(0, models.TypeAllDays)
+}
+
+func sevenDayStatistic() {
+
+ daysStatistic(7, models.TypeSevenDays)
+
+}
+
+func thirtyDayStatistic() {
+
+ daysStatistic(30, models.TypeThirtyDays)
+
+}
+
+func daysStatistic(days int, statisticType int) {
+ xpuCardStatisticMap, err := getStatisticInfoMap(days, statisticType)
+ if err != nil {
+ return
+ }
+
+ updateOrInsertStatisticRecord(xpuCardStatisticMap)
+
+}
+
+func updateOrInsertStatisticRecord(xpuCardStatisticMap map[string]*models.XPUInfoStatistic) {
+ for _, v := range xpuCardStatisticMap {
+ v.UsedCardHour = v.UsedDuration / 3600
+ err := models.UpdateOrInsertXPUInfoStatistic(v)
+ if err != nil {
+ log.Warn("update or insert xpu statistic err", err)
+ }
+ }
+}
+
+func getStatisticInfoMap(days int, statisticType int, beginTime ...int64) (map[string]*models.XPUInfoStatistic, error) {
+ endTimeUnix := time.Now().Unix()
+ beginTimeUnix := time.Now().AddDate(0, 0, -days).Unix()
+ if days == 0 {
+ beginTimeUnix = 1
+ }
+ if len(beginTime) > 0 {
+ beginTimeUnix = beginTime[0]
+ }
+
+ _, count, err := models.CloudbrainAll(&models.CloudbrainsOptions{
+ ListOptions: models.ListOptions{
+ Page: 1,
+ PageSize: 1,
+ },
+ NeedRepoInfo: false,
+ BeginTimeUnix: beginTimeUnix,
+ EndTimeUnix: endTimeUnix,
+ Type: -1,
+ AccCardsNum: -1,
+ })
+ if err != nil {
+ log.Error("Get job failed:", err)
+ return nil, err
+ }
+
+ xpuInfos, err := models.GetXPUInfos()
+ if err != nil {
+ log.Error("can not get XPU base info", err)
+ return nil, err
+ }
+
+ var xpuCardStatisticMap = make(map[string]*models.XPUInfoStatistic, len(xpuInfos))
+ var xpuCardStatisticUserMap = make(map[string]map[int64]struct{}, len(xpuInfos))
+ for _, xpuInfo := range xpuInfos {
+ xpuCardStatisticMap[xpuInfo.CardType] = &models.XPUInfoStatistic{
+ InfoID: xpuInfo.ID,
+ Type: statisticType,
+ UpdatedUnix: endTimeUnix,
+ }
+ xpuCardStatisticUserMap[xpuInfo.CardType] = make(map[int64]struct{}, 0)
+ }
+
+ totalPage := util.GetTotalPage(count, pageSize)
+
+ for i := 0; i < totalPage; i++ {
+
+ ciTasks, _, err := models.CloudbrainAll(&models.CloudbrainsOptions{
+ ListOptions: models.ListOptions{
+ Page: i + 1,
+ PageSize: pageSize,
+ },
+ NeedRepoInfo: false,
+ BeginTimeUnix: beginTimeUnix,
+ EndTimeUnix: endTimeUnix,
+ Type: -1,
+ AccCardsNum: -1,
+ })
+ if err != nil {
+ log.Error("Get job failed:", err)
+ return nil, err
+ }
+ err = models.LoadSpecs4CloudbrainInfo(ciTasks)
+ if err != nil {
+ log.Error("can not load spec info", err)
+ return nil, err
+ }
+
+ for _, task := range ciTasks {
+ if task.Spec != nil {
+ if v, ok := xpuCardStatisticMap[task.Spec.AccCardType]; ok {
+ v.TaskCount += 1
+ if calculateCardDuration(task.Cloudbrain) > 0 {
+ v.UsedDuration += calculateCardDuration(task.Cloudbrain)
+ }
+ if _, found := xpuCardStatisticUserMap[task.Spec.AccCardType][task.UserID]; !found {
+
+ v.UserCount += 1
+ xpuCardStatisticUserMap[task.Spec.AccCardType][task.UserID] = struct{}{}
+ }
+ }
+
+ }
+
+ }
+
+ }
+ return xpuCardStatisticMap, nil
+}
+
+func calculateCardDuration(task models.Cloudbrain) int64 {
+
+ cardNum := task.Spec.AccCardsNum
+
+ var workServerNumber int64
+ if task.WorkServerNumber >= 1 {
+ workServerNumber = int64(task.WorkServerNumber)
+ } else {
+ workServerNumber = 1
+ }
+ return workServerNumber * int64(cardNum) * task.Duration
+}
diff --git a/templates/admin/cloudbrain/list.tmpl b/templates/admin/cloudbrain/list.tmpl
index ec858379ac..4199b92fc2 100755
--- a/templates/admin/cloudbrain/list.tmpl
+++ b/templates/admin/cloudbrain/list.tmpl
@@ -46,7 +46,7 @@
{{$.i18n.Tr "repo.modelarts.cluster"}}
-
+
{{$.i18n.Tr "repo.modelarts.status"}}
@@ -62,11 +62,11 @@
{{$.i18n.Tr "repo.modelarts.computing_resources"}}
-
+
{{$.i18n.Tr "repo.modelarts.ai_center"}}
-
+
{{$.i18n.Tr "repo.modelarts.card_type"}}
@@ -153,14 +153,16 @@
+ style="width: 8% !important;">
- {{.Status}}
+ data-cloudbrainid="{{.Cloudbrain.ID}}" data-datamigrate='{{$.i18n.Tr "repo.migratingData"}}' data-centerpend='{{$.i18n.Tr "repo.centerPending"}}'>
+
+
+ {{.Status}}
+ {{if eq .Status "WAITING"}}{{end}}
+
@@ -184,11 +186,11 @@
style="font-size: 12px;" title="{{.ComputeResource}}">{{if .ComputeResource}}{{.ComputeResource}}{{else}}--{{end}}
-
+
{{if .AiCenter}}{{.AiCenter}}{{else}}--{{end}}
-
+
+{{template "base/footer" .}}
diff --git a/templates/repo/datasets/dirs/dir_preview.tmpl b/templates/repo/datasets/dirs/dir_preview.tmpl
index 04553efb68..50e335bfee 100644
--- a/templates/repo/datasets/dirs/dir_preview.tmpl
+++ b/templates/repo/datasets/dirs/dir_preview.tmpl
@@ -1,212 +1,97 @@
{{if .Dirs}}
-
-
-
-
+
+
+
+
+
{{.i18n.Tr "dataset.see_more"}}
+
+
+
+
+ - {{.i18n.Tr "dataset.file_list"}}
+
+
-
-
-
-
-
+
+
+
+
+
+
+
{{.i18n.Tr "dataset.file_not_support_preview"}}
+
+
+
{{.i18n.Tr "dataset.please_select_file_preview"}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
0-
0/
0
-
第1页
-
跳到页
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
{{end}}
diff --git a/templates/repo/datasets/dirs/index.tmpl b/templates/repo/datasets/dirs/index.tmpl
index 1609f18a38..cf725b6258 100755
--- a/templates/repo/datasets/dirs/index.tmpl
+++ b/templates/repo/datasets/dirs/index.tmpl
@@ -1,22 +1,33 @@
{{template "base/head" .}}
{{template "repo/header" .}}
+
-
-
-
-
{{template "base/footer" .}}
diff --git a/templates/user/dashboard/cloudbrains.tmpl b/templates/user/dashboard/cloudbrains.tmpl
index a48a50be52..fa245f1838 100755
--- a/templates/user/dashboard/cloudbrains.tmpl
+++ b/templates/user/dashboard/cloudbrains.tmpl
@@ -141,10 +141,12 @@
data-repopath='{{.Repo.OwnerName}}/{{.Repo.Name}}{{if eq .JobType "DEBUG" "ONLINEINFERENCE" "HPC"}}{{if eq .Cloudbrain.Type 2}}/grampus/notebook{{else}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}{{end}}{{else if eq .JobType "INFERENCE"}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts{{end}}/inference-job{{else if eq .JobType "TRAIN"}}{{if eq .ComputeResource "NPU"}}/modelarts/train-job{{else}}/cloudbrain/train-job{{end}}{{else if eq .JobType "BENCHMARK" "MODELSAFETY"}}/cloudbrain{{end}}'
data-jobid="{{$JobID}}" data-version="{{.VersionName}}"
data-cloudbrainid="{{.Cloudbrain.ID}}"
- data-bootfile="{{.BootFile}}">
-
{{.Status}}
+ data-bootfile="{{.BootFile}}" data-datamigrate='{{$.i18n.Tr "repo.migratingData"}}' data-centerpend='{{$.i18n.Tr "repo.centerPending"}}'>
+
+
+ {{.Status}}
+ {{if eq .Status "WAITING"}}{{end}}
+
@@ -299,7 +301,7 @@
{{if and (eq .JobType "TRAIN") (not .FineTune)}}
@@ -377,11 +379,15 @@
-
- {{.Status}}
+
+
+
+ {{.Status}}
+ {{if eq .Status "WAITING"}}{{end}}
+
diff --git a/web_src/js/features/cloudrbanin.js b/web_src/js/features/cloudrbanin.js
index 966de76eae..8116046447 100644
--- a/web_src/js/features/cloudrbanin.js
+++ b/web_src/js/features/cloudrbanin.js
@@ -13,16 +13,23 @@ 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);
+ let timeid
+ let timeidShow
+ if (document.getElementsByClassName('job-status').length!==0) {
+ timeid = window.setInterval(loadJobStatus, 15000);
+ timeidShow = window.setInterval(loadShowJobStatus, 15000);
+ }
$(document).ready(loadJobStatus);
$(document).ready(loadShowJobStatus);
function loadJobStatus() {
+ let flagStopInterval = 0
$(".job-status").each((index, job) => {
const ID = job.dataset.jobid;
const cloudbrainID = job.dataset.cloudbrainid;
if (!ID) return;
const repoPath = job.dataset.repopath;
+ const dataMigrate = job.dataset.datamigrate
+ const centerPend = job.dataset.centerpend
// const computeResource = job.dataset.resource
const versionname = job.dataset.version;
const bootfile = job.dataset.bootfile;
@@ -49,6 +56,10 @@ export default async function initCloudrain() {
"CHECK_FAILED",
];
if (finalState.includes(status_text)) {
+ flagStopInterval++
+ if (flagStopInterval === $(".job-status").length) {
+ clearInterval(timeid)
+ }
return;
}
// const diffResource = computeResource == "NPU" ? 'modelarts/notebook' : 'cloudbrain'
@@ -59,9 +70,20 @@ export default async function initCloudrain() {
const status = data.JobStatus;
const duration = data.JobDuration;
const aiCenter = data.AiCenter || '--'
+ const detailStatus = data.DetailedStatus
$("#duration-" + ID).text(duration);
data.AiCenter != undefined && $("#cluster-" + ID).text(aiCenter);
data.AiCenter != undefined && $("#" + versionname + "-ai_center").text(data.AiCenter);
+ if ( (detailStatus === 'dataMigrating' || detailStatus === 'centerPending') && status==='WAITING') {
+ if (document.getElementById(`${ID}-icon-detail`)) {
+ document.getElementById(`${ID}-icon-detail`).remove()
+ }
+ $("#" + ID + "-text").parent().append(`
`)
+ } else {
+ if (document.getElementById(`${ID}-icon-detail`)) {
+ document.getElementById(`${ID}-icon-detail`).remove()
+ }
+ }
if (status != status_text) {
$("#" + ID + "-icon")
.removeClass()
@@ -209,6 +231,7 @@ export default async function initCloudrain() {
"CREATED_FAILED",
].includes(status)
) {
+ clearInterval(timeidShow)
return;
}
let stopArray = [
@@ -400,6 +423,14 @@ export default async function initCloudrain() {
$("#ai-stop-" + ID).removeClass("blue");
$("#ai-stop-" + ID).addClass("disabled");
refreshStatus(version_name, ID, repoPath, cloudbrainID);
+ } else {
+ $(".alert")
+ .html(data.error_msg)
+ .removeClass("alert-success")
+ .addClass("alert-danger")
+ .show()
+ .delay(2000)
+ .fadeOut();
}
}).fail(function (err) {
console.log(err);
@@ -427,6 +458,19 @@ export default async function initCloudrain() {
.removeClass("disabled")
.addClass("blue");
}
+ const detailStatus = data.DetailedStatus
+ const dataMigrate = $(`${ID}`).data('datamigrate')
+ const centerPend = $(`${ID}`).data('centerpend')
+ if ((detailStatus === 'dataMigrating' || detailStatus === 'centerPending') && data.JobStatus==='WAITING') {
+ if (document.getElementById(`${ID}-icon-detail`)) {
+ document.getElementById(`${ID}-icon-detail`).remove()
+ }
+ $("#" + ID + "-text").parent().append(`
`)
+ } else {
+ if (document.getElementById(`${ID}-icon-detail`)) {
+ document.getElementById(`${ID}-icon-detail`).remove()
+ }
+ }
}).fail(function (err) {
console.log(err);
});
diff --git a/web_src/js/index.js b/web_src/js/index.js
index 79843a18b3..1ff7b808ca 100755
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -2457,7 +2457,7 @@ function searchRepositories() {
$searchRepoBox.search({
minCharacters: 2,
apiSettings: {
- url: `${AppSubUrl}/api/v1/repos/search?q={query}&uid=${$searchRepoBox.data(
+ url: `${AppSubUrl}/api/v1/repos/search?_csrf=${csrf}&q={query}&uid=${$searchRepoBox.data(
"uid"
)}`,
onResponse(response) {
@@ -2711,7 +2711,7 @@ function initTemplateSearch() {
const changeOwner = function () {
$("#repo_template_search").dropdown({
apiSettings: {
- url: `${AppSubUrl}/api/v1/repos/search?q={query}&template=true&priority_owner_id=${$(
+ url: `${AppSubUrl}/api/v1/repos/search?_csrf=${csrf}&q={query}&template=true&priority_owner_id=${$(
"#uid"
).val()}`,
onResponse(response) {
diff --git a/web_src/less/openi.less b/web_src/less/openi.less
index 647d56fba9..ee48965592 100644
--- a/web_src/less/openi.less
+++ b/web_src/less/openi.less
@@ -319,6 +319,23 @@ i.INFO {
.i-bg-orange {
background-position: -495px -51px;
}
+.dataMigrating{
+ display: inline-block;
+ width: 18px;
+ height: 18px;
+ margin-left: 8px;
+ background: url("/img/icons.svg");
+ background-position: -56px -52px;
+}
+.centerPending{
+ display: inline-block;
+ width: 18px;
+ height: 18px;
+ margin-left: 8px;
+ background: url("/img/icons.svg");
+ background-position: -511px -52px;
+
+}
.FAILED,
.START_FAILED,
.DELETED,
diff --git a/web_src/vuepages/apis/modules/cloudbrain.js b/web_src/vuepages/apis/modules/cloudbrain.js
index f816226f97..26c6f27b97 100644
--- a/web_src/vuepages/apis/modules/cloudbrain.js
+++ b/web_src/vuepages/apis/modules/cloudbrain.js
@@ -15,6 +15,22 @@ export const getAiTaskPrepareInfo = (params) => {
});
}
+// 由资源规格查询可用镜像
+// params: repoOwnerName, repoName, job_type,compute_source,cluster_type,spec_id
+export const getAiTaskImgesBySpec = (params) => {
+ return service({
+ url: `/api/v1/${params.repoOwnerName}/${params.repoName}/ai_task/creation/image_by_spec`,
+ method: 'get',
+ params: {
+ job_type: params.jobType,
+ compute_source: params.computeSource,
+ cluster_type: params.clusterType,
+ spec_id: params.spec,
+ has_internet: params.hasInternet,
+ },
+ });
+}
+
// 创建AI任务
export const createAiTask = (data) => {
return service({
diff --git a/web_src/vuepages/apis/modules/domestic.js b/web_src/vuepages/apis/modules/domestic.js
new file mode 100644
index 0000000000..1faff17c2f
--- /dev/null
+++ b/web_src/vuepages/apis/modules/domestic.js
@@ -0,0 +1,14 @@
+import service from "../service";
+
+// 获取国产算力卡使用情况相关数据
+// params - type-all|7|30, category-card|user|task
+export const getDomesticCardData = (params) => {
+ return service({
+ url: `/api/v1/cloudbrainboard/card_data`,
+ method: "get",
+ params: {
+ type: params.type,
+ category: params.category,
+ }
+ });
+};
diff --git a/web_src/vuepages/components/BaseDialog.vue b/web_src/vuepages/components/BaseDialog.vue
index 8fc4f62ebb..0aaad6bcea 100644
--- a/web_src/vuepages/components/BaseDialog.vue
+++ b/web_src/vuepages/components/BaseDialog.vue
@@ -63,6 +63,7 @@ export default {
this.$emit("update:visible", false);
},
},
+ mounted() {},
};
\ No newline at end of file
diff --git a/web_src/vuepages/components/cloudbrain/ImageSelectV2.vue b/web_src/vuepages/components/cloudbrain/ImageSelectV2.vue
index b35e022148..e5ccc0a7d1 100644
--- a/web_src/vuepages/components/cloudbrain/ImageSelectV2.vue
+++ b/web_src/vuepages/components/cloudbrain/ImageSelectV2.vue
@@ -14,15 +14,21 @@
diff --git a/web_src/vuepages/pages/cloudbrain/detail/index.vue b/web_src/vuepages/pages/cloudbrain/detail/index.vue
index 2ff19a8b61..661aac0fd8 100644
--- a/web_src/vuepages/pages/cloudbrain/detail/index.vue
+++ b/web_src/vuepages/pages/cloudbrain/detail/index.vue
@@ -22,7 +22,11 @@
{{ item.task.createTimeStr }}
- {{ $t('status') }}:{{ item.task.status }}
+ {{ $t('status') }}:
+
+ {{ item.task.status }}
+
+
{{ $t('cloudbrainObj.runDuration') }}:{{ item.task.formatted_duration }}
diff --git a/web_src/vuepages/pages/cloudbrain/list/index.vue b/web_src/vuepages/pages/cloudbrain/list/index.vue
index b256ce7519..3554505161 100644
--- a/web_src/vuepages/pages/cloudbrain/list/index.vue
+++ b/web_src/vuepages/pages/cloudbrain/list/index.vue
@@ -43,6 +43,8 @@
{{ scope.row.task.status }}
+
+
diff --git a/web_src/vuepages/pages/explore/domestic/index.vue b/web_src/vuepages/pages/explore/domestic/index.vue
new file mode 100644
index 0000000000..d31b6c10ac
--- /dev/null
+++ b/web_src/vuepages/pages/explore/domestic/index.vue
@@ -0,0 +1,833 @@
+
+
+
+
启智社区国产算力英雄榜
+
本页面仅统计国产算力在启智AI协作平台的使用情况。数据更新时间:{{ updateTime }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ scope.row.countShow }}
+
+
+
+
+ {{
+ loading ? $t('loading') : $t('noData')
+ }}
+
+
+
+
+
+
启智社区国产算力合作伙伴
+
+
+
+
+
+
+
+
+
+
+
{{ card.name }}
+
+
+
+
+
+
+
+
{{ feature.title }}
+
{{ item }}
+
+
+
+
+
+ {{ card.table.title }} |
+
+
+ |
+ |
+
+
+
+
+
{{ card.useExample.title }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web_src/vuepages/pages/explore/domestic/vp-explore-domestic.js b/web_src/vuepages/pages/explore/domestic/vp-explore-domestic.js
new file mode 100644
index 0000000000..48e5425001
--- /dev/null
+++ b/web_src/vuepages/pages/explore/domestic/vp-explore-domestic.js
@@ -0,0 +1,17 @@
+import Vue from 'vue';
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import localeEn from 'element-ui/lib/locale/lang/en';
+import localeZh from 'element-ui/lib/locale/lang/zh-CN';
+import { i18n, lang } from '~/langs';
+import App from './index.vue';
+
+Vue.use(ElementUI, {
+ locale: lang === 'zh-CN' ? localeZh : localeEn,
+ size: 'small',
+});
+
+new Vue({
+ i18n,
+ render: (h) => h(App),
+}).$mount('#__vue-root');
diff --git a/web_src/vuepages/pages/supercompute/create/index.vue b/web_src/vuepages/pages/supercompute/create/index.vue
index d3605e2e37..2e49f7e7bb 100644
--- a/web_src/vuepages/pages/supercompute/create/index.vue
+++ b/web_src/vuepages/pages/supercompute/create/index.vue
@@ -46,7 +46,7 @@
+ :configs="pageCfg" :spec="state.spec" :networkType="state.networkType" :required="formCfg.imagev2.required">