diff --git a/lib/travis/api/app/endpoint/builds.rb b/lib/travis/api/app/endpoint/builds.rb index ffa6b90a..cf6a39e0 100644 --- a/lib/travis/api/app/endpoint/builds.rb +++ b/lib/travis/api/app/endpoint/builds.rb @@ -1,7 +1,7 @@ require 'travis/api/app' require 'travis/api/workers/build_cancellation' require 'travis/api/workers/build_restart' -require 'travis/api/enqueue/services/enqueue_build' +require 'travis/api/enqueue/services/restart_model' class Travis::Api::App class Endpoint @@ -49,27 +49,24 @@ class Travis::Api::App post '/:id/restart' do Metriks.meter("api.request.restart_build").mark - if Travis::Features.owner_active?(:enqueue_to_hub, current_user) - service = Travis::Enqueue::Services::EnqueueBuild.new(current_user, params[:id]) - if !service.accept? - status 400 - result = false - else - payload = {id: params[:id], user_id: current_user.id} - service.push("build:restart", payload) - status 202 - result = true - end + service = if Travis::Features.owner_active?(:enqueue_to_hub, current_user) + Travis::Enqueue::Services::RestartModel.new(current_user, build_id: params[:id]) else - 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 202 - result = true - end + self.service(:reset_model, build_id: params[:id]) + end + + result = if !service.accept? + status 400 + false + elsif service.respond_to?(:push) + payload = { id: params[:id], user_id: current_user.id } + service.push("build:restart", payload) + status 202 + true + else + Travis::Sidekiq::BuildRestart.perform_async(id: params[:id], user_id: current_user.id) + status 202 + true end respond_with(result: result, flash: service.messages) diff --git a/lib/travis/api/app/endpoint/jobs.rb b/lib/travis/api/app/endpoint/jobs.rb index 9bb2fbc9..c4d77228 100644 --- a/lib/travis/api/app/endpoint/jobs.rb +++ b/lib/travis/api/app/endpoint/jobs.rb @@ -1,6 +1,7 @@ require 'travis/api/app' require 'travis/api/workers/job_cancellation' require 'travis/api/workers/job_restart' +require 'travis/api/enqueue/services/restart_model' class Travis::Api::App class Endpoint @@ -55,16 +56,26 @@ class Travis::Api::App post '/:id/restart' do Metriks.meter("api.request.restart_job").mark + service = if Travis::Features.owner_active?(:enqueue_to_hub, current_user) + Travis::Enqueue::Services::RestartModel.new(current_user, { job_id: params[:id] }) + else + self.service(:reset_model, job_id: params[:id]) + end - service = self.service(:reset_model, job_id: params[:id]) - if !service.accept? + result = if !service.accept? status 400 - result = false + false + elsif service.respond_to?(:push) + payload = {id: params[:id], user_id: current_user.id} + service.push("job:restart", payload) + status 202 + true else Travis::Sidekiq::JobRestart.perform_async(id: params[:id], user_id: current_user.id) status 202 result = true end + respond_with(result: result, flash: service.messages) end diff --git a/lib/travis/api/enqueue/services/enqueue_build.rb b/lib/travis/api/enqueue/services/enqueue_build.rb deleted file mode 100644 index 8776a5e6..00000000 --- a/lib/travis/api/enqueue/services/enqueue_build.rb +++ /dev/null @@ -1,49 +0,0 @@ -module Travis - module Enqueue - module Services - - class EnqueueBuild - attr_reader :current_user, :build - - def initialize(current_user, build_id) - @current_user = current_user - @build = Build.find(build_id) - end - - def push(event, payload) - ::Sidekiq::Client.push( - 'queue' => 'hub', - 'class' => 'Travis::Hub::Sidekiq::Worker', - 'args' => [event, payload] - ) - end - - def accept? - current_user && permission? && resetable? - end - - def messages - messages = [] - messages << { notice: "The build was successfully restarted." } if accept? - messages << { error: 'You do not seem to have sufficient permissions.' } unless permission? - messages << { error: "This build currently can not be restarted." } unless resetable? - messages - end - - private - - def permission? - current_user.permission?(required_role, repository_id: build.repository_id) - end - - def resetable? - build.resetable? - end - - def required_role - Travis.config.roles.reset_model - end - end - end - end -end diff --git a/lib/travis/api/enqueue/services/restart_model.rb b/lib/travis/api/enqueue/services/restart_model.rb new file mode 100644 index 00000000..ff9f5fec --- /dev/null +++ b/lib/travis/api/enqueue/services/restart_model.rb @@ -0,0 +1,64 @@ +module Travis + module Enqueue + module Services + + class RestartModel + attr_reader :current_user, :target + + def initialize(current_user, params) + @current_user = current_user + @params = params + target + end + + def push(event, payload) + if current_user && target && accept? + ::Sidekiq::Client.push( + 'queue' => 'hub', + 'class' => 'Travis::Hub::Sidekiq::Worker', + 'args' => [event, payload] + ) + end + end + + def accept? + current_user && permission? && resetable? + end + + def messages + messages = [] + messages << { notice: "The #{type} was successfully restarted." } if accept? + messages << { error: 'You do not seem to have sufficient permissions.' } unless permission? + messages << { error: "This #{type} currently can not be restarted." } unless resetable? + messages + end + + def type + @type ||= @params[:build_id] ? :build : :job + end + + def target + if type == :build + @target = Build.find(@params[:build_id]) + else + @target = Job.find(@params[:job_id]) + end + end + + private + + def permission? + current_user.permission?(required_role, repository_id: target.repository_id) + end + + def resetable? + target.resetable? + end + + def required_role + Travis.config.roles.reset_model + end + end + end + end +end diff --git a/spec/integration/v2/builds_spec.rb b/spec/integration/v2/builds_spec.rb index 98a57e26..c4e78d44 100644 --- a/spec/integration/v2/builds_spec.rb +++ b/spec/integration/v2/builds_spec.rb @@ -117,7 +117,7 @@ describe 'Builds' do build.update_attribute(:state, 'passed') end - describe 'Enqueues restart event to the Hub' do + describe 'Enqueues restart event for the Hub' do before { Travis::Features.activate_owner(:enqueue_to_hub, repo.owner) } it 'restarts the build' do diff --git a/spec/integration/v2/jobs_spec.rb b/spec/integration/v2/jobs_spec.rb index 81486845..72dac3d0 100644 --- a/spec/integration/v2/jobs_spec.rb +++ b/spec/integration/v2/jobs_spec.rb @@ -274,24 +274,51 @@ describe 'Jobs' do response = post "/jobs/#{job.id}/restart", {}, headers response.status.should == 400 end + + context 'when enqueueing for the Hub' do + before { Travis::Features.activate_owner(:enqueue_to_hub, job.repository.owner) } + + it 'responds with 400' do + response = post "/jobs/#{job.id}/restart", {}, headers + response.status.should == 400 + end + end end context 'when job passed' do - before do - Travis::Sidekiq::JobCancellation.stubs(:perform_async) - job.update_attribute(:state, 'passed') + before { job.update_attribute(:state, 'passed') } + + context 'Restart from travis-core' do + before { Travis::Sidekiq::JobCancellation.stubs(:perform_async) } + + 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 == 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) + 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 - 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 == 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) - response = post "/jobs/#{job.id}/restart", {}, headers - body = JSON.parse(response.body) - body.should == {"result"=>true, "flash"=>[{"notice"=>"The job was successfully restarted."}]} + context 'Enqueues restart event for the Hub' do + before { Travis::Features.activate_owner(:enqueue_to_hub, job.repository.owner) } + + it 'restarts the job' do + ::Sidekiq::Client.expects(:push) + response = post "/jobs/#{job.id}/restart", {}, headers + response.status.should == 202 + end + it 'sends the correct response body' do + ::Sidekiq::Client.expects(:push) + 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 end