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 mmorsi@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 mmorsi@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