diff --git a/Gemfile.lock b/Gemfile.lock index b20fa84..9019485 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,9 +1,10 @@ PATH remote: . specs: - entitlements-github-plugin (1.2.4) + entitlements-github-plugin (1.2.5) contracts (~> 0.17.0) faraday (~> 2.0) + faraday-net_http_persistent (~> 2.3) faraday-retry (~> 2.0) octokit (~> 4.25) retryable (~> 3.0, >= 3.0.5) @@ -53,6 +54,9 @@ GEM logger faraday-net_http (3.4.4) net-http (~> 0.5) + faraday-net_http_persistent (2.3.1) + faraday (~> 2.5) + net-http-persistent (>= 4.0.4, < 5) faraday-retry (2.4.0) faraday (~> 2.0) hashdiff (1.2.1) @@ -66,6 +70,8 @@ GEM mutex_m (0.3.0) net-http (0.9.1) uri (>= 0.11.1) + net-http-persistent (4.0.8) + connection_pool (>= 2.2.4, < 4) net-ldap (0.20.0) base64 ostruct diff --git a/entitlements-github-plugin.gemspec b/entitlements-github-plugin.gemspec index 27c1646..203bb79 100644 --- a/entitlements-github-plugin.gemspec +++ b/entitlements-github-plugin.gemspec @@ -18,6 +18,7 @@ Gem::Specification.new do |s| s.add_dependency "contracts", "~> 0.17.0" s.add_dependency "faraday", "~> 2.0" + s.add_dependency "faraday-net_http_persistent", "~> 2.3" s.add_dependency "faraday-retry", "~> 2.0" s.add_dependency "octokit", "~> 4.25" s.add_dependency "retryable", "~> 3.0", ">= 3.0.5" diff --git a/lib/entitlements/backend/github_org/provider.rb b/lib/entitlements/backend/github_org/provider.rb index 7f5de3b..8443f7b 100644 --- a/lib/entitlements/backend/github_org/provider.rb +++ b/lib/entitlements/backend/github_org/provider.rb @@ -104,7 +104,8 @@ def role_name(role_identifier) # Returns an Entitlements::Models::Group object. Contract String => Entitlements::Models::Group def role_to_group(role) - members = github.org_members.keys.select { |username| github.org_members[username] == role } + org_members = github.org_members + members = org_members.select { |_, member_role| member_role == role }.keys Entitlements::Models::Group.new( dn: role_dn(role), members: Set.new(members), diff --git a/lib/entitlements/service/github.rb b/lib/entitlements/service/github.rb index ff75edd..e0e06b2 100644 --- a/lib/entitlements/service/github.rb +++ b/lib/entitlements/service/github.rb @@ -2,6 +2,7 @@ require_relative "../config/retry" +require "faraday/net_http_persistent" require "net/http" require "octokit" require "uri" @@ -169,6 +170,9 @@ def invalidate_org_members_predictive_cache def octokit @octokit ||= begin client = Octokit::Client.new(access_token: token) + middleware = Octokit::Default.middleware.dup + middleware.adapter :net_http_persistent + client.middleware = middleware client.api_endpoint = addr if addr client.auto_paginate = true client.per_page = 100 diff --git a/lib/version.rb b/lib/version.rb index 6908551..0dd6539 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -2,6 +2,6 @@ module Entitlements module Version - VERSION = "1.2.4" + VERSION = "1.2.5" end end diff --git a/spec/unit/entitlements/backend/github_org/provider_spec.rb b/spec/unit/entitlements/backend/github_org/provider_spec.rb index b0e91f3..e5054d6 100644 --- a/spec/unit/entitlements/backend/github_org/provider_spec.rb +++ b/spec/unit/entitlements/backend/github_org/provider_spec.rb @@ -34,7 +34,7 @@ it "pulls the role name from the distinguished name" do allow(subject).to receive(:github).and_return(github) - allow(github).to receive(:org_members).and_return(members_and_roles) + expect(github).to receive(:org_members).once.and_return(members_and_roles) result = subject.read("member") expect(result).to be_a_kind_of(Entitlements::Models::Group) expect(result.member_strings).to eq(member_strings_set) diff --git a/spec/unit/entitlements/service/github_spec.rb b/spec/unit/entitlements/service/github_spec.rb index 69f9d3f..4403a94 100644 --- a/spec/unit/entitlements/service/github_spec.rb +++ b/spec/unit/entitlements/service/github_spec.rb @@ -29,6 +29,15 @@ end end + describe "#octokit" do + it "uses persistent HTTP connections" do + client = subject.send(:octokit) + + expect(client.middleware.adapter.klass).to eq(Faraday::Adapter::NetHttpPersistent) + expect(subject.send(:octokit)).to equal(client) + end + end + describe "#org_members" do let(:members_and_roles) do { diff --git a/vendor/cache/faraday-net_http_persistent-2.3.1.gem b/vendor/cache/faraday-net_http_persistent-2.3.1.gem new file mode 100644 index 0000000..93e23df Binary files /dev/null and b/vendor/cache/faraday-net_http_persistent-2.3.1.gem differ diff --git a/vendor/cache/net-http-persistent-4.0.8.gem b/vendor/cache/net-http-persistent-4.0.8.gem new file mode 100644 index 0000000..ba3a02a Binary files /dev/null and b/vendor/cache/net-http-persistent-4.0.8.gem differ