Commit aa2bedca authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents 8f2c7308 58f8d735
b84ba4f096da54ebb6a85c14ab736474c72f1a2a d12fb69a841d91d843f392a124865f6d47d3bc22
...@@ -27,7 +27,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController ...@@ -27,7 +27,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
feature_category :source_code_management, [:repository, :clear_repository_check_states] feature_category :source_code_management, [:repository, :clear_repository_check_states]
feature_category :continuous_integration, [:ci_cd, :reset_registration_token] feature_category :continuous_integration, [:ci_cd, :reset_registration_token]
feature_category :usage_ping, [:usage_data] feature_category :service_ping, [:usage_data]
feature_category :integrations, [:integrations] feature_category :integrations, [:integrations]
feature_category :pages, [:lets_encrypt_terms_of_service] feature_category :pages, [:lets_encrypt_terms_of_service]
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
class Projects::ServicePingController < Projects::ApplicationController class Projects::ServicePingController < Projects::ApplicationController
before_action :authenticate_user! before_action :authenticate_user!
feature_category :usage_ping feature_category :service_ping
def web_ide_clientside_preview def web_ide_clientside_preview
return render_404 unless Gitlab::CurrentSettings.web_ide_clientside_preview_enabled? return render_404 unless Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?
......
...@@ -267,7 +267,7 @@ ...@@ -267,7 +267,7 @@
:tags: [] :tags: []
- :name: cronjob:gitlab_usage_ping - :name: cronjob:gitlab_usage_ping
:worker_name: GitlabUsagePingWorker :worker_name: GitlabUsagePingWorker
:feature_category: :usage_ping :feature_category: :service_ping
:has_external_dependencies: :has_external_dependencies:
:urgency: :low :urgency: :low
:resource_boundary: :unknown :resource_boundary: :unknown
......
...@@ -8,7 +8,7 @@ class GitlabUsagePingWorker # rubocop:disable Scalability/IdempotentWorker ...@@ -8,7 +8,7 @@ class GitlabUsagePingWorker # rubocop:disable Scalability/IdempotentWorker
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
include Gitlab::ExclusiveLeaseHelpers include Gitlab::ExclusiveLeaseHelpers
feature_category :usage_ping feature_category :service_ping
sidekiq_options retry: 3, dead: false sidekiq_options retry: 3, dead: false
sidekiq_retry_in { |count| (count + 1) * 8.hours.to_i } sidekiq_retry_in { |count| (count + 1) * 8.hours.to_i }
......
...@@ -30,7 +30,7 @@ To create the Tunnel: ...@@ -30,7 +30,7 @@ To create the Tunnel:
.kubectl_config: &kubectl_config .kubectl_config: &kubectl_config
- | - |
cat << EOF > "$HOME/agent_config.yaml" cat << EOF > "$CI_PROJECT_DIR/.kubeconfig.agent.yaml"
apiVersion: v1 apiVersion: v1
kind: Config kind: Config
clusters: clusters:
...@@ -48,12 +48,11 @@ To create the Tunnel: ...@@ -48,12 +48,11 @@ To create the Tunnel:
name: agent name: agent
current-context: agent current-context: agent
EOF EOF
- export KUBECONFIG="$KUBECONFIG:$HOME/agent_config.yaml"
deploy: deploy:
script: script:
- *kubectl_config - *kubectl_config
- kubectl get pods - kubectl --kubeconfig="$CI_PROJECT_DIR/.kubeconfig.agent.yaml" get pods
``` ```
1. Execute `kubectl` commands directly against your cluster with this CI/CD job you just created. 1. Execute `kubectl` commands directly against your cluster with this CI/CD job you just created.
......
...@@ -320,8 +320,9 @@ For more information, see [Start the pull mirroring process for a Project](../.. ...@@ -320,8 +320,9 @@ For more information, see [Start the pull mirroring process for a Project](../..
> - Moved to GitLab Premium in 13.9. > - Moved to GitLab Premium in 13.9.
Based on the mirror direction that you choose, you can opt to mirror only the Based on the mirror direction that you choose, you can opt to mirror only the
[protected branches](../protected_branches.md) from/to your remote repository. [protected branches](../protected_branches.md) in the mirroring project,
For pull mirroring, non-protected branches are not mirrored and can diverge. either from or to your remote repository. For pull mirroring, non-protected branches in
the mirroring project are not mirrored and can diverge.
To use this option, check the **Only mirror protected branches** box when To use this option, check the **Only mirror protected branches** box when
creating a repository mirror. **(PREMIUM)** creating a repository mirror. **(PREMIUM)**
......
...@@ -16,5 +16,5 @@ export default () => ({ ...@@ -16,5 +16,5 @@ export default () => ({
}, },
filter: FILTER.all, filter: FILTER.all,
sortField: 'severity', sortField: 'severity',
sortOrder: SORT_ORDER.ascending, sortOrder: SORT_ORDER.descending,
}); });
...@@ -21,7 +21,7 @@ module TrialStatusWidgetHelper ...@@ -21,7 +21,7 @@ module TrialStatusWidgetHelper
base_attrs.merge( base_attrs.merge(
group_name: group.name, group_name: group.name,
purchase_href: ultimate_subscription_path_for_group(group), purchase_href: ultimate_subscription_path_for_group(group),
start_initially_shown: force_popover_to_be_shown?(group.trial_days_remaining), start_initially_shown: in_forced_popover_experiment?(group) && force_popover_to_be_shown?(group.trial_days_remaining),
target_id: base_attrs[:container_id], target_id: base_attrs[:container_id],
trial_end_date: group.trial_ends_on trial_end_date: group.trial_ends_on
) )
...@@ -64,4 +64,8 @@ module TrialStatusWidgetHelper ...@@ -64,4 +64,8 @@ module TrialStatusWidgetHelper
def ultimate_subscription_path_for_group(group) def ultimate_subscription_path_for_group(group)
new_subscriptions_path(namespace_id: group.id, plan_id: ZUORA_ULTIMATE_PLAN_ID) new_subscriptions_path(namespace_id: group.id, plan_id: ZUORA_ULTIMATE_PLAN_ID)
end end
def in_forced_popover_experiment?(group)
experiment(:forcibly_show_trial_status_popover, group: group).variant.group == :experiment
end
end end
...@@ -51,25 +51,33 @@ module Security ...@@ -51,25 +51,33 @@ module Security
end end
def sort(collection) def sort(collection)
default_sort_order = 'asc'
case params[:sort_by] case params[:sort_by]
when 'packager' when 'packager'
collection.sort_by! { |a| a[:packager] } collection.sort_by! { |a| a[:packager] }
when 'severity' when 'severity'
default_sort_order = 'desc'
sort_dependency_vulnerabilities_by_severity!(collection) sort_dependency_vulnerabilities_by_severity!(collection)
sort_dependencies_by_severity!(collection) sort_dependencies_by_severity!(collection)
else else
collection.sort_by! { |a| a[:name] } collection.sort_by! { |a| a[:name] }
end end
collection.reverse! if params[:sort] == 'desc' if params[:sort] && params[:sort] != default_sort_order
collection.reverse!
end
collection collection
end end
def compare_severity_levels(level1, level2) def compare_severity_levels(level1, level2)
# level2 appears before level1 because we want the default sort order to be in descending
# order of severity level, for example "critical, high, medium, low"
::Enums::Vulnerability.severity_levels[level2] <=> ::Enums::Vulnerability.severity_levels[level1] ::Enums::Vulnerability.severity_levels[level2] <=> ::Enums::Vulnerability.severity_levels[level1]
end end
# sort dependency vulnerabilities in descending order by severity level
def sort_dependency_vulnerabilities_by_severity!(collection) def sort_dependency_vulnerabilities_by_severity!(collection)
collection.each do |dependency| collection.each do |dependency|
dependency[:vulnerabilities].sort! do |vulnerability1, vulnerability2| dependency[:vulnerabilities].sort! do |vulnerability1, vulnerability2|
...@@ -78,8 +86,8 @@ module Security ...@@ -78,8 +86,8 @@ module Security
end end
end end
# vulnerabilities are already sorted by severity level so we can assume that first vulnerability in # vulnerabilities are already sorted in descending order by severity level so we can assume that
# vulnerabilities array will have highest severity # first vulnerability in the vulnerabilities array will have the highest severity
def sort_dependencies_by_severity!(collection) def sort_dependencies_by_severity!(collection)
collection.sort! do |dep_i, dep_j| collection.sort! do |dep_i, dep_j|
level_i = dep_i.dig(:vulnerabilities, 0, :severity) || :info level_i = dep_i.dig(:vulnerabilities, 0, :severity) || :info
......
---
name: forcibly_show_trial_status_popover
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65283
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335043
milestone: '14.1'
type: experiment
group: group::conversion
default_enabled: false
...@@ -93,7 +93,7 @@ exports[`DependenciesActions component matches the snapshot 1`] = ` ...@@ -93,7 +93,7 @@ exports[`DependenciesActions component matches the snapshot 1`] = `
variant="default" variant="default"
> >
<gl-icon-stub <gl-icon-stub
name="sort-lowest" name="sort-highest"
size="16" size="16"
/> />
</gl-button-stub> </gl-button-stub>
......
...@@ -33,6 +33,7 @@ RSpec.describe TrialStatusWidgetHelper do ...@@ -33,6 +33,7 @@ RSpec.describe TrialStatusWidgetHelper do
before do before do
travel_to today_for_specs travel_to today_for_specs
stub_experiments(forcibly_show_trial_status_popover: :candidate)
end end
describe '#trial_status_popover_data_attrs' do describe '#trial_status_popover_data_attrs' do
...@@ -97,6 +98,18 @@ RSpec.describe TrialStatusWidgetHelper do ...@@ -97,6 +98,18 @@ RSpec.describe TrialStatusWidgetHelper do
include_examples 'returned data attributes' include_examples 'returned data attributes'
end end
end end
context 'when not part of the experiment' do
before do
stub_experiments(forcibly_show_trial_status_popover: :control)
end
where trial_days_remaining: [2, 5, 9, 14, 20]
with_them do
include_examples 'returned data attributes', shown: false
end
end
end end
describe '#trial_status_widget_data_attrs' do describe '#trial_status_widget_data_attrs' do
......
...@@ -97,26 +97,48 @@ RSpec.describe Security::DependencyListService do ...@@ -97,26 +97,48 @@ RSpec.describe Security::DependencyListService do
end end
end end
# this test ensures the dependency list severity sort order is `info, unknown, low, medium, high, critical` context 'sorted by severity' do
# which is asending severity order, however, the UI label for this sort order is currently `desc`.
# TODO: change the UI label to use `asc` for this sort order and use `desc` for the default sort order
# of `critical, high, medium, low, unknown, info`
# See https://gitlab.com/gitlab-org/gitlab/-/issues/332653
context 'sorted by asc severity' do
let(:params) do let(:params) do
{ {
sort: 'desc',
sort_by: 'severity' sort_by: 'severity'
} }
end end
context 'in descending order' do
before do
params[:sort] = 'desc'
end
it 'returns array of data sorted by package severity level in descending order' do
dependencies = subject.first(2).map do |dependency|
{
name: dependency[:name],
vulnerabilities: dependency[:vulnerabilities].pluck(:severity)
}
end
expect(dependencies).to eq([{ name: "saml2-js", vulnerabilities: %w(critical medium unknown) },
{ name: "nokogiri", vulnerabilities: ["high"] }])
end
it 'returns array of data with package vulnerabilities sorted in descending order' do
saml2js_dependency = subject.find { |dep| dep[:name] == 'saml2-js' }
saml2js_severities = saml2js_dependency[:vulnerabilities].map {|v| v[:severity] }
expect(saml2js_severities).to eq(%w(critical medium unknown))
end
end
context 'in ascending order' do
before do
params[:sort] = 'asc'
end
it 'returns array of data sorted by package severity level in ascending order' do it 'returns array of data sorted by package severity level in ascending order' do
dependencies = subject.last(2).map do |dependency| dependencies = subject.last(2).map do |dependency|
{ {
name: dependency[:name], name: dependency[:name],
vulnerabilities: dependency[:vulnerabilities].map do |vulnerability| vulnerabilities: dependency[:vulnerabilities].pluck(:severity)
vulnerability[:severity]
end
} }
end end
...@@ -133,4 +155,5 @@ RSpec.describe Security::DependencyListService do ...@@ -133,4 +155,5 @@ RSpec.describe Security::DependencyListService do
end end
end end
end end
end
end end
...@@ -4,7 +4,7 @@ module API ...@@ -4,7 +4,7 @@ module API
class UsageData < ::API::Base class UsageData < ::API::Base
before { authenticate_non_get! } before { authenticate_non_get! }
feature_category :usage_ping feature_category :service_ping
namespace 'usage_data' do namespace 'usage_data' do
before do before do
......
...@@ -4,7 +4,7 @@ module API ...@@ -4,7 +4,7 @@ module API
class UsageDataNonSqlMetrics < ::API::Base class UsageDataNonSqlMetrics < ::API::Base
before { authenticated_as_admin! } before { authenticated_as_admin! }
feature_category :usage_ping feature_category :service_ping
namespace 'usage_data' do namespace 'usage_data' do
before do before do
......
...@@ -4,7 +4,7 @@ module API ...@@ -4,7 +4,7 @@ module API
class UsageDataQueries < ::API::Base class UsageDataQueries < ::API::Base
before { authenticated_as_admin! } before { authenticated_as_admin! }
feature_category :usage_ping feature_category :service_ping
namespace 'usage_data' do namespace 'usage_data' do
before do before do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment