[Title] add build-cli query-log command
authorhataejun <taejun.ha@samsung.com>
Fri, 22 Mar 2013 05:38:09 +0000 (14:38 +0900)
committerhataejun <taejun.ha@samsung.com>
Fri, 22 Mar 2013 05:38:09 +0000 (14:38 +0900)
[Type]
[Module]
[Priority]
[Jira#]
[Redmine#] 8188
[Problem]
[Cause]
[Solution]
[TestCase]

Change-Id: Id4db16af9b78c6772d6fca727ac5904741861ec2

build-cli
src/build_server/BuildClientOptionParser.rb
src/build_server/BuildServer.rb
src/build_server/SocketJobRequestListener.rb
test/build-server.basic1/build-cli-01.testcase

index e6120dbcf392aa4a5c6ba7a5b27c8f77e3250a66..f700c3ab6ee342eb272a606f48e734f84fa5fbd5 100755 (executable)
--- a/build-cli
+++ b/build-cli
@@ -251,6 +251,26 @@ begin
 
                query_job_list( result[0], result[1] )
 
+       when "query-log"
+               result = Utils.parse_server_addr(option[:domain])
+               if result.nil? then
+                       puts "Server address is incorrect. (#{option[:domain]})"
+                       puts "Tune as following format."
+                       puts " <ip>:<port>"
+                       exit 1
+               end
+
+               client = BuildCommClient.create( result[0], result[1], nil, 0 )
+               if client.nil? then
+                       puts "Connection to server failed!"
+                       return nil
+               end
+               client.send "LOG|#{option[:job].strip}"
+               client.read_lines do |line|
+                       puts line
+               end
+               client.terminate
+
        when "cancel"
                result = Utils.parse_server_addr(option[:domain])
                if result.nil? then
index d2c98a10d1843c9f42fa127310e62e87afbfc5c4..3bdc5d0fafe362a25ed27f93c20870f0a1477c21 100644 (file)
@@ -37,6 +37,7 @@ class BuildClientUsage
        QUERY_SYSTEM="build-cli query-system -d <server address>"
        QUERY_PROJECT="build-cli query-project -d <server address>"
        QUERY_JOB="build-cli query-job -d <server address>"
+       QUERY_LOG="build-cli query-log -d <server address> -j <job number>"
        CANCEL="build-cli cancel -j <job number> -d <server address> [-w <password>] [-U user-email]"
        REGISTER="build-cli register -P <package file> -d <server address>  [-t <ftp server url>] [-w <password>] [-D <distribution name>] [-U user-email]"
 end
@@ -77,6 +78,12 @@ def option_error_check( options )
                        raise ArgumentError, "Usage: " + BuildClientUsage::QUERY_JOB
                end
 
+       when "query-log" then
+               if options[:domain].nil? or options[:domain].empty? or
+                       options[:job].nil? or options[:job].empty? then
+                       raise ArgumentError, "Usage: " + BuildClientUsage::QUERY_LOG
+               end
+
        when "cancel" then
                if options[:job].nil? or options[:job].empty? or
                        options[:domain].nil? or options[:domain].empty? then
@@ -107,6 +114,7 @@ def option_parse
                + "\t" + "query-system  Query system information about build-server." + "\n" \
                + "\t" + "query-project Query project information about build-server." + "\n" \
                + "\t" + "query-job     Query job information about build-server." + "\n" \
+               + "\t" + "query-log     Query log contents about job in build-server." + "\n" \
                + "\t" + "cancel        Cancel a building project." + "\n" \
                + "\t" + "register      Register the package to the build-server." + "\n" \
                + "\n" + "Subcommand usage:" + "\n" \
@@ -115,6 +123,7 @@ def option_parse
                + "\t" + BuildClientUsage::QUERY_SYSTEM + "\n" \
                + "\t" + BuildClientUsage::QUERY_PROJECT + "\n" \
                + "\t" + BuildClientUsage::QUERY_JOB + "\n" \
+               + "\t" + BuildClientUsage::QUERY_LOG + "\n" \
                + "\t" + BuildClientUsage::CANCEL + "\n" \
                + "\t" + BuildClientUsage::REGISTER + "\n" \
                + "\n" + "Options:" + "\n"
@@ -206,6 +215,7 @@ def option_parse
        if cmd.eql? "build" or #cmd.eql? "resolve" or
                cmd.eql? "query" or cmd.eql? "query-system" or
                cmd.eql? "query-project" or cmd.eql? "query-job" or
+               cmd.eql? "query-log" or
                cmd.eql? "cancel" or
                cmd.eql? "register" or
                cmd =~ /(-v)|(--version)/ or
index 0d4fbee4a04f2992e2f1675f4be6d69f07c3de54..6645d0eeeea92293b982ca43de83b46aa3997618 100644 (file)
@@ -30,6 +30,7 @@ require 'rubygems'
 require 'fileutils'
 require 'dbi'
 require 'thread'
+require 'file/tail'
 $LOAD_PATH.unshift File.dirname(__FILE__)
 $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))+"/common"
 require "SocketJobRequestListener.rb"
@@ -781,5 +782,46 @@ class BuildServer
                        end
                end
        end
+
+       def query_job_log(job_number, conn)
+               @log.info "Sending job log : #{job_number}"
+
+               job = nil
+               (@jobmgr.jobs + @jobmgr.internal_jobs + @jobmgr.reverse_build_jobs).each do |manager_job|
+                       if manager_job.id.eql? job_number then 
+                               job = manager_job
+                       end
+               end
+
+               Thread.new do 
+                       job_log_path = File.join(@path, "jobs", job_number, "log")
+
+                       if File.exist? job_log_path then
+                               begin
+                                       File::Tail::Logfile.open(job_log_path) do |log|
+                                               log.tail { |line| 
+                                                       BuildCommServer.send(conn, line) 
+                    
+                                                       if log.eof? and (job.nil? or
+                                                                        job.status.eql? "FINISHED" or
+                                                                        job.status.eql? "ERROR" or 
+                                                                        job.status.eql? "CANCELED") then
+                                                               break
+                                                       end
+                                               }
+                                       end
+                               rescue => e
+                                       @log.error e.message
+                                       @log.error e.backtrace.inspect
+                               end
+                       else
+                               @log.error "Can't find job log file : #{job_log_path}"
+                               BuildCommServer.send(conn, "Can't find job log file : #{job_number}")
+                       end
+
+                       BuildCommServer.send_end(conn)
+                       BuildCommServer.disconnect(conn)
+               end
+       end
 end
 
index a6dbba16dea914a64dbc031d7ff8fc8730b429a5..6d921ad2eaa18d0e03a06dade071667353c8b40e 100644 (file)
@@ -142,6 +142,8 @@ class SocketJobRequestListener
                        handle_cmd_register( req_line, req )
                when "MONITOR"
                        handle_cmd_monitor( req_line, req )
+               when "LOG"
+                       handle_cmd_log( req_line, req )
                when "DOWNLOAD"
                        Thread.new do
                                begin
@@ -913,6 +915,23 @@ class SocketJobRequestListener
        end
 
 
+       # "LOG"
+       def handle_cmd_log( line, req )
+               @log.info "Received REQ: #{line.strip}"
+
+               begin
+                       handle_cmd_log_internal( line, req )
+               rescue BuildServerException => e
+                       @log.error(e.message)
+                       BuildCommServer.send(req, e.err_message())
+                       BuildCommServer.send_end(req)
+                       BuildCommServer.disconnect(req)
+               end
+
+               @log.info "Handled REQ: #{line.strip}"
+       end
+
+
        def handle_cmd_monitor_internal( line, req )
                tok = line.split("|").map { |x| x.strip }
                if tok.count < 2 then
@@ -929,6 +948,17 @@ class SocketJobRequestListener
        end
 
 
+       def handle_cmd_log_internal( line, req )
+               tok = line.split("|").map { |x| x.strip }
+               if tok.count < 2 then
+                       raise BuildServerException.new("ERR001"), line
+               end
+
+               job_number = tok[1]
+               @parent_server.query_job_log(job_number, req)
+       end
+
+
        # "UPLOAD"
        def handle_cmd_upload( line, req )
                @log.info "Received File transfer REQ : #{line}"
index 84610513193469bfebf0e71d875b5c7a4032ca11..7602874a1f43f6a4c7db57e7a8b4cf8466209d0d 100644 (file)
@@ -13,6 +13,7 @@ query         Query information about build-server.
 query-system  Query system information about build-server.
 query-project Query project information about build-server.
 query-job     Query job information about build-server.
+query-log     Query log contents about job in build-server.
 cancel        Cancel a building project.
 register      Register the package to the build-server.
 
@@ -22,6 +23,7 @@ build-cli query -d <server address>
 build-cli query-system -d <server address>
 build-cli query-project -d <server address>
 build-cli query-job -d <server address>
+build-cli query-log -d <server address> -j <job number>
 build-cli cancel -j <job number> -d <server address> [-w <password>]
 build-cli register -P <package file> -d <server address>  [-t <ftp server url>] [-w <password>] [-D <distribution name>] [-U user-email]