Skip to content

Commit

Permalink
Merge pull request #19037 from yrudman/che-for-existted-sheduler-when…
Browse files Browse the repository at this point in the history
…-seeding

Fix: do not raise error if schedule for widget exists but not linked
(cherry picked from commit a248ba3)

https://bugzilla.redhat.com/show_bug.cgi?id=1729441
  • Loading branch information
bdunne authored and simaishi committed Aug 8, 2019
1 parent 7297016 commit 9a91d36
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 2 deletions.
22 changes: 20 additions & 2 deletions app/models/miq_widget.rb
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,10 @@ def self.sync_from_hash(attrs)
widget
end

def filter_for_schedule
{"=" => {"field" => "MiqWidget-id", "value" => id}}
end

def sync_schedule(schedule_info)
return if schedule_info.nil?

Expand All @@ -511,11 +515,12 @@ def sync_schedule(schedule_info)
raise _("Unsupported interval '%{interval}'") % {:interval => interval}
end

sched = MiqSchedule.create!(
sched = existing_schedule
sched ||= MiqSchedule.create!(
:name => description,
:description => description,
:sched_action => {:method => "generate_widget"},
:filter => MiqExpression.new("=" => {"field" => "MiqWidget-id", "value" => id}),
:filter => MiqExpression.new(filter_for_schedule),
:resource_type => self.class.name,
:run_at => {
:interval => {:value => value, :unit => unit},
Expand All @@ -532,6 +537,19 @@ def sync_schedule(schedule_info)
sched
end

def existing_schedule
return nil if (sched = MiqSchedule.find_by(:name => description)).nil?

# return existing sheduler if filter referr to the same widget
return sched if sched.filter.exp == filter_for_schedule

# change name of existed schedule in case it is in use
suffix = Time.new.utc.to_s
_log.warn("Schedule #{sched.name} already exists, renaming it to `#{sched.name} #{suffix}`")
sched.update(:name => "#{sched.name} #{suffix}", :description => "#{sched.description} #{suffix}")
nil
end

def self.seed
sync_from_dir
end
Expand Down
34 changes: 34 additions & 0 deletions spec/models/miq_widget_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,40 @@
'))
end

describe "#filter_for_schedule" do
it "returns Hash object representing valid MiqExpression" do
exp = MiqExpression.new(@widget_chart_vendor_and_guest_os.filter_for_schedule)
expect(exp.valid?).to be_truthy
end
end

describe "#sync_schedule" do
let(:schedule) do
filter = @widget_chart_vendor_and_guest_os.filter_for_schedule
FactoryBot.create(:miq_schedule, :filter => MiqExpression.new(filter), :resource_type => "MiqWidget",
:name => @widget_chart_vendor_and_guest_os.name)
end

it "uses existing schedule if link between widget and schedule broken" do
expect(@widget_chart_vendor_and_guest_os.miq_schedule).to be_nil
@widget_chart_vendor_and_guest_os.sync_schedule(:run_at => schedule.run_at)

expect(MiqSchedule.count).to eq(1)
expect(@widget_chart_vendor_and_guest_os.miq_schedule.id).to eq(schedule.id)
end

it "rename existing scheduler by adding timestamp to name if existing scheduler use different filter" do
schedule.update(:filter => MiqExpression.new("=" => {"field" => "MiqWidget-id", "value" => 9999}))

time_now = Time.now.utc
Timecop.freeze(time_now) { @widget_chart_vendor_and_guest_os.sync_schedule(:run_at => schedule.run_at) }
schedule.reload

expect(MiqSchedule.count).to eq(2)
expect(schedule.name.end_with?(time_now.to_s)).to be_truthy
end
end

context "#queue_generate_content_for_users_or_group" do
before do
@widget = @widget_report_vendor_and_guest_os
Expand Down

0 comments on commit 9a91d36

Please sign in to comment.