Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-01-25 21:11:55 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-01-25 21:11:55 +0300
commit2b2d833ab3e78f8c9f626af950a16d43fc38c9f8 (patch)
tree13c101679f3cda5808affea46709207a24f4a3c9 /app
parent7d8d5a3dab415672a41ab29c3bfa9581f275dc50 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/batch_comments/components/draft_note.vue11
-rw-r--r--app/assets/javascripts/boards/components/board_content_sidebar.vue32
-rw-r--r--app/assets/javascripts/ide/components/activity_bar.vue11
-rw-r--r--app/assets/javascripts/main.js2
-rw-r--r--app/assets/stylesheets/page_bundles/ide.scss12
-rw-r--r--app/graphql/resolvers/ci/runners_resolver.rb12
-rw-r--r--app/models/concerns/issuable.rb10
-rw-r--r--app/models/container_repository.rb157
-rw-r--r--app/services/service_ping/submit_service.rb22
-rw-r--r--app/services/update_container_registry_info_service.rb6
-rw-r--r--app/validators/x509_certificate_credentials_validator.rb2
11 files changed, 223 insertions, 54 deletions
diff --git a/app/assets/javascripts/batch_comments/components/draft_note.vue b/app/assets/javascripts/batch_comments/components/draft_note.vue
index a218624f2d4..ae728d834e2 100644
--- a/app/assets/javascripts/batch_comments/components/draft_note.vue
+++ b/app/assets/javascripts/batch_comments/components/draft_note.vue
@@ -115,10 +115,15 @@ export default {
></div>
<p class="draft-note-actions d-flex">
- <publish-button :show-count="true" :should-publish="false" category="secondary" />
+ <publish-button
+ :show-count="true"
+ :should-publish="false"
+ category="secondary"
+ :disabled="isPublishingDraft(draft.id)"
+ />
<gl-button
- ref="publishNowButton"
- :loading="isPublishingDraft(draft.id) || isPublishing"
+ :disabled="isPublishing"
+ :loading="isPublishingDraft(draft.id)"
class="gl-ml-3"
@click="publishNow"
>
diff --git a/app/assets/javascripts/boards/components/board_content_sidebar.vue b/app/assets/javascripts/boards/components/board_content_sidebar.vue
index 156029b62b0..0320b4d925e 100644
--- a/app/assets/javascripts/boards/components/board_content_sidebar.vue
+++ b/app/assets/javascripts/boards/components/board_content_sidebar.vue
@@ -184,29 +184,15 @@ export default {
:issuable-type="issuableType"
data-testid="sidebar-milestones"
/>
- <template v-if="!glFeatures.iterationCadences">
- <sidebar-dropdown-widget
- v-if="iterationFeatureAvailable && !isIncidentSidebar"
- :iid="activeBoardItem.iid"
- issuable-attribute="iteration"
- :workspace-path="projectPathForActiveIssue"
- :attr-workspace-path="groupPathForActiveIssue"
- :issuable-type="issuableType"
- class="gl-mt-5"
- data-testid="iteration-edit"
- />
- </template>
- <template v-else>
- <iteration-sidebar-dropdown-widget
- v-if="iterationFeatureAvailable && !isIncidentSidebar"
- :iid="activeBoardItem.iid"
- :workspace-path="projectPathForActiveIssue"
- :attr-workspace-path="groupPathForActiveIssue"
- :issuable-type="issuableType"
- class="gl-mt-5"
- data-testid="iteration-edit"
- />
- </template>
+ <iteration-sidebar-dropdown-widget
+ v-if="iterationFeatureAvailable && !isIncidentSidebar"
+ :iid="activeBoardItem.iid"
+ :workspace-path="projectPathForActiveIssue"
+ :attr-workspace-path="groupPathForActiveIssue"
+ :issuable-type="issuableType"
+ class="gl-mt-5"
+ data-testid="iteration-edit"
+ />
</div>
<board-sidebar-time-tracker />
<sidebar-date-widget
diff --git a/app/assets/javascripts/ide/components/activity_bar.vue b/app/assets/javascripts/ide/components/activity_bar.vue
index 846b4d92724..92dacf8c94a 100644
--- a/app/assets/javascripts/ide/components/activity_bar.vue
+++ b/app/assets/javascripts/ide/components/activity_bar.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { GlIcon, GlTooltipDirective, GlBadge } from '@gitlab/ui';
import { mapActions, mapState } from 'vuex';
import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
import { leftSidebarViews } from '../constants';
@@ -7,6 +7,7 @@ import { leftSidebarViews } from '../constants';
export default {
components: {
GlIcon,
+ GlBadge,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -82,9 +83,13 @@ export default {
@click.prevent="changedActivityView($event, $options.leftSidebarViews.commit.name)"
>
<gl-icon name="commit" />
- <div v-if="stagedFiles.length > 0" class="ide-commit-badge badge badge-pill">
+ <gl-badge
+ v-if="stagedFiles.length"
+ class="gl-absolute gl-px-2 gl-top-3 gl-right-3 gl-font-weight-bold gl-bg-gray-900! gl-text-white!"
+ size="sm"
+ >
{{ stagedFiles.length }}
- </div>
+ </gl-badge>
</button>
</li>
</ul>
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index 376134afef0..f78b4da181e 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -15,11 +15,11 @@ import { initRails } from '~/lib/utils/rails_ujs';
import * as popovers from '~/popovers';
import * as tooltips from '~/tooltips';
import { initPrefetchLinks } from '~/lib/utils/navigation_utility';
+import { logHelloDeferred } from 'jh_else_ce/lib/logger/hello_deferred';
import initAlertHandler from './alert_handler';
import { addDismissFlashClickListener } from './flash';
import initTodoToggle from './header';
import initLayoutNav from './layout_nav';
-import { logHelloDeferred } from './lib/logger/hello_deferred';
import { handleLocationHash, addSelectOnFocusBehaviour } from './lib/utils/common_utils';
import { localTimeAgo } from './lib/utils/datetime/timeago_utility';
import { getLocationHash, visitUrl } from './lib/utils/url_utility';
diff --git a/app/assets/stylesheets/page_bundles/ide.scss b/app/assets/stylesheets/page_bundles/ide.scss
index d37171bc75e..6c270852e53 100644
--- a/app/assets/stylesheets/page_bundles/ide.scss
+++ b/app/assets/stylesheets/page_bundles/ide.scss
@@ -630,7 +630,6 @@ $ide-commit-header-height: 48px;
width: 1px;
background: var(--ide-highlight-background, $white);
}
-
}
&.is-right {
@@ -642,17 +641,6 @@ $ide-commit-header-height: 48px;
left: -1px;
}
}
-
- .ide-commit-badge {
- background-color: var(--ide-highlight-accent, $almost-black) !important;
- color: var(--ide-highlight-background, $white) !important;
- position: absolute;
- left: 38px;
- top: $gl-padding-8;
- font-size: $gl-font-size-12;
- padding: 2px $gl-padding-4;
- font-weight: $gl-font-weight-bold !important;
- }
}
.ide-activity-bar {
diff --git a/app/graphql/resolvers/ci/runners_resolver.rb b/app/graphql/resolvers/ci/runners_resolver.rb
index 9848b5a503f..e221dfea4d0 100644
--- a/app/graphql/resolvers/ci/runners_resolver.rb
+++ b/app/graphql/resolvers/ci/runners_resolver.rb
@@ -9,7 +9,12 @@ module Resolvers
argument :active, ::GraphQL::Types::Boolean,
required: false,
- description: 'Filter runners by active (true) or paused (false) status.'
+ description: 'Filter runners by `active` (true) or `paused` (false) status.',
+ deprecated: { reason: :renamed, replacement: 'paused', milestone: '14.8' }
+
+ argument :paused, ::GraphQL::Types::Boolean,
+ required: false,
+ description: 'Filter runners by `paused` (true) or `active` (false) status.'
argument :status, ::Types::Ci::RunnerStatusEnum,
required: false,
@@ -41,8 +46,11 @@ module Resolvers
protected
def runners_finder_params(params)
+ # Give preference to paused argument over the deprecated 'active' argument
+ paused = params.fetch(:paused, params[:active] ? !params[:active] : nil)
+
{
- active: params[:active],
+ active: paused.nil? ? nil : !paused,
status_status: params[:status]&.to_s,
type_type: params[:type],
tag_name: params[:tag_list],
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index dcd80201d3f..b32ca064954 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -363,9 +363,10 @@ module Issuable
end
# Includes table keys in group by clause when sorting
- # preventing errors in postgres
+ # preventing errors in Postgres
+ #
+ # Returns an array of Arel columns
#
- # Returns an array of arel columns
def grouping_columns(sort)
sort = sort.to_s
grouping_columns = [arel_table[:id]]
@@ -384,9 +385,10 @@ module Issuable
end
# Includes all table keys in group by clause when sorting
- # preventing errors in postgres when using CTE search optimisation
+ # preventing errors in Postgres when using CTE search optimization
+ #
+ # Returns an array of Arel columns
#
- # Returns an array of arel columns
def issue_grouping_columns(use_cte: false)
if use_cte
attribute_names.map { |attr| arel_table[attr.to_sym] }
diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index 4b83eee84fb..e14555f2907 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -8,12 +8,16 @@ class ContainerRepository < ApplicationRecord
WAITING_CLEANUP_STATUSES = %i[cleanup_scheduled cleanup_unfinished].freeze
REQUIRING_CLEANUP_STATUSES = %i[cleanup_unscheduled cleanup_scheduled].freeze
+ IDLE_MIGRATION_STATES = %w[default pre_import_done import_done import_aborted import_skipped].freeze
+ ACTIVE_MIGRATION_STATES = %w[pre_importing importing].freeze
+ MIGRATION_STATES = (IDLE_MIGRATION_STATES + ACTIVE_MIGRATION_STATES).freeze
belongs_to :project
validates :name, length: { minimum: 0, allow_nil: false }
validates :name, uniqueness: { scope: :project_id }
- validates :migration_state, presence: true
+ validates :migration_state, presence: true, inclusion: { in: MIGRATION_STATES }
+ validates :migration_aborted_in_state, inclusion: { in: ACTIVE_MIGRATION_STATES }, allow_nil: true
validates :migration_retries_count, presence: true,
numericality: { greater_than_or_equal_to: 0 },
@@ -23,7 +27,7 @@ class ContainerRepository < ApplicationRecord
enum expiration_policy_cleanup_status: { cleanup_unscheduled: 0, cleanup_scheduled: 1, cleanup_unfinished: 2, cleanup_ongoing: 3 }
enum migration_skipped_reason: { not_in_plan: 0, too_many_retries: 1, too_many_tags: 2, root_namespace_in_deny_list: 3 }
- delegate :client, to: :registry
+ delegate :client, :gitlab_api_client, to: :registry
scope :ordered, -> { order(:name) }
scope :with_api_entity_associations, -> { preload(project: [:route, { namespace: :route }]) }
@@ -41,6 +45,119 @@ class ContainerRepository < ApplicationRecord
scope :expiration_policy_started_at_nil_or_before, ->(timestamp) { where('expiration_policy_started_at < ? OR expiration_policy_started_at IS NULL', timestamp) }
scope :with_stale_ongoing_cleanup, ->(threshold) { cleanup_ongoing.where('expiration_policy_started_at < ?', threshold) }
+ state_machine :migration_state, initial: :default do
+ state :pre_importing do
+ validates :migration_pre_import_started_at, presence: true
+ validates :migration_pre_import_done_at, presence: false
+ end
+
+ state :pre_import_done do
+ validates :migration_pre_import_started_at,
+ :migration_pre_import_done_at,
+ presence: true
+ end
+
+ state :importing do
+ validates :migration_import_started_at, presence: true
+ validates :migration_import_done_at, presence: false
+ end
+
+ state :import_done
+
+ state :import_skipped do
+ validates :migration_skipped_reason,
+ :migration_skipped_at,
+ presence: true
+ end
+
+ state :import_aborted do
+ validates :migration_aborted_at, presence: true
+ validates :migration_retries_count, presence: true, numericality: { greater_than_or_equal_to: 1 }
+ end
+
+ event :start_pre_import do
+ transition default: :pre_importing
+ end
+
+ event :finish_pre_import do
+ transition pre_importing: :pre_import_done
+ end
+
+ event :start_import do
+ transition pre_import_done: :importing
+ end
+
+ event :finish_import do
+ transition importing: :import_done
+ end
+
+ event :already_migrated do
+ transition default: :import_done
+ end
+
+ event :abort_import do
+ transition %i[pre_importing importing] => :import_aborted
+ end
+
+ event :skip_import do
+ transition %i[default pre_importing importing] => :import_skipped
+ end
+
+ event :retry_pre_import do
+ transition import_aborted: :pre_importing
+ end
+
+ event :retry_import do
+ transition import_aborted: :importing
+ end
+
+ before_transition any => :pre_importing do |container_repository|
+ container_repository.migration_pre_import_started_at = Time.zone.now
+ container_repository.migration_pre_import_done_at = nil
+ end
+
+ after_transition any => :pre_importing do |container_repository|
+ container_repository.abort_import unless container_repository.migration_pre_import == :ok
+ end
+
+ before_transition pre_importing: :pre_import_done do |container_repository|
+ container_repository.migration_pre_import_done_at = Time.zone.now
+ end
+
+ before_transition any => :importing do |container_repository|
+ container_repository.migration_import_started_at = Time.zone.now
+ container_repository.migration_import_done_at = nil
+ end
+
+ after_transition any => :importing do |container_repository|
+ container_repository.abort_import unless container_repository.migration_import == :ok
+ end
+
+ before_transition importing: :import_done do |container_repository|
+ container_repository.migration_import_done_at = Time.zone.now
+ end
+
+ before_transition any => :import_aborted do |container_repository|
+ container_repository.migration_aborted_in_state = container_repository.migration_state
+ container_repository.migration_aborted_at = Time.zone.now
+ container_repository.migration_retries_count += 1
+ end
+
+ before_transition import_aborted: any do |container_repository|
+ container_repository.migration_aborted_at = nil
+ container_repository.migration_aborted_in_state = nil
+ end
+
+ before_transition any => :import_skipped do |container_repository|
+ container_repository.migration_skipped_at = Time.zone.now
+ end
+
+ before_transition any => %i[import_done import_aborted] do
+ # EnqueuerJob.enqueue perform_async or perform_in depending on the speed FF
+ # To be implemented in https://gitlab.com/gitlab-org/gitlab/-/issues/349744
+ end
+ end
+
def self.exists_by_path?(path)
where(
project: path.repository_project,
@@ -64,6 +181,30 @@ class ContainerRepository < ApplicationRecord
with_enabled_policy.cleanup_unfinished
end
+ def skip_import(reason:)
+ self.migration_skipped_reason = reason
+
+ super
+ end
+
+ def start_pre_import
+ return false unless ContainerRegistry::Migration.enabled?
+
+ super
+ end
+
+ def retry_pre_import
+ return false unless ContainerRegistry::Migration.enabled?
+
+ super
+ end
+
+ def retry_import
+ return false unless ContainerRegistry::Migration.enabled?
+
+ super
+ end
+
# rubocop: disable CodeReuse/ServiceClass
def registry
@registry ||= begin
@@ -150,6 +291,18 @@ class ContainerRepository < ApplicationRecord
migration_state == 'importing'
end
+ def migration_pre_import
+ return :error unless gitlab_api_client.supports_gitlab_api?
+
+ gitlab_api_client.pre_import_repository(self.path)
+ end
+
+ def migration_import
+ return :error unless gitlab_api_client.supports_gitlab_api?
+
+ gitlab_api_client.import_repository(self.path)
+ end
+
def self.build_from_path(path)
self.new(project: path.repository_project,
name: path.repository_name)
diff --git a/app/services/service_ping/submit_service.rb b/app/services/service_ping/submit_service.rb
index d3d9dcecb2b..3e8c1848f88 100644
--- a/app/services/service_ping/submit_service.rb
+++ b/app/services/service_ping/submit_service.rb
@@ -5,6 +5,7 @@ module ServicePing
PRODUCTION_BASE_URL = 'https://version.gitlab.com'
STAGING_BASE_URL = 'https://gitlab-services-version-gitlab-com-staging.gs-staging.gitlab.org'
USAGE_DATA_PATH = 'usage_data'
+ ERROR_PATH = 'usage_ping_errors'
SubmissionError = Class.new(StandardError)
@@ -15,12 +16,23 @@ module ServicePing
def execute
return unless ServicePing::ServicePingSettings.product_intelligence_enabled?
+ start = Time.current
begin
usage_data = BuildPayloadService.new.execute
response = submit_usage_data_payload(usage_data)
- rescue StandardError
+ rescue StandardError => e
return unless Gitlab::CurrentSettings.usage_ping_enabled?
+ error_payload = {
+ time: Time.current,
+ uuid: Gitlab::UsageData.add_metric('UuidMetric'),
+ hostname: Gitlab::UsageData.add_metric('HostnameMetric'),
+ version: Gitlab::UsageData.alt_usage_data { Gitlab::VERSION },
+ message: e.message,
+ elapsed: (Time.current - start).round(1)
+ }
+ submit_payload({ error: error_payload }, url: error_url)
+
usage_data = Gitlab::UsageData.data(force_refresh: true)
response = submit_usage_data_payload(usage_data)
end
@@ -42,12 +54,16 @@ module ServicePing
URI.join(base_url, USAGE_DATA_PATH)
end
+ def error_url
+ URI.join(base_url, ERROR_PATH)
+ end
+
private
- def submit_payload(usage_data)
+ def submit_payload(payload, url: self.url)
Gitlab::HTTP.post(
url,
- body: usage_data.to_json,
+ body: payload.to_json,
allow_local_requests: true,
headers: { 'Content-type' => 'application/json' }
)
diff --git a/app/services/update_container_registry_info_service.rb b/app/services/update_container_registry_info_service.rb
index 531335839a9..7d79b257687 100644
--- a/app/services/update_container_registry_info_service.rb
+++ b/app/services/update_container_registry_info_service.rb
@@ -15,6 +15,12 @@ class UpdateContainerRegistryInfoService
client = ContainerRegistry::Client.new(registry_config.api_url, token: token)
info = client.registry_info
+ gitlab_api_client = ContainerRegistry::GitlabApiClient.new(registry_config.api_url, token: token)
+ if gitlab_api_client.supports_gitlab_api?
+ info[:features] ||= []
+ info[:features] << ContainerRegistry::GitlabApiClient::REGISTRY_GITLAB_V1_API_FEATURE
+ end
+
Gitlab::CurrentSettings.update!(
container_registry_vendor: info[:vendor] || '',
container_registry_version: info[:version] || '',
diff --git a/app/validators/x509_certificate_credentials_validator.rb b/app/validators/x509_certificate_credentials_validator.rb
index d2f18e956c3..11b53d59c7d 100644
--- a/app/validators/x509_certificate_credentials_validator.rb
+++ b/app/validators/x509_certificate_credentials_validator.rb
@@ -41,7 +41,7 @@ class X509CertificateCredentialsValidator < ActiveModel::Validator
return if private_key.nil? || certificate.nil?
- unless certificate.public_key.fingerprint == private_key.public_key.fingerprint
+ unless certificate.check_private_key(private_key)
record.errors.add(options[:pkey], _('private key does not match certificate.'))
end
end