From: dibs Date: Fri, 11 Jan 2013 09:16:44 +0000 (+0900) Subject: [title] Add update process in jobs page. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c4624bf8d2a2eca083c4eb46ace9529a534297f2;p=sdk%2Ftools%2Fsdk-build.git [title] Add update process in jobs page. --- diff --git a/dibs-web/app/controllers/admin_distribution_controller.rb b/dibs-web/app/controllers/admin_distribution_controller.rb index 5b16d3b..6d838c6 100644 --- a/dibs-web/app/controllers/admin_distribution_controller.rb +++ b/dibs-web/app/controllers/admin_distribution_controller.rb @@ -200,8 +200,8 @@ class AdminDistributionController < ApplicationController sync_pkg_svr_url = change_item[:SyncPkgSvrUrl] sync_pkg_svr_period = change_item[:SyncPkgSvrPeriod] sync_pkg_svr_description = change_item[:SyncPkgSvrDescription] + sync_pkg_svr = SyncPkgServer.find(:first, :conditions => ["distribution_id = ?", dist.id]) if not sync_pkg_svr_url.nil? and not sync_pkg_svr_url.empty? - sync_pkg_svr = SyncPkgServer.find(:first, :conditions => ["distribution_id = ?", dist.id]) if sync_pkg_svr.nil? sync_pkg_svr = SyncPkgServer.new end @@ -210,6 +210,9 @@ class AdminDistributionController < ApplicationController sync_pkg_svr.period = sync_pkg_svr_period sync_pkg_svr.description = sync_pkg_svr_description sync_pkg_svr.save + elsif not sync_pkg_svr.nil? and not sync_pkg_svr_url.nil? and sync_pkg_svr_url.empty? + # if sync_pkg_svr is already exist and modified sync_pkg_svr_url is empty then remove it + sync_pkg_svr.destroy end end @@ -220,4 +223,39 @@ class AdminDistributionController < ApplicationController end end + def fullBuildDistribution + change_group_list = params[:ChangeInfoList] + change_item = change_group_list[0] + errmsg = "" + + dist_name = change_item[:DistributionName] + if dist_name.nil? or dist_name.empty? then + errmsg = "Can't find [#{dist_name}] information" + render :json => { :error => errmsg }, :status => 406 + return + end + + dist = Distribution.find(:first, :conditions => ["name = ?", dist_name]) + if dist.nil? + errmsg = "Distribution[#{dist_name}] not exist" + end + + server_config = Server_config.find(:first, :conditions => ["property = \"id\""]) + if server_config.nil? + errmsg = "Server name can't find" + else + server_name = server_config.value + + if server_name.nil? or server_name.empty? + errmsg = "Server name can't find" + end + end + + if errmsg.empty? + Utils.sbi_fullbuild_command(server_name, dist_name) + render :json => { :success => "OK!" } + else + render :json => { :error=> errmsg }, :status => 406 + end + end end diff --git a/dibs-web/app/controllers/jobs_controller.rb b/dibs-web/app/controllers/jobs_controller.rb index 9d1f779..41eb70d 100644 --- a/dibs-web/app/controllers/jobs_controller.rb +++ b/dibs-web/app/controllers/jobs_controller.rb @@ -36,22 +36,57 @@ class JobsController < ApplicationController end def listAll - listQuery(params[:distribution], params[:status], params[:lastID], "", "") + listQuery("QUERY", params[:distribution], params[:status], params[:lastID], "", "") end def listSearchId - listQuery("%", "%", "%", "%", "%") + listQuery("QUERY", "%", "%", "%", "%", "%") end def listSearchUser - listQuery(params[:distribution], params[:status], params[:lastID], params[:user], "") + listQuery("QUERY", params[:distribution], params[:status], params[:lastID], params[:user], "") + end + + def listSearchGroup + listQueryGroup("QUERY", params[:distribution], params[:status], params[:lastID], params[:group]) + end + + def listSearchProject + listQueryProject("QUERY", params[:distribution], params[:status], params[:lastID], params[:project]) end def listSearchDate - listQuery(params[:distribution], params[:status], params[:lastID], "", params[:date]) + listQuery("QUERY", params[:distribution], params[:status], params[:lastID], "", params[:date]) + end + + def updateListAll + listQuery("UPDATE", params[:distribution], params[:status], params[:lastID], "", "") + end + + def updateListSearchUser + listQuery("UPDATE", params[:distribution], params[:status], params[:lastID], params[:user], "") + end + + def updateListSearchGroup + listQueryGroup("UPDATE", params[:distribution], params[:status], params[:lastID], params[:group]) end - def listQuery(distribution, status, last_id, user, date) + def updateListSearchProject + listQueryProject("UPDATE", params[:distribution], params[:status], params[:lastID], params[:project]) + end + + def updateListSearchDate + listQuery("UPDATE", params[:distribution], params[:status], params[:lastID], "", params[:date]) + end + + def queryJobInfo + job_id = params[:jobID] + end + + + def listQuery(query_type, distribution, status, last_id, user, date) + condition = "" + if(distribution == "ALL") distribution = "%" end @@ -66,13 +101,18 @@ class JobsController < ApplicationController status = "'ERROR', 'CANCELED'" end - if(last_id == "LATEST") - last_job_id = Job.maximum(:id) - if last_job_id.nil? - last_job_id = 0 + if(query_type == "QUERY") + if(last_id == "LATEST") + last_job_id = Job.maximum(:id) + if last_job_id.nil? + last_job_id = 0 + end + else + last_job_id = last_id.to_i - 1 end + condition = "jobs.id <= #{last_job_id}" else - last_job_id = last_id.to_i - 1 + condition = "jobs.id > #{last_id}" end user = user + "%" @@ -95,7 +135,7 @@ class JobsController < ApplicationController ON jobs.remote_build_server_id = remote_build_servers.id LEFT JOIN sources ON jobs.source_id = sources.id - WHERE jobs.id <= #{last_job_id} + WHERE #{condition} AND jobs.parent_job_id IS NULL AND jobs.status in (#{status}) AND users.name like '#{user}' @@ -152,11 +192,7 @@ class JobsController < ApplicationController return end - def listSearchGroup - distribution = params[:distribution] - status = params[:status] - last_id = params[:lastID] - group = params[:group] + def listQueryGroup(query_type, distribution, status, last_id, group) if(distribution == "ALL") distribution = "%" @@ -172,13 +208,18 @@ class JobsController < ApplicationController status = "'ERROR', 'CANCELED'" end - if(last_id == "LATEST") - last_job_id = Job.maximum("id") - if last_job_id.nil? - last_job_id = 0 + if(query_type == "QUERY") + if(last_id == "LATEST") + last_job_id = Job.maximum(:id) + if last_job_id.nil? + last_job_id = 0 + end + else + last_job_id = last_id.to_i - 1 end + condition = "jobs.id <= #{last_job_id}" else - last_job_id = last_id.to_i - 1 + condition = "jobs.id > #{last_id}" end group = group + "%" @@ -188,7 +229,7 @@ class JobsController < ApplicationController ELSE 'SINGLE' END AS job_attribute FROM jobs LEFT JOIN distributions ON jobs.distribution_id = distributions.id - WHERE jobs.id <= #{last_job_id} + WHERE #{condition} AND jobs.parent_job_id IS NULL AND distributions.name like '#{distribution}' AND jobs.status in (#{status}) @@ -248,12 +289,7 @@ class JobsController < ApplicationController return end - def listSearchProject - distribution = params[:distribution] - status = params[:status] - last_id = params[:lastID] - project = params[:project] - + def listQueryProject(query_type, distribution, status, last_id, project) if(distribution == "ALL") distribution = "%" end @@ -268,13 +304,18 @@ class JobsController < ApplicationController status = "'ERROR', 'CANCELED'" end - if(last_id == "LATEST") - last_job_id = Job.maximum("id") - if last_job_id.nil? - last_job_id = 0 + if(query_type == "QUERY") + if(last_id == "LATEST") + last_job_id = Job.maximum(:id) + if last_job_id.nil? + last_job_id = 0 + end + else + last_job_id = last_id.to_i - 1 end + condition = "jobs.id <= #{last_job_id}" else - last_job_id = last_id.to_i - 1 + condition = "jobs.id > #{last_id}" end project = project + "%" @@ -295,7 +336,7 @@ class JobsController < ApplicationController ON jobs.remote_build_server_id = remote_build_servers.id LEFT JOIN sources ON jobs.source_id = sources.id - WHERE jobs.id <= #{last_job_id} + WHERE #{condition} AND jobs.status IN (#{status}) AND projects.name like '#{project}' ORDER BY jobs.id DESC @@ -339,6 +380,7 @@ class JobsController < ApplicationController , DATE_FORMAT(jobs.end_time, '%Y-%m-%d %H:%i:%s') AS end_time , projects.name AS project_name , projects.ptype AS project_type + , projects.password AS project_password , users.name AS user_name , users.email AS user_email , supported_os.name AS supported_os_name @@ -418,6 +460,19 @@ class JobsController < ApplicationController puts id line = params[:line].to_i + # Get job information + job = get_job_info(id) + if job.nil? + render :text => "Not found Job ID #{id}", :status => 406 + end + + if job.job_type == "MULTIBUILD" + project_name = job.job_type + else + project_name = job.project_name + end + + # Get log file infomation file_name = "log" buildsvr_path = Server_config.find(:first, :conditions => ["property = ?", "path"]) directory = "#{buildsvr_path.value}/jobs/#{id}" @@ -462,20 +517,53 @@ class JobsController < ApplicationController #generate to XML doc = Builder::XmlMarkup.new( :target => out_string = "", :indent => 2 ) - doc.Log("Time" => timestamp, - "JobId" => id, - "Continue" => conti) { - if temp - temp.each do |data| - doc.Data(data, "Line" => line) - line = line + 1 + doc.Responser { + generate_xml_header(doc) + doc.Data { + doc.JobId(id) + doc.Distribution(job.distribution_name) + doc.Project(project_name) + doc.Builder(job.user_name) + doc.Status(job.status) + doc.Time(timestamp) + doc.Continue(conti) + if temp + temp.each do |data| + doc.LogData(data, "Line" => line) + line = line + 1 + end end - end + } } - #send_data( out_string, :type => "t) - render :text => out_string, - :content_type => "text/xml" + render :text => out_string, :content_type => "text/xml" end + def cancelJob + id = params[:id] + + # get job information + job = get_job_info(id) + if job.nil? + render :text => "Not found Job ID #{id}", :status => 406 + return + end + + # Check job builder + if get_user_email != job.user_email + if not is_admin(get_user_email) + render :text => "You don't have authority to calcel.", :status => 406 + return + end + end + + # Excute command + begin + Utils.sbi_cancel_command(id, job.project_password) + rescue => e + render :text => e.message, :status => 406 + return + end + render :xml=> "OK" + end end diff --git a/dibs-web/app/controllers/projects_controller.rb b/dibs-web/app/controllers/projects_controller.rb index feab061..2bb8c94 100644 --- a/dibs-web/app/controllers/projects_controller.rb +++ b/dibs-web/app/controllers/projects_controller.rb @@ -145,6 +145,13 @@ class ProjectsController < ApplicationController doc.Project { doc.Name(project.name) doc.Type(project.ptype) + maintainer = User.find(:first, :conditions => ["id = ?", project.user_id]) + if not maintainer.nil? + doc.Maintainer(maintainer.email) + else + doc.Maintainer("") + end + if checkUserAccessProject(user_id, project.id) doc.GroupAccess("TRUE") else diff --git a/dibs-web/app/controllers/utils.rb b/dibs-web/app/controllers/utils.rb index d76e9c6..0f26bb1 100644 --- a/dibs-web/app/controllers/utils.rb +++ b/dibs-web/app/controllers/utils.rb @@ -81,6 +81,41 @@ puts "[[[#{cmd}]]]" return execute_shell_return(cmd) end + def Utils.sbi_cancel_command(job_id, password) + dibs_path = File.dirname(File.dirname(File.dirname(File.dirname(__FILE__)))) + dibs_config = Server_config.find(:first, :conditions => ["property = \"port\""]) + if dibs_config.nil? + raise RuntimeError, "Build sever not started" + else + dibs_address = BUILD_SERVER_ADDRESS + ":" + dibs_config.value + end + + if job_id.nil? + raise RuntimeError, "Invalid job id : #{job_id}" + end + + options = "-d #{dibs_address} " + options = options + " -j #{job_id}" + if (not password.nil?) + options = options + " -w #{password}" + end + + cmd = "#{dibs_path}/build-cli cancel #{options}" +puts "Cancel command" +puts "[[[#{cmd}]]]" + return execute_shell_return(cmd) + end + + def Utils.sbi_fullbuild_command(server_name, dist_name) + dibs_path = File.dirname(File.dirname(File.dirname(File.dirname(__FILE__)))) + + options = "-n #{server_name} --dist #{dist_name} " + cmd = "#{dibs_path}/build-svr fullbuild #{options}" +puts "Fullbuild command" +puts "[[[#{cmd}]]]" + return execute_shell_return(cmd) + end + def Utils.execute_shell_return(cmd) result_lines = [] ret = false diff --git a/dibs-web/config/routes.rb b/dibs-web/config/routes.rb index cb3925e..3f61be5 100644 --- a/dibs-web/config/routes.rb +++ b/dibs-web/config/routes.rb @@ -52,14 +52,22 @@ Dibs::Application.routes.draw do post "sessions/login" delete "sessions/logout" - get "jobs/list/:distribution/:status/:lastID" => "jobs#listAll", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } - get "jobs/listSearchUser/:user/:distribution/:status/:lastID" => "jobs#listSearchUser", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } - get "jobs/listSearchGroup/:group/:distribution/:status/:lastID" => "jobs#listSearchGroup", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } - get "jobs/listSearchProject/:project/:distribution/:status/:lastID" => "jobs#listSearchProject" , :constraints => { :project => /[0-9A-Za-z\-\.]+/ } - get "jobs/listSearchDate/:date/:distribution/:status/:lastID" => "jobs#listSearchDate", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } + get "jobs/list/all/:distribution/:status/:lastID" => "jobs#listAll", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } + get "jobs/list/user/:user/:distribution/:status/:lastID" => "jobs#listSearchUser", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } + get "jobs/list/group/:group/:distribution/:status/:lastID" => "jobs#listSearchGroup", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } + get "jobs/list/project/:project/:distribution/:status/:lastID" => "jobs#listSearchProject" , :constraints => { :project => /[0-9A-Za-z\-\.]+/ } + get "jobs/list/date/:date/:distribution/:status/:lastID" => "jobs#listSearchDate", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } + + get "jobs/updateList/all/:distribution/:status/:lastID" => "jobs#updateListAll", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } + get "jobs/updateList/user/:user/:distribution/:status/:lastID" => "jobs#updateListSearchUser", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } + get "jobs/updateList/group/:group/:distribution/:status/:lastID" => "jobs#updateListSearchGroup", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } + get "jobs/updateList/project/:project/:distribution/:status/:lastID" => "jobs#updateListSearchProject" , :constraints => { :project => /[0-9A-Za-z\-\.]+/ } + get "jobs/updateList/date/:date/:distribution/:status/:lastID" => "jobs#updateListSearchDate", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } match "jobs/log/:id" => "jobs#log" match "jobs/log/:id/:line" => "jobs#log_more" + match "jobs/cancel/:id" => "jobs#cancelJob" + get "projects/queryDistribution" match "projects/queryProject/:distribution" => "projects#queryProject", :constraints => { :distribution => /[0-9A-Za-z\-\.\_]+/ } @@ -112,6 +120,8 @@ Dibs::Application.routes.draw do post "admin_distribution/removeDistribution" post "admin_distribution/modifyDistribution" + post "admin_distribution/fullBuildDistribution" + get "admin/queryAllOS" get "admin/queryAllOSCategory" diff --git a/dibs-web/public/index.html b/dibs-web/public/index.html index 4a26c6a..3a72cb5 100644 --- a/dibs-web/public/index.html +++ b/dibs-web/public/index.html @@ -40,9 +40,9 @@ Contributors: - + - + @@ -52,7 +52,6 @@ Contributors: - @@ -553,6 +552,9 @@ Contributors: +
+ Full build +

Package server url

diff --git a/dibs-web/public/javascripts/admin-distribution.js b/dibs-web/public/javascripts/admin-distribution.js index 5668a4d..12e112b 100644 --- a/dibs-web/public/javascripts/admin-distribution.js +++ b/dibs-web/public/javascripts/admin-distribution.js @@ -109,3 +109,22 @@ function adminDistributionInitSyncPackageServer(serverInfo){ $("#adminDistribution-SyncPackageServer").append(info); } +function adminDistributionFullBuild() { + var changeInfoList = []; + var changeInfoItem; + var distName = $("#adminDistributionSelect option:selected").val(); + + changeInfoItem = {"DistributionName":distName}; + changeInfoList.push(changeInfoItem); + + var r=confirm("Distribution ["+distName+"] fullbuild will be started!!! it takes several time"); + if (r==false) + { + return; + } + + fullBuildDistribution( changeInfoList, function (xml) { + $.mobile.changePage("#adminDistribution"); + }); +} + diff --git a/dibs-web/public/javascripts/dibs-api.js b/dibs-web/public/javascripts/dibs-api.js index 4bf515f..5f931c4 100644 --- a/dibs-web/public/javascripts/dibs-api.js +++ b/dibs-web/public/javascripts/dibs-api.js @@ -85,7 +85,18 @@ function queryProjectsInfoInDistribution(distName, successFunction) { // controller : jobs function queryJobsList(url, successFunction) { - getInfoFromServer(url, successFunction); + return getInfoFromServer(url, successFunction); +} +function updateJobsList(url, successFunction) { + return getInfoFromServerNoPreProcess(url, successFunction); +} +function queryJobsLog(job_id, next_line, successFunction) { + var url = "jobs/log/"+ job_id + "/" + next_line; + getInfoFromServerNoPreProcess(url, successFunction); +} +function cancelJobsJobid(job_id, successFunction) { + var url = "jobs/cancel/"+ job_id; + getInfoFromServerNoPreProcess(url, successFunction); } // controller : admin_group @@ -253,6 +264,11 @@ function modifyDistribution(changeInfoList, successFunction) { postForServer(url, changeInfoList, successFunction); } +function fullBuildDistribution(changeInfoList, successFunction) { + var url = 'admin_distribution/fullBuildDistribution'; + postForServer(url, changeInfoList, successFunction); +} + // controller : admin function queryAllOS(successFunction) { var url = 'admin/queryAllOS'; @@ -265,7 +281,7 @@ function queryAllOSCategory(successFunction) { } function getInfoFromServer(url, successFunction) { - $.ajax({ + return $.ajax({ url: baseUrl+url, type: 'GET', dataType: 'xml', @@ -282,6 +298,22 @@ function getInfoFromServer(url, successFunction) { }); } +function getInfoFromServerNoPreProcess(url, successFunction) { + return $.ajax({ + url: baseUrl+url, + type: 'GET', + dataType: 'xml', + timeout: 10000, + success: function(xml) { + setSessionInfo(xml); + successFunction(xml); + }, + error: function(jqXHR) { + errorProcess(jqXHR); + } + }); +} + function postForServer(url, changeInfoList, successFunction) { $.ajax({ url: baseUrl+url, @@ -321,3 +353,20 @@ function deleteForServer(url, successFunction) { }); } +function errorProcess(jqXHR){ + switch (parseInt(jqXHR.status)) { + case 401: + expireSession(); + break; + case 406: + alert("Internal server error : " + jqXHR.responseText); + break; + case 0: + console.error("Error response status : "+jqXHR.status); + break; + default: + console.error("Error response status : "+jqXHR.status); + alert("Server error : "+jqXHR.status); + break; + } +} diff --git a/dibs-web/public/javascripts/jobs.js b/dibs-web/public/javascripts/jobs.js index 0a2b858..3cc161f 100644 --- a/dibs-web/public/javascripts/jobs.js +++ b/dibs-web/public/javascripts/jobs.js @@ -27,6 +27,42 @@ Contributors: */ var suggestion_list = new Array(); +var update_ajax; +var request_list = new Array(); +var request_idx = 0; + +function classAjax() { + var polling = false; + var ajaxObj = undefined; +} + +function addRequestList(ajaxObj) { + var class_ajax = new classAjax(); + class_ajax.polling = true; + class_ajax.ajaxObj = ajaxObj; + + return request_list.push(class_ajax) - 1; +} + +function clearRequestList() { + while(request_list.length > 0) { + var last_request = request_list[request_list.length - 1]; + if(last_request.polling == true && last_request.ajaxObj != undefined) { + last_request.ajaxObj.abort(); + } + request_list.pop(); + } + console.log("Clear all update."); +} + +function isPolling(idx) { + if(request_list[idx] != undefined) { + return request_list[idx].polling; + } + else { + return false; + } +} $(function() { $('#jobSearchSelect input[type="radio"]').checkboxradio().click(function() { @@ -133,7 +169,6 @@ function searchJobDate() { function searchJob(searchText) { var distribution = $("#jobSelectDistribution option:selected").val(); var selectedValue = $('#jobSearchSelect').find("input[type='radio']:checked").val(); - console.log(searchText); switch(selectedValue) { case "ALL": alert("Can't search on ALL!!"); @@ -235,41 +270,40 @@ function clearJobList() { } function queryJobListAll(distribution) { - var selectedStatus= $('#jobStatusSelect').find("input[type='radio']:checked").val(); - clearJobList(); - queryJobList("jobs/list", distribution, selectedStatus, "LATEST"); + queryJobListByButton("all", distribution, "LATEST"); } function queryJobListJobId(distribution, jobId) { - var distribution = $("#jobSelectDistribution option:selected").val(); - var selectedStatus= $('#jobStatusSelect').find("input[type='radio']:checked").val(); - clearJobList(); - queryJobList("jobs/list", distribution, selectedStatus, eval(parseInt(jobId) + 1)); + queryJobListByButton("all", distribution, eval(parseInt(jobId) + 1)); } function queryJobListUserName(distribution, name) { - var distribution = $("#jobSelectDistribution option:selected").val(); - var selectedStatus= $('#jobStatusSelect').find("input[type='radio']:checked").val(); - clearJobList(); var encodingName = encodeURIComponent(name); - queryJobList("jobs/listSearchUser/"+encodingName, distribution, selectedStatus, "LATEST"); + queryJobListByButton("user/"+encodingName, distribution, "LATEST"); } function queryJobListUserGroup(distribution, group) { - var selectedStatus= $('#jobStatusSelect').find("input[type='radio']:checked").val(); - clearJobList(); - queryJobList("jobs/listSearchGroup/"+group, distribution, selectedStatus, "LATEST"); + queryJobListByButton("group/"+group, distribution, "LATEST"); } function queryJobListProject(distribution, project) { - var selectedStatus= $('#jobStatusSelect').find("input[type='radio']:checked").val(); - clearJobList(); - queryJobList("jobs/listSearchProject/"+project, distribution, selectedStatus, "LATEST"); + queryJobListByButton("project/"+project, distribution, "LATEST"); } function queryJobListDate(distribution, date) { - var selectedStatus= $('#jobStatusSelect').find("input[type='radio']:checked").val(); + queryJobListByButton("date/"+date, distribution, "LATEST"); +} + +function queryJobListByButton(condition, distribution, jobId) { clearJobList(); - queryJobList("jobs/listSearchDate/"+date, distribution, selectedStatus, "LATEST"); + clearRequestList(); + var selectedStatus= $('#jobStatusSelect').find("input[type='radio']:checked").val(); + var request = queryJobList("jobs/list", condition, distribution, selectedStatus, jobId); + if(request != undefined) { + request.done(function() { + console.log("Start update"); + updateJobList(condition, distribution, selectedStatus); + }); + } } function jobQueryDistribution() { @@ -296,103 +330,22 @@ function jobQueryDistribution() { } } -function queryJobList(requestUrl, distribution, selectedStatus, jobId) { - var url = requestUrl+"/"+ distribution +"/"+ selectedStatus+"/"+jobId; +function queryJobList(requestUrl, condition, queryDistribution, selectedStatus, jobId) { + var url = requestUrl+"/"+condition+"/"+queryDistribution+"/"+selectedStatus+"/"+jobId; console.log(url); - queryJobsList(url, function(xml) { + return queryJobsList(url, function(xml) { var lastJobId = 0; $(xml).find("JobList").find("Job").each(function(){ var id = $(this).find("Id").text(); - var distribution = $(this).find("Distribution").text(); - var projectName = $(this).find("ProjectName").text(); - var jobType = $(this).find("JobType").text(); - var jobAttribute = $(this).find("JobAttribute").text(); - var os = $(this).find("Os").text(); - var jobStatus = $(this).find("Status").text(); - var userName = $(this).find("UserName").text(); - var startTime = $(this).find("StartTime").text(); - var endTime = $(this).find("EndTime").text(); - var li = ""; - - if(jobAttribute == "SINGLE") - { - li = '
  • ' - + id+ ' ' +projectName+ '
  • ' - + '
  • ' - + '

    ' +projectName+ '

    ' - + '

    ID : ' +id+ '

    ' - + '

    TYPE : ' +jobType+ '

    ' - + '

    OS : ' + os + '

    ' - + '

    USER : ' +userName+ '

    ' - + '

    TIME: ' +startTime+ ' ~ '+endTime+ '

    '; - if(jobStatus == "ERROR" || jobStatus == "CANCELED") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "JUST_CREATED" || jobStatus == "PENDING" - || jobStatus == "WORKING" || jobStatus == "REMOTE_WORKING") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "WAITING") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "FINISHED") { - li = li + '

    ' +jobStatus+ '

    ' - } else { - li = li + '

    ' +jobStatus+ '

    ' - } - - li = li + '
  • '; - } - else if(jobAttribute == "MULTI") - { - li = '
  • ' +id+ ' ' +jobType+ '
  • ' - + '
  • ' - + '

    USER : ' +userName+ '

    ' - + '

    TIME: ' +startTime+ ' ~ '+endTime+ '

    '; - if(jobStatus.toUpperCase() == "ERROR" || jobStatus.toUpperCase() == "CANCELED") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "JUST_CREATED" || jobStatus == "PENDING" - || jobStatus == "WORKING" || jobStatus == "REMOTE_WORKING") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "WAITING") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "FINISHED") { - li = li + '

    ' +jobStatus+ '

    ' - } else { - li = li + '

    ' +jobStatus+ '

    ' - } - - li = li + '
  • '; - } - else if(jobAttribute == "CHILD") - { - li = '
  • ' - + '

    ' +projectName+ '

    ' - + '

    ID : ' +id+ '

    ' - + '

    TYPE : ' +jobType+ '

    ' - + '

    OS : ' +os+ '

    ' - + '

    TIME: ' +startTime+ ' ~ '+endTime+ '

    '; - if(jobStatus.toUpperCase() == "ERROR" || jobStatus.toUpperCase() == "CANCELED") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "JUST_CREATED" || jobStatus == "PENDING" - || jobStatus == "WORKING" || jobStatus == "REMOTE_WORKING") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "WAITING") { - li = li + '

    ' +jobStatus+ '

    ' - } else if(jobStatus == "FINISHED") { - li = li + '

    ' +jobStatus+ '

    ' - } else { - li = li + '

    ' +jobStatus+ '

    ' - } - - li = li + '
  • '; - } + var li = generateHtmlJobList($(this)); lastJobId = id; $("#jobList").append(li).listview('refresh'); }); - console.log(lastJobId); if(lastJobId > 0) { - var moreJobListUrl = 'queryJobList("'+requestUrl+'", "'+distribution+'", "'+selectedStatus+'", "'+lastJobId+'")'; + var moreJobListUrl = 'queryJobList("'+requestUrl+'", "'+condition+'","'+queryDistribution+'", "'+selectedStatus+'", "'+lastJobId+'")'; $('#moreJobList').attr("onClick", moreJobListUrl); $('#moreJobList').removeClass('ui-disabled'); } @@ -402,9 +355,50 @@ function queryJobList(requestUrl, distribution, selectedStatus, jobId) { } $('#moreJobList').button('refresh'); applyStyleLogWindow(); + }, errorProcess); } +function updateJobList(condition, distribution, selectedStatus) { + var latest_job_id= $("#jobList li").first().attr("title"); + if(latest_job_id == undefined) { + latest_job_id = 0; + } + update_ajax = queryUpdateJobList("jobs/updateList", condition, distribution, selectedStatus, latest_job_id); + + var idx = addRequestList(update_ajax); + + console.log("Update done. Next request in 2sec."); + update_ajax.done(function() { + setTimeout(function(){ + if(isPolling(idx) && $.mobile.activePage.attr('id') == "jobs" && idx < 900) { + console.log("Update request."); + request_list[idx].polling = false; + updateJobList(condition, distribution, selectedStatus); + } + else { + console.log("Stop update."); + } + }, 2000); + }); +} + +function queryUpdateJobList(requestUrl, condition, queryDistribution, selectedStatus, latest_job_id) { + var url = requestUrl+"/"+condition+"/"+queryDistribution+"/"+selectedStatus+"/"+latest_job_id; + console.log("update url: "+url); + return updateJobsList(url, function(xml) { + var firstLi= $("#jobList li").first(); + + $(xml).find("JobList").find("Job").each(function(){ + var id = $(this).find("Id").text(); + var li = generateHtmlJobList($(this)); + + $(li).insertBefore(firstLi); + $("#jobList").listview('refresh'); + }); + }); +} + function clearSuggestJobSearchList() { $("#jobSearchList").empty(); } @@ -441,8 +435,6 @@ function suggestJobSearchList(inputText) { } sugList.html(str); sugList.listview("refresh"); - console.log(inputText); - console.dir(suggestion_list); } } @@ -453,8 +445,6 @@ function jobSuggestListClick(suggestText) { var startIndex = suggestText.search(/\[/); var endIndex = suggestText.search('\]'); - console.log(startIndex); - console.log(endIndex); if(startIndex > 0 && endIndex >0) { project = suggestText.substr(0, startIndex); distribution = suggestText.substr(startIndex+1, endIndex-startIndex-1); @@ -498,3 +488,98 @@ function jobsClear() { clearJobList(); } +function generateHtmlJobList(xml) { + var id = xml.find("Id").text(); + var distribution = xml.find("Distribution").text(); + var projectName = xml.find("ProjectName").text(); + var jobType = xml.find("JobType").text(); + var jobAttribute = xml.find("JobAttribute").text(); + var os = xml.find("Os").text(); + var jobStatus = xml.find("Status").text(); + var userName = xml.find("UserName").text(); + var startTime = xml.find("StartTime").text(); + var endTime = xml.find("EndTime").text(); + var li = ""; + + if(jobAttribute == "SINGLE") + { + li = '
  • ' + + id+ ' ' +projectName+ '
  • ' + + '
  • ' + + '

    ' +projectName+ '

    ' + + '

    ID : ' +id+ '

    ' + + '

    TYPE : ' +jobType+ '

    ' + + '

    OS : ' + os + '

    ' + + '

    USER : ' +userName+ '

    ' + + '

    TIME: ' +startTime+ ' ~ '+endTime+ '

    '; + if(queryDistribution == "ALL") { + li = li + '

    DISTRIBUTION: ' +distribution+ '

    '; + } + + if(jobStatus == "ERROR" || jobStatus == "CANCELED") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "JUST_CREATED" || jobStatus == "PENDING" + || jobStatus == "WORKING" || jobStatus == "REMOTE_WORKING") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "WAITING") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "FINISHED") { + li = li + '

    ' +jobStatus+ '

    ' + } else { + li = li + '

    ' +jobStatus+ '

    ' + } + + li = li + '
  • '; + } + else if(jobAttribute == "MULTI") + { + li = '
  • ' +id+ ' ' +jobType+ '
  • ' + + '
  • ' + + '

    USER : ' +userName+ '

    ' + + '

    TIME: ' +startTime+ ' ~ '+endTime+ '

    '; + if(queryDistribution == "ALL") { + li = li + '

    DISTRIBUTION: ' +distribution+ '

    '; + } + + if(jobStatus.toUpperCase() == "ERROR" || jobStatus.toUpperCase() == "CANCELED") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "JUST_CREATED" || jobStatus == "PENDING" + || jobStatus == "WORKING" || jobStatus == "REMOTE_WORKING") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "WAITING") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "FINISHED") { + li = li + '

    ' +jobStatus+ '

    ' + } else { + li = li + '

    ' +jobStatus+ '

    ' + } + + li = li + '
  • '; + } + else if(jobAttribute == "CHILD") + { + li = '
  • ' + + '

    ' +projectName+ '

    ' + + '

    ID : ' +id+ '

    ' + + '

    TYPE : ' +jobType+ '

    ' + + '

    OS : ' +os+ '

    ' + + '

    TIME: ' +startTime+ ' ~ '+endTime+ '

    '; + + if(jobStatus.toUpperCase() == "ERROR" || jobStatus.toUpperCase() == "CANCELED") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "JUST_CREATED" || jobStatus == "PENDING" + || jobStatus == "WORKING" || jobStatus == "REMOTE_WORKING") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "WAITING") { + li = li + '

    ' +jobStatus+ '

    ' + } else if(jobStatus == "FINISHED") { + li = li + '

    ' +jobStatus+ '

    ' + } else { + li = li + '

    ' +jobStatus+ '

    ' + } + + li = li + '
  • '; + } + + return li; +} diff --git a/dibs-web/public/javascripts/log.js b/dibs-web/public/javascripts/log.js index 57282b1..607b68c 100644 --- a/dibs-web/public/javascripts/log.js +++ b/dibs-web/public/javascripts/log.js @@ -29,58 +29,124 @@ Contributors: var request; var stop = 1; +var baseUrl; var job_id; var last_line = 0; -function logInit() { - var next_line = Number(last_line) + 1; - var url = "/jobs/log/"+ job_id + "/" + next_line; - request.open("GET", url, true); - request.onreadystatechange = updatePage; - request.send(null); -} - -function receiveData() { - /* XML parsing */ - var xmlDoc = request.responseXML; +var init = function () { + console.log("init() called"); + var myUrl = location.href; + var varCut = myUrl.indexOf("?"); + var varCheck = myUrl.substring(varCut+1); + eval(varCheck); - /* pre-process */ - var logElements = xmlDoc.getElementsByTagName("Log")[0]; - var conti = Number(logElements.getAttribute("Continue")); - job_id = logElements.getAttribute("JobId"); + job_id = jobid; + $('#job-info-id').text(job_id); + console.log(job_id); - /* Insert data */ - var dataElements = xmlDoc.getElementsByTagName("Data"); + var baseCut = myUrl.indexOf("log.html"); - for(var x=0 ; x < dataElements.length ; x++) - { - var insertTable = document.getElementById("logTable"); - var insertRow = document.createElement("tr"); - var insertCel1 = document.createElement("td"); - var insertCel2 = document.createElement("td"); + baseUrl = myUrl.substring(0, baseCut); + console.log("base url:"+baseUrl); - var line_number = dataElements[x].getAttribute("Line"); - var line_data = dataElements[x].childNodes[0].nodeValue; + queryLog(); +}; - insertCel1.width = '30'; - insertCel1.style.textAlign = 'right'; - insertCel1.style.cellpacing = '5'; - insertCel1.innerHTML = line_number; - last_line = line_number; +$(document).ready(init); - insertCel2.style.textAlign = 'left'; - insertCel2.innerHTML = line_data; - - insertRow.appendChild(insertCel1); - insertRow.appendChild(insertCel2); +function queryLog() +{ + var next_line = Number(last_line) + 1; + queryJobsLog(job_id, next_line, function(xml) { + /* pre-process for header */ + job_id = $(xml).find("Data").find("JobId").text(); + var distribution = $(xml).find("Data").find("Distribution").text(); + var project = $(xml).find("Data").find("Project").text(); + var builder = $(xml).find("Data").find("Builder").text(); + var job_status = $(xml).find("Data").find("Status").text(); + var time = $(xml).find("Data").find("Time").text(); + var conti = Number($(xml).find("Data").find("Continue").text()); + var working_status = 0; + + $('#job-info-distribution').html(distribution); + $('#job-info-project').html(project); + $('#job-info-builder').html(builder); + $('#job-info-status').html(job_status); + switch(job_status) + { + case "ERROR" : + case "CANCELED" : + $('#job-info-status').css("color","red"); + $('#job-info-cancel input').attr("disabled", true); + working_status = 0; + break; + case "INITIALIZING" : + case "JUST_CREATED" : + case "PENDING" : + case "WORKING" : + case "REMOTE_WORKING" : + $('#job-info-status').css("color","blue"); + working_status = 1; + break; + case "WAITING" : + $('#job-info-status').css("color","green"); + working_status = 1; + break; + case "FINISHED" : + $('#job-info-status').css("color","black"); + $('#job-info-cancel input').attr("disabled", true); + working_status = 0; + break; + default: + console.error(job_status+" status is not define."); + $('#job-info-cancel input').attr("disabled", true); + working_status = 0; + break; + } - insertTable.appendChild(insertRow); + /* Insert data */ + $(xml).find("Data").find("LogData").each(function() { + var insertTable = document.getElementById("logTable"); + var insertRow = document.createElement("tr"); + var insertCel1 = document.createElement("td"); + var insertCel2 = document.createElement("td"); + + var line_number = $(this).attr("Line"); + var line_data = $(this).text(); + + insertCel1.width = '30'; + insertCel1.style.textAlign = 'right'; + insertCel1.style.cellpacing = '5'; + insertCel1.innerHTML = line_number; + last_line = line_number; + + insertCel2.style.textAlign = 'left'; + insertCel2.innerHTML = line_data; + + insertRow.appendChild(insertCel1); + insertRow.appendChild(insertCel2); + + insertTable.appendChild(insertRow); + + }); + + if(working_status == 1){ + console.log("scroll"); + scrollToBottom(); + } + + autoQueryLog(conti, working_status); + }); +} +function autoQueryLog(conti, working_status) { + if(conti && stop) { + queryLog(); } - scrollToBottom(); - if(conti && stop) { - waitRequestLog(); + if(working_status == 1 && stop) { + console.log("status is working. try request"); + setTimeout(function(){queryLog()}, 3000); } } @@ -90,32 +156,13 @@ function stopLog() { function moreLog() { stop = 1; - requestLog(); + queryLog(); } -function waitRequestLog() { - sleep(3000); - requestLog(); -} - -function requestLog() { - createHttpRequest(); - if(request) { - } -} - -function updatePage() { - if (request.readyState == 4) { - if (request.status == 200) { - receiveData(); - } - else if (request.status == 404) { - alert("Request URL does not exist"); - } - else { - alert("Error: status code is " + request.status); - } - } +function cancelJob() { + cancelJobsJobid(job_id, function(xml) { + alert("Reqeusted cancel job : "+job_id); + }); } function getYScroll() @@ -134,3 +181,4 @@ function getYScroll() function scrollToBottom() { window.scrollTo(0,getYScroll()); } + diff --git a/dibs-web/public/javascripts/main.js b/dibs-web/public/javascripts/main.js index c37bcbb..bb60f7f 100644 --- a/dibs-web/public/javascripts/main.js +++ b/dibs-web/public/javascripts/main.js @@ -156,35 +156,6 @@ $( document ).bind( "mobileinit", function() { $.mobile.pushStateEnabled = false; }); -function errorProcess(jqXHR){ - switch (parseInt(jqXHR.status)) { - case 401: - expireSession(); - break; - case 406: - alert("Internal server error : " + jqXHR.responseText); - break; - default: - alert("Server error : "+jqXHR.status); - break; - } -} - -//$(document).ready(function() { -// var hdhtml = $($.mobile.activePage).children('div').eq(0).clone(); -// var fthtml = $($.mobile.activePage).children('div').eq(2).clone(); -// $('div:jqmData(role="page")').live('pageinit',function() { -// $('div:jqmData(role="header")').remove(); -// $('div:jqmData(role="footer")').remove(); -// $('div:jqmData(role="page")').prepend(hdhtml).append(fthtml); -// }); -// if( $('div:jqmData(role="page")').length > 2 ){ -// $('div:jqmData(role="header")').remove(); -// $('div:jqmData(role="footer")').remove(); -// $('div:jqmData(role="page")').prepend(hdhtml).append(fthtml); -// } -//}); - function clearFormData(elementId){ $("#"+elementId).find(':input').each(function() { switch(this.type) { diff --git a/dibs-web/public/javascripts/projects.js b/dibs-web/public/javascripts/projects.js index 6f02e59..2288665 100644 --- a/dibs-web/public/javascripts/projects.js +++ b/dibs-web/public/javascripts/projects.js @@ -103,6 +103,7 @@ function projectsAppendProjectList( project, projectList ) { var name = project.find("Name").text(); var type = project.find("Type").text(); var groupAccess = project.find("GroupAccess").text(); + var maintainer = project.find("Maintainer").text(); var div = document.createElement('div'); div.setAttribute('data-role', 'collapsible'); @@ -118,11 +119,13 @@ function projectsAppendProjectList( project, projectList ) { projectList.appendChild(div); var h2 = document.createElement('h2'); - h2.innerHTML = "["+type+"] "+name; + h2.innerHTML = ''+name+''+type+''; div.appendChild(h2); - var br = document.createElement('br'); - div.appendChild(br); + var infoLine = document.createElement('p'); + infoLine.setAttribute('style', 'font-size: 12px'); + infoLine.innerHTML = "Maintainer : "+maintainer+"

    "; + div.appendChild(infoLine); var ul = document.createElement('ul'); ul.setAttribute('data-role', "listview"); diff --git a/dibs-web/public/log.html b/dibs-web/public/log.html index 77d792e..ec4c4c4 100644 --- a/dibs-web/public/log.html +++ b/dibs-web/public/log.html @@ -26,173 +26,89 @@ Contributors: - S-Core Co., Ltd --> - + - + + + + + - -
    -
    + +
    + +
    + - diff --git a/dibs-web/public/stylesheets/style.css b/dibs-web/public/stylesheets/style.css index 905f975..1200aa7 100644 --- a/dibs-web/public/stylesheets/style.css +++ b/dibs-web/public/stylesheets/style.css @@ -95,3 +95,10 @@ table.projectTableStyle td { border-style: solid; border-color: #999999; } + +.alignleft { + float: left; +} +.alignright { + float: right; +}