Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									3837dbda37
								
							
						
					
					
						commit
						de3e5b6772
					
				|  | @ -29,4 +29,5 @@ This issue template is for an actionable insight that requires a change in the p | ||||||
| 
 | 
 | ||||||
| /confidential | /confidential | ||||||
| /label ~"Actionable Insight::Product change" | /label ~"Actionable Insight::Product change" | ||||||
|  | /label ~"SUS" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										18
									
								
								.rubocop.yml
								
								
								
								
							
							
						
						
									
										18
									
								
								.rubocop.yml
								
								
								
								
							|  | @ -517,24 +517,6 @@ Graphql/Descriptions: | ||||||
| RSpec/ImplicitSubject: | RSpec/ImplicitSubject: | ||||||
|   Enabled: false |   Enabled: false | ||||||
| 
 | 
 | ||||||
| # WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/211580 |  | ||||||
| RSpec/LeakyConstantDeclaration: |  | ||||||
|   Enabled: true |  | ||||||
|   Exclude: |  | ||||||
|     - 'spec/db/schema_spec.rb' |  | ||||||
|     - 'spec/lib/feature_spec.rb' |  | ||||||
|     - 'spec/lib/gitlab/config/entry/simplifiable_spec.rb' |  | ||||||
|     - 'spec/lib/gitlab/quick_actions/dsl_spec.rb' |  | ||||||
|     - 'spec/lib/marginalia_spec.rb' |  | ||||||
|     - 'spec/mailers/notify_spec.rb' |  | ||||||
|     - 'spec/models/concerns/batch_destroy_dependent_associations_spec.rb' |  | ||||||
|     - 'spec/models/concerns/bulk_insert_safe_spec.rb' |  | ||||||
|     - 'spec/models/concerns/bulk_insertable_associations_spec.rb' |  | ||||||
|     - 'spec/models/concerns/triggerable_hooks_spec.rb' |  | ||||||
|     - 'spec/models/repository_spec.rb' |  | ||||||
|     - 'spec/services/clusters/applications/check_installation_progress_service_spec.rb' |  | ||||||
|     - 'spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb' |  | ||||||
| 
 |  | ||||||
| RSpec/EmptyLineAfterHook: | RSpec/EmptyLineAfterHook: | ||||||
|   Enabled: false |   Enabled: false | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | --- | ||||||
|  | RSpec/LeakyConstantDeclaration: | ||||||
|  |   Exclude: | ||||||
|  |   - spec/db/schema_spec.rb | ||||||
|  |   - spec/lib/gitlab/config/entry/simplifiable_spec.rb | ||||||
|  |   - spec/lib/gitlab/quick_actions/dsl_spec.rb | ||||||
|  |   - spec/lib/marginalia_spec.rb | ||||||
|  |   - spec/mailers/notify_spec.rb | ||||||
|  |   - spec/models/concerns/batch_destroy_dependent_associations_spec.rb | ||||||
|  |   - spec/models/concerns/bulk_insert_safe_spec.rb | ||||||
|  |   - spec/models/concerns/bulk_insertable_associations_spec.rb | ||||||
|  |   - spec/models/concerns/triggerable_hooks_spec.rb | ||||||
|  |   - spec/models/repository_spec.rb | ||||||
|  |   - spec/services/clusters/applications/check_installation_progress_service_spec.rb | ||||||
|  |   - spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb | ||||||
|  | @ -22,7 +22,7 @@ | ||||||
|   - [Code format](#code-format) |   - [Code format](#code-format) | ||||||
|   - [Issue fixed in newer version](#issue-fixed-in-newer-version) |   - [Issue fixed in newer version](#issue-fixed-in-newer-version) | ||||||
|   - [Improperly formatted merge request](#improperly-formatted-merge-request) |   - [Improperly formatted merge request](#improperly-formatted-merge-request) | ||||||
|   - [Accepting merge requests](#accepting-merge-requests) |   - [Seeking community contributions](#seeking-community-contributions) | ||||||
|   - [Only accepting merge requests with green tests](#only-accepting-merge-requests-with-green-tests) |   - [Only accepting merge requests with green tests](#only-accepting-merge-requests-with-green-tests) | ||||||
| 
 | 
 | ||||||
| <!-- END doctoc generated TOC please keep comment here to allow auto update --> | <!-- END doctoc generated TOC please keep comment here to allow auto update --> | ||||||
|  | @ -195,14 +195,14 @@ Thanks for your interest in improving the GitLab codebase! | ||||||
| Please update your merge request according to the [contributing guidelines](https://gitlab.com/gitlab-org/gitlab/blob/master/doc/development/contributing/merge_request_workflow.md#merge-request-guidelines). | Please update your merge request according to the [contributing guidelines](https://gitlab.com/gitlab-org/gitlab/blob/master/doc/development/contributing/merge_request_workflow.md#merge-request-guidelines). | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ### Accepting merge requests | ### Seeking community contributions | ||||||
| 
 | 
 | ||||||
| ``` | ``` | ||||||
| Is there an issue on the | Is there an issue on the | ||||||
| [issue tracker](https://gitlab.com/gitlab-org/gitlab/issues) that is | [issue tracker](https://gitlab.com/gitlab-org/gitlab/issues) that is | ||||||
| similar to this? Could you please link it here? | similar to this? Could you please link it here? | ||||||
| Please be aware that new functionality that is not marked | Please be aware that new functionality that is not marked | ||||||
| [`Accepting merge requests`](https://docs.gitlab.com/ee/development/contributing/issue_workflow.html#label-for-community-contributors) | [`Seeking community contributions`](https://docs.gitlab.com/ee/development/contributing/issue_workflow.html#label-for-community-contributors) | ||||||
| might not make it into GitLab. | might not make it into GitLab. | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <script> | <script> | ||||||
| import { GlDaterangePicker, GlSprintf, GlIcon, GlTooltipDirective } from '@gitlab/ui'; | import { GlDaterangePicker, GlSprintf } from '@gitlab/ui'; | ||||||
| import { getDayDifference } from '~/lib/utils/datetime_utility'; | import { getDayDifference } from '~/lib/utils/datetime_utility'; | ||||||
| import { __, sprintf } from '~/locale'; | import { __, sprintf } from '~/locale'; | ||||||
| import { OFFSET_DATE_BY_ONE } from '../constants'; | import { OFFSET_DATE_BY_ONE } from '../constants'; | ||||||
|  | @ -8,10 +8,6 @@ export default { | ||||||
|   components: { |   components: { | ||||||
|     GlDaterangePicker, |     GlDaterangePicker, | ||||||
|     GlSprintf, |     GlSprintf, | ||||||
|     GlIcon, |  | ||||||
|   }, |  | ||||||
|   directives: { |  | ||||||
|     GlTooltip: GlTooltipDirective, |  | ||||||
|   }, |   }, | ||||||
|   props: { |   props: { | ||||||
|     show: { |     show: { | ||||||
|  | @ -56,7 +52,7 @@ export default { | ||||||
|     return { |     return { | ||||||
|       maxDateRangeTooltip: sprintf( |       maxDateRangeTooltip: sprintf( | ||||||
|         __( |         __( | ||||||
|           'Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days.', |           'Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days.', | ||||||
|         ), |         ), | ||||||
|         { |         { | ||||||
|           maxDateRange: this.maxDateRange, |           maxDateRange: this.maxDateRange, | ||||||
|  | @ -94,28 +90,15 @@ export default { | ||||||
|       :max-date-range="maxDateRange" |       :max-date-range="maxDateRange" | ||||||
|       :default-max-date="maxDate" |       :default-max-date="maxDate" | ||||||
|       :same-day-selection="includeSelectedDate" |       :same-day-selection="includeSelectedDate" | ||||||
|  |       :tooltip="maxDateRangeTooltip" | ||||||
|       theme="animate-picker" |       theme="animate-picker" | ||||||
|       start-picker-class="js-daterange-picker-from gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row gl-lg-align-items-center gl-lg-mr-3 gl-mb-2 gl-lg-mb-0" |       start-picker-class="js-daterange-picker-from gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row gl-lg-align-items-center gl-lg-mr-3 gl-mb-2 gl-lg-mb-0" | ||||||
|       end-picker-class="js-daterange-picker-to d-flex flex-column flex-lg-row align-items-lg-center" |       end-picker-class="js-daterange-picker-to d-flex flex-column flex-lg-row align-items-lg-center gl-mb-2 gl-lg-mb-0" | ||||||
|       label-class="gl-mb-2 gl-lg-mb-0" |       label-class="gl-mb-2 gl-lg-mb-0" | ||||||
|     /> |  | ||||||
|     <div |  | ||||||
|       v-if="maxDateRange" |  | ||||||
|       class="daterange-indicator d-flex flex-row flex-lg-row align-items-flex-start align-items-lg-center" |  | ||||||
|     > |     > | ||||||
|       <span class="number-of-days pl-2 pr-1"> |  | ||||||
|       <gl-sprintf :message="n__('1 day selected', '%d days selected', numberOfDays)"> |       <gl-sprintf :message="n__('1 day selected', '%d days selected', numberOfDays)"> | ||||||
|         <template #numberOfDays>{{ numberOfDays }}</template> |         <template #numberOfDays>{{ numberOfDays }}</template> | ||||||
|       </gl-sprintf> |       </gl-sprintf> | ||||||
|       </span> |     </gl-daterange-picker> | ||||||
|       <gl-icon |  | ||||||
|         v-gl-tooltip |  | ||||||
|         data-testid="helper-icon" |  | ||||||
|         :title="maxDateRangeTooltip" |  | ||||||
|         name="question" |  | ||||||
|         :size="14" |  | ||||||
|         class="text-secondary" |  | ||||||
|       /> |  | ||||||
|     </div> |  | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,13 @@ | ||||||
| <script> | <script> | ||||||
| import { GlDropdown, GlDropdownItem, GlModalDirective, GlTooltipDirective } from '@gitlab/ui'; | import { | ||||||
|  |   GlDropdown, | ||||||
|  |   GlDropdownItem, | ||||||
|  |   GlModalDirective, | ||||||
|  |   GlTooltipDirective, | ||||||
|  |   GlDropdownDivider, | ||||||
|  |   GlDropdownSectionHeader, | ||||||
|  | } from '@gitlab/ui'; | ||||||
|  | 
 | ||||||
| import { INSTALL_AGENT_MODAL_ID, CLUSTERS_ACTIONS } from '../constants'; | import { INSTALL_AGENT_MODAL_ID, CLUSTERS_ACTIONS } from '../constants'; | ||||||
| 
 | 
 | ||||||
| export default { | export default { | ||||||
|  | @ -8,6 +16,8 @@ export default { | ||||||
|   components: { |   components: { | ||||||
|     GlDropdown, |     GlDropdown, | ||||||
|     GlDropdownItem, |     GlDropdownItem, | ||||||
|  |     GlDropdownDivider, | ||||||
|  |     GlDropdownSectionHeader, | ||||||
|   }, |   }, | ||||||
|   directives: { |   directives: { | ||||||
|     GlModalDirective, |     GlModalDirective, | ||||||
|  | @ -36,15 +46,18 @@ export default { | ||||||
|       split |       split | ||||||
|       right |       right | ||||||
|     > |     > | ||||||
|       <gl-dropdown-item :href="newClusterPath" data-testid="new-cluster-link" @click.stop> |       <gl-dropdown-section-header>{{ $options.i18n.agent }}</gl-dropdown-section-header> | ||||||
|         {{ $options.i18n.createNewCluster }} |  | ||||||
|       </gl-dropdown-item> |  | ||||||
|       <gl-dropdown-item |       <gl-dropdown-item | ||||||
|         v-gl-modal-directive="$options.INSTALL_AGENT_MODAL_ID" |         v-gl-modal-directive="$options.INSTALL_AGENT_MODAL_ID" | ||||||
|         data-testid="connect-new-agent-link" |         data-testid="connect-new-agent-link" | ||||||
|       > |       > | ||||||
|         {{ $options.i18n.connectWithAgent }} |         {{ $options.i18n.connectWithAgent }} | ||||||
|       </gl-dropdown-item> |       </gl-dropdown-item> | ||||||
|  |       <gl-dropdown-divider /> | ||||||
|  |       <gl-dropdown-section-header>{{ $options.i18n.certificate }}</gl-dropdown-section-header> | ||||||
|  |       <gl-dropdown-item :href="newClusterPath" data-testid="new-cluster-link" @click.stop> | ||||||
|  |         {{ $options.i18n.createNewCluster }} | ||||||
|  |       </gl-dropdown-item> | ||||||
|       <gl-dropdown-item :href="addClusterPath" data-testid="connect-cluster-link" @click.stop> |       <gl-dropdown-item :href="addClusterPath" data-testid="connect-cluster-link" @click.stop> | ||||||
|         {{ $options.i18n.connectExistingCluster }} |         {{ $options.i18n.connectExistingCluster }} | ||||||
|       </gl-dropdown-item> |       </gl-dropdown-item> | ||||||
|  |  | ||||||
|  | @ -234,6 +234,8 @@ export const CLUSTERS_ACTIONS = { | ||||||
|   createNewCluster: s__('ClusterAgents|Create a new cluster'), |   createNewCluster: s__('ClusterAgents|Create a new cluster'), | ||||||
|   connectWithAgent: s__('ClusterAgents|Connect with agent'), |   connectWithAgent: s__('ClusterAgents|Connect with agent'), | ||||||
|   connectExistingCluster: s__('ClusterAgents|Connect with a certificate'), |   connectExistingCluster: s__('ClusterAgents|Connect with a certificate'), | ||||||
|  |   agent: s__('ClusterAgents|Agent'), | ||||||
|  |   certificate: s__('ClusterAgents|Certificate'), | ||||||
|   dropdownDisabledHint: s__( |   dropdownDisabledHint: s__( | ||||||
|     'ClusterAgents|Requires a Maintainer or greater role to perform these actions', |     'ClusterAgents|Requires a Maintainer or greater role to perform these actions', | ||||||
|   ), |   ), | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ import { | ||||||
| } from '@gitlab/ui'; | } from '@gitlab/ui'; | ||||||
| import { __, s__ } from '~/locale'; | import { __, s__ } from '~/locale'; | ||||||
| import { truncate } from '~/lib/utils/text_utility'; | import { truncate } from '~/lib/utils/text_utility'; | ||||||
|  | import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; | ||||||
| import isLastDeployment from '../graphql/queries/is_last_deployment.query.graphql'; | import isLastDeployment from '../graphql/queries/is_last_deployment.query.graphql'; | ||||||
| import ExternalUrl from './environment_external_url.vue'; | import ExternalUrl from './environment_external_url.vue'; | ||||||
| import Actions from './environment_actions.vue'; | import Actions from './environment_actions.vue'; | ||||||
|  | @ -35,6 +36,7 @@ export default { | ||||||
|     Monitoring, |     Monitoring, | ||||||
|     Pin, |     Pin, | ||||||
|     Terminal, |     Terminal, | ||||||
|  |     TimeAgoTooltip, | ||||||
|     Delete, |     Delete, | ||||||
|   }, |   }, | ||||||
|   directives: { |   directives: { | ||||||
|  | @ -66,6 +68,7 @@ export default { | ||||||
|     emptyState: s__( |     emptyState: s__( | ||||||
|       'Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}', |       'Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}', | ||||||
|     ), |     ), | ||||||
|  |     autoStopIn: s__('Environment|Auto stop %{time}'), | ||||||
|   }, |   }, | ||||||
|   data() { |   data() { | ||||||
|     return { visible: false }; |     return { visible: false }; | ||||||
|  | @ -185,7 +188,14 @@ export default { | ||||||
|           {{ displayName }} |           {{ displayName }} | ||||||
|         </gl-link> |         </gl-link> | ||||||
|       </div> |       </div> | ||||||
|       <div> |       <div class="gl-display-flex gl-align-items-center"> | ||||||
|  |         <p v-if="canShowAutoStopDate" class="gl-font-sm gl-text-gray-700 gl-mr-5 gl-mb-0"> | ||||||
|  |           <gl-sprintf :message="$options.i18n.autoStopIn"> | ||||||
|  |             <template #time> | ||||||
|  |               <time-ago-tooltip :time="environment.autoStopAt" css-class="gl-font-weight-bold" /> | ||||||
|  |             </template> | ||||||
|  |           </gl-sprintf> | ||||||
|  |         </p> | ||||||
|         <div class="btn-group table-action-buttons" role="group"> |         <div class="btn-group table-action-buttons" role="group"> | ||||||
|           <external-url |           <external-url | ||||||
|             v-if="externalUrl" |             v-if="externalUrl" | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| import Visibility from 'visibilityjs'; | import Visibility from 'visibilityjs'; | ||||||
| import createFlash from '~/flash'; | import createFlash from '~/flash'; | ||||||
| import { historyPushState, buildUrlWithCurrentLocation } from '~/lib/utils/common_utils'; | import { historyPushState, buildUrlWithCurrentLocation } from '~/lib/utils/common_utils'; | ||||||
|  | import httpStatusCodes from '~/lib/utils/http_status'; | ||||||
| import Poll from '~/lib/utils/poll'; | import Poll from '~/lib/utils/poll'; | ||||||
| import { __ } from '~/locale'; | import { __ } from '~/locale'; | ||||||
| import { validateParams } from '~/pipelines/utils'; | import { validateParams } from '~/pipelines/utils'; | ||||||
|  | @ -195,11 +196,20 @@ export default { | ||||||
|           this.$toast.show(TOAST_MESSAGE); |           this.$toast.show(TOAST_MESSAGE); | ||||||
|           this.updateTable(); |           this.updateTable(); | ||||||
|         }) |         }) | ||||||
|         .catch(() => { |         .catch((e) => { | ||||||
|           createFlash({ |           const unauthorized = e.response.status === httpStatusCodes.UNAUTHORIZED; | ||||||
|             message: __( |           const badRequest = e.response.status === httpStatusCodes.BAD_REQUEST; | ||||||
|  | 
 | ||||||
|  |           let errorMessage = __( | ||||||
|             'An error occurred while trying to run a new pipeline for this merge request.', |             'An error occurred while trying to run a new pipeline for this merge request.', | ||||||
|             ), |           ); | ||||||
|  | 
 | ||||||
|  |           if (unauthorized || badRequest) { | ||||||
|  |             errorMessage = __('You do not have permission to run a pipeline on this branch.'); | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|  |           createFlash({ | ||||||
|  |             message: errorMessage, | ||||||
|           }); |           }); | ||||||
|         }) |         }) | ||||||
|         .finally(() => this.store.toggleIsRunningPipeline(false)); |         .finally(() => this.store.toggleIsRunningPipeline(false)); | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ export default { | ||||||
|     WelcomePage, |     WelcomePage, | ||||||
|     LegacyContainer, |     LegacyContainer, | ||||||
|     CreditCardVerification: () => |     CreditCardVerification: () => | ||||||
|       import('ee_component/pages/groups/new/components/credit_card_verification.vue'), |       import('ee_component/namespaces/verification/components/credit_card_verification.vue'), | ||||||
|   }, |   }, | ||||||
|   directives: { |   directives: { | ||||||
|     SafeHtml, |     SafeHtml, | ||||||
|  |  | ||||||
|  | @ -16,7 +16,7 @@ | ||||||
|           .float-right |           .float-right | ||||||
|             %span.light.vertical-align-middle= group_member.human_access |             %span.light.vertical-align-middle= group_member.human_access | ||||||
|             - unless group_member.owner? |             - unless group_member.owner? | ||||||
|               = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member), testid: 'remove-user' }, method: :delete, remote: true, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from group') do |               = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member), confirm_btn_variant: 'danger', testid: 'remove-user' }, aria: { label: _('Remove') }, method: :delete, remote: true, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from group') do | ||||||
|                 = sprite_icon('remove', size: 16, css_class: 'gl-icon') |                 = sprite_icon('remove', size: 16, css_class: 'gl-icon') | ||||||
| 
 | 
 | ||||||
| .row | .row | ||||||
|  | @ -46,7 +46,7 @@ | ||||||
|                   %span.light.vertical-align-middle= member.human_access |                   %span.light.vertical-align-middle= member.human_access | ||||||
| 
 | 
 | ||||||
|                   - if member.respond_to? :project |                   - if member.respond_to? :project | ||||||
|                     = link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member) }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from project') do |                     = link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member), confirm_btn_variant: 'danger' }, aria: { label: _('Remove') }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from project') do | ||||||
|                       = sprite_icon('remove', size: 16, css_class: 'gl-icon') |                       = sprite_icon('remove', size: 16, css_class: 'gl-icon') | ||||||
| 
 | 
 | ||||||
| = render partial: 'admin/users/modals' | = render partial: 'admin/users/modals' | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ | ||||||
|             = check_box_tag checkbox_id, nil, false, class: "check-all-issues left" |             = check_box_tag checkbox_id, nil, false, class: "check-all-issues left" | ||||||
|         - if is_epic_board |         - if is_epic_board | ||||||
|           #js-board-filtered-search{ data: { full_path: @group&.full_path } } |           #js-board-filtered-search{ data: { full_path: @group&.full_path } } | ||||||
|         - elsif Feature.enabled?(:issue_boards_filtered_search, ff_resource) && board |         - elsif Feature.enabled?(:issue_boards_filtered_search, ff_resource, default_enabled: :yaml) && board | ||||||
|           #js-issue-board-filtered-search |           #js-issue-board-filtered-search | ||||||
|         - else |         - else | ||||||
|           .issues-other-filters.filtered-search-wrapper.d-flex.flex-column.flex-md-row |           .issues-other-filters.filtered-search-wrapper.d-flex.flex-column.flex-md-row | ||||||
|  |  | ||||||
|  | @ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/331649 | ||||||
| milestone: '14.1' | milestone: '14.1' | ||||||
| type: development | type: development | ||||||
| group: group::product planning | group: group::product planning | ||||||
| default_enabled: false | default_enabled: true | ||||||
|  |  | ||||||
|  | @ -91,7 +91,7 @@ Sign up for the mailing list, answer GitLab questions on StackOverflow or respon | ||||||
| If you would like to contribute to GitLab: | If you would like to contribute to GitLab: | ||||||
| 
 | 
 | ||||||
| - Issues with the | - Issues with the | ||||||
|   [`~Accepting merge requests` label](issue_workflow.md#label-for-community-contributors) |   [`~Seeking community contributions` label](issue_workflow.md#label-for-community-contributors) | ||||||
|   are a great place to start. |   are a great place to start. | ||||||
| - Optimizing our tests is another great opportunity to contribute. You can use | - Optimizing our tests is another great opportunity to contribute. You can use | ||||||
|   [RSpec profiling statistics](https://gitlab-org.gitlab.io/rspec_profiling_stats/) to identify |   [RSpec profiling statistics](https://gitlab-org.gitlab.io/rspec_profiling_stats/) to identify | ||||||
|  |  | ||||||
|  | @ -282,12 +282,12 @@ Please refer to the issue triage [severity label](https://about.gitlab.com/handb | ||||||
| 
 | 
 | ||||||
| ### Label for community contributors | ### Label for community contributors | ||||||
| 
 | 
 | ||||||
| Issues that are beneficial to our users, 'nice to haves', that we currently do | There are many issues that have a clear solution with uncontroversial benefit to GitLab users. | ||||||
| not have the capacity for or want to give the priority to, are labeled as | However, GitLab might not have the capacity for all these proposals in the current roadmap. | ||||||
| ~"Accepting merge requests", so the community can make a contribution. | These issues are labeled ~"Seeking community contributions" because we welcome merge requests to resolve them. | ||||||
| 
 | 
 | ||||||
| Community contributors can submit merge requests for any issue they want, but | Community contributors can submit merge requests for any issue they want, but | ||||||
| the ~"Accepting merge requests" label has a special meaning. It points to | the ~"Seeking community contributions" label has a special meaning. It points to | ||||||
| changes that: | changes that: | ||||||
| 
 | 
 | ||||||
| 1. We already agreed on, | 1. We already agreed on, | ||||||
|  | @ -295,20 +295,24 @@ changes that: | ||||||
| 1. Are likely to get accepted by a maintainer. | 1. Are likely to get accepted by a maintainer. | ||||||
| 
 | 
 | ||||||
| We want to avoid a situation when a contributor picks an | We want to avoid a situation when a contributor picks an | ||||||
| ~"Accepting merge requests" issue and then their merge request gets closed, | ~"Seeking community contributions" issue and then their merge request gets closed, | ||||||
| because we realize that it does not fit our vision, or we want to solve it in a | because we realize that it does not fit our vision, or we want to solve it in a | ||||||
| different way. | different way. | ||||||
| 
 | 
 | ||||||
| We automatically add the ~"Accepting merge requests" label to issues | We manually add the ~"Seeking community contributions" label to issues | ||||||
| that match the [triage policy](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#accepting-merge-requests). | that fit the criteria described above. | ||||||
|  | We do not automatically add this label, because it requires human evaluation. | ||||||
| 
 | 
 | ||||||
| We recommend people that have never contributed to any open source project to | We recommend people that have never contributed to any open source project to | ||||||
| look for issues labeled `~"Accepting merge requests"` with a [weight of 1](https://gitlab.com/groups/gitlab-org/-/issues?state=opened&label_name[]=Accepting+merge+requests&assignee_id=None&sort=weight&weight=1) or the `~"good for new contributors"` [label](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&label_name[]=good%20for%20new%20contributors&assignee_id=None) attached to it. | look for issues labeled `~"Seeking community contributions"` with a | ||||||
|  | [weight of 1](https://gitlab.com/groups/gitlab-org/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&assignee_id=None&weight=1) or the `~"good for new contributors"` | ||||||
|  | [label](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&label_name[]=good%20for%20new%20contributors&assignee_id=None) | ||||||
|  | attached to it. | ||||||
| More experienced contributors are very welcome to tackle | More experienced contributors are very welcome to tackle | ||||||
| [any of them](https://gitlab.com/groups/gitlab-org/-/issues?state=opened&label_name[]=Accepting+merge+requests&assignee_id=None). | [any of them](https://gitlab.com/groups/gitlab-org/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&assignee_id=None). | ||||||
| 
 | 
 | ||||||
| For more complex features that have a weight of 2 or more and clear scope, we recommend looking at issues | For more complex features that have a weight of 2 or more and clear scope, we recommend looking at issues | ||||||
| with the [label `~"Community Challenge"`](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&label_name[]=Accepting%20merge%20requests&label_name[]=Community%20challenge). | with the [label `~"Community Challenge"`](https://gitlab.com/gitlab-org/gitlab/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&label_name[]=Community+challenge). | ||||||
| If your MR for the `~"Community Challenge"` issue gets merged, you will also have a chance to win a custom | If your MR for the `~"Community Challenge"` issue gets merged, you will also have a chance to win a custom | ||||||
| GitLab merchandise. | GitLab merchandise. | ||||||
| 
 | 
 | ||||||
|  | @ -319,7 +323,7 @@ members to further discuss scope, design, and technical considerations. This wil | ||||||
| ensure that your contribution is aligned with the GitLab product and minimize | ensure that your contribution is aligned with the GitLab product and minimize | ||||||
| any rework and delay in getting it merged into main. | any rework and delay in getting it merged into main. | ||||||
| 
 | 
 | ||||||
| GitLab team members who apply the ~"Accepting merge requests" label to an issue | GitLab team members who apply the ~"Seeking community contributions" label to an issue | ||||||
| should update the issue description with a responsible product manager, inviting | should update the issue description with a responsible product manager, inviting | ||||||
| any potential community contributor to @-mention per above. | any potential community contributor to @-mention per above. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w | ||||||
| 
 | 
 | ||||||
| We welcome merge requests from everyone, with fixes and improvements | We welcome merge requests from everyone, with fixes and improvements | ||||||
| to GitLab code, tests, and documentation. The issues that are specifically suitable | to GitLab code, tests, and documentation. The issues that are specifically suitable | ||||||
| for community contributions are listed with the [`Accepting merge requests`](issue_workflow.md#label-for-community-contributors) | for community contributions have the [`Seeking community contributions`](issue_workflow.md#label-for-community-contributors) | ||||||
| label, but you are free to contribute to any issue you want. | label, but you are free to contribute to any issue you want. | ||||||
| 
 | 
 | ||||||
| If an issue is marked for the current milestone at any time, even | If an issue is marked for the current milestone at any time, even | ||||||
|  | @ -18,7 +18,7 @@ in order to ensure the work is finished before the release date. | ||||||
| 
 | 
 | ||||||
| If you want to add a new feature that is not labeled, it is best to first create | If you want to add a new feature that is not labeled, it is best to first create | ||||||
| an issue (if there isn't one already) and leave a comment asking for it | an issue (if there isn't one already) and leave a comment asking for it | ||||||
| to be marked as `Accepting merge requests`. See the [feature proposals](issue_workflow.md#feature-proposals) | to be labeled as `Seeking community contributions`. See the [feature proposals](issue_workflow.md#feature-proposals) | ||||||
| section. | section. | ||||||
| 
 | 
 | ||||||
| Merge requests should be submitted to the appropriate project at GitLab.com, for example | Merge requests should be submitted to the appropriate project at GitLab.com, for example | ||||||
|  |  | ||||||
|  | @ -13,7 +13,10 @@ onto your cluster. | ||||||
| 
 | 
 | ||||||
| ## Prerequisites | ## Prerequisites | ||||||
| 
 | 
 | ||||||
| - An existing Kubernetes cluster. | - An existing Kubernetes cluster. If you don't have a cluster yet, you can create a new cluster on cloud providers, such as: | ||||||
|  |   - [Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine/docs/quickstart) | ||||||
|  |   - [Amazon Elastic Kubernetes Service (EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) | ||||||
|  |   - [Digital Ocean](https://docs.digitalocean.com/products/kubernetes/quickstart/) | ||||||
| - On self-managed GitLab instances, a GitLab administrator needs to set up the [GitLab Agent Server (KAS)](../../../../administration/clusters/kas.md). | - On self-managed GitLab instances, a GitLab administrator needs to set up the [GitLab Agent Server (KAS)](../../../../administration/clusters/kas.md). | ||||||
| 
 | 
 | ||||||
| ## Installation steps | ## Installation steps | ||||||
|  |  | ||||||
|  | @ -384,6 +384,24 @@ Additional improvements to the | ||||||
| [graphical interface for managing state files](https://gitlab.com/groups/gitlab-org/-/epics/4563) | [graphical interface for managing state files](https://gitlab.com/groups/gitlab-org/-/epics/4563) | ||||||
| are planned. | are planned. | ||||||
| 
 | 
 | ||||||
|  | ## Manage individual Terraform state versions | ||||||
|  | 
 | ||||||
|  | > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207347) in GitLab 13.4. | ||||||
|  | 
 | ||||||
|  | Individual state versions can be managed using the GitLab REST API. | ||||||
|  | 
 | ||||||
|  | Users with the [Developer role](../../permissions.md) can retrieve state versions using their serial number. To retrieve a version: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/<your_project_id>/terraform/state/<your_state_name>/versions/<version-serial>" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Users with the [Maintainer role](../../permissions.md) can remove state versions using their serial number. To remove a version: | ||||||
|  | 
 | ||||||
|  | ```shell | ||||||
|  | curl --header "Private-Token: <your_access_token>" --request DELETE "https://gitlab.example.com/api/v4/projects/<your_project_id>/terraform/state/<your_state_name>/versions/<version-serial>" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
| ## Remove a state file | ## Remove a state file | ||||||
| 
 | 
 | ||||||
| Users with Maintainer and greater [permissions](../../permissions.md) can use the | Users with Maintainer and greater [permissions](../../permissions.md) can use the | ||||||
|  |  | ||||||
|  | @ -89,7 +89,7 @@ You can view which pipeline published the package, and the commit and user who t | ||||||
| ## Reduce storage usage | ## Reduce storage usage | ||||||
| 
 | 
 | ||||||
| For information on reducing your storage use for the Package Registry, see | For information on reducing your storage use for the Package Registry, see | ||||||
| [Reduce Dependency Proxy storage use](reduce_package_registry_storage.md). | [Reduce Package Registry storage use](reduce_package_registry_storage.md). | ||||||
| 
 | 
 | ||||||
| ## Disable the Package Registry | ## Disable the Package Registry | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -81,8 +81,9 @@ The following table lists project permissions available for each role: | ||||||
| | [Clusters](infrastructure/clusters/index.md):<br>View clusters                                                                                                                            |          |          | ✓         | ✓          | ✓     | | | [Clusters](infrastructure/clusters/index.md):<br>View clusters                                                                                                                            |          |          | ✓         | ✓          | ✓     | | ||||||
| | [Clusters](infrastructure/clusters/index.md):<br>Manage clusters                                                                                                                          |          |          |           | ✓          | ✓     | | | [Clusters](infrastructure/clusters/index.md):<br>Manage clusters                                                                                                                          |          |          |           | ✓          | ✓     | | ||||||
| | [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete cleanup policies                                                                                      |          |          | ✓         | ✓          | ✓     | | | [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete cleanup policies                                                                                      |          |          | ✓         | ✓          | ✓     | | ||||||
| | [Container Registry](packages/container_registry/index.md):<br>Remove a container registry image                                                                                          |          |          | ✓         | ✓          | ✓     | | | [Container Registry](packages/container_registry/index.md):<br>Push an image to the Container Registry                                                                                    |          |          | ✓         | ✓          | ✓     | | ||||||
| | [Container Registry](packages/container_registry/index.md):<br>Update container registry                                                                                                  |          |          | ✓         | ✓          | ✓     | | | [Container Registry](packages/container_registry/index.md):<br>Pull an image from the Container Registry                                                                                   | ✓ (*21*) | ✓ (*21*) | ✓         | ✓          | ✓     | | ||||||
|  | | [Container Registry](packages/container_registry/index.md):<br>Remove a Container Registry image                                                                                          |          |          | ✓         | ✓          | ✓     | | ||||||
| | [GitLab Pages](project/pages/index.md):<br>View Pages protected by [access control](project/pages/introduction.md#gitlab-pages-access-control)                                            | ✓    | ✓    | ✓    | ✓          | ✓    | | | [GitLab Pages](project/pages/index.md):<br>View Pages protected by [access control](project/pages/introduction.md#gitlab-pages-access-control)                                            | ✓    | ✓    | ✓    | ✓          | ✓    | | ||||||
| | [GitLab Pages](project/pages/index.md):<br>Manage                                                                                                                                         |          |          |           | ✓          | ✓     | | | [GitLab Pages](project/pages/index.md):<br>Manage                                                                                                                                         |          |          |           | ✓          | ✓     | | ||||||
| | [GitLab Pages](project/pages/index.md):<br>Manage GitLab Pages domains and certificates                                                                                                   |          |          |           | ✓          | ✓     | | | [GitLab Pages](project/pages/index.md):<br>Manage GitLab Pages domains and certificates                                                                                                   |          |          |           | ✓          | ✓     | | ||||||
|  | @ -130,9 +131,10 @@ The following table lists project permissions available for each role: | ||||||
| | [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Manage user-starred metrics dashboards (*7*)                                                                          | ✓        | ✓        | ✓         | ✓          | ✓     | | | [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Manage user-starred metrics dashboards (*7*)                                                                          | ✓        | ✓        | ✓         | ✓          | ✓     | | ||||||
| | [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>View metrics dashboard annotations                                                                                    |          | ✓        | ✓         | ✓          | ✓     | | | [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>View metrics dashboard annotations                                                                                    |          | ✓        | ✓         | ✓          | ✓     | | ||||||
| | [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Create/edit/delete metrics dashboard annotations                                                                      |          |          | ✓         | ✓          | ✓     | | | [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Create/edit/delete metrics dashboard annotations                                                                      |          |          | ✓         | ✓          | ✓     | | ||||||
| | [Package registry](packages/index.md):<br>Pull package                                                                                                                                    | ✓ (*1*)  | ✓        | ✓         | ✓          | ✓     | | | [Package registry](packages/index.md):<br>Pull a package                                                                                                                                  | ✓ (*1*)  | ✓        | ✓         | ✓          | ✓     | | ||||||
| | [Package registry](packages/index.md):<br>Publish package                                                                                                                                 |          |          | ✓         | ✓          | ✓     | | | [Package registry](packages/index.md):<br>Publish a package                                                                                                                               |          |          | ✓         | ✓          | ✓     | | ||||||
| | [Package registry](packages/index.md):<br>Delete package                                                                                                                                  |          |          |           | ✓          | ✓     | | | [Package registry](packages/index.md):<br>Delete a package                                                                                                                                |          |          |           | ✓          | ✓     | | ||||||
|  | | [Package registry](packages/index.md):<br>Delete a file associated with a package                                                                                                         |          |          |           | ✓          | ✓     | | ||||||
| | [Project operations](../operations/index.md):<br>View [Error Tracking](../operations/error_tracking.md) list                                                                              |          | ✓        | ✓         | ✓          | ✓     | | | [Project operations](../operations/index.md):<br>View [Error Tracking](../operations/error_tracking.md) list                                                                              |          | ✓        | ✓         | ✓          | ✓     | | ||||||
| | [Project operations](../operations/index.md):<br>Manage [Feature Flags](../operations/feature_flags.md) **(PREMIUM)**                                                                     |          |          | ✓         | ✓          | ✓     | | | [Project operations](../operations/index.md):<br>Manage [Feature Flags](../operations/feature_flags.md) **(PREMIUM)**                                                                     |          |          | ✓         | ✓          | ✓     | | ||||||
| | [Project operations](../operations/index.md):<br>Manage [Error Tracking](../operations/error_tracking.md)                                                                                 |          |          |           | ✓          | ✓     | | | [Project operations](../operations/index.md):<br>Manage [Error Tracking](../operations/error_tracking.md)                                                                                 |          |          |           | ✓          | ✓     | | ||||||
|  | @ -239,6 +241,7 @@ The following table lists project permissions available for each role: | ||||||
| 1. In projects that accept contributions from external members, users can create, edit, and close their own merge requests. | 1. In projects that accept contributions from external members, users can create, edit, and close their own merge requests. | ||||||
| 1. Authors and assignees of issues can modify the title and description even if they don't have the Reporter role. | 1. Authors and assignees of issues can modify the title and description even if they don't have the Reporter role. | ||||||
| 1. Authors and assignees can close and reopen issues even if they don't have the Reporter role. | 1. Authors and assignees can close and reopen issues even if they don't have the Reporter role. | ||||||
|  | 1. The ability to view the Container Registry and pull images is controlled by the [Container Registry's visibility permissions](packages/container_registry/index.md#container-registry-visibility-permissions). | ||||||
| 
 | 
 | ||||||
| ## Project features permissions | ## Project features permissions | ||||||
| 
 | 
 | ||||||
|  | @ -284,7 +287,8 @@ read through the documentation on [permissions and access to confidential issues | ||||||
| 
 | 
 | ||||||
| ### Container Registry visibility permissions | ### Container Registry visibility permissions | ||||||
| 
 | 
 | ||||||
| Find the visibility permissions for the Container Registry, as described in the | The ability to view the Container Registry and pull images is controlled by the Container Registry's | ||||||
|  | visibility permissions. Find these permissions for the Container Registry as described in the | ||||||
| [related documentation](packages/container_registry/index.md#container-registry-visibility-permissions). | [related documentation](packages/container_registry/index.md#container-registry-visibility-permissions). | ||||||
| 
 | 
 | ||||||
| ## Group members permissions | ## Group members permissions | ||||||
|  | @ -310,8 +314,11 @@ The following table lists group permissions available for each role: | ||||||
| | Create/edit group epic **(PREMIUM)**                                     |       | ✓        | ✓         | ✓          | ✓     | | | Create/edit group epic **(PREMIUM)**                                     |       | ✓        | ✓         | ✓          | ✓     | | ||||||
| | Create/edit/delete epic boards **(PREMIUM)**                             |       | ✓        | ✓         | ✓          | ✓     | | | Create/edit/delete epic boards **(PREMIUM)**                             |       | ✓        | ✓         | ✓          | ✓     | | ||||||
| | Manage group labels                                                      |       | ✓        | ✓         | ✓          | ✓     | | | Manage group labels                                                      |       | ✓        | ✓         | ✓          | ✓     | | ||||||
|  | | Publish [packages](packages/index.md)                                    |       |          | ✓         | ✓          | ✓     | | ||||||
| | Pull [packages](packages/index.md)                                       |       | ✓        | ✓         | ✓          | ✓     | | | Pull [packages](packages/index.md)                                       |       | ✓        | ✓         | ✓          | ✓     | | ||||||
| | View a container registry                                                |       | ✓        | ✓         | ✓          | ✓     | | | Delete [packages](packages/index.md                                      |       |          |           | ✓          | ✓     | | ||||||
|  | | Pull a Container Registry image                                          | ✓ (7) | ✓        | ✓         | ✓          | ✓     | | ||||||
|  | | Remove a Container Registry image                                        |       |          | ✓         | ✓          | ✓     | | ||||||
| | View Group DevOps Adoption **(ULTIMATE)**                                |       | ✓        | ✓         | ✓          | ✓     | | | View Group DevOps Adoption **(ULTIMATE)**                                |       | ✓        | ✓         | ✓          | ✓     | | ||||||
| | View metrics dashboard annotations                                       |       | ✓        | ✓         | ✓          | ✓     | | | View metrics dashboard annotations                                       |       | ✓        | ✓         | ✓          | ✓     | | ||||||
| | View Productivity analytics **(PREMIUM)**                                |       | ✓        | ✓         | ✓          | ✓     | | | View Productivity analytics **(PREMIUM)**                                |       | ✓        | ✓         | ✓          | ✓     | | ||||||
|  | @ -322,7 +329,6 @@ The following table lists group permissions available for each role: | ||||||
| | Create/edit/delete metrics dashboard annotations                         |       |          | ✓         | ✓          | ✓     | | | Create/edit/delete metrics dashboard annotations                         |       |          | ✓         | ✓          | ✓     | | ||||||
| | Enable/disable a dependency proxy                                        |       |          | ✓         | ✓          | ✓     | | | Enable/disable a dependency proxy                                        |       |          | ✓         | ✓          | ✓     | | ||||||
| | Purge the dependency proxy for a group                                   |       |          |           |            | ✓     | | | Purge the dependency proxy for a group                                   |       |          |           |            | ✓     | | ||||||
| | Publish [packages](packages/index.md)                                    |       |          | ✓         | ✓          | ✓     | |  | ||||||
| | Use security dashboard **(ULTIMATE)**                                    |       |          | ✓         | ✓          | ✓     | | | Use security dashboard **(ULTIMATE)**                                    |       |          | ✓         | ✓          | ✓     | | ||||||
| | View group Audit Events                                                  |       |          | ✓ (7)     | ✓ (7)      | ✓     | | | View group Audit Events                                                  |       |          | ✓ (7)     | ✓ (7)      | ✓     | | ||||||
| | Create subgroup                                                          |       |          |           | ✓ (1)      | ✓     | | | Create subgroup                                                          |       |          |           | ✓ (1)      | ✓     | | ||||||
|  |  | ||||||
|  | @ -34,7 +34,7 @@ Prerequisites: | ||||||
| - An [Amazon Web Services](https://aws.amazon.com/) account. | - An [Amazon Web Services](https://aws.amazon.com/) account. | ||||||
| - Permissions to manage IAM resources. | - Permissions to manage IAM resources. | ||||||
| 
 | 
 | ||||||
| For instance-level clusters, see [additional requirements for self-managed instances](#additional-requirements-for-self-managed-instances). **(FREE SELF)** | For instance-level clusters, see [additional requirements for self-managed instances](#additional-requirements-for-self-managed-instances). | ||||||
| 
 | 
 | ||||||
| To create new Kubernetes clusters for your project, group, or instance through the certificate-based method: | To create new Kubernetes clusters for your project, group, or instance through the certificate-based method: | ||||||
| 
 | 
 | ||||||
|  | @ -256,7 +256,7 @@ IAM user in the Amazon AWS console, and follow these steps: | ||||||
| 
 | 
 | ||||||
| #### EKS access key and ID | #### EKS access key and ID | ||||||
| 
 | 
 | ||||||
| > Instance profiles were [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291015) in GitLab 13.7. | > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291015) instance profiles in GitLab 13.7. | ||||||
| 
 | 
 | ||||||
| If you're using GitLab 13.7 or later, you can use instance profiles to | If you're using GitLab 13.7 or later, you can use instance profiles to | ||||||
| dynamically retrieve temporary credentials from AWS when needed. | dynamically retrieve temporary credentials from AWS when needed. | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ group: Configure | ||||||
| info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments | info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
| # Connect existing clusters through cluster certificates **(DEPRECATED)** | # Connect existing clusters through cluster certificates (DEPRECATED) **(FREE)** | ||||||
| 
 | 
 | ||||||
| > [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5. | > [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5. | ||||||
| 
 | 
 | ||||||
|  | @ -27,7 +27,7 @@ To add any cluster to GitLab, you need: | ||||||
| - Either a GitLab.com account or an account for a self-managed installation | - Either a GitLab.com account or an account for a self-managed installation | ||||||
| running GitLab 12.5 or later. | running GitLab 12.5 or later. | ||||||
| - The Maintainer role for group-level and project-level clusters. | - The Maintainer role for group-level and project-level clusters. | ||||||
| - Access to the Admin area for instance-level clusters. **(FREE SELF)** | - Access to the Admin area for instance-level clusters. | ||||||
| - A Kubernetes cluster. | - A Kubernetes cluster. | ||||||
| - Cluster administration access to the cluster with `kubectl`. | - Cluster administration access to the cluster with `kubectl`. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,8 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w | ||||||
| 
 | 
 | ||||||
| # Multiple clusters per project with cluster certificates (DEPRECATED) **(FREE)** | # Multiple clusters per project with cluster certificates (DEPRECATED) **(FREE)** | ||||||
| 
 | 
 | ||||||
| > - Introduced in [GitLab Premium](https://about.gitlab.com/pricing/) 10.3 | > - Introduced in GitLab 10.3 | ||||||
| > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35094) to GitLab Free in 13.2. | > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35094) from GitLab Premium to GitLab Free in 13.2. | ||||||
| > - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5. | > - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5. | ||||||
| 
 | 
 | ||||||
| WARNING: | WARNING: | ||||||
|  |  | ||||||
|  | @ -126,6 +126,14 @@ For information on automating user, group, and project import API calls, see | ||||||
| 
 | 
 | ||||||
| ## Troubleshooting | ## Troubleshooting | ||||||
| 
 | 
 | ||||||
|  | ### LFS objects not imported | ||||||
|  | 
 | ||||||
|  | If the project import completes but LFS objects can't be downloaded or cloned, you may be using a | ||||||
|  | password or personal access token containing special characters. For more information, see | ||||||
|  | [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/337769). | ||||||
|  | 
 | ||||||
|  | ### General | ||||||
|  | 
 | ||||||
| If the GUI-based import tool does not work, you can try to: | If the GUI-based import tool does not work, you can try to: | ||||||
| 
 | 
 | ||||||
| - Use the [GitLab Import API](../../../api/import.md#import-repository-from-bitbucket-server) Bitbucket server endpoint. | - Use the [GitLab Import API](../../../api/import.md#import-repository-from-bitbucket-server) Bitbucket server endpoint. | ||||||
|  |  | ||||||
|  | @ -300,6 +300,8 @@ When you move an issue, it's closed and copied to the target project. | ||||||
| The original issue is not deleted. A system note, which indicates | The original issue is not deleted. A system note, which indicates | ||||||
| where it came from and went to, is added to both issues. | where it came from and went to, is added to both issues. | ||||||
| 
 | 
 | ||||||
|  | Be careful when moving an issue to a project with different access rules. Before moving the issue, make sure it does not contain sensitive data. | ||||||
|  | 
 | ||||||
| Prerequisites: | Prerequisites: | ||||||
| 
 | 
 | ||||||
| - You must have at least the [Reporter role](../../permissions.md) for the project. | - You must have at least the [Reporter role](../../permissions.md) for the project. | ||||||
|  |  | ||||||
|  | @ -78,7 +78,7 @@ threads. Some quick actions might not be available to all subscription tiers. | ||||||
| | `/lock`                                                                                          | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Lock the discussions.                                                                                                                                                                                                                                                                                                                                                                                                                                     | | | `/lock`                                                                                          | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Lock the discussions.                                                                                                                                                                                                                                                                                                                                                                                                                                     | | ||||||
| | `/merge`                                                                                         | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Merge changes. Depending on the project setting, this may be [when the pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md), or adding to a [Merge Train](../../ci/pipelines/merge_trains.md).                                                                                                                                                                                                                                              | | | `/merge`                                                                                         | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Merge changes. Depending on the project setting, this may be [when the pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md), or adding to a [Merge Train](../../ci/pipelines/merge_trains.md).                                                                                                                                                                                                                                              | | ||||||
| | `/milestone %milestone`                                                                          | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Set milestone.                                                                                                                                                                                                                                                                                                                                                                                                                                            | | | `/milestone %milestone`                                                                          | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Set milestone.                                                                                                                                                                                                                                                                                                                                                                                                                                            | | ||||||
| | `/move <path/to/project>`                                                                        | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Move this issue to another project.                                                                                                                                                                                                                                                                                                                                                                                                                       | | | `/move <path/to/project>`                                                                        | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Move this issue to another project. Be careful when moving an issue to a project with different access rules. Before moving the issue, make sure it does not contain sensitive data. | | ||||||
| | `/parent_epic <epic>`                                                                            | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Set parent epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)).                                                                                                                                                                                                                                                 | | | `/parent_epic <epic>`                                                                            | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Set parent epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)).                                                                                                                                                                                                                                                 | | ||||||
| | `/promote`                                                                                       | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to epic.                                                                                                                                                                                                                                                                                                                                                                                                                                    | | | `/promote`                                                                                       | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to epic.                                                                                                                                                                                                                                                                                                                                                                                                                                    | | ||||||
| | `/promote_to_incident`                                                                           | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to incident ([introduced in GitLab 14.5](https://gitlab.com/gitlab-org/gitlab/-/issues/296787)).                                                                                                                                                                                                                                                                                                                                            | | | `/promote_to_incident`                                                                           | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Promote issue to incident ([introduced in GitLab 14.5](https://gitlab.com/gitlab-org/gitlab/-/issues/296787)).                                                                                                                                                                                                                                                                                                                                            | | ||||||
|  |  | ||||||
|  | @ -270,8 +270,13 @@ search, or choose a specific group or project. | ||||||
| 
 | 
 | ||||||
| To search through code or other documents in a single project, you can use | To search through code or other documents in a single project, you can use | ||||||
| the search field on the top-right of your screen while the project page is open. | the search field on the top-right of your screen while the project page is open. | ||||||
| Code search shows only the first result in the file. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327052) | Code search shows only the first result in the file. | ||||||
| in GitLab 14.7, you can access Git blame from any line that returned a result from the code search: | 
 | ||||||
|  | #### Git blame from code search **(PREMIUM)** | ||||||
|  | 
 | ||||||
|  | > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327052) in GitLab 14.7. | ||||||
|  | 
 | ||||||
|  | You can access Git blame from any line that returned a result from the code search: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -13794,6 +13794,9 @@ msgstr "" | ||||||
| msgid "Environments|protected" | msgid "Environments|protected" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | msgid "Environment|Auto stop %{time}" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| msgid "Epic" | msgid "Epic" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | @ -29102,7 +29105,7 @@ msgstr "" | ||||||
| msgid "Purchase more storage" | msgid "Purchase more storage" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "PurchaseStep|An error occurred in the purchase step. If the problem persists please contact support@gitlab.com." | msgid "PurchaseStep|An error occurred in the purchase step. If the problem persists please contact support at https://support.gitlab.com." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "Push" | msgid "Push" | ||||||
|  | @ -31861,7 +31864,7 @@ msgstr "" | ||||||
| msgid "SecurityOrchestration|Status" | msgid "SecurityOrchestration|Status" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting the %{branches}." | msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "SecurityOrchestration|There was a problem creating the new security policy" | msgid "SecurityOrchestration|There was a problem creating the new security policy" | ||||||
|  | @ -31885,6 +31888,9 @@ msgstr "" | ||||||
| msgid "SecurityOrchestration|a" | msgid "SecurityOrchestration|a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | msgid "SecurityOrchestration|all branches" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| msgid "SecurityOrchestration|an" | msgid "SecurityOrchestration|an" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | @ -31912,6 +31918,9 @@ msgstr "" | ||||||
| msgid "SecurityOrchestration|scanners find" | msgid "SecurityOrchestration|scanners find" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | msgid "SecurityOrchestration|the %{branches}" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| msgid "SecurityOrchestration|user with id" | msgid "SecurityOrchestration|user with id" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | @ -33106,7 +33115,7 @@ msgstr "" | ||||||
| msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019" | msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days." | msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "Showing graphs based on events of the last %{timerange} days." | msgid "Showing graphs based on events of the last %{timerange} days." | ||||||
|  | @ -41056,6 +41065,9 @@ msgstr "" | ||||||
| msgid "You do not have permission to leave this %{namespaceType}." | msgid "You do not have permission to leave this %{namespaceType}." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | msgid "You do not have permission to run a pipeline on this branch." | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| msgid "You do not have permission to run the Web Terminal. Please contact a project administrator." | msgid "You do not have permission to run the Web Terminal. Please contact a project administrator." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| import { GlDaterangePicker } from '@gitlab/ui'; | import { GlDaterangePicker, GlSprintf } from '@gitlab/ui'; | ||||||
| import { mount } from '@vue/test-utils'; | import { shallowMount, mount } from '@vue/test-utils'; | ||||||
| import { nextTick } from 'vue'; |  | ||||||
| import { useFakeDate } from 'helpers/fake_date'; | import { useFakeDate } from 'helpers/fake_date'; | ||||||
| import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; |  | ||||||
| import Daterange from '~/analytics/shared/components/daterange.vue'; | import Daterange from '~/analytics/shared/components/daterange.vue'; | ||||||
| 
 | 
 | ||||||
| const defaultProps = { | const defaultProps = { | ||||||
|  | @ -15,13 +13,13 @@ describe('Daterange component', () => { | ||||||
| 
 | 
 | ||||||
|   let wrapper; |   let wrapper; | ||||||
| 
 | 
 | ||||||
|   const factory = (props = defaultProps) => { |   const factory = (props = defaultProps, mountFn = shallowMount) => { | ||||||
|     wrapper = mount(Daterange, { |     wrapper = mountFn(Daterange, { | ||||||
|       propsData: { |       propsData: { | ||||||
|         ...defaultProps, |         ...defaultProps, | ||||||
|         ...props, |         ...props, | ||||||
|       }, |       }, | ||||||
|       directives: { GlTooltip: createMockDirective() }, |       stubs: { GlSprintf }, | ||||||
|     }); |     }); | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|  | @ -29,9 +27,8 @@ describe('Daterange component', () => { | ||||||
|     wrapper.destroy(); |     wrapper.destroy(); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   const findDaterangePicker = () => wrapper.find(GlDaterangePicker); |   const findDaterangePicker = () => wrapper.findComponent(GlDaterangePicker); | ||||||
| 
 |   const findDateRangeIndicator = () => wrapper.findComponent(GlSprintf); | ||||||
|   const findDateRangeIndicator = () => wrapper.find('.daterange-indicator'); |  | ||||||
| 
 | 
 | ||||||
|   describe('template', () => { |   describe('template', () => { | ||||||
|     describe('when show is false', () => { |     describe('when show is false', () => { | ||||||
|  | @ -44,6 +41,7 @@ describe('Daterange component', () => { | ||||||
|     describe('when show is true', () => { |     describe('when show is true', () => { | ||||||
|       it('renders the daterange picker', () => { |       it('renders the daterange picker', () => { | ||||||
|         factory({ show: true }); |         factory({ show: true }); | ||||||
|  | 
 | ||||||
|         expect(findDaterangePicker().exists()).toBe(true); |         expect(findDaterangePicker().exists()).toBe(true); | ||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
|  | @ -54,14 +52,12 @@ describe('Daterange component', () => { | ||||||
|         const endDate = new Date('2019-09-30'); |         const endDate = new Date('2019-09-30'); | ||||||
|         const minDate = new Date('2019-06-01'); |         const minDate = new Date('2019-06-01'); | ||||||
| 
 | 
 | ||||||
|         factory({ show: true, startDate, endDate, minDate }); |         factory({ show: true, startDate, endDate, minDate }, mount); | ||||||
| 
 |  | ||||||
|         const input = findDaterangePicker().find('input'); |         const input = findDaterangePicker().find('input'); | ||||||
| 
 | 
 | ||||||
|         input.setValue('2019-01-01'); |         input.setValue('2019-01-01'); | ||||||
|         input.trigger('change'); |         await input.trigger('change'); | ||||||
| 
 | 
 | ||||||
|         await nextTick(); |  | ||||||
|         expect(wrapper.emitted().change).toEqual([[{ startDate: minDate, endDate }]]); |         expect(wrapper.emitted().change).toEqual([[{ startDate: minDate, endDate }]]); | ||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
|  | @ -76,16 +72,13 @@ describe('Daterange component', () => { | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|       it('displays the correct number of selected days in the indicator', () => { |       it('displays the correct number of selected days in the indicator', () => { | ||||||
|         expect(findDateRangeIndicator().find('span').text()).toBe('10 days selected'); |         expect(findDateRangeIndicator().text()).toMatchInterpolatedText('10 days selected'); | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|       it('displays a tooltip', () => { |       it('sets the tooltip', () => { | ||||||
|         const icon = wrapper.find('[data-testid="helper-icon"]'); |         const tooltip = findDaterangePicker().props('tooltip'); | ||||||
|         const tooltip = getBinding(icon.element, 'gl-tooltip'); |         expect(tooltip).toBe( | ||||||
| 
 |           'Showing data for workflow items created in this date range. Date range limited to 30 days.', | ||||||
|         expect(tooltip).toBeDefined(); |  | ||||||
|         expect(icon.attributes('title')).toBe( |  | ||||||
|           'Showing data for workflow items created in this date range. Date range cannot exceed 30 days.', |  | ||||||
|         ); |         ); | ||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  | @ -7,6 +7,8 @@ import { extendedWrapper } from 'helpers/vue_test_utils_helper'; | ||||||
| import waitForPromises from 'helpers/wait_for_promises'; | import waitForPromises from 'helpers/wait_for_promises'; | ||||||
| import Api from '~/api'; | import Api from '~/api'; | ||||||
| import PipelinesTable from '~/commit/pipelines/pipelines_table.vue'; | import PipelinesTable from '~/commit/pipelines/pipelines_table.vue'; | ||||||
|  | import httpStatusCodes from '~/lib/utils/http_status'; | ||||||
|  | import createFlash from '~/flash'; | ||||||
| import { TOAST_MESSAGE } from '~/pipelines/constants'; | import { TOAST_MESSAGE } from '~/pipelines/constants'; | ||||||
| import axios from '~/lib/utils/axios_utils'; | import axios from '~/lib/utils/axios_utils'; | ||||||
| 
 | 
 | ||||||
|  | @ -14,6 +16,8 @@ const $toast = { | ||||||
|   show: jest.fn(), |   show: jest.fn(), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | jest.mock('~/flash'); | ||||||
|  | 
 | ||||||
| describe('Pipelines table in Commits and Merge requests', () => { | describe('Pipelines table in Commits and Merge requests', () => { | ||||||
|   let wrapper; |   let wrapper; | ||||||
|   let pipeline; |   let pipeline; | ||||||
|  | @ -184,11 +188,12 @@ describe('Pipelines table in Commits and Merge requests', () => { | ||||||
|           mergeRequestId: 3, |           mergeRequestId: 3, | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         jest.spyOn(Api, 'postMergeRequestPipeline').mockReturnValue(Promise.resolve()); |  | ||||||
| 
 |  | ||||||
|         await waitForPromises(); |         await waitForPromises(); | ||||||
|       }); |       }); | ||||||
| 
 |       describe('success', () => { | ||||||
|  |         beforeEach(() => { | ||||||
|  |           jest.spyOn(Api, 'postMergeRequestPipeline').mockReturnValue(Promise.resolve()); | ||||||
|  |         }); | ||||||
|         it('displays a toast message during pipeline creation', async () => { |         it('displays a toast message during pipeline creation', async () => { | ||||||
|           await findRunPipelineBtn().trigger('click'); |           await findRunPipelineBtn().trigger('click'); | ||||||
| 
 | 
 | ||||||
|  | @ -217,6 +222,30 @@ describe('Pipelines table in Commits and Merge requests', () => { | ||||||
|         }); |         }); | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|  |       describe('failure', () => { | ||||||
|  |         const permissionsMsg = 'You do not have permission to run a pipeline on this branch.'; | ||||||
|  | 
 | ||||||
|  |         it.each` | ||||||
|  |           status                                   | message | ||||||
|  |           ${httpStatusCodes.BAD_REQUEST}           | ${permissionsMsg} | ||||||
|  |           ${httpStatusCodes.UNAUTHORIZED}          | ${permissionsMsg} | ||||||
|  |           ${httpStatusCodes.INTERNAL_SERVER_ERROR} | ${'An error occurred while trying to run a new pipeline for this merge request.'} | ||||||
|  |         `('displays permissions error message', async ({ status, message }) => {
 | ||||||
|  |           const response = { response: { status } }; | ||||||
|  | 
 | ||||||
|  |           jest | ||||||
|  |             .spyOn(Api, 'postMergeRequestPipeline') | ||||||
|  |             .mockImplementation(() => Promise.reject(response)); | ||||||
|  | 
 | ||||||
|  |           await findRunPipelineBtn().trigger('click'); | ||||||
|  | 
 | ||||||
|  |           await waitForPromises(); | ||||||
|  | 
 | ||||||
|  |           expect(createFlash).toHaveBeenCalledWith({ message }); | ||||||
|  |         }); | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|     describe('on click for fork merge request', () => { |     describe('on click for fork merge request', () => { | ||||||
|       beforeEach(async () => { |       beforeEach(async () => { | ||||||
|         pipelineCopy.flags.detached_merge_request_pipeline = true; |         pipelineCopy.flags.detached_merge_request_pipeline = true; | ||||||
|  |  | ||||||
|  | @ -4,7 +4,8 @@ import { GlCollapse, GlIcon } from '@gitlab/ui'; | ||||||
| import createMockApollo from 'helpers/mock_apollo_helper'; | import createMockApollo from 'helpers/mock_apollo_helper'; | ||||||
| import { mountExtended, extendedWrapper } from 'helpers/vue_test_utils_helper'; | import { mountExtended, extendedWrapper } from 'helpers/vue_test_utils_helper'; | ||||||
| import { stubTransition } from 'helpers/stub_transition'; | import { stubTransition } from 'helpers/stub_transition'; | ||||||
| import { __, s__ } from '~/locale'; | import { formatDate, getTimeago } from '~/lib/utils/datetime_utility'; | ||||||
|  | import { __, s__, sprintf } from '~/locale'; | ||||||
| import EnvironmentItem from '~/environments/components/new_environment_item.vue'; | import EnvironmentItem from '~/environments/components/new_environment_item.vue'; | ||||||
| import Deployment from '~/environments/components/deployment.vue'; | import Deployment from '~/environments/components/deployment.vue'; | ||||||
| import { resolvedEnvironment } from './graphql/mock_data'; | import { resolvedEnvironment } from './graphql/mock_data'; | ||||||
|  | @ -173,19 +174,40 @@ describe('~/environments/components/new_environment_item.vue', () => { | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   describe('pin', () => { |   describe('pin', () => { | ||||||
|     it('shows the option to pin the environment if there is an autostop date', () => { |     describe('with autostop', () => { | ||||||
|  |       let environment; | ||||||
|  | 
 | ||||||
|  |       beforeEach(() => { | ||||||
|  |         environment = { | ||||||
|  |           ...resolvedEnvironment, | ||||||
|  |           autoStopAt: new Date(Date.now() + 100000).toString(), | ||||||
|  |         }; | ||||||
|         wrapper = createWrapper({ |         wrapper = createWrapper({ | ||||||
|           propsData: { |           propsData: { | ||||||
|           environment: { ...resolvedEnvironment, autoStopAt: new Date(Date.now() + 100000) }, |             environment, | ||||||
|           }, |           }, | ||||||
|           apolloProvider: createApolloProvider(), |           apolloProvider: createApolloProvider(), | ||||||
|         }); |         }); | ||||||
|  |       }); | ||||||
| 
 | 
 | ||||||
|  |       it('shows the option to pin the environment if there is an autostop date', () => { | ||||||
|         const rollback = wrapper.findByRole('menuitem', { name: __('Prevent auto-stopping') }); |         const rollback = wrapper.findByRole('menuitem', { name: __('Prevent auto-stopping') }); | ||||||
| 
 | 
 | ||||||
|         expect(rollback.exists()).toBe(true); |         expect(rollback.exists()).toBe(true); | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|  |       it('shows when the environment auto stops', () => { | ||||||
|  |         const autoStop = wrapper.findByTitle(formatDate(environment.autoStopAt)); | ||||||
|  | 
 | ||||||
|  |         expect(autoStop.text()).toBe('in 1 minute'); | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     describe('without autostop', () => { | ||||||
|  |       beforeEach(() => { | ||||||
|  |         wrapper = createWrapper({ apolloProvider: createApolloProvider() }); | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|       it('does not show the option to pin the environment if there is no autostop date', () => { |       it('does not show the option to pin the environment if there is no autostop date', () => { | ||||||
|         wrapper = createWrapper({ apolloProvider: createApolloProvider() }); |         wrapper = createWrapper({ apolloProvider: createApolloProvider() }); | ||||||
| 
 | 
 | ||||||
|  | @ -193,6 +215,52 @@ describe('~/environments/components/new_environment_item.vue', () => { | ||||||
| 
 | 
 | ||||||
|         expect(rollback.exists()).toBe(false); |         expect(rollback.exists()).toBe(false); | ||||||
|       }); |       }); | ||||||
|  | 
 | ||||||
|  |       it('does not show when the environment auto stops', () => { | ||||||
|  |         const autoStop = wrapper.findByText( | ||||||
|  |           sprintf(s__('Environment|Auto stop %{time}'), { | ||||||
|  |             time: getTimeago().format(resolvedEnvironment.autoStopAt), | ||||||
|  |           }), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         expect(autoStop.exists()).toBe(false); | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     describe('with past autostop', () => { | ||||||
|  |       let environment; | ||||||
|  | 
 | ||||||
|  |       beforeEach(() => { | ||||||
|  |         environment = { | ||||||
|  |           ...resolvedEnvironment, | ||||||
|  |           autoStopAt: new Date(Date.now() - 100000).toString(), | ||||||
|  |         }; | ||||||
|  |         wrapper = createWrapper({ | ||||||
|  |           propsData: { | ||||||
|  |             environment, | ||||||
|  |           }, | ||||||
|  |           apolloProvider: createApolloProvider(), | ||||||
|  |         }); | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       it('does not show the option to pin the environment if there is no autostop date', () => { | ||||||
|  |         wrapper = createWrapper({ apolloProvider: createApolloProvider() }); | ||||||
|  | 
 | ||||||
|  |         const rollback = wrapper.findByRole('menuitem', { name: __('Prevent auto-stopping') }); | ||||||
|  | 
 | ||||||
|  |         expect(rollback.exists()).toBe(false); | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       it('does not show when the environment auto stops', () => { | ||||||
|  |         const autoStop = wrapper.findByText( | ||||||
|  |           sprintf(s__('Environment|Auto stop %{time}'), { | ||||||
|  |             time: getTimeago().format(environment.autoStopAt), | ||||||
|  |           }), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         expect(autoStop.exists()).toBe(false); | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   describe('monitoring', () => { |   describe('monitoring', () => { | ||||||
|  |  | ||||||
|  | @ -3,28 +3,12 @@ | ||||||
| require 'spec_helper' | require 'spec_helper' | ||||||
| 
 | 
 | ||||||
| RSpec.describe 'cross-database foreign keys' do | RSpec.describe 'cross-database foreign keys' do | ||||||
|   # TODO: We are trying to empty out this list in |   # Since we don't expect to have any cross-database foreign keys | ||||||
|   # https://gitlab.com/groups/gitlab-org/-/epics/7249 . Once we are done we can |   # this is empty. If we will have an entry like | ||||||
|   # keep this test and assert that there are no cross-db foreign keys. We |   # `ci_daily_build_group_report_results.project_id` | ||||||
|   # should not be adding anything to this list but should instead only add new |   # should be added. | ||||||
|   # loose foreign keys |  | ||||||
|   # https://docs.gitlab.com/ee/development/database/loose_foreign_keys.html . |  | ||||||
|   let(:allowed_cross_database_foreign_keys) do |   let(:allowed_cross_database_foreign_keys) do | ||||||
|     %w( |     %w[].freeze | ||||||
|       ci_build_report_results.project_id |  | ||||||
|       ci_daily_build_group_report_results.group_id |  | ||||||
|       ci_daily_build_group_report_results.project_id |  | ||||||
|       ci_freeze_periods.project_id |  | ||||||
|       ci_job_token_project_scope_links.added_by_id |  | ||||||
|       ci_pending_builds.namespace_id |  | ||||||
|       ci_pending_builds.project_id |  | ||||||
|       ci_pipeline_schedules.owner_id |  | ||||||
|       ci_resource_groups.project_id |  | ||||||
|       ci_runner_namespaces.namespace_id |  | ||||||
|       ci_running_builds.project_id |  | ||||||
|       ci_stages.project_id |  | ||||||
|       ci_unit_tests.project_id |  | ||||||
|     ).freeze |  | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def foreign_keys_for(table_name) |   def foreign_keys_for(table_name) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue