-
- {{ $options.i18n.keepDeleted }}
-
- {{ $options.i18n.for }}
-
-
-
-
-
- {{ $options.i18n.days }}
-
-
-
+
+
+
+ {{ $options.i18n.days }}
-
{{ $options.i18n.deleteImmediately }}
-
-
diff --git a/ee/app/assets/javascripts/admin/application_settings/deletion_protection/constants.js b/ee/app/assets/javascripts/admin/application_settings/deletion_protection/constants.js
index 305653825fe12704687784e9b063bb60974fad91..f49ac2e8d989f0a3ada9a178f95a2abbf2c17cff 100644
--- a/ee/app/assets/javascripts/admin/application_settings/deletion_protection/constants.js
+++ b/ee/app/assets/javascripts/admin/application_settings/deletion_protection/constants.js
@@ -1,18 +1,10 @@
import { __, s__ } from '~/locale';
export const I18N_DELETION_PROTECTION = {
- heading: s__('DeletionSettings|Deletion protection'),
+ label: s__('DeletionSettings|Deletion protection'),
helpText: s__(
- 'DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects.',
- ),
- helpTextFeatureFlagEnabled: s__(
'DeletionSettings|Period that deleted groups and projects will remain restorable for. Personal projects are always deleted immediately.',
),
learnMore: __('Learn more.'),
- keepDeleted: s__('DeletionSettings|Keep deleted'),
- deleteImmediately: s__('DeletionSettings|None, delete immediately'),
- for: __('for'),
days: __('days'),
- groupsOnly: __('groups only'),
- groupsAndProjects: __('groups and projects'),
};
diff --git a/ee/app/assets/javascripts/admin/application_settings/deletion_protection/index.js b/ee/app/assets/javascripts/admin/application_settings/deletion_protection/index.js
index 2fb69fdf070eb001203b1a5662112a1da60449d5..7526e62de5cd53f72afdd01584ee326e83f06d25 100644
--- a/ee/app/assets/javascripts/admin/application_settings/deletion_protection/index.js
+++ b/ee/app/assets/javascripts/admin/application_settings/deletion_protection/index.js
@@ -9,9 +9,7 @@ export const initAdminDeletionProtectionSettings = () => {
return false;
}
- const { deletionAdjournedPeriod, delayedGroupDeletion, delayedProjectDeletion } = parseFormProps(
- el.dataset,
- );
+ const { deletionAdjournedPeriod } = parseFormProps(el.dataset);
return new Vue({
el,
@@ -20,8 +18,6 @@ export const initAdminDeletionProtectionSettings = () => {
return createElement(FormGroup, {
props: {
deletionAdjournedPeriod,
- delayedGroupDeletion,
- delayedProjectDeletion,
},
});
},
diff --git a/ee/app/controllers/ee/admin/application_settings_controller.rb b/ee/app/controllers/ee/admin/application_settings_controller.rb
index 8f83f495577e41bd62b684abfb58f0da0ee9be43..e932ebbcd6f0443fc2f4434327db3f8bdd7d767c 100644
--- a/ee/app/controllers/ee/admin/application_settings_controller.rb
+++ b/ee/app/controllers/ee/admin/application_settings_controller.rb
@@ -15,9 +15,6 @@ module ApplicationSettingsController
before_action :push_password_complexity_feature, only: [:general]
before_action :new_license, only: [:general]
before_action :scim_token, only: [:general]
- before_action only: [:general] do
- push_frontend_feature_flag(:always_perform_delayed_deletion)
- end
feature_category :sm_provisioning, [:seat_link_payload]
feature_category :source_code_management, [:templates]
@@ -79,11 +76,6 @@ def visible_application_setting_attributes
attrs += EE::ApplicationSettingsHelper.repository_mirror_attributes
end
- if License.feature_available?(:adjourned_deletion_for_projects_and_groups) &&
- ::Feature.disabled?(:always_perform_delayed_deletion)
- attrs += EE::ApplicationSettingsHelper.delayed_deletion_attributes
- end
-
# License feature => attribute name
{
custom_project_templates: :custom_project_templates_group_id,
diff --git a/ee/app/controllers/ee/groups_controller.rb b/ee/app/controllers/ee/groups_controller.rb
index a66697211623978ce88c903b668dce837abe2e1e..7d6be6932295ad7cf43fb9540db8fef67794844f 100644
--- a/ee/app/controllers/ee/groups_controller.rb
+++ b/ee/app/controllers/ee/groups_controller.rb
@@ -101,12 +101,6 @@ def group_params_ee
if experimental_and_third_party_ai_settings_enabled?
params_ee.push(:experiment_features_enabled, :third_party_ai_features_enabled)
end
-
- if current_group&.feature_available?(:adjourned_deletion_for_projects_and_groups) &&
- ::Feature.disabled?(:always_perform_delayed_deletion)
- params_ee << :delayed_project_removal
- params_ee << :lock_delayed_project_removal
- end
end
end
diff --git a/ee/app/helpers/ee/application_settings_helper.rb b/ee/app/helpers/ee/application_settings_helper.rb
index 06a5348c574dc94c0ff1eea7a10522e8a25c2503..08767285e74ce839b53ca83e4ab8f30d10bd2f13 100644
--- a/ee/app/helpers/ee/application_settings_helper.rb
+++ b/ee/app/helpers/ee/application_settings_helper.rb
@@ -121,7 +121,6 @@ def self.possible_licensed_attributes
merge_request_appovers_rules_attributes +
password_complexity_attributes +
git_abuse_rate_limit_attributes +
- delayed_deletion_attributes +
%i[
email_additional_text
file_template_project_id
@@ -167,16 +166,6 @@ def self.git_abuse_rate_limit_attributes
]
end
- def self.delayed_deletion_attributes
- # TODO: Remove in 16.0, after https://gitlab.com/gitlab-org/gitlab/-/issues/393622 is turned ON
- # We cannot add a feature flag check in this file, due to the reason mentioned in
- # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92218#note_1026250151
- %i[
- delayed_project_deletion
- delayed_group_deletion
- ]
- end
-
override :registration_features_can_be_prompted?
def registration_features_can_be_prompted?
!::Gitlab::CurrentSettings.usage_ping_enabled? && !License.current.present?
@@ -196,9 +185,7 @@ def signup_form_data
def deletion_protection_data
{
- deletion_adjourned_period: @application_setting[:deletion_adjourned_period],
- delayed_group_deletion: @application_setting[:delayed_group_deletion].to_s,
- delayed_project_deletion: @application_setting[:delayed_project_deletion].to_s
+ deletion_adjourned_period: @application_setting[:deletion_adjourned_period]
}
end
diff --git a/ee/app/helpers/ee/groups_helper.rb b/ee/app/helpers/ee/groups_helper.rb
index 3577250f67cb9579545321086059877a1339a904..1fe04e6257e835f236e047e6584a047f57a9e77e 100644
--- a/ee/app/helpers/ee/groups_helper.rb
+++ b/ee/app/helpers/ee/groups_helper.rb
@@ -53,11 +53,6 @@ def show_group_activity_analytics?
can?(current_user, :read_group_activity_analytics, @group)
end
- def show_delayed_project_removal_setting?(group)
- group.licensed_feature_available?(:adjourned_deletion_for_projects_and_groups) &&
- ::Feature.disabled?(:always_perform_delayed_deletion)
- end
-
def show_product_purchase_success_alert?
!params[:purchased_product].blank?
end
diff --git a/ee/app/models/ee/group.rb b/ee/app/models/ee/group.rb
index 7991ff12cb5c149a8e1012b58153bf697f462d56..f877e41cac5cfdc8078d0d30b2a062f733f6f371 100644
--- a/ee/app/models/ee/group.rb
+++ b/ee/app/models/ee/group.rb
@@ -550,14 +550,7 @@ def self_or_ancestor_marked_for_deletion
override :adjourned_deletion?
def adjourned_deletion?
feature_available?(:adjourned_deletion_for_projects_and_groups) &&
- ::Gitlab::CurrentSettings.deletion_adjourned_period > 0 &&
- adjourned_deletion_configured?
- end
-
- def adjourned_deletion_configured?
- return true if ::Feature.enabled?(:always_perform_delayed_deletion)
-
- ::Gitlab::CurrentSettings.delayed_group_deletion
+ ::Gitlab::CurrentSettings.deletion_adjourned_period > 0
end
def vulnerabilities
diff --git a/ee/app/models/ee/project.rb b/ee/app/models/ee/project.rb
index 459e53787371b09dab5cc791b0e6a7126c3d852f..7ebbfbae4d80a883b76cfcf755781a62dd8500c9 100644
--- a/ee/app/models/ee/project.rb
+++ b/ee/app/models/ee/project.rb
@@ -914,7 +914,7 @@ def adjourned_deletion?
def adjourned_deletion_configured?
::Gitlab::CurrentSettings.deletion_adjourned_period > 0 &&
- group_deletion_mode_configured?
+ !personal?
end
def marked_for_deletion?
@@ -1205,14 +1205,6 @@ def requirements_ci_variables
end
end
- # Return the group's setting for delayed deletion, false for user namespace projects
- def group_deletion_mode_configured?
- return true if ::Feature.enabled?(:always_perform_delayed_deletion) && !personal?
- return false unless group&.namespace_settings
-
- group.namespace_settings.delayed_project_removal?
- end
-
# If the project is inside a fork network, the mirror URL must
# also belong to a member of that fork network
def import_url_inside_fork_network
diff --git a/ee/app/views/groups/settings/_delayed_project_removal.html.haml b/ee/app/views/groups/settings/_delayed_project_removal.html.haml
deleted file mode 100644
index c506a8a77b0dea3742a61e225d1bf0d4684b9281..0000000000000000000000000000000000000000
--- a/ee/app/views/groups/settings/_delayed_project_removal.html.haml
+++ /dev/null
@@ -1,30 +0,0 @@
-- return unless show_delayed_project_removal_setting?(group)
-
-- setting_locked = cascading_namespace_setting_locked?(:delayed_project_removal, group)
-- delay_enabled = group.namespace_settings.delayed_project_removal?
-- learn_more_link = help_page_path('user/project/settings/index.md', anchor: 'delayed-project-deletion')
-
-.form-group.gl-mb-2{ data: { testid: 'delayed-project-removal-form-group' } }
- %label.gl-mb-0
- = s_('DeletionSettings|Deletion protection')
- - if setting_locked
- = render 'shared/namespaces/cascading_settings/lock_icon', attribute: :delayed_project_removal,
- group: group,
- settings_path_helper: ->(locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') },
- class_list: 'gl-relative!'
- %span.form-text.text-muted.gl-pb-4
- = delayed_project_removal_help_text
- - if delayed_deletion_disabled
- = s_('DeletionSettings|All projects are deleted immediately.')
- = link_to _('Learn more.'), learn_more_link, target: '_blank', rel: 'noopener noreferrer'
-
- - if !delayed_deletion_disabled
- = f.gitlab_ui_radio_component :delayed_project_removal, true, keep_deleted_option_label, radio_options: { checked: delay_enabled, disabled: setting_locked, data: { testid: 'delayed-project-removal-radio-button' } }
- = f.gitlab_ui_radio_component :delayed_project_removal, false, s_('DeletionSettings|None, delete immediately'), radio_options: { checked: !delay_enabled, disabled: setting_locked }
- = render 'shared/namespaces/cascading_settings/enforcement_checkbox',
- attribute: :delayed_project_removal,
- label: s_('CascadingSettings|Enforce deletion protection for all subgroups'),
- help_text: nil,
- group: group,
- form: f,
- setting_locked: setting_locked
diff --git a/ee/lib/ee/api/entities/application_setting.rb b/ee/lib/ee/api/entities/application_setting.rb
index 2f38a9a1e2a9929a3160aed09eaec7c00bc19a52..8f202544e9df355bf7de84f73c69c90d4dda5df1 100644
--- a/ee/lib/ee/api/entities/application_setting.rb
+++ b/ee/lib/ee/api/entities/application_setting.rb
@@ -19,8 +19,6 @@ module ApplicationSetting
expose :email_additional_text, if: ->(_instance, _opts) { ::License.feature_available?(:email_additional_text) }
expose :file_template_project_id, if: ->(_instance, _opts) { ::License.feature_available?(:custom_file_templates) }
expose :default_project_deletion_protection, if: ->(_instance, _opts) { ::License.feature_available?(:default_project_deletion_protection) }
- expose :delayed_project_deletion, if: ->(_instance, _opts) { ::License.feature_available?(:adjourned_deletion_for_projects_and_groups) && ::Feature.disabled?(:always_perform_delayed_deletion) }
- expose :delayed_group_deletion, if: ->(_instance, _opts) { ::License.feature_available?(:adjourned_deletion_for_projects_and_groups) && ::Feature.disabled?(:always_perform_delayed_deletion) }
expose :deletion_adjourned_period, if: ->(_instance, _opts) { ::License.feature_available?(:adjourned_deletion_for_projects_and_groups) }
expose :disable_personal_access_tokens, if: ->(_instance, _opts) { ::License.feature_available?(:disable_personal_access_tokens) }
expose :updating_name_disabled_for_users, if: ->(_instance, _opts) { ::License.feature_available?(:disable_name_update_for_users) }
diff --git a/ee/spec/controllers/admin/application_settings_controller_spec.rb b/ee/spec/controllers/admin/application_settings_controller_spec.rb
index 0c8ba310925d5735421958bb4ef84e3f38de4680..79ce04f9c843f556b61db2db5b2db1bc62cc92e6 100644
--- a/ee/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/ee/spec/controllers/admin/application_settings_controller_spec.rb
@@ -102,26 +102,6 @@
it_behaves_like 'settings for licensed features'
end
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- context 'default delayed group deletion' do
- let(:settings) { { delayed_group_deletion: true } }
- let(:feature) { :adjourned_deletion_for_projects_and_groups }
-
- it_behaves_like 'settings for licensed features'
- end
-
- context 'default delayed project deletion' do
- let(:settings) { { delayed_project_deletion: true } }
- let(:feature) { :adjourned_deletion_for_projects_and_groups }
-
- it_behaves_like 'settings for licensed features'
- end
- end
-
context 'updating name disabled for users setting' do
let(:settings) { { updating_name_disabled_for_users: true } }
let(:feature) { :disable_name_update_for_users }
diff --git a/ee/spec/controllers/ee/groups_controller_spec.rb b/ee/spec/controllers/ee/groups_controller_spec.rb
index 34516f0c2b84195f46beb7771291bef9cdc29bd4..ab1ccd8db29470c09887e8aeb656f274a0ae683e 100644
--- a/ee/spec/controllers/ee/groups_controller_spec.rb
+++ b/ee/spec/controllers/ee/groups_controller_spec.rb
@@ -671,14 +671,6 @@
context 'when feature is available' do
let(:available) { true }
- context 'when the feature flag `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'allows storing of settings'
- end
-
it_behaves_like 'does not allow storing of settings'
end
diff --git a/ee/spec/controllers/projects_controller_spec.rb b/ee/spec/controllers/projects_controller_spec.rb
index de841d72f4425f97d0959ce07e317c7d471d84ac..5e0fc310b8349a09e8a7e4f1fcb3058177ed168f 100644
--- a/ee/spec/controllers/projects_controller_spec.rb
+++ b/ee/spec/controllers/projects_controller_spec.rb
@@ -878,17 +878,7 @@
allow(group.namespace_settings).to receive(:delayed_project_removal?).and_return(false)
end
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'deletes project right away'
- end
-
- context 'when `always_perform_delayed_deletion` is enabled' do
- it_behaves_like 'marks project for deletion'
- end
+ it_behaves_like 'marks project for deletion'
end
context 'when feature is not available for the project' do
diff --git a/ee/spec/features/groups/group_settings_spec.rb b/ee/spec/features/groups/group_settings_spec.rb
index 7717b5593ed539cd1967ff3d2d4e94e9eb37bd9c..3d33ebb0af9458587408c6bb2804db790c4e3bd1 100644
--- a/ee/spec/features/groups/group_settings_spec.rb
+++ b/ee/spec/features/groups/group_settings_spec.rb
@@ -162,59 +162,6 @@
stub_licensed_features(adjourned_deletion_for_projects_and_groups: true)
end
- context 'when `always_perform_delayed_deletion` feature flag is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'a cascading setting' do
- let_it_be(:subgroup) { create(:group, parent: group) }
- let(:setting_field_selector) { '[data-testid="delayed-project-removal-radio-button"]' }
- let(:setting_path) { edit_group_path(group, anchor: 'js-permissions-settings') }
- let(:group_path) { edit_group_path(group) }
- let(:subgroup_path) { edit_group_path(subgroup) }
- let(:click_save_button) { save_permissions_group }
- let(:enable_setting) { -> { choose 'group_delayed_project_removal_true' } }
- end
-
- context 'delayed deletion is disabled by an admin', :js do
- let_it_be(:user) { create(:admin) }
-
- before do
- stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
- stub_feature_flags(always_perform_delayed_deletion: false)
- gitlab_enable_admin_mode_sign_in(user)
-
- visit general_admin_application_settings_path
-
- page.within '#js-visibility-settings' do
- choose 'None, delete immediately'
- click_button 'Save changes'
- end
- end
-
- it 'does not render the group delayed deletion inputs' do
- visit edit_group_path(group)
-
- page.within form_group_selector do
- expect(page).not_to have_selector('input')
- end
- end
-
- it 'displays lock icon with popover' do
- visit edit_group_path(group)
-
- page.within form_group_selector do
- find('[data-testid="cascading-settings-lock-icon"]').click
- end
-
- page.within '[data-testid="cascading-settings-lock-popover"]' do
- expect(page).to have_text 'This setting has been enforced by an instance admin.'
- end
- end
- end
- end
-
describe 'immediately deleting a project marked for deletion', :js do
before do
create(:group_deletion_schedule, group: group, marked_for_deletion_on: 2.days.from_now)
diff --git a/ee/spec/features/projects_spec.rb b/ee/spec/features/projects_spec.rb
index 164e356955dc480276d687154ac56b1c96174d4b..c2cfa3a0e6c120dada37b79b9007364bbe72ba7e 100644
--- a/ee/spec/features/projects_spec.rb
+++ b/ee/spec/features/projects_spec.rb
@@ -35,21 +35,16 @@ def remove_with_confirm(button_text, confirm_with, confirm_button_text = 'Confir
let(:project) { create(:project, group: group) }
let(:user) { create(:user) }
- where(:feature_available_on_instance, :delayed_project_removal, :always_perform_delayed_deletion, :shows_adjourned_delete) do
- true | nil | true | true
- true | true | true | true
- false | true | true | false
- false | nil | true | false
- true | nil | false | false
- true | true | false | true
- false | true | false | false
- false | nil | false | false
+ where(:feature_available_on_instance, :delayed_project_removal, :shows_adjourned_delete) do
+ true | nil | true
+ true | true | true
+ false | true | false
+ false | nil | false
end
before do
stub_application_setting(deletion_adjourned_period: 7)
stub_licensed_features(adjourned_deletion_for_projects_and_groups: feature_available_on_instance)
- stub_feature_flags(always_perform_delayed_deletion: always_perform_delayed_deletion)
group.add_member(user, Gitlab::Access::OWNER)
sign_in user
diff --git a/ee/spec/frontend/admin/application_settings/deletion_protection/components/form_group_spec.js b/ee/spec/frontend/admin/application_settings/deletion_protection/components/form_group_spec.js
index 9568201ef13dae2a13ff1aa140cfac10970ce759..6bd1e98ff95d5f4c17552fe074c57b649504160b 100644
--- a/ee/spec/frontend/admin/application_settings/deletion_protection/components/form_group_spec.js
+++ b/ee/spec/frontend/admin/application_settings/deletion_protection/components/form_group_spec.js
@@ -1,5 +1,5 @@
-import { GlFormRadio, GlLink, GlFormSelect, GlFormInput, GlFormGroup } from '@gitlab/ui';
-import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
+import { GlLink } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import { helpPagePath } from '~/helpers/help_page_helper';
import FormGroup from 'ee/admin/application_settings/deletion_protection/components/form_group.vue';
import { I18N_DELETION_PROTECTION } from 'ee/admin/application_settings/deletion_protection/constants';
@@ -7,227 +7,43 @@ import { I18N_DELETION_PROTECTION } from 'ee/admin/application_settings/deletion
describe('Form group component', () => {
let wrapper;
- const DELAY_DISABLED = false;
- const DELAY_ENABLED = true;
-
- const findHelpText = () => wrapper.findByTestId('help-text');
- const findDeleteImmediatelyRadioButton = () => wrapper.findByTestId('delete-immediately');
- const findKeepDeleted = () => wrapper.findByTestId('keep-deleted');
- const findKeepDeletedRadioButton = () => findKeepDeleted().findComponent(GlFormRadio);
- const findSelectProjectRemoval = () => findKeepDeleted().findComponent(GlFormSelect);
- const findSelectedIndex = () => findSelectProjectRemoval().find('select').element.selectedIndex;
- const findAdjournedPeriodInput = () => findKeepDeleted().findComponent(GlFormInput);
- const findHiddenInput = () => wrapper.findByTestId('hidden-input');
const findGlLink = () => wrapper.findComponent(GlLink);
- const findGlFormGroup = () => wrapper.findComponent(GlFormGroup);
- const createComponent = ({ mountFn = shallowMountExtended, props = {}, provide = {} } = {}) => {
- wrapper = mountFn(FormGroup, {
+ const createComponent = ({ props = {}, provide = {} } = {}) => {
+ wrapper = mountExtended(FormGroup, {
propsData: {
deletionAdjournedPeriod: 7,
- delayedGroupDeletion: false,
- delayedProjectDeletion: false,
...props,
},
provide,
});
};
- describe('Heading', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('displays the form group label', () => {
- expect(findGlFormGroup().attributes('label')).toBe(I18N_DELETION_PROTECTION.heading);
- });
-
- describe('when `alwaysPerformDelayedDeletion` feature flag is disabled', () => {
- it('displays the help text', () => {
- expect(findHelpText().text()).toContain(I18N_DELETION_PROTECTION.helpText);
- });
- });
-
- describe('when `alwaysPerformDelayedDeletion` feature flag is enabled', () => {
- beforeEach(() => {
- createComponent({ provide: { glFeatures: { alwaysPerformDelayedDeletion: true } } });
- });
-
- it('displays the help text', () => {
- expect(findHelpText().text()).toContain(
- I18N_DELETION_PROTECTION.helpTextFeatureFlagEnabled,
- );
- });
- });
-
- it('displays the help link', () => {
- expect(findGlLink().text()).toContain(I18N_DELETION_PROTECTION.learnMore);
- expect(findGlLink().attributes('href')).toBe(
- helpPagePath('user/admin_area/settings/visibility_and_access_controls', {
- anchor: 'delayed-project-deletion',
- }),
- );
- });
- });
-
- describe('Form inputs', () => {
- describe('when `alwaysPerformDelayedDeletion` feature flag is disabled', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('renders an input for enabling delayed group deletion', () => {
- expect(findKeepDeletedRadioButton().attributes('name')).toBe(
- 'application_setting[delayed_group_deletion]',
- );
- });
-
- it('renders an input for disabling delayed group deletion', () => {
- expect(findDeleteImmediatelyRadioButton().attributes('name')).toBe(
- 'application_setting[delayed_group_deletion]',
- );
- });
-
- it('renders an input for selecting delayed project deletion', () => {
- expect(findSelectProjectRemoval().attributes('name')).toBe(
- 'application_setting[delayed_project_deletion]',
- );
- });
-
- it('renders an input for setting the deletion adjourned period', () => {
- expect(findAdjournedPeriodInput().attributes()).toMatchObject({
- name: 'application_setting[deletion_adjourned_period]',
- type: 'number',
- min: '1',
- max: '90',
- });
- });
-
- it('renders a hidden input for disabling delayed project deletion', () => {
- expect(findHiddenInput().attributes()).toMatchObject({
- name: 'application_setting[delayed_project_deletion]',
- value: 'false',
- });
- });
- });
-
- describe('when `alwaysPerformDelayedDeletion` feature flag is enabled', () => {
- beforeEach(() => {
- createComponent({ provide: { glFeatures: { alwaysPerformDelayedDeletion: true } } });
- });
-
- it('does not render an input for enabling delayed group deletion', () => {
- expect(findKeepDeletedRadioButton().exists()).toBe(false);
- });
-
- it('does not render an input for disabling delayed group deletion', () => {
- expect(findDeleteImmediatelyRadioButton().exists()).toBe(false);
- });
-
- it('does not render an input for selecting delayed project deletion', () => {
- expect(findSelectProjectRemoval().exists()).toBe(false);
- });
-
- it('renders an input for setting the deletion adjourned period', () => {
- expect(findAdjournedPeriodInput().attributes()).toMatchObject({
- name: 'application_setting[deletion_adjourned_period]',
- type: 'number',
- min: '1',
- max: '90',
- });
- });
-
- it('does not render a hidden input for disabling delayed project deletion', () => {
- expect(findHiddenInput().exists()).toBe(false);
- });
- });
- });
-
- describe('Select options', () => {
- beforeEach(() => {
- createComponent({ mountFn: mountExtended });
- });
-
- describe('when `alwaysPerformDelayedDeletion` feature flag is disabled', () => {
- beforeEach(() => {
- createComponent({ mountFn: mountExtended });
- });
-
- it('renders the select delayed project deletion options', () => {
- const options = findSelectProjectRemoval().findAll('option');
- expect(options.at(0).text()).toBe(I18N_DELETION_PROTECTION.groupsOnly);
- expect(options.at(1).text()).toBe(I18N_DELETION_PROTECTION.groupsAndProjects);
- });
- });
-
- describe('when `alwaysPerformDelayedDeletion` feature flag is enabled', () => {
- beforeEach(() => {
- createComponent({
- mountFn: mountExtended,
- provide: { glFeatures: { alwaysPerformDelayedDeletion: true } },
- });
- });
-
- it('does not render the select delayed project deletion options', () => {
- expect(findSelectProjectRemoval().exists()).toBe(false);
- });
- });
+ beforeEach(() => {
+ createComponent();
});
- describe('When group and project delayed deletion is disabled', () => {
- it('selects the "None, delete immediately" radio button', () => {
- createComponent();
-
- expect(findDeleteImmediatelyRadioButton().props()).toMatchObject({ checked: DELAY_DISABLED });
- });
-
- it('disables the "Keep deleted" input fields', () => {
- createComponent();
-
- expect(findSelectProjectRemoval().attributes('disabled')).toBeDefined();
- expect(findAdjournedPeriodInput().attributes('disabled')).toBeDefined();
- });
-
- it('selects the "groups only" option', () => {
- createComponent({ mountFn: mountExtended });
-
- expect(findSelectedIndex()).toBe(0);
+ it('renders an input for setting the deletion adjourned period', () => {
+ expect(
+ wrapper.findByLabelText(I18N_DELETION_PROTECTION.label, { exact: false }).attributes(),
+ ).toMatchObject({
+ name: 'application_setting[deletion_adjourned_period]',
+ type: 'number',
+ min: '1',
+ max: '90',
});
});
- describe('When group delayed deletion is enabled', () => {
- beforeEach(() => {
- createComponent({ mountFn: shallowMountExtended, props: { delayedGroupDeletion: true } });
- });
-
- it('selects the "Keep deleted" radio button', () => {
- expect(findKeepDeletedRadioButton().props()).toMatchObject({ checked: DELAY_ENABLED });
- });
-
- it('the "Keep deleted" input fields should not be disabled', () => {
- expect(findSelectProjectRemoval().attributes('disabled')).toBeUndefined();
- expect(findAdjournedPeriodInput().attributes('disabled')).toBeUndefined();
- });
+ it('displays the help text', () => {
+ expect(wrapper.findByText(I18N_DELETION_PROTECTION.helpText).exists()).toBe(true);
});
- describe('When group and project delayed deletion is enabled', () => {
- beforeEach(() => {
- createComponent({
- mountFn: mountExtended,
- props: { delayedGroupDeletion: true, delayedProjectDeletion: true },
- });
- });
-
- it('selects the "Keep deleted" radio button', () => {
- expect(findKeepDeletedRadioButton().props()).toMatchObject({ checked: DELAY_ENABLED });
- });
-
- it('selects the "groups and projects" option', () => {
- expect(findSelectedIndex()).toBe(1);
- });
-
- it('does not render the hidden input', () => {
- expect(findHiddenInput().exists()).toBe(false);
- });
+ it('displays the help link', () => {
+ expect(findGlLink().text()).toContain(I18N_DELETION_PROTECTION.learnMore);
+ expect(findGlLink().attributes('href')).toBe(
+ helpPagePath('user/admin_area/settings/visibility_and_access_controls', {
+ anchor: 'delayed-project-deletion',
+ }),
+ );
});
});
diff --git a/ee/spec/helpers/ee/application_settings_helper_spec.rb b/ee/spec/helpers/ee/application_settings_helper_spec.rb
index 34444babc7c79766ac326fa91c7b0bded747e1db..3e22de493f8fa90c5584893dda8a3075e49a44a4 100644
--- a/ee/spec/helpers/ee/application_settings_helper_spec.rb
+++ b/ee/spec/helpers/ee/application_settings_helper_spec.rb
@@ -97,7 +97,7 @@
subject { helper.deletion_protection_data }
- it { is_expected.to eq({ deletion_adjourned_period: 1, delayed_group_deletion: 'false', delayed_project_deletion: 'false' }) }
+ it { is_expected.to eq({ deletion_adjourned_period: 1 }) }
end
describe '.git_abuse_rate_limit_data', feature_category: :insider_threat do
diff --git a/ee/spec/helpers/ee/groups_helper_spec.rb b/ee/spec/helpers/ee/groups_helper_spec.rb
index 9d91e9694eb01869377781bf894d142584a289b4..07f7990702c4767854be2c64acec607f076a1dbc 100644
--- a/ee/spec/helpers/ee/groups_helper_spec.rb
+++ b/ee/spec/helpers/ee/groups_helper_spec.rb
@@ -128,17 +128,7 @@
stub_application_setting(delayed_group_deletion: false)
end
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'permanent deletion message'
- end
-
- context 'when `always_perform_delayed_deletion` is enabled' do
- it_behaves_like 'delayed deletion message'
- end
+ it_behaves_like 'delayed deletion message'
end
context 'when group delay deletion is enabled and adjourned deletion period is 0' do
@@ -226,24 +216,6 @@
end
end
- describe '#show_delayed_project_removal_setting?' do
- before do
- stub_licensed_features(adjourned_deletion_for_projects_and_groups: licensed?)
- stub_feature_flags(always_perform_delayed_deletion: always_perform_delayed_deletion)
- end
-
- where(:licensed?, :always_perform_delayed_deletion, :result) do
- true | true | false
- false | true | false
- true | false | true
- false | false | false
- end
-
- with_them do
- it { expect(helper.show_delayed_project_removal_setting?(group)).to be result }
- end
- end
-
describe '#show_product_purchase_success_alert?' do
describe 'when purchased_product is present' do
before do
diff --git a/ee/spec/models/ee/group_spec.rb b/ee/spec/models/ee/group_spec.rb
index ecabec6e67ef170b310694ed8400888bdb527f82..9bd112f2ebd95636d5dac11ae0b598905216261b 100644
--- a/ee/spec/models/ee/group_spec.rb
+++ b/ee/spec/models/ee/group_spec.rb
@@ -2220,15 +2220,11 @@ def webhook_headers
end
context 'delayed deletion feature is available' do
- where(:adjourned_period, :delayed_group_deletion, :always_perform_delayed_deletion, :expected) do
- 0 | true | true | false
- 0 | false | true | false
- 1 | true | true | true
- 1 | false | true | true
- 0 | true | false | false
- 0 | false | false | false
- 1 | true | false | true
- 1 | false | false | false
+ where(:adjourned_period, :delayed_group_deletion, :expected) do
+ 0 | true | false
+ 0 | false | false
+ 1 | true | true
+ 1 | false | true
end
with_them do
@@ -2236,7 +2232,6 @@ def webhook_headers
stub_licensed_features(adjourned_deletion_for_projects_and_groups: true)
stub_application_setting(deletion_adjourned_period: adjourned_period)
stub_application_setting(delayed_group_deletion: delayed_group_deletion)
- stub_feature_flags(always_perform_delayed_deletion: always_perform_delayed_deletion)
end
it { is_expected.to expected ? be_truthy : be_falsey }
diff --git a/ee/spec/models/ee/project_spec.rb b/ee/spec/models/ee/project_spec.rb
index 3250ac33a2765d420ea0ca6fae4b9137392a4215..b44fdfb6d4fb8773ba21c2b57e0410cd58283fdb 100644
--- a/ee/spec/models/ee/project_spec.rb
+++ b/ee/spec/models/ee/project_spec.rb
@@ -3289,23 +3289,15 @@ def stub_default_url_options(host)
describe '#adjourned_deletion?' do
subject { project.adjourned_deletion? }
- where(:licensed?, :feature_enabled_on_group?, :adjourned_period, :always_perform_delayed_deletion, :result) do
- true | true | 0 | true | false
- true | true | 1 | true | true
- true | false | 0 | true | false
- true | false | 1 | true | true
- false | true | 0 | true | false
- false | true | 1 | true | false
- false | false | 0 | true | false
- false | false | 1 | true | false
- true | true | 0 | false | false
- true | true | 1 | false | true
- true | false | 0 | false | false
- true | false | 1 | false | false
- false | true | 0 | false | false
- false | true | 1 | false | false
- false | false | 0 | false | false
- false | false | 1 | false | false
+ where(:licensed?, :feature_enabled_on_group?, :adjourned_period, :result) do
+ true | true | 0 | false
+ true | true | 1 | true
+ true | false | 0 | false
+ true | false | 1 | true
+ false | true | 0 | false
+ false | true | 1 | false
+ false | false | 0 | false
+ false | false | 1 | false
end
with_them do
@@ -3316,7 +3308,6 @@ def stub_default_url_options(host)
stub_licensed_features(adjourned_deletion_for_projects_and_groups: licensed?)
stub_application_setting(deletion_adjourned_period: adjourned_period)
allow(group.namespace_settings).to receive(:delayed_project_removal?).and_return(feature_enabled_on_group?)
- stub_feature_flags(always_perform_delayed_deletion: always_perform_delayed_deletion)
end
it { is_expected.to be result }
@@ -3340,15 +3331,9 @@ def stub_default_url_options(host)
describe '#adjourned_deletion_configured?' do
subject { project.adjourned_deletion_configured? }
- where(:feature_enabled_on_group?, :adjourned_period, :always_perform_delayed_deletion, :result) do
- true | 0 | true | false
- true | 1 | true | true
- false | 0 | true | false
- false | 1 | true | true
- true | 0 | false | false
- true | 1 | false | true
- false | 0 | false | false
- false | 1 | false | false
+ where(:adjourned_period, :result) do
+ 0 | false
+ 1 | true
end
with_them do
@@ -3357,8 +3342,6 @@ def stub_default_url_options(host)
before do
stub_application_setting(deletion_adjourned_period: adjourned_period)
- allow(group.namespace_settings).to receive(:delayed_project_removal?).and_return(feature_enabled_on_group?)
- stub_feature_flags(always_perform_delayed_deletion: always_perform_delayed_deletion)
end
it { is_expected.to be result }
diff --git a/ee/spec/requests/api/groups_spec.rb b/ee/spec/requests/api/groups_spec.rb
index 0c17a7264a495403135a2c2167ce639bcba387c1..3a84f04e310247774c6ab30608793b244311a20e 100644
--- a/ee/spec/requests/api/groups_spec.rb
+++ b/ee/spec/requests/api/groups_spec.rb
@@ -1194,17 +1194,7 @@
stub_application_setting(delayed_group_deletion: false)
end
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'immediately enqueues the job to delete the group'
- end
-
- context 'when `always_perform_delayed_deletion` is enabled' do
- it_behaves_like 'marks group for delayed deletion'
- end
+ it_behaves_like 'marks group for delayed deletion'
end
context 'failure' do
diff --git a/ee/spec/requests/api/projects_spec.rb b/ee/spec/requests/api/projects_spec.rb
index 667666ea09123722a31956cdb90edb1a9f69f00a..6c2bf09500423ba241c618d785bea3e556d7a6bf 100644
--- a/ee/spec/requests/api/projects_spec.rb
+++ b/ee/spec/requests/api/projects_spec.rb
@@ -1715,17 +1715,7 @@
stub_application_setting(lock_delayed_project_removal: true, delayed_project_removal: false)
end
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'deletes project immediately'
- end
-
- context 'when `always_perform_delayed_deletion` is enabled' do
- it_behaves_like 'marks project for deletion'
- end
+ it_behaves_like 'marks project for deletion'
end
context 'when deletion adjourned period is 0' do
@@ -1738,17 +1728,7 @@
end
context 'delayed project deletion is disabled for group' do
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'deletes project immediately'
- end
-
- context 'when `always_perform_delayed_deletion` is enabled' do
- it_behaves_like 'marks project for deletion'
- end
+ it_behaves_like 'marks project for deletion'
end
context 'for projects in user namespace' do
diff --git a/ee/spec/requests/api/settings_spec.rb b/ee/spec/requests/api/settings_spec.rb
index 791c0f3813dd43dcd5d6dd0cfe8abfa3030a12b0..48c8c71da091c7ad0765f842a81bc5aae37a38f9 100644
--- a/ee/spec/requests/api/settings_spec.rb
+++ b/ee/spec/requests/api/settings_spec.rb
@@ -216,32 +216,6 @@
it_behaves_like 'settings for licensed features'
end
- context 'default delayed group deletion' do
- let(:settings) { { delayed_group_deletion: true } }
- let(:feature) { :adjourned_deletion_for_projects_and_groups }
-
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'settings for licensed features'
- end
- end
-
- context 'delayed project deletion' do
- let(:settings) { { delayed_project_deletion: true } }
- let(:feature) { :adjourned_deletion_for_projects_and_groups }
-
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'settings for licensed features'
- end
- end
-
context 'group_owners_can_manage_default_branch_protection setting' do
let(:settings) { { group_owners_can_manage_default_branch_protection: false } }
let(:feature) { :default_branch_protection_restriction_in_groups }
diff --git a/ee/spec/views/admin/application_settings/_deletion_protection_settings.html.haml_spec.rb b/ee/spec/views/admin/application_settings/_deletion_protection_settings.html.haml_spec.rb
index ab1b630c39476207b6af16d25a1f735bcc1ab9c4..3dfad2fd222c0a5849f9cb0c207354c0034dd82f 100644
--- a/ee/spec/views/admin/application_settings/_deletion_protection_settings.html.haml_spec.rb
+++ b/ee/spec/views/admin/application_settings/_deletion_protection_settings.html.haml_spec.rb
@@ -22,7 +22,5 @@
expect(rendered).to have_selector('#js-admin-deletion-protection-settings')
expect(rendered).to have_selector('[data-deletion-adjourned-period="1"]')
- expect(rendered).to have_selector('[data-delayed-group-deletion="false"]')
- expect(rendered).to have_selector('[data-delayed-project-deletion="false"]')
end
end
diff --git a/ee/spec/workers/ee/projects/inactive_projects_deletion_cron_worker_spec.rb b/ee/spec/workers/ee/projects/inactive_projects_deletion_cron_worker_spec.rb
index db131cc27f79a9e27bd1546ee3e1dbd1a6219c53..5943e81b43f335b3f535aa90ef15551ca74b9208 100644
--- a/ee/spec/workers/ee/projects/inactive_projects_deletion_cron_worker_spec.rb
+++ b/ee/spec/workers/ee/projects/inactive_projects_deletion_cron_worker_spec.rb
@@ -175,17 +175,7 @@
group.namespace_settings.update!(delayed_project_removal: false)
end
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'invokes Projects::DestroyService'
- end
-
- context 'when `always_perform_delayed_deletion` is enabled' do
- it_behaves_like 'invokes Projects::MarkForDeletionService'
- end
+ it_behaves_like 'invokes Projects::MarkForDeletionService'
end
context 'when adjourned_deletion_configured is configured for the project' do
@@ -193,17 +183,7 @@
group.namespace_settings.update!(delayed_project_removal: true)
end
- context 'when `always_perform_delayed_deletion` is disabled' do
- before do
- stub_feature_flags(always_perform_delayed_deletion: false)
- end
-
- it_behaves_like 'invokes Projects::MarkForDeletionService'
- end
-
- context 'when `always_perform_delayed_deletion` is enabled' do
- it_behaves_like 'invokes Projects::MarkForDeletionService'
- end
+ it_behaves_like 'invokes Projects::MarkForDeletionService'
end
end
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index a0eec5283e00d16c71acbda3306d461c704d8b6a..7e3cb243a0454df1defad42a3d096544bc8d2c97 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -8820,9 +8820,6 @@ msgstr ""
msgid "Card number:"
msgstr ""
-msgid "CascadingSettings|Enforce deletion protection for all subgroups"
-msgstr ""
-
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -14563,23 +14560,14 @@ msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
-msgid "DeletionSettings|All projects are deleted immediately."
-msgstr ""
-
msgid "DeletionSettings|Deletion protection"
msgstr ""
-msgid "DeletionSettings|Keep deleted"
-msgstr ""
-
msgid "DeletionSettings|Keep deleted projects for %{number} day"
msgid_plural "DeletionSettings|Keep deleted projects for %{number} days"
msgstr[0] ""
msgstr[1] ""
-msgid "DeletionSettings|None, delete immediately"
-msgstr ""
-
msgid "DeletionSettings|Only administrators can delete projects."
msgstr ""
@@ -14589,9 +14577,6 @@ msgstr ""
msgid "DeletionSettings|Period that deleted groups and projects will remain restorable for. Personal projects are always deleted immediately."
msgstr ""
-msgid "DeletionSettings|Retention period that deleted groups and projects will remain restorable. Personal projects are always deleted immediately. Some groups can opt-out their projects."
-msgstr ""
-
msgid "Denied"
msgstr ""
@@ -53257,9 +53242,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for"
-msgstr ""
-
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr ""
@@ -53313,12 +53295,6 @@ msgstr ""
msgid "groups"
msgstr ""
-msgid "groups and projects"
-msgstr ""
-
-msgid "groups only"
-msgstr ""
-
msgid "had %{count} failed job"
msgid_plural "had %{count} failed jobs"
msgstr[0] ""