Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-10-06 06:08:33 +00:00
parent 53a3791717
commit 52b1470ada
22 changed files with 158 additions and 52 deletions

View File

@ -142,6 +142,7 @@ Style/FormatString:
- 'app/presenters/ci/pipeline_presenter.rb' - 'app/presenters/ci/pipeline_presenter.rb'
- 'app/presenters/merge_request_presenter.rb' - 'app/presenters/merge_request_presenter.rb'
- 'app/presenters/project_presenter.rb' - 'app/presenters/project_presenter.rb'
- 'app/presenters/key_presenter.rb'
- 'app/serializers/build_details_entity.rb' - 'app/serializers/build_details_entity.rb'
- 'app/services/alert_management/alerts/update_service.rb' - 'app/services/alert_management/alerts/update_service.rb'
- 'app/services/boards/lists/base_create_service.rb' - 'app/services/boards/lists/base_create_service.rb'

View File

@ -81,10 +81,9 @@ export default {
}, },
}, },
i18n: { i18n: {
deleteModalContent: s__( deleteModalContent: s__('PackageRegistry|You are about to delete %{name}, are you sure?'),
'PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?', modalTitle: s__('PackageRegistry|Delete package'),
), modalAction: s__('PackageRegistry|Permanently delete'),
modalAction: s__('PackageRegistry|Delete package'),
}, },
}; };
</script> </script>
@ -120,13 +119,13 @@ export default {
<gl-modal <gl-modal
ref="packageListDeleteModal" ref="packageListDeleteModal"
size="sm" size="sm"
modal-id="confirm-delete-pacakge" modal-id="confirm-delete-package"
:action-primary="deleteModalActionPrimaryProps" :action-primary="deleteModalActionPrimaryProps"
:action-cancel="deleteModalActionCancelProps" :action-cancel="deleteModalActionCancelProps"
@ok="deleteItemConfirmation" @ok="deleteItemConfirmation"
@cancel="deleteItemCanceled" @cancel="deleteItemCanceled"
> >
<template #modal-title>{{ $options.i18n.modalAction }}</template> <template #modal-title>{{ $options.i18n.modalTitle }}</template>
<gl-sprintf :message="$options.i18n.deleteModalContent"> <gl-sprintf :message="$options.i18n.deleteModalContent">
<template #name> <template #name>
<strong>{{ deletePackageName }}</strong> <strong>{{ deletePackageName }}</strong>

View File

@ -122,10 +122,9 @@ export default {
}, },
}, },
i18n: { i18n: {
deleteModalContent: s__( deleteModalContent: s__('PackageRegistry|You are about to delete %{name}, are you sure?'),
'PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?', modalTitle: s__('PackageRegistry|Delete package'),
), modalAction: s__('PackageRegistry|Permanently delete'),
modalAction: s__('PackageRegistry|Delete package'),
errorMessageBodyAlert: s__( errorMessageBodyAlert: s__(
'PackageRegistry|There was a timeout and the package was not published. Delete this package and try again.', 'PackageRegistry|There was a timeout and the package was not published. Delete this package and try again.',
), ),
@ -172,14 +171,14 @@ export default {
<gl-modal <gl-modal
v-model="showDeleteModal" v-model="showDeleteModal"
modal-id="confirm-delete-pacakge" modal-id="confirm-delete-package"
size="sm" size="sm"
:action-primary="deleteModalActionPrimaryProps" :action-primary="deleteModalActionPrimaryProps"
:action-cancel="deleteModalActionCancelProps" :action-cancel="deleteModalActionCancelProps"
@ok="deleteItemConfirmation" @ok="deleteItemConfirmation"
@cancel="deleteItemCanceled" @cancel="deleteItemCanceled"
> >
<template #modal-title>{{ $options.i18n.modalAction }}</template> <template #modal-title>{{ $options.i18n.modalTitle }}</template>
<gl-sprintf :message="$options.i18n.deleteModalContent"> <gl-sprintf :message="$options.i18n.deleteModalContent">
<template #name> <template #name>
<strong>{{ deletePackageName }}</strong> <strong>{{ deletePackageName }}</strong>

View File

@ -263,7 +263,7 @@ export default {
}, },
modal: { modal: {
packageDeletePrimaryAction: { packageDeletePrimaryAction: {
text: __('Delete'), text: s__('PackageRegistry|Permanently delete'),
attributes: [ attributes: [
{ variant: 'danger' }, { variant: 'danger' },
{ category: 'primary' }, { category: 'primary' },

View File

@ -27,11 +27,9 @@ class Projects::DeployKeysController < Projects::ApplicationController
end end
def create def create
@key = DeployKeys::CreateService.new(current_user, create_params).execute(project: @project) @key = DeployKeys::CreateService.new(current_user, create_params).execute(project: @project).present
unless @key.valid? flash[:alert] = @key.humanized_error_message unless @key.valid?
flash[:alert] = @key.errors.full_messages.join(', ').html_safe
end
redirect_to_repository redirect_to_repository
end end

View File

@ -4,6 +4,7 @@ class DeployKey < Key
include FromUnion include FromUnion
include IgnorableColumns include IgnorableColumns
include PolicyActor include PolicyActor
include Presentable
has_many :deploy_keys_projects, inverse_of: :deploy_key, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :deploy_keys_projects, inverse_of: :deploy_key, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :projects, through: :deploy_keys_projects has_many :projects, through: :deploy_keys_projects

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
class DeployKeyPresenter < KeyPresenter # rubocop:disable Gitlab/NamespacedClass
presents ::DeployKey, as: :deploy_key
def humanized_error_message
super(type: :deploy_key)
end
end

View File

@ -0,0 +1,22 @@
# frozen_string_literal: true
class KeyPresenter < Gitlab::View::Presenter::Delegated # rubocop:disable Gitlab/NamespacedClass
presents ::Key, as: :key_object
def humanized_error_message(type: :key)
if !key_object.public_key.valid?
help_link = help_page_link(_('supported SSH public key.'), 'user/ssh', 'supported-ssh-key-types')
_('%{type} must be a %{help_link}').html_safe % { type: type.to_s.titleize, help_link: help_link }
else
key_object.errors.full_messages.join(', ').html_safe
end
end
private
def help_page_link(title, path, anchor)
ActionController::Base.helpers.link_to(title, help_page_path(path, anchor: anchor),
target: '_blank', rel: 'noopener noreferrer')
end
end

View File

@ -19,7 +19,7 @@ module ObjectStorage
ip = IPAddr.new(request_ip) ip = IPAddr.new(request_ip)
return false if ip.private? return false if ip.private? || ip.link_local? || ip.loopback?
!GoogleIpCache.google_ip?(request_ip) !GoogleIpCache.google_ip?(request_ip)
end end

View File

@ -0,0 +1,8 @@
---
name: group_analytics_dashboards_page
introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98767'
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/375251
milestone: '15.5'
type: development
group: group::optimize
default_enabled: false

View File

@ -26,11 +26,6 @@ if log_deprecations?
Gitlab::DeprecationJsonLogger.info(message: warning.strip, source: 'ruby') Gitlab::DeprecationJsonLogger.info(message: warning.strip, source: 'ruby')
# Returning :default means we continue emitting this to stderr as well. # Returning :default means we continue emitting this to stderr as well.
:default :default
end,
# This won't be needed when https://gitlab.com/gitlab-org/gitlab/-/issues/340602 is completed
/\A`Redis#exists\(key\)` will return an Integer in redis-rb 4\.3/ => lambda do |warning|
Gitlab::DeprecationJsonLogger.info(message: warning.strip, source: 'redis')
:default
end end
} }

View File

@ -4,12 +4,6 @@ require 'gitlab/redis'
Redis.raise_deprecations = true unless Rails.env.production? Redis.raise_deprecations = true unless Rails.env.production?
# We set the instance variable directly to suppress warnings.
# We cannot switch to the new behavior until we change all existing `redis.exists` calls to `redis.exists?`.
# Some gems also need to be updated
# https://gitlab.com/gitlab-org/gitlab/-/issues/340602
Redis.instance_variable_set(:@exists_returns_integer, nil)
Redis::Client.prepend(Gitlab::Instrumentation::RedisInterceptor) Redis::Client.prepend(Gitlab::Instrumentation::RedisInterceptor)
# Make sure we initialize a Redis connection pool before multi-threaded # Make sure we initialize a Redis connection pool before multi-threaded

View File

@ -7,7 +7,7 @@ type: index, concepts, howto
# Development guide for GitLab CI/CD templates **(FREE)** # Development guide for GitLab CI/CD templates **(FREE)**
This document explains how to develop [GitLab CI/CD templates](../../ci/examples/index.md). This document explains how to develop [GitLab CI/CD templates](../../ci/examples/index.md#cicd-templates).
## Requirements for CI/CD templates ## Requirements for CI/CD templates

View File

@ -13,11 +13,6 @@ To access the dashboard, on the top bar, select **Main menu > Operations**.
## Adding a project to the dashboard ## Adding a project to the dashboard
NOTE:
For GitLab.com, you can add your project to the Operations Dashboard for free if
your project is public. If your project is private, the group it belongs to must
have a [GitLab Premium](https://about.gitlab.com/pricing/) plan.
To add a project to the dashboard: To add a project to the dashboard:
1. Ensure your alerts populate the `gitlab_environment_name` label on the alerts you set up in Prometheus. 1. Ensure your alerts populate the `gitlab_environment_name` label on the alerts you set up in Prometheus.

View File

@ -1134,6 +1134,9 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}" msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "" msgstr ""
msgid "%{type} must be a %{help_link}"
msgstr ""
msgid "%{type} only supports %{name} name" msgid "%{type} only supports %{name} name"
msgstr "" msgstr ""
@ -4513,6 +4516,9 @@ msgstr ""
msgid "Analytics" msgid "Analytics"
msgstr "" msgstr ""
msgid "AnalyticsDashboards|Dashboards"
msgstr ""
msgid "Analyze your dependencies for known vulnerabilities." msgid "Analyze your dependencies for known vulnerabilities."
msgstr "" msgstr ""
@ -28705,6 +28711,9 @@ msgstr[1] ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}" msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr "" msgstr ""
msgid "PackageRegistry|Permanently delete"
msgstr ""
msgid "PackageRegistry|Permanently delete assets" msgid "PackageRegistry|Permanently delete assets"
msgstr "" msgstr ""
@ -28816,7 +28825,7 @@ msgstr ""
msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?" msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
msgstr "" msgstr ""
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?" msgid "PackageRegistry|You are about to delete %{name}, are you sure?"
msgstr "" msgstr ""
msgid "PackageRegistry|You are about to delete 1 asset. This operation is irreversible." msgid "PackageRegistry|You are about to delete 1 asset. This operation is irreversible."
@ -48579,6 +48588,9 @@ msgstr ""
msgid "suggestPipeline|Were adding a GitLab CI configuration file to add a pipeline to the project. You could create it manually, but we recommend that you start with a GitLab template that works out of the box." msgid "suggestPipeline|Were adding a GitLab CI configuration file to add a pipeline to the project. You could create it manually, but we recommend that you start with a GitLab template that works out of the box."
msgstr "" msgstr ""
msgid "supported SSH public key."
msgstr ""
msgid "tag name" msgid "tag name"
msgstr "" msgstr ""

View File

@ -72,13 +72,15 @@ RSpec.describe Projects::DeployKeysController do
end end
describe 'POST create' do describe 'POST create' do
let(:deploy_key_content) { attributes_for(:deploy_key)[:key] }
def create_params(title = 'my-key') def create_params(title = 'my-key')
{ {
namespace_id: project.namespace.path, namespace_id: project.namespace.path,
project_id: project.path, project_id: project.path,
deploy_key: { deploy_key: {
title: title, title: title,
key: attributes_for(:deploy_key)[:key], key: deploy_key_content,
deploy_keys_projects_attributes: { '0' => { can_push: '1' } } deploy_keys_projects_attributes: { '0' => { can_push: '1' } }
} }
} }
@ -96,13 +98,38 @@ RSpec.describe Projects::DeployKeysController do
expect(response).to redirect_to(project_settings_repository_path(project, anchor: 'js-deploy-keys-settings')) expect(response).to redirect_to(project_settings_repository_path(project, anchor: 'js-deploy-keys-settings'))
end end
context 'when the deploy key is invalid' do context 'when the deploy key has an invalid title' do
it 'shows an alert with the validations errors' do it 'shows an alert with the validations errors' do
post :create, params: create_params(nil) post :create, params: create_params(nil)
expect(flash[:alert]).to eq("Title can't be blank, Deploy keys projects deploy key title can't be blank") expect(flash[:alert]).to eq("Title can't be blank, Deploy keys projects deploy key title can't be blank")
end end
end end
context 'when the deploy key is not supported SSH public key' do
let(:deploy_key_content) { 'bogus ssh public key' }
it 'shows an alert with a help link' do
post :create, params: create_params
expect(assigns(:key).errors.count).to be > 1
expect(flash[:alert]).to eq('Deploy Key must be a <a target="_blank" rel="noopener noreferrer" ' \
'href="/help/user/ssh#supported-ssh-key-types">supported SSH public key.</a>')
end
end
context 'when the deploy key already exists' do
before do
create(:deploy_key, title: 'my-key', key: deploy_key_content, projects: [project])
end
it 'shows an alert with the validations errors' do
post :create, params: create_params
expect(flash[:alert]).to eq("Fingerprint sha256 has already been taken, " \
"Deploy keys projects deploy key fingerprint sha256 has already been taken")
end
end
end end
describe '/enable/:id' do describe '/enable/:id' do

View File

@ -57,7 +57,7 @@ RSpec.describe 'Infrastructure Registry' do
it 'allows you to delete a module', :aggregate_failures do it 'allows you to delete a module', :aggregate_failures do
# this is still using the package copy in the UI too # this is still using the package copy in the UI too
click_button('Remove package') click_button('Remove package')
click_button('Delete package') click_button('Permanently delete')
expect(page).to have_content 'Package deleted successfully' expect(page).to have_content 'Package deleted successfully'
expect(page).not_to have_content(terraform_module.name) expect(page).not_to have_content(terraform_module.name)

View File

@ -49,7 +49,7 @@ RSpec.describe 'Packages' do
it 'allows you to delete a package' do it 'allows you to delete a package' do
find('[data-testid="delete-dropdown"]').click find('[data-testid="delete-dropdown"]').click
find('[data-testid="action-delete"]').click find('[data-testid="action-delete"]').click
click_button('Delete package') click_button('Permanently delete')
expect(page).to have_content 'Package deleted successfully' expect(page).to have_content 'Package deleted successfully'
expect(page).not_to have_content(package.name) expect(page).not_to have_content(package.name)

View File

@ -86,18 +86,6 @@ RSpec.describe '0_log_deprecations' do
expect { warn('ABC gem is deprecated') }.to output.to_stderr expect { warn('ABC gem is deprecated') }.to output.to_stderr
end end
end end
it 'logs Redis exists_returns_integer deprecation message' do
msg = "`Redis#exists(key)` will return an Integer in redis-rb 4.3. `exists?` returns a boolean, you " \
"should use it instead. To opt-in to the new behavior now you can set Redis.exists_returns_integer = " \
"true. To disable this message and keep the current (boolean) behaviour of 'exists' you can set " \
"`Redis.exists_returns_integer = false`, but this option will be removed in 5.0.0. " \
"(#{::Kernel.caller(1, 1).first})\n"
expect(Gitlab::DeprecationJsonLogger).to receive(:info).with(message: msg.strip, source: 'redis')
expect { warn(msg) }.to output.to_stderr
end
end end
describe 'Rails deprecations' do describe 'Rails deprecations' do

View File

@ -0,0 +1,24 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe DeployKeyPresenter do
let(:presenter) { described_class.new(deploy_key) }
describe '#humanized_error_message' do
subject { presenter.humanized_error_message }
before do
deploy_key.valid?
end
context 'when public key is unsupported' do
let(:deploy_key) { build(:deploy_key, key: 'a') }
it 'returns the custom error message' do
expect(subject).to eq('Deploy Key must be a <a target="_blank" rel="noopener noreferrer" ' \
'href="/help/user/ssh#supported-ssh-key-types">supported SSH public key.</a>')
end
end
end
end

View File

@ -0,0 +1,32 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe KeyPresenter do
let(:presenter) { described_class.new(key) }
describe '#humanized_error_message' do
subject { presenter.humanized_error_message }
before do
key.valid?
end
context 'when public key is unsupported' do
let(:key) { build(:key, key: 'a') }
it 'returns the custom error message' do
expect(subject).to eq('Key must be a <a target="_blank" rel="noopener noreferrer" ' \
'href="/help/user/ssh#supported-ssh-key-types">supported SSH public key.</a>')
end
end
context 'when key is expired' do
let(:key) { build(:key, :expired) }
it 'returns Active Record error message' do
expect(subject).to eq('Key has expired')
end
end
end
end

View File

@ -30,6 +30,8 @@ RSpec.describe ObjectStorage::CDN::GoogleCDN,
'2600:1900:4180:0000:0000:0000:0000:0000' | false '2600:1900:4180:0000:0000:0000:0000:0000' | false
'10.10.1.5' | false '10.10.1.5' | false
'fc00:0000:0000:0000:0000:0000:0000:0000' | false 'fc00:0000:0000:0000:0000:0000:0000:0000' | false
'127.0.0.1' | false
'169.254.0.0' | false
end end
with_them do with_them do