add renderers for logpart and logparts, update log query, fix specs

This commit is contained in:
carlad 2016-08-04 19:47:17 +02:00
parent a1fcf4995b
commit 85c9570b87
7 changed files with 33 additions and 28 deletions

View File

@ -6,26 +6,24 @@ module Travis::API::V3
def find(job)
#check for the log in the Logs DB
log = Models::Log.find_by_job_id(job.id)
raise EntityMissing, 'log not found'.freeze if log.nil?
#if the log exists and has not been archived yet, then collect the log_parts and return the Log query object
if !log.archived_at.nil?
log_parts = Models::LogPart.where(log_id: log.id).to_a
elsif log.archived_at?
if log.archived_at
## if it's not there then fetch it from S3, and return it wrapped as a compatible log_parts object with a hard coded #number (log_parts have a number) and the parts chunked (not sure how to do this)
archived_log_path = archive_url("/jobs/#{params[:job.id]}/log.txt")
content = open(Net::HTTP.get(URI.parse(archived_log_path)))
log_parts = []
number = 0
content.each_line do |line|
log_part = Models::LogPart.new(id: nil, log_id: log.id, content: line.chomp, number: number, final: false, created_at: log.created_at)
number += 1
content.each_line.with_index do |line, number|
log_part = Models::LogPart.new(log_id: log.id, content: line.chomp, number: number, created_at: log.created_at)
log_parts << log_part
end
log_parts
else
raise EntityMissing, 'log not found'.freeze
log.log_parts = log_parts
end
log
end
def archive_url(path)

View File

@ -1,7 +1,6 @@
require 'travis/api/v3/renderer/model_renderer'
module Travis::API::V3
class Renderer::Log < Renderer::ModelRenderer
representation(:standard, :id, :content)
representation(:minimal, :id, :content)
representation(:standard, *representations[:minimal], :log_parts)
end
end

View File

@ -0,0 +1,6 @@
module Travis::API::V3
class Renderer::LogPart < Renderer::ModelRenderer
representation(:minimal, :content, :number)
representation(:standard, *representations[:minimal], :log)
end
end

View File

@ -0,0 +1,6 @@
module Travis::API::V3
class Renderer::LogParts < Renderer::CollectionRenderer
type :log_parts
collection_key :log_parts
end
end

View File

@ -1,11 +1,8 @@
module Travis::API::V3
class Services::Log::Find < Service
params :id, prefix: :job
def run!
job = find(:job)
query.find(job)
result(log, parts: log_parts)
end
end
end

View File

@ -18,7 +18,7 @@ module Travis
assets: { host: HOSTS[Travis.env.to_sym] },
amqp: { username: 'guest', password: 'guest', host: 'localhost', prefetch: 1 },
database: { adapter: 'postgresql', database: "travis_#{Travis.env}", encoding: 'unicode', min_messages: 'warning', variables: { statement_timeout: 10_000 } },
# logs_database: { adapter: 'postgresql', database: "travis_logs_#{Travis.env}", encoding: 'unicode', min_messages: 'warning', variables: { statement_timeout: 10_000 } },
logs_database: { adapter: 'postgresql', database: "travis_logs_#{Travis.env}", encoding: 'unicode', min_messages: 'warning', variables: { statement_timeout: 10_000 } },
s3: { access_key_id: '', secret_access_key: '' },
pusher: { app_id: 'app-id', key: 'key', secret: 'secret' },
sidekiq: { namespace: 'sidekiq', pool_size: 1 },

View File

@ -10,26 +10,25 @@ describe Travis::API::V3::Services::Log::Find, set_app: true do
let(:parsed_body) { JSON.load(body) }
context 'when log stored in db' do
describe 'returns log as array of Log Parts' do
let(:log) { job.log }
describe 'returns the Log with an array of Log Parts' do
let(:log) { job.log }
p log
before { get("/v3/job/#{job.id}/log", {}, headers) }
example { expect(last_response).to be_ok }
example do
log_part = log.log_parts.create(content: "logging it", number: 0)
get("/v3/job/#{job.id}/log", {}, headers)
expect(parsed_body).to eq(
'@href' => "/v3/job/#{job.id}/log",
'@representation' => 'standard',
'@type' => 'log',
'content' => nil,
'id' => log.id
)
'id' => log.id,
'log_parts' => [{
"@type" => "log_part",
"@representation" => "minimal",
"content" => log_part.content,
"number" => log_part.number }])
end
end
describe 'returns log as chunked json'
end
context 'when log not found in db but stored on S3' do