Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-05-03 03:10:17 +00:00
parent d489dd79cf
commit bb3ea5f45e
39 changed files with 454 additions and 522 deletions

View File

@ -690,6 +690,7 @@ Gitlab/NamespacedClass:
- 'scripts/**/*' - 'scripts/**/*'
- 'spec/migrations/**/*.rb' - 'spec/migrations/**/*.rb'
- 'app/experiments/**/*_experiment.rb' - 'app/experiments/**/*_experiment.rb'
- 'ee/app/experiments/**/*_experiment.rb'
Lint/HashCompareByIdentity: Lint/HashCompareByIdentity:
Enabled: true Enabled: true

View File

@ -1 +1 @@
c47bb5beba81703b7c2bb2b3d1c138cb667fa80c 07557c28273b27d750771e2044179730f1cfac16

View File

@ -121,6 +121,10 @@
@include btn-color($white, $border-color, $white-normal, $border-white-normal, $white-dark, $border-white-normal, $gl-text-color); @include btn-color($white, $border-color, $white-normal, $border-white-normal, $white-dark, $border-white-normal, $gl-text-color);
} }
@mixin btn-purple {
@include btn-color($purple-700, $purple-800, $purple-800, $purple-900, $purple-900, $purple-950, $white);
}
@mixin btn-with-margin { @mixin btn-with-margin {
margin-left: $btn-side-margin; margin-left: $btn-side-margin;
float: left; float: left;
@ -194,6 +198,10 @@
@include btn-red; @include btn-red;
} }
&.btn-purple {
@include btn-purple;
}
&.btn-grouped { &.btn-grouped {
@include btn-with-margin; @include btn-with-margin;
} }

View File

@ -366,3 +366,30 @@ to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1709
/* stylelint-disable property-no-vendor-prefix */ /* stylelint-disable property-no-vendor-prefix */
-webkit-backdrop-filter: blur(2px); // still required by Safari -webkit-backdrop-filter: blur(2px); // still required by Safari
} }
/*
* The below style will be moved to @gitlab/ui by
* https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1792
*/
.gl-text-purple-800 {
color: $purple-800;
}
.gl-bg-theme-indigo-800 {
background-color: $theme-indigo-800;
}
.gl-border-indigo-700 {
border-color: $theme-indigo-700;
}
.gl-border-gray-75 {
border-color: $gl-text-color-quaternary;
}
.gl-min-h-8 {
min-height: $gl-spacing-scale-8;
}
/* End gitlab-ui#1751 */

View File

@ -14,7 +14,7 @@ module Projects
prepend_before_action :repository, :project_without_auth, only: [:notify] prepend_before_action :repository, :project_without_auth, only: [:notify]
before_action :authorize_read_prometheus_alerts!, except: [:notify] before_action :authorize_read_prometheus_alerts!, except: [:notify]
before_action :alert, only: [:update, :show, :destroy, :metrics_dashboard] before_action :alert, only: [:show, :metrics_dashboard]
feature_category :incident_management feature_category :incident_management
urgency :low urgency :low
@ -38,68 +38,13 @@ module Projects
end end
end end
def create
@alert = create_service.execute
if @alert.persisted?
schedule_prometheus_update!
render json: serialize_as_json(@alert)
else
head :bad_request
end
end
def update
if update_service.execute(alert)
schedule_prometheus_update!
render json: serialize_as_json(alert)
else
head :bad_request
end
end
def destroy
if destroy_service.execute(alert)
schedule_prometheus_update!
head :ok
else
head :bad_request
end
end
private private
def alerts_params
params.permit(:operator, :threshold, :environment_id, :prometheus_metric_id, :runbook_url)
end
def notify_service def notify_service
Projects::Prometheus::Alerts::NotifyService Projects::Prometheus::Alerts::NotifyService
.new(project, params.permit!) .new(project, params.permit!)
end end
def create_service
Projects::Prometheus::Alerts::CreateService
.new(project: project, current_user: current_user, params: alerts_params)
end
def update_service
Projects::Prometheus::Alerts::UpdateService
.new(project: project, current_user: current_user, params: alerts_params)
end
def destroy_service
Projects::Prometheus::Alerts::DestroyService
.new(project: project, current_user: current_user, params: nil)
end
def schedule_prometheus_update!
::Clusters::Applications::ScheduleUpdateService.new(application, project).execute
end
def serialize_as_json(alert_obj) def serialize_as_json(alert_obj)
serializer.represent(alert_obj) serializer.represent(alert_obj)
end end
@ -124,10 +69,6 @@ module Projects
}.reverse_merge(opts)) }.reverse_merge(opts))
end end
def application
@application ||= alert.environment.cluster_prometheus_adapter
end
def extract_alert_manager_token(request) def extract_alert_manager_token(request)
Doorkeeper::OAuth::Token.from_bearer_authorization(request) Doorkeeper::OAuth::Token.from_bearer_authorization(request)
end end
@ -137,10 +78,6 @@ module Projects
.find_by_full_path("#{params[:namespace_id]}/#{params[:project_id]}") .find_by_full_path("#{params[:namespace_id]}/#{params[:project_id]}")
end end
def prometheus_alerts
project.prometheus_alerts.for_environment(params[:environment_id])
end
def metrics_dashboard_params def metrics_dashboard_params
{ {
embedded: true, embedded: true,

View File

@ -21,6 +21,8 @@ module Import
if project.persisted? if project.persisted?
success(project) success(project)
elsif project.errors[:import_source_disabled].present?
error(project.errors[:import_source_disabled], :forbidden)
else else
log_and_return_error(project_save_error(project), :unprocessable_entity) log_and_return_error(project_save_error(project), :unprocessable_entity)
end end

View File

@ -25,6 +25,8 @@ module Import
if project.persisted? if project.persisted?
success(project) success(project)
elsif project.errors[:import_source_disabled].present?
error(project.errors[:import_source_disabled], :forbidden)
else else
error(project_save_error(project), :unprocessable_entity) error(project_save_error(project), :unprocessable_entity)
end end

View File

@ -4,6 +4,9 @@ module Projects
class CreateService < BaseService class CreateService < BaseService
include ValidatesClassificationLabel include ValidatesClassificationLabel
ImportSourceDisabledError = Class.new(StandardError)
INTERNAL_IMPORT_SOURCES = %w[bare_repository gitlab_custom_project_template gitlab_project_migration].freeze
def initialize(user, params) def initialize(user, params)
@current_user = user @current_user = user
@params = params.dup @params = params.dup
@ -25,6 +28,8 @@ module Projects
@project = Project.new(params) @project = Project.new(params)
validate_import_source_enabled!
@project.visibility_level = @project.group.visibility_level unless @project.visibility_level_allowed_by_group? @project.visibility_level = @project.group.visibility_level unless @project.visibility_level_allowed_by_group?
# If a project is newly created it should have shared runners settings # If a project is newly created it should have shared runners settings
@ -77,6 +82,9 @@ module Projects
rescue ActiveRecord::RecordInvalid => e rescue ActiveRecord::RecordInvalid => e
message = "Unable to save #{e.inspect}: #{e.record.errors.full_messages.join(", ")}" message = "Unable to save #{e.inspect}: #{e.record.errors.full_messages.join(", ")}"
fail(error: message) fail(error: message)
rescue ImportSourceDisabledError => e
@project.errors.add(:import_source_disabled, e.message) if @project
fail(error: e.message)
rescue StandardError => e rescue StandardError => e
@project.errors.add(:base, e.message) if @project @project.errors.add(:base, e.message) if @project
fail(error: e.message) fail(error: e.message)
@ -238,6 +246,18 @@ module Projects
private private
def validate_import_source_enabled!
return unless @params[:import_type]
import_type = @params[:import_type].to_s
return if INTERNAL_IMPORT_SOURCES.include?(import_type)
unless ::Gitlab::CurrentSettings.import_sources&.include?(import_type)
raise ImportSourceDisabledError, "#{import_type} import source is disabled"
end
end
def parent_namespace def parent_namespace
@parent_namespace ||= Namespace.find_by_id(@params[:namespace_id]) || current_user.namespace @parent_namespace ||= Namespace.find_by_id(@params[:namespace_id]) || current_user.namespace
end end

View File

@ -1,17 +0,0 @@
# frozen_string_literal: true
module Projects
module Prometheus
module Alerts
module AlertParams
def alert_params
return params if params[:operator].blank?
params.merge(
operator: PrometheusAlert.operator_to_enum(params[:operator])
)
end
end
end
end
end

View File

@ -1,15 +0,0 @@
# frozen_string_literal: true
module Projects
module Prometheus
module Alerts
class CreateService < BaseProjectService
include AlertParams
def execute
project.prometheus_alerts.create(alert_params)
end
end
end
end
end

View File

@ -1,13 +0,0 @@
# frozen_string_literal: true
module Projects
module Prometheus
module Alerts
class DestroyService < BaseProjectService
def execute(alert)
alert.destroy
end
end
end
end
end

View File

@ -1,15 +0,0 @@
# frozen_string_literal: true
module Projects
module Prometheus
module Alerts
class UpdateService < BaseProjectService
include AlertParams
def execute(alert)
alert.update(alert_params)
end
end
end
end
end

View File

@ -517,7 +517,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end end
namespace :prometheus do namespace :prometheus do
resources :alerts, constraints: { id: /\d+/ }, only: [:index, :create, :show, :update, :destroy] do # rubocop: disable Cop/PutProjectRoutesUnderScope resources :alerts, constraints: { id: /\d+/ }, only: [:index, :show] do # rubocop: disable Cop/PutProjectRoutesUnderScope
post :notify, on: :collection # rubocop:todo Cop/PutProjectRoutesUnderScope post :notify, on: :collection # rubocop:todo Cop/PutProjectRoutesUnderScope
member do member do
get :metrics_dashboard # rubocop:todo Cop/PutProjectRoutesUnderScope get :metrics_dashboard # rubocop:todo Cop/PutProjectRoutesUnderScope

View File

@ -16,7 +16,7 @@
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles # For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: existence extends: existence
message: 'This introduced-in line is not formatted correctly.' message: 'This introduced-in line is not formatted correctly.'
link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#version-text-in-the-version-history link: https://docs.gitlab.com/ee/development/documentation/styleguide/versions.html
level: error level: error
scope: raw scope: raw
raw: raw:

View File

@ -36,6 +36,7 @@ Example response:
"slug": "review-fix-foo-dfjre3", "slug": "review-fix-foo-dfjre3",
"external_url": "https://review-fix-foo-dfjre3.gitlab.example.com", "external_url": "https://review-fix-foo-dfjre3.gitlab.example.com",
"state": "available", "state": "available",
"tier": "development",
"created_at": "2019-05-25T18:55:13.252Z", "created_at": "2019-05-25T18:55:13.252Z",
"updated_at": "2019-05-27T18:55:13.252Z", "updated_at": "2019-05-27T18:55:13.252Z",
"enable_advanced_logs_querying": false, "enable_advanced_logs_querying": false,
@ -147,6 +148,7 @@ Example of response
"slug": "review-fix-foo-dfjre3", "slug": "review-fix-foo-dfjre3",
"external_url": "https://review-fix-foo-dfjre3.gitlab.example.com", "external_url": "https://review-fix-foo-dfjre3.gitlab.example.com",
"state": "available", "state": "available",
"tier": "development",
"created_at": "2019-05-25T18:55:13.252Z", "created_at": "2019-05-25T18:55:13.252Z",
"updated_at": "2019-05-27T18:55:13.252Z", "updated_at": "2019-05-27T18:55:13.252Z",
"enable_advanced_logs_querying": false, "enable_advanced_logs_querying": false,
@ -249,6 +251,7 @@ POST /projects/:id/environments
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the environment | | `name` | string | yes | The name of the environment |
| `external_url` | string | no | Place to link to for this environment | | `external_url` | string | no | Place to link to for this environment |
| `tier` | string | no | The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other` |
```shell ```shell
curl --data "name=deploy&external_url=https://deploy.gitlab.example.com" \ curl --data "name=deploy&external_url=https://deploy.gitlab.example.com" \
@ -264,6 +267,7 @@ Example response:
"slug": "deploy", "slug": "deploy",
"external_url": "https://deploy.gitlab.example.com", "external_url": "https://deploy.gitlab.example.com",
"state": "available", "state": "available",
"tier": "production",
"created_at": "2019-05-25T18:55:13.252Z", "created_at": "2019-05-25T18:55:13.252Z",
"updated_at": "2019-05-27T18:55:13.252Z" "updated_at": "2019-05-27T18:55:13.252Z"
} }
@ -285,6 +289,7 @@ PUT /projects/:id/environments/:environments_id
| `environment_id` | integer | yes | The ID of the environment | | `environment_id` | integer | yes | The ID of the environment |
| `name` | string | no | [Deprecated and will be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/338897) | | `name` | string | no | [Deprecated and will be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/338897) |
| `external_url` | string | no | The new `external_url` | | `external_url` | string | no | The new `external_url` |
| `tier` | string | no | The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other` |
```shell ```shell
curl --request PUT --data "name=staging&external_url=https://staging.gitlab.example.com" \ curl --request PUT --data "name=staging&external_url=https://staging.gitlab.example.com" \
@ -300,6 +305,7 @@ Example response:
"slug": "staging", "slug": "staging",
"external_url": "https://staging.gitlab.example.com", "external_url": "https://staging.gitlab.example.com",
"state": "available", "state": "available",
"tier": "staging",
"created_at": "2019-05-25T18:55:13.252Z", "created_at": "2019-05-25T18:55:13.252Z",
"updated_at": "2019-05-27T18:55:13.252Z" "updated_at": "2019-05-27T18:55:13.252Z"
} }

View File

@ -13,7 +13,7 @@ Generally, if a style is not covered by [existing Rubocop rules or style guides]
Before adding a new cop to enforce a given style, make sure to discuss it with your team. Before adding a new cop to enforce a given style, make sure to discuss it with your team.
When the style is approved by a backend EM or by a BE staff eng, add a new section to this page to When the style is approved by a backend EM or by a BE staff eng, add a new section to this page to
document the new rule. For every new guideline, add it in a new section and link the discussion from the section's document the new rule. For every new guideline, add it in a new section and link the discussion from the section's
[version history note](../documentation/versions.md#version-text-in-the-version-history) [version history note](../documentation/versions.md#add-a-version-history-bullet)
to provide context and serve as a reference. to provide context and serve as a reference.
Just because something is listed here does not mean it cannot be reopened for discussion. Just because something is listed here does not mean it cannot be reopened for discussion.

View File

@ -75,7 +75,7 @@ Example response:
``` ```
```` ````
Adjust the [version history note accordingly](versions.md#version-text-in-the-version-history) Adjust the [version history note accordingly](versions.md#add-a-version-history-bullet)
to describe the GitLab release that introduced the API call. to describe the GitLab release that introduced the API call.
## Method description ## Method description

View File

@ -727,7 +727,6 @@ We include guidance for links in these categories:
for authoritative sources. for authoritative sources.
- When to use [links requiring permissions](#links-requiring-permissions). - When to use [links requiring permissions](#links-requiring-permissions).
- How to set up a [link to a video](#link-to-video). - How to set up a [link to a video](#link-to-video).
- How to [include links with version text](../versions.md#where-to-put-version-text).
- How to [link to specific lines of code](#link-to-specific-lines-of-code) - How to [link to specific lines of code](#link-to-specific-lines-of-code)
### Basic link criteria ### Basic link criteria

View File

@ -7,49 +7,32 @@ description: 'Writing styles, markup, formatting, and other standards for GitLab
# Documenting product versions # Documenting product versions
GitLab product documentation pages (not including [Contributor and Development](../../index.md) The GitLab product documentation includes version-specific information,
pages in the `/development` directory) can include version information to help including when features were introduced and when they were updated or removed.
users be aware of recent improvements or additions.
The GitLab Technical Writing team determines which versions of ## View older documentation versions
documentation to display on this site based on the GitLab
[Statement of Support](https://about.gitlab.com/support/statement-of-support.html#version-support).
## View older GitLab documentation versions Previous versions of the documentation are available on `docs.gitlab.com`.
To view a previous version, select the **Versions** button in the top right.
Older versions of GitLab may no longer have documentation available from `docs.gitlab.com`. To view versions that are not available on `docs.gitlab.com`:
If documentation for your version is no longer available from `docs.gitlab.com`, you can still view a
tagged and released set of documentation for your installed version:
- In the [documentation archives](https://docs.gitlab.com/archives/). - View the [documentation archives](https://docs.gitlab.com/archives/).
- At the `/help` URL of your GitLab instance. - Go to the GitLab repository and select the version-specific branch. For example,
- In the documentation repository based on the respective branch (for example, the [13.2 branch](https://gitlab.com/gitlab-org/gitlab/-/tree/13-2-stable-ee/doc) has the
the [13.2 branch](https://gitlab.com/gitlab-org/gitlab/-/tree/13-2-stable-ee/doc)). documentation for GitLab 13.2.
## Where to put version text ## Documenting version-specific features
When a feature is added or updated, you can include its version information When a feature is added or updated, you can include its version information
either as a **Version history** item or as an inline text reference. either as a **Version history** bullet or as an inline text reference.
### Version text in the **Version History** You do not need to add version information on the pages in the `/development` directory.
If all content in a section is related, add version text after the header for ### Add a **Version history** bullet
the section. The version information must:
- Be surrounded by blank lines. If all content in a topic is related, add a version history bullet after the topic heading.
- Start with `>`. If there are multiple bullets, each line must start with `> -`. For example:
- The string must include these words in this order (capitalization doesn't matter):
- `introduced`, `enabled`, `deprecated`, `changed`, `moved`, `recommended` (as in the
[feature flag documentation](feature_flags.md)), `removed`, or `renamed`
- `in` or `to`
- `GitLab`
- Whenever possible, include a link to the completed issue, merge request, or epic
that introduced the feature. An issue is preferred over a merge request, and
a merge request is preferred over an epic.
- Do not include information about the tier, unless documenting a tier change
(for example, `Feature X [moved](issue-link) to Premium in GitLab 19.2`).
- Do not link to the pricing page.
The tier is provided by the [product badge](styleguide/index.md#product-tier-badges) on the heading.
```markdown ```markdown
## Feature name ## Feature name
@ -57,23 +40,29 @@ the section. The version information must:
> [Introduced](<link-to-issue>) in GitLab 11.3. > [Introduced](<link-to-issue>) in GitLab 11.3.
This feature does something. This feature does something.
## Feature name 2
> - [Introduced](<link-to-issue>) in GitLab 11.3.
> - [Enabled by default](<link-to-issue>) in GitLab 11.4.
This feature does something else.
``` ```
If you're documenting elements of a feature, start with the feature name or a gerund: The bullet text must include these words in order. Capitalization doesn't matter.
- `introduced`, `enabled`, `deprecated`, `changed`, `moved`, `recommended`, `removed`, or `renamed`
- `in` or `to`
- `GitLab`
If possible, include a link to the related issue, merge request, or epic.
Do not link to the pricing page. Do not include the subscription tier.
#### Introducing a new feature
If you use `introduced`, start the sentence with the feature name or a gerund:
```markdown ```markdown
> - Notifications for expiring tokens [introduced](<link-to-issue>) in GitLab 11.3. > - Notifications for expiring tokens [introduced](<link-to-issue>) in GitLab 11.3.
> - Creating an issue from an issue board [introduced](<link-to-issue>) in GitLab 13.1. > - Creating an issue from an issue board [introduced](<link-to-issue>) in GitLab 13.1.
``` ```
If a feature is moved to another tier: #### Moving subscription tiers
If a feature is moved to another subscription tier, use `moved`:
```markdown ```markdown
> - [Moved](<link-to-issue>) from GitLab Ultimate to GitLab Premium in 11.8. > - [Moved](<link-to-issue>) from GitLab Ultimate to GitLab Premium in 11.8.
@ -83,88 +72,118 @@ If a feature is moved to another tier:
### Inline version text ### Inline version text
If you're adding content to an existing topic, you can add version information If you're adding content to an existing topic, you can add version information
inline with the existing text. inline with the existing text. If possible, include a link to the related issue,
merge request, or epic. For example:
In this case, add `([introduced/deprecated](<link-to-issue>) in GitLab X.X)`.
Including the issue link is encouraged, but isn't a requirement. For example:
```markdown ```markdown
The voting strategy in GitLab 13.4 and later requires the primary and secondary The voting strategy [in GitLab 13.4 and later](<link-to-issue>) requires the primary and secondary
voters to agree. voters to agree.
``` ```
### Deprecated features ## Deprecations and removals
When a feature is deprecated, add `(DEPRECATED)` to the page title or to When features are deprecated and removed, update the related documentation.
the heading of the section documenting the feature, immediately before
the tier badge:
```markdown API documentation follows these guidelines, but the GraphQL docs use
<!-- Page title example: --> a [separate process](../api_graphql_styleguide.md#deprecating-fields-arguments-and-enum-values).
# Feature A (DEPRECATED) **(ALL TIERS)**
<!-- Doc section example: --> ### Deprecate a page or topic
## Feature B (DEPRECATED) **(PREMIUM SELF)**
```
Add the deprecation to the version history note (you can include a link To deprecate a page or topic:
to a replacement when available):
```markdown 1. Add `(deprecated)` after the title. Use a warning to explain when it was deprecated,
> - [Deprecated](<link-to-issue>) in GitLab 11.3. Replaced by [meaningful text](<link-to-appropriate-documentation>). when it will be removed, and the replacement feature.
```
You can also describe the replacement in surrounding text, if available. If the ```markdown
deprecation isn't obvious in existing text, you may want to include a warning: ## Title (deprecated) **(ULTIMATE SELF)**
```markdown WARNING:
WARNING: This feature was [deprecated](<link-to-issue>) in GitLab 14.8
This feature was [deprecated](link-to-issue) in GitLab 12.3 and replaced by and is planned for removal in 15.4. Use [feature X](<link-to-issue>) instead.
[Feature name](link-to-feature-documentation). ```
```
If you add `(DEPRECATED)` to the page's title and the document is linked from the docs If you're not sure when the feature will be removed or no
navigation, either remove the page from the nav or update the nav item to include the replacement feature exists, you don't need to add this information.
same text before the feature name:
```yaml 1. If the deprecation is a breaking change, add this text:
- doc_title: (DEPRECATED) Feature A
```
In the first major GitLab version after the feature was deprecated, be sure to ```markdown
remove information about that deprecated feature. This change is a breaking change.
```
### End-of-life for features or products You can add any additional context-specific details that might help users.
When a feature or product enters its end-of-life, indicate its status by 1. Open a merge request to add the word `(deprecated)` to the left nav, after the page title.
creating a [warning alert](styleguide/index.md#alert-boxes) directly after its relevant header.
If possible, link to its deprecation and removal issues.
For example: ### Remove a page
```markdown Mark content as removed during the release the feature was removed.
WARNING: The title and a removed indicator remains until three months after the removal.
This feature is in its end-of-life process. It is [deprecated](link-to-issue)
in GitLab X.X, and is planned for [removal](link-to-issue) in GitLab X.X.
```
After the feature or product is officially deprecated and removed, remove To remove a page:
its information from the GitLab documentation.
## Versions in the past or future 1. Leave the page title. Remove all other content, including the version history bullets and the word `WARNING:`.
1. After the title, change `(deprecated)` to `(removed)`.
1. Add `remove_date` in the YAML metadata. Set the value to a date three months after
the release when the feature was removed. For example:
When describing functionality available in past or future versions, use: ```markdown
---
stage: Enablement
group: Global Search
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
remove_date: '2022-08-02'
---
- Earlier, and not older or before. # Title (removed) **(ULTIMATE SELF)**
- Later, and not newer or after.
For example: This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 14.8
and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in 15.0.
Use [feature X](<link-to-issue>) instead.
```
- Available in GitLab 13.1 and earlier. 1. Remove the page from the left nav.
- Available in GitLab 12.4 and later.
- In GitLab 12.2 and earlier, ... This content is removed from the documentation as part of the Technical Writing team's
- In GitLab 11.6 and later, ... [regularly scheduled tasks](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#regularly-scheduled-tasks).
### Remove a topic
To remove a topic:
1. Leave the title and the details of the deprecation and removal. Remove all other content,
including the version history bullets and the word `WARNING:`.
1. Add `(removed)` after the title.
1. Add the following HTML comments above and below the topic.
For the `remove_date`, set a date three months after the release where it was removed.
```markdown
<!--- The following content will be removed on remove_date: '2023-08-22' -->
## Title (removed) **(ULTIMATE SELF)**
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 14.8
and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in 15.0.
Use [feature X](<link-to-issue>) instead.
<!--- end_remove -->
```
This content is removed from the documentation as part of the Technical Writing team's
[regularly scheduled tasks](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#regularly-scheduled-tasks).
## Which versions are removed
GitLab supports the current major version and two previous major versions.
For example, if 14.0 is the current major version, all major and minor releases of
GitLab 14.0, 13.0 and 12.0 are supported.
[View the list of supported versions](https://about.gitlab.com/support/statement-of-support.html#version-support).
If you see version history bullets or inline text that refers to unsupported versions, you can remove it.
Historical feature information is available in [release posts](https://about.gitlab.com/releases/)
or by searching for the issue or merge request where the work was done.
## Promising features in future versions ## Promising features in future versions
@ -207,16 +226,3 @@ sole discretion of GitLab Inc.
If all of the content on the page is not available, use the disclaimer once at the top of the page. If all of the content on the page is not available, use the disclaimer once at the top of the page.
If the content in a topic is not ready, use the disclaimer in the topic. If the content in a topic is not ready, use the disclaimer in the topic.
## Removing versions after each major release
When a major GitLab release occurs, we remove all references
to now-unsupported versions. This removal includes version-specific instructions. For example,
if GitLab version 12.1 and later are supported,
instructions for users of GitLab 11 should be removed.
[View the list of supported versions](https://about.gitlab.com/support/statement-of-support.html#version-support).
To view historical information about a feature, review GitLab
[release posts](https://about.gitlab.com/releases/), or search for the issue or
merge request where the work was done.

View File

@ -6,6 +6,7 @@ module API
include RequestAwareEntity include RequestAwareEntity
include Gitlab::Utils::StrongMemoize include Gitlab::Utils::StrongMemoize
expose :tier
expose :project, using: Entities::BasicProjectDetails expose :project, using: Entities::BasicProjectDetails
expose :last_deployment, using: Entities::Deployment, if: { last_deployment: true } expose :last_deployment, using: Entities::Deployment, if: { last_deployment: true }
expose :state expose :state

View File

@ -40,6 +40,7 @@ module API
requires :name, type: String, desc: 'The name of the environment to be created' requires :name, type: String, desc: 'The name of the environment to be created'
optional :external_url, type: String, desc: 'URL on which this deployment is viewable' optional :external_url, type: String, desc: 'URL on which this deployment is viewable'
optional :slug, absence: { message: "is automatically generated and cannot be changed" } optional :slug, absence: { message: "is automatically generated and cannot be changed" }
optional :tier, type: String, values: Environment.tiers.keys, desc: 'The tier of the environment to be created'
end end
post ':id/environments' do post ':id/environments' do
authorize! :create_environment, user_project authorize! :create_environment, user_project
@ -63,13 +64,14 @@ module API
optional :name, type: String, desc: 'DEPRECATED: Renaming environment can lead to errors, this will be removed in 15.0' optional :name, type: String, desc: 'DEPRECATED: Renaming environment can lead to errors, this will be removed in 15.0'
optional :external_url, type: String, desc: 'The new URL on which this deployment is viewable' optional :external_url, type: String, desc: 'The new URL on which this deployment is viewable'
optional :slug, absence: { message: "is automatically generated and cannot be changed" } optional :slug, absence: { message: "is automatically generated and cannot be changed" }
optional :tier, type: String, values: Environment.tiers.keys, desc: 'The tier of the environment to be created'
end end
put ':id/environments/:environment_id' do put ':id/environments/:environment_id' do
authorize! :update_environment, user_project authorize! :update_environment, user_project
environment = user_project.environments.find(params[:environment_id]) environment = user_project.environments.find(params[:environment_id])
update_params = declared_params(include_missing: false).extract!(:name, :external_url) update_params = declared_params(include_missing: false).extract!(:name, :external_url, :tier)
if environment.update(update_params) if environment.update(update_params)
present environment, with: Entities::Environment, current_user: current_user present environment, with: Entities::Environment, current_user: current_user
else else

View File

@ -190,8 +190,6 @@ module API
def validate_git_import_url!(import_url) def validate_git_import_url!(import_url)
return if import_url.blank? return if import_url.blank?
yield if block_given?
result = Import::ValidateRemoteGitEndpointService.new(url: import_url).execute # network call result = Import::ValidateRemoteGitEndpointService.new(url: import_url).execute # network call
if result.error? if result.error?

View File

@ -5,10 +5,6 @@ module API
feature_category :importers feature_category :importers
urgency :low urgency :low
before do
forbidden! unless Gitlab::CurrentSettings.import_sources&.include?('bitbucket_server')
end
helpers do helpers do
def client def client
@client ||= BitbucketServer::Client.new(credentials) @client ||= BitbucketServer::Client.new(credentials)

View File

@ -7,10 +7,6 @@ module API
rescue_from Octokit::Unauthorized, with: :provider_unauthorized rescue_from Octokit::Unauthorized, with: :provider_unauthorized
before do
forbidden! unless Gitlab::CurrentSettings.import_sources&.include?('github')
end
helpers do helpers do
def client def client
@client ||= if Feature.enabled?(:remove_legacy_github_client) @client ||= if Feature.enabled?(:remove_legacy_github_client)

View File

@ -90,10 +90,6 @@ module API
Gitlab::AppLogger.info({ message: "File exceeds maximum size", file_bytes: file.size, project_id: user_project.id, project_path: user_project.full_path, upload_allowed: allowed }) Gitlab::AppLogger.info({ message: "File exceeds maximum size", file_bytes: file.size, project_id: user_project.id, project_path: user_project.full_path, upload_allowed: allowed })
end end
end end
def check_import_by_url_is_enabled
Gitlab::CurrentSettings.import_sources&.include?('git') || forbidden!
end
end end
helpers do helpers do
@ -202,6 +198,11 @@ module API
params[:builds_enabled] = params.delete(:jobs_enabled) if params.key?(:jobs_enabled) params[:builds_enabled] = params.delete(:jobs_enabled) if params.key?(:jobs_enabled)
params params
end end
def add_import_params(params)
params[:import_type] = 'git' if params[:import_url]&.present?
params
end
end end
resource :users, requirements: API::USER_REQUIREMENTS do resource :users, requirements: API::USER_REQUIREMENTS do
@ -271,9 +272,10 @@ module API
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/issues/21139') Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/issues/21139')
attrs = declared_params(include_missing: false) attrs = declared_params(include_missing: false)
attrs = translate_params_for_compatibility(attrs) attrs = translate_params_for_compatibility(attrs)
attrs = add_import_params(attrs)
filter_attributes_using_license!(attrs) filter_attributes_using_license!(attrs)
validate_git_import_url!(params[:import_url]) { check_import_by_url_is_enabled } validate_git_import_url!(params[:import_url])
project = ::Projects::CreateService.new(current_user, attrs).execute project = ::Projects::CreateService.new(current_user, attrs).execute
@ -286,6 +288,8 @@ module API
error!(project.errors[:limit_reached], 403) error!(project.errors[:limit_reached], 403)
end end
forbidden! if project.errors[:import_source_disabled].present?
render_validation_error!(project) render_validation_error!(project)
end end
end end
@ -311,6 +315,7 @@ module API
attrs = declared_params(include_missing: false) attrs = declared_params(include_missing: false)
attrs = translate_params_for_compatibility(attrs) attrs = translate_params_for_compatibility(attrs)
attrs = add_import_params(attrs)
filter_attributes_using_license!(attrs) filter_attributes_using_license!(attrs)
validate_git_import_url!(params[:import_url]) validate_git_import_url!(params[:import_url])
@ -321,6 +326,8 @@ module API
user_can_admin_project: can?(current_user, :admin_project, project), user_can_admin_project: can?(current_user, :admin_project, project),
current_user: current_user current_user: current_user
else else
forbidden! if project.errors[:import_source_disabled].present?
render_validation_error!(project) render_validation_error!(project)
end end
end end
@ -441,6 +448,7 @@ module API
authorize! :change_visibility_level, user_project if user_project.visibility_attribute_present?(attrs) authorize! :change_visibility_level, user_project if user_project.visibility_attribute_present?(attrs)
attrs = translate_params_for_compatibility(attrs) attrs = translate_params_for_compatibility(attrs)
attrs = add_import_params(attrs)
filter_attributes_using_license!(attrs) filter_attributes_using_license!(attrs)
verify_update_project_attrs!(user_project, attrs) verify_update_project_attrs!(user_project, attrs)

View File

@ -5706,24 +5706,84 @@ msgstr ""
msgid "Billing" msgid "Billing"
msgstr "" msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}." msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
msgid "BillingPlans|10,000 CI/CD minutes per month"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
msgid "BillingPlans|400 CI/CD minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
msgid "BillingPlans|50,000 CI/CD minutes per month"
msgstr ""
msgid "BillingPlans|5GB storage"
msgstr "" msgstr ""
msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}." msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
msgstr "" msgstr ""
msgid "BillingPlans|Advanced CI/CD"
msgstr ""
msgid "BillingPlans|All plans have unlimited (private) repositories."
msgstr ""
msgid "BillingPlans|All the features from Free"
msgstr ""
msgid "BillingPlans|All the features from Premium"
msgstr ""
msgid "BillingPlans|Billed annually at %{price_per_year} USD"
msgstr ""
msgid "BillingPlans|Check out all groups"
msgstr ""
msgid "BillingPlans|Compliance"
msgstr ""
msgid "BillingPlans|Congratulations, your free trial is activated." msgid "BillingPlans|Congratulations, your free trial is activated."
msgstr "" msgstr ""
msgid "BillingPlans|End of availability for the Bronze Plan" msgid "BillingPlans|End of availability for the Bronze Plan"
msgstr "" msgstr ""
msgid "BillingPlans|Enhance team productivity and collaboration"
msgstr ""
msgid "BillingPlans|Enterprise agile planning"
msgstr ""
msgid "BillingPlans|Faster code reviews"
msgstr ""
msgid "BillingPlans|Free forever features for individual users"
msgstr ""
msgid "BillingPlans|Free guest users"
msgstr ""
msgid "BillingPlans|Free upgrade!" msgid "BillingPlans|Free upgrade!"
msgstr "" msgstr ""
msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}." msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}."
msgstr "" msgstr ""
msgid "BillingPlans|Includes free static websites"
msgstr ""
msgid "BillingPlans|Learn more"
msgstr ""
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate." msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
msgstr "" msgstr ""
@ -5733,21 +5793,78 @@ msgstr ""
msgid "BillingPlans|Looking to purchase or manage a subscription for your group? Navigate to your %{groups_link} and go to %{strong_open}Settings &gt; Billing.%{strong_close}" msgid "BillingPlans|Looking to purchase or manage a subscription for your group? Navigate to your %{groups_link} and go to %{strong_open}Settings &gt; Billing.%{strong_close}"
msgstr "" msgstr ""
msgid "BillingPlans|Loved and trusted by our customers"
msgstr ""
msgid "BillingPlans|Manage plan" msgid "BillingPlans|Manage plan"
msgstr "" msgstr ""
msgid "BillingPlans|Not the group you're looking for? %{all_groups_link}."
msgstr ""
msgid "BillingPlans|Open Source - MIT License"
msgstr ""
msgid "BillingPlans|Organization wide security, compliance and planning"
msgstr ""
msgid "BillingPlans|Portfolio management"
msgstr ""
msgid "BillingPlans|Pricing page" msgid "BillingPlans|Pricing page"
msgstr "" msgstr ""
msgid "BillingPlans|Ready to explore the value of the paid features today? Start a trial, no credit card required."
msgstr ""
msgid "BillingPlans|Recommended"
msgstr ""
msgid "BillingPlans|Release controls"
msgstr ""
msgid "BillingPlans|Security risk mitigation"
msgstr ""
msgid "BillingPlans|See all %{plan_name} features" msgid "BillingPlans|See all %{plan_name} features"
msgstr "" msgstr ""
msgid "BillingPlans|Self-managed reliability"
msgstr ""
msgid "BillingPlans|Spans the DevOps lifecycle"
msgstr ""
msgid "BillingPlans|Start a free Ultimate trial"
msgstr ""
msgid "BillingPlans|Still have questions?"
msgstr ""
msgid "BillingPlans|Support"
msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
msgid "BillingPlans|This group uses the plan associated with its parent group." msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "" msgstr ""
msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
msgstr "" msgstr ""
msgid "BillingPlans|Upgrade to Premium"
msgstr ""
msgid "BillingPlans|Upgrade to Ultimate"
msgstr ""
msgid "BillingPlans|Value stream management"
msgstr ""
msgid "BillingPlans|We're here to help."
msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}." msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "" msgstr ""
@ -5763,6 +5880,9 @@ msgstr ""
msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below." msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
msgstr "" msgstr ""
msgid "BillingPlans|Your current plan"
msgstr ""
msgid "BillingPlans|billed annually at %{price_per_year}" msgid "BillingPlans|billed annually at %{price_per_year}"
msgstr "" msgstr ""
@ -5781,6 +5901,9 @@ msgstr ""
msgid "BillingPlans|per user" msgid "BillingPlans|per user"
msgstr "" msgstr ""
msgid "BillingPlans|per user/month"
msgstr ""
msgid "BillingPlan|Upgrade" msgid "BillingPlan|Upgrade"
msgstr "" msgstr ""
@ -19854,6 +19977,9 @@ msgstr ""
msgid "InProductMarketing|Take your source code management to the next level" msgid "InProductMarketing|Take your source code management to the next level"
msgstr "" msgstr ""
msgid "InProductMarketing|Team members collaborating"
msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency" msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr "" msgstr ""

View File

@ -42,7 +42,7 @@ module QA
end end
def interception_enabled? def interception_enabled?
enabled?(ENV['INTERCEPT_REQUESTS'], default: true) enabled?(ENV['QA_INTERCEPT_REQUESTS'], default: false)
end end
def can_intercept? def can_intercept?

View File

@ -226,137 +226,6 @@ RSpec.describe Projects::Prometheus::AlertsController do
end end
end end
describe 'POST #create' do
let(:schedule_update_service) { spy }
let(:alert_params) do
{
'title' => metric.title,
'query' => metric.query,
'operator' => '>',
'threshold' => 1.0,
'runbook_url' => 'https://sample.runbook.com'
}
end
def make_request(opts = {})
post :create, params: request_params(
opts,
operator: '>',
threshold: '1',
runbook_url: 'https://sample.runbook.com',
environment_id: environment,
prometheus_metric_id: metric
)
end
it 'creates a new prometheus alert' do
allow(::Clusters::Applications::ScheduleUpdateService)
.to receive(:new).and_return(schedule_update_service)
make_request
expect(schedule_update_service).to have_received(:execute)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to include(alert_params)
end
it 'returns bad_request for an invalid metric' do
make_request(prometheus_metric_id: 'invalid')
expect(response).to have_gitlab_http_status(:bad_request)
end
it_behaves_like 'unprivileged'
it_behaves_like 'project non-specific environment', :bad_request
end
describe 'PUT #update' do
let(:schedule_update_service) { spy }
let(:alert) do
create(:prometheus_alert,
project: project,
environment: environment,
prometheus_metric: metric)
end
let(:alert_params) do
{
'id' => alert.id,
'title' => alert.title,
'query' => alert.query,
'operator' => '<',
'threshold' => alert.threshold,
'alert_path' => alert_path(alert)
}
end
before do
allow(::Clusters::Applications::ScheduleUpdateService)
.to receive(:new).and_return(schedule_update_service)
end
def make_request(opts = {})
put :update, params: request_params(
opts,
id: alert.prometheus_metric_id,
operator: '<',
environment_id: alert.environment
)
end
it 'updates an already existing prometheus alert' do
expect { make_request(operator: '<') }
.to change { alert.reload.operator }.to('lt')
expect(schedule_update_service).to have_received(:execute)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to include(alert_params)
end
it 'returns bad_request for an invalid alert data' do
make_request(runbook_url: 'bad-url')
expect(response).to have_gitlab_http_status(:bad_request)
end
it_behaves_like 'unprivileged'
it_behaves_like 'project non-specific environment', :not_found
it_behaves_like 'project non-specific metric', :not_found
end
describe 'DELETE #destroy' do
let(:schedule_update_service) { spy }
let!(:alert) do
create(:prometheus_alert, project: project, prometheus_metric: metric)
end
before do
allow(::Clusters::Applications::ScheduleUpdateService)
.to receive(:new).and_return(schedule_update_service)
end
def make_request(opts = {})
delete :destroy, params: request_params(
opts,
id: alert.prometheus_metric_id,
environment_id: alert.environment
)
end
it 'destroys the specified prometheus alert' do
expect { make_request }.to change { PrometheusAlert.count }.by(-1)
expect(schedule_update_service).to have_received(:execute)
end
it_behaves_like 'unprivileged'
it_behaves_like 'project non-specific environment', :not_found
it_behaves_like 'project non-specific metric', :not_found
end
describe 'GET #metrics_dashboard' do describe 'GET #metrics_dashboard' do
let!(:alert) do let!(:alert) do
create(:prometheus_alert, create(:prometheus_alert,

View File

@ -4,6 +4,7 @@
"id", "id",
"name", "name",
"slug", "slug",
"tier",
"external_url", "external_url",
"state", "state",
"created_at", "created_at",
@ -13,6 +14,7 @@
"id": { "type": "integer" }, "id": { "type": "integer" },
"name": { "type": "string" }, "name": { "type": "string" },
"slug": { "type": "string" }, "slug": { "type": "string" },
"tier": { "type": "string" },
"external_url": { "$ref": "../../types/nullable_string.json" }, "external_url": { "$ref": "../../types/nullable_string.json" },
"last_deployment": { "last_deployment": {
"oneOf": [ "oneOf": [

View File

@ -23,6 +23,7 @@ RSpec.describe API::Environments do
expect(json_response).to be_an Array expect(json_response).to be_an Array
expect(json_response.size).to eq(1) expect(json_response.size).to eq(1)
expect(json_response.first['name']).to eq(environment.name) expect(json_response.first['name']).to eq(environment.name)
expect(json_response.first['tier']).to eq(environment.tier)
expect(json_response.first['external_url']).to eq(environment.external_url) expect(json_response.first['external_url']).to eq(environment.external_url)
expect(json_response.first['project']).to match_schema('public_api/v4/project') expect(json_response.first['project']).to match_schema('public_api/v4/project')
expect(json_response.first['enable_advanced_logs_querying']).to eq(false) expect(json_response.first['enable_advanced_logs_querying']).to eq(false)
@ -165,12 +166,13 @@ RSpec.describe API::Environments do
describe 'POST /projects/:id/environments' do describe 'POST /projects/:id/environments' do
context 'as a member' do context 'as a member' do
it 'creates a environment with valid params' do it 'creates a environment with valid params' do
post api("/projects/#{project.id}/environments", user), params: { name: "mepmep" } post api("/projects/#{project.id}/environments", user), params: { name: "mepmep", tier: 'staging' }
expect(response).to have_gitlab_http_status(:created) expect(response).to have_gitlab_http_status(:created)
expect(response).to match_response_schema('public_api/v4/environment') expect(response).to match_response_schema('public_api/v4/environment')
expect(json_response['name']).to eq('mepmep') expect(json_response['name']).to eq('mepmep')
expect(json_response['slug']).to eq('mepmep') expect(json_response['slug']).to eq('mepmep')
expect(json_response['tier']).to eq('staging')
expect(json_response['external']).to be nil expect(json_response['external']).to be nil
end end
@ -219,6 +221,15 @@ RSpec.describe API::Environments do
expect(json_response['external_url']).to eq(url) expect(json_response['external_url']).to eq(url)
end end
it 'returns a 200 if tier is changed' do
put api("/projects/#{project.id}/environments/#{environment.id}", user),
params: { tier: 'production' }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('public_api/v4/environment')
expect(json_response['tier']).to eq('production')
end
it "won't allow slug to be changed" do it "won't allow slug to be changed" do
slug = environment.slug slug = environment.slug
api_url = api("/projects/#{project.id}/environments/#{environment.id}", user) api_url = api("/projects/#{project.id}/environments/#{environment.id}", user)

View File

@ -9,7 +9,15 @@ RSpec.describe API::ImportBitbucketServer do
let(:secret) { "sekrettt" } let(:secret) { "sekrettt" }
let(:project_key) { 'TES' } let(:project_key) { 'TES' }
let(:repo_slug) { 'vim' } let(:repo_slug) { 'vim' }
let(:repo) { { name: 'vim' } } let(:repo) do
double('repo',
name: repo_slug,
browse_url: "#{base_uri}/projects/#{project_key}/repos/#{repo_slug}/browse",
clone_url: "#{base_uri}/scm/#{project_key}/#{repo_slug}.git",
description: 'provider',
visibility_level: Gitlab::VisibilityLevel::PUBLIC
)
end
describe "POST /import/bitbucket_server" do describe "POST /import/bitbucket_server" do
context 'with no optional parameters' do context 'with no optional parameters' do
@ -20,7 +28,7 @@ RSpec.describe API::ImportBitbucketServer do
before do before do
Grape::Endpoint.before_each do |endpoint| Grape::Endpoint.before_each do |endpoint|
allow(endpoint).to receive(:client).and_return(client.as_null_object) allow(endpoint).to receive(:client).and_return(client.as_null_object)
allow(client).to receive(:repo).with(project_key, repo_slug).and_return(double(name: repo_slug)) allow(client).to receive(:repo).with(project_key, repo_slug).and_return(repo)
end end
end end

View File

@ -16,7 +16,11 @@ RSpec.describe API::ImportGithub do
double('provider', double('provider',
name: 'vim', name: 'vim',
full_name: "#{provider_username}/vim", full_name: "#{provider_username}/vim",
owner: double('provider', login: provider_username) owner: double('provider', login: provider_username),
description: 'provider',
private: false,
clone_url: 'https://fake.url/vim.git',
has_wiki?: true
) )
end end

View File

@ -1180,9 +1180,15 @@ RSpec.describe API::Projects do
end end
it 'disallows creating a project with an import_url when git import source is disabled' do it 'disallows creating a project with an import_url when git import source is disabled' do
url = 'http://example.com'
stub_application_setting(import_sources: nil) stub_application_setting(import_sources: nil)
project_params = { import_url: 'http://example.com', path: 'path-project-Foo', name: 'Foo Project' } endpoint_url = "#{url}/info/refs?service=git-upload-pack"
stub_full_request(endpoint_url, method: :get).to_return({ status: 200,
body: '001e# service=git-upload-pack',
headers: { 'Content-Type': 'application/x-git-upload-pack-advertisement' } })
project_params = { import_url: url, path: 'path-project-Foo', name: 'Foo Project' }
expect { post api('/projects', user), params: project_params } expect { post api('/projects', user), params: project_params }
.not_to change { Project.count } .not_to change { Project.count }

View File

@ -48,6 +48,23 @@ RSpec.describe Import::BitbucketServerService do
end end
end end
context 'when import source is disabled' do
before do
stub_application_setting(import_sources: nil)
allow(subject).to receive(:authorized?).and_return(true)
allow(client).to receive(:repo).with(project_key, repo_slug).and_return(double(repo))
end
it 'returns forbidden' do
result = subject.execute(credentials)
expect(result).to include(
status: :error,
http_status: :forbidden
)
end
end
context 'when user is unauthorized' do context 'when user is unauthorized' do
before do before do
allow(subject).to receive(:authorized?).and_return(false) allow(subject).to receive(:authorized?).and_return(false)

View File

@ -111,6 +111,33 @@ RSpec.describe Import::GithubService do
end end
end end
context 'when import source is disabled' do
let(:repository_double) do
double({
name: 'vim',
description: 'test',
full_name: 'test/vim',
clone_url: 'http://repo.com/repo/repo.git',
private: false,
has_wiki?: false
})
end
before do
stub_application_setting(import_sources: nil)
allow(client).to receive(:repository).and_return(repository_double)
end
it 'returns forbidden' do
result = subject.execute(access_params, :github)
expect(result).to include(
status: :error,
http_status: :forbidden
)
end
end
context 'when a blocked/local URL is used as github_hostname' do context 'when a blocked/local URL is used as github_hostname' do
let(:message) { 'Error while attempting to import from GitHub' } let(:message) { 'Error while attempting to import from GitHub' }
let(:error) { "Invalid URL: #{url}" } let(:error) { "Invalid URL: #{url}" }

View File

@ -768,6 +768,45 @@ RSpec.describe Projects::CreateService, '#execute' do
create_project(user, opts) create_project(user, opts)
end end
context 'when import source is enabled' do
before do
stub_application_setting(import_sources: ['github'])
end
it 'does not raise an error when import_source is string' do
opts[:import_type] = 'github'
project = create_project(user, opts)
expect(project).to be_persisted
expect(project.errors).to be_blank
end
it 'does not raise an error when import_source is symbol' do
opts[:import_type] = :github
project = create_project(user, opts)
expect(project).to be_persisted
expect(project.errors).to be_blank
end
end
context 'when import source is disabled' do
before do
stub_application_setting(import_sources: [])
opts[:import_type] = 'git'
end
it 'raises an error' do
project = create_project(user, opts)
expect(project).to respond_to(:errors)
expect(project.errors).to have_key(:import_source_disabled)
expect(project.saved?).to be_falsey
end
end
context 'with external authorization enabled' do context 'with external authorization enabled' do
before do before do
enable_external_authorization_service_check enable_external_authorization_service_check

View File

@ -1,52 +0,0 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Projects::Prometheus::Alerts::CreateService do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
let(:service) { described_class.new(project: project, current_user: user, params: params) }
subject { service.execute }
describe '#execute' do
context 'with params' do
let_it_be(:environment) { create(:environment, project: project) }
let_it_be(:metric) do
create(:prometheus_metric, project: project)
end
let(:params) do
{
environment_id: environment.id,
prometheus_metric_id: metric.id,
operator: '<',
threshold: 1.0
}
end
it 'creates an alert' do
expect(subject).to be_persisted
expect(subject).to have_attributes(
project: project,
environment: environment,
prometheus_metric: metric,
operator: 'lt',
threshold: 1.0
)
end
end
context 'without params' do
let(:params) { {} }
it 'fails to create' do
expect(subject).to be_new_record
expect(subject).to be_invalid
end
end
end
end

View File

@ -1,21 +0,0 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Projects::Prometheus::Alerts::DestroyService do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
let_it_be(:alert) { create(:prometheus_alert, project: project) }
let(:service) { described_class.new(project: project, current_user: user, params: nil) }
describe '#execute' do
subject { service.execute(alert) }
it 'deletes the alert' do
expect(subject).to be_truthy
expect(alert).to be_destroyed
end
end
end

View File

@ -1,53 +0,0 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Projects::Prometheus::Alerts::UpdateService do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
let_it_be(:environment) { create(:environment, project: project) }
let_it_be(:alert) do
create(:prometheus_alert, project: project, environment: environment)
end
let(:service) { described_class.new(project: project, current_user: user, params: params) }
let(:params) do
{
environment_id: alert.environment_id,
prometheus_metric_id: alert.prometheus_metric_id,
operator: '==',
threshold: 2.0
}
end
describe '#execute' do
subject { service.execute(alert) }
context 'with valid params' do
it 'updates the alert' do
expect(subject).to be_truthy
expect(alert.reload).to have_attributes(
operator: 'eq',
threshold: 2.0
)
end
end
context 'with invalid params' do
let(:other_environment) { create(:environment) }
before do
params[:environment_id] = other_environment.id
end
it 'fails to update' do
expect(subject).to be_falsey
expect(alert).to be_invalid
end
end
end
end