Skip to content

Commit 13080b7

Browse files
authored
Merge pull request #21577 from kbrock/purging_miq_requests
Purge miq requests every 6 months
2 parents 2a88772 + c5f915c commit 13080b7

File tree

7 files changed

+93
-1
lines changed

7 files changed

+93
-1
lines changed

app/models/miq_request.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class MiqRequest < ApplicationRecord
22
extend InterRegionApiMethodRelay
33

4+
include Purging
45
ACTIVE_STATES = %w[active queued]
56
REQUEST_UNIQUE_KEYS = %w[id state status created_on updated_on type].freeze
67

@@ -18,7 +19,7 @@ class MiqRequest < ApplicationRecord
1819
has_many :miq_approvals, :dependent => :destroy
1920
has_many :miq_request_tasks, :dependent => :destroy
2021

21-
has_many :request_logs, :foreign_key => :resource_id, :dependent => :destroy
22+
has_many :request_logs, :foreign_key => :resource_id, :dependent => :delete_all
2223

2324
alias_attribute :state, :request_state
2425

app/models/miq_request/purging.rb

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class MiqRequest
2+
module Purging
3+
extend ActiveSupport::Concern
4+
include PurgingMixin
5+
6+
module ClassMethods
7+
def purge_date
8+
::Settings.miq_request.history.keep_miq_requests.to_i_with_method.seconds.ago.utc
9+
end
10+
11+
def purge_window_size
12+
::Settings.miq_request.history.purge_window_size
13+
end
14+
15+
def purge_scope(older_than)
16+
MiqRequest.where(arel_table[:created_on].lt(older_than))
17+
end
18+
19+
def purge_method
20+
:destroy
21+
end
22+
end
23+
end
24+
end

app/models/miq_schedule_worker/jobs.rb

+4
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ def event_stream_purge_timer
113113
queue_work(:class_name => "EventStream", :method_name => "purge_timer", :zone => nil)
114114
end
115115

116+
def miq_request_purge_timer
117+
queue_work(:class_name => "MiqRequest", :method_name => "purge_timer", :zone => nil)
118+
end
119+
116120
def notification_purge_timer
117121
queue_work(:class_name => "Notification", :method_name => "purge_timer", :zone => nil)
118122
end

app/models/miq_schedule_worker/runner.rb

+8
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,14 @@ def schedules_for_scheduler_role
255255
enqueue(:notification_purge_timer)
256256
end
257257

258+
# Schedule - Purging of MiqRequests
259+
scheduler.schedule_every(
260+
:miq_request_purge_timer,
261+
worker_settings[:miq_request_purge_interval]
262+
) do
263+
enqueue(:miq_request_purge_timer)
264+
end
265+
258266
# Schedule - Purging of tasks
259267
scheduler.schedule_every(
260268
:task_purge_timer,

config/settings.yml

+5
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,10 @@
869869
:secret_filter: []
870870
:messaging:
871871
:type: kafka
872+
:miq_request:
873+
:history:
874+
:purge_window_size: 500
875+
:keep_miq_requests: 6.months
872876
:notifications:
873877
:history:
874878
:purge_window_size: 1000
@@ -1143,6 +1147,7 @@
11431147
:evm_snapshot_interval: 1.hour
11441148
:job_timeout_interval: 60.seconds
11451149
:log_active_configuration_interval: 1.days
1150+
:miq_request_purge_interval: 1.week
11461151
:nice_delta: 3
11471152
:notifications_purge_interval: 1.day
11481153
:orchestration_stack_retired_interval: 10.minutes

spec/factories/request_log.rb

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FactoryBot.define do
2+
factory :request_log do
3+
severity { "INFO" }
4+
end
5+
end
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
RSpec.describe MiqRequest do
2+
let(:user) { FactoryBot.create(:user) }
3+
context "::Purging" do
4+
describe ".purge_by_date" do
5+
before do
6+
Timecop.freeze(7.months.ago) do
7+
@old_request = FactoryBot.create(:vm_migrate_request, :requester => user)
8+
FactoryBot.create(:miq_request_task, :miq_request => @old_request)
9+
parent_task = FactoryBot.create(:miq_request_task, :miq_request => @old_request)
10+
FactoryBot.create(:miq_request_task, :miq_request_task => parent_task)
11+
FactoryBot.create(:miq_approval, :miq_request => @old_request)
12+
FactoryBot.create(:request_log, :resource => @old_request)
13+
end
14+
15+
Timecop.freeze(6.days.ago) do
16+
@new_request = FactoryBot.create(:vm_migrate_request, :requester => user)
17+
@new_parent_task = FactoryBot.create(:miq_request_task, :miq_request => @new_request)
18+
@new_child_task = FactoryBot.create(:miq_request_task, :miq_request_task => @new_parent_task)
19+
FactoryBot.create(:miq_approval, :miq_request => @new_request)
20+
FactoryBot.create(:request_log, :resource => @new_request)
21+
end
22+
end
23+
24+
it "deletes rows and associated table rows, leaving only newer rows" do
25+
expect(described_class.all).to match_array([@old_request, @new_request])
26+
expect(MiqRequestTask.count).to eq(5)
27+
described_class.purge_by_date(described_class.purge_date)
28+
29+
expect(described_class.all).to match_array([@new_request])
30+
expect(MiqRequestTask.all.pluck(:id)).to match_array([@new_parent_task.id, @new_child_task.id])
31+
expect(MiqApproval.all.pluck(:id)).to match_array(@new_request.reload.miq_approval_ids) # there's a default approval created for each request, so just check ids
32+
expect(RequestLog.all.pluck(:id)).to eq(@new_request.request_log_ids)
33+
end
34+
end
35+
36+
describe ".purge_timer" do
37+
it "queues the correct purge method" do
38+
EvmSpecHelper.local_miq_server
39+
described_class.purge_timer
40+
q = MiqQueue.first
41+
expect(q).to have_attributes(:class_name => described_class.name, :method_name => "purge_by_date")
42+
end
43+
end
44+
end
45+
end

0 commit comments

Comments
 (0)