summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/services/projects/participants_service.rb10
-rw-r--r--doc/api/resource_groups.md28
-rw-r--r--lib/api/ci/resource_groups.rb14
-rw-r--r--lib/gitlab/testing/clear_process_memory_cache_middleware.rb2
-rw-r--r--spec/requests/api/ci/resource_groups_spec.rb30
-rw-r--r--spec/support/helpers/query_recorder.rb10
6 files changed, 84 insertions, 10 deletions
diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb
index c7a34afffb3..c29770d0c5f 100644
--- a/app/services/projects/participants_service.rb
+++ b/app/services/projects/participants_service.rb
@@ -45,7 +45,7 @@ module Projects
def visible_groups
visible_groups = project.invited_groups
- unless project_owner?
+ unless project.team.owner?(current_user)
visible_groups = visible_groups.public_or_visible_to_user(current_user)
end
@@ -60,13 +60,5 @@ module Projects
def individual_project_members
project.project_members.select(*GroupMember.cached_column_list)
end
-
- def project_owner?
- if project.group.present?
- project.group.owners.include?(current_user)
- else
- project.namespace.owner == current_user
- end
- end
end
end
diff --git a/doc/api/resource_groups.md b/doc/api/resource_groups.md
index 237ba6e7d72..f70ad2f09e7 100644
--- a/doc/api/resource_groups.md
+++ b/doc/api/resource_groups.md
@@ -8,6 +8,34 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can read more about [controlling the job concurrency with resource groups](../ci/resource_groups/index.md).
+## Get all resource groups for a project
+
+```plaintext
+GET /projects/:id/resource_groups
+```
+
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|---------------------|
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/resource_groups"
+```
+
+Example of response
+
+```json
+[
+ {
+ "id": 3,
+ "key": "production",
+ "process_mode": "unordered",
+ "created_at": "2021-09-01T08:04:59.650Z",
+ "updated_at": "2021-09-01T08:04:59.650Z"
+ }
+]
+```
+
## Get a specific resource group
```plaintext
diff --git a/lib/api/ci/resource_groups.rb b/lib/api/ci/resource_groups.rb
index 3c8c68caeae..e3fd887475a 100644
--- a/lib/api/ci/resource_groups.rb
+++ b/lib/api/ci/resource_groups.rb
@@ -3,6 +3,8 @@
module API
module Ci
class ResourceGroups < ::API::Base
+ include PaginationParams
+
before { authenticate! }
feature_category :continuous_delivery
@@ -12,6 +14,18 @@ module API
requires :id, type: String, desc: 'The ID of a project'
end
resource :projects, requirements: ::API::API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ desc 'Get all resource groups for this project' do
+ success Entities::Ci::ResourceGroup
+ end
+ params do
+ use :pagination
+ end
+ get ':id/resource_groups' do
+ authorize! :read_resource_group, user_project
+
+ present paginate(user_project.resource_groups), with: Entities::Ci::ResourceGroup
+ end
+
desc 'Get a single resource group' do
success Entities::Ci::ResourceGroup
end
diff --git a/lib/gitlab/testing/clear_process_memory_cache_middleware.rb b/lib/gitlab/testing/clear_process_memory_cache_middleware.rb
index 1e69e5e142d..39bcad271be 100644
--- a/lib/gitlab/testing/clear_process_memory_cache_middleware.rb
+++ b/lib/gitlab/testing/clear_process_memory_cache_middleware.rb
@@ -11,6 +11,8 @@ module Gitlab
Gitlab::ProcessMemoryCache.cache_backend.clear
@app.call(env)
+ ensure
+ Gitlab::ProcessMemoryCache.cache_backend.clear
end
end
end
diff --git a/spec/requests/api/ci/resource_groups_spec.rb b/spec/requests/api/ci/resource_groups_spec.rb
index f5b68557a0d..864c363e6d3 100644
--- a/spec/requests/api/ci/resource_groups_spec.rb
+++ b/spec/requests/api/ci/resource_groups_spec.rb
@@ -9,6 +9,36 @@ RSpec.describe API::Ci::ResourceGroups do
let(:user) { developer }
+ describe 'GET /projects/:id/resource_groups' do
+ subject { get api("/projects/#{project.id}/resource_groups", user) }
+
+ let!(:resource_groups) { create_list(:ci_resource_group, 3, project: project) }
+
+ it 'returns all resource groups for this project', :aggregate_failures do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ resource_groups.each_index do |i|
+ expect(json_response[i]['id']).to eq(resource_groups[i].id)
+ expect(json_response[i]['key']).to eq(resource_groups[i].key)
+ expect(json_response[i]['process_mode']).to eq(resource_groups[i].process_mode)
+ expect(Time.parse(json_response[i]['created_at'])).to be_like_time(resource_groups[i].created_at)
+ expect(Time.parse(json_response[i]['updated_at'])).to be_like_time(resource_groups[i].updated_at)
+ end
+ end
+
+ context 'when user is reporter' do
+ let(:user) { reporter }
+
+ it 'returns forbidden' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
describe 'GET /projects/:id/resource_groups/:key' do
subject { get api("/projects/#{project.id}/resource_groups/#{key}", user) }
diff --git a/spec/support/helpers/query_recorder.rb b/spec/support/helpers/query_recorder.rb
index d18a1d23584..01839a74e65 100644
--- a/spec/support/helpers/query_recorder.rb
+++ b/spec/support/helpers/query_recorder.rb
@@ -80,7 +80,8 @@ module ActiveRecord
if values[:cached] && skip_cached
@cached << values[:sql]
- elsif !skip_schema_queries || !values[:name]&.include?("SCHEMA")
+ elsif !ignorable?(values)
+
backtrace = @query_recorder_debug ? show_backtrace(values, duration) : nil
@log << values[:sql]
store_sql_by_source(values: values, duration: duration, backtrace: backtrace)
@@ -102,5 +103,12 @@ module ActiveRecord
def occurrences
@occurrences ||= @log.group_by(&:to_s).transform_values(&:count)
end
+
+ def ignorable?(values)
+ return true if skip_schema_queries && values[:name]&.include?("SCHEMA")
+ return true if values[:name]&.match(/License Load/)
+
+ false
+ end
end
end