On 18 October 2010 23:45, Rein Henrichs <[email protected]> wrote:
> Parses `/usr/sbin/xm list` and returns a comma-separated list of
> domains. Based on a patch submitted by Jonas Genannt.


Looks good - is the output of xm list consistent across all known
releases of xen?

Paul
> ---
>
>  Jonas,
>
>  Thanks for sending us your patch. I've made a few minor changes but kept the
>  behavior mostly the same.
>
>  I've modified the implementation to use Resolution.exec instead of %x{} and
>  I've modified the spec to stub its call. I've also added a spec for the case
>  when /usr/sbin/xm isn't available that states that it should return nil. This
>  is a change in design but will have end-user behavior equivalent to the
>  previous behavior of returning "".
>
>  I've split the string returned by Resolution.exec on "\n" to give an array of
>  lines because String#each has been removed in Ruby 1.9.
>
>  I've also refactored the implementation of get_domains to make use of the
>  map/reduce-like functionality of Ruby's #reject and #map.
>
>  lib/facter/util/xendomains.rb |   10 ++++++++++
>  lib/facter/xendomains.rb      |   10 ++++++++++
>  spec/unit/data/xendomains     |    4 ++++
>  spec/unit/util/xendomains.rb  |   23 +++++++++++++++++++++++
>  4 files changed, 47 insertions(+), 0 deletions(-)
>  create mode 100644 lib/facter/util/xendomains.rb
>  create mode 100644 lib/facter/xendomains.rb
>  create mode 100644 spec/unit/data/xendomains
>  create mode 100644 spec/unit/util/xendomains.rb
>
> diff --git a/lib/facter/util/xendomains.rb b/lib/facter/util/xendomains.rb
> new file mode 100644
> index 0000000..4f590a8
> --- /dev/null
> +++ b/lib/facter/util/xendomains.rb
> @@ -0,0 +1,10 @@
> +# A module to gather running Xen Domains
> +#
> +module Facter::Util::Xendomains
> +  def self.get_domains
> +    if xm_list = Facter::Util::Resolution.exec('/usr/sbin/xm list')
> +      domains = xm_list.split("\n").reject { |line| line =~ 
> /^(Name|Domain-0)/ }
> +      domains.map { |line| line.split(/\s/)[0] }.join(',')
> +    end
> +  end
> +end
> diff --git a/lib/facter/xendomains.rb b/lib/facter/xendomains.rb
> new file mode 100644
> index 0000000..972ac90
> --- /dev/null
> +++ b/lib/facter/xendomains.rb
> @@ -0,0 +1,10 @@
> +require 'facter/util/xendomains'
> +
> +Facter.add("xendomains") do
> +  confine :kernel => %w{Linux FreeBSD OpenBSD SunOS}
> +  confine :virtual => 'xen0'
> +
> +  setcode do
> +    Facter::Util::Xendomains.get_domains
> +  end
> +end
> diff --git a/spec/unit/data/xendomains b/spec/unit/data/xendomains
> new file mode 100644
> index 0000000..9b112bc
> --- /dev/null
> +++ b/spec/unit/data/xendomains
> @@ -0,0 +1,4 @@
> +Name                                        ID   Mem VCPUs      State   
> Time(s)
> +Domain-0                                     0   656     4     r-----  
> 48140.9
> +web01                                       48   512     2     -b----  
> 97651.5
> +mailserver                                  53   512     4     -b----   
> 7536.1
> diff --git a/spec/unit/util/xendomains.rb b/spec/unit/util/xendomains.rb
> new file mode 100644
> index 0000000..a0fa345
> --- /dev/null
> +++ b/spec/unit/util/xendomains.rb
> @@ -0,0 +1,23 @@
> +#!/usr/bin/env ruby
> +
> +require File.dirname(__FILE__) + '/../../spec_helper'
> +
> +require 'facter/util/xendomains'
> +
> +describe Facter::Util::Xendomains do
> +  describe ".get_domains" do
> +    it "should return a list of running Xen Domains on Xen0" do
> +      sample_output_file = File.dirname(__FILE__) + '/../data/xendomains'
> +      xen0_domains = File.read(sample_output_file)
> +      Facter::Util::Resolution.stubs(:exec).with('/usr/sbin/xm 
> list').returns(xen0_domains)
> +      Facter::Util::Xendomains.get_domains.should == %{web01,mailserver}
> +    end
> +
> +    context "when xm list isn't executable" do
> +      it "should be nil" do
> +        Facter::Util::Resolution.stubs(:exec).with('/usr/sbin/xm 
> list').returns(nil)
> +        Facter::Util::Xendomains.get_domains.should == nil
> +      end
> +    end
> +  end
> +end
> --
> 1.7.0.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.
>
>

-- 
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.

Reply via email to