From 071ff891cf9b7af243a7a92e49820bc877fcbd1a Mon Sep 17 00:00:00 2001 From: yeikel Date: Sun, 4 Aug 2024 00:50:54 -0400 Subject: [PATCH] feat: add option to overwrite Docker read and open timeout values --- .../lib/dependabot/docker/update_checker.rb | 16 ++++++++- .../dependabot/docker/update_checker_spec.rb | 36 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/docker/lib/dependabot/docker/update_checker.rb b/docker/lib/dependabot/docker/update_checker.rb index 9a53a8d35b..b798d1258b 100644 --- a/docker/lib/dependabot/docker/update_checker.rb +++ b/docker/lib/dependabot/docker/update_checker.rb @@ -300,13 +300,27 @@ def docker_repo_name "library/#{dependency.name}" end + DEFAULT_OPEN_TIMEOUT_IN_SECONDS = 2 + DEFAULT_READ_TIMEOUT_IN_SECONDS = 10 + + class << self + def read_timeout_in_seconds + ENV.fetch("DEPENDABOT_DOCKER_READ_TIMEOUT_IN_SECONDS", DEFAULT_READ_TIMEOUT_IN_SECONDS).to_i + end + + def open_timeout_in_seconds + ENV.fetch("DEPENDABOT_DOCKER_OPEN_TIMEOUT_IN_SECONDS", DEFAULT_OPEN_TIMEOUT_IN_SECONDS).to_i + end + end + def docker_registry_client @docker_registry_client ||= DockerRegistry2::Registry.new( "https://#{registry_hostname}", user: registry_credentials&.fetch("username", nil), password: registry_credentials&.fetch("password", nil), - read_timeout: 10, + read_timeout: :read_timeout_in_seconds, + open_timeout: :open_timeout_in_seconds, http_options: { proxy: ENV.fetch("HTTPS_PROXY", nil) } ) end diff --git a/docker/spec/dependabot/docker/update_checker_spec.rb b/docker/spec/dependabot/docker/update_checker_spec.rb index 755634576d..c3b79c1411 100644 --- a/docker/spec/dependabot/docker/update_checker_spec.rb +++ b/docker/spec/dependabot/docker/update_checker_spec.rb @@ -1433,6 +1433,42 @@ def stub_tag_with_no_digest(tag) end end + describe ".read_timeout_in_seconds" do + context "when DEPENDABOT_DOCKER_READ_TIMEOUT_IN_SECONDS is set" do + it "returns the provided value" do + override_value = 10 + stub_const("ENV", ENV.to_hash.merge("DEPENDABOT_DOCKER_READ_TIMEOUT_IN_SECONDS" => override_value)) + + expect(described_class.send(:read_timeout_in_seconds)).to eq(override_value) + end + end + + context "when ENV does not provide an override" do + it "falls back to a default value" do + expect(described_class.send(:read_timeout_in_seconds)) + .to eq(described_class::DEFAULT_READ_TIMEOUT_IN_SECONDS) + end + end + end + + describe ".open_timeout_in_seconds" do + context "when DEPENDABOT_DOCKER_OPEN_TIMEOUT_IN_SECONDS is set" do + it "returns the provided value" do + override_value = 10 + stub_const("ENV", ENV.to_hash.merge("DEPENDABOT_DOCKER_OPEN_TIMEOUT_IN_SECONDS" => override_value)) + + expect(described_class.send(:open_timeout_in_seconds)).to eq(override_value) + end + end + + context "when ENV does not provide an override" do + it "falls back to a default value" do + expect(described_class.send(:open_timeout_in_seconds)) + .to eq(described_class::DEFAULT_OPEN_TIMEOUT_IN_SECONDS) + end + end + end + private def stub_same_sha_for(*tags)