diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-01-14 12:14:36 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-01-14 12:14:36 +0300 |
commit | 7bd8f9822b05eb2e8c8279678e38e7513c3612f6 (patch) | |
tree | ab85f35234e66b99a1d3400ffb4ee529a0011d6f /app | |
parent | d11616c828fa76b0fea100872b59d904560e6570 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
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 |