Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / plugins / mcollective / aggregate / summary.rb
diff --git a/plugins/mcollective/aggregate/summary.rb b/plugins/mcollective/aggregate/summary.rb
new file mode 100644 (file)
index 0000000..10bec51
--- /dev/null
@@ -0,0 +1,53 @@
+module MCollective
+  class Aggregate
+    class Summary<Base
+      # Before function is run processing
+      def startup_hook
+        @result[:value] = {}
+        @result[:type] = :collection
+
+        # set default aggregate_format if it is undefined
+        @aggregate_format = :calculate unless @aggregate_format
+      end
+
+      # Increments the value field if value has been seen before
+      # Else create a new value field
+      def process_result(value, reply)
+        unless value.nil?
+          if value.is_a? Array
+            value.map{|val| add_value(val)}
+          else
+            add_value(value)
+          end
+        end
+      end
+
+      def add_value(value)
+        if @result[:value].keys.include?(value)
+          @result[:value][value] += 1
+        else
+          @result[:value][value] = 1
+        end
+      end
+
+      def summarize
+        if @aggregate_format == :calculate
+          max_key_length = @result[:value].keys.map do |k|
+
+            # Response values retain their types. Here we check
+            # if the response is a string and turn it into a string
+            # if it isn't one.
+            if k.respond_to?(:length)
+              k.length
+            elsif k.respond_to?(:to_s)
+              k.to_s.length
+            end
+          end.max
+          @aggregate_format = "%#{max_key_length}s = %s"
+        end
+
+        super
+      end
+    end
+  end
+end