Skip to content

Commit 7099f72

Browse files
committed
Add rate limits configuration to info
1 parent cd7bd4e commit 7099f72

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

app/controllers/v3/info_controller.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ def v3_info
1515
info.name = config.get(:info, :name) || ''
1616
info.version = config.get(:info, :version) || 0
1717
info.support_address = config.get(:info, :support_address) || ''
18+
info.request_rate_limiter_enabled = config.get(:rate_limiter, :enabled) || false
19+
info.request_rate_limiter_general_limit = config.get(:rate_limiter, :per_process_general_limit) || ''
20+
info.request_rate_limiter_reset_interval_in_mins = config.get(:rate_limiter, :reset_interval_in_minutes) || ''
1821

1922
osbapi_version_file = Rails.root.join('config/osbapi_version').to_s
2023
if File.exist?(osbapi_version_file)
@@ -37,5 +40,6 @@ def show_usage_summary
3740
end
3841

3942
class Info
40-
attr_accessor :build, :min_cli_version, :min_recommended_cli_version, :custom, :description, :name, :version, :support_address, :osbapi_version
43+
attr_accessor :build, :min_cli_version, :min_recommended_cli_version, :custom, :description, :name, :version, :support_address, :osbapi_version, :request_rate_limiter_enabled,
44+
:request_rate_limiter_general_limit, :request_rate_limiter_reset_interval_in_mins
4145
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)