Commit f050e712 authored by John T Skarbek's avatar John T Skarbek

Merge remote-tracking branch 'origin/master'

parents 843696c5 fabbce4f
<script>
export default {
name: 'TimelineEntryItem',
};
</script>
<template> <template>
<li class="timeline-entry"> <li class="timeline-entry">
<div class="timeline-entry-inner"><slot></slot></div> <div class="timeline-entry-inner"><slot></slot></div>
......
...@@ -20,6 +20,11 @@ module ClustersHelper ...@@ -20,6 +20,11 @@ module ClustersHelper
!cluster.provider.legacy_abac? !cluster.provider.legacy_abac?
end end
# EE overrides this
def show_cluster_health_graphs?(cluster)
false
end
end end
ClustersHelper.prepend(EE::ClustersHelper) ClustersHelper.prepend(EE::ClustersHelper)
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
= render 'banner' = render 'banner'
= render 'form' = render 'form'
= render_if_exists 'health' = render_if_exists 'projects/clusters/prometheus_graphs' if show_cluster_health_graphs?(@cluster)
.cluster-applications-table#js-cluster-applications .cluster-applications-table#js-cluster-applications
......
...@@ -53,7 +53,7 @@ module ApplicationWorker ...@@ -53,7 +53,7 @@ module ApplicationWorker
schedule = now + delay.to_i schedule = now + delay.to_i
if schedule <= now if schedule <= now
raise ArgumentError, 'The schedule time must be in the future!' raise ArgumentError, _('The schedule time must be in the future!')
end end
Sidekiq::Client.push_bulk('class' => self, 'args' => args_list, 'at' => schedule) Sidekiq::Client.push_bulk('class' => self, 'args' => args_list, 'at' => schedule)
......
...@@ -24,22 +24,22 @@ class EmailReceiverWorker ...@@ -24,22 +24,22 @@ class EmailReceiverWorker
reason = reason =
case error case error
when Gitlab::Email::UnknownIncomingEmail when Gitlab::Email::UnknownIncomingEmail
"We couldn't figure out what the email is for. Please create your issue or comment through the web interface." s_("EmailError|We couldn't figure out what the email is for. Please create your issue or comment through the web interface.")
when Gitlab::Email::SentNotificationNotFoundError when Gitlab::Email::SentNotificationNotFoundError
"We couldn't figure out what the email is in reply to. Please create your comment through the web interface." s_("EmailError|We couldn't figure out what the email is in reply to. Please create your comment through the web interface.")
when Gitlab::Email::ProjectNotFound when Gitlab::Email::ProjectNotFound
"We couldn't find the project. Please check if there's any typo." s_("EmailError|We couldn't find the project. Please check if there's any typo.")
when Gitlab::Email::EmptyEmailError when Gitlab::Email::EmptyEmailError
can_retry = true can_retry = true
"It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies." s_("EmailError|It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies.")
when Gitlab::Email::UserNotFoundError when Gitlab::Email::UserNotFoundError
"We couldn't figure out what user corresponds to the email. Please create your comment through the web interface." s_("EmailError|We couldn't figure out what user corresponds to the email. Please create your comment through the web interface.")
when Gitlab::Email::UserBlockedError when Gitlab::Email::UserBlockedError
"Your account has been blocked. If you believe this is in error, contact a staff member." s_("EmailError|Your account has been blocked. If you believe this is in error, contact a staff member.")
when Gitlab::Email::UserNotAuthorizedError when Gitlab::Email::UserNotAuthorizedError
"You are not allowed to perform this action. If you believe this is in error, contact a staff member." s_("EmailError|You are not allowed to perform this action. If you believe this is in error, contact a staff member.")
when Gitlab::Email::NoteableNotFoundError when Gitlab::Email::NoteableNotFoundError
"The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member." s_("EmailError|The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member.")
when Gitlab::Email::InvalidAttachment when Gitlab::Email::InvalidAttachment
error.message error.message
when Gitlab::Email::InvalidRecordError when Gitlab::Email::InvalidRecordError
......
...@@ -20,7 +20,7 @@ module ObjectStorage ...@@ -20,7 +20,7 @@ module ObjectStorage
end end
def to_s def to_s
success? ? "Migration successful." : "Error while migrating #{upload.id}: #{error.message}" success? ? _("Migration successful.") : _("Error while migrating %{upload_id}: %{error_message}") % { upload_id: upload.id, error_message: error.message }
end end
end end
...@@ -47,7 +47,7 @@ module ObjectStorage ...@@ -47,7 +47,7 @@ module ObjectStorage
end end
def header(success, failures) def header(success, failures)
"Migrated #{success.count}/#{success.count + failures.count} files." _("Migrated %{success_count}/%{total_count} files.") % { success_count: success.count, total_count: success.count + failures.count }
end end
def failures(failures) def failures(failures)
...@@ -75,9 +75,9 @@ module ObjectStorage ...@@ -75,9 +75,9 @@ module ObjectStorage
model_types = uploads.map(&:model_type).uniq model_types = uploads.map(&:model_type).uniq
model_has_mount = mounted_as.nil? || model_class.uploaders[mounted_as] == uploader_class model_has_mount = mounted_as.nil? || model_class.uploaders[mounted_as] == uploader_class
raise(SanityCheckError, "Multiple uploaders found: #{uploader_types}") unless uploader_types.count == 1 raise(SanityCheckError, _("Multiple uploaders found: %{uploader_types}") % { uploader_types: uploader_types }) unless uploader_types.count == 1
raise(SanityCheckError, "Multiple model types found: #{model_types}") unless model_types.count == 1 raise(SanityCheckError, _("Multiple model types found: %{model_types}") % { model_types: model_types }) unless model_types.count == 1
raise(SanityCheckError, "Mount point #{mounted_as} not found in #{model_class}.") unless model_has_mount raise(SanityCheckError, _("Mount point %{mounted_as} not found in %{model_class}.") % { mounted_as: mounted_as, model_class: model_class }) unless model_has_mount
end end
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
...@@ -110,9 +110,9 @@ module ObjectStorage ...@@ -110,9 +110,9 @@ module ObjectStorage
return if args.count == 4 return if args.count == 4
case args.count case args.count
when 3 then raise SanityCheckError, "Job is missing the `model_type` argument." when 3 then raise SanityCheckError, _("Job is missing the `model_type` argument.")
else else
raise SanityCheckError, "Job has wrong arguments format." raise SanityCheckError, _("Job has wrong arguments format.")
end end
end end
......
---
title: Update GitLab Workhorse to v8.5.1
merge_request: 27217
author:
type: fixed
...@@ -7,7 +7,8 @@ ...@@ -7,7 +7,8 @@
# * are being moved to ApplicationSetting model! # # * are being moved to ApplicationSetting model! #
# If a setting requires an application restart say so in that screen. # # If a setting requires an application restart say so in that screen. #
# If you change this file in a Merge Request, please also create # # If you change this file in a Merge Request, please also create #
# a MR on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests # # a MR on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests. #
# For more details see https://gitlab.com/gitlab-org/omnibus-gitlab/blob/0928cfb09f43993fd9454b0b14dbd1924b1407bc/doc/settings/gitlab.yml.md #
######################################################################## ########################################################################
# #
# #
...@@ -248,6 +249,27 @@ production: &base ...@@ -248,6 +249,27 @@ production: &base
# aws_signature_version: 4 # For creation of signed URLs. Set to 2 if provider does not support v4. # aws_signature_version: 4 # For creation of signed URLs. Set to 2 if provider does not support v4.
# path_style: true # Use 'host/bucket_name/object' instead of 'bucket_name.host/object' # path_style: true # Use 'host/bucket_name/object' instead of 'bucket_name.host/object'
## Dependency Proxy
dependency_proxy:
enabled: true
# The location where build packages are stored (default: shared/dependency_proxy).
# storage_path: shared/dependency_proxy
object_store:
enabled: false
remote_directory: dependency_proxy # The bucket name
# direct_upload: false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false)
# background_upload: false # Temporary option to limit automatic upload (Default: true)
# proxy_download: false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage
connection:
provider: AWS
aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
region: us-east-1
# host: 'localhost' # default: s3.amazonaws.com
# endpoint: 'http://127.0.0.1:9000' # default: nil
# aws_signature_version: 4 # For creation of signed URLs. Set to 2 if provider does not support v4.
# path_style: true # Use 'host/bucket_name/object' instead of 'bucket_name.host/object'
## GitLab Pages ## GitLab Pages
pages: pages:
enabled: false enabled: false
......
...@@ -294,6 +294,19 @@ Settings.packages['enabled'] = true if Settings.packages['enabled'].nil? ...@@ -294,6 +294,19 @@ Settings.packages['enabled'] = true if Settings.packages['enabled'].nil?
Settings.packages['storage_path'] = Settings.absolute(Settings.packages['storage_path'] || File.join(Settings.shared['path'], "packages")) Settings.packages['storage_path'] = Settings.absolute(Settings.packages['storage_path'] || File.join(Settings.shared['path'], "packages"))
Settings.packages['object_store'] = ObjectStoreSettings.parse(Settings.packages['object_store']) Settings.packages['object_store'] = ObjectStoreSettings.parse(Settings.packages['object_store'])
#
# Dependency Proxy
#
Settings['dependency_proxy'] ||= Settingslogic.new({})
Settings.dependency_proxy['enabled'] = true if Settings.dependency_proxy['enabled'].nil?
Settings.dependency_proxy['storage_path'] = Settings.absolute(Settings.dependency_proxy['storage_path'] || File.join(Settings.shared['path'], "dependency_proxy"))
Settings.dependency_proxy['object_store'] = ObjectStoreSettings.parse(Settings.dependency_proxy['object_store'])
# For first iteration dependency proxy uses Rails server to download blobs.
# To ensure acceptable performance we only allow feature to be used with
# multithreaded web-server Puma. This will be removed once download logic is moved
# to GitLab workhorse
Settings.dependency_proxy['enabled'] = false unless defined?(::Puma)
# #
# Mattermost # Mattermost
# #
......
...@@ -8,5 +8,10 @@ module EE ...@@ -8,5 +8,10 @@ module EE
def has_multiple_clusters? def has_multiple_clusters?
clusterable.feature_available?(:multiple_clusters) clusterable.feature_available?(:multiple_clusters)
end end
override :show_cluster_health_graphs?
def show_cluster_health_graphs?(cluster)
cluster.project_type? && cluster.project.feature_available?(:cluster_health)
end
end end
end end
- if @cluster.project_type? && @cluster.project.feature_available?(:cluster_health)
%section.settings.no-animate.expanded.cluster-health-graphs#cluster-health
%h4= s_('ClusterIntegration|Cluster health')
- if @cluster&.application_prometheus_available?
#prometheus-graphs{ data: { "settings-path": edit_project_service_path(@project, 'prometheus'),
"clusters-path": project_clusters_path(@project),
"documentation-path": help_page_path('administration/monitoring/prometheus/index.md'),
"empty-getting-started-svg-path": image_path('illustrations/monitoring/getting_started.svg'),
"empty-loading-svg-path": image_path('illustrations/monitoring/loading.svg'),
"empty-no-data-svg-path": image_path('illustrations/monitoring/no_data.svg'),
"empty-unable-to-connect-svg-path": image_path('illustrations/monitoring/unable_to_connect.svg'),
"metrics-endpoint": metrics_namespace_project_cluster_path( format: :json ),
"project-path": project_path(@project),
"tags-path": project_tags_path(@project) } }
- else
%p.settings-message.text-center= s_("ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below.")
%section.settings.no-animate.expanded.cluster-health-graphs#cluster-health
%h4= s_('ClusterIntegration|Cluster health')
- if @cluster&.application_prometheus_available?
#prometheus-graphs{ data: { "settings-path": edit_project_service_path(@project, 'prometheus'),
"clusters-path": project_clusters_path(@project),
"documentation-path": help_page_path('administration/monitoring/prometheus/index.md'),
"empty-getting-started-svg-path": image_path('illustrations/monitoring/getting_started.svg'),
"empty-loading-svg-path": image_path('illustrations/monitoring/loading.svg'),
"empty-no-data-svg-path": image_path('illustrations/monitoring/no_data.svg'),
"empty-unable-to-connect-svg-path": image_path('illustrations/monitoring/unable_to_connect.svg'),
"metrics-endpoint": metrics_namespace_project_cluster_path( format: :json ),
"project-path": project_path(@project),
"tags-path": project_tags_path(@project) } }
- else
%p.settings-message.text-center= s_("ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below.")
---
title: Correct path to cluster health partial
merge_request: 10638
author:
type: fixed
...@@ -29,4 +29,37 @@ describe ClustersHelper do ...@@ -29,4 +29,37 @@ describe ClustersHelper do
it { is_expected.to be_falsey } it { is_expected.to be_falsey }
end end
end end
describe '#show_cluster_health_graphs?' do
let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:cluster_presenter) { cluster.present }
before do
stub_licensed_features(cluster_health: true)
end
context 'with project level cluster' do
it 'returns true' do
expect(helper.show_cluster_health_graphs?(cluster_presenter)).to eq(true)
end
end
context 'with group level cluster' do
let(:cluster) { create(:cluster, :group, :provided_by_gcp) }
it 'returns false' do
expect(helper.show_cluster_health_graphs?(cluster_presenter)).to eq(false)
end
end
context 'without cluster_health license' do
before do
stub_licensed_features(cluster_health: false)
end
it 'returns false' do
expect(helper.show_cluster_health_graphs?(cluster_presenter)).to eq(false)
end
end
end
end end
# frozen_string_literal: true
require 'spec_helper'
describe 'clusters/clusters/show' do
let(:user) { create(:user) }
let(:project) { create(:project) }
before do
allow(controller).to receive(:current_user).and_return(user)
end
context 'when the cluster details page is opened' do
before do
assign(:cluster, cluster_presenter)
allow(view).to receive(:clusterable).and_return(clusterable)
end
context 'with project level cluster' do
let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:clusterable) { ClusterablePresenter.fabricate(project, current_user: user) }
let(:cluster_presenter) { cluster.present(current_user: user) }
before do
stub_licensed_features(cluster_health: true)
end
it 'displays the Cluster health section' do
render
expect(rendered).to have_selector('#cluster-health')
expect(rendered).to have_content('Cluster health')
end
end
context 'with group level cluster' do
let(:cluster) { create(:cluster, :group, :provided_by_gcp) }
let(:clusterable) { ClusterablePresenter.fabricate(cluster.group, current_user: user) }
let(:cluster_presenter) { cluster.present(current_user: user) }
before do
stub_licensed_features(cluster_health: true)
end
it 'does not display cluster health section' do
render
expect(rendered).not_to have_selector('#cluster-health')
expect(rendered).not_to have_content('Cluster health')
end
end
end
end
...@@ -3898,6 +3898,30 @@ msgstr "" ...@@ -3898,6 +3898,30 @@ msgstr ""
msgid "Email patch" msgid "Email patch"
msgstr "" msgstr ""
msgid "EmailError|It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies."
msgstr ""
msgid "EmailError|The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member."
msgstr ""
msgid "EmailError|We couldn't figure out what the email is for. Please create your issue or comment through the web interface."
msgstr ""
msgid "EmailError|We couldn't figure out what the email is in reply to. Please create your comment through the web interface."
msgstr ""
msgid "EmailError|We couldn't figure out what user corresponds to the email. Please create your comment through the web interface."
msgstr ""
msgid "EmailError|We couldn't find the project. Please check if there's any typo."
msgstr ""
msgid "EmailError|You are not allowed to perform this action. If you believe this is in error, contact a staff member."
msgstr ""
msgid "EmailError|Your account has been blocked. If you believe this is in error, contact a staff member."
msgstr ""
msgid "Emails" msgid "Emails"
msgstr "" msgstr ""
...@@ -4279,6 +4303,9 @@ msgstr "" ...@@ -4279,6 +4303,9 @@ msgstr ""
msgid "Error while loading the merge request. Please try again." msgid "Error while loading the merge request. Please try again."
msgstr "" msgstr ""
msgid "Error while migrating %{upload_id}: %{error_message}"
msgstr ""
msgid "Error with Akismet. Please check the logs for more info." msgid "Error with Akismet. Please check the logs for more info."
msgstr "" msgstr ""
...@@ -6229,6 +6256,12 @@ msgstr "" ...@@ -6229,6 +6256,12 @@ msgstr ""
msgid "Job has been successfully erased!" msgid "Job has been successfully erased!"
msgstr "" msgstr ""
msgid "Job has wrong arguments format."
msgstr ""
msgid "Job is missing the `model_type` argument."
msgstr ""
msgid "Job is stuck. Check runners." msgid "Job is stuck. Check runners."
msgstr "" msgstr ""
...@@ -7055,6 +7088,12 @@ msgstr "" ...@@ -7055,6 +7088,12 @@ msgstr ""
msgid "Metrics|e.g. Throughput" msgid "Metrics|e.g. Throughput"
msgstr "" msgstr ""
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
msgid "Migration successful."
msgstr ""
msgid "Milestone" msgid "Milestone"
msgstr "" msgstr ""
...@@ -7175,6 +7214,9 @@ msgstr "" ...@@ -7175,6 +7214,9 @@ msgstr ""
msgid "Most stars" msgid "Most stars"
msgstr "" msgstr ""
msgid "Mount point %{mounted_as} not found in %{model_class}."
msgstr ""
msgid "Move" msgid "Move"
msgstr "" msgstr ""
...@@ -7184,6 +7226,12 @@ msgstr "" ...@@ -7184,6 +7226,12 @@ msgstr ""
msgid "Multiple issue boards" msgid "Multiple issue boards"
msgstr "" msgstr ""
msgid "Multiple model types found: %{model_types}"
msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
...@@ -10926,6 +10974,9 @@ msgstr "" ...@@ -10926,6 +10974,9 @@ msgstr ""
msgid "The roadmap shows the progress of your epics along a timeline" msgid "The roadmap shows the progress of your epics along a timeline"
msgstr "" msgstr ""
msgid "The schedule time must be in the future!"
msgstr ""
msgid "The snippet can be accessed without any authentication." msgid "The snippet can be accessed without any authentication."
msgstr "" msgstr ""
......
...@@ -39,7 +39,9 @@ following call would login to a local [GDK] instance and run all specs in ...@@ -39,7 +39,9 @@ following call would login to a local [GDK] instance and run all specs in
`qa/specs/features`: `qa/specs/features`:
``` ```
bin/qa Test::Instance::All http://localhost:3000 # Make sure to install the dependencies first with `bundle install`
bundle exec bin/qa Test::Instance::All http://localhost:3000
``` ```
Note: If you want to run tests requiring SSH against GDK, you Note: If you want to run tests requiring SSH against GDK, you
...@@ -56,14 +58,14 @@ You can also supply specific tests to run as another parameter. For example, to ...@@ -56,14 +58,14 @@ You can also supply specific tests to run as another parameter. For example, to
run the repository-related specs, you can execute: run the repository-related specs, you can execute:
``` ```
bin/qa Test::Instance::All http://localhost -- qa/specs/features/browser_ui/3_create/repository bundle exec bin/qa Test::Instance::All http://localhost -- qa/specs/features/browser_ui/3_create/repository
``` ```
Since the arguments would be passed to `rspec`, you could use all `rspec` Since the arguments would be passed to `rspec`, you could use all `rspec`
options there. For example, passing `--backtrace` and also line number: options there. For example, passing `--backtrace` and also line number:
``` ```
bin/qa Test::Instance::All http://localhost -- qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb:6 --backtrace bundle exec bin/qa Test::Instance::All http://localhost -- qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb:6 --backtrace
``` ```
Note that the separator `--` is required; all subsequent options will be Note that the separator `--` is required; all subsequent options will be
...@@ -78,7 +80,7 @@ If you need to authenticate as a different user, you can provide the ...@@ -78,7 +80,7 @@ If you need to authenticate as a different user, you can provide the
`GITLAB_USERNAME` and `GITLAB_PASSWORD` environment variables: `GITLAB_USERNAME` and `GITLAB_PASSWORD` environment variables:
``` ```
GITLAB_USERNAME=jsmith GITLAB_PASSWORD=password bin/qa Test::Instance::All https://gitlab.example.com GITLAB_USERNAME=jsmith GITLAB_PASSWORD=password bundle exec bin/qa Test::Instance::All https://gitlab.example.com
``` ```
If your user doesn't have permission to default sandbox group If your user doesn't have permission to default sandbox group
...@@ -86,7 +88,7 @@ If your user doesn't have permission to default sandbox group ...@@ -86,7 +88,7 @@ If your user doesn't have permission to default sandbox group
`GITLAB_SANDBOX_NAME`: `GITLAB_SANDBOX_NAME`:
``` ```
GITLAB_USERNAME=jsmith GITLAB_PASSWORD=password GITLAB_SANDBOX_NAME=jsmith-qa-sandbox bin/qa Test::Instance::All https://gitlab.example.com GITLAB_USERNAME=jsmith GITLAB_PASSWORD=password GITLAB_SANDBOX_NAME=jsmith-qa-sandbox bundle exec bin/qa Test::Instance::All https://gitlab.example.com
``` ```
All [supported environment variables are here](https://gitlab.com/gitlab-org/gitlab-qa/blob/master/docs/what_tests_can_be_run.md#supported-environment-variables). All [supported environment variables are here](https://gitlab.com/gitlab-org/gitlab-qa/blob/master/docs/what_tests_can_be_run.md#supported-environment-variables).
...@@ -121,7 +123,7 @@ tests that are expected to fail while a fix is in progress (similar to how ...@@ -121,7 +123,7 @@ tests that are expected to fail while a fix is in progress (similar to how
can be used). can be used).
``` ```
bin/qa Test::Instance::All http://localhost -- --tag quarantine bundle exec bin/qa Test::Instance::All http://localhost -- --tag quarantine
``` ```
If `quarantine` is used with other tags, tests will only be run if they have at If `quarantine` is used with other tags, tests will only be run if they have at
...@@ -140,7 +142,7 @@ option `--enable-feature FEATURE_FLAG`. For example, to enable the feature flag ...@@ -140,7 +142,7 @@ option `--enable-feature FEATURE_FLAG`. For example, to enable the feature flag
that enforces Gitaly request limits, you would use the command: that enforces Gitaly request limits, you would use the command:
``` ```
bin/qa Test::Instance::All http://localhost --enable-feature gitaly_enforce_requests_limits bundle exec bin/qa Test::Instance::All http://localhost --enable-feature gitaly_enforce_requests_limits
``` ```
This will instruct the QA framework to enable the `gitaly_enforce_requests_limits` This will instruct the QA framework to enable the `gitaly_enforce_requests_limits`
...@@ -153,4 +155,4 @@ flag during a single test, [as you can in unit tests](https://docs.gitlab.com/ee ...@@ -153,4 +155,4 @@ flag during a single test, [as you can in unit tests](https://docs.gitlab.com/ee
but [that capability is planned](https://gitlab.com/gitlab-org/quality/team-tasks/issues/77). but [that capability is planned](https://gitlab.com/gitlab-org/quality/team-tasks/issues/77).
Note also that the `--` separator isn't used because `--enable-feature` is a QA Note also that the `--` separator isn't used because `--enable-feature` is a QA
framework option, not an `rspec` option. framework option, not an `rspec` option.
\ No newline at end of file
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
context 'Create' do # Failure issue: https://gitlab.com/gitlab-org/quality/nightly/issues/94
context 'Create', :quarantine do
describe 'Merge request creation from fork' do describe 'Merge request creation from fork' do
it 'user forks a project, submits a merge request and maintainer merges it' do it 'user forks a project, submits a merge request and maintainer merges it' do
Runtime::Browser.visit(:gitlab, Page::Main::Login) Runtime::Browser.visit(:gitlab, Page::Main::Login)
......
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
# Failure issue: https://gitlab.com/gitlab-org/quality/staging/issues/31 # Failure issue: https://gitlab.com/gitlab-org/quality/nightly/issues/93
context 'Create' do context 'Create', :quarantine do
describe 'Merge request squashing' do describe 'Merge request squashing' do
it 'user squashes commits while merging' do it 'user squashes commits while merging' do
Runtime::Browser.visit(:gitlab, Page::Main::Login) Runtime::Browser.visit(:gitlab, Page::Main::Login)
......
...@@ -139,7 +139,7 @@ describe 'User creates branch and merge request on issue page', :js do ...@@ -139,7 +139,7 @@ describe 'User creates branch and merge request on issue page', :js do
visit project_issue_path(project, issue) visit project_issue_path(project, issue)
end end
it 'disables the create branch button' do it 'disables the create branch button', :quarantine do
expect(page).to have_css('.create-mr-dropdown-wrap .unavailable:not(.hidden)') expect(page).to have_css('.create-mr-dropdown-wrap .unavailable:not(.hidden)')
expect(page).to have_css('.create-mr-dropdown-wrap .available.hidden', visible: false) expect(page).to have_css('.create-mr-dropdown-wrap .available.hidden', visible: false)
expect(page).to have_content /Related merge requests/ expect(page).to have_content /Related merge requests/
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
"project_id": { "type": "integer" }, "project_id": { "type": "integer" },
"relative_position": { "type": ["integer", "null"] }, "relative_position": { "type": ["integer", "null"] },
"time_estimate": { "type": "integer" }, "time_estimate": { "type": "integer" },
"total_time_spent": { "type": "integer" },
"human_time_estimate": { "type": ["string", "null"] },
"human_total_time_spent": { "type": ["string", "null"] },
"weight": { "type": ["integer", "null"] }, "weight": { "type": ["integer", "null"] },
"project": { "project": {
"type": "object", "type": "object",
......
...@@ -15,4 +15,5 @@ globals: ...@@ -15,4 +15,5 @@ globals:
rules: rules:
jest/no-identical-title: error jest/no-identical-title: error
jest/no-focused-tests: error jest/no-focused-tests: error
jest/valid-describe: error
jest/no-jasmine-globals: error jest/no-jasmine-globals: error
...@@ -9,7 +9,7 @@ describe('IDE file templates mutations', () => { ...@@ -9,7 +9,7 @@ describe('IDE file templates mutations', () => {
state = createState(); state = createState();
}); });
describe(types.REQUEST_TEMPLATE_TYPES, () => { describe(`${types.REQUEST_TEMPLATE_TYPES}`, () => {
it('sets isLoading', () => { it('sets isLoading', () => {
mutations[types.REQUEST_TEMPLATE_TYPES](state); mutations[types.REQUEST_TEMPLATE_TYPES](state);
...@@ -17,7 +17,7 @@ describe('IDE file templates mutations', () => { ...@@ -17,7 +17,7 @@ describe('IDE file templates mutations', () => {
}); });
}); });
describe(types.RECEIVE_TEMPLATE_TYPES_ERROR, () => { describe(`${types.RECEIVE_TEMPLATE_TYPES_ERROR}`, () => {
it('sets isLoading', () => { it('sets isLoading', () => {
state.isLoading = true; state.isLoading = true;
...@@ -27,7 +27,7 @@ describe('IDE file templates mutations', () => { ...@@ -27,7 +27,7 @@ describe('IDE file templates mutations', () => {
}); });
}); });
describe(types.RECEIVE_TEMPLATE_TYPES_SUCCESS, () => { describe(`${types.RECEIVE_TEMPLATE_TYPES_SUCCESS}`, () => {
it('sets isLoading to false', () => { it('sets isLoading to false', () => {
state.isLoading = true; state.isLoading = true;
...@@ -43,7 +43,7 @@ describe('IDE file templates mutations', () => { ...@@ -43,7 +43,7 @@ describe('IDE file templates mutations', () => {
}); });
}); });
describe(types.SET_SELECTED_TEMPLATE_TYPE, () => { describe(`${types.SET_SELECTED_TEMPLATE_TYPE}`, () => {
it('sets selectedTemplateType', () => { it('sets selectedTemplateType', () => {
mutations[types.SET_SELECTED_TEMPLATE_TYPE](state, 'type'); mutations[types.SET_SELECTED_TEMPLATE_TYPE](state, 'type');
...@@ -59,7 +59,7 @@ describe('IDE file templates mutations', () => { ...@@ -59,7 +59,7 @@ describe('IDE file templates mutations', () => {
}); });
}); });
describe(types.SET_UPDATE_SUCCESS, () => { describe(`${types.SET_UPDATE_SUCCESS}`, () => {
it('sets updateSuccess', () => { it('sets updateSuccess', () => {
mutations[types.SET_UPDATE_SUCCESS](state, true); mutations[types.SET_UPDATE_SUCCESS](state, true);
......
...@@ -2,7 +2,7 @@ import * as types from '~/import_projects/store/mutation_types'; ...@@ -2,7 +2,7 @@ import * as types from '~/import_projects/store/mutation_types';
import mutations from '~/import_projects/store/mutations'; import mutations from '~/import_projects/store/mutations';
describe('import_projects store mutations', () => { describe('import_projects store mutations', () => {
describe(types.RECEIVE_IMPORT_SUCCESS, () => { describe(`${types.RECEIVE_IMPORT_SUCCESS}`, () => {
it('removes repoId from reposBeingImported and providerRepos, adds to importedProjects', () => { it('removes repoId from reposBeingImported and providerRepos, adds to importedProjects', () => {
const repoId = 1; const repoId = 1;
const state = { const state = {
...@@ -20,7 +20,7 @@ describe('import_projects store mutations', () => { ...@@ -20,7 +20,7 @@ describe('import_projects store mutations', () => {
}); });
}); });
describe(types.RECEIVE_JOBS_SUCCESS, () => { describe(`${types.RECEIVE_JOBS_SUCCESS}`, () => {
it('updates importStatus of existing importedProjects', () => { it('updates importStatus of existing importedProjects', () => {
const repoId = 1; const repoId = 1;
const state = { importedProjects: [{ id: repoId, importStatus: 'started' }] }; const state = { importedProjects: [{ id: repoId, importStatus: 'started' }] };
......
...@@ -23,7 +23,7 @@ const newLine = { ...@@ -23,7 +23,7 @@ const newLine = {
type: 'new', type: 'new',
}; };
describe(SuggestionDiffRow.name, () => { describe('SuggestionDiffRow', () => {
let wrapper; let wrapper;
const factory = (options = {}) => { const factory = (options = {}) => {
......
import { shallowMount, createLocalVue } from '@vue/test-utils'; import { shallowMount, createLocalVue } from '@vue/test-utils';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue'; import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
describe(TimelineEntryItem.name, () => { describe(`TimelineEntryItem`, () => {
let wrapper; let wrapper;
const factory = (options = {}) => { const factory = (options = {}) => {
......
...@@ -2,7 +2,7 @@ import mutations from '~/vuex_shared/modules/modal/mutations'; ...@@ -2,7 +2,7 @@ import mutations from '~/vuex_shared/modules/modal/mutations';
import * as types from '~/vuex_shared/modules/modal/mutation_types'; import * as types from '~/vuex_shared/modules/modal/mutation_types';
describe('Vuex ModalModule mutations', () => { describe('Vuex ModalModule mutations', () => {
describe(types.SHOW, () => { describe(`${types.SHOW}`, () => {
it('sets isVisible to true', () => { it('sets isVisible to true', () => {
const state = { const state = {
isVisible: false, isVisible: false,
...@@ -16,7 +16,7 @@ describe('Vuex ModalModule mutations', () => { ...@@ -16,7 +16,7 @@ describe('Vuex ModalModule mutations', () => {
}); });
}); });
describe(types.HIDE, () => { describe(`${types.HIDE}`, () => {
it('sets isVisible to false', () => { it('sets isVisible to false', () => {
const state = { const state = {
isVisible: true, isVisible: true,
...@@ -30,7 +30,7 @@ describe('Vuex ModalModule mutations', () => { ...@@ -30,7 +30,7 @@ describe('Vuex ModalModule mutations', () => {
}); });
}); });
describe(types.OPEN, () => { describe(`${types.OPEN}`, () => {
it('sets data and sets isVisible to true', () => { it('sets data and sets isVisible to true', () => {
const data = { id: 7 }; const data = { id: 7 };
const state = { const state = {
......
...@@ -157,7 +157,8 @@ describe PipelineSerializer do ...@@ -157,7 +157,8 @@ describe PipelineSerializer do
it 'verifies number of queries', :request_store do it 'verifies number of queries', :request_store do
recorded = ActiveRecord::QueryRecorder.new { subject } recorded = ActiveRecord::QueryRecorder.new { subject }
expect(recorded.count).to be_within(2).of(38) expected_queries = Gitlab.ee? ? 38 : 31
expect(recorded.count).to be_within(2).of(expected_queries)
expect(recorded.cached_count).to eq(0) expect(recorded.cached_count).to eq(0)
end end
end end
...@@ -176,7 +177,8 @@ describe PipelineSerializer do ...@@ -176,7 +177,8 @@ describe PipelineSerializer do
# pipeline. With the same ref this check is cached but if refs are # pipeline. With the same ref this check is cached but if refs are
# different then there is an extra query per ref # different then there is an extra query per ref
# https://gitlab.com/gitlab-org/gitlab-ce/issues/46368 # https://gitlab.com/gitlab-org/gitlab-ce/issues/46368
expect(recorded.count).to be_within(2).of(44) expected_queries = Gitlab.ee? ? 44 : 38
expect(recorded.count).to be_within(2).of(expected_queries)
expect(recorded.cached_count).to eq(0) expect(recorded.cached_count).to eq(0)
end end
end end
......
...@@ -95,7 +95,8 @@ describe Ci::RetryBuildService do ...@@ -95,7 +95,8 @@ describe Ci::RetryBuildService do
end end
it 'has correct number of known attributes' do it 'has correct number of known attributes' do
known_accessors = CLONE_ACCESSORS + REJECT_ACCESSORS + IGNORE_ACCESSORS processed_accessors = CLONE_ACCESSORS + REJECT_ACCESSORS
known_accessors = processed_accessors + IGNORE_ACCESSORS
# :tag_list is a special case, this accessor does not exist # :tag_list is a special case, this accessor does not exist
# in reflected associations, comes from `act_as_taggable` and # in reflected associations, comes from `act_as_taggable` and
...@@ -108,7 +109,8 @@ describe Ci::RetryBuildService do ...@@ -108,7 +109,8 @@ describe Ci::RetryBuildService do
current_accessors.uniq! current_accessors.uniq!
expect(known_accessors).to contain_exactly(*current_accessors) expect(current_accessors).to include(*processed_accessors)
expect(known_accessors).to include(*current_accessors)
end end
end end
......
...@@ -102,8 +102,8 @@ RSpec.configure do |config| ...@@ -102,8 +102,8 @@ RSpec.configure do |config|
config.include PolicyHelpers, type: :policy config.include PolicyHelpers, type: :policy
if ENV['CI'] if ENV['CI']
# This includes the first try, i.e. tests will be run 2 times before failing. # This includes the first try, i.e. tests will be run 4 times before failing.
config.default_retry_count = 2 config.default_retry_count = 4
config.reporter.register_listener( config.reporter.register_listener(
RspecFlaky::Listener.new, RspecFlaky::Listener.new,
:example_passed, :example_passed,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment