From 85c9570b87fad366c2a904dde3e3397df7394ed4 Mon Sep 17 00:00:00 2001 From: carlad Date: Thu, 4 Aug 2016 19:47:17 +0200 Subject: [PATCH] add renderers for logpart and logparts, update log query, fix specs --- lib/travis/api/v3/queries/log.rb | 18 ++++++++---------- lib/travis/api/v3/renderer/log.rb | 5 ++--- lib/travis/api/v3/renderer/log_part.rb | 6 ++++++ lib/travis/api/v3/renderer/log_parts.rb | 6 ++++++ lib/travis/api/v3/services/log/find.rb | 3 --- lib/travis/config/defaults.rb | 2 +- spec/v3/services/log/find_spec.rb | 21 ++++++++++----------- 7 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 lib/travis/api/v3/renderer/log_part.rb create mode 100644 lib/travis/api/v3/renderer/log_parts.rb diff --git a/lib/travis/api/v3/queries/log.rb b/lib/travis/api/v3/queries/log.rb index 1a67b8b3..4cb23bc4 100644 --- a/lib/travis/api/v3/queries/log.rb +++ b/lib/travis/api/v3/queries/log.rb @@ -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) diff --git a/lib/travis/api/v3/renderer/log.rb b/lib/travis/api/v3/renderer/log.rb index 33527a06..44ec08f2 100644 --- a/lib/travis/api/v3/renderer/log.rb +++ b/lib/travis/api/v3/renderer/log.rb @@ -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 diff --git a/lib/travis/api/v3/renderer/log_part.rb b/lib/travis/api/v3/renderer/log_part.rb new file mode 100644 index 00000000..54043a52 --- /dev/null +++ b/lib/travis/api/v3/renderer/log_part.rb @@ -0,0 +1,6 @@ +module Travis::API::V3 + class Renderer::LogPart < Renderer::ModelRenderer + representation(:minimal, :content, :number) + representation(:standard, *representations[:minimal], :log) + end +end diff --git a/lib/travis/api/v3/renderer/log_parts.rb b/lib/travis/api/v3/renderer/log_parts.rb new file mode 100644 index 00000000..6d945a32 --- /dev/null +++ b/lib/travis/api/v3/renderer/log_parts.rb @@ -0,0 +1,6 @@ +module Travis::API::V3 + class Renderer::LogParts < Renderer::CollectionRenderer + type :log_parts + collection_key :log_parts + end +end diff --git a/lib/travis/api/v3/services/log/find.rb b/lib/travis/api/v3/services/log/find.rb index 947e0df5..c6e3dd2a 100644 --- a/lib/travis/api/v3/services/log/find.rb +++ b/lib/travis/api/v3/services/log/find.rb @@ -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 diff --git a/lib/travis/config/defaults.rb b/lib/travis/config/defaults.rb index f2ae3440..18e43798 100644 --- a/lib/travis/config/defaults.rb +++ b/lib/travis/config/defaults.rb @@ -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 }, diff --git a/spec/v3/services/log/find_spec.rb b/spec/v3/services/log/find_spec.rb index 8813879d..f85a5891 100644 --- a/spec/v3/services/log/find_spec.rb +++ b/spec/v3/services/log/find_spec.rb @@ -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