From: Tomas Sedovic <tsedovic(a)redhat.com>
https://www.aeolusproject.org/redmine/issues/2140
This makes sure events survive even when the instance is deleted and the
deletion event is logged as well.
---
src/app/models/event.rb | 10 ++++++++++
src/app/models/instance.rb | 2 +-
src/app/models/instance_observer.rb | 6 ++++++
src/spec/models/instance_observer_spec.rb | 7 +++++++
4 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/src/app/models/event.rb b/src/app/models/event.rb
index 1e17f35..c897a33 100644
--- a/src/app/models/event.rb
+++ b/src/app/models/event.rb
@@ -39,4 +39,14 @@ class Event < ActiveRecord::Base
validates_presence_of :source_id
validates_presence_of :source_type
+
+ def source
+ begin
+ model = Kernel.const_get(source_type)
+ model.find source_id
+ rescue ActiveRecord::RecordNotFound
+ model = model.const_get('Archive')
+ model.find source_id
+ end
+ end
end
diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb
index 9c06a30..e80e224 100644
--- a/src/app/models/instance.rb
+++ b/src/app/models/instance.rb
@@ -78,7 +78,7 @@ class Instance < ActiveRecord::Base
has_many :permissions, :as => :permission_object, :dependent => :destroy,
:include => [:role],
:order => "permissions.id ASC"
- has_many :events, :as => :source, :dependent => :destroy
+ has_many :events, :as => :source
after_create "assign_owner_roles(owner)"
validates_presence_of :pool_id
diff --git a/src/app/models/instance_observer.rb b/src/app/models/instance_observer.rb
index a7b53ed..983a04d 100644
--- a/src/app/models/instance_observer.rb
+++ b/src/app/models/instance_observer.rb
@@ -88,6 +88,12 @@ class InstanceObserver < ActiveRecord::Observer
end
end
+ def after_destroy(instance)
+ event = Event.new(:source => instance, :event_time => DateTime.now,
+ :summary => "deleted")
+ event.save!
+ end
+
end
InstanceObserver.instance
diff --git a/src/spec/models/instance_observer_spec.rb
b/src/spec/models/instance_observer_spec.rb
index c4d0a42..9df12fc 100644
--- a/src/spec/models/instance_observer_spec.rb
+++ b/src/spec/models/instance_observer_spec.rb
@@ -189,6 +189,13 @@ describe InstanceObserver do
@instance = Instance.find((a)instance.id)
@instance.events.should have(3).items
@instance.events[2].summary.should match /state.*stopped/
+
+ @instance.destroy
+
+ Event.all.should have(4).items
+ Event.last.summary.should match /deleted/
+ Event.last.source.id.should == @instance.id
+ Event.last.source.name.should == @instance.name
end
it "should destroy the instance key when the instance is stopped" do
--
1.7.6