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.
