Commit ad3f27b2 authored by Imre Farkas's avatar Imre Farkas Committed by charlie ablett

Remove personal_project_owner_with_owner_access feature flag

This will make the fix generally available for owners of personal
projects to have OWNER access level membership.

Changelog: changed
parent c6f16b9d
...@@ -89,11 +89,7 @@ module Projects ...@@ -89,11 +89,7 @@ module Projects
# OWNER access level # OWNER access level
def project_owner def project_owner
user_id = project.namespace.owner.id user_id = project.namespace.owner.id
access_level = if ::Feature.enabled?(:personal_project_owner_with_owner_access, default_enabled: :yaml) access_level = Gitlab::Access::OWNER
Gitlab::Access::OWNER
else
Gitlab::Access::MAINTAINER
end
Member Member
.from(generate_from_statement([[user_id, access_level]])) # rubocop: disable CodeReuse/ActiveRecord .from(generate_from_statement([[user_id, access_level]])) # rubocop: disable CodeReuse/ActiveRecord
......
...@@ -11,11 +11,7 @@ module SelectForProjectAuthorization ...@@ -11,11 +11,7 @@ module SelectForProjectAuthorization
# workaround until we migrate Project#owners to have membership with # workaround until we migrate Project#owners to have membership with
# OWNER access level # OWNER access level
def select_project_owner_for_project_authorization def select_project_owner_for_project_authorization
if ::Feature.enabled?(:personal_project_owner_with_owner_access, default_enabled: :yaml) select(["projects.id AS project_id", "#{Gitlab::Access::OWNER} AS access_level"])
select(["projects.id AS project_id", "#{Gitlab::Access::OWNER} AS access_level"])
else
select(["projects.id AS project_id", "#{Gitlab::Access::MAINTAINER} AS access_level"])
end
end end
end end
end end
...@@ -94,14 +94,7 @@ class ProjectMember < Member ...@@ -94,14 +94,7 @@ class ProjectMember < Member
override :access_level_inclusion override :access_level_inclusion
def access_level_inclusion def access_level_inclusion
allowed_values = if ::Feature.enabled?(:personal_project_owner_with_owner_access, unless access_level.in?(Gitlab::Access.all_values)
default_enabled: :yaml)
Gitlab::Access.all_values
else
Gitlab::Access.values
end
unless access_level.in?(allowed_values)
errors.add(:access_level, "is not included in the list") errors.add(:access_level, "is not included in the list")
end end
end end
......
...@@ -147,11 +147,7 @@ module Projects ...@@ -147,11 +147,7 @@ module Projects
priority: UserProjectAccessChangedService::LOW_PRIORITY priority: UserProjectAccessChangedService::LOW_PRIORITY
) )
else else
if ::Feature.enabled?(:personal_project_owner_with_owner_access, default_enabled: :yaml) @project.add_owner(@project.namespace.owner, current_user: current_user)
@project.add_owner(@project.namespace.owner, current_user: current_user)
else
@project.add_maintainer(@project.namespace.owner, current_user: current_user)
end
end end
end end
......
---
name: personal_project_owner_with_owner_access
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78193
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351919
milestone: '14.8'
type: development
group: group::workspace
default_enabled: false
...@@ -33,14 +33,8 @@ usernames. A GitLab administrator can configure the GitLab instance to ...@@ -33,14 +33,8 @@ usernames. A GitLab administrator can configure the GitLab instance to
## Project members permissions ## Project members permissions
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/219299) in GitLab 14.8, personal namespace owners appear with Owner role in new projects in their namespace. Introduced [with a flag](../administration/feature_flags.md) named `personal_project_owner_with_owner_access`. Disabled by default. - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/219299) in GitLab 14.8, personal namespace owners appear with Owner role in new projects in their namespace. Introduced [with a flag](../administration/feature_flags.md) named `personal_project_owner_with_owner_access`. Disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/351919) in GitLab 14.9. - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/351919) in GitLab 14.9. Feature flag `personal_project_owner_with_owner_access` [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/219299).
FLAG:
On self-managed GitLab, personal namespace owners appearing with the Owner role in new projects in their namespace is disabled. To make it available,
ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `personal_project_owner_with_owner_access`.
The feature is not ready for production use.
On GitLab.com, this feature is available.
A user's role determines what permissions they have on a project. The Owner role provides all permissions but is A user's role determines what permissions they have on a project. The Owner role provides all permissions but is
available only: available only:
...@@ -51,7 +45,7 @@ available only: ...@@ -51,7 +45,7 @@ available only:
Personal [namespace](group/index.md#namespaces) owners: Personal [namespace](group/index.md#namespaces) owners:
- Are displayed as having the Maintainer role on projects in the namespace, but have the same permissions as a user with the Owner role. - Are displayed as having the Maintainer role on projects in the namespace, but have the same permissions as a user with the Owner role.
- (Disabled by default) In GitLab 14.8 and later, for new projects in the namespace, are displayed as having the Owner role. - In GitLab 14.9 and later, for new projects in the namespace, are displayed as having the Owner role.
For more information about how to manage project members, see For more information about how to manage project members, see
[members of a project](project/members/index.md). [members of a project](project/members/index.md).
......
...@@ -12,34 +12,15 @@ RSpec.describe Projects::Members::EffectiveAccessLevelFinder, '#execute' do ...@@ -12,34 +12,15 @@ RSpec.describe Projects::Members::EffectiveAccessLevelFinder, '#execute' do
let_it_be(:project) { create(:project) } let_it_be(:project) { create(:project) }
shared_examples_for 'includes access level of the owner of the project' do shared_examples_for 'includes access level of the owner of the project' do
context 'when personal_project_owner_with_owner_access feature flag is enabled' do it 'includes access level of the owner of the project as Owner' do
it 'includes access level of the owner of the project as Owner' do expect(subject).to(
expect(subject).to( contain_exactly(
contain_exactly( hash_including(
hash_including( 'user_id' => project.namespace.owner.id,
'user_id' => project.namespace.owner.id, 'access_level' => Gitlab::Access::OWNER
'access_level' => Gitlab::Access::OWNER
)
)
)
end
end
context 'when personal_project_owner_with_owner_access feature flag is disabled' do
before do
stub_feature_flags(personal_project_owner_with_owner_access: false)
end
it 'includes access level of the owner of the project as Maintainer' do
expect(subject).to(
contain_exactly(
hash_including(
'user_id' => project.namespace.owner.id,
'access_level' => Gitlab::Access::MAINTAINER
)
) )
) )
end )
end end
end end
......
...@@ -34,28 +34,12 @@ RSpec.describe Gitlab::ProjectAuthorizations do ...@@ -34,28 +34,12 @@ RSpec.describe Gitlab::ProjectAuthorizations do
.to include(owned_project.id, other_project.id, group_project.id) .to include(owned_project.id, other_project.id, group_project.id)
end end
context 'when personal_project_owner_with_owner_access feature flag is enabled' do it 'includes the correct access levels' do
it 'includes the correct access levels' do mapping = map_access_levels(authorizations)
mapping = map_access_levels(authorizations)
expect(mapping[owned_project.id]).to eq(Gitlab::Access::OWNER)
expect(mapping[other_project.id]).to eq(Gitlab::Access::REPORTER)
expect(mapping[group_project.id]).to eq(Gitlab::Access::DEVELOPER)
end
end
context 'when personal_project_owner_with_owner_access feature flag is disabled' do
before do
stub_feature_flags(personal_project_owner_with_owner_access: false)
end
it 'includes the correct access levels' do
mapping = map_access_levels(authorizations)
expect(mapping[owned_project.id]).to eq(Gitlab::Access::MAINTAINER) expect(mapping[owned_project.id]).to eq(Gitlab::Access::OWNER)
expect(mapping[other_project.id]).to eq(Gitlab::Access::REPORTER) expect(mapping[other_project.id]).to eq(Gitlab::Access::REPORTER)
expect(mapping[group_project.id]).to eq(Gitlab::Access::DEVELOPER) expect(mapping[group_project.id]).to eq(Gitlab::Access::DEVELOPER)
end
end end
end end
......
...@@ -675,30 +675,13 @@ RSpec.describe API::Members do ...@@ -675,30 +675,13 @@ RSpec.describe API::Members do
end end
context 'adding owner to project' do context 'adding owner to project' do
context 'when personal_project_owner_with_owner_access feature flag is enabled' do it 'returns created status' do
it 'returns created status' do expect do
expect do post api("/projects/#{project.id}/members", maintainer),
post api("/projects/#{project.id}/members", maintainer), params: { user_id: stranger.id, access_level: Member::OWNER }
params: { user_id: stranger.id, access_level: Member::OWNER }
expect(response).to have_gitlab_http_status(:created)
end.to change { project.members.count }.by(1)
end
end
context 'when personal_project_owner_with_owner_access feature flag is disabled' do
before do
stub_feature_flags(personal_project_owner_with_owner_access: false)
end
it 'returns created status' do
expect do
post api("/projects/#{project.id}/members", maintainer),
params: { user_id: stranger.id, access_level: Member::OWNER }
expect(response).to have_gitlab_http_status(:bad_request) expect(response).to have_gitlab_http_status(:created)
end.not_to change { project.members.count } end.to change { project.members.count }.by(1)
end
end end
end end
......
...@@ -116,34 +116,15 @@ RSpec.describe Projects::CreateService, '#execute' do ...@@ -116,34 +116,15 @@ RSpec.describe Projects::CreateService, '#execute' do
end end
context 'user namespace' do context 'user namespace' do
context 'when personal_project_owner_with_owner_access feature flag is enabled' do it 'creates a project in user namespace' do
it 'creates a project in user namespace' do project = create_project(user, opts)
project = create_project(user, opts)
expect(project).to be_valid
expect(project.first_owner).to eq(user)
expect(project.team.maintainers).not_to include(user)
expect(project.team.owners).to contain_exactly(user)
expect(project.namespace).to eq(user.namespace)
expect(project.project_namespace).to be_in_sync_with_project(project)
end
end
context 'when personal_project_owner_with_owner_access feature flag is disabled' do
before do
stub_feature_flags(personal_project_owner_with_owner_access: false)
end
it 'creates a project in user namespace' do
project = create_project(user, opts)
expect(project).to be_valid expect(project).to be_valid
expect(project.first_owner).to eq(user) expect(project.first_owner).to eq(user)
expect(project.team.maintainers).to contain_exactly(user) expect(project.team.maintainers).not_to include(user)
expect(project.team.owners).to contain_exactly(user) expect(project.team.owners).to contain_exactly(user)
expect(project.namespace).to eq(user.namespace) expect(project.namespace).to eq(user.namespace)
expect(project.project_namespace).to be_in_sync_with_project(project) expect(project.project_namespace).to be_in_sync_with_project(project)
end
end end
end end
......
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