Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
e33183d782
commit
477c7a6cc1
|
@ -21,6 +21,8 @@ class Admin::BackgroundMigrationsController < Admin::ApplicationController
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@migration = batched_migration_class.find(params[:id])
|
@migration = batched_migration_class.find(params[:id])
|
||||||
|
|
||||||
|
@failed_jobs = @migration.batched_jobs.with_status(:failed).page(params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
def pause
|
def pause
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
%tr{ role: 'row' }
|
||||||
|
%td{ role: 'cell', data: { label: _('Id') } }
|
||||||
|
= job.id
|
||||||
|
%td{ role: 'cell', data: { label: s_('BackgroundMigrations|Started at') } }
|
||||||
|
= job.started_at
|
||||||
|
%td{ role: 'cell', data: { label: s_('BackgroundMigrations|Finished at') } }
|
||||||
|
= job.finished_at
|
||||||
|
%td{ role: 'cell', data: { label: s_('BackgroundMigrations|Batch size') } }
|
||||||
|
= job.batch_size
|
|
@ -2,6 +2,8 @@
|
||||||
- breadcrumb_title @migration.job_class_name + ': ' + @migration.table_name
|
- breadcrumb_title @migration.job_class_name + ': ' + @migration.table_name
|
||||||
- page_title @migration.job_class_name , _('Background Migrations')
|
- page_title @migration.job_class_name , _('Background Migrations')
|
||||||
|
|
||||||
|
%h3= @migration.job_class_name + ': ' + @migration.table_name
|
||||||
|
|
||||||
.tab-content.gl-tab-content
|
.tab-content.gl-tab-content
|
||||||
.tab-pane.active{ role: 'tabpanel' }
|
.tab-pane.active{ role: 'tabpanel' }
|
||||||
%table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
|
%table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
|
||||||
|
@ -17,6 +19,20 @@
|
||||||
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Created on')
|
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Created on')
|
||||||
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Last updated')
|
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Last updated')
|
||||||
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status')
|
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status')
|
||||||
%th.table-th-transparent.border-bottom{ role: 'cell' }
|
|
||||||
%tbody{ role: 'rowgroup' }
|
%tbody{ role: 'rowgroup' }
|
||||||
= render partial: 'migration_full_information', migration: @migration
|
= render partial: 'migration_full_information', migration: @migration
|
||||||
|
|
||||||
|
- if @migration.batched_jobs.with_status(:failed).any?
|
||||||
|
%h5= s_('BackgroundMigrations|Failed jobs:')
|
||||||
|
|
||||||
|
%table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
|
||||||
|
%thead{ role: 'rowgroup' }
|
||||||
|
%tr{ role: 'row' }
|
||||||
|
%th{ role: 'cell' }= _('Id')
|
||||||
|
%th{ role: 'cell' }= s_('BackgroundMigrations|Started at')
|
||||||
|
%th{ role: 'cell' }= s_('BackgroundMigrations|Finished at')
|
||||||
|
%th{ role: 'cell' }= s_('BackgroundMigrations|Batch size')
|
||||||
|
%tbody{ role: 'rowgroup' }
|
||||||
|
= render partial: 'job', collection: @failed_jobs
|
||||||
|
|
||||||
|
= paginate_collection @failed_jobs
|
||||||
|
|
|
@ -3,7 +3,7 @@ table_name: issue_customer_relations_contacts
|
||||||
classes:
|
classes:
|
||||||
- CustomerRelations::IssueContact
|
- CustomerRelations::IssueContact
|
||||||
feature_categories:
|
feature_categories:
|
||||||
- purchase
|
- team_planning
|
||||||
description: TODO
|
description: Holds Customer Relations (CRM) Contacts
|
||||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71007
|
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71007
|
||||||
milestone: '14.4'
|
milestone: '14.4'
|
||||||
|
|
|
@ -47,11 +47,11 @@ GET /projects/:id/merge_requests/:merge_request_iid/status_checks
|
||||||
> - Introduced in GitLab 14.9, `passed` status to pass external status checks. Introduced [with a flag](../administration/feature_flags.md) named `status_checks_add_status_field`. Disabled by default.
|
> - Introduced in GitLab 14.9, `passed` status to pass external status checks. Introduced [with a flag](../administration/feature_flags.md) named `status_checks_add_status_field`. Disabled by default.
|
||||||
> - Introduced in GitLab 14.9, `failed` status to fail external status checks. Introduced [with a flag](../administration/feature_flags.md) named `status_checks_add_status_field`. Disabled by default.
|
> - Introduced in GitLab 14.9, `failed` status to fail external status checks. Introduced [with a flag](../administration/feature_flags.md) named `status_checks_add_status_field`. Disabled by default.
|
||||||
> - `pass` status to pass checks is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/339039) in GitLab 14.9. Replaced with `passed`.
|
> - `pass` status to pass checks is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/339039) in GitLab 14.9. Replaced with `passed`.
|
||||||
|
> - Support for `failed` and `passed` [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/353836) in GitLab 15.0.
|
||||||
|
|
||||||
FLAG:
|
FLAG:
|
||||||
On self-managed GitLab, by default setting `passed` instead of `pass` is unavailable. Also, setting `failed` is unavailable by default. To support
|
To remove support for `failed` checks (and `pass` instead of `passed`), ask an administrator to
|
||||||
setting `passed` and `failed` instead of only `pass`, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named
|
[disable the feature flag](../administration/feature_flags.md) named `status_checks_add_status_field`.
|
||||||
`status_checks_add_status_field`. On GitLab.com, this feature is not available.
|
|
||||||
|
|
||||||
For a single merge request, use the API to inform GitLab that a merge request has passed a check by an external service.
|
For a single merge request, use the API to inform GitLab that a merge request has passed a check by an external service.
|
||||||
To set the status of an external check, the personal access token used must belong to a user with at least the Developer role on the target project of the merge request.
|
To set the status of an external check, the personal access token used must belong to a user with at least the Developer role on the target project of the merge request.
|
||||||
|
@ -65,13 +65,12 @@ POST /projects/:id/merge_requests/:merge_request_iid/status_check_responses
|
||||||
**Parameters:**
|
**Parameters:**
|
||||||
|
|
||||||
| Attribute | Type | Required | Description |
|
| Attribute | Type | Required | Description |
|
||||||
| -------------------------- | ------- | -------- | ---------------------------------------------------------------------------- |
|
| -------------------------- | ------- | -------- |----------------------------------------------------------|
|
||||||
| `id` | integer | yes | ID of a project |
|
| `id` | integer | yes | ID of a project |
|
||||||
| `merge_request_iid` | integer | yes | IID of a merge request |
|
| `merge_request_iid` | integer | yes | IID of a merge request |
|
||||||
| `sha` | string | yes | SHA at `HEAD` of the source branch |
|
| `sha` | string | yes | SHA at `HEAD` of the source branch |
|
||||||
| `external_status_check_id` | integer | yes | ID of an external status check |
|
| `external_status_check_id` | integer | yes | ID of an external status check |
|
||||||
| `status` | string | no | Set to `passed` to pass the check or `failed` to fail it (GitLab 14.9 and later with feature flag `status_checks_add_status_field` enabled) |
|
| `status` | string | no | Set to `passed` to pass the check or `failed` to fail it |
|
||||||
| `status` | string | no | Set to `pass` to pass the check (GitLab 14.0 to GitLab 14.8, and GitLab 14.9 and later with feature flag `status_checks_add_status_field` disabled) |
|
|
||||||
|
|
||||||
NOTE:
|
NOTE:
|
||||||
`sha` must be the SHA at the `HEAD` of the merge request's source branch.
|
`sha` must be the SHA at the `HEAD` of the merge request's source branch.
|
||||||
|
|
|
@ -379,18 +379,24 @@ sudo -u git -H bundle exec rake gitlab:backup:create GITLAB_BACKUP_MAX_CONCURREN
|
||||||
|
|
||||||
> - Introduced in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `incremental_repository_backup`. Disabled by default.
|
> - Introduced in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `incremental_repository_backup`. Disabled by default.
|
||||||
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/355945) in GitLab 14.10.
|
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/355945) in GitLab 14.10.
|
||||||
|
> - `PREVIOUS_BACKUP` option [introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/4184) in GitLab 15.0.
|
||||||
|
|
||||||
FLAG:
|
FLAG:
|
||||||
On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `incremental_repository_backup`.
|
On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `incremental_repository_backup`.
|
||||||
On GitLab.com, this feature is not available.
|
On GitLab.com, this feature is not available.
|
||||||
|
|
||||||
Incremental backups can be faster than full backups because they only pack changes since the last backup into the backup
|
Incremental backups can be faster than full backups because they only pack changes since the last backup into the backup
|
||||||
bundle for each repository. There must be an existing backup to create an incremental backup from and this backup will be overwritten. You can use the `BACKUP=timestamp_of_backup` option to choose which backup will be used.
|
bundle for each repository. There must be an existing backup to create an incremental backup from:
|
||||||
|
|
||||||
|
- In GitLab 14.9 and 14.10, use the `BACKUP=<timestamp_of_backup>` option to choose the backup to use. The chosen previous backup is overwritten.
|
||||||
|
- In GitLab 15.0 and later, use the `PREVIOUS_BACKUP=<timestamp_of_backup>` option to choose the backup to use. By default, a backup file is created
|
||||||
|
as documented in the [Backup timestamp](#backup-timestamp) section. You can override the `[TIMESTAMP]` portion of the filename by setting the
|
||||||
|
[`BACKUP` environment variable](#backup-filename).
|
||||||
|
|
||||||
To create an incremental backup, run:
|
To create an incremental backup, run:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo gitlab-backup create INCREMENTAL=yes
|
sudo gitlab-backup create INCREMENTAL=yes PREVIOUS_BACKUP=<timestamp_of_backup>
|
||||||
```
|
```
|
||||||
|
|
||||||
Incremental backups can also be created from [an untarred backup](#skipping-tar-creation) by using `SKIP=tar`:
|
Incremental backups can also be created from [an untarred backup](#skipping-tar-creation) by using `SKIP=tar`:
|
||||||
|
@ -1399,6 +1405,7 @@ To prepare the new server:
|
||||||
1. Copy the
|
1. Copy the
|
||||||
[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
|
[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
|
||||||
from the old server to avoid man-in-the-middle attack warnings.
|
from the old server to avoid man-in-the-middle attack warnings.
|
||||||
|
See [Manually replicate the primary site’s SSH host keys](../administration/geo/replication/configuration.md#step-2-manually-replicate-the-primary-sites-ssh-host-keys) for example steps.
|
||||||
1. [Install and configure GitLab](https://about.gitlab.com/install) except
|
1. [Install and configure GitLab](https://about.gitlab.com/install) except
|
||||||
[incoming email](../administration/incoming_email.md):
|
[incoming email](../administration/incoming_email.md):
|
||||||
1. Install GitLab.
|
1. Install GitLab.
|
||||||
|
|
|
@ -37,9 +37,10 @@ module Backup
|
||||||
|
|
||||||
def create
|
def create
|
||||||
if incremental?
|
if incremental?
|
||||||
unpack
|
unpack(ENV.fetch('PREVIOUS_BACKUP', ENV['BACKUP']))
|
||||||
read_backup_information
|
read_backup_information
|
||||||
verify_backup_version
|
verify_backup_version
|
||||||
|
update_backup_information
|
||||||
end
|
end
|
||||||
|
|
||||||
@definitions.keys.each do |task_name|
|
@definitions.keys.each do |task_name|
|
||||||
|
@ -79,7 +80,7 @@ module Backup
|
||||||
end
|
end
|
||||||
|
|
||||||
puts_time "Dumping #{definition.human_name} ... ".color(:blue)
|
puts_time "Dumping #{definition.human_name} ... ".color(:blue)
|
||||||
definition.task.dump(File.join(Gitlab.config.backup.path, definition.destination_path), backup_id)
|
definition.task.dump(File.join(Gitlab.config.backup.path, definition.destination_path), full_backup_id)
|
||||||
puts_time "Dumping #{definition.human_name} ... ".color(:blue) + "done".color(:green)
|
puts_time "Dumping #{definition.human_name} ... ".color(:blue) + "done".color(:green)
|
||||||
|
|
||||||
rescue Backup::DatabaseBackupError, Backup::FileBackupError => e
|
rescue Backup::DatabaseBackupError, Backup::FileBackupError => e
|
||||||
|
@ -87,7 +88,7 @@ module Backup
|
||||||
end
|
end
|
||||||
|
|
||||||
def restore
|
def restore
|
||||||
cleanup_required = unpack
|
cleanup_required = unpack(ENV['BACKUP'])
|
||||||
read_backup_information
|
read_backup_information
|
||||||
verify_backup_version
|
verify_backup_version
|
||||||
|
|
||||||
|
@ -248,6 +249,17 @@ module Backup
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_backup_information
|
||||||
|
@backup_information.merge!(
|
||||||
|
full_backup_id: full_backup_id,
|
||||||
|
db_version: ActiveRecord::Migrator.current_version.to_s,
|
||||||
|
backup_created_at: Time.zone.now,
|
||||||
|
gitlab_version: Gitlab::VERSION,
|
||||||
|
tar_version: tar_version,
|
||||||
|
installation_type: Gitlab::INSTALLATION_TYPE
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def backup_information
|
def backup_information
|
||||||
raise Backup::Error, "#{MANIFEST_NAME} not yet loaded" unless @backup_information
|
raise Backup::Error, "#{MANIFEST_NAME} not yet loaded" unless @backup_information
|
||||||
|
|
||||||
|
@ -374,8 +386,8 @@ module Backup
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def unpack
|
def unpack(source_backup_id)
|
||||||
if ENV['BACKUP'].blank? && non_tarred_backup?
|
if source_backup_id.blank? && non_tarred_backup?
|
||||||
puts_time "Non tarred backup found in #{backup_path}, using that"
|
puts_time "Non tarred backup found in #{backup_path}, using that"
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
@ -387,14 +399,14 @@ module Backup
|
||||||
puts_time "No backups found in #{backup_path}"
|
puts_time "No backups found in #{backup_path}"
|
||||||
puts_time "Please make sure that file name ends with #{FILE_NAME_SUFFIX}"
|
puts_time "Please make sure that file name ends with #{FILE_NAME_SUFFIX}"
|
||||||
exit 1
|
exit 1
|
||||||
elsif backup_file_list.many? && ENV["BACKUP"].nil?
|
elsif backup_file_list.many? && source_backup_id.nil?
|
||||||
puts_time 'Found more than one backup:'
|
puts_time 'Found more than one backup:'
|
||||||
# print list of available backups
|
# print list of available backups
|
||||||
puts_time " " + available_timestamps.join("\n ")
|
puts_time " " + available_timestamps.join("\n ")
|
||||||
|
|
||||||
if incremental?
|
if incremental?
|
||||||
puts_time 'Please specify which one you want to create an incremental backup for:'
|
puts_time 'Please specify which one you want to create an incremental backup for:'
|
||||||
puts_time 'rake gitlab:backup:create INCREMENTAL=true BACKUP=timestamp_of_backup'
|
puts_time 'rake gitlab:backup:create INCREMENTAL=true PREVIOUS_BACKUP=timestamp_of_backup'
|
||||||
else
|
else
|
||||||
puts_time 'Please specify which one you want to restore:'
|
puts_time 'Please specify which one you want to restore:'
|
||||||
puts_time 'rake gitlab:backup:restore BACKUP=timestamp_of_backup'
|
puts_time 'rake gitlab:backup:restore BACKUP=timestamp_of_backup'
|
||||||
|
@ -403,8 +415,8 @@ module Backup
|
||||||
exit 1
|
exit 1
|
||||||
end
|
end
|
||||||
|
|
||||||
tar_file = if ENV['BACKUP'].present?
|
tar_file = if source_backup_id.present?
|
||||||
File.basename(ENV['BACKUP']) + FILE_NAME_SUFFIX
|
File.basename(source_backup_id) + FILE_NAME_SUFFIX
|
||||||
else
|
else
|
||||||
backup_file_list.first
|
backup_file_list.first
|
||||||
end
|
end
|
||||||
|
@ -501,8 +513,15 @@ module Backup
|
||||||
@tar_file ||= "#{backup_id}#{FILE_NAME_SUFFIX}"
|
@tar_file ||= "#{backup_id}#{FILE_NAME_SUFFIX}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def full_backup_id
|
||||||
|
full_backup_id = backup_information[:full_backup_id]
|
||||||
|
full_backup_id ||= File.basename(ENV['PREVIOUS_BACKUP']) if ENV['PREVIOUS_BACKUP'].present?
|
||||||
|
full_backup_id ||= backup_id
|
||||||
|
full_backup_id
|
||||||
|
end
|
||||||
|
|
||||||
def backup_id
|
def backup_id
|
||||||
@backup_id ||= if ENV['BACKUP'].present?
|
if ENV['BACKUP'].present?
|
||||||
File.basename(ENV['BACKUP'])
|
File.basename(ENV['BACKUP'])
|
||||||
else
|
else
|
||||||
"#{backup_information[:backup_created_at].strftime('%s_%Y_%m_%d_')}#{backup_information[:gitlab_version]}"
|
"#{backup_information[:backup_created_at].strftime('%s_%Y_%m_%d_')}#{backup_information[:gitlab_version]}"
|
||||||
|
|
|
@ -5543,9 +5543,21 @@ msgstr ""
|
||||||
msgid "BackgroundMigrations|Background migrations are used to perform data migrations whenever a migration exceeds the time limits in our guidelines. %{linkStart}Learn more%{linkEnd}"
|
msgid "BackgroundMigrations|Background migrations are used to perform data migrations whenever a migration exceeds the time limits in our guidelines. %{linkStart}Learn more%{linkEnd}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "BackgroundMigrations|Batch size"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "BackgroundMigrations|Database"
|
msgid "BackgroundMigrations|Database"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "BackgroundMigrations|Failed jobs:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "BackgroundMigrations|Finished at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "BackgroundMigrations|Started at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Badges"
|
msgid "Badges"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -44407,9 +44419,6 @@ msgstr ""
|
||||||
msgid "entries cannot contain HTML tags"
|
msgid "entries cannot contain HTML tags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "environment_id parameter is required when type is container_policy"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "epic"
|
msgid "epic"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ module QA
|
||||||
initial_wiki.project.remove_via_api!
|
initial_wiki.project.remove_via_api!
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates a formatted Wiki page with an image uploaded', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/361545', type: :investigating }, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347640' do
|
it 'creates a formatted Wiki page with an image uploaded', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347640' do
|
||||||
initial_wiki.visit!
|
initial_wiki.visit!
|
||||||
|
|
||||||
Page::Project::Wiki::Show.perform(&:click_new_page)
|
Page::Project::Wiki::Show.perform(&:click_new_page)
|
||||||
|
|
|
@ -430,12 +430,6 @@ RSpec.describe "Admin Runners" do
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when visiting outdated URLs" do
|
context "when visiting outdated URLs" do
|
||||||
it 'updates NOT_CONNECTED runner status to NEVER_CONNECTED' do
|
|
||||||
visit admin_runners_path('status[]': 'NOT_CONNECTED')
|
|
||||||
|
|
||||||
expect(page).to have_current_path(admin_runners_path('status[]': 'NEVER_CONTACTED') )
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'updates ACTIVE runner status to paused=false' do
|
it 'updates ACTIVE runner status to paused=false' do
|
||||||
visit admin_runners_path('status[]': 'ACTIVE')
|
visit admin_runners_path('status[]': 'ACTIVE')
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,28 @@ RSpec.describe "Admin > Admin sees background migrations" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'can view failed jobs' do
|
||||||
|
visit admin_background_migration_path(failed_migration)
|
||||||
|
|
||||||
|
within '#content-body' do
|
||||||
|
expect(page).to have_content('Failed jobs')
|
||||||
|
expect(page).to have_content('Id')
|
||||||
|
expect(page).to have_content('Started at')
|
||||||
|
expect(page).to have_content('Finished at')
|
||||||
|
expect(page).to have_content('Batch size')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when there are no failed jobs' do
|
||||||
|
it 'dos not display failed jobs' do
|
||||||
|
visit admin_background_migration_path(active_migration)
|
||||||
|
|
||||||
|
within '#content-body' do
|
||||||
|
expect(page).not_to have_content('Failed jobs')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it 'can view queued migrations and pause and resume them' do
|
it 'can view queued migrations and pause and resume them' do
|
||||||
visit admin_background_migrations_path
|
visit admin_background_migrations_path
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,7 @@ RSpec.describe Backup::Manager do
|
||||||
let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz task2.tar.gz} }
|
let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz task2.tar.gz} }
|
||||||
let(:backup_time) { Time.utc(2019, 1, 1) }
|
let(:backup_time) { Time.utc(2019, 1, 1) }
|
||||||
let(:backup_id) { "1546300800_2019_01_01_#{Gitlab::VERSION}" }
|
let(:backup_id) { "1546300800_2019_01_01_#{Gitlab::VERSION}" }
|
||||||
|
let(:full_backup_id) { backup_id }
|
||||||
let(:pack_tar_file) { "#{backup_id}_gitlab_backup.tar" }
|
let(:pack_tar_file) { "#{backup_id}_gitlab_backup.tar" }
|
||||||
let(:pack_tar_system_options) { { out: [pack_tar_file, 'w', Gitlab.config.backup.archive_permissions] } }
|
let(:pack_tar_system_options) { { out: [pack_tar_file, 'w', Gitlab.config.backup.archive_permissions] } }
|
||||||
let(:pack_tar_cmdline) { ['tar', '-cf', '-', *expected_backup_contents, pack_tar_system_options] }
|
let(:pack_tar_cmdline) { ['tar', '-cf', '-', *expected_backup_contents, pack_tar_system_options] }
|
||||||
|
@ -166,8 +167,8 @@ RSpec.describe Backup::Manager do
|
||||||
allow(Gitlab::BackupLogger).to receive(:info)
|
allow(Gitlab::BackupLogger).to receive(:info)
|
||||||
allow(Kernel).to receive(:system).and_return(true)
|
allow(Kernel).to receive(:system).and_return(true)
|
||||||
|
|
||||||
allow(task1).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task1.tar.gz'), backup_id)
|
allow(task1).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task1.tar.gz'), full_backup_id)
|
||||||
allow(task2).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz'), backup_id)
|
allow(task2).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz'), full_backup_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'executes tar' do
|
it 'executes tar' do
|
||||||
|
@ -588,6 +589,14 @@ RSpec.describe Backup::Manager do
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(Kernel).not_to have_received(:system).with(*pack_tar_cmdline)
|
expect(Kernel).not_to have_received(:system).with(*pack_tar_cmdline)
|
||||||
|
expect(YAML.load_file(File.join(Gitlab.config.backup.path, 'backup_information.yml'))).to include(
|
||||||
|
backup_created_at: backup_time.localtime,
|
||||||
|
db_version: be_a(String),
|
||||||
|
gitlab_version: Gitlab::VERSION,
|
||||||
|
installation_type: Gitlab::INSTALLATION_TYPE,
|
||||||
|
skipped: 'tar',
|
||||||
|
tar_version: be_a(String)
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -595,11 +604,11 @@ RSpec.describe Backup::Manager do
|
||||||
let(:incremental_env) { 'true' }
|
let(:incremental_env) { 'true' }
|
||||||
let(:gitlab_version) { Gitlab::VERSION }
|
let(:gitlab_version) { Gitlab::VERSION }
|
||||||
let(:backup_id) { "1546300800_2019_01_01_#{gitlab_version}" }
|
let(:backup_id) { "1546300800_2019_01_01_#{gitlab_version}" }
|
||||||
let(:pack_tar_file) { "#{backup_id}_gitlab_backup.tar" }
|
let(:unpack_tar_file) { "#{full_backup_id}_gitlab_backup.tar" }
|
||||||
let(:unpack_tar_cmdline) { ['tar', '-xf', pack_tar_file] }
|
let(:unpack_tar_cmdline) { ['tar', '-xf', unpack_tar_file] }
|
||||||
let(:backup_information) do
|
let(:backup_information) do
|
||||||
{
|
{
|
||||||
backup_created_at: backup_time,
|
backup_created_at: Time.zone.parse('2018-01-01'),
|
||||||
gitlab_version: gitlab_version
|
gitlab_version: gitlab_version
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -682,7 +691,9 @@ RSpec.describe Backup::Manager do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'unpacks and packs the backup' do
|
it 'unpacks and packs the backup' do
|
||||||
|
travel_to(backup_time) do
|
||||||
subject.create # rubocop:disable Rails/SaveBang
|
subject.create # rubocop:disable Rails/SaveBang
|
||||||
|
end
|
||||||
|
|
||||||
expect(Kernel).to have_received(:system).with(*unpack_tar_cmdline)
|
expect(Kernel).to have_received(:system).with(*unpack_tar_cmdline)
|
||||||
expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
|
expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
|
||||||
|
@ -732,21 +743,137 @@ RSpec.describe Backup::Manager do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when PREVIOUS_BACKUP variable is set to a non-existing file' do
|
||||||
|
before do
|
||||||
|
allow(Dir).to receive(:glob).and_return(
|
||||||
|
[
|
||||||
|
'1451606400_2016_01_01_gitlab_backup.tar'
|
||||||
|
]
|
||||||
|
)
|
||||||
|
allow(File).to receive(:exist?).and_return(false)
|
||||||
|
|
||||||
|
stub_env('PREVIOUS_BACKUP', 'wrong')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails the operation and prints an error' do
|
||||||
|
expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
|
||||||
|
expect(File).to have_received(:exist?).with('wrong_gitlab_backup.tar')
|
||||||
|
expect(progress).to have_received(:puts)
|
||||||
|
.with(a_string_matching('The backup file wrong_gitlab_backup.tar does not exist'))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when PREVIOUS_BACKUP variable is set to a correct file' do
|
||||||
|
let(:full_backup_id) { 'some_previous_backup' }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(Gitlab::BackupLogger).to receive(:info)
|
||||||
|
allow(Dir).to receive(:glob).and_return(
|
||||||
|
[
|
||||||
|
'some_previous_backup_gitlab_backup.tar'
|
||||||
|
]
|
||||||
|
)
|
||||||
|
allow(File).to receive(:exist?).with('some_previous_backup_gitlab_backup.tar').and_return(true)
|
||||||
|
allow(Kernel).to receive(:system).and_return(true)
|
||||||
|
|
||||||
|
stub_env('PREVIOUS_BACKUP', '/ignored/path/some_previous_backup')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'unpacks and packs the backup' do
|
||||||
|
travel_to(backup_time) do
|
||||||
|
subject.create # rubocop:disable Rails/SaveBang
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(Kernel).to have_received(:system).with(*unpack_tar_cmdline)
|
||||||
|
expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'untar fails' do
|
||||||
|
before do
|
||||||
|
expect(Kernel).to receive(:system).with(*unpack_tar_cmdline).and_return(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs a failure' do
|
||||||
|
expect do
|
||||||
|
travel_to(backup_time) do
|
||||||
|
subject.create # rubocop:disable Rails/SaveBang
|
||||||
|
end
|
||||||
|
end.to raise_error(SystemExit)
|
||||||
|
|
||||||
|
expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Unpacking backup failed')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'tar fails' do
|
||||||
|
before do
|
||||||
|
expect(Kernel).to receive(:system).with(*pack_tar_cmdline).and_return(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs a failure' do
|
||||||
|
expect do
|
||||||
|
travel_to(backup_time) do
|
||||||
|
subject.create # rubocop:disable Rails/SaveBang
|
||||||
|
end
|
||||||
|
end.to raise_error(Backup::Error, 'Backup failed')
|
||||||
|
|
||||||
|
expect(Gitlab::BackupLogger).to have_received(:info).with(message: "Creating archive #{pack_tar_file} failed")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'on version mismatch' do
|
||||||
|
let(:backup_information) do
|
||||||
|
{
|
||||||
|
backup_created_at: Time.zone.parse('2018-01-01'),
|
||||||
|
gitlab_version: "not #{gitlab_version}"
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'stops the process' do
|
||||||
|
expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
|
||||||
|
expect(progress).to have_received(:puts)
|
||||||
|
.with(a_string_matching('GitLab version mismatch'))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when there is a non-tarred backup in the directory' do
|
context 'when there is a non-tarred backup in the directory' do
|
||||||
|
let(:full_backup_id) { "1514764800_2018_01_01_#{Gitlab::VERSION}" }
|
||||||
|
let(:backup_information) do
|
||||||
|
{
|
||||||
|
backup_created_at: Time.zone.parse('2018-01-01'),
|
||||||
|
gitlab_version: gitlab_version,
|
||||||
|
skipped: 'tar'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
before do
|
before do
|
||||||
allow(Dir).to receive(:glob).and_return(
|
allow(Dir).to receive(:glob).and_return(
|
||||||
[
|
[
|
||||||
'backup_information.yml'
|
'backup_information.yml'
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
allow(File).to receive(:exist?).and_return(true)
|
allow(File).to receive(:exist?).with(File.join(Gitlab.config.backup.path, 'backup_information.yml')).and_return(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'selects the non-tarred backup to restore from' do
|
after do
|
||||||
|
FileUtils.rm(File.join(Gitlab.config.backup.path, 'backup_information.yml'), force: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'updates the non-tarred backup' do
|
||||||
|
travel_to(backup_time) do
|
||||||
subject.create # rubocop:disable Rails/SaveBang
|
subject.create # rubocop:disable Rails/SaveBang
|
||||||
|
end
|
||||||
|
|
||||||
expect(progress).to have_received(:puts)
|
expect(progress).to have_received(:puts)
|
||||||
.with(a_string_matching('Non tarred backup found '))
|
.with(a_string_matching('Non tarred backup found '))
|
||||||
|
expect(progress).to have_received(:puts)
|
||||||
|
.with(a_string_matching("Backup #{backup_id} is done"))
|
||||||
|
expect(YAML.load_file(File.join(Gitlab.config.backup.path, 'backup_information.yml'))).to include(
|
||||||
|
backup_created_at: backup_time,
|
||||||
|
full_backup_id: full_backup_id,
|
||||||
|
gitlab_version: Gitlab::VERSION,
|
||||||
|
skipped: 'tar'
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'on version mismatch' do
|
context 'on version mismatch' do
|
||||||
|
|
|
@ -27,6 +27,17 @@ RSpec.describe Gitlab::Ci::Ansi2json do
|
||||||
])
|
])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'ignores empty newlines' do
|
||||||
|
expect(convert_json("Hello\n\nworld")).to eq([
|
||||||
|
{ offset: 0, content: [{ text: 'Hello' }] },
|
||||||
|
{ offset: 7, content: [{ text: 'world' }] }
|
||||||
|
])
|
||||||
|
expect(convert_json("Hello\r\n\r\nworld")).to eq([
|
||||||
|
{ offset: 0, content: [{ text: 'Hello' }] },
|
||||||
|
{ offset: 9, content: [{ text: 'world' }] }
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
it 'replace the current line when encountering \r' do
|
it 'replace the current line when encountering \r' do
|
||||||
expect(convert_json("Hello\rworld")).to eq([
|
expect(convert_json("Hello\rworld")).to eq([
|
||||||
{ offset: 0, content: [{ text: 'world' }] }
|
{ offset: 0, content: [{ text: 'world' }] }
|
||||||
|
|
|
@ -10,7 +10,9 @@ RSpec.describe Admin::BackgroundMigrationsController, :enable_admin_mode do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET #show' do
|
describe 'GET #show' do
|
||||||
|
context 'when the migration is valid' do
|
||||||
let(:migration) { create(:batched_background_migration) }
|
let(:migration) { create(:batched_background_migration) }
|
||||||
|
let!(:failed_job) { create(:batched_background_migration_job, :failed, batched_migration: migration) }
|
||||||
|
|
||||||
it 'fetches the migration' do
|
it 'fetches the migration' do
|
||||||
get admin_background_migration_path(migration)
|
get admin_background_migration_path(migration)
|
||||||
|
@ -18,6 +20,13 @@ RSpec.describe Admin::BackgroundMigrationsController, :enable_admin_mode do
|
||||||
expect(response).to have_gitlab_http_status(:ok)
|
expect(response).to have_gitlab_http_status(:ok)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'returns failed jobs' do
|
||||||
|
get admin_background_migration_path(migration)
|
||||||
|
|
||||||
|
expect(assigns(:failed_jobs)).to match_array([failed_job])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when the migration does not exist' do
|
context 'when the migration does not exist' do
|
||||||
let(:invalid_migration) { non_existing_record_id }
|
let(:invalid_migration) { non_existing_record_id }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue