diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml index 6fa76297679d9db44c186ffad032fe2f314c9bcb..8fec56007800e1dd71a149a8d8a601570d674d70 100644 --- a/app/views/groups/settings/_permissions.html.haml +++ b/app/views/groups/settings/_permissions.html.haml @@ -30,8 +30,6 @@ help_text: s_('GroupSettings|Group members are not notified if the group is mentioned.') = render 'groups/settings/resource_access_token_creation', f: f, group: @group - - unless Feature.enabled?(:always_perform_delayed_deletion) - = render_if_exists 'groups/settings/delayed_project_removal', f: f, group: @group = render 'groups/settings/ip_restriction_registration_features_cta', f: f = render_if_exists 'groups/settings/ip_restriction', f: f, group: @group = render_if_exists 'groups/settings/allowed_email_domain', f: f, group: @group diff --git a/config/feature_flags/development/always_perform_delayed_deletion.yml b/config/feature_flags/development/always_perform_delayed_deletion.yml deleted file mode 100644 index df3d318a3957e57aeb2dec9e67c9bf870e9554c5..0000000000000000000000000000000000000000 --- a/config/feature_flags/development/always_perform_delayed_deletion.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: always_perform_delayed_deletion -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113332 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/393622 -milestone: '15.10' -type: development -group: group::tenant scale -default_enabled: true diff --git a/ee/app/assets/javascripts/admin/application_settings/deletion_protection/components/form_group.vue b/ee/app/assets/javascripts/admin/application_settings/deletion_protection/components/form_group.vue index d530179cecdb9f526422af0f05ccb78ba56902f9..d8405d612fc8556f1ead7d0017390682f2fcc1f7 100644 --- a/ee/app/assets/javascripts/admin/application_settings/deletion_protection/components/form_group.vue +++ b/ee/app/assets/javascripts/admin/application_settings/deletion_protection/components/form_group.vue @@ -1,143 +1,51 @@ 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] ""