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