New rake task node:generate_unresponsive to add NUM_NODES unresponsive nodes to the DB for testing. This commit also moved data generator functionality out of the generate_sample_reports.rake file into its own lib file.
Paired-with:Matt Robinson Signed-off-by: Max Martin <[email protected]> --- Local-branch: feature/next/6531_report_generator lib/data_generator.rb | 163 ++++++++++++++++++++++++++++ lib/tasks/generate_sample_reports.rake | 163 +--------------------------- lib/tasks/generate_unresponsive_nodes.rake | 12 ++ 3 files changed, 177 insertions(+), 161 deletions(-) create mode 100644 lib/data_generator.rb create mode 100644 lib/tasks/generate_unresponsive_nodes.rake diff --git a/lib/data_generator.rb b/lib/data_generator.rb new file mode 100644 index 0000000..ec28159 --- /dev/null +++ b/lib/data_generator.rb @@ -0,0 +1,163 @@ +#!/usr/bin/env ruby + +module Puppet; end +module Puppet::Resource; end +class Puppet::Transaction; end +module Puppet::Util; end + +# http://projects.puppetlabs.com/projects/puppet/wiki/Report_Format_2 +class Puppet::Transaction::Report + attr_accessor :host, :time, :logs, :metrics, :resource_statuses, + :configuration_version, :report_format, :puppet_version, :kind, :status + + def self.generate(options) + Puppet::Transaction::Report.new.tap do |report| + report.host = DataGenerator.generate_hostname + report.time = DataGenerator.generate_time + report.logs = [] + report.metrics = {} + report.resource_statuses = {} + report.configuration_version = Time.now.to_i + report.report_format = 2 + report.puppet_version = "2.6.5" + report.kind = "apply" + + options[:num_statuses].times do + resource_status = DataGenerator.generate_resource_status(report, options) + report.resource_statuses[resource_status.resource] = resource_status + end + + report.status = report.compute_status + end + end + + def compute_status + if resource_statuses.values.any? {|res| res.failed} + "failed" + elsif resource_statuses.values.any? {|res| res.changed} + "changed" + else + "unchanged" + end + end +end +class Puppet::Util::Log + attr_accessor :file, :line, :level, :message, :source, :tags, :time +end +class Puppet::Util::Metric + attr_accessor :name, :label, :values +end +class Puppet::Resource::Status + attr_accessor :resource_type, :title, :resource, :file, :line, + :evaluation_time, :change_count, :out_of_sync_count, :tags, :time, :events, + :out_of_sync, :changed, :skipped, :failed + + def self.generate(report, options) + Puppet::Resource::Status.new.tap do |rs| + rs.resource_type = "File" + rs.title = File.join("/", (1..(rand(5)+2)).map {DataGenerator.generate_word}) + rs.resource = "#{rs.resource_type}[#{rs.title}]" + rs.file = "/etc/puppet/manifests/site.pp" + rs.line = rand(250) + 1 + rs.evaluation_time = Time.now.to_f % 1 + rand(3) + rs.change_count = rand(100) < 80 ? 0 : rand(5)+1 + rs.out_of_sync_count = rs.change_count + rs.tags = ["node", "class", rs.resource_type.downcase, rs.title.downcase, report.host].sort + rs.time = report.time + rs.events = [] + rs.out_of_sync = rs.out_of_sync_count > 0 + rs.changed = rs.change_count > 0 + rs.skipped = false + rs.failed = rs.change_count > 0 && rand(100) < 10 + + options[:num_events].times do + event = DataGenerator.generate_resource_event(rs) + rs.events << event + end + + end + end +end +class Puppet::Transaction::Event + attr_accessor :audited, :property, :previous_value, :desired_value, + :historical_value, :message, :name, :status, :time + + def self.generate(resource_status) + Puppet::Transaction::Event.new.tap do |event| + event.audited = false + event.property = "mode" + event.previous_value = 644 + event.desired_value = 777 + event.historical_value = 666 + event.message = "Updated file mode" + event.name = "mode" + event.status = "success" + event.time = resource_status.time + end + end +end + +module DataGenerator + def self.generate_reports(options) + Puppet::Transaction::Report.generate(options) + end + + def self.generate_resource_event(resource_status) + Puppet::Transaction::Event.generate(resource_status) + end + + def self.generate_resource_status(report, options) + Puppet::Resource::Status.generate(report, options) + end + + def self.generate_hostname + @domain ||= generate_word + @ext ||= ["net", "org", "com", "co.uk"].random_element + + host = @domain + host = generate_word until host != @domain + "#{host}.#{@domain}.#{@ext}" + end + + def self.generate_time + time = Time.now + time -= 1.day if rand(100) < 5 + time + end + + def self.generate_word + words.random_element + end + + def self.words + if @words.nil? + @words = [] + File.open("/usr/share/dict/words").each_line do |line| + @words << line.chomp + end + @words.delete_if {|word| word.length < 6 or word.squeeze != word or word.downcase != word} + end + @words + end +end + +class Array + def random_element(n=nil) + return self[Kernel.rand(size)] if n.nil? + n = n.to_int + rescue Exception => e + raise TypeError, "Coercion error: #{n.inspect}.to_int => Integer failed:\n(#{e.message})" + else + raise TypeError, "Coercion error: #{n}.to_int did NOT return an Integer (was #{n.class})" unless n.kind_of? ::Integer + raise ArgumentError, "negative array size" if n < 0 + n = size if n > size + result = ::Array.new(self) + n.times do |i| + r = i + Kernel.rand(size - i) + result[i], result[r] = result[r], result[i] + end + result[n..size] = [] + result + end +end + diff --git a/lib/tasks/generate_sample_reports.rake b/lib/tasks/generate_sample_reports.rake index 067ba3c..65d3a2d 100644 --- a/lib/tasks/generate_sample_reports.rake +++ b/lib/tasks/generate_sample_reports.rake @@ -1,171 +1,12 @@ #!/usr/bin/env ruby + require 'erb' require 'ostruct' require 'rubygems' require 'active_support/all' require 'YAML' require 'fileutils' - -module Puppet; end -module Puppet::Resource; end -class Puppet::Transaction; end -module Puppet::Util; end - -# http://projects.puppetlabs.com/projects/puppet/wiki/Report_Format_2 -class Puppet::Transaction::Report - attr_accessor :host, :time, :logs, :metrics, :resource_statuses, - :configuration_version, :report_format, :puppet_version, :kind, :status - - def self.generate(options) - Puppet::Transaction::Report.new.tap do |report| - report.host = DataGenerator.generate_hostname - report.time = DataGenerator.generate_time - report.logs = [] - report.metrics = {} - report.resource_statuses = {} - report.configuration_version = Time.now.to_i - report.report_format = 2 - report.puppet_version = "2.6.5" - report.kind = "apply" - - options[:num_statuses].times do - resource_status = DataGenerator.generate_resource_status(report, options) - report.resource_statuses[resource_status.resource] = resource_status - end - - report.status = report.compute_status - end - end - - def compute_status - if resource_statuses.values.any? {|res| res.failed} - "failed" - elsif resource_statuses.values.any? {|res| res.changed} - "changed" - else - "unchanged" - end - end -end -class Puppet::Util::Log - attr_accessor :file, :line, :level, :message, :source, :tags, :time -end -class Puppet::Util::Metric - attr_accessor :name, :label, :values -end -class Puppet::Resource::Status - attr_accessor :resource_type, :title, :resource, :file, :line, - :evaluation_time, :change_count, :out_of_sync_count, :tags, :time, :events, - :out_of_sync, :changed, :skipped, :failed - - def self.generate(report, options) - Puppet::Resource::Status.new.tap do |rs| - rs.resource_type = "File" - rs.title = File.join("/", (1..(rand(5)+2)).map {DataGenerator.generate_word}) - rs.resource = "#{rs.resource_type}[#{rs.title}]" - rs.file = "/etc/puppet/manifests/site.pp" - rs.line = rand(250) + 1 - rs.evaluation_time = Time.now.to_f % 1 + rand(3) - rs.change_count = rand(100) < 80 ? 0 : rand(5)+1 - rs.out_of_sync_count = rs.change_count - rs.tags = ["node", "class", rs.resource_type.downcase, rs.title.downcase, report.host].sort - rs.time = report.time - rs.events = [] - rs.out_of_sync = rs.out_of_sync_count > 0 - rs.changed = rs.change_count > 0 - rs.skipped = false - rs.failed = rs.change_count > 0 && rand(100) < 10 - - options[:num_events].times do - event = DataGenerator.generate_resource_event(rs) - rs.events << event - end - - end - end -end -class Puppet::Transaction::Event - attr_accessor :audited, :property, :previous_value, :desired_value, - :historical_value, :message, :name, :status, :time - - def self.generate(resource_status) - Puppet::Transaction::Event.new.tap do |event| - event.audited = false - event.property = "mode" - event.previous_value = 644 - event.desired_value = 777 - event.historical_value = 666 - event.message = "Updated file mode" - event.name = "mode" - event.status = "success" - event.time = resource_status.time - end - end -end - -module DataGenerator - def self.generate_reports(options) - Puppet::Transaction::Report.generate(options) - end - - def self.generate_resource_event(resource_status) - Puppet::Transaction::Event.generate(resource_status) - end - - def self.generate_resource_status(report, options) - Puppet::Resource::Status.generate(report, options) - end - - def self.generate_hostname - @domain ||= generate_word - @ext ||= ["net", "org", "com", "co.uk"].random_element - - host = @domain - host = generate_word until host != @domain - "#{host}.#{@domain}.#{@ext}" - end - - def self.generate_time - time = Time.now - time -= 1.day if rand(100) < 5 - time - end - - def self.generate_word - words.random_element - end - - def self.words - if @words.nil? - @words = [] - File.open("/usr/share/dict/words").each_line do |line| - @words << line.chomp - end - @words.delete_if {|word| word.length < 6 or word.squeeze != word or word.downcase != word} - end - @words - end -end - -class Array - def random_element(n=nil) - return self[Kernel.rand(size)] if n.nil? - n = n.to_int - rescue Exception => e - raise TypeError, "Coercion error: #{n.inspect}.to_int => Integer failed:\n(#{e.message})" - else - raise TypeError, "Coercion error: #{n}.to_int did NOT return an Integer (was #{n.class})" unless n.kind_of? ::Integer - raise ArgumentError, "negative array size" if n < 0 - n = size if n > size - result = ::Array.new(self) - n.times do |i| - r = i + Kernel.rand(size - i) - result[i], result[r] = result[r], result[i] - end - result[n..size] = [] - result - end -end +require 'data_generator' namespace :reports do namespace :samples do diff --git a/lib/tasks/generate_unresponsive_nodes.rake b/lib/tasks/generate_unresponsive_nodes.rake new file mode 100644 index 0000000..8f84901 --- /dev/null +++ b/lib/tasks/generate_unresponsive_nodes.rake @@ -0,0 +1,12 @@ +require 'data_generator' + +namespace :node do + desc "Generate NUM_NODES unresponsive nodes with random hostnames for testing" + task :generate_unresponsive => :environment do + num_nodes = ENV['NUM_NODES'].to_i || 1 + + num_nodes.times do + Node.create!(:name => DataGenerator.generate_hostname) + end + end +end -- 1.7.4 -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
