Use CancelModel on Jobs endpoint

This commit is contained in:
Ana Rosas 2016-05-27 16:15:41 +02:00
parent ef7811ead9
commit 29f80ab31b
2 changed files with 45 additions and 2 deletions

View File

@ -2,6 +2,7 @@ require 'travis/api/app'
require 'travis/api/workers/job_cancellation' require 'travis/api/workers/job_cancellation'
require 'travis/api/workers/job_restart' require 'travis/api/workers/job_restart'
require 'travis/api/enqueue/services/restart_model' require 'travis/api/enqueue/services/restart_model'
require 'travis/api/enqueue/services/cancel_model'
class Travis::Api::App class Travis::Api::App
class Endpoint class Endpoint
@ -28,7 +29,12 @@ class Travis::Api::App
post '/:id/cancel' do post '/:id/cancel' do
Metriks.meter("api.request.cancel_job").mark Metriks.meter("api.request.cancel_job").mark
if Travis::Features.owner_active?(:enqueue_to_hub, current_user)
service = Travis::Enqueue::Services::CancelModel.new(current_user, { job_id: params[:id] })
else
service = self.service(:cancel_job, params.merge(source: 'api')) service = self.service(:cancel_job, params.merge(source: 'api'))
end
if !service.authorized? if !service.authorized?
json = { error: { json = { error: {
message: "You don't have access to cancel job(#{params[:id]})" message: "You don't have access to cancel job(#{params[:id]})"
@ -46,8 +52,12 @@ class Travis::Api::App
Metriks.meter("api.request.cancel_job.cant_cancel").mark Metriks.meter("api.request.cancel_job.cant_cancel").mark
status 422 status 422
respond_with json respond_with json
else
if service.respond_to?(:enqueue_to_hub)
service.enqueue_to_hub
else else
Travis::Sidekiq::JobCancellation.perform_async(id: params[:id], user_id: current_user.id, source: 'api') Travis::Sidekiq::JobCancellation.perform_async(id: params[:id], user_id: current_user.id, source: 'api')
end
Metriks.meter("api.request.cancel_job.success").mark Metriks.meter("api.request.cancel_job.success").mark
status 204 status 204

View File

@ -230,6 +230,15 @@ describe 'Jobs' do
response = post "/jobs/#{job.id}/cancel", {}, headers response = post "/jobs/#{job.id}/cancel", {}, headers
response.status.should == 403 response.status.should == 403
end end
context 'and tries to enqueue cancel event for the Hub' do
before { Travis::Features.activate_owner(:enqueue_to_hub, job.repository.owner) }
it 'responds with 403' do
response = post "/jobs/#{job.id}/cancel", {}, headers
response.status.should == 403
end
end
end end
context 'when job is not cancelable' do context 'when job is not cancelable' do
@ -239,6 +248,15 @@ describe 'Jobs' do
response = post "/jobs/#{job.id}/cancel", {}, headers response = post "/jobs/#{job.id}/cancel", {}, headers
response.status.should == 422 response.status.should == 422
end end
context 'and tries to enqueue cancel event for the Hub' do
before { Travis::Features.activate_owner(:enqueue_to_hub, job.repository.owner) }
it 'responds with 422' do
response = post "/jobs/#{job.id}/cancel", {}, headers
response.status.should == 422
end
end
end end
context 'when job can be canceled' do context 'when job can be canceled' do
@ -255,6 +273,21 @@ describe 'Jobs' do
response = post "/jobs/#{job.id}/cancel", {}, headers response = post "/jobs/#{job.id}/cancel", {}, headers
response.status.should == 204 response.status.should == 204
end end
context 'and enqueues cancel event for the Hub' do
before { Travis::Features.activate_owner(:enqueue_to_hub, job.repository.owner) }
it 'cancels the job' do
::Sidekiq::Client.expects(:push)
post "/jobs/#{job.id}/cancel", {}, headers
end
it 'responds with 204' do
::Sidekiq::Client.expects(:push)
response = post "/jobs/#{job.id}/cancel", {}, headers
response.status.should == 204
end
end
end end
end end