diff --git a/doc/user/application_security/dependency_list/index.md b/doc/user/application_security/dependency_list/index.md index c75a98e45f99176cd44706115edf783b3b5f334f..83b6e43f2da2b9281446579e2187a98d09f4c693 100644 --- a/doc/user/application_security/dependency_list/index.md +++ b/doc/user/application_security/dependency_list/index.md @@ -68,11 +68,7 @@ Details of each dependency are listed, sorted by decreasing severity of vulnerab ## Filter dependency list > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/422356) in GitLab 16.7 [with a flag](../../../administration/feature_flags.md) named `group_level_dependencies_filtering`. Disabled by default. -> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/424727) in GitLab 16.10. - -FLAG: -On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../../../administration/feature_flags.md) named `group_level_dependencies_filtering`. -On GitLab.com, this feature is available. +> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/422356) in GitLab 16.10. Feature flag `group_level_dependencies_filtering` removed. In the group-level dependency list you can filter by: diff --git a/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue b/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue index bbae098961422c0de41735261ab32dc36e050f93..cb48796946243dd6115a0146b8561710a63dd4da 100644 --- a/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue +++ b/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue @@ -4,7 +4,7 @@ import { GlSorting } from '@gitlab/ui'; import { mapActions, mapState } from 'vuex'; import { omit } from 'lodash'; import { __ } from '~/locale'; -import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; +import GroupDependenciesFilteredSearch from 'ee/dependencies/components/filtered_search/group_dependencies_filtered_search.vue'; import { NAMESPACE_PROJECT } from '../constants'; import { DEPENDENCY_LIST_TYPES } from '../store/constants'; import { @@ -21,10 +21,8 @@ export default { name: 'DependenciesActions', components: { GlSorting, - GroupDependenciesFilteredSearch: () => - import('ee/dependencies/components/filtered_search/group_dependencies_filtered_search.vue'), + GroupDependenciesFilteredSearch, }, - mixins: [glFeatureFlagsMixin()], inject: ['namespaceType', 'belowGroupLimit'], props: { namespace: { @@ -84,7 +82,7 @@ export default { class="gl-display-flex gl-p-5 gl-bg-gray-10 gl-border-t-1 gl-border-t-solid gl-border-gray-100 gl-align-items-flex-start" > <group-dependencies-filtered-search - v-if="glFeatures.groupLevelDependenciesFiltering && !isProjectNamespace" + v-if="!isProjectNamespace" class="gl-mr-3 gl-flex-grow-1 gl-min-w-0" /> <gl-sorting diff --git a/ee/app/controllers/groups/dependencies_controller.rb b/ee/app/controllers/groups/dependencies_controller.rb index b1536c7d58b8c90d9a3abe5e1905d4cbdc22fb9f..acb4b232d26eab3ecf5e5a98e0436ced1fe2aa26 100644 --- a/ee/app/controllers/groups/dependencies_controller.rb +++ b/ee/app/controllers/groups/dependencies_controller.rb @@ -4,10 +4,6 @@ module Groups class DependenciesController < Groups::ApplicationController include GovernUsageGroupTracking - before_action only: :index do - push_frontend_feature_flag(:group_level_dependencies_filtering, group) - end - before_action :authorize_read_dependency_list! before_action :validate_project_ids_limit!, only: :index @@ -43,7 +39,7 @@ def locations end def licenses - return render_not_authorized unless filtering_allowed? + return render_not_authorized unless below_group_limit? catalogue = Gitlab::SPDX::Catalogue.latest @@ -77,7 +73,7 @@ def dependencies_finder end def dependencies_finder_params - if filtering_allowed? + if below_group_limit? params.permit( :page, :per_page, @@ -122,10 +118,6 @@ def set_below_group_limit @below_group_limit = below_group_limit? end - def filtering_allowed? - Feature.enabled?(:group_level_dependencies_filtering, group) && below_group_limit? - end - def below_group_limit? group.count_within_namespaces <= GROUP_COUNT_LIMIT end diff --git a/ee/config/feature_flags/development/group_level_dependencies_filtering.yml b/ee/config/feature_flags/development/group_level_dependencies_filtering.yml deleted file mode 100644 index f57757d0dc2e307f8420eb7896f03e1181118f21..0000000000000000000000000000000000000000 --- a/ee/config/feature_flags/development/group_level_dependencies_filtering.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: group_level_dependencies_filtering -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/131339 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/424727 -milestone: '16.4' -type: development -group: group::threat insights -default_enabled: true diff --git a/ee/spec/frontend/dependencies/components/dependencies_actions_spec.js b/ee/spec/frontend/dependencies/components/dependencies_actions_spec.js index 206c7197c3543d71c66a807e488ca8df35455328..b47f7060255fd09e7bae39ffc6426079eb41c16d 100644 --- a/ee/spec/frontend/dependencies/components/dependencies_actions_spec.js +++ b/ee/spec/frontend/dependencies/components/dependencies_actions_spec.js @@ -30,7 +30,6 @@ describe('DependenciesActions component', () => { propsData: { ...propsData }, provide: { ...objectBasicProp, - glFeatures: { groupLevelDependenciesFiltering: true }, ...provide, }, }); @@ -81,6 +80,10 @@ describe('DependenciesActions component', () => { ); }); + it('renders a filtered-search input', () => { + expect(wrapper.findComponent(GroupDependenciesFilteredSearch).exists()).toBe(true); + }); + describe('with the "belowGroupLimit" set to false', () => { beforeEach(async () => { factory({ @@ -106,23 +109,6 @@ describe('DependenciesActions component', () => { ); }); }); - - describe('with the "groupLevelDependenciesFiltering" feature flag disabled', () => { - beforeEach(async () => { - factory({ - propsData: { namespace }, - provide: { - namespaceType: 'group', - glFeatures: { groupLevelDependenciesFiltering: false }, - }, - }); - await nextTick(); - }); - - it('does not render a filtered-search input', () => { - expect(wrapper.findComponent(GroupDependenciesFilteredSearch).exists()).toBe(false); - }); - }); }); it('dispatches the toggleSortOrder action on clicking the sort order button', () => { diff --git a/ee/spec/requests/groups/dependencies_controller_spec.rb b/ee/spec/requests/groups/dependencies_controller_spec.rb index e8f7a2bdd86e66c242a197ea9c4db606bb164bcc..e28f82b01678e1c9ecd6bdd54a6fb349469ec69e 100644 --- a/ee/spec/requests/groups/dependencies_controller_spec.rb +++ b/ee/spec/requests/groups/dependencies_controller_spec.rb @@ -48,18 +48,6 @@ let(:request) { subject } end - context 'when group_level_dependencies_filtering is disabled' do - before do - stub_feature_flags(group_level_dependencies_filtering: false) - end - - it 'does not show group limit warning' do - subject - - expect(assigns(:below_group_limit)).to eq(true) - end - end - context 'when the group hierarchy depth is too high' do before do stub_const('::Groups::DependenciesController::GROUP_COUNT_LIMIT', 0) @@ -321,21 +309,6 @@ expect(json_response['dependencies'].pluck('name')).to eq([sbom_occurrence_bundler.name]) end - context 'when `group_level_dependencies_filtering` is disabled' do - before do - stub_feature_flags(group_level_dependencies_filtering: false) - end - - it 'ignores the filter' do - subject - - expect(json_response['dependencies'].pluck('name')).to match_array([ - sbom_occurrence_bundler.component_name, - sbom_occurrence_npm.component_name - ]) - end - end - context 'when the group hierarchy depth is too high' do before do stub_const('::Groups::DependenciesController::GROUP_COUNT_LIMIT', 0) @@ -561,18 +534,6 @@ license_names = json_response['licenses'].pluck('name') expect(license_names.sort).to eq(license_names) end - - context 'when feature flag `group_level_dependencies_filtering` is disabled' do - before do - stub_feature_flags(group_level_dependencies_filtering: false) - end - - it 'returns http status :forbidden' do - subject - - expect(response).to have_gitlab_http_status(:forbidden) - end - end end context 'when user is not allowed to access group level dependencies' do