Please review pull request #364: (#11961) Apply and catch a timeout when contacting PyPI over XMLRPC opened by (domcleal)

Description:

Apply a 10 second timeout to XMLRPC calls to PyPI and catch them, reporting an error gracefully.

  • Opened: Sat Jan 21 18:06:51 UTC 2012
  • Based on: puppetlabs:2.7.x (470a6646b4faa34874ab853355730dc0471b1246)
  • Requested merge: domcleal:tickets/2.7.x/11961 (5f5e103d4aa88a2e9f2b95328155db82ff780779)

Diff follows:

diff --git a/lib/puppet/provider/package/pip.rb b/lib/puppet/provider/package/pip.rb
index 5f6806e..b6b6089 100644
--- a/lib/puppet/provider/package/pip.rb
+++ b/lib/puppet/provider/package/pip.rb
@@ -50,8 +50,11 @@ def query
   def latest
     client = XMLRPC::Client.new2("http://pypi.python.org/pypi")
     client.http_header_extra = {"Content-Type" => "text/xml"}
+    client.timeout = 10
     result = client.call("package_releases", @resource[:name])
     result.first
+  rescue Timeout::Error => detail
+    raise Puppet::Error, "Timeout while contacting pypi.python.org: #{detail}";
   end
 
   # Install a package.  The ensure parameter may specify installed,
diff --git a/spec/unit/provider/package/pip_spec.rb b/spec/unit/provider/package/pip_spec.rb
index 7849ec4..2de0eb4 100755
--- a/spec/unit/provider/package/pip_spec.rb
+++ b/spec/unit/provider/package/pip_spec.rb
@@ -8,10 +8,10 @@
   before do
     @resource = Puppet::Resource.new(:package, "fake_package")
     @provider = provider_class.new(@resource)
-    client = stub_everything('client')
-    client.stubs(:call).with('package_releases', 'real_package').returns(["1.3", "1.2.5", "1.2.4"])
-    client.stubs(:call).with('package_releases', 'fake_package').returns([])
-    XMLRPC::Client.stubs(:new2).returns(client)
+    @client = stub_everything('client')
+    @client.stubs(:call).with('package_releases', 'real_package').returns(["1.3", "1.2.5", "1.2.4"])
+    @client.stubs(:call).with('package_releases', 'fake_package').returns([])
+    XMLRPC::Client.stubs(:new2).returns(@client)
   end
 
   describe "parse" do
@@ -86,6 +86,12 @@
       @provider.latest.should == nil
     end
 
+    it "should handle a timeout gracefully" do
+      @resource[:name] = "fake_package"
+      @client.stubs(:call).raises(Timeout::Error)
+      lambda { @provider.latest }.should raise_error(Puppet::Error)
+    end
+
   end
 
   describe "install" do

    

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