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: " "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