Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
a04f7f36d7
commit
811f549164
|
@ -70,11 +70,9 @@ class Projects::EnvironmentsController < Projects::ApplicationController
|
||||||
end
|
end
|
||||||
# rubocop: enable CodeReuse/ActiveRecord
|
# rubocop: enable CodeReuse/ActiveRecord
|
||||||
|
|
||||||
# rubocop: disable CodeReuse/ActiveRecord
|
|
||||||
def show
|
def show
|
||||||
@deployments = environment.deployments.order(id: :desc).page(params[:page])
|
@deployments = environment.deployments.ordered.page(params[:page])
|
||||||
end
|
end
|
||||||
# rubocop: enable CodeReuse/ActiveRecord
|
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@environment = project.environments.new
|
@environment = project.environments.new
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
class Projects::UsageQuotasController < Projects::ApplicationController
|
class Projects::UsageQuotasController < Projects::ApplicationController
|
||||||
before_action :authorize_admin_project!
|
before_action :authorize_admin_project!
|
||||||
before_action :verify_usage_quotas_enabled!
|
|
||||||
|
|
||||||
layout "project_settings"
|
layout "project_settings"
|
||||||
|
|
||||||
|
@ -20,10 +19,4 @@ class Projects::UsageQuotasController < Projects::ApplicationController
|
||||||
wiki_help_page_path: help_page_path('administration/wikis/index.md', anchor: 'reduce-wiki-repository-size')
|
wiki_help_page_path: help_page_path('administration/wikis/index.md', anchor: 'reduce-wiki-repository-size')
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def verify_usage_quotas_enabled!
|
|
||||||
render_404 unless Feature.enabled?(:project_storage_ui, project&.group, default_enabled: :yaml)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -54,6 +54,8 @@ class Deployment < ApplicationRecord
|
||||||
scope :finished_after, ->(date) { where('finished_at >= ?', date) }
|
scope :finished_after, ->(date) { where('finished_at >= ?', date) }
|
||||||
scope :finished_before, ->(date) { where('finished_at < ?', date) }
|
scope :finished_before, ->(date) { where('finished_at < ?', date) }
|
||||||
|
|
||||||
|
scope :ordered, -> { order(finished_at: :desc) }
|
||||||
|
|
||||||
FINISHED_STATUSES = %i[success failed canceled].freeze
|
FINISHED_STATUSES = %i[success failed canceled].freeze
|
||||||
|
|
||||||
state_machine :status, initial: :created do
|
state_machine :status, initial: :created do
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
.table-section.section-10{ role: 'gridcell' }
|
.table-section.section-10{ role: 'gridcell' }
|
||||||
.table-mobile-header{ role: 'rowheader' }= _("ID")
|
.table-mobile-header{ role: 'rowheader' }= _("ID")
|
||||||
%strong.table-mobile-content ##{deployment.iid}
|
%strong.table-mobile-content{ data: { testid: 'deployment-id' } } ##{deployment.iid}
|
||||||
|
|
||||||
.table-section.section-10{ role: 'gridcell' }
|
.table-section.section-10{ role: 'gridcell' }
|
||||||
.table-mobile-header{ role: 'rowheader' }= _("Triggerer")
|
.table-mobile-header{ role: 'rowheader' }= _("Triggerer")
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
---
|
|
||||||
name: project_storage_ui
|
|
||||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68289
|
|
||||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334889
|
|
||||||
milestone: '14.2'
|
|
||||||
type: development
|
|
||||||
group: group::utilization
|
|
||||||
default_enabled: false
|
|
|
@ -7,23 +7,21 @@ type: howto
|
||||||
|
|
||||||
# Geo database replication **(PREMIUM SELF)**
|
# Geo database replication **(PREMIUM SELF)**
|
||||||
|
|
||||||
NOTE:
|
This document describes the minimal required steps to replicate your primary
|
||||||
If your GitLab installation uses external (not managed by Omnibus) PostgreSQL
|
GitLab database to a secondary node's database. You may have to change some
|
||||||
instances, the Omnibus roles are unable to perform all necessary
|
values, based on attributes including your database's setup and size.
|
||||||
configuration steps. In this case,
|
|
||||||
[follow the Geo with external PostgreSQL instances document instead](external_database.md).
|
|
||||||
|
|
||||||
NOTE:
|
NOTE:
|
||||||
|
If your GitLab installation uses external (not managed by Omnibus GitLab)
|
||||||
|
PostgreSQL instances, the Omnibus roles cannot perform all necessary
|
||||||
|
configuration steps. In this case, use the [Geo with external PostgreSQL instances](external_database.md)
|
||||||
|
process instead.
|
||||||
|
|
||||||
The stages of the setup process must be completed in the documented order.
|
The stages of the setup process must be completed in the documented order.
|
||||||
Before attempting the steps in this stage, [complete all prior stages](../setup/index.md#using-omnibus-gitlab).
|
Before you attempt the steps in this stage, [complete all prior stages](../setup/index.md#using-omnibus-gitlab).
|
||||||
|
|
||||||
This document describes the minimal steps you have to take to replicate your
|
Be sure to read and review all of these steps before you execute them in your
|
||||||
**primary** GitLab database to a **secondary** node's database. You may have to
|
testing or production environments.
|
||||||
change some values, based on attributes including your database's setup and
|
|
||||||
size.
|
|
||||||
|
|
||||||
You are encouraged to first read through all the steps before executing them
|
|
||||||
in your testing/production environment.
|
|
||||||
|
|
||||||
## Single instance database replication
|
## Single instance database replication
|
||||||
|
|
||||||
|
@ -214,7 +212,7 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o
|
||||||
## - Prevents automatic upgrade of Postgres since it requires downtime of
|
## - Prevents automatic upgrade of Postgres since it requires downtime of
|
||||||
## streaming replication to Geo secondary sites
|
## streaming replication to Geo secondary sites
|
||||||
## - Enables standard single-node GitLab services like NGINX, Puma, Redis,
|
## - Enables standard single-node GitLab services like NGINX, Puma, Redis,
|
||||||
## Sidekiq, etc. If you are segregating services, then you will need to
|
## or Sidekiq. If you are segregating services, then you will need to
|
||||||
## explicitly disable unwanted services.
|
## explicitly disable unwanted services.
|
||||||
##
|
##
|
||||||
roles(['geo_primary_role'])
|
roles(['geo_primary_role'])
|
||||||
|
|
|
@ -240,6 +240,7 @@ requirements.
|
||||||
1. Working and clean code that is commented where needed.
|
1. Working and clean code that is commented where needed.
|
||||||
1. [Unit, integration, and system tests](../testing_guide/index.md) that all pass
|
1. [Unit, integration, and system tests](../testing_guide/index.md) that all pass
|
||||||
on the CI server.
|
on the CI server.
|
||||||
|
1. Peer member testing is optional but recommended when the risk of a change is high. This includes when the changes are [far-reaching](https://about.gitlab.com/handbook/engineering/development/#reducing-the-impact-of-far-reaching-work) or are for [components critical for security](../code_review.md#security).
|
||||||
1. Regressions and bugs are covered with tests that reduce the risk of the issue happening
|
1. Regressions and bugs are covered with tests that reduce the risk of the issue happening
|
||||||
again.
|
again.
|
||||||
1. [Performance guidelines](../merge_request_performance_guidelines.md) have been followed.
|
1. [Performance guidelines](../merge_request_performance_guidelines.md) have been followed.
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
type: reference, concepts
|
|
||||||
stage: Enablement
|
stage: Enablement
|
||||||
group: Alliances
|
group: Distribution
|
||||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
type: reference, concepts
|
|
||||||
stage: Enablement
|
stage: Enablement
|
||||||
group: Alliances
|
group: Distribution
|
||||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
---
|
---
|
||||||
stage: Enablement
|
stage: Enablement
|
||||||
group: Alliances
|
group: Distribution
|
||||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||||
comments: false
|
comments: false
|
||||||
description: Doing SRE for GitLab instances and runners on AWS.
|
description: Doing SRE for GitLab instances and runners on AWS.
|
||||||
type: index
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# GitLab Site Reliability Engineering for AWS **(FREE SELF)**
|
# GitLab Site Reliability Engineering for AWS **(FREE SELF)**
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
|
@ -62,6 +62,7 @@ Click on the service links to see further configuration instructions and details
|
||||||
| [Unify Circuit](unify_circuit.md) | Send notifications about project events to Unify Circuit. | **{dotted-circle}** No |
|
| [Unify Circuit](unify_circuit.md) | Send notifications about project events to Unify Circuit. | **{dotted-circle}** No |
|
||||||
| [Webex Teams](webex_teams.md) | Receive events notifications. | **{dotted-circle}** No |
|
| [Webex Teams](webex_teams.md) | Receive events notifications. | **{dotted-circle}** No |
|
||||||
| [YouTrack](youtrack.md) | Use YouTrack as the issue tracker. | **{dotted-circle}** No |
|
| [YouTrack](youtrack.md) | Use YouTrack as the issue tracker. | **{dotted-circle}** No |
|
||||||
|
| [ZenTao](zentao.md) | Use ZenTao as the issue tracker. | **{dotted-circle}** No |
|
||||||
|
|
||||||
## Push hooks limit
|
## Push hooks limit
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
stage: Ecosystem
|
||||||
|
group: Integrations
|
||||||
|
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||||
|
---
|
||||||
|
|
||||||
|
# ZenTao product integration **(PREMIUM)**
|
||||||
|
|
||||||
|
[ZenTao](https://www.zentao.net/) is a web-based project management platform.
|
||||||
|
|
||||||
|
## Configure ZenTao
|
||||||
|
|
||||||
|
This integration requires a ZenTao API secret key.
|
||||||
|
|
||||||
|
Complete these steps in ZenTao:
|
||||||
|
|
||||||
|
1. Go to your **Admin** page and select **Develop > Application**.
|
||||||
|
1. Select **Add Application**.
|
||||||
|
1. Under **Name** and **Code**, enter a name and a code for the new secret key.
|
||||||
|
1. Under **Account**, select an existing account name.
|
||||||
|
1. Select **Save**.
|
||||||
|
1. Copy the generated key to use in GitLab.
|
||||||
|
|
||||||
|
## Configure GitLab
|
||||||
|
|
||||||
|
Complete these steps in GitLab:
|
||||||
|
|
||||||
|
1. Go to your project and select **Settings > Integrations**.
|
||||||
|
1. Select **ZenTao**.
|
||||||
|
1. Turn on the **Active** toggle under **Enable Integration**.
|
||||||
|
1. Provide the ZenTao configuration information:
|
||||||
|
- **ZenTao Web URL**: The base URL of the ZenTao instance web interface you're linking to this GitLab project (for example, `example.zentao.net`).
|
||||||
|
- **ZenTao API URL** (optional): The base URL to the ZenTao instance API. Defaults to the Web URL value if not set.
|
||||||
|
- **ZenTao API token**: Use the key you generated when you [configured ZenTao](#configure-zentao).
|
||||||
|
- **ZenTao Product ID**: To display issues from a single ZenTao product in a given GitLab project. The Product ID can be found in the ZenTao product page under **Settings > Overview**.
|
||||||
|
|
||||||
|
![ZenTao settings page](img/zentao_product_id.png)
|
||||||
|
|
||||||
|
1. To verify the ZenTao connection is working, select **Test settings**.
|
||||||
|
1. Select **Save changes**.
|
|
@ -36,9 +36,8 @@ namespace to recalculate the storage.
|
||||||
|
|
||||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68898) project-level graph in GitLab 14.4 [with a flag](../administration/feature_flags.md) named `project_storage_ui`. Disabled by default.
|
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68898) project-level graph in GitLab 14.4 [with a flag](../administration/feature_flags.md) named `project_storage_ui`. Disabled by default.
|
||||||
> - Enabled on GitLab.com in GitLab 14.4.
|
> - Enabled on GitLab.com in GitLab 14.4.
|
||||||
|
> - Enabled on self-managed in GitLab 14.5.
|
||||||
FLAG:
|
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71270) in GitLab 14.5.
|
||||||
On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `project_storage_ui`. On GitLab.com, this feature is available.
|
|
||||||
|
|
||||||
The following storage usage statistics are available to an owner:
|
The following storage usage statistics are available to an owner:
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@ module Gitlab
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
PEM_REGEX = /\-+BEGIN CERTIFICATE\-+.+?\-+END CERTIFICATE\-+/m.freeze
|
|
||||||
SERVER_VERSION_FILE = 'GITALY_SERVER_VERSION'
|
SERVER_VERSION_FILE = 'GITALY_SERVER_VERSION'
|
||||||
MAXIMUM_GITALY_CALLS = 30
|
MAXIMUM_GITALY_CALLS = 30
|
||||||
CLIENT_NAME = (Gitlab::Runtime.sidekiq? ? 'gitlab-sidekiq' : 'gitlab-web').freeze
|
CLIENT_NAME = (Gitlab::Runtime.sidekiq? ? 'gitlab-sidekiq' : 'gitlab-web').freeze
|
||||||
|
@ -62,28 +61,9 @@ module Gitlab
|
||||||
end
|
end
|
||||||
private_class_method :channel_args
|
private_class_method :channel_args
|
||||||
|
|
||||||
def self.stub_cert_paths
|
|
||||||
cert_paths = Dir["#{OpenSSL::X509::DEFAULT_CERT_DIR}/*"]
|
|
||||||
cert_paths << OpenSSL::X509::DEFAULT_CERT_FILE if File.exist? OpenSSL::X509::DEFAULT_CERT_FILE
|
|
||||||
cert_paths
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.stub_certs
|
|
||||||
return @certs if @certs
|
|
||||||
|
|
||||||
@certs = stub_cert_paths.flat_map do |cert_file|
|
|
||||||
File.read(cert_file).scan(PEM_REGEX).map do |cert|
|
|
||||||
OpenSSL::X509::Certificate.new(cert).to_pem
|
|
||||||
rescue OpenSSL::OpenSSLError => e
|
|
||||||
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e, cert_file: cert_file)
|
|
||||||
nil
|
|
||||||
end.compact
|
|
||||||
end.uniq.join("\n")
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.stub_creds(storage)
|
def self.stub_creds(storage)
|
||||||
if URI(address(storage)).scheme == 'tls'
|
if URI(address(storage)).scheme == 'tls'
|
||||||
GRPC::Core::ChannelCredentials.new stub_certs
|
GRPC::Core::ChannelCredentials.new ::Gitlab::X509::Certificate.ca_certs_bundle
|
||||||
else
|
else
|
||||||
:this_channel_is_insecure
|
:this_channel_is_insecure
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,7 @@ module Gitlab
|
||||||
module Spamcheck
|
module Spamcheck
|
||||||
class Client
|
class Client
|
||||||
include ::Spam::SpamConstants
|
include ::Spam::SpamConstants
|
||||||
|
|
||||||
DEFAULT_TIMEOUT_SECS = 2
|
DEFAULT_TIMEOUT_SECS = 2
|
||||||
|
|
||||||
VERDICT_MAPPING = {
|
VERDICT_MAPPING = {
|
||||||
|
@ -27,12 +28,7 @@ module Gitlab
|
||||||
# connect with Spamcheck
|
# connect with Spamcheck
|
||||||
@endpoint_url = @endpoint_url.gsub(%r(^grpc:\/\/), '')
|
@endpoint_url = @endpoint_url.gsub(%r(^grpc:\/\/), '')
|
||||||
|
|
||||||
@creds =
|
@creds = stub_creds
|
||||||
if Rails.env.development? || Rails.env.test?
|
|
||||||
:this_channel_is_insecure
|
|
||||||
else
|
|
||||||
GRPC::Core::ChannelCredentials.new
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def issue_spam?(spam_issue:, user:, context: {})
|
def issue_spam?(spam_issue:, user:, context: {})
|
||||||
|
@ -98,6 +94,14 @@ module Gitlab
|
||||||
nanos: ar_timestamp.to_time.nsec)
|
nanos: ar_timestamp.to_time.nsec)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def stub_creds
|
||||||
|
if Rails.env.development? || Rails.env.test?
|
||||||
|
:this_channel_is_insecure
|
||||||
|
else
|
||||||
|
GRPC::Core::ChannelCredentials.new ::Gitlab::X509::Certificate.ca_certs_bundle
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def grpc_client
|
def grpc_client
|
||||||
@grpc_client ||= ::Spamcheck::SpamcheckService::Stub.new(@endpoint_url, @creds,
|
@grpc_client ||= ::Spamcheck::SpamcheckService::Stub.new(@endpoint_url, @creds,
|
||||||
interceptors: interceptors,
|
interceptors: interceptors,
|
||||||
|
|
|
@ -33,6 +33,26 @@ module Gitlab
|
||||||
from_strings(File.read(key_path), File.read(cert_path), ca_certs_string)
|
from_strings(File.read(key_path), File.read(cert_path), ca_certs_string)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns all top-level, readable files in the default CA cert directory
|
||||||
|
def self.ca_certs_paths
|
||||||
|
cert_paths = Dir["#{OpenSSL::X509::DEFAULT_CERT_DIR}/*"].select do |path|
|
||||||
|
!File.directory?(path) && File.readable?(path)
|
||||||
|
end
|
||||||
|
cert_paths << OpenSSL::X509::DEFAULT_CERT_FILE if File.exist? OpenSSL::X509::DEFAULT_CERT_FILE
|
||||||
|
cert_paths
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns a concatenated array of Strings, each being a PEM-coded CA certificate.
|
||||||
|
def self.ca_certs_bundle
|
||||||
|
return @certs if @certs
|
||||||
|
|
||||||
|
@certs = ca_certs_paths.flat_map do |cert_file|
|
||||||
|
load_ca_certs_bundle(File.read(cert_file))
|
||||||
|
rescue OpenSSL::OpenSSLError => e
|
||||||
|
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e, cert_file: cert_file)
|
||||||
|
end.uniq.join("\n")
|
||||||
|
end
|
||||||
|
|
||||||
# Returns an array of OpenSSL::X509::Certificate objects, empty array if none found
|
# Returns an array of OpenSSL::X509::Certificate objects, empty array if none found
|
||||||
#
|
#
|
||||||
# Ruby OpenSSL::X509::Certificate.new will only load the first
|
# Ruby OpenSSL::X509::Certificate.new will only load the first
|
||||||
|
|
|
@ -144,10 +144,6 @@ module Sidebars
|
||||||
end
|
end
|
||||||
|
|
||||||
def usage_quotas_menu_item
|
def usage_quotas_menu_item
|
||||||
unless Feature.enabled?(:project_storage_ui, context.project&.group, default_enabled: :yaml)
|
|
||||||
return ::Sidebars::NilMenuItem.new(item_id: :usage_quotas)
|
|
||||||
end
|
|
||||||
|
|
||||||
::Sidebars::MenuItem.new(
|
::Sidebars::MenuItem.new(
|
||||||
title: s_('UsageQuota|Usage Quotas'),
|
title: s_('UsageQuota|Usage Quotas'),
|
||||||
link: project_usage_quotas_path(context.project),
|
link: project_usage_quotas_path(context.project),
|
||||||
|
|
|
@ -1843,6 +1843,9 @@ msgstr ""
|
||||||
msgid "Activate Service Desk"
|
msgid "Activate Service Desk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Activated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -13860,6 +13863,9 @@ msgstr ""
|
||||||
msgid "Expires in %{expires_at}"
|
msgid "Expires in %{expires_at}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Expires on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Expires:"
|
msgid "Expires:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -19976,6 +19982,9 @@ msgstr ""
|
||||||
msgid "Last Seen"
|
msgid "Last Seen"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Last Sync"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Last Used"
|
msgid "Last Used"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -25484,6 +25493,9 @@ msgstr ""
|
||||||
msgid "Plain-text response to send to clients that hit a rate limit"
|
msgid "Plain-text response to send to clients that hit a rate limit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Plan"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Plan:"
|
msgid "Plan:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -28593,6 +28605,9 @@ msgstr ""
|
||||||
msgid "Renew subscription"
|
msgid "Renew subscription"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Renews"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Reopen"
|
msgid "Reopen"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -30044,6 +30059,9 @@ msgstr[1] ""
|
||||||
msgid "Searching by both author and message is currently not supported."
|
msgid "Searching by both author and message is currently not supported."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Seats"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
|
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -33026,18 +33044,12 @@ msgstr ""
|
||||||
msgid "Sunday"
|
msgid "Sunday"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Activate"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Activate cloud license"
|
msgid "SuperSonics|Activate cloud license"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Activate subscription"
|
msgid "SuperSonics|Activate subscription"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Activated on"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Activation code"
|
msgid "SuperSonics|Activation code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -33059,9 +33071,6 @@ msgstr ""
|
||||||
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
|
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Expires on"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Export license usage file"
|
msgid "SuperSonics|Export license usage file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -33074,12 +33083,6 @@ msgstr ""
|
||||||
msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the Subscription Agreement located at the %{linkStart}Terms of Service%{linkEnd}, unless otherwise agreed to in writing with GitLab."
|
msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the Subscription Agreement located at the %{linkStart}Terms of Service%{linkEnd}, unless otherwise agreed to in writing with GitLab."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|ID"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Last Sync"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
|
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -33095,30 +33098,15 @@ msgstr ""
|
||||||
msgid "SuperSonics|Paste your activation code"
|
msgid "SuperSonics|Paste your activation code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Plan"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Please agree to the Subscription Agreement"
|
msgid "SuperSonics|Please agree to the Subscription Agreement"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
|
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Renews"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Seats"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Start free trial"
|
msgid "SuperSonics|Start free trial"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Started"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Subscription"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Subscription details"
|
msgid "SuperSonics|Subscription details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -33146,9 +33134,6 @@ msgstr ""
|
||||||
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
|
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|Upload a license file"
|
msgid "SuperSonics|Upload a license file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -33161,9 +33146,6 @@ msgstr ""
|
||||||
msgid "SuperSonics|Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
|
msgid "SuperSonics|Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SuperSonics|Valid From"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SuperSonics|You can learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
|
msgid "SuperSonics|You can learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -37487,6 +37469,9 @@ msgstr ""
|
||||||
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
|
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Valid From"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Validate"
|
msgid "Validate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -39681,6 +39666,9 @@ msgstr ""
|
||||||
msgid "Zentao issues"
|
msgid "Zentao issues"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Zentao user"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "ZentaoIntegration|An error occurred while requesting data from the ZenTao service."
|
msgid "ZentaoIntegration|An error occurred while requesting data from the ZenTao service."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,6 @@ RSpec.describe 'Environment' do
|
||||||
let!(:action) { }
|
let!(:action) { }
|
||||||
let!(:cluster) { }
|
let!(:cluster) { }
|
||||||
|
|
||||||
before do
|
|
||||||
visit_environment(environment)
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with auto-stop' do
|
context 'with auto-stop' do
|
||||||
let!(:environment) { create(:environment, :will_auto_stop, name: 'staging', project: project) }
|
let!(:environment) { create(:environment, :will_auto_stop, name: 'staging', project: project) }
|
||||||
|
|
||||||
|
@ -52,12 +48,20 @@ RSpec.describe 'Environment' do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'without deployments' do
|
context 'without deployments' do
|
||||||
|
before do
|
||||||
|
visit_environment(environment)
|
||||||
|
end
|
||||||
|
|
||||||
it 'does not show deployments' do
|
it 'does not show deployments' do
|
||||||
expect(page).to have_content('You don\'t have any deployments right now.')
|
expect(page).to have_content('You don\'t have any deployments right now.')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with deployments' do
|
context 'with deployments' do
|
||||||
|
before do
|
||||||
|
visit_environment(environment)
|
||||||
|
end
|
||||||
|
|
||||||
context 'when there is no related deployable' do
|
context 'when there is no related deployable' do
|
||||||
let(:deployment) do
|
let(:deployment) do
|
||||||
create(:deployment, :success, environment: environment, deployable: nil)
|
create(:deployment, :success, environment: environment, deployable: nil)
|
||||||
|
@ -108,6 +112,26 @@ RSpec.describe 'Environment' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with many deployments' do
|
||||||
|
let(:pipeline) { create(:ci_pipeline, project: project) }
|
||||||
|
let(:build) { create(:ci_build, pipeline: pipeline) }
|
||||||
|
|
||||||
|
let!(:second) { create(:deployment, environment: environment, deployable: build, status: :success, finished_at: Time.current) }
|
||||||
|
let!(:first) { create(:deployment, environment: environment, deployable: build, status: :running) }
|
||||||
|
let!(:last) { create(:deployment, environment: environment, deployable: build, status: :success, finished_at: 2.days.ago) }
|
||||||
|
let!(:third) { create(:deployment, environment: environment, deployable: build, status: :canceled, finished_at: 1.day.ago) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
visit_environment(environment)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'shows all of them in ordered way' do
|
||||||
|
ids = find_all('[data-testid="deployment-id"]').map { |e| e.text }
|
||||||
|
expected_ordered_ids = [first, second, third, last].map { |d| "##{d.iid}" }
|
||||||
|
expect(ids).to eq(expected_ordered_ids)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'with related deployable present' do
|
context 'with related deployable present' do
|
||||||
let(:pipeline) { create(:ci_pipeline, project: project) }
|
let(:pipeline) { create(:ci_pipeline, project: project) }
|
||||||
let(:build) { create(:ci_build, pipeline: pipeline) }
|
let(:build) { create(:ci_build, pipeline: pipeline) }
|
||||||
|
@ -116,6 +140,10 @@ RSpec.describe 'Environment' do
|
||||||
create(:deployment, :success, environment: environment, deployable: build)
|
create(:deployment, :success, environment: environment, deployable: build)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
visit_environment(environment)
|
||||||
|
end
|
||||||
|
|
||||||
it 'does show build name' do
|
it 'does show build name' do
|
||||||
expect(page).to have_link("#{build.name} (##{build.id})")
|
expect(page).to have_link("#{build.name} (##{build.id})")
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,14 +5,6 @@ require 'spec_helper'
|
||||||
# We stub Gitaly in `spec/support/gitaly.rb` for other tests. We don't want
|
# We stub Gitaly in `spec/support/gitaly.rb` for other tests. We don't want
|
||||||
# those stubs while testing the GitalyClient itself.
|
# those stubs while testing the GitalyClient itself.
|
||||||
RSpec.describe Gitlab::GitalyClient do
|
RSpec.describe Gitlab::GitalyClient do
|
||||||
let(:sample_cert) { Rails.root.join('spec/fixtures/clusters/sample_cert.pem').to_s }
|
|
||||||
|
|
||||||
before do
|
|
||||||
allow(described_class)
|
|
||||||
.to receive(:stub_cert_paths)
|
|
||||||
.and_return([sample_cert])
|
|
||||||
end
|
|
||||||
|
|
||||||
def stub_repos_storages(address)
|
def stub_repos_storages(address)
|
||||||
allow(Gitlab.config.repositories).to receive(:storages).and_return({
|
allow(Gitlab.config.repositories).to receive(:storages).and_return({
|
||||||
'default' => { 'gitaly_address' => address }
|
'default' => { 'gitaly_address' => address }
|
||||||
|
@ -142,21 +134,6 @@ RSpec.describe Gitlab::GitalyClient do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '.stub_certs' do
|
|
||||||
it 'skips certificates if OpenSSLError is raised and report it' do
|
|
||||||
expect(Gitlab::ErrorTracking)
|
|
||||||
.to receive(:track_and_raise_for_dev_exception)
|
|
||||||
.with(
|
|
||||||
a_kind_of(OpenSSL::X509::CertificateError),
|
|
||||||
cert_file: a_kind_of(String)).at_least(:once)
|
|
||||||
|
|
||||||
expect(OpenSSL::X509::Certificate)
|
|
||||||
.to receive(:new)
|
|
||||||
.and_raise(OpenSSL::X509::CertificateError).at_least(:once)
|
|
||||||
|
|
||||||
expect(described_class.stub_certs).to be_a(String)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
describe '.stub_creds' do
|
describe '.stub_creds' do
|
||||||
it 'returns :this_channel_is_insecure if unix' do
|
it 'returns :this_channel_is_insecure if unix' do
|
||||||
address = 'unix:/tmp/gitaly.sock'
|
address = 'unix:/tmp/gitaly.sock'
|
||||||
|
|
|
@ -5,6 +5,9 @@ require 'spec_helper'
|
||||||
RSpec.describe Gitlab::X509::Certificate do
|
RSpec.describe Gitlab::X509::Certificate do
|
||||||
include SmimeHelper
|
include SmimeHelper
|
||||||
|
|
||||||
|
let(:sample_ca_certs_path) { Rails.root.join('spec/fixtures/clusters').to_s }
|
||||||
|
let(:sample_cert) { Rails.root.join('spec/fixtures/x509_certificate.crt').to_s }
|
||||||
|
|
||||||
# cert generation is an expensive operation and they are used read-only,
|
# cert generation is an expensive operation and they are used read-only,
|
||||||
# so we share them as instance variables in all tests
|
# so we share them as instance variables in all tests
|
||||||
before :context do
|
before :context do
|
||||||
|
@ -13,6 +16,11 @@ RSpec.describe Gitlab::X509::Certificate do
|
||||||
@cert = generate_cert(signer_ca: @intermediate_ca)
|
@cert = generate_cert(signer_ca: @intermediate_ca)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
stub_const("OpenSSL::X509::DEFAULT_CERT_DIR", sample_ca_certs_path)
|
||||||
|
stub_const("OpenSSL::X509::DEFAULT_CERT_FILE", sample_cert)
|
||||||
|
end
|
||||||
|
|
||||||
describe 'testing environment setup' do
|
describe 'testing environment setup' do
|
||||||
describe 'generate_root' do
|
describe 'generate_root' do
|
||||||
subject { @root_ca }
|
subject { @root_ca }
|
||||||
|
@ -103,6 +111,43 @@ RSpec.describe Gitlab::X509::Certificate do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '.ca_certs_paths' do
|
||||||
|
it 'returns all files specified by OpenSSL defaults' do
|
||||||
|
cert_paths = Dir["#{OpenSSL::X509::DEFAULT_CERT_DIR}/*"]
|
||||||
|
|
||||||
|
expect(described_class.ca_certs_paths).to match_array(cert_paths + [sample_cert])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.ca_certs_bundle' do
|
||||||
|
it 'skips certificates if OpenSSLError is raised and report it' do
|
||||||
|
expect(Gitlab::ErrorTracking)
|
||||||
|
.to receive(:track_and_raise_for_dev_exception)
|
||||||
|
.with(
|
||||||
|
a_kind_of(OpenSSL::X509::CertificateError),
|
||||||
|
cert_file: a_kind_of(String)).at_least(:once)
|
||||||
|
|
||||||
|
expect(OpenSSL::X509::Certificate)
|
||||||
|
.to receive(:new)
|
||||||
|
.and_raise(OpenSSL::X509::CertificateError).at_least(:once)
|
||||||
|
|
||||||
|
expect(described_class.ca_certs_bundle).to be_a(String)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns a list certificates as strings' do
|
||||||
|
expect(described_class.ca_certs_bundle).to be_a(String)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.load_ca_certs_bundle' do
|
||||||
|
it 'loads a PEM-encoded certificate bundle into an OpenSSL::X509::Certificate array' do
|
||||||
|
ca_certs_string = described_class.ca_certs_bundle
|
||||||
|
ca_certs = described_class.load_ca_certs_bundle(ca_certs_string)
|
||||||
|
|
||||||
|
expect(ca_certs).to all(be_an(OpenSSL::X509::Certificate))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def common_cert_tests(parsed_cert, cert, signer_ca, with_ca_certs: nil)
|
def common_cert_tests(parsed_cert, cert, signer_ca, with_ca_certs: nil)
|
||||||
expect(parsed_cert.cert).to be_a(OpenSSL::X509::Certificate)
|
expect(parsed_cert.cert).to be_a(OpenSSL::X509::Certificate)
|
||||||
expect(parsed_cert.cert.subject).to eq(cert[:cert].subject)
|
expect(parsed_cert.cert.subject).to eq(cert[:cert].subject)
|
||||||
|
|
|
@ -162,24 +162,10 @@ RSpec.describe Sidebars::Projects::Menus::SettingsMenu do
|
||||||
describe 'Usage Quotas' do
|
describe 'Usage Quotas' do
|
||||||
let(:item_id) { :usage_quotas }
|
let(:item_id) { :usage_quotas }
|
||||||
|
|
||||||
describe 'with project_storage_ui feature flag enabled' do
|
specify { is_expected.not_to be_nil }
|
||||||
before do
|
|
||||||
stub_feature_flags(project_storage_ui: true)
|
|
||||||
end
|
|
||||||
|
|
||||||
specify { is_expected.not_to be_nil }
|
describe 'when the user does not have access' do
|
||||||
|
let(:user) { nil }
|
||||||
describe 'when the user does not have access' do
|
|
||||||
let(:user) { nil }
|
|
||||||
|
|
||||||
specify { is_expected.to be_nil }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'with project_storage_ui feature flag disabled' do
|
|
||||||
before do
|
|
||||||
stub_feature_flags(project_storage_ui: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
specify { is_expected.to be_nil }
|
specify { is_expected.to be_nil }
|
||||||
end
|
end
|
||||||
|
|
|
@ -456,6 +456,17 @@ RSpec.describe Deployment do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '.ordered' do
|
||||||
|
let!(:deployment1) { create(:deployment, status: :running) }
|
||||||
|
let!(:deployment2) { create(:deployment, status: :success, finished_at: Time.current) }
|
||||||
|
let!(:deployment3) { create(:deployment, status: :canceled, finished_at: 1.day.ago) }
|
||||||
|
let!(:deployment4) { create(:deployment, status: :success, finished_at: 2.days.ago) }
|
||||||
|
|
||||||
|
it 'sorts by finished at' do
|
||||||
|
expect(described_class.ordered).to eq([deployment1, deployment2, deployment3, deployment4])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'visible' do
|
describe 'visible' do
|
||||||
subject { described_class.visible }
|
subject { described_class.visible }
|
||||||
|
|
||||||
|
|
|
@ -22,40 +22,26 @@ RSpec.describe 'Project Usage Quotas' do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET /:namespace/:project/usage_quotas' do
|
describe 'GET /:namespace/:project/usage_quotas' do
|
||||||
context 'with project_storage_ui feature flag enabled' do
|
it 'renders usage quotas path' do
|
||||||
before do
|
mock_storage_app_data = {
|
||||||
stub_feature_flags(project_storage_ui: true)
|
project_path: project.full_path,
|
||||||
end
|
usage_quotas_help_page_path: help_page_path('user/usage_quotas'),
|
||||||
|
build_artifacts_help_page_path: help_page_path('ci/pipelines/job_artifacts', anchor: 'when-job-artifacts-are-deleted'),
|
||||||
|
packages_help_page_path: help_page_path('user/packages/package_registry/index.md', anchor: 'delete-a-package'),
|
||||||
|
repository_help_page_path: help_page_path('user/project/repository/reducing_the_repo_size_using_git'),
|
||||||
|
snippets_help_page_path: help_page_path('user/snippets', anchor: 'reduce-snippets-repository-size'),
|
||||||
|
wiki_help_page_path: help_page_path('administration/wikis/index.md', anchor: 'reduce-wiki-repository-size')
|
||||||
|
}
|
||||||
|
get project_usage_quotas_path(project)
|
||||||
|
|
||||||
it 'renders usage quotas path' do
|
expect(response).to have_gitlab_http_status(:ok)
|
||||||
mock_storage_app_data = {
|
expect(response.body).to include(project_usage_quotas_path(project))
|
||||||
project_path: project.full_path,
|
expect(assigns[:storage_app_data]).to eq(mock_storage_app_data)
|
||||||
usage_quotas_help_page_path: help_page_path('user/usage_quotas'),
|
expect(response.body).to include("Usage of project resources across the <strong>#{project.name}</strong> project")
|
||||||
build_artifacts_help_page_path: help_page_path('ci/pipelines/job_artifacts', anchor: 'when-job-artifacts-are-deleted'),
|
|
||||||
packages_help_page_path: help_page_path('user/packages/package_registry/index.md', anchor: 'delete-a-package'),
|
|
||||||
repository_help_page_path: help_page_path('user/project/repository/reducing_the_repo_size_using_git'),
|
|
||||||
snippets_help_page_path: help_page_path('user/snippets', anchor: 'reduce-snippets-repository-size'),
|
|
||||||
wiki_help_page_path: help_page_path('administration/wikis/index.md', anchor: 'reduce-wiki-repository-size')
|
|
||||||
}
|
|
||||||
get project_usage_quotas_path(project)
|
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(:ok)
|
|
||||||
expect(response.body).to include(project_usage_quotas_path(project))
|
|
||||||
expect(assigns[:storage_app_data]).to eq(mock_storage_app_data)
|
|
||||||
expect(response.body).to include("Usage of project resources across the <strong>#{project.name}</strong> project")
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'renders :not_found for user without permission' do
|
|
||||||
let(:role) { :developer }
|
|
||||||
|
|
||||||
it_behaves_like 'response with 404 status'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with project_storage_ui feature flag disabled' do
|
context 'renders :not_found for user without permission' do
|
||||||
before do
|
let(:role) { :developer }
|
||||||
stub_feature_flags(project_storage_ui: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
it_behaves_like 'response with 404 status'
|
it_behaves_like 'response with 404 status'
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
- "./ee/spec/features/ci/ci_minutes_spec.rb"
|
|
||||||
- "./ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb"
|
- "./ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb"
|
||||||
- "./ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb"
|
- "./ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb"
|
||||||
- "./ee/spec/finders/ee/namespaces/projects_finder_spec.rb"
|
- "./ee/spec/finders/ee/namespaces/projects_finder_spec.rb"
|
||||||
|
|
|
@ -119,7 +119,7 @@ RSpec.shared_context 'project navbar structure' do
|
||||||
_('Repository'),
|
_('Repository'),
|
||||||
_('CI/CD'),
|
_('CI/CD'),
|
||||||
_('Monitor'),
|
_('Monitor'),
|
||||||
(s_('UsageQuota|Usage Quotas') if Feature.enabled?(:project_storage_ui, default_enabled: :yaml))
|
s_('UsageQuota|Usage Quotas')
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
].compact
|
].compact
|
||||||
|
|
|
@ -987,28 +987,10 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'Usage Quotas' do
|
describe 'Usage Quotas' do
|
||||||
context 'with project_storage_ui feature flag enabled' do
|
it 'has a link to Usage Quotas' do
|
||||||
before do
|
render
|
||||||
stub_feature_flags(project_storage_ui: true)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'has a link to Usage Quotas' do
|
expect(rendered).to have_link('Usage Quotas', href: project_usage_quotas_path(project))
|
||||||
render
|
|
||||||
|
|
||||||
expect(rendered).to have_link('Usage Quotas', href: project_usage_quotas_path(project))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with project_storage_ui feature flag disabled' do
|
|
||||||
before do
|
|
||||||
stub_feature_flags(project_storage_ui: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'does not have a link to Usage Quotas' do
|
|
||||||
render
|
|
||||||
|
|
||||||
expect(rendered).not_to have_link('Usage Quotas', href: project_usage_quotas_path(project))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue