Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
64667f74b1
commit
5b72415235
|
@ -1123,7 +1123,6 @@ Layout/LineLength:
|
||||||
- 'ee/app/controllers/concerns/ee/issuable_collections.rb'
|
- 'ee/app/controllers/concerns/ee/issuable_collections.rb'
|
||||||
- 'ee/app/controllers/concerns/group_invite_members.rb'
|
- 'ee/app/controllers/concerns/group_invite_members.rb'
|
||||||
- 'ee/app/controllers/concerns/insights_actions.rb'
|
- 'ee/app/controllers/concerns/insights_actions.rb'
|
||||||
- 'ee/app/controllers/concerns/registrations/create_project.rb'
|
|
||||||
- 'ee/app/controllers/ee/admin/dev_ops_report_controller.rb'
|
- 'ee/app/controllers/ee/admin/dev_ops_report_controller.rb'
|
||||||
- 'ee/app/controllers/ee/admin/users_controller.rb'
|
- 'ee/app/controllers/ee/admin/users_controller.rb'
|
||||||
- 'ee/app/controllers/ee/application_controller.rb'
|
- 'ee/app/controllers/ee/application_controller.rb'
|
||||||
|
@ -1160,8 +1159,6 @@ Layout/LineLength:
|
||||||
- 'ee/app/controllers/projects/requirements_management/requirements_controller.rb'
|
- 'ee/app/controllers/projects/requirements_management/requirements_controller.rb'
|
||||||
- 'ee/app/controllers/projects/security/policies_controller.rb'
|
- 'ee/app/controllers/projects/security/policies_controller.rb'
|
||||||
- 'ee/app/controllers/projects/security/vulnerabilities/notes_controller.rb'
|
- 'ee/app/controllers/projects/security/vulnerabilities/notes_controller.rb'
|
||||||
- 'ee/app/controllers/registrations/groups_controller.rb'
|
|
||||||
- 'ee/app/controllers/registrations/groups_projects_controller.rb'
|
|
||||||
- 'ee/app/controllers/subscriptions_controller.rb'
|
- 'ee/app/controllers/subscriptions_controller.rb'
|
||||||
- 'ee/app/controllers/trial_registrations_controller.rb'
|
- 'ee/app/controllers/trial_registrations_controller.rb'
|
||||||
- 'ee/app/controllers/trials_controller.rb'
|
- 'ee/app/controllers/trials_controller.rb'
|
||||||
|
@ -1862,8 +1859,6 @@ Layout/LineLength:
|
||||||
- 'ee/spec/controllers/projects/subscriptions_controller_spec.rb'
|
- 'ee/spec/controllers/projects/subscriptions_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
|
- 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/projects_controller_spec.rb'
|
- 'ee/spec/controllers/projects_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/registrations/groups_controller_spec.rb'
|
|
||||||
- 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
|
|
||||||
- 'ee/spec/controllers/registrations/welcome_controller_spec.rb'
|
- 'ee/spec/controllers/registrations/welcome_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/subscriptions/groups_controller_spec.rb'
|
- 'ee/spec/controllers/subscriptions/groups_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/subscriptions_controller_spec.rb'
|
- 'ee/spec/controllers/subscriptions_controller_spec.rb'
|
||||||
|
@ -1979,7 +1974,6 @@ Layout/LineLength:
|
||||||
- 'ee/spec/features/projects_spec.rb'
|
- 'ee/spec/features/projects_spec.rb'
|
||||||
- 'ee/spec/features/promotion_spec.rb'
|
- 'ee/spec/features/promotion_spec.rb'
|
||||||
- 'ee/spec/features/read_only_spec.rb'
|
- 'ee/spec/features/read_only_spec.rb'
|
||||||
- 'ee/spec/features/registrations/combined_registration_spec.rb'
|
|
||||||
- 'ee/spec/features/search/elastic/global_search_spec.rb'
|
- 'ee/spec/features/search/elastic/global_search_spec.rb'
|
||||||
- 'ee/spec/features/search/elastic/project_search_spec.rb'
|
- 'ee/spec/features/search/elastic/project_search_spec.rb'
|
||||||
- 'ee/spec/features/search/elastic/snippet_search_spec.rb'
|
- 'ee/spec/features/search/elastic/snippet_search_spec.rb'
|
||||||
|
@ -2960,8 +2954,6 @@ Layout/LineLength:
|
||||||
- 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/controllers/concerns/description_diff_actions_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/controllers/concerns/description_diff_actions_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/controllers/projects/license_scanning_report_comparison_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/controllers/projects/license_scanning_report_comparison_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/controllers/registrations/groups_controller_shared_examples.rb'
|
|
||||||
- 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
|
|
||||||
- 'ee/spec/support/shared_examples/features/epics_filtered_search_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/features/epics_filtered_search_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/features/over_free_user_limit_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/features/over_free_user_limit_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
|
||||||
|
@ -3017,7 +3009,6 @@ Layout/LineLength:
|
||||||
- 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
|
- 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/operations/environments.html.haml_spec.rb'
|
- 'ee/spec/views/operations/environments.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
|
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/registrations/groups_projects/new.html.haml_spec.rb'
|
|
||||||
- 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
|
- 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/shared/_mirror_status.html.haml_spec.rb'
|
- 'ee/spec/views/shared/_mirror_status.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/shared/_namespace_user_cap_reached_alert.html.haml_spec.rb'
|
- 'ee/spec/views/shared/_namespace_user_cap_reached_alert.html.haml_spec.rb'
|
||||||
|
|
|
@ -64,7 +64,6 @@ RSpec/ContextWording:
|
||||||
- 'ee/spec/controllers/projects/settings/repository_controller_spec.rb'
|
- 'ee/spec/controllers/projects/settings/repository_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
|
- 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/projects_controller_spec.rb'
|
- 'ee/spec/controllers/projects_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
|
|
||||||
- 'ee/spec/controllers/registrations/welcome_controller_spec.rb'
|
- 'ee/spec/controllers/registrations/welcome_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/repositories/git_http_controller_spec.rb'
|
- 'ee/spec/controllers/repositories/git_http_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/security/dashboard_controller_spec.rb'
|
- 'ee/spec/controllers/security/dashboard_controller_spec.rb'
|
||||||
|
@ -921,8 +920,6 @@ RSpec/ContextWording:
|
||||||
- 'ee/spec/support/shared_examples/controllers/boards_actions_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/controllers/boards_actions_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/controllers/cluster_metrics_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/controllers/cluster_metrics_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/controllers/concerns/description_diff_actions_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/controllers/concerns/description_diff_actions_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/controllers/registrations/groups_controller_shared_examples.rb'
|
|
||||||
- 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
|
|
||||||
- 'ee/spec/support/shared_examples/features/insights_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/features/insights_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/features/password_complexity_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/features/password_complexity_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
|
||||||
|
@ -968,7 +965,6 @@ RSpec/ContextWording:
|
||||||
- 'ee/spec/views/profiles/preferences/show.html.haml_spec.rb'
|
- 'ee/spec/views/profiles/preferences/show.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/projects/edit.html.haml_spec.rb'
|
- 'ee/spec/views/projects/edit.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
|
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/registrations/groups/new.html.haml_spec.rb'
|
|
||||||
- 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
|
- 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/search/_category.html.haml_spec.rb'
|
- 'ee/spec/views/search/_category.html.haml_spec.rb'
|
||||||
- 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
|
- 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
|
||||||
|
|
|
@ -22,8 +22,6 @@ RSpec/ExpectChange:
|
||||||
- 'ee/spec/controllers/projects/repositories_controller_spec.rb'
|
- 'ee/spec/controllers/projects/repositories_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/projects/security/vulnerabilities/notes_controller_spec.rb'
|
- 'ee/spec/controllers/projects/security/vulnerabilities/notes_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/projects_controller_spec.rb'
|
- 'ee/spec/controllers/projects_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/registrations/groups_controller_spec.rb'
|
|
||||||
- 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
|
|
||||||
- 'ee/spec/controllers/trials_controller_spec.rb'
|
- 'ee/spec/controllers/trials_controller_spec.rb'
|
||||||
- 'ee/spec/elastic/migrate/20220119120500_populate_commit_permissions_in_main_index_spec.rb'
|
- 'ee/spec/elastic/migrate/20220119120500_populate_commit_permissions_in_main_index_spec.rb'
|
||||||
- 'ee/spec/features/groups/group_settings_spec.rb'
|
- 'ee/spec/features/groups/group_settings_spec.rb'
|
||||||
|
@ -245,7 +243,6 @@ RSpec/ExpectChange:
|
||||||
- 'ee/spec/services/vulnerability_feedback/create_service_spec.rb'
|
- 'ee/spec/services/vulnerability_feedback/create_service_spec.rb'
|
||||||
- 'ee/spec/services/vulnerability_feedback/destroy_service_spec.rb'
|
- 'ee/spec/services/vulnerability_feedback/destroy_service_spec.rb'
|
||||||
- 'ee/spec/support/shared_contexts/audit_event_not_licensed_shared_context.rb'
|
- 'ee/spec/support/shared_contexts/audit_event_not_licensed_shared_context.rb'
|
||||||
- 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
|
|
||||||
- 'ee/spec/support/shared_examples/graphql/mutations/update_health_status_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/graphql/mutations/update_health_status_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/models/concerns/replicable_model_with_separate_table_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/models/concerns/replicable_model_with_separate_table_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
|
||||||
|
|
|
@ -6,8 +6,6 @@ RSpec/ExpectInHook:
|
||||||
- 'ee/spec/controllers/groups/seat_usage_controller_spec.rb'
|
- 'ee/spec/controllers/groups/seat_usage_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/projects/boards_controller_spec.rb'
|
- 'ee/spec/controllers/projects/boards_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/projects/settings/slacks_controller_spec.rb'
|
- 'ee/spec/controllers/projects/settings/slacks_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/registrations/groups_controller_spec.rb'
|
|
||||||
- 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
|
|
||||||
- 'ee/spec/controllers/subscriptions_controller_spec.rb'
|
- 'ee/spec/controllers/subscriptions_controller_spec.rb'
|
||||||
- 'ee/spec/controllers/trials_controller_spec.rb'
|
- 'ee/spec/controllers/trials_controller_spec.rb'
|
||||||
- 'ee/spec/elastic/migrate/20220118150500_delete_orphaned_commits_spec.rb'
|
- 'ee/spec/elastic/migrate/20220118150500_delete_orphaned_commits_spec.rb'
|
||||||
|
@ -17,7 +15,6 @@ RSpec/ExpectInHook:
|
||||||
- 'ee/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb'
|
- 'ee/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb'
|
||||||
- 'ee/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb'
|
- 'ee/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb'
|
||||||
- 'ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb'
|
- 'ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb'
|
||||||
- 'ee/spec/features/registrations/combined_registration_spec.rb'
|
|
||||||
- 'ee/spec/features/registrations/saas_user_registration_spec.rb'
|
- 'ee/spec/features/registrations/saas_user_registration_spec.rb'
|
||||||
- 'ee/spec/features/registrations/trial_during_signup_flow_spec.rb'
|
- 'ee/spec/features/registrations/trial_during_signup_flow_spec.rb'
|
||||||
- 'ee/spec/features/signup_spec.rb'
|
- 'ee/spec/features/signup_spec.rb'
|
||||||
|
@ -103,7 +100,6 @@ RSpec/ExpectInHook:
|
||||||
- 'ee/spec/services/projects/update_mirror_service_spec.rb'
|
- 'ee/spec/services/projects/update_mirror_service_spec.rb'
|
||||||
- 'ee/spec/services/security/findings/cleanup_service_spec.rb'
|
- 'ee/spec/services/security/findings/cleanup_service_spec.rb'
|
||||||
- 'ee/spec/services/upcoming_reconciliations/update_service_spec.rb'
|
- 'ee/spec/services/upcoming_reconciliations/update_service_spec.rb'
|
||||||
- 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
|
|
||||||
- 'ee/spec/support/shared_examples/lib/gitlab/graphql/issuables_lazy_links_aggregate_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/lib/gitlab/graphql/issuables_lazy_links_aggregate_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/models/concerns/elastic/cannot_read_cross_project_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/models/concerns/elastic/cannot_read_cross_project_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb'
|
- 'ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb'
|
||||||
|
|
|
@ -384,9 +384,6 @@ Style/ClassAndModuleChildren:
|
||||||
- 'ee/app/controllers/admin/push_rules_controller.rb'
|
- 'ee/app/controllers/admin/push_rules_controller.rb'
|
||||||
- 'ee/app/controllers/admin/subscriptions_controller.rb'
|
- 'ee/app/controllers/admin/subscriptions_controller.rb'
|
||||||
- 'ee/app/controllers/admin/user_permission_exports_controller.rb'
|
- 'ee/app/controllers/admin/user_permission_exports_controller.rb'
|
||||||
- 'ee/app/controllers/concerns/registrations/apply_trial.rb'
|
|
||||||
- 'ee/app/controllers/concerns/registrations/create_group.rb'
|
|
||||||
- 'ee/app/controllers/concerns/registrations/create_project.rb'
|
|
||||||
- 'ee/app/controllers/concerns/registrations/verification.rb'
|
- 'ee/app/controllers/concerns/registrations/verification.rb'
|
||||||
- 'ee/app/controllers/ee/profiles/accounts_controller.rb'
|
- 'ee/app/controllers/ee/profiles/accounts_controller.rb'
|
||||||
- 'ee/app/controllers/ee/profiles/preferences_controller.rb'
|
- 'ee/app/controllers/ee/profiles/preferences_controller.rb'
|
||||||
|
|
|
@ -140,17 +140,6 @@ export const trackSaasTrialGroup = () => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const trackSaasTrialProject = () => {
|
|
||||||
if (!isSupported()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const form = document.getElementById('new_project');
|
|
||||||
form.addEventListener('submit', () => {
|
|
||||||
pushEvent('saasTrialProject');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const trackProjectImport = () => {
|
export const trackProjectImport = () => {
|
||||||
if (!isSupported()) {
|
if (!isSupported()) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
<script>
|
|
||||||
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
GlDropdown,
|
|
||||||
GlDropdownItem,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
visibilityLevelOptions: {
|
|
||||||
type: Array,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
defaultLevel: {
|
|
||||||
type: Number,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
selectedOption: this.getDefaultOption(),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getDefaultOption() {
|
|
||||||
return this.visibilityLevelOptions.find((option) => option.level === this.defaultLevel);
|
|
||||||
},
|
|
||||||
onClick(option) {
|
|
||||||
this.selectedOption = option;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<input type="hidden" name="group[visibility_level]" :value="selectedOption.level" />
|
|
||||||
<gl-dropdown :text="selectedOption.label" class="gl-w-full" menu-class="gl-w-full! gl-mb-0">
|
|
||||||
<gl-dropdown-item
|
|
||||||
v-for="option in visibilityLevelOptions"
|
|
||||||
:key="option.level"
|
|
||||||
:secondary-text="option.description"
|
|
||||||
@click="onClick(option)"
|
|
||||||
>
|
|
||||||
<div class="gl-font-weight-bold gl-mb-1">{{ option.label }}</div>
|
|
||||||
</gl-dropdown-item>
|
|
||||||
</gl-dropdown>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -1,24 +0,0 @@
|
||||||
import Vue from 'vue';
|
|
||||||
import VisibilityLevelDropdown from './components/visibility_level_dropdown.vue';
|
|
||||||
|
|
||||||
export default () => {
|
|
||||||
const el = document.querySelector('.js-visibility-level-dropdown');
|
|
||||||
|
|
||||||
if (!el) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { visibilityLevelOptions, defaultLevel } = el.dataset;
|
|
||||||
|
|
||||||
return new Vue({
|
|
||||||
el,
|
|
||||||
render(createElement) {
|
|
||||||
return createElement(VisibilityLevelDropdown, {
|
|
||||||
props: {
|
|
||||||
visibilityLevelOptions: JSON.parse(visibilityLevelOptions),
|
|
||||||
defaultLevel: Number(defaultLevel),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,16 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class CombinedRegistrationExperiment < ApplicationExperiment
|
|
||||||
include Rails.application.routes.url_helpers
|
|
||||||
|
|
||||||
control { new_users_sign_up_group_path }
|
|
||||||
candidate { new_users_sign_up_groups_project_path }
|
|
||||||
|
|
||||||
def key_for(source, _ = nil)
|
|
||||||
super(source, 'force_company_trial')
|
|
||||||
end
|
|
||||||
|
|
||||||
def redirect_path
|
|
||||||
run
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -96,7 +96,7 @@ module Projects
|
||||||
log_info("#{current_user.name} created a new project \"#{@project.full_name}\"")
|
log_info("#{current_user.name} created a new project \"#{@project.full_name}\"")
|
||||||
|
|
||||||
if @project.import?
|
if @project.import?
|
||||||
experiment(:combined_registration, user: current_user).track(:import_project)
|
Gitlab::Tracking.event(self.class.name, 'import_project', user: current_user)
|
||||||
else
|
else
|
||||||
# Skip writing the config for project imports/forks because it
|
# Skip writing the config for project imports/forks because it
|
||||||
# will always fail since the Git directory doesn't exist until
|
# will always fail since the Git directory doesn't exist until
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
= f.label :visibility_level, class: 'label-bold' do
|
|
||||||
= _('Visibility level')
|
|
||||||
.js-visibility-level-dropdown{ data: { visibility_level_options: visibility_level_options(@group).to_json, default_level: f.object.visibility_level } }
|
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
name: combined_registration
|
name: markdown_corrected_blockquote
|
||||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67614
|
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95967
|
||||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/285533
|
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/372089
|
||||||
milestone: '14.3'
|
milestone: '15.4'
|
||||||
type: experiment
|
type: development
|
||||||
group: group::acquisition
|
group: group::project management
|
||||||
default_enabled: false
|
default_enabled: false
|
|
@ -70,8 +70,11 @@ InitializerConnections.with_disabled_database_connections do
|
||||||
|
|
||||||
Gitlab.ee do
|
Gitlab.ee do
|
||||||
resource :company, only: [:new, :create], controller: 'company'
|
resource :company, only: [:new, :create], controller: 'company'
|
||||||
resources :groups, only: [:new, :create]
|
|
||||||
resources :projects, only: [:new, :create]
|
# legacy - to be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/371996
|
||||||
|
get 'groups/new', to: redirect('users/sign_up/groups_projects/new')
|
||||||
|
get 'projects/new', to: redirect('users/sign_up/groups_projects/new')
|
||||||
|
|
||||||
resources :groups_projects, only: [:new, :create] do
|
resources :groups_projects, only: [:new, :create] do
|
||||||
collection do
|
collection do
|
||||||
post :import
|
post :import
|
||||||
|
|
|
@ -93,7 +93,7 @@ Note the following when promoting a secondary:
|
||||||
the **secondary** to the **primary**.
|
the **secondary** to the **primary**.
|
||||||
- If you encounter an `ActiveRecord::RecordInvalid: Validation failed: Name has already been taken`
|
- If you encounter an `ActiveRecord::RecordInvalid: Validation failed: Name has already been taken`
|
||||||
error message during this process, for more information, see this
|
error message during this process, for more information, see this
|
||||||
[troubleshooting advice](../replication/troubleshooting.md#fixing-errors-during-a-failover-or-when-promoting-a-secondary-to-a-primary-node).
|
[troubleshooting advice](../replication/troubleshooting.md#fixing-errors-during-a-failover-or-when-promoting-a-secondary-to-a-primary-site).
|
||||||
- If you run into errors when using `--force` or `--skip-preflight-checks` before 13.5 during this process,
|
- If you run into errors when using `--force` or `--skip-preflight-checks` before 13.5 during this process,
|
||||||
for more information, see this
|
for more information, see this
|
||||||
[troubleshooting advice](../replication/troubleshooting.md#errors-when-using---skip-preflight-checks-or---force).
|
[troubleshooting advice](../replication/troubleshooting.md#errors-when-using---skip-preflight-checks-or---force).
|
||||||
|
@ -774,4 +774,4 @@ If you are running GitLab 14.4 and earlier:
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
This section was moved to [another location](../replication/troubleshooting.md#fixing-errors-during-a-failover-or-when-promoting-a-secondary-to-a-primary-node).
|
This section was moved to [another location](../replication/troubleshooting.md#fixing-errors-during-a-failover-or-when-promoting-a-secondary-to-a-primary-site).
|
||||||
|
|
|
@ -274,7 +274,7 @@ the **secondary** to the **primary**.
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
If you encounter an `ActiveRecord::RecordInvalid: Validation failed: Name has already been taken` error during this process, read
|
If you encounter an `ActiveRecord::RecordInvalid: Validation failed: Name has already been taken` error during this process, read
|
||||||
[the troubleshooting advice](../../replication/troubleshooting.md#fixing-errors-during-a-failover-or-when-promoting-a-secondary-to-a-primary-node).
|
[the troubleshooting advice](../../replication/troubleshooting.md#fixing-errors-during-a-failover-or-when-promoting-a-secondary-to-a-primary-site).
|
||||||
|
|
||||||
The `gitlab-ctl promote-to-primary-node` command cannot be used yet in
|
The `gitlab-ctl promote-to-primary-node` command cannot be used yet in
|
||||||
conjunction with multiple servers, as it can only
|
conjunction with multiple servers, as it can only
|
||||||
|
|
|
@ -220,7 +220,7 @@ Note the following when promoting a secondary:
|
||||||
the **secondary** to the **primary**.
|
the **secondary** to the **primary**.
|
||||||
- If you encounter an `ActiveRecord::RecordInvalid: Validation failed: Name has already been taken`
|
- If you encounter an `ActiveRecord::RecordInvalid: Validation failed: Name has already been taken`
|
||||||
error during this process, read
|
error during this process, read
|
||||||
[the troubleshooting advice](../../replication/troubleshooting.md#fixing-errors-during-a-failover-or-when-promoting-a-secondary-to-a-primary-node).
|
[the troubleshooting advice](../../replication/troubleshooting.md#fixing-errors-during-a-failover-or-when-promoting-a-secondary-to-a-primary-site).
|
||||||
|
|
||||||
To promote the secondary site running GitLab 14.5 and later:
|
To promote the secondary site running GitLab 14.5 and later:
|
||||||
|
|
||||||
|
|
|
@ -19,24 +19,24 @@ Here is a list of steps you should take to attempt to fix problem:
|
||||||
|
|
||||||
Before attempting more advanced troubleshooting:
|
Before attempting more advanced troubleshooting:
|
||||||
|
|
||||||
- Check [the health of the **secondary** node](#check-the-health-of-the-secondary-node).
|
- Check [the health of the **secondary** site](#check-the-health-of-the-secondary-site).
|
||||||
- Check [if PostgreSQL replication is working](#check-if-postgresql-replication-is-working).
|
- Check [if PostgreSQL replication is working](#check-if-postgresql-replication-is-working).
|
||||||
|
|
||||||
### Check the health of the **secondary** node
|
### Check the health of the **secondary** site
|
||||||
|
|
||||||
On the **primary** node:
|
On the **primary** site:
|
||||||
|
|
||||||
1. On the top bar, select **Menu > Admin**.
|
1. On the top bar, select **Menu > Admin**.
|
||||||
1. On the left sidebar, select **Geo > Nodes**.
|
1. On the left sidebar, select **Geo > Sites**.
|
||||||
|
|
||||||
We perform the following health checks on each **secondary** node
|
We perform the following health checks on each **secondary** site
|
||||||
to help identify if something is wrong:
|
to help identify if something is wrong:
|
||||||
|
|
||||||
- Is the node running?
|
- Is the site running?
|
||||||
- Is the node's secondary database configured for streaming replication?
|
- Is the secondary site's database configured for streaming replication?
|
||||||
- Is the node's secondary tracking database configured?
|
- Is the secondary site's tracking database configured?
|
||||||
- Is the node's secondary tracking database connected?
|
- Is the secondary site's tracking database connected?
|
||||||
- Is the node's secondary tracking database up-to-date?
|
- Is the secondary site's tracking database up-to-date?
|
||||||
|
|
||||||
![Geo health check](img/geo_site_health_v14_0.png)
|
![Geo health check](img/geo_site_health_v14_0.png)
|
||||||
|
|
||||||
|
@ -48,8 +48,8 @@ health check manually to get this information and a few more details.
|
||||||
|
|
||||||
#### Health check Rake task
|
#### Health check Rake task
|
||||||
|
|
||||||
This Rake task can be run on an app node in the **primary** or **secondary**
|
This Rake task can be run on a **Rails** node in the **primary** or **secondary**
|
||||||
Geo nodes:
|
Geo sites:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo gitlab-rake gitlab:geo:check
|
sudo gitlab-rake gitlab:geo:check
|
||||||
|
@ -275,11 +275,11 @@ sudo gitlab-rake gitlab:geo:check
|
||||||
Checking Geo ... Finished
|
Checking Geo ... Finished
|
||||||
```
|
```
|
||||||
|
|
||||||
Ensure you have added the secondary node in the Admin Area of the **primary** node.
|
Ensure you have added the secondary site in the **Menu > Admin > Geo > Sites** on the web interface for the **primary** site.
|
||||||
Also ensure you entered the `gitlab_rails['geo_node_name']`
|
Also ensure you entered the `gitlab_rails['geo_node_name']`
|
||||||
when adding the secondary node in the Admin Area of the **primary** node.
|
when adding the secondary site in the Admin Area of the **primary** site.
|
||||||
In GitLab 12.3 and earlier, edit the secondary node in the Admin Area of the **primary**
|
In GitLab 12.3 and earlier, edit the secondary site in the Admin Area of the **primary**
|
||||||
node and ensure that there is a trailing `/` in the `Name` field.
|
site and ensure that there is a trailing `/` in the `Name` field.
|
||||||
|
|
||||||
- Check returns `Exception: PG::UndefinedTable: ERROR: relation "geo_nodes" does not exist`.
|
- Check returns `Exception: PG::UndefinedTable: ERROR: relation "geo_nodes" does not exist`.
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ error messages (indicated by `Database replication working? ... no` in the
|
||||||
|
|
||||||
This means that the `max_replication_slots` PostgreSQL variable needs to
|
This means that the `max_replication_slots` PostgreSQL variable needs to
|
||||||
be set on the **primary** database. This setting defaults to 1. You may need to
|
be set on the **primary** database. This setting defaults to 1. You may need to
|
||||||
increase this value if you have more **secondary** nodes.
|
increase this value if you have more **secondary** sites.
|
||||||
|
|
||||||
Be sure to restart PostgreSQL for this to take effect. See the
|
Be sure to restart PostgreSQL for this to take effect. See the
|
||||||
[PostgreSQL replication setup](../setup/database.md#postgresql-replication) guide for more details.
|
[PostgreSQL replication setup](../setup/database.md#postgresql-replication) guide for more details.
|
||||||
|
@ -329,13 +329,13 @@ Be sure to restart PostgreSQL for this to take effect. See the
|
||||||
### Message: `FATAL: could not start WAL streaming: ERROR: replication slot "geo_secondary_my_domain_com" does not exist`?
|
### Message: `FATAL: could not start WAL streaming: ERROR: replication slot "geo_secondary_my_domain_com" does not exist`?
|
||||||
|
|
||||||
This occurs when PostgreSQL does not have a replication slot for the
|
This occurs when PostgreSQL does not have a replication slot for the
|
||||||
**secondary** node by that name.
|
**secondary** site by that name.
|
||||||
|
|
||||||
You may want to rerun the [replication process](../setup/database.md) on the **secondary** node .
|
You may want to rerun the [replication process](../setup/database.md) on the **secondary** site .
|
||||||
|
|
||||||
### Message: "Command exceeded allowed execution time" when setting up replication?
|
### Message: "Command exceeded allowed execution time" when setting up replication?
|
||||||
|
|
||||||
This may happen while [initiating the replication process](../setup/database.md#step-3-initiate-the-replication-process) on the **secondary** node,
|
This may happen while [initiating the replication process](../setup/database.md#step-3-initiate-the-replication-process) on the **secondary** site,
|
||||||
and indicates your initial dataset is too large to be replicated in the default timeout (30 minutes).
|
and indicates your initial dataset is too large to be replicated in the default timeout (30 minutes).
|
||||||
|
|
||||||
Re-run `gitlab-ctl replicate-geo-database`, but include a larger value for
|
Re-run `gitlab-ctl replicate-geo-database`, but include a larger value for
|
||||||
|
@ -374,8 +374,8 @@ log data to build up in `pg_xlog`. Removing the unused slots can reduce the amou
|
||||||
|
|
||||||
Slots where `active` is `f` are not active.
|
Slots where `active` is `f` are not active.
|
||||||
|
|
||||||
- When this slot should be active, because you have a **secondary** node configured using that slot,
|
- When this slot should be active, because you have a **secondary** site configured using that slot,
|
||||||
sign in to that **secondary** node and check the [PostgreSQL logs](../../logs/index.md#postgresql-logs)
|
sign in on the web interface for the **secondary** site and check the [PostgreSQL logs](../../logs/index.md#postgresql-logs)
|
||||||
to view why the replication is not running.
|
to view why the replication is not running.
|
||||||
|
|
||||||
- If you are no longer using the slot (for example, you no longer have Geo enabled), you can remove it with in the
|
- If you are no longer using the slot (for example, you no longer have Geo enabled), you can remove it with in the
|
||||||
|
@ -398,12 +398,12 @@ These long-running queries are
|
||||||
[planned to be removed in the future](https://gitlab.com/gitlab-org/gitlab/-/issues/34269),
|
[planned to be removed in the future](https://gitlab.com/gitlab-org/gitlab/-/issues/34269),
|
||||||
but as a workaround, we recommend enabling
|
but as a workaround, we recommend enabling
|
||||||
[`hot_standby_feedback`](https://www.postgresql.org/docs/10/hot-standby.html#HOT-STANDBY-CONFLICT).
|
[`hot_standby_feedback`](https://www.postgresql.org/docs/10/hot-standby.html#HOT-STANDBY-CONFLICT).
|
||||||
This increases the likelihood of bloat on the **primary** node as it prevents
|
This increases the likelihood of bloat on the **primary** site as it prevents
|
||||||
`VACUUM` from removing recently-dead rows. However, it has been used
|
`VACUUM` from removing recently-dead rows. However, it has been used
|
||||||
successfully in production on GitLab.com.
|
successfully in production on GitLab.com.
|
||||||
|
|
||||||
To enable `hot_standby_feedback`, add the following to `/etc/gitlab/gitlab.rb`
|
To enable `hot_standby_feedback`, add the following to `/etc/gitlab/gitlab.rb`
|
||||||
on the **secondary** node:
|
on the **secondary** site:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
postgresql['hot_standby_feedback'] = 'on'
|
postgresql['hot_standby_feedback'] = 'on'
|
||||||
|
@ -463,14 +463,14 @@ This happens if data is detected in the `projects` table. When one or more proje
|
||||||
is aborted to prevent accidental data loss. To bypass this message, pass the `--force` option to the command.
|
is aborted to prevent accidental data loss. To bypass this message, pass the `--force` option to the command.
|
||||||
|
|
||||||
In GitLab 13.4, a seed project is added when GitLab is first installed. This makes it necessary to pass `--force` even
|
In GitLab 13.4, a seed project is added when GitLab is first installed. This makes it necessary to pass `--force` even
|
||||||
on a new Geo secondary node. There is an [issue to account for seed projects](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5618)
|
on a new Geo secondary site. There is an [issue to account for seed projects](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5618)
|
||||||
when checking the database.
|
when checking the database.
|
||||||
|
|
||||||
### Message: `Synchronization failed - Error syncing repository`
|
### Message: `Synchronization failed - Error syncing repository`
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
If large repositories are affected by this problem,
|
If large repositories are affected by this problem,
|
||||||
their resync may take a long time and cause significant load on your Geo nodes,
|
their resync may take a long time and cause significant load on your Geo sites,
|
||||||
storage and network systems.
|
storage and network systems.
|
||||||
|
|
||||||
If you see the error message `Synchronization failed - Error syncing repository` along with `fatal: fsck error in packed object`, this indicates
|
If you see the error message `Synchronization failed - Error syncing repository` along with `fatal: fsck error in packed object`, this indicates
|
||||||
|
@ -483,7 +483,7 @@ it's possible to override the consistency checks instead. To do that, follow
|
||||||
[the instructions in the Gitaly docs](../../gitaly/configure_gitaly.md#repository-consistency-checks).
|
[the instructions in the Gitaly docs](../../gitaly/configure_gitaly.md#repository-consistency-checks).
|
||||||
|
|
||||||
You can also get the error message `Synchronization failed - Error syncing repository` along with the following log messages, this indicates that the expected `geo` remote is not present in the `.git/config` file
|
You can also get the error message `Synchronization failed - Error syncing repository` along with the following log messages, this indicates that the expected `geo` remote is not present in the `.git/config` file
|
||||||
of a repository on the secondary Geo node's file system:
|
of a repository on the secondary Geo site's file system:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
@ -505,7 +505,7 @@ of a repository on the secondary Geo node's file system:
|
||||||
|
|
||||||
To solve this:
|
To solve this:
|
||||||
|
|
||||||
1. Sign in to the secondary Geo node.
|
1. Sign in on the web interface for the secondary Geo site.
|
||||||
|
|
||||||
1. Back up [the `.git` folder](../../repository_storage_types.md#translate-hashed-storage-paths).
|
1. Back up [the `.git` folder](../../repository_storage_types.md#translate-hashed-storage-paths).
|
||||||
|
|
||||||
|
@ -538,7 +538,7 @@ To solve this:
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
### Very large repositories never successfully synchronize on the **secondary** node
|
### Very large repositories never successfully synchronize on the **secondary** site
|
||||||
|
|
||||||
GitLab places a timeout on all repository clones, including project imports
|
GitLab places a timeout on all repository clones, including project imports
|
||||||
and Geo synchronization operations. If a fresh `git clone` of a repository
|
and Geo synchronization operations. If a fresh `git clone` of a repository
|
||||||
|
@ -546,7 +546,8 @@ on the **primary** takes more than the default three hours, you may be affected
|
||||||
|
|
||||||
To increase the timeout:
|
To increase the timeout:
|
||||||
|
|
||||||
1. On the **secondary** node, add the following line to `/etc/gitlab/gitlab.rb`:
|
1. On the **Sidekiq nodes on your secondary** site,
|
||||||
|
add the following line to `/etc/gitlab/gitlab.rb`:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
gitlab_rails['gitlab_shell_git_timeout'] = 14400
|
gitlab_rails['gitlab_shell_git_timeout'] = 14400
|
||||||
|
@ -563,9 +564,9 @@ long enough to accommodate a full clone of your largest repositories.
|
||||||
|
|
||||||
### New LFS objects are never replicated
|
### New LFS objects are never replicated
|
||||||
|
|
||||||
If new LFS objects are never replicated to secondary Geo nodes, check the version of
|
If new LFS objects are never replicated to secondary Geo sites, check the version of
|
||||||
GitLab you are running. GitLab versions 11.11.x or 12.0.x are affected by
|
GitLab you are running. GitLab versions 11.11.x or 12.0.x are affected by
|
||||||
[a bug that results in new LFS objects not being replicated to Geo secondary nodes](https://gitlab.com/gitlab-org/gitlab/-/issues/32696).
|
[a bug that results in new LFS objects not being replicated to Geo secondary sites](https://gitlab.com/gitlab-org/gitlab/-/issues/32696).
|
||||||
|
|
||||||
To resolve the issue, upgrade to GitLab 12.1 or later.
|
To resolve the issue, upgrade to GitLab 12.1 or later.
|
||||||
|
|
||||||
|
@ -574,9 +575,9 @@ To resolve the issue, upgrade to GitLab 12.1 or later.
|
||||||
During a [backfill](../index.md#backfill), failures are scheduled to be retried at the end
|
During a [backfill](../index.md#backfill), failures are scheduled to be retried at the end
|
||||||
of the backfill queue, therefore these failures only clear up **after** the backfill completes.
|
of the backfill queue, therefore these failures only clear up **after** the backfill completes.
|
||||||
|
|
||||||
### Resetting Geo **secondary** node replication
|
### Resetting Geo **secondary** site replication
|
||||||
|
|
||||||
If you get a **secondary** node in a broken state and want to reset the replication state,
|
If you get a **secondary** site in a broken state and want to reset the replication state,
|
||||||
to start again from scratch, there are a few steps that can help you:
|
to start again from scratch, there are a few steps that can help you:
|
||||||
|
|
||||||
1. Stop Sidekiq and the Geo LogCursor.
|
1. Stop Sidekiq and the Geo LogCursor.
|
||||||
|
@ -617,8 +618,8 @@ to start again from scratch, there are a few steps that can help you:
|
||||||
1. Optional. Rename other data folders and create new ones.
|
1. Optional. Rename other data folders and create new ones.
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
You may still have files on the **secondary** node that have been removed from the **primary** node, but this
|
You may still have files on the **secondary** site that have been removed from the **primary** site, but this
|
||||||
removal has not been reflected. If you skip this step, these files are not removed from the Geo node.
|
removal has not been reflected. If you skip this step, these files are not removed from the Geo **secondary** site.
|
||||||
|
|
||||||
Any uploaded content (like file attachments, avatars, or LFS objects) is stored in a
|
Any uploaded content (like file attachments, avatars, or LFS objects) is stored in a
|
||||||
subfolder in one of these paths:
|
subfolder in one of these paths:
|
||||||
|
@ -667,7 +668,7 @@ to start again from scratch, there are a few steps that can help you:
|
||||||
|
|
||||||
### Design repository failures on mirrored projects and project imports
|
### Design repository failures on mirrored projects and project imports
|
||||||
|
|
||||||
On the top bar, under **Menu > Admin > Geo > Nodes**,
|
On the top bar, under **Menu > Admin > Geo > Sites**,
|
||||||
if the Design repositories progress bar shows
|
if the Design repositories progress bar shows
|
||||||
`Synced` and `Failed` greater than 100%, and negative `Queued`, the instance
|
`Synced` and `Failed` greater than 100%, and negative `Queued`, the instance
|
||||||
is likely affected by
|
is likely affected by
|
||||||
|
@ -714,7 +715,7 @@ Counts:
|
||||||
{"synced"=>3}
|
{"synced"=>3}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### If you are promoting a Geo secondary site running on a single server
|
#### If you are promoting a Geo secondary site running on a single node
|
||||||
|
|
||||||
`gitlab-ctl promotion-preflight-checks` fails due to the existence of
|
`gitlab-ctl promotion-preflight-checks` fails due to the existence of
|
||||||
`failed` rows in the `geo_design_registry` table. Use the
|
`failed` rows in the `geo_design_registry` table. Use the
|
||||||
|
@ -831,10 +832,10 @@ We recommend transferring each failing repository individually and checking for
|
||||||
after each transfer. Follow the [single target `rsync` instructions](../../operations/moving_repositories.md#single-rsync-to-another-server)
|
after each transfer. Follow the [single target `rsync` instructions](../../operations/moving_repositories.md#single-rsync-to-another-server)
|
||||||
to transfer each affected repository from the primary to the secondary site.
|
to transfer each affected repository from the primary to the secondary site.
|
||||||
|
|
||||||
## Fixing errors during a failover or when promoting a secondary to a primary node
|
## Fixing errors during a failover or when promoting a secondary to a primary site
|
||||||
|
|
||||||
The following are possible error messages that might be encountered during failover or
|
The following are possible error messages that might be encountered during failover or
|
||||||
when promoting a secondary to a primary node with strategies to resolve them.
|
when promoting a secondary to a primary site with strategies to resolve them.
|
||||||
|
|
||||||
### Message: `ActiveRecord::RecordInvalid: Validation failed: Name has already been taken`
|
### Message: `ActiveRecord::RecordInvalid: Validation failed: Name has already been taken`
|
||||||
|
|
||||||
|
@ -873,9 +874,9 @@ or `gitlab-ctl promote-to-primary-node`, either:
|
||||||
|
|
||||||
### Message: `ActiveRecord::RecordInvalid: Validation failed: Enabled Geo primary node cannot be disabled`
|
### Message: `ActiveRecord::RecordInvalid: Validation failed: Enabled Geo primary node cannot be disabled`
|
||||||
|
|
||||||
If you disabled a secondary node, either with the [replication pause task](../index.md#pausing-and-resuming-replication)
|
If you disabled a secondary site, either with the [replication pause task](../index.md#pausing-and-resuming-replication)
|
||||||
(GitLab 13.2) or by using the user interface (GitLab 13.1 and earlier), you must first
|
(GitLab 13.2) or by using the user interface (GitLab 13.1 and earlier), you must first
|
||||||
re-enable the node before you can continue. This is fixed in GitLab 13.4.
|
re-enable the site before you can continue. This is fixed in GitLab 13.4.
|
||||||
|
|
||||||
This can be fixed in the database.
|
This can be fixed in the database.
|
||||||
|
|
||||||
|
@ -894,7 +895,7 @@ This can be fixed in the database.
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Run the following command, replacing `https://<secondary url>/` with the URL
|
1. Run the following command, replacing `https://<secondary url>/` with the URL
|
||||||
for your secondary server. You can use either `http` or `https`, but ensure that you
|
for your secondary node. You can use either `http` or `https`, but ensure that you
|
||||||
end the URL with a slash (`/`):
|
end the URL with a slash (`/`):
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
|
@ -987,32 +988,31 @@ sudo gitlab-rake geo:set_secondary_as_primary
|
||||||
## Expired artifacts
|
## Expired artifacts
|
||||||
|
|
||||||
If you notice for some reason there are more artifacts on the Geo
|
If you notice for some reason there are more artifacts on the Geo
|
||||||
secondary node than on the Geo primary node, you can use the Rake task
|
**secondary** site than on the Geo **primary** site, you can use the Rake task
|
||||||
to [cleanup orphan artifact files](../../../raketasks/cleanup.md#remove-orphan-artifact-files).
|
to [cleanup orphan artifact files](../../../raketasks/cleanup.md#remove-orphan-artifact-files).
|
||||||
|
|
||||||
On a Geo **secondary** node, this command also cleans up all Geo
|
On a Geo **secondary** site, this command also cleans up all Geo
|
||||||
registry record related to the orphan files on disk.
|
registry record related to the orphan files on disk.
|
||||||
|
|
||||||
## Fixing sign in errors
|
## Fixing sign in errors
|
||||||
|
|
||||||
### Message: The redirect URI included is not valid
|
### Message: The redirect URI included is not valid
|
||||||
|
|
||||||
If you are able to sign in to the **primary** node, but you receive this error message
|
If you are able to sign in to the web interface for the **primary** site, but you receive this error message
|
||||||
when attempting to sign in to a **secondary**, you should verify the Geo
|
when attempting to sign in to a **secondary** web interface, you should verify the Geo
|
||||||
node's URL matches its external URL.
|
site's URL matches its external URL.
|
||||||
|
|
||||||
On the **primary** node:
|
On the **primary** site:
|
||||||
|
|
||||||
1. On the top bar, select **Menu > Admin**.
|
1. On the top bar, select **Menu > Admin**.
|
||||||
1. On the left sidebar, select **Geo > Nodes**.
|
1. On the left sidebar, select **Geo > Sites**.
|
||||||
1. Find the affected **secondary** site and select **Edit**.
|
1. Find the affected **secondary** site and select **Edit**.
|
||||||
1. Ensure the **URL** field matches the value found in `/etc/gitlab/gitlab.rb`
|
1. Ensure the **URL** field matches the value found in `/etc/gitlab/gitlab.rb`
|
||||||
in `external_url "https://gitlab.example.com"` on the frontend servers of
|
in `external_url "https://gitlab.example.com"` on the **Rails nodes of the secondary** site.
|
||||||
the **secondary** node.
|
|
||||||
|
|
||||||
## Fixing common errors
|
## Fixing common errors
|
||||||
|
|
||||||
This section documents common error messages reported in the Admin Area, and how to fix them.
|
This section documents common error messages reported in the Admin Area on the web interface, and how to fix them.
|
||||||
|
|
||||||
### Geo database configuration file is missing
|
### Geo database configuration file is missing
|
||||||
|
|
||||||
|
@ -1029,11 +1029,11 @@ has the correct permissions.
|
||||||
Geo cannot reuse an existing tracking database.
|
Geo cannot reuse an existing tracking database.
|
||||||
|
|
||||||
It is safest to use a fresh secondary, or reset the whole secondary by following
|
It is safest to use a fresh secondary, or reset the whole secondary by following
|
||||||
[Resetting Geo secondary node replication](#resetting-geo-secondary-node-replication).
|
[Resetting Geo secondary site replication](#resetting-geo-secondary-site-replication).
|
||||||
|
|
||||||
### Geo node has a database that is writable which is an indication it is not configured for replication with the primary node
|
### Geo site has a database that is writable which is an indication it is not configured for replication with the primary site
|
||||||
|
|
||||||
This error message refers to a problem with the database replica on a **secondary** node,
|
This error message refers to a problem with the database replica on a **secondary** site,
|
||||||
which Geo expects to have access to. It usually means, either:
|
which Geo expects to have access to. It usually means, either:
|
||||||
|
|
||||||
- An unsupported replication method was used (for example, logical replication).
|
- An unsupported replication method was used (for example, logical replication).
|
||||||
|
@ -1043,24 +1043,24 @@ which Geo expects to have access to. It usually means, either:
|
||||||
|
|
||||||
Geo **secondary** sites require two separate PostgreSQL instances:
|
Geo **secondary** sites require two separate PostgreSQL instances:
|
||||||
|
|
||||||
- A read-only replica of the **primary** node.
|
- A read-only replica of the **primary** site.
|
||||||
- A regular, writable instance that holds replication metadata. That is, the Geo tracking database.
|
- A regular, writable instance that holds replication metadata. That is, the Geo tracking database.
|
||||||
|
|
||||||
This error message indicates that the replica database in the **secondary** site is misconfigured and replication has stopped.
|
This error message indicates that the replica database in the **secondary** site is misconfigured and replication has stopped.
|
||||||
|
|
||||||
To restore the database and resume replication, you can do one of the following:
|
To restore the database and resume replication, you can do one of the following:
|
||||||
|
|
||||||
- [Reset the Geo secondary site replication](#resetting-geo-secondary-node-replication).
|
- [Reset the Geo secondary site replication](#resetting-geo-secondary-site-replication).
|
||||||
- [Set up a new secondary Geo Omnibus instance](../setup/index.md#using-omnibus-gitlab).
|
- [Set up a new secondary Geo Omnibus instance](../setup/index.md#using-omnibus-gitlab).
|
||||||
|
|
||||||
If you set up a new secondary from scratch, you must also [remove the old site from the Geo cluster](remove_geo_site.md#removing-secondary-geo-sites).
|
If you set up a new secondary from scratch, you must also [remove the old site from the Geo cluster](remove_geo_site.md#removing-secondary-geo-sites).
|
||||||
|
|
||||||
### Geo node does not appear to be replicating the database from the primary node
|
### Geo site does not appear to be replicating the database from the primary site
|
||||||
|
|
||||||
The most common problems that prevent the database from replicating correctly are:
|
The most common problems that prevent the database from replicating correctly are:
|
||||||
|
|
||||||
- **Secondary** nodes cannot reach the **primary** node. Check credentials, firewall rules, and so on.
|
- **Secondary** sites cannot reach the **primary** site. Check credentials, [firewall rules](../index.md#firewall-rules), and so on.
|
||||||
- SSL certificate problems. Make sure you copied `/etc/gitlab/gitlab-secrets.json` from the **primary** node.
|
- SSL certificate problems. Make sure you copied `/etc/gitlab/gitlab-secrets.json` from the **primary** site.
|
||||||
- Database storage disk is full.
|
- Database storage disk is full.
|
||||||
- Database replication slot is misconfigured.
|
- Database replication slot is misconfigured.
|
||||||
- Database is not using a replication slot or another alternative and cannot catch-up because WAL files were purged.
|
- Database is not using a replication slot or another alternative and cannot catch-up because WAL files were purged.
|
||||||
|
@ -1072,26 +1072,26 @@ Make sure you follow the [Geo database replication](../setup/database.md) instru
|
||||||
If you are using Omnibus GitLab installation, something might have failed during upgrade. You can:
|
If you are using Omnibus GitLab installation, something might have failed during upgrade. You can:
|
||||||
|
|
||||||
- Run `sudo gitlab-ctl reconfigure`.
|
- Run `sudo gitlab-ctl reconfigure`.
|
||||||
- Manually trigger the database migration by running: `sudo gitlab-rake db:migrate:geo` as root on the **secondary** node.
|
- Manually trigger the database migration by running: `sudo gitlab-rake db:migrate:geo` as root on the **secondary** site.
|
||||||
|
|
||||||
### GitLab indicates that more than 100% of repositories were synced
|
### GitLab indicates that more than 100% of repositories were synced
|
||||||
|
|
||||||
This can be caused by orphaned records in the project registry. You can clear them
|
This can be caused by orphaned records in the project registry. You can clear them
|
||||||
[using a Rake task](../../../administration/raketasks/geo.md#remove-orphaned-project-registries).
|
[using a Rake task](../../../administration/raketasks/geo.md#remove-orphaned-project-registries).
|
||||||
|
|
||||||
### Geo Admin Area returns 404 error for a secondary node
|
### Geo Admin Area returns 404 error for a secondary site
|
||||||
|
|
||||||
Sometimes `sudo gitlab-rake gitlab:geo:check` indicates that the **secondary** node is
|
Sometimes `sudo gitlab-rake gitlab:geo:check` indicates that **Rails nodes of the secondary** sites are
|
||||||
healthy, but a 404 Not Found error message for the **secondary** node is returned in the Geo Admin Area on
|
healthy, but a 404 Not Found error message for the **secondary** site is returned in the Geo Admin Area on the web interface for
|
||||||
the **primary** node.
|
the **primary** site.
|
||||||
|
|
||||||
To resolve this issue:
|
To resolve this issue:
|
||||||
|
|
||||||
- Try restarting the **secondary** using `sudo gitlab-ctl restart`.
|
- Try restarting **each Rails, Sidekiq and Gitaly nodes on your secondary site** using `sudo gitlab-ctl restart`.
|
||||||
- Check `/var/log/gitlab/gitlab-rails/geo.log` to see if the **secondary** node is
|
- Check `/var/log/gitlab/gitlab-rails/geo.log` on Sidekiq nodes to see if the **secondary** site is
|
||||||
using IPv6 to send its status to the **primary** node. If it is, add an entry to
|
using IPv6 to send its status to the **primary** site. If it is, add an entry to
|
||||||
the **primary** node using IPv4 in the `/etc/hosts` file. Alternatively, you should
|
the **primary** site using IPv4 in the `/etc/hosts` file. Alternatively, you should
|
||||||
[enable IPv6 on the **primary** node](https://docs.gitlab.com/omnibus/settings/nginx.html#setting-the-nginx-listen-address-or-addresses).
|
[enable IPv6 on the **primary** site](https://docs.gitlab.com/omnibus/settings/nginx.html#setting-the-nginx-listen-address-or-addresses).
|
||||||
|
|
||||||
### Secondary site returns 502 errors with Geo proxying
|
### Secondary site returns 502 errors with Geo proxying
|
||||||
|
|
||||||
|
@ -1167,7 +1167,7 @@ To fix this issue, set the primary site's internal URL to a URL that is:
|
||||||
|
|
||||||
You may have problems if you're running a version of [Git LFS](https://git-lfs.github.com/) before 2.4.2.
|
You may have problems if you're running a version of [Git LFS](https://git-lfs.github.com/) before 2.4.2.
|
||||||
As noted in [this authentication issue](https://github.com/git-lfs/git-lfs/issues/3025),
|
As noted in [this authentication issue](https://github.com/git-lfs/git-lfs/issues/3025),
|
||||||
requests redirected from the secondary to the primary node do not properly send the
|
requests redirected from the secondary to the primary site do not properly send the
|
||||||
Authorization header. This may result in either an infinite `Authorization <-> Redirect`
|
Authorization header. This may result in either an infinite `Authorization <-> Redirect`
|
||||||
loop, or Authorization error messages.
|
loop, or Authorization error messages.
|
||||||
|
|
||||||
|
@ -1194,13 +1194,13 @@ The partial failover to a secondary Geo *site* may be the result of a temporary/
|
||||||
|
|
||||||
1. SSH into every Sidekiq, PostgresSQL, Gitaly, and Rails node in the **secondary** site and run one of the following commands:
|
1. SSH into every Sidekiq, PostgresSQL, Gitaly, and Rails node in the **secondary** site and run one of the following commands:
|
||||||
|
|
||||||
- To promote the secondary node to primary:
|
- To promote the secondary site to primary:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo gitlab-ctl geo promote
|
sudo gitlab-ctl geo promote
|
||||||
```
|
```
|
||||||
|
|
||||||
- To promote the secondary node to primary **without any further confirmation**:
|
- To promote the secondary site to primary **without any further confirmation**:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo gitlab-ctl geo promote --force
|
sudo gitlab-ctl geo promote --force
|
||||||
|
|
|
@ -597,7 +597,8 @@ To migrate to Gitaly Cluster:
|
||||||
|
|
||||||
1. Create the required storage. Refer to
|
1. Create the required storage. Refer to
|
||||||
[repository storage recommendations](praefect.md#repository-storage-recommendations).
|
[repository storage recommendations](praefect.md#repository-storage-recommendations).
|
||||||
1. Create and configure [Gitaly Cluster](praefect.md).
|
1. Create and configure [Gitaly Cluster](praefect.md).
|
||||||
|
1. Configure the existing Gitaly instance [to use TPC](praefect.md#use-tcp-for-existing-gitlab-instances), if not already configured that way.
|
||||||
1. [Move the repositories](../operations/moving_repositories.md#move-repositories). To migrate to
|
1. [Move the repositories](../operations/moving_repositories.md#move-repositories). To migrate to
|
||||||
Gitaly Cluster, existing repositories stored outside Gitaly Cluster must be moved. There is no
|
Gitaly Cluster, existing repositories stored outside Gitaly Cluster must be moved. There is no
|
||||||
automatic migration but the moves can be scheduled with the GitLab API.
|
automatic migration but the moves can be scheduled with the GitLab API.
|
||||||
|
|
|
@ -611,9 +611,10 @@ Quote break.
|
||||||
If this section isn't rendered correctly, [view it in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#multiline-blockquote).
|
If this section isn't rendered correctly, [view it in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#multiline-blockquote).
|
||||||
|
|
||||||
GitLab Flavored Markdown extends the standard Markdown by also supporting multi-line blockquotes
|
GitLab Flavored Markdown extends the standard Markdown by also supporting multi-line blockquotes
|
||||||
fenced by `>>>`:
|
fenced by `>>>`, with a blank line before and after the block:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
|
|
||||||
>>>
|
>>>
|
||||||
If you paste a message from somewhere else
|
If you paste a message from somewhere else
|
||||||
|
|
||||||
|
@ -621,6 +622,7 @@ that spans multiple lines,
|
||||||
|
|
||||||
you can quote that without having to manually prepend `>` to every line!
|
you can quote that without having to manually prepend `>` to every line!
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
>>>
|
>>>
|
||||||
|
|
|
@ -5,6 +5,37 @@ module Banzai
|
||||||
class BlockquoteFenceFilter < HTML::Pipeline::TextFilter
|
class BlockquoteFenceFilter < HTML::Pipeline::TextFilter
|
||||||
REGEX = %r{
|
REGEX = %r{
|
||||||
#{::Gitlab::Regex.markdown_code_or_html_blocks}
|
#{::Gitlab::Regex.markdown_code_or_html_blocks}
|
||||||
|
|
|
||||||
|
(?=(?<=^\n|\A)>>>\ *\n.*\n>>>\ *(?=\n$|\z))(?:
|
||||||
|
# Blockquote:
|
||||||
|
# >>>
|
||||||
|
# Anything, including code and HTML blocks
|
||||||
|
# >>>
|
||||||
|
|
||||||
|
(?<=^\n|\A)>>>\ *\n
|
||||||
|
(?<quote>
|
||||||
|
(?:
|
||||||
|
# Any character that doesn't introduce a code or HTML block
|
||||||
|
(?!
|
||||||
|
^```
|
||||||
|
|
|
||||||
|
^<[^>]+?>\ *\n
|
||||||
|
)
|
||||||
|
.
|
||||||
|
|
|
||||||
|
# A code block
|
||||||
|
\g<code>
|
||||||
|
|
|
||||||
|
# An HTML block
|
||||||
|
\g<html>
|
||||||
|
)+?
|
||||||
|
)
|
||||||
|
\n>>>\ *(?=\n$|\z)
|
||||||
|
)
|
||||||
|
}mx.freeze
|
||||||
|
|
||||||
|
OLD_REGEX = %r{
|
||||||
|
#{::Gitlab::Regex.markdown_code_or_html_blocks}
|
||||||
|
|
|
|
||||||
(?=^>>>\ *\n.*\n>>>\ *$)(?:
|
(?=^>>>\ *\n.*\n>>>\ *$)(?:
|
||||||
# Blockquote:
|
# Blockquote:
|
||||||
|
@ -40,7 +71,7 @@ module Banzai
|
||||||
end
|
end
|
||||||
|
|
||||||
def call
|
def call
|
||||||
@text.gsub(REGEX) do
|
@text.gsub(regex) do
|
||||||
if $~[:quote]
|
if $~[:quote]
|
||||||
# keep the same number of source lines/positions by replacing the
|
# keep the same number of source lines/positions by replacing the
|
||||||
# fence lines with newlines
|
# fence lines with newlines
|
||||||
|
@ -50,6 +81,12 @@ module Banzai
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def regex
|
||||||
|
Feature.enabled?(:markdown_corrected_blockquote) ? REGEX : OLD_REGEX
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -70,7 +70,9 @@ module Gitlab
|
||||||
|
|
||||||
link_path = File.join(shell_path, '.gitlab_shell_secret')
|
link_path = File.join(shell_path, '.gitlab_shell_secret')
|
||||||
if File.exist?(shell_path) && !File.exist?(link_path)
|
if File.exist?(shell_path) && !File.exist?(link_path)
|
||||||
FileUtils.symlink(secret_file, link_path)
|
# It could happen that link_path is a broken symbolic link.
|
||||||
|
# In that case !File.exist?(link_path) is true, but we still want to overwrite the (broken) symbolic link.
|
||||||
|
FileUtils.ln_sf(secret_file, link_path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3918,9 +3918,6 @@ msgstr ""
|
||||||
msgid "Allowed"
|
msgid "Allowed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Allowed characters: +, 0-9, -, and spaces."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Allowed email domain restriction only permitted for top-level groups"
|
msgid "Allowed email domain restriction only permitted for top-level groups"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -11051,9 +11048,6 @@ msgstr ""
|
||||||
msgid "Create, update, or delete a merge request."
|
msgid "Create, update, or delete a merge request."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Create/import your first project"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "CreateGroup|You don’t have permission to create a subgroup in this group."
|
msgid "CreateGroup|You don’t have permission to create a subgroup in this group."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -15186,9 +15180,6 @@ msgstr ""
|
||||||
msgid "Error loading burndown chart data"
|
msgid "Error loading burndown chart data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Error loading countries data."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Error loading file viewer."
|
msgid "Error loading file viewer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -23237,9 +23228,6 @@ msgstr ""
|
||||||
msgid "Learn GitLab"
|
msgid "Learn GitLab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Learn GitLab - Ultimate trial"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Learn More"
|
msgid "Learn More"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -40531,9 +40519,6 @@ msgstr ""
|
||||||
msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
|
msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you store your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "This release was created with a date in the past. Evidence collection at the moment of the release is unavailable."
|
msgid "This release was created with a date in the past. Evidence collection at the moment of the release is unavailable."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -41477,39 +41462,12 @@ msgstr ""
|
||||||
msgid "Trial|Allowed characters: +, 0-9, -, and spaces."
|
msgid "Trial|Allowed characters: +, 0-9, -, and spaces."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Trial|Company name"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|Continue"
|
msgid "Trial|Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Trial|Continue using the basic features of GitLab for free."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|Country"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|Dismiss"
|
msgid "Trial|Dismiss"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Trial|GitLab Ultimate trial (optional)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|Number of employees"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|Please select a country"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|Telephone number"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|Upgrade to Ultimate to keep using GitLab with advanced features."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|We will activate your trial on your group after you complete this step. After 30 days, you can:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Trial|Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial."
|
msgid "Trial|Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -45625,9 +45583,6 @@ msgstr ""
|
||||||
msgid "Your file must contain a column named %{codeStart}title%{codeEnd}. A %{codeStart}description%{codeEnd} column is optional. The maximum file size allowed is 10 MB."
|
msgid "Your file must contain a column named %{codeStart}title%{codeEnd}. A %{codeStart}description%{codeEnd} column is optional. The maximum file size allowed is 10 MB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Your first project"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Your free group is now limited to %d member"
|
msgid "Your free group is now limited to %d member"
|
||||||
msgid_plural "Your free group is now limited to %d members"
|
msgid_plural "Your free group is now limited to %d members"
|
||||||
msgstr[0] ""
|
msgstr[0] ""
|
||||||
|
|
|
@ -263,6 +263,8 @@ module QA
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_having_both_api_result_and_block(name, api_value)
|
def log_having_both_api_result_and_block(name, api_value)
|
||||||
|
api_value = "[MASKED]" if name == :token
|
||||||
|
|
||||||
QA::Runtime::Logger.debug(<<~MSG.strip)
|
QA::Runtime::Logger.debug(<<~MSG.strip)
|
||||||
<#{self.class}> Attribute #{name.inspect} has both API response `#{api_value}` and a block. API response will be picked. Block will be ignored.
|
<#{self.class}> Attribute #{name.inspect} has both API response `#{api_value}` and a block. API response will be picked. Block will be ignored.
|
||||||
MSG
|
MSG
|
||||||
|
|
|
@ -24,6 +24,10 @@ RSpec.describe QA::Resource::Base do
|
||||||
'block'
|
'block'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
attribute :token do
|
||||||
|
'token_value'
|
||||||
|
end
|
||||||
|
|
||||||
attribute :username do
|
attribute :username do
|
||||||
'qa'
|
'qa'
|
||||||
end
|
end
|
||||||
|
@ -208,6 +212,24 @@ RSpec.describe QA::Resource::Base do
|
||||||
.to have_received(:debug).with(/api_with_block/)
|
.to have_received(:debug).with(/api_with_block/)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when the attribute is token and has a block' do
|
||||||
|
let(:api_resource) { { token: 'another_token_value' } }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(QA::Runtime::Logger).to receive(:debug)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'emits a masked debug log entry' do
|
||||||
|
result = subject.fabricate!(resource: resource)
|
||||||
|
|
||||||
|
expect(result).to be_a(described_class)
|
||||||
|
expect(result.token).to eq('another_token_value')
|
||||||
|
|
||||||
|
expect(QA::Runtime::Logger)
|
||||||
|
.to have_received(:debug).with(/MASKED/)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the attribute is populated via direct assignment' do
|
context 'when the attribute is populated via direct assignment' do
|
||||||
|
|
|
@ -129,3 +129,27 @@ Double `>>>` inside HTML inside blockquote:
|
||||||
>
|
>
|
||||||
> Quote
|
> Quote
|
||||||
|
|
||||||
|
|
||||||
|
Requires a leading blank line
|
||||||
|
>>>
|
||||||
|
Not a quote
|
||||||
|
>>>
|
||||||
|
|
||||||
|
Requires a trailing blank line
|
||||||
|
|
||||||
|
>>>
|
||||||
|
Not a quote
|
||||||
|
>>>
|
||||||
|
Lorem
|
||||||
|
|
||||||
|
Triple quoting is not our blockquote
|
||||||
|
|
||||||
|
>>> foo
|
||||||
|
>>> bar
|
||||||
|
>>>
|
||||||
|
> baz
|
||||||
|
|
||||||
|
> boo
|
||||||
|
>>> far
|
||||||
|
>>>
|
||||||
|
>>> faz
|
||||||
|
|
|
@ -129,3 +129,27 @@ Quote
|
||||||
|
|
||||||
Quote
|
Quote
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
|
Requires a leading blank line
|
||||||
|
>>>
|
||||||
|
Not a quote
|
||||||
|
>>>
|
||||||
|
|
||||||
|
Requires a trailing blank line
|
||||||
|
|
||||||
|
>>>
|
||||||
|
Not a quote
|
||||||
|
>>>
|
||||||
|
Lorem
|
||||||
|
|
||||||
|
Triple quoting is not our blockquote
|
||||||
|
|
||||||
|
>>> foo
|
||||||
|
>>> bar
|
||||||
|
>>>
|
||||||
|
> baz
|
||||||
|
|
||||||
|
> boo
|
||||||
|
>>> far
|
||||||
|
>>>
|
||||||
|
>>> faz
|
||||||
|
|
|
@ -8,7 +8,6 @@ import {
|
||||||
trackSaasTrialSubmit,
|
trackSaasTrialSubmit,
|
||||||
trackSaasTrialSkip,
|
trackSaasTrialSkip,
|
||||||
trackSaasTrialGroup,
|
trackSaasTrialGroup,
|
||||||
trackSaasTrialProject,
|
|
||||||
trackSaasTrialGetStarted,
|
trackSaasTrialGetStarted,
|
||||||
trackTrialAcceptTerms,
|
trackTrialAcceptTerms,
|
||||||
trackCheckout,
|
trackCheckout,
|
||||||
|
@ -150,9 +149,6 @@ describe('~/google_tag_manager/index', () => {
|
||||||
createTestCase(trackSaasTrialGroup, {
|
createTestCase(trackSaasTrialGroup, {
|
||||||
forms: [{ cls: 'js-saas-trial-group', expectation: { event: 'saasTrialGroup' } }],
|
forms: [{ cls: 'js-saas-trial-group', expectation: { event: 'saasTrialGroup' } }],
|
||||||
}),
|
}),
|
||||||
createTestCase(trackSaasTrialProject, {
|
|
||||||
forms: [{ id: 'new_project', expectation: { event: 'saasTrialProject' } }],
|
|
||||||
}),
|
|
||||||
createTestCase(trackProjectImport, {
|
createTestCase(trackProjectImport, {
|
||||||
links: [
|
links: [
|
||||||
{
|
{
|
||||||
|
@ -481,11 +477,11 @@ describe('~/google_tag_manager/index', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('no ops', () => {
|
it('no ops', () => {
|
||||||
setHTMLFixture(createHTML({ forms: [{ id: 'new_project' }] }));
|
setHTMLFixture(createHTML({ forms: [{ cls: 'js-saas-trial-group' }] }));
|
||||||
|
|
||||||
trackSaasTrialProject();
|
trackSaasTrialGroup();
|
||||||
|
|
||||||
triggerEvent('#new_project', 'submit');
|
triggerEvent('.js-saas-trial-group', 'submit');
|
||||||
|
|
||||||
expect(spy).not.toHaveBeenCalled();
|
expect(spy).not.toHaveBeenCalled();
|
||||||
expect(logError).not.toHaveBeenCalled();
|
expect(logError).not.toHaveBeenCalled();
|
||||||
|
@ -506,11 +502,11 @@ describe('~/google_tag_manager/index', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('logs error', () => {
|
it('logs error', () => {
|
||||||
setHTMLFixture(createHTML({ forms: [{ id: 'new_project' }] }));
|
setHTMLFixture(createHTML({ forms: [{ cls: 'js-saas-trial-group' }] }));
|
||||||
|
|
||||||
trackSaasTrialProject();
|
trackSaasTrialGroup();
|
||||||
|
|
||||||
triggerEvent('#new_project', 'submit');
|
triggerEvent('.js-saas-trial-group', 'submit');
|
||||||
|
|
||||||
expect(logError).toHaveBeenCalledWith(
|
expect(logError).toHaveBeenCalledWith(
|
||||||
'Unexpected error while pushing to dataLayer',
|
'Unexpected error while pushing to dataLayer',
|
||||||
|
|
|
@ -1,70 +0,0 @@
|
||||||
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
|
|
||||||
import { shallowMount } from '@vue/test-utils';
|
|
||||||
import Component from '~/groups/components/visibility_level_dropdown.vue';
|
|
||||||
|
|
||||||
describe('Visibility Level Dropdown', () => {
|
|
||||||
let wrapper;
|
|
||||||
|
|
||||||
const options = [
|
|
||||||
{ level: 0, label: 'Private', description: 'Private description' },
|
|
||||||
{ level: 20, label: 'Public', description: 'Public description' },
|
|
||||||
];
|
|
||||||
const defaultLevel = 0;
|
|
||||||
|
|
||||||
const createComponent = (propsData) => {
|
|
||||||
wrapper = shallowMount(Component, {
|
|
||||||
propsData,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
createComponent({
|
|
||||||
visibilityLevelOptions: options,
|
|
||||||
defaultLevel,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
wrapper.destroy();
|
|
||||||
wrapper = null;
|
|
||||||
});
|
|
||||||
|
|
||||||
const hiddenInputValue = () =>
|
|
||||||
wrapper.find("input[name='group[visibility_level]']").attributes('value');
|
|
||||||
const dropdownText = () => wrapper.findComponent(GlDropdown).props('text');
|
|
||||||
const findDropdownItems = () =>
|
|
||||||
wrapper.findAllComponents(GlDropdownItem).wrappers.map((option) => ({
|
|
||||||
text: option.text(),
|
|
||||||
secondaryText: option.props('secondaryText'),
|
|
||||||
}));
|
|
||||||
|
|
||||||
describe('Default values', () => {
|
|
||||||
it('sets the value of the hidden input to the default value', () => {
|
|
||||||
expect(hiddenInputValue()).toBe(options[0].level.toString());
|
|
||||||
});
|
|
||||||
|
|
||||||
it('sets the text of the dropdown to the default value', () => {
|
|
||||||
expect(dropdownText()).toBe(options[0].label);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('shows all dropdown options', () => {
|
|
||||||
expect(findDropdownItems()).toEqual(
|
|
||||||
options.map(({ label, description }) => ({ text: label, secondaryText: description })),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Selecting an option', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper.findAllComponents(GlDropdownItem).at(1).vm.$emit('click');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('sets the value of the hidden input to the selected value', () => {
|
|
||||||
expect(hiddenInputValue()).toBe(options[1].level.toString());
|
|
||||||
});
|
|
||||||
|
|
||||||
it('sets the text of the dropdown to the selected value', () => {
|
|
||||||
expect(dropdownText()).toBe(options[1].label);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -14,10 +14,22 @@ RSpec.describe Banzai::Filter::BlockquoteFenceFilter do
|
||||||
expect(output).to eq(expected)
|
expect(output).to eq(expected)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'does not require newlines at start or end of string' do
|
||||||
|
expect(filter(">>>\ntest\n>>>")).to eq("\n> test\n")
|
||||||
|
end
|
||||||
|
|
||||||
it 'allows trailing whitespace on blockquote fence lines' do
|
it 'allows trailing whitespace on blockquote fence lines' do
|
||||||
expect(filter(">>> \ntest\n>>> ")).to eq("\n> test\n")
|
expect(filter(">>> \ntest\n>>> ")).to eq("\n> test\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when feature flag is turned off' do
|
||||||
|
it 'does not require a leading or trailing blank line' do
|
||||||
|
stub_feature_flags(markdown_corrected_blockquote: false)
|
||||||
|
|
||||||
|
expect(filter("Foo\n>>>\ntest\n>>>\nBar")).to eq("Foo\n\n> test\n\nBar")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when incomplete blockquote fences with multiple blocks are present' do
|
context 'when incomplete blockquote fences with multiple blocks are present' do
|
||||||
it 'does not raise timeout error' do
|
it 'does not raise timeout error' do
|
||||||
test_string = ">>>#{"\n```\nfoo\n```" * 20}"
|
test_string = ">>>#{"\n```\nfoo\n```" * 20}"
|
||||||
|
|
|
@ -32,4 +32,21 @@ RSpec.describe Banzai::Pipeline::PreProcessPipeline do
|
||||||
|
|
||||||
expect(result[:output]).to eq('foo foo f...')
|
expect(result[:output]).to eq('foo foo f...')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when multiline blockquote' do
|
||||||
|
it 'data-sourcepos references correct line in source markdown' do
|
||||||
|
markdown = <<~MD
|
||||||
|
>>>
|
||||||
|
foo
|
||||||
|
>>>
|
||||||
|
MD
|
||||||
|
|
||||||
|
pipeline_output = described_class.call(markdown, {})[:output]
|
||||||
|
pipeline_output = Banzai::Pipeline::PlainMarkdownPipeline.call(pipeline_output, {})[:output]
|
||||||
|
sourcepos = pipeline_output.at('blockquote')['data-sourcepos']
|
||||||
|
source_line = sourcepos.split(':').first.to_i
|
||||||
|
|
||||||
|
expect(markdown.lines[source_line - 1]).to eq "foo\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,9 +9,13 @@ RSpec.describe Gitlab::Shell do
|
||||||
let(:repository) { project.repository }
|
let(:repository) { project.repository }
|
||||||
let(:gitlab_shell) { described_class.new }
|
let(:gitlab_shell) { described_class.new }
|
||||||
|
|
||||||
|
before do
|
||||||
|
described_class.instance_variable_set(:@secret_token, nil)
|
||||||
|
end
|
||||||
|
|
||||||
it { is_expected.to respond_to :remove_repository }
|
it { is_expected.to respond_to :remove_repository }
|
||||||
|
|
||||||
describe 'memoized secret_token' do
|
describe '.secret_token' do
|
||||||
let(:secret_file) { 'tmp/tests/.secret_shell_test' }
|
let(:secret_file) { 'tmp/tests/.secret_shell_test' }
|
||||||
let(:link_file) { 'tmp/tests/shell-secret-test/.gitlab_shell_secret' }
|
let(:link_file) { 'tmp/tests/shell-secret-test/.gitlab_shell_secret' }
|
||||||
|
|
||||||
|
@ -19,7 +23,6 @@ RSpec.describe Gitlab::Shell do
|
||||||
allow(Gitlab.config.gitlab_shell).to receive(:secret_file).and_return(secret_file)
|
allow(Gitlab.config.gitlab_shell).to receive(:secret_file).and_return(secret_file)
|
||||||
allow(Gitlab.config.gitlab_shell).to receive(:path).and_return('tmp/tests/shell-secret-test')
|
allow(Gitlab.config.gitlab_shell).to receive(:path).and_return('tmp/tests/shell-secret-test')
|
||||||
FileUtils.mkdir('tmp/tests/shell-secret-test')
|
FileUtils.mkdir('tmp/tests/shell-secret-test')
|
||||||
described_class.ensure_secret_token!
|
|
||||||
end
|
end
|
||||||
|
|
||||||
after do
|
after do
|
||||||
|
@ -27,13 +30,47 @@ RSpec.describe Gitlab::Shell do
|
||||||
FileUtils.rm_rf(secret_file)
|
FileUtils.rm_rf(secret_file)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates and links the secret token file' do
|
shared_examples 'creates and links the secret token file' do
|
||||||
secret_token = described_class.secret_token
|
it 'creates and links the secret token file' do
|
||||||
|
secret_token = described_class.secret_token
|
||||||
|
|
||||||
expect(File.exist?(secret_file)).to be(true)
|
expect(File.exist?(secret_file)).to be(true)
|
||||||
expect(File.read(secret_file).chomp).to eq(secret_token)
|
expect(File.read(secret_file).chomp).to eq(secret_token)
|
||||||
expect(File.symlink?(link_file)).to be(true)
|
expect(File.symlink?(link_file)).to be(true)
|
||||||
expect(File.readlink(link_file)).to eq(secret_file)
|
expect(File.readlink(link_file)).to eq(secret_file)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'memoized secret_token' do
|
||||||
|
before do
|
||||||
|
described_class.ensure_secret_token!
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'creates and links the secret token file'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when link_file is a broken symbolic link' do
|
||||||
|
before do
|
||||||
|
File.symlink('tmp/tests/non_existing_file', link_file)
|
||||||
|
described_class.ensure_secret_token!
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'creates and links the secret token file'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when secret_file exists' do
|
||||||
|
let(:secret_token) { 'secret-token' }
|
||||||
|
|
||||||
|
before do
|
||||||
|
File.write(secret_file, 'secret-token')
|
||||||
|
described_class.ensure_secret_token!
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'creates and links the secret token file'
|
||||||
|
|
||||||
|
it 'reads the token from the existing file' do
|
||||||
|
expect(described_class.secret_token).to eq(secret_token)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -63,11 +63,13 @@ RSpec.describe Issues::BuildService do
|
||||||
|
|
||||||
it 'wraps the note in a blockquote' do
|
it 'wraps the note in a blockquote' do
|
||||||
note_text = "This is a string\n"\
|
note_text = "This is a string\n"\
|
||||||
|
"\n"\
|
||||||
">>>\n"\
|
">>>\n"\
|
||||||
"with a blockquote\n"\
|
"with a blockquote\n"\
|
||||||
"> That has a quote\n"\
|
"> That has a quote\n"\
|
||||||
">>>\n"
|
">>>\n"
|
||||||
note_result = " > This is a string\n"\
|
note_result = " > This is a string\n"\
|
||||||
|
" > \n"\
|
||||||
" > \n"\
|
" > \n"\
|
||||||
" > > with a blockquote\n"\
|
" > > with a blockquote\n"\
|
||||||
" > > > That has a quote\n"\
|
" > > > That has a quote\n"\
|
||||||
|
|
|
@ -417,10 +417,10 @@ RSpec.describe Projects::CreateService, '#execute' do
|
||||||
expect(imported_project.import_url).to eq('http://import-url')
|
expect(imported_project.import_url).to eq('http://import-url')
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'tracks for the combined_registration experiment', :experiment do
|
it 'tracks for imported project' do
|
||||||
expect(experiment(:combined_registration)).to track(:import_project).on_next_instance
|
|
||||||
|
|
||||||
imported_project
|
imported_project
|
||||||
|
|
||||||
|
expect_snowplow_event(category: described_class.name, action: 'import_project', user: user)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'import scheduling' do
|
describe 'import scheduling' do
|
||||||
|
|
|
@ -216,7 +216,6 @@
|
||||||
- './ee/spec/elastic/migrate/20220512150000_pause_indexing_for_unsupported_es_versions_spec.rb'
|
- './ee/spec/elastic/migrate/20220512150000_pause_indexing_for_unsupported_es_versions_spec.rb'
|
||||||
- './ee/spec/elastic/migrate/20220613120500_migrate_commits_to_separate_index_spec.rb'
|
- './ee/spec/elastic/migrate/20220613120500_migrate_commits_to_separate_index_spec.rb'
|
||||||
- './ee/spec/elastic/migrate/20220713103500_delete_commits_from_original_index_spec.rb'
|
- './ee/spec/elastic/migrate/20220713103500_delete_commits_from_original_index_spec.rb'
|
||||||
- './ee/spec/experiments/combined_registration_experiment_spec.rb'
|
|
||||||
- './ee/spec/factories/lfs_object_spec.rb'
|
- './ee/spec/factories/lfs_object_spec.rb'
|
||||||
- './ee/spec/features/account_recovery_regular_check_spec.rb'
|
- './ee/spec/features/account_recovery_regular_check_spec.rb'
|
||||||
- './ee/spec/features/admin/admin_audit_logs_spec.rb'
|
- './ee/spec/features/admin/admin_audit_logs_spec.rb'
|
||||||
|
|
|
@ -62,9 +62,14 @@ module OmniAuth
|
||||||
end
|
end
|
||||||
|
|
||||||
extra do
|
extra do
|
||||||
prune!(
|
hash = {}
|
||||||
raw_info.delete_if{ |k,v| AuthHashSchemaKeys.include?(k) }
|
|
||||||
)
|
unless skip_info?
|
||||||
|
hash = raw_info.dup
|
||||||
|
hash.delete_if { |k, _v| AuthHashSchemaKeys.include?(k) }
|
||||||
|
end
|
||||||
|
|
||||||
|
prune! hash
|
||||||
end
|
end
|
||||||
|
|
||||||
uid do
|
uid do
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
require 'securerandom'
|
||||||
|
|
||||||
describe OmniAuth::Strategies::CAS3, type: :strategy do
|
describe OmniAuth::Strategies::CAS3, type: :strategy do
|
||||||
include Rack::Test::Methods
|
include Rack::Test::Methods
|
||||||
|
@ -15,17 +16,32 @@ describe OmniAuth::Strategies::CAS3, type: :strategy do
|
||||||
}.to_app
|
}.to_app
|
||||||
end
|
end
|
||||||
|
|
||||||
|
let(:csrf_token) { SecureRandom.base64(32) }
|
||||||
|
let(:base_env) { { 'rack.session' => { csrf: csrf_token }, 'rack.input' => StringIO.new("authenticity_token=#{escaped_token}") } }
|
||||||
|
let(:post_env) { make_env('/auth/cas3', base_env.merge(request_env)) }
|
||||||
|
let(:escaped_token) { URI.encode_www_form_component(csrf_token, Encoding::UTF_8) }
|
||||||
|
|
||||||
|
def make_env(path = '/auth/cas3', props = {})
|
||||||
|
{
|
||||||
|
'REQUEST_METHOD' => 'POST',
|
||||||
|
'PATH_INFO' => path,
|
||||||
|
'rack.session' => {},
|
||||||
|
'rack.input' => StringIO.new('test=true')
|
||||||
|
}.merge(props)
|
||||||
|
end
|
||||||
|
|
||||||
# TODO: Verify that these are even useful tests
|
# TODO: Verify that these are even useful tests
|
||||||
shared_examples_for 'a CAS redirect response' do
|
shared_examples_for 'a CAS redirect response' do
|
||||||
let(:redirect_params) { 'service=' + Rack::Utils.escape("http://example.org/auth/cas3/callback?url=#{Rack::Utils.escape(return_url)}") }
|
let(:redirect_params) { 'service=' + Rack::Utils.escape("http://example.org/auth/cas3/callback?url=#{Rack::Utils.escape(return_url)}") }
|
||||||
|
|
||||||
before { get url, nil, request_env }
|
before { post url, nil, post_env }
|
||||||
|
|
||||||
subject { last_response }
|
subject { last_response }
|
||||||
|
|
||||||
it { should be_redirect }
|
it { should be_redirect }
|
||||||
|
|
||||||
it 'redirects to the CAS server' do
|
it 'redirects to the CAS server' do
|
||||||
|
expect(subject.status).to eq(302)
|
||||||
expect(subject.headers).to include 'Location' => "http://cas.example.org:8080/login?#{redirect_params}"
|
expect(subject.headers).to include 'Location' => "http://cas.example.org:8080/login?#{redirect_params}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -78,7 +94,7 @@ describe OmniAuth::Strategies::CAS3, type: :strategy do
|
||||||
it { should include('ssl' => true) }
|
it { should include('ssl' => true) }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET /auth/cas3' do
|
describe 'POST /auth/cas3' do
|
||||||
let(:return_url) { 'http://myapp.com/admin/foo' }
|
let(:return_url) { 'http://myapp.com/admin/foo' }
|
||||||
|
|
||||||
context 'with a referer' do
|
context 'with a referer' do
|
||||||
|
|
Loading…
Reference in New Issue