From 39bd25cc3b71288322de9aa815fdbbfcc286916e Mon Sep 17 00:00:00 2001 From: carlad <carla@travis-ci.org> Date: Wed, 21 Jan 2015 17:09:24 +0100 Subject: [PATCH 01/12] add sidekiq worker, update endpoint --- Procfile | 1 + lib/travis/api/app/endpoint/builds.rb | 4 ++- lib/travis/api/workers/build_cancellation.rb | 29 ++++++++++++++++++++ lib/travis/sidekiq.rb | 7 +++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 lib/travis/api/workers/build_cancellation.rb create mode 100644 lib/travis/sidekiq.rb diff --git a/Procfile b/Procfile index bbb53736..347e81f3 100644 --- a/Procfile +++ b/Procfile @@ -1,2 +1,3 @@ web: bundle exec ./script/server console: bundle exec ./script/console +sidekiq: bundle exec sidekiq -c 5 -r ./lib/travis/sidekiq.rb -q build_cancellations diff --git a/lib/travis/api/app/endpoint/builds.rb b/lib/travis/api/app/endpoint/builds.rb index 2f1e5837..d38d5fe3 100644 --- a/lib/travis/api/app/endpoint/builds.rb +++ b/lib/travis/api/app/endpoint/builds.rb @@ -37,7 +37,9 @@ class Travis::Api::App status 422 respond_with json else - service.run + #service.run + #check syntax of line below + Travis::Sidekiq::BuildCancellation.perform_async(params.merge(source: 'api')) Metriks.meter("api.request.cancel_build.success").mark status 204 diff --git a/lib/travis/api/workers/build_cancellation.rb b/lib/travis/api/workers/build_cancellation.rb new file mode 100644 index 00000000..be19d31b --- /dev/null +++ b/lib/travis/api/workers/build_cancellation.rb @@ -0,0 +1,29 @@ +require 'sidekiq/worker' +require 'multi_json' + +module Travis + module Sidekiq + class BuildCancellation + class ProcessingError < StandardError; end + + include ::Sidekiq::Worker + # do we need to name the queue here? we didn't do this in Admin. We passed this info in the procfile + sidekiq_options queue: build_cancellations + + attr_accessor :data + + def perform(data) + @data = data + if payload + service.run + else + Travis.logger.warn("The #{type} payload was empty and could not be processed") + end + end + + def service + @service ||= Travis.service(:cancel_build, data) + end + end + end +end \ No newline at end of file diff --git a/lib/travis/sidekiq.rb b/lib/travis/sidekiq.rb new file mode 100644 index 00000000..3f871713 --- /dev/null +++ b/lib/travis/sidekiq.rb @@ -0,0 +1,7 @@ +$: << './lib' +require 'travis/core' +require 'travis/app/workers/build_cancellation' + +Sidekiq.configure_server do |config| + config.redis = Travis.config.redis.merge(namespace: Travis.config.sidekiq.namespace) +end \ No newline at end of file From cab128f06e9ee159bb388cf7934ea17855cfc8fb Mon Sep 17 00:00:00 2001 From: carlad <carla@travis-ci.org> Date: Thu, 22 Jan 2015 11:10:27 +0100 Subject: [PATCH 02/12] refactor buildcancellation worker --- lib/travis/api/workers/build_cancellation.rb | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/lib/travis/api/workers/build_cancellation.rb b/lib/travis/api/workers/build_cancellation.rb index be19d31b..adecf1ec 100644 --- a/lib/travis/api/workers/build_cancellation.rb +++ b/lib/travis/api/workers/build_cancellation.rb @@ -10,19 +10,8 @@ module Travis # do we need to name the queue here? we didn't do this in Admin. We passed this info in the procfile sidekiq_options queue: build_cancellations - attr_accessor :data - def perform(data) - @data = data - if payload - service.run - else - Travis.logger.warn("The #{type} payload was empty and could not be processed") - end - end - - def service - @service ||= Travis.service(:cancel_build, data) + Travis.service(:cancel_build, data).run end end end From 9b4d1219567e5098736cff4a5d510019c2efbb51 Mon Sep 17 00:00:00 2001 From: carlad <carla@travis-ci.org> Date: Thu, 22 Jan 2015 11:10:27 +0100 Subject: [PATCH 03/12] refactor buildcancellation worker --- .gitignore | 1 + lib/travis/api/app/endpoint/builds.rb | 3 ++- lib/travis/api/workers/build_cancellation.rb | 18 +++--------------- spec/integration/v2/builds_spec.rb | 17 ++++++++++------- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 68072775..e5dd18e6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ config/travis.yml log/ vendor config/skylight.yml +.coverage diff --git a/lib/travis/api/app/endpoint/builds.rb b/lib/travis/api/app/endpoint/builds.rb index d38d5fe3..ed1888d3 100644 --- a/lib/travis/api/app/endpoint/builds.rb +++ b/lib/travis/api/app/endpoint/builds.rb @@ -1,4 +1,5 @@ require 'travis/api/app' +require 'travis/api/workers/build_cancellation' class Travis::Api::App class Endpoint @@ -39,7 +40,7 @@ class Travis::Api::App else #service.run #check syntax of line below - Travis::Sidekiq::BuildCancellation.perform_async(params.merge(source: 'api')) + Travis::Sidekiq::BuildCancellation.perform_async(id: params[:id], source: 'api') Metriks.meter("api.request.cancel_build.success").mark status 204 diff --git a/lib/travis/api/workers/build_cancellation.rb b/lib/travis/api/workers/build_cancellation.rb index be19d31b..019627ca 100644 --- a/lib/travis/api/workers/build_cancellation.rb +++ b/lib/travis/api/workers/build_cancellation.rb @@ -7,23 +7,11 @@ module Travis class ProcessingError < StandardError; end include ::Sidekiq::Worker - # do we need to name the queue here? we didn't do this in Admin. We passed this info in the procfile - sidekiq_options queue: build_cancellations - - attr_accessor :data + sidekiq_options queue: :build_cancellations def perform(data) - @data = data - if payload - service.run - else - Travis.logger.warn("The #{type} payload was empty and could not be processed") - end - end - - def service - @service ||= Travis.service(:cancel_build, data) + Travis.service(:cancel_build, data).run end end end -end \ No newline at end of file +end diff --git a/spec/integration/v2/builds_spec.rb b/spec/integration/v2/builds_spec.rb index 4c528c53..8f47aca2 100644 --- a/spec/integration/v2/builds_spec.rb +++ b/spec/integration/v2/builds_spec.rb @@ -75,17 +75,20 @@ describe 'Builds' do end context 'when build can be canceled' do - it 'cancels the build and responds with 204' do + before do + Travis::Sidekiq::BuildCancellation.stubs(:perform_async) build.matrix.each { |j| j.update_attribute(:state, 'created') } build.update_attribute(:state, 'created') + end - response = nil - expect { - response = post "/builds/#{build.id}/cancel", {}, headers - }.to change { build.reload.state } + it 'cancels the build' do + Travis::Sidekiq::BuildCancellation.expects(:perform_async).with(id: build.id.to_s, source: 'api') + post "/builds/#{build.id}/cancel", {}, headers + end + + it 'responds with 204' do + response = post "/builds/#{build.id}/cancel", {}, headers response.status.should == 204 - - build.state.should == 'canceled' end end end From 057e9f0379fcde9e142058d0de41f39478f50316 Mon Sep 17 00:00:00 2001 From: Tyranja <tyranja@cassiopeia.uberspace.de> Date: Thu, 22 Jan 2015 15:26:13 +0100 Subject: [PATCH 04/12] add Sidekiq for cancelling build : add require sidekiq to the sidekiq.rb update Gemfile.lock bump travis-sidekiqs correct require statement fix another request connect to the database add current user add current user correctly add current user correctly add puts to see were in the condition we are missing invertted comma add comments to the worker I HAVE NO IDEA Revert "I HAVE NO IDEA" This reverts commit 8bd1259bf4ea1b479f9391847a4700b7b15efe57. change the id and source to symbols in the params because siedekiq expects that add more printout setup database connection, metrics and notification correct the test --- Gemfile | 2 +- Gemfile.lock | 43 +++++--------------- lib/travis/api/app/endpoint/builds.rb | 2 +- lib/travis/api/workers/build_cancellation.rb | 8 +++- lib/travis/sidekiq.rb | 13 ++++-- spec/integration/v2/builds_spec.rb | 2 +- 6 files changed, 31 insertions(+), 39 deletions(-) diff --git a/Gemfile b/Gemfile index 7a2f174e..85f6635c 100644 --- a/Gemfile +++ b/Gemfile @@ -8,7 +8,7 @@ gem 's3', github: 'travis-ci/s3' gem 'travis-core', github: 'travis-ci/travis-core' gem 'travis-support', github: 'travis-ci/travis-support' gem 'travis-config', '~> 0.1.0' -gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs', require: nil, ref: 'cde9741' +gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs', require: nil gem 'travis-yaml', github: 'travis-ci/travis-yaml' gem 'sinatra' gem 'sinatra-contrib', require: nil #github: 'sinatra/sinatra-contrib', require: nil diff --git a/Gemfile.lock b/Gemfile.lock index 3f38a26c..d17be03c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -67,11 +67,10 @@ GIT GIT remote: git://github.com/travis-ci/travis-sidekiqs.git - revision: cde9741f8e6811fe3929bdd0dd653b87289c5eef - ref: cde9741 + revision: 21a2fee158e25252dd78f5fa31e81b4f6583be23 specs: travis-sidekiqs (0.0.1) - sidekiq (~> 2.5.0) + sidekiq GIT remote: git://github.com/travis-ci/travis-support.git @@ -143,26 +142,13 @@ GEM backports (2.8.2) builder (3.0.4) bunny (0.8.0) - celluloid (0.12.0) - timers (>= 1.0.0) - chunky_png (1.3.3) + celluloid (0.16.0) + timers (~> 4.0.0) coder (0.4.0) coderay (1.1.0) coercible (1.0.0) descendants_tracker (~> 0.0.1) - compass (1.0.1) - chunky_png (~> 1.2) - compass-core (~> 1.0.1) - compass-import-once (~> 1.0.5) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9) - sass (>= 3.3.13, < 3.5) - compass-core (1.0.1) - multi_json (~> 1.0) - sass (>= 3.3.0, < 3.5) - compass-import-once (1.0.5) - sass (>= 3.2, < 3.5) - connection_pool (0.9.3) + connection_pool (2.1.1) daemons (1.1.9) dalli (2.7.2) data_migrations (0.0.1) @@ -277,16 +263,12 @@ GEM rspec-expectations (2.99.2) diff-lcs (>= 1.1.3, < 2.0) rspec-mocks (2.99.2) - sass (3.4.6) - sidekiq (2.5.0) - celluloid (~> 0.12.0) - compass - connection_pool (~> 0.9.2) - multi_json (~> 1) - redis (~> 3) - redis-namespace - sass - sprockets-sass + sidekiq (3.3.0) + celluloid (>= 0.16.0) + connection_pool (>= 2.0.0) + json + redis (>= 3.0.6) + redis-namespace (>= 1.3.1) signature (0.1.7) simple_states (1.0.1) activesupport @@ -310,9 +292,6 @@ GEM multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - sprockets-sass (1.2.0) - sprockets (~> 2.0) - tilt (~> 1.1) thin (1.6.3) daemons (~> 1.0, >= 1.0.9) eventmachine (~> 1.0) diff --git a/lib/travis/api/app/endpoint/builds.rb b/lib/travis/api/app/endpoint/builds.rb index ed1888d3..ea4bb6b7 100644 --- a/lib/travis/api/app/endpoint/builds.rb +++ b/lib/travis/api/app/endpoint/builds.rb @@ -40,7 +40,7 @@ class Travis::Api::App else #service.run #check syntax of line below - Travis::Sidekiq::BuildCancellation.perform_async(id: params[:id], source: 'api') + Travis::Sidekiq::BuildCancellation.perform_async(id: params[:id], user_id: current_user.id, source: 'api') Metriks.meter("api.request.cancel_build.success").mark status 204 diff --git a/lib/travis/api/workers/build_cancellation.rb b/lib/travis/api/workers/build_cancellation.rb index 019627ca..0fd5ad7c 100644 --- a/lib/travis/api/workers/build_cancellation.rb +++ b/lib/travis/api/workers/build_cancellation.rb @@ -10,8 +10,14 @@ module Travis sidekiq_options queue: :build_cancellations def perform(data) - Travis.service(:cancel_build, data).run + p "#######################" + p data + user = User.find(data['user_id']) + test = { id: data['id'], source: data['source'] } + p test + Travis.service(:cancel_build, user, { id: data['id'], source: data['source'] }).run end + end end end diff --git a/lib/travis/sidekiq.rb b/lib/travis/sidekiq.rb index 3f871713..a144d5da 100644 --- a/lib/travis/sidekiq.rb +++ b/lib/travis/sidekiq.rb @@ -1,7 +1,14 @@ $: << './lib' -require 'travis/core' -require 'travis/app/workers/build_cancellation' +require 'sidekiq' +require 'travis' +require 'travis/api/workers/build_cancellation' +require 'travis/support/amqp' + +Travis::Database.connect +Travis::Amqp.config = Travis.config.amqp +Travis::Metrics.setup +Travis::Notification.setup Sidekiq.configure_server do |config| config.redis = Travis.config.redis.merge(namespace: Travis.config.sidekiq.namespace) -end \ No newline at end of file +end diff --git a/spec/integration/v2/builds_spec.rb b/spec/integration/v2/builds_spec.rb index 8f47aca2..d254229d 100644 --- a/spec/integration/v2/builds_spec.rb +++ b/spec/integration/v2/builds_spec.rb @@ -82,7 +82,7 @@ describe 'Builds' do end it 'cancels the build' do - Travis::Sidekiq::BuildCancellation.expects(:perform_async).with(id: build.id.to_s, source: 'api') + Travis::Sidekiq::BuildCancellation.expects(:perform_async).with( id: build.id.to_s, user_id: user.id, source: 'api') post "/builds/#{build.id}/cancel", {}, headers end From d7ee8b4d3bb3f562e9d1c162c8cbda950c1b5d5d Mon Sep 17 00:00:00 2001 From: Tyranja <tyranja@cassiopeia.uberspace.de> Date: Fri, 23 Jan 2015 14:49:47 +0100 Subject: [PATCH 05/12] enable Async and configure the Sidekiq client --- lib/travis/sidekiq.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/travis/sidekiq.rb b/lib/travis/sidekiq.rb index a144d5da..c847d523 100644 --- a/lib/travis/sidekiq.rb +++ b/lib/travis/sidekiq.rb @@ -5,6 +5,7 @@ require 'travis/api/workers/build_cancellation' require 'travis/support/amqp' Travis::Database.connect +Travis::Async.enabled = true Travis::Amqp.config = Travis.config.amqp Travis::Metrics.setup Travis::Notification.setup @@ -12,3 +13,7 @@ Travis::Notification.setup Sidekiq.configure_server do |config| config.redis = Travis.config.redis.merge(namespace: Travis.config.sidekiq.namespace) end + +Sidekiq.configure_client do |config| + config.redis = Travis.config.redis.merge(size: 1, namespace: Travis.config.sidekiq.namespace) +end From 1bbddee17d3b69b7c2ca8de09a31dbf5f45f72bf Mon Sep 17 00:00:00 2001 From: Tyranja <tyranja@cassiopeia.uberspace.de> Date: Fri, 23 Jan 2015 14:54:49 +0100 Subject: [PATCH 06/12] take out the comments --- lib/travis/api/workers/build_cancellation.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/travis/api/workers/build_cancellation.rb b/lib/travis/api/workers/build_cancellation.rb index 0fd5ad7c..bf1eca76 100644 --- a/lib/travis/api/workers/build_cancellation.rb +++ b/lib/travis/api/workers/build_cancellation.rb @@ -10,11 +10,7 @@ module Travis sidekiq_options queue: :build_cancellations def perform(data) - p "#######################" - p data user = User.find(data['user_id']) - test = { id: data['id'], source: data['source'] } - p test Travis.service(:cancel_build, user, { id: data['id'], source: data['source'] }).run end From d8674a37154423422db613cbfb4c2e3cadb32386 Mon Sep 17 00:00:00 2001 From: Tyranja <tyranja@cassiopeia.uberspace.de> Date: Fri, 23 Jan 2015 14:54:49 +0100 Subject: [PATCH 07/12] take out the comments --- Procfile | 1 + lib/travis/api/app/endpoint/builds.rb | 5 ++++- lib/travis/api/workers/build_cancellation.rb | 4 ---- lib/travis/api/workers/build_restart.rb | 19 +++++++++++++++++++ lib/travis/sidekiq.rb | 1 + 5 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 lib/travis/api/workers/build_restart.rb diff --git a/Procfile b/Procfile index 347e81f3..0d2df168 100644 --- a/Procfile +++ b/Procfile @@ -1,3 +1,4 @@ web: bundle exec ./script/server console: bundle exec ./script/console sidekiq: bundle exec sidekiq -c 5 -r ./lib/travis/sidekiq.rb -q build_cancellations +sidekiq: bundle exec sidekiq -c 5 -r ./lib/travis/sidekiq.rb -q build_restart diff --git a/lib/travis/api/app/endpoint/builds.rb b/lib/travis/api/app/endpoint/builds.rb index ea4bb6b7..f6a983e1 100644 --- a/lib/travis/api/app/endpoint/builds.rb +++ b/lib/travis/api/app/endpoint/builds.rb @@ -1,5 +1,6 @@ require 'travis/api/app' require 'travis/api/workers/build_cancellation' +require 'travis/api/workers/build_restart' class Travis::Api::App class Endpoint @@ -49,7 +50,9 @@ class Travis::Api::App post '/:id/restart' do Metriks.meter("api.request.restart_build").mark - respond_with service(:reset_model, build_id: params[:id]) + + Travis::Sidekiq::BuildRestart.perform_async(id: params[:id], user_id: current_user.id) + #respond_with service(:reset_model, build_id: params[:id]) end end end diff --git a/lib/travis/api/workers/build_cancellation.rb b/lib/travis/api/workers/build_cancellation.rb index 0fd5ad7c..bf1eca76 100644 --- a/lib/travis/api/workers/build_cancellation.rb +++ b/lib/travis/api/workers/build_cancellation.rb @@ -10,11 +10,7 @@ module Travis sidekiq_options queue: :build_cancellations def perform(data) - p "#######################" - p data user = User.find(data['user_id']) - test = { id: data['id'], source: data['source'] } - p test Travis.service(:cancel_build, user, { id: data['id'], source: data['source'] }).run end diff --git a/lib/travis/api/workers/build_restart.rb b/lib/travis/api/workers/build_restart.rb new file mode 100644 index 00000000..a4fda5dc --- /dev/null +++ b/lib/travis/api/workers/build_restart.rb @@ -0,0 +1,19 @@ +require 'sidekiq/worker' +require 'multi_json' + +module Travis + module Sidekiq + class BuildRestart + class ProcessingError < StandardError; end + + include ::Sidekiq::Worker + sidekiq_options queue: :build_restart + + def perform(data) + user = User.find(data['user_id']) + Travis.service(:reset_model, user, build_id: data['id']).run + end + + end + end +end diff --git a/lib/travis/sidekiq.rb b/lib/travis/sidekiq.rb index c847d523..68cf3ead 100644 --- a/lib/travis/sidekiq.rb +++ b/lib/travis/sidekiq.rb @@ -2,6 +2,7 @@ $: << './lib' require 'sidekiq' require 'travis' require 'travis/api/workers/build_cancellation' +require 'travis/api/workers/build_restart' require 'travis/support/amqp' Travis::Database.connect From cd3e38b3e9103f9a5385a1d3ff665b07994faedb Mon Sep 17 00:00:00 2001 From: Tyranja <tyranja@cassiopeia.uberspace.de> Date: Fri, 23 Jan 2015 15:42:07 +0100 Subject: [PATCH 08/12] add the sidekiq queue in the Procfile differently --- Procfile | 3 +-- lib/travis/api/workers/build_restart.rb | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Procfile b/Procfile index 0d2df168..3c9c0456 100644 --- a/Procfile +++ b/Procfile @@ -1,4 +1,3 @@ web: bundle exec ./script/server console: bundle exec ./script/console -sidekiq: bundle exec sidekiq -c 5 -r ./lib/travis/sidekiq.rb -q build_cancellations -sidekiq: bundle exec sidekiq -c 5 -r ./lib/travis/sidekiq.rb -q build_restart +sidekiq: bundle exec sidekiq -c 5 -r ./lib/travis/sidekiq.rb -q build_cancellations, -q build_restarts diff --git a/lib/travis/api/workers/build_restart.rb b/lib/travis/api/workers/build_restart.rb index a4fda5dc..427bc24b 100644 --- a/lib/travis/api/workers/build_restart.rb +++ b/lib/travis/api/workers/build_restart.rb @@ -7,7 +7,7 @@ module Travis class ProcessingError < StandardError; end include ::Sidekiq::Worker - sidekiq_options queue: :build_restart + sidekiq_options queue: :build_restarts def perform(data) user = User.find(data['user_id']) From a9c31fa5e989681760396cb2ca026dc92353d96d Mon Sep 17 00:00:00 2001 From: Tyranja <tyranja@cassiopeia.uberspace.de> Date: Fri, 23 Jan 2015 16:02:29 +0100 Subject: [PATCH 09/12] Extract cancel and restart builds and jobs into sidekiq worker See below for all the commit messages squashed into this one... add a test delete empty space add job_cancellation worker change id change job_id param add job restart worker add require to sidekiq.rb change params add test for job restart and cancellation add test for job restart update build.rb improve build spec update job restart with correct response, add test to chack for correct response when restarting job --- Procfile | 2 +- lib/travis/api/app/endpoint/builds.rb | 14 ++++-- lib/travis/api/app/endpoint/jobs.rb | 16 ++++++- lib/travis/api/workers/job_cancellation.rb | 19 ++++++++ lib/travis/api/workers/job_restart.rb | 19 ++++++++ lib/travis/sidekiq.rb | 2 + spec/integration/v2/builds_spec.rb | 40 +++++++++++++++++ spec/integration/v2/jobs_spec.rb | 52 +++++++++++++++++++--- 8 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 lib/travis/api/workers/job_cancellation.rb create mode 100644 lib/travis/api/workers/job_restart.rb diff --git a/Procfile b/Procfile index 3c9c0456..6d6d6353 100644 --- a/Procfile +++ b/Procfile @@ -1,3 +1,3 @@ web: bundle exec ./script/server console: bundle exec ./script/console -sidekiq: bundle exec sidekiq -c 5 -r ./lib/travis/sidekiq.rb -q build_cancellations, -q build_restarts +sidekiq: bundle exec sidekiq -c 5 -r ./lib/travis/sidekiq.rb -q build_cancellations, -q build_restarts, -q job_cancellations, -q job_restarts diff --git a/lib/travis/api/app/endpoint/builds.rb b/lib/travis/api/app/endpoint/builds.rb index f6a983e1..ca0d56b3 100644 --- a/lib/travis/api/app/endpoint/builds.rb +++ b/lib/travis/api/app/endpoint/builds.rb @@ -39,8 +39,6 @@ class Travis::Api::App status 422 respond_with json else - #service.run - #check syntax of line below Travis::Sidekiq::BuildCancellation.perform_async(id: params[:id], user_id: current_user.id, source: 'api') Metriks.meter("api.request.cancel_build.success").mark @@ -51,8 +49,16 @@ class Travis::Api::App post '/:id/restart' do Metriks.meter("api.request.restart_build").mark - Travis::Sidekiq::BuildRestart.perform_async(id: params[:id], user_id: current_user.id) - #respond_with service(:reset_model, build_id: params[:id]) + service = self.service(:reset_model, build_id: params[:id]) + if !service.accept? + status 400 + result = false + else + Travis::Sidekiq::BuildRestart.perform_async(id: params[:id], user_id: current_user.id) + status 200 + result = true + end + respond_with(result: result, flash: service.messages) end end end diff --git a/lib/travis/api/app/endpoint/jobs.rb b/lib/travis/api/app/endpoint/jobs.rb index 0d65e78e..d856093c 100644 --- a/lib/travis/api/app/endpoint/jobs.rb +++ b/lib/travis/api/app/endpoint/jobs.rb @@ -1,4 +1,6 @@ require 'travis/api/app' +require 'travis/api/workers/job_cancellation' +require 'travis/api/workers/job_restart' class Travis::Api::App class Endpoint @@ -44,7 +46,7 @@ class Travis::Api::App status 422 respond_with json else - service.run + Travis::Sidekiq::JobCancellation.perform_async(id: params[:id], user_id: current_user.id, source: 'api') Metriks.meter("api.request.cancel_job.success").mark status 204 @@ -53,7 +55,17 @@ class Travis::Api::App post '/:id/restart' do Metriks.meter("api.request.restart_job").mark - respond_with service(:reset_model, job_id: params[:id]) + + service = self.service(:reset_model, job_id: params[:id]) + if !service.accept? + status 400 + result = false + else + Travis::Sidekiq::JobRestart.perform_async(id: params[:id], user_id: current_user.id) + status 200 + result = true + end + respond_with(result: result, flash: service.messages) end get '/:job_id/log' do diff --git a/lib/travis/api/workers/job_cancellation.rb b/lib/travis/api/workers/job_cancellation.rb new file mode 100644 index 00000000..dadf60d0 --- /dev/null +++ b/lib/travis/api/workers/job_cancellation.rb @@ -0,0 +1,19 @@ +require 'sidekiq/worker' +require 'multi_json' + +module Travis + module Sidekiq + class JobCancellation + class ProcessingError < StandardError; end + + include ::Sidekiq::Worker + sidekiq_options queue: :job_cancellations + + def perform(data) + user = User.find(data['user_id']) + Travis.service(:cancel_job, user, { id: data['id'], source: data['source'] }).run + end + + end + end +end diff --git a/lib/travis/api/workers/job_restart.rb b/lib/travis/api/workers/job_restart.rb new file mode 100644 index 00000000..12ab6b33 --- /dev/null +++ b/lib/travis/api/workers/job_restart.rb @@ -0,0 +1,19 @@ +require 'sidekiq/worker' +require 'multi_json' + +module Travis + module Sidekiq + class JobRestart + class ProcessingError < StandardError; end + + include ::Sidekiq::Worker + sidekiq_options queue: :job_restarts + + def perform(data) + user = User.find(data['user_id']) + Travis.service(:reset_model, user, job_id: data['id']).run + end + + end + end +end diff --git a/lib/travis/sidekiq.rb b/lib/travis/sidekiq.rb index 68cf3ead..14b62d63 100644 --- a/lib/travis/sidekiq.rb +++ b/lib/travis/sidekiq.rb @@ -3,6 +3,8 @@ require 'sidekiq' require 'travis' require 'travis/api/workers/build_cancellation' require 'travis/api/workers/build_restart' +require 'travis/api/workers/job_cancellation' +require 'travis/api/workers/job_restart' require 'travis/support/amqp' Travis::Database.connect diff --git a/spec/integration/v2/builds_spec.rb b/spec/integration/v2/builds_spec.rb index d254229d..b1c20506 100644 --- a/spec/integration/v2/builds_spec.rb +++ b/spec/integration/v2/builds_spec.rb @@ -92,4 +92,44 @@ describe 'Builds' do end end end + + describe 'POST /builds/:id/restart' do + let(:user) { User.where(login: 'svenfuchs').first } + let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: -1) } + + before { + headers.merge! 'HTTP_AUTHORIZATION' => "token #{token}" + user.permissions.create!(repository_id: build.repository.id, :pull => true, :push => true) + } + + context 'when restart is not acceptable' do + before { user.permissions.destroy_all } + + it 'responds with 400' do + response = post "/builds/#{build.id}/restart", {}, headers + response.status.should == 400 + end + end + + context 'when build passed' do + before do + Travis::Sidekiq::BuildCancellation.stubs(:perform_async) + build.matrix.each { |j| j.update_attribute(:state, 'passed') } + build.update_attribute(:state, 'passed') + end + + it 'restarts the build' do + Travis::Sidekiq::BuildRestart.expects(:perform_async).with(id: build.id.to_s, user_id: user.id) + response = post "/builds/#{build.id}/restart", {}, headers + response.status.should == 200 + end + + it 'sends the correct response body' do + Travis::Sidekiq::BuildRestart.expects(:perform_async).with(id: build.id.to_s, user_id: user.id) + response = post "/builds/#{build.id}/restart", {}, headers + body = JSON.parse(response.body) + body.should == {"result"=>true, "flash"=>[{"notice"=>"The build was successfully restarted."}]} + end + end + end end diff --git a/spec/integration/v2/jobs_spec.rb b/spec/integration/v2/jobs_spec.rb index a17a4b17..372a5245 100644 --- a/spec/integration/v2/jobs_spec.rb +++ b/spec/integration/v2/jobs_spec.rb @@ -242,16 +242,56 @@ describe 'Jobs' do end context 'when job can be canceled' do - it 'cancels the job and responds with 204' do + before do job.update_attribute(:state, 'created') + end - response = nil - expect { - response = post "/jobs/#{job.id}/cancel", {}, headers - }.to change { job.reload.state } + it 'cancels the job' do + Travis::Sidekiq::JobCancellation.expects(:perform_async).with( id: job.id.to_s, user_id: user.id, source: 'api') + post "/jobs/#{job.id}/cancel", {}, headers + end + + it 'responds with 204' do + response = post "/jobs/#{job.id}/cancel", {}, headers response.status.should == 204 + end + end + end - job.state.should == 'canceled' + describe 'POST /jobs/:id/restart' do + let(:user) { User.where(login: 'svenfuchs').first } + let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: -1) } + + before { + headers.merge! 'HTTP_AUTHORIZATION' => "token #{token}" + user.permissions.create!(repository_id: job.repository.id, :pull => true, :push => true) + } + + context 'when restart is not acceptable' do + before { user.permissions.destroy_all } + + it 'responds with 400' do + response = post "/jobs/#{job.id}/restart", {}, headers + response.status.should == 400 + end + end + + context 'when job passed' do + before do + Travis::Sidekiq::JobCancellation.stubs(:perform_async) + job.update_attribute(:state, 'passed') + end + + it 'restarts the job' do + Travis::Sidekiq::JobRestart.expects(:perform_async).with(id: job.id.to_s, user_id: user.id) + response = post "/jobs/#{job.id}/restart", {}, headers + response.status.should == 200 + end + it 'sends the correct response body' do + Travis::Sidekiq::JobRestart.expects(:perform_async).with(id: job.id.to_s, user_id: user.id) + response = post "/jobs/#{job.id}/restart", {}, headers + body = JSON.parse(response.body) + body.should == {"result"=>true, "flash"=>[{"notice"=>"The job was successfully restarted."}]} end end end From d050ebc0183961b7ebe7c902b0174cb2a6069918 Mon Sep 17 00:00:00 2001 From: carlad <carla@travis-ci.org> Date: Tue, 27 Jan 2015 12:48:13 +0100 Subject: [PATCH 10/12] update status code, remove unnecessary line --- lib/travis/api/app/endpoint/builds.rb | 2 +- lib/travis/sidekiq.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/travis/api/app/endpoint/builds.rb b/lib/travis/api/app/endpoint/builds.rb index ca0d56b3..91d375dc 100644 --- a/lib/travis/api/app/endpoint/builds.rb +++ b/lib/travis/api/app/endpoint/builds.rb @@ -55,7 +55,7 @@ class Travis::Api::App result = false else Travis::Sidekiq::BuildRestart.perform_async(id: params[:id], user_id: current_user.id) - status 200 + status 202 result = true end respond_with(result: result, flash: service.messages) diff --git a/lib/travis/sidekiq.rb b/lib/travis/sidekiq.rb index 14b62d63..6822f930 100644 --- a/lib/travis/sidekiq.rb +++ b/lib/travis/sidekiq.rb @@ -1,4 +1,4 @@ -$: << './lib' +#$: << './lib' require 'sidekiq' require 'travis' require 'travis/api/workers/build_cancellation' From f39d931857340aef8655dbc969d14a9af8126c85 Mon Sep 17 00:00:00 2001 From: carlad <carla@travis-ci.org> Date: Tue, 27 Jan 2015 13:31:12 +0100 Subject: [PATCH 11/12] update response status ans specs --- lib/travis/api/app/endpoint/jobs.rb | 2 +- spec/integration/v2/builds_spec.rb | 2 +- spec/integration/v2/jobs_spec.rb | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/travis/api/app/endpoint/jobs.rb b/lib/travis/api/app/endpoint/jobs.rb index d856093c..9bb2fbc9 100644 --- a/lib/travis/api/app/endpoint/jobs.rb +++ b/lib/travis/api/app/endpoint/jobs.rb @@ -62,7 +62,7 @@ class Travis::Api::App result = false else Travis::Sidekiq::JobRestart.perform_async(id: params[:id], user_id: current_user.id) - status 200 + status 202 result = true end respond_with(result: result, flash: service.messages) diff --git a/spec/integration/v2/builds_spec.rb b/spec/integration/v2/builds_spec.rb index b1c20506..e36aeeb2 100644 --- a/spec/integration/v2/builds_spec.rb +++ b/spec/integration/v2/builds_spec.rb @@ -121,7 +121,7 @@ describe 'Builds' do it 'restarts the build' do Travis::Sidekiq::BuildRestart.expects(:perform_async).with(id: build.id.to_s, user_id: user.id) response = post "/builds/#{build.id}/restart", {}, headers - response.status.should == 200 + response.status.should == 202 end it 'sends the correct response body' do diff --git a/spec/integration/v2/jobs_spec.rb b/spec/integration/v2/jobs_spec.rb index 372a5245..51afa156 100644 --- a/spec/integration/v2/jobs_spec.rb +++ b/spec/integration/v2/jobs_spec.rb @@ -159,9 +159,9 @@ describe 'Jobs' do user.permissions.create!(repository_id: finished_job.repository.id, :push => true) end - it 'returns status 200' do + it 'returns status 202' do response = patch "/jobs/#{finished_job.id}/log", { reason: 'Because reason!' }, headers - response.status.should == 200 + response.status.should == 202 end end @@ -285,7 +285,7 @@ describe 'Jobs' do it 'restarts the job' do Travis::Sidekiq::JobRestart.expects(:perform_async).with(id: job.id.to_s, user_id: user.id) response = post "/jobs/#{job.id}/restart", {}, headers - response.status.should == 200 + response.status.should == 202 end it 'sends the correct response body' do Travis::Sidekiq::JobRestart.expects(:perform_async).with(id: job.id.to_s, user_id: user.id) From 6991c6bb2b2b64e6ccaf31e0c7f49a34723699d5 Mon Sep 17 00:00:00 2001 From: carlad <carla@travis-ci.org> Date: Tue, 27 Jan 2015 13:34:12 +0100 Subject: [PATCH 12/12] update spec --- spec/integration/v2/jobs_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/integration/v2/jobs_spec.rb b/spec/integration/v2/jobs_spec.rb index 51afa156..81486845 100644 --- a/spec/integration/v2/jobs_spec.rb +++ b/spec/integration/v2/jobs_spec.rb @@ -159,9 +159,9 @@ describe 'Jobs' do user.permissions.create!(repository_id: finished_job.repository.id, :push => true) end - it 'returns status 202' do + it 'returns status 200' do response = patch "/jobs/#{finished_job.id}/log", { reason: 'Because reason!' }, headers - response.status.should == 202 + response.status.should == 200 end end