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
On 08/26/10 - 07:14:29PM, Mohammed Morsi wrote:
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
ACK. We can deal with the external->internal event mapping later. I've now pushed this, except...
<snip>
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"
...this bit, which seems unrelated.
On Fri, 2010-08-27 at 09:14 -0400, Chris Lalancette wrote:
On 08/26/10 - 07:14:29PM, Mohammed Morsi wrote:
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
ACK. We can deal with the external->internal event mapping later. I've now pushed this, except...
<snip>
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"
...this bit, which seems unrelated.
Yeah, I don't think it'd work at all like that..
Ian
On 08/27/2010 02:35 PM, Ian Main wrote:
On Fri, 2010-08-27 at 09:14 -0400, Chris Lalancette wrote:
On 08/26/10 - 07:14:29PM, Mohammed Morsi wrote:
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
ACK. We can deal with the external->internal event mapping later. I've now pushed this, except...
<snip>
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"
...this bit, which seems unrelated.
Yeah, I don't think it'd work at all like that..
Ian
Ah yes, this was a relic from our debugging session last week and shouldn't be there.
Though that being said this was the only way I got condor to be able to find any matching provider to run instances on. Although something was still going wrong and the instances weren't starting, using the id results in the match being made against the hardware profile's and image's database id.
-Mo
deltacloud-devel@lists.fedorahosted.org