diff options
Diffstat (limited to 'lib/custodian')
-rw-r--r-- | lib/custodian/alerts/mauve.rb | 10 | ||||
-rw-r--r-- | lib/custodian/testfactory.rb | 62 | ||||
-rw-r--r-- | lib/custodian/worker.rb | 65 |
3 files changed, 88 insertions, 49 deletions
diff --git a/lib/custodian/alerts/mauve.rb b/lib/custodian/alerts/mauve.rb index 66379a5..9a5d9ed 100644 --- a/lib/custodian/alerts/mauve.rb +++ b/lib/custodian/alerts/mauve.rb @@ -213,14 +213,20 @@ module Custodian test_host = test.target test_type = test.get_type - alert = Mauve::Proto::Alert.new # # Mauve only lets us use IDs which are <= 255 characters in length # hash the line from the parser to ensure it is short enough. # (IDs must be unique, per-source) - alert.id = Digest::SHA1.hexdigest(test.to_s) + # + # Because there might be N-classes which implemented the test + # we need to make sure these are distinct too. + # + id_key = test.to_s + id_key += test.class + + alert.id = Digest::SHA1.hexdigest(id_key) alert.subject = subject alert.summary = "The #{test_type} test failed against #{test_host}" diff --git a/lib/custodian/testfactory.rb b/lib/custodian/testfactory.rb index 603b69f..b00703f 100644 --- a/lib/custodian/testfactory.rb +++ b/lib/custodian/testfactory.rb @@ -36,29 +36,45 @@ module Custodian raise ArgumentError, "The type of test to create must be a string" unless ( line.kind_of? String ) # + # The array we return. + # + result = Array.new() + + + # # If this is an obvious protocol test. # if ( line =~ /must\s+(not\s+)?run\s+(\S+)(\s+|\.|$)/ ) + test_type = $2.dup test_type.chomp!( "." ) - c = @@subclasses[test_type] - if c - - obj = c.new( line ) - - # - # Get the notification text, which is not specific to the test-type - # - # We do this only after we've instantiated the test. - # - if ( line =~ /\s+otherwise\s+'([^']+)'/ ) - obj.set_notification_text( $1.dup ) - end - return obj - else - raise ArgumentError, "Bad test type: '#{test_type}'" + # + # For each of the test-classes that implement the type + # + @@subclasses[test_type].each do |impl| + + if impl + obj = impl.new( line ) + + # + # Get the notification text, which is not specific to the test-type + # + # We do this only after we've instantiated the test. + # + if ( line =~ /\s+otherwise\s+'([^']+)'/ ) + obj.set_notification_text( $1.dup ) + end + + result.push(obj) + else + raise ArgumentError, "Bad test type: '#{test_type}'" + end end + + # return the test-types. + return( result ) + else raise "Unknown line given - Failed to instantiate a suitable protocol-test: '#{line}'" end @@ -69,7 +85,8 @@ module Custodian # Register a new test type - this must be called by our derived classes # def self.register_test_type name - @@subclasses[name] = self + @@subclasses[name] ||= Array.new() + @@subclasses[name].push(self) end @@ -88,9 +105,14 @@ module Custodian # Get the friendly-type of this class # def get_type - @@subclasses.each do |name,value| - if ( value == self.class ) - return name + # get each registed type + @@subclasses.keys.each do |name| + + # for each handler .. + @@subclasses[name].each do |impl| + if ( impl == self.class ) + return name + end end end nil diff --git a/lib/custodian/worker.rb b/lib/custodian/worker.rb index 78e7cf0..87f2c7e 100644 --- a/lib/custodian/worker.rb +++ b/lib/custodian/worker.rb @@ -128,46 +128,54 @@ module Custodian - # - # Fetch a single job from the queue, and process it. + # Fetch a single job from the queue, and dispatch it for + # processing. # def process_single_job - result = false + # + # Acquire a job from our queue. + # + job = @queue.fetch(1) - begin + # + # Ensure that the job is sane. + # + raise ArgumentError, "Job was empty" if (job.nil?) + raise ArgumentError, "Job was not a string" unless job.kind_of?(String) - # - # Acquire a job. - # - job = @queue.fetch(1) - log_message( "Job aquired: #{job}" ) - # - # Get the job body - # - raise ArgumentError, "Job was empty" if (job.nil?) - raise ArgumentError, "Job was not a string" unless job.kind_of?(String) + # + # Create the test-object from our class-factory + # + Custodian::TestFactory.create( job ).each do |test| + puts "CREATED FROM JOB: #{test.class}" + process_single_test( test ) + end + end - # - # The count of times this test has run. - # - count = 1 + # + # Fetch a single job from the queue, and process it. + # + def process_single_test( test ) + + begin + log_message( "Received job: #{test.to_s}" ) # - # Create the test-object. + # The count of times this test has run, the result, and the start-time # - test = Custodian::TestFactory.create( job ) - + count = 1 + result = false start_time = Time.now # - # We'll run no more than MAX times. + # If a job fails we'll repeat it, but no more than MAX times. # - # We stop the execution on a single success. + # We exit here if we receive a single success. # while ( ( count < ( @retry_count + 1 ) ) && ( result == false ) ) @@ -182,11 +190,10 @@ module Custodian if ( result ) log_message( "Test succeeed - clearing alert" ) do_clear( test ) - success = true end # - # Some of our routers don't like being hammered. + # Some of our routers/hosts don't like being hammered. # # We delay before re-testing, but we only do this if # we're not on the last count. @@ -200,7 +207,7 @@ module Custodian end # - # Increase count. + # Increase the log of times we've repeated the test. # count += 1 end @@ -210,12 +217,16 @@ module Custodian # end_time = Time.now - # # Duration of the test-run, in milliseconds # duration = (( end_time - start_time ) * 1000.0).to_i + + # + # Record that, if we have any alerters that are interested + # in run-times. + # do_duration( test, duration ) |