Skip to content

Commit 497ac82

Browse files
authored
Add rate limits to info end point (#4514)
Add rate limits to /v3/info
1 parent 3c23f7c commit 497ac82

File tree

4 files changed

+93
-13
lines changed

4 files changed

+93
-13
lines changed

app/controllers/v3/info_controller.rb

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,7 @@
55
class InfoController < ApplicationController
66
def v3_info
77
info = Info.new
8-
config = VCAP::CloudController::Config.config
9-
10-
info.build = config.get(:info, :build) || ''
11-
info.min_cli_version = config.get(:info, :min_cli_version) || ''
12-
info.min_recommended_cli_version = config.get(:info, :min_recommended_cli_version) || ''
13-
info.custom = config.get(:info, :custom) || {}
14-
info.description = config.get(:info, :description) || ''
15-
info.name = config.get(:info, :name) || ''
16-
info.version = config.get(:info, :version) || 0
17-
info.support_address = config.get(:info, :support_address) || ''
18-
8+
populate_info_fields(info)
199
osbapi_version_file = Rails.root.join('config/osbapi_version').to_s
2010
if File.exist?(osbapi_version_file)
2111
info.osbapi_version = File.read(osbapi_version_file).strip
@@ -34,8 +24,27 @@ def show_usage_summary
3424

3525
render status: :ok, json: VCAP::CloudController::Presenters::V3::InfoUsageSummaryPresenter.new(summary)
3626
end
27+
28+
private
29+
30+
def populate_info_fields(info)
31+
config = VCAP::CloudController::Config.config
32+
33+
info.build = config.get(:info, :build) || ''
34+
info.min_cli_version = config.get(:info, :min_cli_version) || ''
35+
info.min_recommended_cli_version = config.get(:info, :min_recommended_cli_version) || ''
36+
info.custom = config.get(:info, :custom) || {}
37+
info.description = config.get(:info, :description) || ''
38+
info.name = config.get(:info, :name) || ''
39+
info.version = config.get(:info, :version) || 0
40+
info.support_address = config.get(:info, :support_address) || ''
41+
info.request_rate_limiter_enabled = config.get(:rate_limiter, :enabled) || false
42+
info.request_rate_limiter_general_limit = config.get(:rate_limiter, :per_process_general_limit) || ''
43+
info.request_rate_limiter_reset_interval_in_mins = config.get(:rate_limiter, :reset_interval_in_minutes) || ''
44+
end
3745
end
3846

3947
class Info
40-
attr_accessor :build, :min_cli_version, :min_recommended_cli_version, :custom, :description, :name, :version, :support_address, :osbapi_version
48+
attr_accessor :build, :min_cli_version, :min_recommended_cli_version, :custom, :description, :name, :version, :support_address, :osbapi_version, :request_rate_limiter_enabled,
49+
:request_rate_limiter_general_limit, :request_rate_limiter_reset_interval_in_mins
4150
end

app/presenters/v3/info_presenter.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ def to_hash
1616
name: info.name,
1717
version: info.version,
1818
osbapi_version: info.osbapi_version,
19+
rate_limits: {
20+
enabled: info.request_rate_limiter_enabled,
21+
general_limit: info.request_rate_limiter_general_limit,
22+
reset_interval_in_minutes: info.request_rate_limiter_reset_interval_in_mins
23+
},
1924
links: {
2025
self: { href: build_self },
2126
support: { href: info.support_address }

docs/v3/source/includes/api_resources/_info.erb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
"name": "Cloud Foundry",
1313
"version": 123,
1414
"osbapi_version": "2.15",
15+
"rate_limits": {
16+
"enabled": true,
17+
"general_limit": 2000,
18+
"reset_interval_in_minutes": 30
19+
},
1520
"links": {
1621
"self": { "href": "http://api.example.com/v3/info" } ,
1722
"support": { "href": "http://support.example.com" }
@@ -31,6 +36,11 @@
3136
"name": "",
3237
"version": 0,
3338
"osbapi_version": "",
39+
"rate_limits": {
40+
"enabled": false,
41+
"general_limit": 2000,
42+
"reset_interval_in_minutes": 30
43+
},
3444
"links": {
3545
"self": { "href": "http://api.example.com/v3/info" } ,
3646
"support": { "href": "" }

spec/request/info_spec.rb

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
name: TestConfig.config[:info][:name],
1616
version: TestConfig.config[:info][:version],
1717
osbapi_version: TestConfig.config[:info][:osbapi_version],
18+
rate_limits: {
19+
enabled: TestConfig.config[:rate_limiter][:enabled],
20+
general_limit: TestConfig.config[:rate_limiter][:per_process_general_limit],
21+
reset_interval_in_minutes: TestConfig.config[:rate_limiter][:reset_interval_in_minutes]
22+
},
1823
links: {
1924
self: { href: "#{link_prefix}/v3/info" },
2025
support: { href: TestConfig.config[:info][:support_address] }
@@ -48,6 +53,11 @@
4853
name: '',
4954
version: 0,
5055
osbapi_version: '',
56+
rate_limits: {
57+
enabled: false,
58+
general_limit: '',
59+
reset_interval_in_minutes: ''
60+
},
5161
links: {
5262
self: { href: "#{link_prefix}/v3/info" },
5363
support: { href: '' }
@@ -56,7 +66,7 @@
5666
end
5767

5868
before do
59-
TestConfig.override(info: nil)
69+
TestConfig.override(info: nil, rate_limiter: nil)
6070
allow(File).to receive(:exist?).with(Rails.root.join('config/osbapi_version').to_s).and_return(false)
6171
end
6272

@@ -65,6 +75,52 @@
6575
expect(Oj.load(last_response.body)).to match_json_response(return_info_json)
6676
end
6777
end
78+
79+
context 'when rate limiter is enabled' do
80+
let(:user) { make_user }
81+
let(:user_headers) { headers_for(user, email: '[email protected]', user_name: 'Mr. Freeze') }
82+
83+
before do
84+
TestConfig.override(
85+
rate_limiter: {
86+
enabled: true,
87+
per_process_general_limit: 1000,
88+
global_general_limit: 2000,
89+
reset_interval_in_minutes: 15
90+
}
91+
)
92+
end
93+
94+
it 'includes rate limiter configuration' do
95+
get '/v3/info', nil, user_headers
96+
response_json = Oj.load(last_response.body)
97+
98+
expect(response_json['rate_limits']['enabled']).to be true
99+
expect(response_json['rate_limits']['general_limit']).to eq(1000)
100+
expect(response_json['rate_limits']['reset_interval_in_minutes']).to eq(15)
101+
end
102+
end
103+
104+
context 'when rate limiter is disabled' do
105+
before do
106+
TestConfig.override(
107+
rate_limiter: {
108+
enabled: false,
109+
per_process_general_limit: 0,
110+
reset_interval_in_minutes: 0
111+
}
112+
)
113+
end
114+
115+
it 'includes disabled rate limiter configuration' do
116+
get '/v3/info'
117+
response_json = Oj.load(last_response.body)
118+
119+
expect(response_json['rate_limits']['enabled']).to be false
120+
expect(response_json['rate_limits']['general_limit']).to eq(0)
121+
expect(response_json['rate_limits']['reset_interval_in_minutes']).to eq(0)
122+
end
123+
end
68124
end
69125

70126
describe 'GET /v3/info/usage_summary' do

0 commit comments

Comments
 (0)