ibm_cloud_sdk_core 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9807ace911b05d47e8d13b72e7623c1ed2a68693cebec40f3d68f2f7d3e437ae
|
4
|
+
data.tar.gz: db29d041a1ab924b050e357ed6dfc64ed9f806a231fc82d4f48fc8342103adfe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7cd90962533f73d125c1ca06346fe4e49d775c43ef1a0b3cce2a974c389942b793301e98b4be532eaf3e566c2ef7f5737127c865736e322ac2a4f1fa2be92765
|
7
|
+
data.tar.gz: c271ba5ee551a6121af1f4c4a68b9c2a14ca91f5839cd15ed370b004836b1891fe75a67aed8caa9b4182c5c0bf7ff29024fcd105f6a5f3f688b34e7973dcf9e4
|
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
[![Build Status](https://travis-ci.com/IBM/ruby-sdk-core.svg?branch=master)](https://travis-ci.com/IBM/ruby-sdk-core)
|
2
2
|
[![codecov](https://codecov.io/gh/IBM/ruby-sdk-core/branch/master/graph/badge.svg)](https://codecov.io/gh/IBM/ruby-sdk-core)
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/ibm_cloud_sdk_core.svg)](https://rubygems.org/gems/ibm_cloud_sdk_core)
|
4
4
|
|
5
5
|
# ruby-sdk-core
|
6
|
-
This project contains the core functionality used by Ruby SDK's generated by the
|
6
|
+
This project contains the core functionality used by Ruby SDK's generated by the
|
7
|
+
[IBM OpenAPI SDK Generator](https://github.ibm.com/CloudEngineering/openapi-sdkgen).
|
7
8
|
Ruby code generated by openapi-sdkgen will depend on the function contained in this project.
|
8
9
|
|
9
10
|
## Installation
|
@@ -32,4 +33,4 @@ Find more open source projects on the [IBM Github Page](http://github.com/IBM)
|
|
32
33
|
## License
|
33
34
|
|
34
35
|
This library is licensed under Apache 2.0. Full license text is
|
35
|
-
available in [LICENSE](LICENSE).
|
36
|
+
available in [LICENSE](LICENSE).
|
@@ -28,6 +28,8 @@ module IBMCloudSdkCore
|
|
28
28
|
iam_apikey: nil,
|
29
29
|
iam_access_token: nil,
|
30
30
|
iam_url: nil,
|
31
|
+
iam_client_id: nil,
|
32
|
+
iam_client_secret: nil,
|
31
33
|
display_name: nil
|
32
34
|
}
|
33
35
|
vars = defaults.merge(vars)
|
@@ -42,7 +44,9 @@ module IBMCloudSdkCore
|
|
42
44
|
@display_name = vars[:display_name]
|
43
45
|
|
44
46
|
if (!vars[:iam_access_token].nil? || !vars[:iam_apikey].nil?) && !@icp_prefix
|
45
|
-
set_token_manager(iam_apikey: vars[:iam_apikey], iam_access_token: vars[:iam_access_token],
|
47
|
+
set_token_manager(iam_apikey: vars[:iam_apikey], iam_access_token: vars[:iam_access_token],
|
48
|
+
iam_url: vars[:iam_url], iam_client_id: vars[:iam_client_id],
|
49
|
+
iam_client_secret: vars[:iam_client_secret])
|
46
50
|
elsif !vars[:iam_apikey].nil? && @icp_prefix
|
47
51
|
@username = "apikey"
|
48
52
|
@password = vars[:iam_apikey]
|
@@ -244,11 +248,16 @@ module IBMCloudSdkCore
|
|
244
248
|
return str.start_with?("{", "\"") || str.end_with?("}", "\"") unless str.nil?
|
245
249
|
end
|
246
250
|
|
247
|
-
def set_token_manager(iam_apikey: nil, iam_access_token: nil, iam_url: nil
|
251
|
+
def set_token_manager(iam_apikey: nil, iam_access_token: nil, iam_url: nil,
|
252
|
+
iam_client_id: nil, iam_client_secret: nil)
|
248
253
|
@iam_apikey = iam_apikey
|
249
254
|
@iam_access_token = iam_access_token
|
250
255
|
@iam_url = iam_url
|
251
|
-
@
|
256
|
+
@iam_client_id = iam_client_id
|
257
|
+
@iam_client_secret = iam_client_secret
|
258
|
+
@token_manager =
|
259
|
+
IAMTokenManager.new(iam_apikey: iam_apikey, iam_access_token: iam_access_token,
|
260
|
+
iam_url: iam_url, iam_client_id: iam_client_id, iam_client_secret: iam_client_secret)
|
252
261
|
end
|
253
262
|
|
254
263
|
def add_timeout(timeout)
|
@@ -8,16 +8,19 @@ require_relative("./version.rb")
|
|
8
8
|
module IBMCloudSdkCore
|
9
9
|
# Class to manage IAM Token Authentication
|
10
10
|
class IAMTokenManager
|
11
|
-
DEFAULT_IAM_URL = "https://iam.
|
11
|
+
DEFAULT_IAM_URL = "https://iam.cloud.ibm.com/identity/token"
|
12
12
|
CONTENT_TYPE = "application/x-www-form-urlencoded"
|
13
13
|
ACCEPT = "application/json"
|
14
14
|
DEFAULT_AUTHORIZATION = "Basic Yng6Yng="
|
15
|
+
DEFAULT_CLIENT_ID = "bx"
|
16
|
+
DEFAULT_CLIENT_SECRET = "bx"
|
15
17
|
REQUEST_TOKEN_GRANT_TYPE = "urn:ibm:params:oauth:grant-type:apikey"
|
16
18
|
REQUEST_TOKEN_RESPONSE_TYPE = "cloud_iam"
|
17
19
|
REFRESH_TOKEN_GRANT_TYPE = "refresh_token"
|
18
20
|
|
19
21
|
attr_accessor :token_info, :user_access_token
|
20
|
-
def initialize(iam_apikey: nil, iam_access_token: nil, iam_url: nil
|
22
|
+
def initialize(iam_apikey: nil, iam_access_token: nil, iam_url: nil,
|
23
|
+
iam_client_id: nil, iam_client_secret: nil)
|
21
24
|
@iam_apikey = iam_apikey
|
22
25
|
@user_access_token = iam_access_token
|
23
26
|
@iam_url = iam_url.nil? ? DEFAULT_IAM_URL : iam_url
|
@@ -28,12 +31,22 @@ module IBMCloudSdkCore
|
|
28
31
|
"expires_in" => nil,
|
29
32
|
"expiration" => nil
|
30
33
|
}
|
34
|
+
# Both the client id and secret should be provided or neither should be provided.
|
35
|
+
if !iam_client_id.nil? && !iam_client_secret.nil?
|
36
|
+
@iam_client_id = iam_client_id
|
37
|
+
@iam_client_secret = iam_client_secret
|
38
|
+
elsif iam_client_id.nil? && iam_client_secret.nil?
|
39
|
+
@iam_client_id = DEFAULT_CLIENT_ID
|
40
|
+
@iam_client_secret = DEFAULT_CLIENT_SECRET
|
41
|
+
else
|
42
|
+
raise ArgumentError.new("Only one of 'iam_client_id' or 'iam_client_secret' were specified, but both parameters should be specified together.")
|
43
|
+
end
|
31
44
|
end
|
32
45
|
|
33
46
|
def request(method:, url:, headers: nil, params: nil, data: nil)
|
34
47
|
response = nil
|
35
48
|
if headers.key?("Content-Type") && headers["Content-Type"] == CONTENT_TYPE
|
36
|
-
response = HTTP.request(
|
49
|
+
response = HTTP.basic_auth(user: @iam_client_id, pass: @iam_client_secret).request(
|
37
50
|
method,
|
38
51
|
url,
|
39
52
|
body: HTTP::URI.form_encode(data),
|
@@ -78,7 +91,6 @@ module IBMCloudSdkCore
|
|
78
91
|
def request_token
|
79
92
|
headers = {
|
80
93
|
"Content-Type" => CONTENT_TYPE,
|
81
|
-
"Authorization" => DEFAULT_AUTHORIZATION,
|
82
94
|
"Accept" => ACCEPT
|
83
95
|
}
|
84
96
|
data = {
|
@@ -99,7 +111,6 @@ module IBMCloudSdkCore
|
|
99
111
|
def refresh_token
|
100
112
|
headers = {
|
101
113
|
"Content-Type" => CONTENT_TYPE,
|
102
|
-
"Authorization" => DEFAULT_AUTHORIZATION,
|
103
114
|
"accept" => ACCEPT
|
104
115
|
}
|
105
116
|
data = {
|
@@ -220,7 +220,7 @@ class BaseServiceTest < Minitest::Test
|
|
220
220
|
headers = {
|
221
221
|
"Content-Type" => "application/json"
|
222
222
|
}
|
223
|
-
stub_request(:post, "https://iam.
|
223
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
224
224
|
.with(
|
225
225
|
body: {
|
226
226
|
"apikey" => "xyz",
|
@@ -232,7 +232,7 @@ class BaseServiceTest < Minitest::Test
|
|
232
232
|
"Authorization" => "Basic Yng6Yng=",
|
233
233
|
"Connection" => "close",
|
234
234
|
"Content-Type" => "application/x-www-form-urlencoded",
|
235
|
-
"Host" => "iam.
|
235
|
+
"Host" => "iam.cloud.ibm.com",
|
236
236
|
"User-Agent" => "http.rb/4.1.1"
|
237
237
|
}
|
238
238
|
).to_return(status: 200, body: token_response.to_json, headers: {})
|
@@ -269,7 +269,7 @@ class BaseServiceTest < Minitest::Test
|
|
269
269
|
headers = {
|
270
270
|
"Content-Type" => "application/json"
|
271
271
|
}
|
272
|
-
stub_request(:post, "https://iam.
|
272
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
273
273
|
.with(
|
274
274
|
body: {
|
275
275
|
"apikey" => "xyz",
|
@@ -281,7 +281,7 @@ class BaseServiceTest < Minitest::Test
|
|
281
281
|
"Authorization" => "Basic Yng6Yng=",
|
282
282
|
"Connection" => "close",
|
283
283
|
"Content-Type" => "application/x-www-form-urlencoded",
|
284
|
-
"Host" => "iam.
|
284
|
+
"Host" => "iam.cloud.ibm.com",
|
285
285
|
"User-Agent" => "http.rb/4.1.1"
|
286
286
|
}
|
287
287
|
).to_return(status: 200, body: token_response.to_json, headers: {})
|
@@ -8,7 +8,6 @@ WebMock.disable_net_connect!(allow_localhost: true)
|
|
8
8
|
# Unit tests for the IAM Token Manager
|
9
9
|
class IAMTokenManagerTest < Minitest::Test
|
10
10
|
def test_request_token
|
11
|
-
iam_url = "https://iam.bluemix.net/identity/token"
|
12
11
|
response = {
|
13
12
|
"access_token" => "oAeisG8yqPY7sFR_x66Z15",
|
14
13
|
"token_type" => "Bearer",
|
@@ -17,19 +16,19 @@ class IAMTokenManagerTest < Minitest::Test
|
|
17
16
|
"refresh_token" => "jy4gl91BQ"
|
18
17
|
}
|
19
18
|
|
19
|
+
# Use default iam_url, client id/secret
|
20
20
|
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
21
21
|
iam_apikey: "iam_apikey",
|
22
|
-
iam_access_token: "iam_access_token"
|
23
|
-
iam_url: iam_url
|
22
|
+
iam_access_token: "iam_access_token"
|
24
23
|
)
|
25
|
-
stub_request(:post, "https://iam.
|
24
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
26
25
|
.with(
|
27
26
|
body: { "apikey" => "iam_apikey", "grant_type" => "urn:ibm:params:oauth:grant-type:apikey", "response_type" => "cloud_iam" },
|
28
27
|
headers: {
|
29
28
|
"Accept" => "application/json",
|
30
29
|
"Authorization" => "Basic Yng6Yng=",
|
31
30
|
"Content-Type" => "application/x-www-form-urlencoded",
|
32
|
-
"Host" => "iam.
|
31
|
+
"Host" => "iam.cloud.ibm.com"
|
33
32
|
}
|
34
33
|
).to_return(status: 200, body: response.to_json, headers: {})
|
35
34
|
token_response = token_manager.send(:request_token)
|
@@ -63,24 +62,22 @@ class IAMTokenManagerTest < Minitest::Test
|
|
63
62
|
end
|
64
63
|
|
65
64
|
def test_request_token_fails_catch_exception
|
66
|
-
iam_url = "https://iam.bluemix.net/identity/token"
|
67
65
|
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
68
66
|
iam_apikey: "iam_apikey",
|
69
|
-
iam_access_token: "iam_access_token"
|
70
|
-
iam_url: iam_url
|
67
|
+
iam_access_token: "iam_access_token"
|
71
68
|
)
|
72
69
|
response = {
|
73
70
|
"code" => "500",
|
74
71
|
"error" => "Oh no"
|
75
72
|
}
|
76
|
-
stub_request(:post, "https://iam.
|
73
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
77
74
|
.with(
|
78
75
|
body: { "apikey" => "iam_apikey", "grant_type" => "urn:ibm:params:oauth:grant-type:apikey", "response_type" => "cloud_iam" },
|
79
76
|
headers: {
|
80
77
|
"Accept" => "application/json",
|
81
78
|
"Authorization" => "Basic Yng6Yng=",
|
82
79
|
"Content-Type" => "application/x-www-form-urlencoded",
|
83
|
-
"Host" => "iam.
|
80
|
+
"Host" => "iam.cloud.ibm.com"
|
84
81
|
}
|
85
82
|
).to_return(status: 401, body: response.to_json, headers: {})
|
86
83
|
begin
|
@@ -91,7 +88,7 @@ class IAMTokenManagerTest < Minitest::Test
|
|
91
88
|
end
|
92
89
|
|
93
90
|
def test_refresh_token
|
94
|
-
iam_url = "https://iam.
|
91
|
+
iam_url = "https://iam.cloud.ibm.com/identity/token"
|
95
92
|
response = {
|
96
93
|
"access_token" => "oAeisG8yqPY7sFR_x66Z15",
|
97
94
|
"token_type" => "Bearer",
|
@@ -104,14 +101,14 @@ class IAMTokenManagerTest < Minitest::Test
|
|
104
101
|
iam_access_token: "iam_access_token",
|
105
102
|
iam_url: iam_url
|
106
103
|
)
|
107
|
-
stub_request(:post, "https://iam.
|
104
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
108
105
|
.with(
|
109
106
|
body: { "grant_type" => "refresh_token", "refresh_token" => "" },
|
110
107
|
headers: {
|
111
108
|
"Accept" => "application/json",
|
112
109
|
"Authorization" => "Basic Yng6Yng=",
|
113
110
|
"Content-Type" => "application/x-www-form-urlencoded",
|
114
|
-
"Host" => "iam.
|
111
|
+
"Host" => "iam.cloud.ibm.com"
|
115
112
|
}
|
116
113
|
).to_return(status: 200, body: response.to_json, headers: {})
|
117
114
|
token_response = token_manager.send(:refresh_token)
|
@@ -157,7 +154,7 @@ class IAMTokenManagerTest < Minitest::Test
|
|
157
154
|
end
|
158
155
|
|
159
156
|
def test_get_token
|
160
|
-
iam_url = "https://iam.
|
157
|
+
iam_url = "https://iam.cloud.ibm.com/identity/token"
|
161
158
|
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
162
159
|
iam_apikey: "iam_apikey",
|
163
160
|
iam_url: iam_url
|
@@ -174,14 +171,14 @@ class IAMTokenManagerTest < Minitest::Test
|
|
174
171
|
"expiration" => 1_524_167_011,
|
175
172
|
"refresh_token" => "jy4gl91BQ"
|
176
173
|
}
|
177
|
-
stub_request(:post, "https://iam.
|
174
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
178
175
|
.with(
|
179
176
|
body: { "apikey" => "iam_apikey", "grant_type" => "urn:ibm:params:oauth:grant-type:apikey", "response_type" => "cloud_iam" },
|
180
177
|
headers: {
|
181
178
|
"Accept" => "application/json",
|
182
179
|
"Authorization" => "Basic Yng6Yng=",
|
183
180
|
"Content-Type" => "application/x-www-form-urlencoded",
|
184
|
-
"Host" => "iam.
|
181
|
+
"Host" => "iam.cloud.ibm.com"
|
185
182
|
}
|
186
183
|
).to_return(status: 200, body: response.to_json, headers: {})
|
187
184
|
token_manager.user_access_token = ""
|
@@ -192,13 +189,13 @@ class IAMTokenManagerTest < Minitest::Test
|
|
192
189
|
token = token_manager.token
|
193
190
|
assert_equal("hellohello", token)
|
194
191
|
|
195
|
-
stub_request(:post, "https://iam.
|
192
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
196
193
|
.with(
|
197
194
|
headers: {
|
198
195
|
"Accept" => "application/json",
|
199
196
|
"Authorization" => "Basic Yng6Yng=",
|
200
197
|
"Content-Type" => "application/x-www-form-urlencoded",
|
201
|
-
"Host" => "iam.
|
198
|
+
"Host" => "iam.cloud.ibm.com"
|
202
199
|
}
|
203
200
|
).to_return(status: 200, body: response.to_json, headers: {})
|
204
201
|
token_manager.token_info["expiration"] = Time.now.to_i - 4000
|
@@ -216,11 +213,68 @@ class IAMTokenManagerTest < Minitest::Test
|
|
216
213
|
assert_equal("dummy", token)
|
217
214
|
end
|
218
215
|
|
216
|
+
def test_client_id_only
|
217
|
+
assert_raises do
|
218
|
+
IBMCloudSdkCore::IAMTokenManager.new(
|
219
|
+
iam_apikey: "iam_apikey",
|
220
|
+
iam_access_token: "iam_access_token",
|
221
|
+
iam_client_id: "client_id"
|
222
|
+
)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_client_secret_only
|
227
|
+
assert_raises do
|
228
|
+
IBMCloudSdkCore::IAMTokenManager.new(
|
229
|
+
iam_apikey: "iam_apikey",
|
230
|
+
iam_access_token: "iam_access_token",
|
231
|
+
iam_client_secret: "client_secret"
|
232
|
+
)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_request_token_nondefault_client_id_secret
|
237
|
+
response = {
|
238
|
+
"access_token" => "oAeisG8yqPY7sFR_x66Z15",
|
239
|
+
"token_type" => "Bearer",
|
240
|
+
"expires_in" => 3600,
|
241
|
+
"expiration" => 1_524_167_011,
|
242
|
+
"refresh_token" => "jy4gl91BQ"
|
243
|
+
}
|
244
|
+
|
245
|
+
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
246
|
+
iam_apikey: "iam_apikey",
|
247
|
+
iam_client_id: "foo",
|
248
|
+
iam_client_secret: "bar"
|
249
|
+
)
|
250
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
251
|
+
.with(basic_auth: %w[foo bar]).to_return(status: 200, body: response.to_json, headers: {})
|
252
|
+
token_response = token_manager.send(:request_token)
|
253
|
+
assert_equal(response, token_response)
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_request_token_default_client_id_secret
|
257
|
+
response = {
|
258
|
+
"access_token" => "oAeisG8yqPY7sFR_x66Z15",
|
259
|
+
"token_type" => "Bearer",
|
260
|
+
"expires_in" => 3600,
|
261
|
+
"expiration" => 1_524_167_011,
|
262
|
+
"refresh_token" => "jy4gl91BQ"
|
263
|
+
}
|
264
|
+
|
265
|
+
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
266
|
+
iam_apikey: "iam_apikey"
|
267
|
+
)
|
268
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
269
|
+
.with(basic_auth: %w[bx bx]).to_return(status: 200, body: response.to_json, headers: {})
|
270
|
+
token_response = token_manager.send(:request_token)
|
271
|
+
assert_equal(response, token_response)
|
272
|
+
end
|
273
|
+
|
219
274
|
def test_dont_leak_constants
|
220
275
|
assert_nil(defined? DEFAULT_IAM_URL)
|
221
276
|
assert_nil(defined? CONTENT_TYPE)
|
222
277
|
assert_nil(defined? ACCEPT)
|
223
|
-
assert_nil(defined? DEFAULT_AUTHORIZATION)
|
224
278
|
assert_nil(defined? REQUEST_TOKEN_GRANT_TYPE)
|
225
279
|
assert_nil(defined? REQUEST_TOKEN_RESPONSE_TYPE)
|
226
280
|
assert_nil(defined? REFRESH_TOKEN_GRANT_TYPE)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ibm_cloud_sdk_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mamoon Raja
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|