Accept build requests via api

This commit is contained in:
Sven Fuchs 2014-10-20 15:29:09 +02:00
parent 7a4f3e5c7e
commit a636e911bd
3 changed files with 114 additions and 4 deletions

View File

@ -1,13 +1,18 @@
require 'travis/api/app'
require 'travis/api/app/services/schedule_request'
class Travis::Api::App
class Endpoint
class Requests < Endpoint
post '/', scope: :private do
if params[:request] && params[:request][:repository]
respond_with service(:schedule_request, params[:request])
else
# DEPRECATED: this will be removed by 1st of December
post '/' do
Metriks.meter("api.request.restart").mark
respond_with service(:reset_model, params)
end
end
get '/' do
begin

View File

@ -0,0 +1,50 @@
require 'multi_json'
require 'travis/sidekiq/build_request'
require 'travis/services/base'
class Travis::Api::App
module Services
class ScheduleRequest < Travis::Services::Base
register :schedule_request
def run
repo && active? ? schedule_request : not_found
end
def messages
@messages ||= []
end
private
def schedule_request
Metriks.meter('api.request.create').mark
Travis::Sidekiq::BuildRequest.perform_async(type: 'api', payload: payload, credentials: {})
messages << { notice: 'Build request scheduled.' }
true
end
def not_found
messages << { error: "Repository #{slug} not found." }
false
end
def active?
Travis::Features.owner_active?(:request_create, repo.owner)
end
def payload
MultiJson.encode(params.merge(user: { id: current_user.id }))
end
def repo
@repo ||= Repository.by_slug(slug).first
end
def slug
repo = params[:repository] || {}
repo.values_at(:owner_name, :name).join('/')
end
end
end
end

View File

@ -0,0 +1,55 @@
require 'spec_helper'
describe Travis::Api::App::Endpoint::Requests do
include Travis::Testing::Stubs
let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: -1) }
let(:data) { { request: { repository: { owner_name: 'owner', name: 'name' }, branch: 'branch', config: { env: ['FOO=foo'] } } } }
let(:headers) { { 'HTTP_ACCEPT' => 'application/vnd.travis-ci.2+json, */*; q=0.01', 'HTTP_AUTHORIZATION' => %(token "#{token.token}") } }
let(:response) { post('/requests', data, headers) }
before do
User.stubs(:find_by_github_id).returns(user)
User.stubs(:find).returns(user)
end
describe 'POST to /' do
it 'needs to be authenticated' do
Travis::Api::App::AccessToken.stubs(:find_by_token).returns(nil)
expect(response.status).to eq 403
end
describe 'if the repository does not exist' do
it 'returns 404' do
expect(response.status).to eq 404
end
it 'includes a notice' do
expect(response.body).to eq '{"result":false,"flash":[{"error":"Repository owner/name not found."}]}'
end
end
describe 'if successful' do
before do
Repository.stubs(:by_slug).returns([repo])
Travis::Sidekiq::BuildRequest.stubs(:perform_async)
Travis::Features.stubs(:owner_active?).returns(true)
end
it 'returns 200' do
expect(response.status).to eq 200
end
it 'includes a notice' do
expect(response.body).to eq '{"result":true,"flash":[{"notice":"Build request scheduled."}]}'
end
it 'schedules the build request' do
payload = MultiJson.encode(data[:request].merge(user: { id: user.id }))
Travis::Sidekiq::BuildRequest.expects(:perform_async).with(type: 'api', payload: payload, credentials: {})
response
end
end
end
end