Commit ca23d292 authored by Steve Azzopardi's avatar Steve Azzopardi

Add runner quota information for job API

Send new property `quota` under the `runner` property, with the quota
information when the runner is of type `instance`

Add new JSON schema for ee only

Add new job_controller_spec.rb for ee only

closes https://gitlab.com/gitlab-org/gitlab-ee/issues/7441
parent 944c5d89
...@@ -5,6 +5,8 @@ class BuildDetailsEntity < JobEntity ...@@ -5,6 +5,8 @@ class BuildDetailsEntity < JobEntity
include RequestAwareEntity include RequestAwareEntity
include CiStatusHelper include CiStatusHelper
prepend ::EE::BuildDetailEntity
expose :coverage, :erased_at, :duration expose :coverage, :erased_at, :duration
expose :tag_list, as: :tags expose :tag_list, as: :tags
expose :user, using: UserEntity expose :user, using: UserEntity
......
# frozen_string_literal: true
module EE
module BuildDetailEntity
extend ActiveSupport::Concern
prepended do
expose :runners do
expose :quota, if: -> (*) { project.shared_runners_minutes_limit_enabled? } do
expose :used do |runner|
project.shared_runners_minutes.to_i
end
expose :limit do |runner|
project.actual_shared_runners_minutes_limit.to_i
end
end
end
end
end
end
---
title: Add runner quota information to job API
merge_request: 7233
author:
type: other
# coding: utf-8
# frozen_string_literal: true
require 'spec_helper'
describe Projects::JobsController, :clean_gitlab_redis_shared_state do
include ApiHelpers
include HttpIOHelpers
let(:user) { create(:user) }
before do
stub_not_protect_default_branch
end
describe 'GET show' do
context 'when requesting JSON' do
context 'with shared runner that has quota' do
let(:project) { create(:project, :private, shared_runners_enabled: true) }
let(:merge_request) { create(:merge_request, source_project: project) }
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:runner) { create(:ci_runner, :instance, description: 'Shared runner') }
let(:job) { create(:ci_build, :success, :artifacts, pipeline: pipeline, runner: runner) }
before do
project.add_developer(user)
sign_in(user)
allow_any_instance_of(Ci::Build).to receive(:merge_request).and_return(merge_request)
stub_application_setting(shared_runners_minutes: 2)
get_show(id: job.id, format: :json)
end
it 'exposes quota information' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details', dir: 'ee')
expect(json_response['runners']['quota']['used']).to eq 0
expect(json_response['runners']['quota']['limit']).to eq 2
end
end
context 'when shared runner has no quota' do
let(:project) { create(:project, :private, shared_runners_enabled: true) }
let(:merge_request) { create(:merge_request, source_project: project) }
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:runner) { create(:ci_runner, :instance, description: 'Shared runner') }
let(:job) { create(:ci_build, :success, :artifacts, pipeline: pipeline, runner: runner) }
before do
project.add_developer(user)
sign_in(user)
allow_any_instance_of(Ci::Build).to receive(:merge_request).and_return(merge_request)
stub_application_setting(shared_runners_minutes: 0)
get_show(id: job.id, format: :json)
end
it 'does not exposes quota information' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details', dir: 'ee')
expect(json_response['runners']).not_to have_key('quota')
end
end
context 'when project is public' do
let(:project) { create(:project, :public, shared_runners_enabled: true) }
let(:merge_request) { create(:merge_request, source_project: project) }
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:runner) { create(:ci_runner, :instance, description: 'Shared runner') }
let(:job) { create(:ci_build, :success, :artifacts, pipeline: pipeline, runner: runner) }
before do
project.add_developer(user)
sign_in(user)
allow_any_instance_of(Ci::Build).to receive(:merge_request).and_return(merge_request)
stub_application_setting(shared_runners_minutes: 2)
get_show(id: job.id, format: :json)
end
it 'does not exposes quota information' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details', dir: 'ee')
expect(json_response['runners']).not_to have_key('quota')
end
end
end
private
def get_show(**extra_params)
params = {
namespace_id: project.namespace.to_param,
project_id: project
}
get :show, params.merge(extra_params)
end
end
end
{
"allOf": [
{ "$ref": "../../../../../../spec/fixtures/api/schemas/job/job_details.json" },
{
"properties": {
"runner": { "$ref": "runner.json" }
}
}
]
}
{
"type": "object",
"properties": {
"quota": {
"description": "Quota information that is only shown for shared runners.",
"type": "object",
"required": [
"used",
"limit"
],
"properties": {
"used": { "type": "integer" },
"limit": { "type": "integer" }
},
"additionalProperties": false
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment