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-14 12:14:36 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-01-14 12:14:36 +0300
commit7bd8f9822b05eb2e8c8279678e38e7513c3612f6 (patch)
treeab85f35234e66b99a1d3400ffb4ee529a0011d6f /app
parentd11616c828fa76b0fea100872b59d904560e6570 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/boards/constants.js2
-rw-r--r--app/assets/javascripts/boards/graphql/group_board_milestones.query.graphql4
-rw-r--r--app/assets/javascripts/boards/graphql/project_board_milestones.query.graphql4
-rw-r--r--app/assets/javascripts/boards/stores/actions.js2
-rw-r--r--app/models/clusters/agent.rb8
-rw-r--r--app/models/clusters/agent_token.rb5
-rw-r--r--app/models/clusters/agents/activity_event.rb2
-rw-r--r--app/services/clusters/agent_tokens/create_service.rb5
-rw-r--r--app/services/clusters/agents/create_activity_event_service.rb28
-rw-r--r--app/services/clusters/agents/delete_expired_events_service.rb25
-rw-r--r--app/workers/all_queues.yml9
-rw-r--r--app/workers/clusters/agents/delete_expired_events_worker.rb21
-rw-r--r--app/workers/concerns/cluster_agent_queue.rb10
13 files changed, 117 insertions, 8 deletions
diff --git a/app/assets/javascripts/boards/constants.js b/app/assets/javascripts/boards/constants.js
index e0eea761b31..0f290f566ba 100644
--- a/app/assets/javascripts/boards/constants.js
+++ b/app/assets/javascripts/boards/constants.js
@@ -50,6 +50,8 @@ export const toggleFormEventPrefix = {
issue: 'toggle-issue-form-',
};
+export const active = 'active';
+
export const inactiveId = 0;
export const ISSUABLE = 'issuable';
diff --git a/app/assets/javascripts/boards/graphql/group_board_milestones.query.graphql b/app/assets/javascripts/boards/graphql/group_board_milestones.query.graphql
index 0963b3fbfaa..6fe8bb799d6 100644
--- a/app/assets/javascripts/boards/graphql/group_board_milestones.query.graphql
+++ b/app/assets/javascripts/boards/graphql/group_board_milestones.query.graphql
@@ -1,7 +1,7 @@
-query GroupBoardMilestones($fullPath: ID!, $searchTerm: String) {
+query GroupBoardMilestones($fullPath: ID!, $searchTerm: String, $state: MilestoneStateEnum) {
group(fullPath: $fullPath) {
id
- milestones(includeAncestors: true, searchTitle: $searchTerm) {
+ milestones(includeAncestors: true, searchTitle: $searchTerm, state: $state) {
nodes {
id
title
diff --git a/app/assets/javascripts/boards/graphql/project_board_milestones.query.graphql b/app/assets/javascripts/boards/graphql/project_board_milestones.query.graphql
index e456823d78a..d917c7e809d 100644
--- a/app/assets/javascripts/boards/graphql/project_board_milestones.query.graphql
+++ b/app/assets/javascripts/boards/graphql/project_board_milestones.query.graphql
@@ -1,7 +1,7 @@
-query ProjectBoardMilestones($fullPath: ID!, $searchTerm: String) {
+query ProjectBoardMilestones($fullPath: ID!, $searchTerm: String, $state: MilestoneStateEnum) {
project(fullPath: $fullPath) {
id
- milestones(searchTitle: $searchTerm, includeAncestors: true) {
+ milestones(searchTitle: $searchTerm, includeAncestors: true, state: $state) {
nodes {
id
title
diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js
index 1ebfcfc331b..48ca3239cfd 100644
--- a/app/assets/javascripts/boards/stores/actions.js
+++ b/app/assets/javascripts/boards/stores/actions.js
@@ -15,6 +15,7 @@ import {
FilterFields,
ListTypeTitles,
DraggableItemTypes,
+ active,
} from 'ee_else_ce/boards/constants';
import {
formatIssueInput,
@@ -209,6 +210,7 @@ export default {
const variables = {
fullPath,
searchTerm,
+ state: active,
};
let query;
diff --git a/app/models/clusters/agent.rb b/app/models/clusters/agent.rb
index 8705c0fbec4..79fc2b58237 100644
--- a/app/models/clusters/agent.rb
+++ b/app/models/clusters/agent.rb
@@ -5,6 +5,7 @@ module Clusters
self.table_name = 'cluster_agents'
INACTIVE_AFTER = 1.hour.freeze
+ ACTIVITY_EVENT_LIMIT = 200
belongs_to :created_by_user, class_name: 'User', optional: true
belongs_to :project, class_name: '::Project' # Otherwise, it will load ::Clusters::Project
@@ -39,5 +40,12 @@ module Clusters
def connected?
agent_tokens.active.where("last_used_at > ?", INACTIVE_AFTER.ago).exists?
end
+
+ def activity_event_deletion_cutoff
+ # Order is defined by the association
+ activity_events
+ .offset(ACTIVITY_EVENT_LIMIT - 1)
+ .pick(:recorded_at)
+ end
end
end
diff --git a/app/models/clusters/agent_token.rb b/app/models/clusters/agent_token.rb
index bcef6b6ecc8..acf13c55ba3 100644
--- a/app/models/clusters/agent_token.rb
+++ b/app/models/clusters/agent_token.rb
@@ -56,12 +56,13 @@ module Clusters
end
def log_activity_event!(recorded_at)
- agent.activity_events.create!(
+ Clusters::Agents::CreateActivityEventService.new( # rubocop: disable CodeReuse/ServiceClass
+ agent,
kind: :agent_connected,
level: :info,
recorded_at: recorded_at,
agent_token: self
- )
+ ).execute
end
end
end
diff --git a/app/models/clusters/agents/activity_event.rb b/app/models/clusters/agents/activity_event.rb
index 5d9c885c923..ec2bbfde339 100644
--- a/app/models/clusters/agents/activity_event.rb
+++ b/app/models/clusters/agents/activity_event.rb
@@ -3,6 +3,7 @@
module Clusters
module Agents
class ActivityEvent < ApplicationRecord
+ include EachBatch
include NullifyIfBlank
self.table_name = 'agent_activity_events'
@@ -12,6 +13,7 @@ module Clusters
belongs_to :agent_token, class_name: 'Clusters::AgentToken'
scope :in_timeline_order, -> { order(recorded_at: :desc, id: :desc) }
+ scope :recorded_before, -> (cutoff) { where('recorded_at < ?', cutoff) }
validates :recorded_at, :kind, :level, presence: true
diff --git a/app/services/clusters/agent_tokens/create_service.rb b/app/services/clusters/agent_tokens/create_service.rb
index 5b8a0e46a6c..2539ffdc5ba 100644
--- a/app/services/clusters/agent_tokens/create_service.rb
+++ b/app/services/clusters/agent_tokens/create_service.rb
@@ -30,13 +30,14 @@ module Clusters
end
def log_activity_event!(token)
- token.agent.activity_events.create!(
+ Clusters::Agents::CreateActivityEventService.new(
+ token.agent,
kind: :token_created,
level: :info,
recorded_at: token.created_at,
user: current_user,
agent_token: token
- )
+ ).execute
end
end
end
diff --git a/app/services/clusters/agents/create_activity_event_service.rb b/app/services/clusters/agents/create_activity_event_service.rb
new file mode 100644
index 00000000000..886dddf1a52
--- /dev/null
+++ b/app/services/clusters/agents/create_activity_event_service.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Agents
+ class CreateActivityEventService
+ def initialize(agent, **params)
+ @agent = agent
+ @params = params
+ end
+
+ def execute
+ agent.activity_events.create!(params)
+
+ DeleteExpiredEventsWorker.perform_at(schedule_cleanup_at, agent.id)
+
+ ServiceResponse.success
+ end
+
+ private
+
+ attr_reader :agent, :params
+
+ def schedule_cleanup_at
+ 1.hour.from_now.change(min: agent.id % 60)
+ end
+ end
+ end
+end
diff --git a/app/services/clusters/agents/delete_expired_events_service.rb b/app/services/clusters/agents/delete_expired_events_service.rb
new file mode 100644
index 00000000000..a0c0291c1fb
--- /dev/null
+++ b/app/services/clusters/agents/delete_expired_events_service.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Agents
+ class DeleteExpiredEventsService
+ def initialize(agent)
+ @agent = agent
+ end
+
+ def execute
+ agent.activity_events
+ .recorded_before(remove_events_before)
+ .each_batch { |batch| batch.delete_all }
+ end
+
+ private
+
+ attr_reader :agent
+
+ def remove_events_before
+ agent.activity_event_deletion_cutoff
+ end
+ end
+ end
+end
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 712191df243..8ae06030d88 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -129,6 +129,15 @@
:weight: 2
:idempotent:
:tags: []
+- :name: cluster_agent:clusters_agents_delete_expired_events
+ :worker_name: Clusters::Agents::DeleteExpiredEventsWorker
+ :feature_category: :kubernetes_management
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: container_repository:cleanup_container_repository
:worker_name: CleanupContainerRepositoryWorker
:feature_category: :container_registry
diff --git a/app/workers/clusters/agents/delete_expired_events_worker.rb b/app/workers/clusters/agents/delete_expired_events_worker.rb
new file mode 100644
index 00000000000..3414365a243
--- /dev/null
+++ b/app/workers/clusters/agents/delete_expired_events_worker.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Agents
+ class DeleteExpiredEventsWorker
+ include ApplicationWorker
+ include ClusterAgentQueue
+
+ deduplicate :until_executed, including_scheduled: true
+ idempotent!
+
+ data_consistency :always
+
+ def perform(agent_id)
+ if agent = Clusters::Agent.find_by_id(agent_id)
+ Clusters::Agents::DeleteExpiredEventsService.new(agent).execute
+ end
+ end
+ end
+ end
+end
diff --git a/app/workers/concerns/cluster_agent_queue.rb b/app/workers/concerns/cluster_agent_queue.rb
new file mode 100644
index 00000000000..68de7cca135
--- /dev/null
+++ b/app/workers/concerns/cluster_agent_queue.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module ClusterAgentQueue
+ extend ActiveSupport::Concern
+
+ included do
+ queue_namespace :cluster_agent
+ feature_category :kubernetes_management
+ end
+end