+1 On Mon, Dec 14, 2009 at 12:01 PM, Jesse Wolfe <[email protected]> wrote: > Disables the b64_zlib_yaml format if zlib cannot be loaded. > > I've added a --no-zlib to make it possible to test this on a single > machine, but it might also be useful if someone finds themselves failing > to connect to a server that doesn't have zlib installed. > > FactHandler' format is still hard-coded to YAML rather than using > facts.class.default_format > > Signed-off-by: Jesse Wolfe <[email protected]> > --- > lib/puppet/configurer/fact_handler.rb | 9 ++++++--- > lib/puppet/defaults.rb | 5 ++++- > lib/puppet/feature/zlib.rb | 6 ++++++ > lib/puppet/network/formats.rb | 23 +++++++++++++++++++---- > spec/unit/configurer/fact_handler.rb | 16 +++++++++++++++- > spec/unit/network/formats.rb | 31 +++++++++++++++++++++++++++++++ > 6 files changed, 81 insertions(+), 9 deletions(-) > create mode 100644 lib/puppet/feature/zlib.rb > > diff --git a/lib/puppet/configurer/fact_handler.rb > b/lib/puppet/configurer/fact_handler.rb > index cbb6276..40e79b6 100644 > --- a/lib/puppet/configurer/fact_handler.rb > +++ b/lib/puppet/configurer/fact_handler.rb > @@ -27,12 +27,15 @@ module Puppet::Configurer::FactHandler > facts = find_facts > #format = facts.class.default_format > > - # Hard-code yaml, because I couldn't get marshal to work. > - format = :b64_zlib_yaml > + if facts.support_format?(:b64_zlib_yaml) > + format = :b64_zlib_yaml > + else > + format = :yaml > + end > > text = facts.render(format) > > - return {:facts_format => :b64_zlib_yaml, :facts => CGI.escape(text)} > + return {:facts_format => format, :facts => CGI.escape(text)} > end > > # Retrieve facts from the central server. > diff --git a/lib/puppet/defaults.rb b/lib/puppet/defaults.rb > index f128e60..616eed6 100644 > --- a/lib/puppet/defaults.rb > +++ b/lib/puppet/defaults.rb > @@ -192,7 +192,10 @@ module Puppet > :config_version => ["", "How to determine the configuration version. > By default, it will be the > time that the configuration is parsed, but you can provide a > shell script to override how the > version is determined. The output of this script will be added > to every log message in the > - reports, allowing you to correlate changes on your hosts to the > source version on the server."] > + reports, allowing you to correlate changes on your hosts to the > source version on the server."], > + :zlib => [true, > + "Boolean; whether to use the zlib library", > + ] > ) > > hostname = Facter["hostname"].value > diff --git a/lib/puppet/feature/zlib.rb b/lib/puppet/feature/zlib.rb > new file mode 100644 > index 0000000..ddd65b2 > --- /dev/null > +++ b/lib/puppet/feature/zlib.rb > @@ -0,0 +1,6 @@ > +require 'puppet/util/feature' > + > +# We want this to load if possible, but it's not automatically > +# required. > +Puppet.features.rubygems? > +Puppet.features.add(:zlib, :libs => %{zlib}) > diff --git a/lib/puppet/network/formats.rb b/lib/puppet/network/formats.rb > index 010c235..a98dcbc 100644 > --- a/lib/puppet/network/formats.rb > +++ b/lib/puppet/network/formats.rb > @@ -44,7 +44,18 @@ end > # This format combines a yaml serialization, then zlib compression and > base64 encoding. > Puppet::Network::FormatHandler.create(:b64_zlib_yaml, :mime => > "text/b64_zlib_yaml") do > require 'base64' > - require 'zlib' > + > + def use_zlib? > + Puppet.features.zlib? && Puppet[:zlib] > + end > + > + def requiring_zlib > + if use_zlib? > + yield > + else > + raise Puppet::Error, "the zlib library is not installed or is > disabled." > + end > + end > > def intern(klass, text) > decode(text) > @@ -70,7 +81,7 @@ Puppet::Network::FormatHandler.create(:b64_zlib_yaml, :mime > => "text/b64_zlib_ya > > # Because of yaml issue in ruby 1.8.1... > def supported?(klass) > - RUBY_VERSION != '1.8.1' > + RUBY_VERSION != '1.8.1' and use_zlib? > end > > # fixup invalid yaml as per: > @@ -81,11 +92,15 @@ Puppet::Network::FormatHandler.create(:b64_zlib_yaml, > :mime => "text/b64_zlib_ya > end > > def encode(text) > - Base64.encode64(Zlib::Deflate.deflate(text, Zlib::BEST_COMPRESSION)) > + requiring_zlib do > + Base64.encode64(Zlib::Deflate.deflate(text, > Zlib::BEST_COMPRESSION)) > + end > end > > def decode(yaml) > - YAML.load(Zlib::Inflate.inflate(Base64.decode64(yaml))) > + requiring_zlib do > + YAML.load(Zlib::Inflate.inflate(Base64.decode64(yaml))) > + end > end > end > > diff --git a/spec/unit/configurer/fact_handler.rb > b/spec/unit/configurer/fact_handler.rb > index ec60c6d..290f1ac 100755 > --- a/spec/unit/configurer/fact_handler.rb > +++ b/spec/unit/configurer/fact_handler.rb > @@ -97,6 +97,7 @@ describe Puppet::Configurer::FactHandler do > # I couldn't get marshal to work for this, only yaml, so we hard-code > yaml. > it "should serialize and CGI escape the fact values for uploading" do > facts = stub 'facts' > + facts.expects(:support_format?).with(:b64_zlib_yaml).returns true > facts.expects(:render).returns "my text" > text = CGI.escape("my text") > > @@ -107,6 +108,7 @@ describe Puppet::Configurer::FactHandler do > > it "should properly accept facts containing a '+'" do > facts = stub 'facts' > + facts.expects(:support_format?).with(:b64_zlib_yaml).returns true > facts.expects(:render).returns "my+text" > text = "my%2Btext" > > @@ -115,8 +117,9 @@ describe Puppet::Configurer::FactHandler do > @facthandler.facts_for_uploading.should == {:facts_format => > :b64_zlib_yaml, :facts => text} > end > > - it "should hard-code yaml as the serialization" do > + it "use compressed yaml as the serialization if zlib is supported" do > facts = stub 'facts' > + facts.expects(:support_format?).with(:b64_zlib_yaml).returns true > facts.expects(:render).with(:b64_zlib_yaml).returns "my text" > text = CGI.escape("my text") > > @@ -125,6 +128,17 @@ describe Puppet::Configurer::FactHandler do > @facthandler.facts_for_uploading > end > > + it "should use yaml as the serialization if zlib is not supported" do > + facts = stub 'facts' > + facts.expects(:support_format?).with(:b64_zlib_yaml).returns false > + facts.expects(:render).with(:yaml).returns "my text" > + text = CGI.escape("my text") > + > + �[email protected](:find_facts).returns facts > + > + �[email protected]_for_uploading > + end > + > describe "when reloading Facter" do > before do > Facter.stubs(:clear) > diff --git a/spec/unit/network/formats.rb b/spec/unit/network/formats.rb > index b1ef9ec..a241306 100755 > --- a/spec/unit/network/formats.rb > +++ b/spec/unit/network/formats.rb > @@ -91,6 +91,9 @@ describe "Puppet Network Format" do > end > > describe "base64 compressed yaml" do > + yaml = Puppet::Network::FormatHandler.format(:b64_zlib_yaml) > + confine "We must have zlib" => Puppet.features.zlib? > + > before do > @yaml = Puppet::Network::FormatHandler.format(:b64_zlib_yaml) > end > @@ -173,6 +176,34 @@ describe "Puppet Network Format" do > it "should fixup incorrect yaml to correct" do > @yaml.fixup("&id004 !ruby/object:Puppet::Relationship ?").should > == "? &id004 !ruby/object:Puppet::Relationship" > end > + > + describe "when zlib is disabled" do > + before do > + Puppet[:zlib] = false > + end > + > + it "use_zlib? should return false" do > + �[email protected]_zlib?.should == false > + end > + > + it "should refuse to encode" do > + lambda{ @yaml.encode("foo") }.should raise_error > + end > + > + it "should refuse to decode" do > + lambda{ @yaml.decode("foo") }.should raise_error > + end > + end > + > + describe "when zlib is not installed" do > + it "use_zlib? should return false" do > + Puppet[:zlib] = true > + Puppet.features.expects(:zlib?).returns(false) > + > + �[email protected]_zlib?.should == false > + end > + end > + > end > > it "should include a marshal format" do > -- > 1.6.5 > > -- > > 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.
