As with the previous revisions make sure to add the following
to /var/lib/condor/condor_config.local

   EVENT_LOG=$(LOG)/EventLog
   EVENT_LOG_USE_XML=True
   
EVENT_LOG_JOB_AD_INFORMATION_ATTRS=Owner,GlobalJobId,Cmd,JobStartDate,JobCurrentStartDate,JobFinishedHookDone

and set CONDOR_HOST appropriately. Make sure to restart condor after these 
changes.
---
 src/app/models/instance_event.rb                   |   26 +++++
 src/app/util/condormatic.rb                        |    2 +-
 .../20100810221250_create_instance_events.rb       |   34 ++++++
 src/dbomatic/dbomatic.rb                           |  114 ++++++++++++++++++++
 4 files changed, 175 insertions(+), 1 deletions(-)
 create mode 100644 src/app/models/instance_event.rb
 create mode 100644 src/db/migrate/20100810221250_create_instance_events.rb
 create mode 100644 src/dbomatic/dbomatic.rb

diff --git a/src/app/models/instance_event.rb b/src/app/models/instance_event.rb
new file mode 100644
index 0000000..5076f8a
--- /dev/null
+++ b/src/app/models/instance_event.rb
@@ -0,0 +1,26 @@
+# Copyright (C) 2010 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# Filters added to this controller apply to all controllers in the application.
+# Likewise, all the methods added will be available for all controllers.
+
+class InstanceEvent < ActiveRecord::Base
+  belongs_to :instance
+
+  validates_presence_of :instance_id
+  validates_presence_of :event_type
+end
diff --git a/src/app/util/condormatic.rb b/src/app/util/condormatic.rb
index 3491f7f..9ac4b45 100644
--- a/src/app/util/condormatic.rb
+++ b/src/app/util/condormatic.rb
@@ -41,7 +41,7 @@ def condormatic_instance_create(task)
     pipe.puts "log = #{job_log}\n"
     Rails.logger.info "log = #{job_log}\n"
 
-    requirements = "requirements = hardwareprofile == 
\"#{instance.hardware_profile.id}\" && image == \"#{instance.image.id}\""
+    requirements = "requirements = hardwareprofile == 
\"#{instance.hardware_profile.external_key}\" && image == 
\"#{instance.image.external_key}\""
     requirements += " && realm == \"#{realm.name}\"" if realm != nil
     requirements += "\n"
 
diff --git a/src/db/migrate/20100810221250_create_instance_events.rb 
b/src/db/migrate/20100810221250_create_instance_events.rb
new file mode 100644
index 0000000..22e5191
--- /dev/null
+++ b/src/db/migrate/20100810221250_create_instance_events.rb
@@ -0,0 +1,34 @@
+# Copyright (C) 2010 Red Hat, Inc.
+# Written by Mohammed Morsi <mmo...@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+class CreateInstanceEvents < ActiveRecord::Migration
+  def self.up
+    create_table :instance_events do |t|
+      t.integer    :instance_id, :null => false
+      t.string     :event_type,  :null => false
+      t.datetime   :event_time
+      t.string     :status
+      t.string     :message
+      t.timestamps
+    end
+  end
+
+  def self.down
+    drop_table :instance_events
+  end
+end
diff --git a/src/dbomatic/dbomatic.rb b/src/dbomatic/dbomatic.rb
new file mode 100644
index 0000000..1fd8948
--- /dev/null
+++ b/src/dbomatic/dbomatic.rb
@@ -0,0 +1,114 @@
+# Copyright (C) 2010 Red Hat, Inc.
+# Written by Mohammed Morsi <mmo...@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+$: << File.join(File.dirname(__FILE__), "../dutils")
+require 'dutils'
+require 'nokogiri'
+require 'rb-inotify'
+
+CONDOR_EVENT_LOG_DIR    =   "/var/log/condor"
+CONDOR_EVENT_LOG_FILE   =   "#{CONDOR_EVENT_LOG_DIR}/EventLog"
+EVENT_LOG_POS_FILE      =   "/var/run/dbomatic/event_log_position"
+
+# Handle the event log's xml
+class CondorEventLog < Nokogiri::XML::SAX::Document
+  attr_accessor :tag, :event_type, :event_cmd, :event_time
+
+  # Store the name of the event log attribute we're looking at
+  def start_element(element, attributes)
+    @tag = attributes[1] if element == "a"
+  end
+
+  # Store the value of the event log attribute we're looking at
+  def characters(string)
+    unless string.strip == ""
+      if @tag == "MyType"
+        @event_type = string
+      elsif @tag == "Cmd"
+        @event_cmd = string
+      elsif @tag == "EventTime"
+        @event_time = string
+      end
+    end
+  end
+
+  # Create a new entry for events which we have all the neccessary data for
+  def end_element(element)
+    if element == "c" && !...@event_cmd.nil?
+      # Condor may write to event log before condormatic returns and instance
+      # table is updated. Extract instance name from event_cmd and query on 
that
+      inst_name = @event_cmd[4,@event_cmd.size-4].gsub(/_[0-9]*$/, '')
+      inst = Instance.find(:first, :conditions => ['name = ?', inst_name])
+      puts "Instance event #{inst.name} #...@event_type} #...@event_time}"
+      InstanceEvent.create! :instance => inst,
+                            :event_type => @event_type,
+                            :event_time => @event_time
+      @tag = @event_type = @event_cmd = @event_time = nil
+    end
+  end
+end
+parser = Nokogiri::XML::SAX::PushParser.new(CondorEventLog.new)
+
+# XXX hack, condor event log doesn't seem to have a top level element
+# enclosing everything else in the doc (as standards conforming xml must).
+# Create one for parsing purposes.
+parser << "<events>"
+
+def parse_log_file(log_file, parser)
+  while s = log_file.gets
+    parser << s
+  end
+  File.open(EVENT_LOG_POS_FILE, 'w') { |f| f.write log_file.pos.to_s }
+end
+
+notifier = INotify::Notifier.new
+log_file = nil
+
+if File.exists? CONDOR_EVENT_LOG_FILE
+  log_file = File.open(CONDOR_EVENT_LOG_FILE)
+
+  # persistantly store log position in filesystem
+  # incase of dbomatic restarts
+  if File.exists?(EVENT_LOG_POS_FILE)
+    File.open(EVENT_LOG_POS_FILE, 'r') { |f| log_file.pos = f.read.to_i }
+  end
+
+  # Setup inotify watch for condor event log
+  notifier.watch(CONDOR_EVENT_LOG_FILE, :modify){ |event|
+    parse_log_file log_file, parser
+  }
+
+# if log file doesn't exist wait until it does
+else
+  notifier.watch(CONDOR_EVENT_LOG_DIR, :create){ |event|
+    if event.name == "EventLog"
+      log_file = File.open(CONDOR_EVENT_LOG_FILE)
+      parse_log_file log_file, parser
+
+      # Setup inotify watch for condor event log
+      notifier.watch(CONDOR_EVENT_LOG_FILE, :modify){ |event|
+        parse_log_file log_file, parser
+      }
+    end
+  }
+end
+
+notifier.run
+
+parser << "</events>"
+parser.finish
-- 
1.7.2.1

_______________________________________________
deltacloud-devel mailing list
deltacloud-devel@lists.fedorahosted.org
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to