nucleus 0.2.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +9 -0
- data/README.md +43 -72
- data/lib/nucleus/adapter_resolver.rb +3 -3
- data/lib/nucleus/adapters/base_adapter.rb +109 -109
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb +111 -111
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/cloud_foundry_v2.rb +141 -141
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/data.rb +97 -97
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/domains.rb +5 -5
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/lifecycle.rb +41 -41
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/logs.rb +6 -6
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/regions.rb +33 -33
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/services.rb +6 -6
- data/lib/nucleus/adapters/v1/cloud_foundry_v2/vars.rb +80 -80
- data/lib/nucleus/adapters/v1/heroku/app_states.rb +57 -57
- data/lib/nucleus/adapters/v1/heroku/data.rb +78 -78
- data/lib/nucleus/adapters/v1/heroku/heroku.rb +146 -146
- data/lib/nucleus/adapters/v1/heroku/lifecycle.rb +51 -51
- data/lib/nucleus/adapters/v1/heroku/logs.rb +2 -2
- data/lib/nucleus/adapters/v1/heroku/regions.rb +42 -42
- data/lib/nucleus/adapters/v1/heroku/services.rb +168 -168
- data/lib/nucleus/adapters/v1/heroku/vars.rb +65 -65
- data/lib/nucleus/adapters/v1/openshift_v2/app_states.rb +68 -68
- data/lib/nucleus/adapters/v1/openshift_v2/application.rb +1 -1
- data/lib/nucleus/adapters/v1/openshift_v2/data.rb +96 -96
- data/lib/nucleus/adapters/v1/openshift_v2/lifecycle.rb +60 -60
- data/lib/nucleus/adapters/v1/openshift_v2/logs.rb +106 -106
- data/lib/nucleus/adapters/v1/openshift_v2/openshift_v2.rb +125 -125
- data/lib/nucleus/adapters/v1/openshift_v2/regions.rb +58 -58
- data/lib/nucleus/adapters/v1/openshift_v2/services.rb +173 -173
- data/lib/nucleus/adapters/v1/openshift_v2/vars.rb +49 -49
- data/lib/nucleus/adapters/v1/stub_adapter.rb +464 -464
- data/lib/nucleus/core/adapter_extensions/auth/auth_client.rb +44 -44
- data/lib/nucleus/core/adapter_extensions/auth/expiring_token_auth_client.rb +53 -53
- data/lib/nucleus/core/adapter_extensions/auth/http_basic_auth_client.rb +3 -3
- data/lib/nucleus/core/adapter_extensions/auth/o_auth2_auth_client.rb +95 -95
- data/lib/nucleus/core/adapter_extensions/auth/token_auth_client.rb +36 -36
- data/lib/nucleus/core/adapter_extensions/http_client.rb +5 -5
- data/lib/nucleus/core/common/files/archive_extractor.rb +1 -1
- data/lib/nucleus/core/common/files/archiver.rb +2 -2
- data/lib/nucleus/core/file_handling/file_manager.rb +64 -64
- data/lib/nucleus/core/file_handling/git_deployer.rb +133 -133
- data/lib/nucleus/core/import/adapter_configuration.rb +53 -53
- data/lib/nucleus/scripts/initialize_config_defaults.rb +26 -26
- data/lib/nucleus/version.rb +1 -1
- data/nucleus.gemspec +2 -2
- data/spec/integration/api/auth_spec.rb +3 -3
- data/spec/spec_helper.rb +98 -98
- data/spec/test_suites.rake +1 -1
- data/spec/unit/adapters/git_deployer_spec.rb +262 -262
- data/spec/unit/common/helpers/auth_helper_spec.rb +1 -1
- data/tasks/evaluation.rake +1 -1
- data/wiki/adapter_tests.md +0 -7
- data/wiki/implement_new_adapter.md +1 -1
- metadata +4 -20
- data/config/adapters/cloud_control.yml +0 -32
- data/lib/nucleus/adapters/v1/cloud_control/application.rb +0 -108
- data/lib/nucleus/adapters/v1/cloud_control/authentication.rb +0 -27
- data/lib/nucleus/adapters/v1/cloud_control/buildpacks.rb +0 -23
- data/lib/nucleus/adapters/v1/cloud_control/cloud_control.rb +0 -153
- data/lib/nucleus/adapters/v1/cloud_control/data.rb +0 -76
- data/lib/nucleus/adapters/v1/cloud_control/domains.rb +0 -68
- data/lib/nucleus/adapters/v1/cloud_control/lifecycle.rb +0 -27
- data/lib/nucleus/adapters/v1/cloud_control/log_poller.rb +0 -71
- data/lib/nucleus/adapters/v1/cloud_control/logs.rb +0 -103
- data/lib/nucleus/adapters/v1/cloud_control/regions.rb +0 -32
- data/lib/nucleus/adapters/v1/cloud_control/scaling.rb +0 -17
- data/lib/nucleus/adapters/v1/cloud_control/semantic_errors.rb +0 -31
- data/lib/nucleus/adapters/v1/cloud_control/services.rb +0 -162
- data/lib/nucleus/adapters/v1/cloud_control/token.rb +0 -17
- data/lib/nucleus/adapters/v1/cloud_control/vars.rb +0 -88
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07e7129693ceadca0091a9e0f2e47260aa1ada94
|
4
|
+
data.tar.gz: b6383e24f2e138f8f9d6062546bf0663de185f2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27460f6056c47b7faaa142478bff8990b51bd3ac580b3e3b782c94825fca2edf987f853e64ddae9778e07f0271375fb4303be96313e6c057ce8c8bcecdd29dc9
|
7
|
+
data.tar.gz: 276f1fff90199a3c0291279381eca3782182138df6c928dd8b452aae18d392b2c4df92bd2f7e237bdaecd55dac266fc2e10e34fddd8176942511c4bff6e9d72e
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -8,9 +8,16 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
8
8
|
|
9
9
|
### Fixed
|
10
10
|
|
11
|
+
### Removed
|
12
|
+
|
13
|
+
|
14
|
+
## [0.3.1] - 2016-03-07
|
11
15
|
|
12
16
|
### Removed
|
17
|
+
* Removed cloudControl adapter due to bankruptcy of the vendor
|
13
18
|
|
19
|
+
## [0.3.0] - 2016-03-07
|
20
|
+
* Yanked due to unnecessary Gem contents increasing the overall file size
|
14
21
|
|
15
22
|
## [0.2.0] - 2016-01-22
|
16
23
|
|
@@ -31,3 +38,5 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
31
38
|
|
32
39
|
|
33
40
|
[0.1.0]: https://github.com/stefan-kolb/nucleus/releases/tag/0.1.0
|
41
|
+
[0.2.0]: https://github.com/stefan-kolb/nucleus/releases/tag/0.2.0
|
42
|
+
[0.3.0]: https://github.com/stefan-kolb/nucleus/releases/tag/0.3.0
|
data/README.md
CHANGED
@@ -34,7 +34,6 @@ It provides fully compliant [swagger](http://swagger.io/) schemas that serve for
|
|
34
34
|
* [Heroku](#heroku)
|
35
35
|
* [Cloud Foundry v2](#cloud-foundry-v2)
|
36
36
|
* [Openshift v2](#openshift-v2)
|
37
|
-
* [cloudControl](#cloudcontrol)
|
38
37
|
* [Configuration](#configuration)
|
39
38
|
* [Vendors, Providers and Endpoints](#vendors-providers-and-endpoints)
|
40
39
|
* [Application configuration](#application-configuration)
|
@@ -57,8 +56,6 @@ It provides fully compliant [swagger](http://swagger.io/) schemas that serve for
|
|
57
56
|
- [AppFog][appfog], [Anynines][anynines], [IBM Bluemix][bluemix], [Pivotal Web Services][pivotal_ws], [HP Helion][hp_helion]
|
58
57
|
- [Openshift][openshift_v2] (v2)
|
59
58
|
- [OpenShift Online][openshift_online], [getup Cloud][getup]
|
60
|
-
- [cloudControl][cloudcontrol]
|
61
|
-
- [dotCloud][dotcloud], [Cloud&Heat App Elevator][cloud&heat], [exoscale Apps][exoscale]
|
62
59
|
|
63
60
|
[heroku]: https://www.heroku.com
|
64
61
|
|
@@ -73,11 +70,6 @@ It provides fully compliant [swagger](http://swagger.io/) schemas that serve for
|
|
73
70
|
[openshift_online]: https://www.openshift.com/features/index.html
|
74
71
|
[getup]: https://getupcloud.com/index_en.html
|
75
72
|
|
76
|
-
[cloudcontrol]: https://www.cloudcontrol.com
|
77
|
-
[dotcloud]: https://www.dotcloud.com/
|
78
|
-
[cloud&heat]: https://www.cloudandheat.com/de/paas.html
|
79
|
-
[exoscale]: https://www.exoscale.ch/add-on/apps/
|
80
|
-
|
81
73
|
More information on the vendors and the associated adapter can be found in the [adapters section](#adapters).
|
82
74
|
|
83
75
|
## Usage
|
@@ -186,13 +178,13 @@ resolver.adapters
|
|
186
178
|
```
|
187
179
|
|
188
180
|
```ruby
|
189
|
-
{ "
|
181
|
+
{ "cloud_foundry_v2"=>Nucleus::Adapters::V1::CloudFoundryV2, "heroku"=>Nucleus::Adapters::V1::Heroku, "openshift_v2"=>Nucleus::Adapters::V1::OpenshiftV2 }
|
190
182
|
```
|
191
183
|
|
192
184
|
5) Load your desired adapter implementation:
|
193
185
|
|
194
186
|
```ruby
|
195
|
-
adapter = resolver.load('
|
187
|
+
adapter = resolver.load('cloud_foundry_v2', 'api.pivotal.io', 'your_username', 'your_password')
|
196
188
|
```
|
197
189
|
|
198
190
|
By default, the adapter will be populated with the default configuration options that are defined in the vendor's configuration for the selected endpoint_url.
|
@@ -263,47 +255,47 @@ This list can be auto-generated via:
|
|
263
255
|
$ bundle exec rake evaluation:compatibility:markdown
|
264
256
|
```
|
265
257
|
|
266
|
-
**State:
|
267
|
-
|
268
|
-
Method / Vendor|
|
269
|
-
|
270
|
-
auth_client|✓|✓|✓
|
271
|
-
regions|✓|✓|✓
|
272
|
-
region|✓|✓|✓
|
273
|
-
applications|✓|✓|✓
|
274
|
-
application|✓|✓|✓
|
275
|
-
create_application|✓|✓|✓
|
276
|
-
update_application|&#
|
277
|
-
delete_application|✓|✓|✓
|
278
|
-
domains|✓|✓|✓
|
279
|
-
domain|✓|✓|✓
|
280
|
-
create_domain|✓|✓|✓
|
281
|
-
delete_domain|✓|✓|✓
|
282
|
-
env_vars|✓|✓|✓
|
283
|
-
env_var|✓|✓|✓
|
284
|
-
create_env_var|✓|✓|✓
|
285
|
-
update_env_var|✓|✓|✓
|
286
|
-
delete_env_var|✓|✓|✓
|
287
|
-
start|✓|✓|✓
|
288
|
-
stop|&#
|
289
|
-
restart|&#
|
290
|
-
deploy|✓|✓|✓
|
291
|
-
rebuild|✓|✓|✓
|
292
|
-
download|✓|✓|✓
|
293
|
-
scale|✓|✓|✓
|
294
|
-
log?|✓|✓|✓
|
295
|
-
logs|✓|✓|✓
|
296
|
-
log_entries|✓|✓|✓
|
297
|
-
tail|✓|✓|✓
|
298
|
-
services|✓|✓|✓
|
299
|
-
service|✓|✓|✓
|
300
|
-
service_plans|✓|✓|✓
|
301
|
-
service_plan|✓|✓|✓
|
302
|
-
installed_services|✓|✓|✓
|
303
|
-
installed_service|✓|✓|✓
|
304
|
-
add_service|✓|✓|✓
|
305
|
-
change_service|✓|✓|&#
|
306
|
-
remove_service|✓|✓|✓
|
258
|
+
**State: 3/7/2016**
|
259
|
+
|
260
|
+
Method / Vendor|Cloud Foundry v2|Heroku|Openshift v2
|
261
|
+
:--|:-:|:-:|:-:
|
262
|
+
auth_client|✓|✓|✓
|
263
|
+
regions|✓|✓|✓
|
264
|
+
region|✓|✓|✓
|
265
|
+
applications|✓|✓|✓
|
266
|
+
application|✓|✓|✓
|
267
|
+
create_application|✓|✓|✓
|
268
|
+
update_application|✓|✓|✗
|
269
|
+
delete_application|✓|✓|✓
|
270
|
+
domains|✓|✓|✓
|
271
|
+
domain|✓|✓|✓
|
272
|
+
create_domain|✓|✓|✓
|
273
|
+
delete_domain|✓|✓|✓
|
274
|
+
env_vars|✓|✓|✓
|
275
|
+
env_var|✓|✓|✓
|
276
|
+
create_env_var|✓|✓|✓
|
277
|
+
update_env_var|✓|✓|✓
|
278
|
+
delete_env_var|✓|✓|✓
|
279
|
+
start|✓|✓|✓
|
280
|
+
stop|✓|✓|✓
|
281
|
+
restart|✓|✓|✓
|
282
|
+
deploy|✓|✓|✓
|
283
|
+
rebuild|✓|✓|✓
|
284
|
+
download|✓|✓|✓
|
285
|
+
scale|✓|✓|✓
|
286
|
+
log?|✓|✓|✓
|
287
|
+
logs|✓|✓|✓
|
288
|
+
log_entries|✓|✓|✓
|
289
|
+
tail|✓|✓|✓
|
290
|
+
services|✓|✓|✓
|
291
|
+
service|✓|✓|✓
|
292
|
+
service_plans|✓|✓|✓
|
293
|
+
service_plan|✓|✓|✓
|
294
|
+
installed_services|✓|✓|✓
|
295
|
+
installed_service|✓|✓|✓
|
296
|
+
add_service|✓|✓|✓
|
297
|
+
change_service|✓|✓|✗
|
298
|
+
remove_service|✓|✓|✓
|
307
299
|
|
308
300
|
### Core constructs
|
309
301
|
|
@@ -477,27 +469,6 @@ further configuration are not supported as of now.
|
|
477
469
|
|
478
470
|
Recording is really slow. Even worse, actions quite often fail with Openshift internal timeouts.
|
479
471
|
|
480
|
-
### cloudControl
|
481
|
-
|
482
|
-
Providers: [cloudControl][cloudcontrol], [dotCloud][dotcloud], [Cloud&Heat App Elevator][cloud&heat], [exoscale Apps][exoscale]
|
483
|
-
|
484
|
-
#### Issues
|
485
|
-
|
486
|
-
**Application update**
|
487
|
-
|
488
|
-
An application can't be updated, the `name` and `runtimes` can't be changed once created.
|
489
|
-
|
490
|
-
**Application lifecycle**
|
491
|
-
|
492
|
-
Applications on cloudControl can't be explicitly stopped or restarted.
|
493
|
-
They start after a successful build of the application, which is therefore postponed to the first invocation of the start operation.
|
494
|
-
Applications only stop once the corresponding _deployment_ has been deleted.
|
495
|
-
|
496
|
-
**Logs**
|
497
|
-
|
498
|
-
Log messages, for instance the request entries, do not appear instantly in the log.
|
499
|
-
It may take some seconds or even minutes for them to show up.
|
500
|
-
|
501
472
|
## Configuration
|
502
473
|
|
503
474
|
Several parts of Nucleus can be configured, e.g. whether to persist your data or always start with a clean instance.
|
@@ -5,7 +5,7 @@ module Nucleus
|
|
5
5
|
include Nucleus::UrlConverter
|
6
6
|
|
7
7
|
def initialize(requested_version)
|
8
|
-
|
8
|
+
raise 'No such version supported' unless Nucleus::VersionDetector.api_versions.include?(requested_version)
|
9
9
|
@api_version = requested_version
|
10
10
|
end
|
11
11
|
|
@@ -33,7 +33,7 @@ module Nucleus
|
|
33
33
|
# @return [Nucleus::Adapters::BaseAdapter] loaded adapter implementation
|
34
34
|
def load(vendor, username, password, options = {})
|
35
35
|
setup
|
36
|
-
|
36
|
+
raise StandardError, "Could not find adapter for vendor '#{vendor}'" unless @adapters.key?(vendor)
|
37
37
|
|
38
38
|
# load the endpoint's HTTPS enabled API URL
|
39
39
|
endpoint_url = load_endpoint(vendor, options)
|
@@ -73,7 +73,7 @@ module Nucleus
|
|
73
73
|
# use default endpoint
|
74
74
|
endpoint_url = @configurations[vendor].keys.first
|
75
75
|
else
|
76
|
-
|
76
|
+
raise StandardError, "Could not identify an API endpoint for the vendor '#{vendor}'. "\
|
77
77
|
"Please specify the API URL to use with the ':api_url' option."
|
78
78
|
end
|
79
79
|
|
@@ -1,109 +1,109 @@
|
|
1
|
-
module Nucleus
|
2
|
-
# The {Adapters} module combines all application logic to communicate with the different vendor platforms
|
3
|
-
# and created the unified API.
|
4
|
-
module Adapters
|
5
|
-
# The {BaseAdapter} is an abstract class that shall be extended by all actual Adapters.
|
6
|
-
# It provides methods to common functionality:<br>
|
7
|
-
# * authentication (+cache)
|
8
|
-
# * http client with general error handling
|
9
|
-
# * native platform API calls
|
10
|
-
# @abstract
|
11
|
-
class BaseAdapter
|
12
|
-
include HttpClient
|
13
|
-
include HttpTailClient
|
14
|
-
include Logging
|
15
|
-
|
16
|
-
attr_reader :endpoint_url
|
17
|
-
|
18
|
-
def initialize(endpoint_url, endpoint_app_domain = nil, check_certificates = true)
|
19
|
-
|
20
|
-
@endpoint_url = endpoint_url
|
21
|
-
@endpoint_app_domain = endpoint_app_domain
|
22
|
-
@check_certificates = check_certificates
|
23
|
-
end
|
24
|
-
|
25
|
-
# thread-based cache for the api authorization headers
|
26
|
-
thread_config_accessor :auth_objects_cache, default: {}
|
27
|
-
|
28
|
-
# Cache the auth information.
|
29
|
-
# @param [String] key cache key
|
30
|
-
# @param [Nucleus::Adapters::AuthClient] auth_object authentication client to be cached
|
31
|
-
# @return [void]
|
32
|
-
def cache(key, auth_object)
|
33
|
-
auth_objects_cache[key] = auth_object
|
34
|
-
end
|
35
|
-
|
36
|
-
# Are there cached information for this key?
|
37
|
-
# @param [String] key cache key
|
38
|
-
# @return [true, false] true if has cached auth info, else false
|
39
|
-
def cache?(key)
|
40
|
-
auth_objects_cache.key? key
|
41
|
-
end
|
42
|
-
|
43
|
-
# Get the currently cached authentication object.
|
44
|
-
# @param [String] key cache key
|
45
|
-
# @return [Hash<String,String>, Nucleus::Adapters::AuthClient] cached authentication client
|
46
|
-
def cached(key)
|
47
|
-
return nil unless cache?(key)
|
48
|
-
auth_objects_cache[key]
|
49
|
-
end
|
50
|
-
|
51
|
-
# Create the cache key for the username / password combination and save it in the {::RequestStore} to make it
|
52
|
-
# available throughout the current request.
|
53
|
-
# @param [String] username the username for the authentication
|
54
|
-
# @param [String] password the password for the authentication
|
55
|
-
# @return [String] calculated hash key for the input values
|
56
|
-
def cache_key(username, password)
|
57
|
-
# calculate the cache only once per request
|
58
|
-
return RequestStore.store[:cache_key] if RequestStore.exist?(:cache_key)
|
59
|
-
key = Digest::SHA256.hexdigest "#{endpoint_url}#{username}:#{password}"
|
60
|
-
RequestStore.store[:cache_key] = key
|
61
|
-
key
|
62
|
-
end
|
63
|
-
|
64
|
-
# Get the cached authentication object and retrieve the presumably valid authentication header.
|
65
|
-
# @return [Hash<String,String>] hash including a valid authentication header
|
66
|
-
def headers
|
67
|
-
auth_object = auth_objects_cache[RequestStore.store[:cache_key]]
|
68
|
-
# AuthClient, generates the header for us
|
69
|
-
auth_object.auth_header
|
70
|
-
end
|
71
|
-
|
72
|
-
# Execute an API call, targeted directly against the vendors API.
|
73
|
-
# @param [Symbol] method http method to use, one of: [:GET, :POST, :DELETE, :PUT, :PATCH]
|
74
|
-
# @param [String] path url path to append to the endpoint's URL
|
75
|
-
# @param [Hash] params body params to use for PATCH, :PUT and :POST requests
|
76
|
-
# @return [Object] the actual response body of the vendor platform
|
77
|
-
def endpoint_call(method, path, params)
|
78
|
-
case method
|
79
|
-
when :GET
|
80
|
-
get(path, native_call: true).body
|
81
|
-
when :POST
|
82
|
-
post(path, native_call: true, body: params).body
|
83
|
-
when :DELETE
|
84
|
-
delete(path, native_call: true).body
|
85
|
-
when :PUT
|
86
|
-
put(path, native_call: true, body: params).body
|
87
|
-
when :PATCH
|
88
|
-
patch(path, native_call: true, body: params).body
|
89
|
-
else
|
90
|
-
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
# Fail with a {Errors::PlatformSpecificSemanticError} error and format the error message to include the values
|
95
|
-
# that are passed in the params. Requires the adapter to provide a +semantic_error_messages+ method, which shall
|
96
|
-
# return a Hash with the platform specific semantic errors.
|
97
|
-
# @param [Symbol] error_name error that shall be returned
|
98
|
-
# @param [Array<String>] params values that are to be included in the error message template
|
99
|
-
# @raise [Errors::PlatformSpecificSemanticError]
|
100
|
-
def fail_with(error_name, params = nil)
|
101
|
-
unless respond_to?(:semantic_error_messages)
|
102
|
-
|
103
|
-
end
|
104
|
-
error = semantic_error_messages[error_name]
|
105
|
-
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
1
|
+
module Nucleus
|
2
|
+
# The {Adapters} module combines all application logic to communicate with the different vendor platforms
|
3
|
+
# and created the unified API.
|
4
|
+
module Adapters
|
5
|
+
# The {BaseAdapter} is an abstract class that shall be extended by all actual Adapters.
|
6
|
+
# It provides methods to common functionality:<br>
|
7
|
+
# * authentication (+cache)
|
8
|
+
# * http client with general error handling
|
9
|
+
# * native platform API calls
|
10
|
+
# @abstract
|
11
|
+
class BaseAdapter
|
12
|
+
include HttpClient
|
13
|
+
include HttpTailClient
|
14
|
+
include Logging
|
15
|
+
|
16
|
+
attr_reader :endpoint_url
|
17
|
+
|
18
|
+
def initialize(endpoint_url, endpoint_app_domain = nil, check_certificates = true)
|
19
|
+
raise ArgumentError, "'endpoint_url' must be a valid URL" unless endpoint_url =~ /\A#{URI.regexp(['https'])}\z/
|
20
|
+
@endpoint_url = endpoint_url
|
21
|
+
@endpoint_app_domain = endpoint_app_domain
|
22
|
+
@check_certificates = check_certificates
|
23
|
+
end
|
24
|
+
|
25
|
+
# thread-based cache for the api authorization headers
|
26
|
+
thread_config_accessor :auth_objects_cache, default: {}
|
27
|
+
|
28
|
+
# Cache the auth information.
|
29
|
+
# @param [String] key cache key
|
30
|
+
# @param [Nucleus::Adapters::AuthClient] auth_object authentication client to be cached
|
31
|
+
# @return [void]
|
32
|
+
def cache(key, auth_object)
|
33
|
+
auth_objects_cache[key] = auth_object
|
34
|
+
end
|
35
|
+
|
36
|
+
# Are there cached information for this key?
|
37
|
+
# @param [String] key cache key
|
38
|
+
# @return [true, false] true if has cached auth info, else false
|
39
|
+
def cache?(key)
|
40
|
+
auth_objects_cache.key? key
|
41
|
+
end
|
42
|
+
|
43
|
+
# Get the currently cached authentication object.
|
44
|
+
# @param [String] key cache key
|
45
|
+
# @return [Hash<String,String>, Nucleus::Adapters::AuthClient] cached authentication client
|
46
|
+
def cached(key)
|
47
|
+
return nil unless cache?(key)
|
48
|
+
auth_objects_cache[key]
|
49
|
+
end
|
50
|
+
|
51
|
+
# Create the cache key for the username / password combination and save it in the {::RequestStore} to make it
|
52
|
+
# available throughout the current request.
|
53
|
+
# @param [String] username the username for the authentication
|
54
|
+
# @param [String] password the password for the authentication
|
55
|
+
# @return [String] calculated hash key for the input values
|
56
|
+
def cache_key(username, password)
|
57
|
+
# calculate the cache only once per request
|
58
|
+
return RequestStore.store[:cache_key] if RequestStore.exist?(:cache_key)
|
59
|
+
key = Digest::SHA256.hexdigest "#{endpoint_url}#{username}:#{password}"
|
60
|
+
RequestStore.store[:cache_key] = key
|
61
|
+
key
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get the cached authentication object and retrieve the presumably valid authentication header.
|
65
|
+
# @return [Hash<String,String>] hash including a valid authentication header
|
66
|
+
def headers
|
67
|
+
auth_object = auth_objects_cache[RequestStore.store[:cache_key]]
|
68
|
+
# AuthClient, generates the header for us
|
69
|
+
auth_object.auth_header
|
70
|
+
end
|
71
|
+
|
72
|
+
# Execute an API call, targeted directly against the vendors API.
|
73
|
+
# @param [Symbol] method http method to use, one of: [:GET, :POST, :DELETE, :PUT, :PATCH]
|
74
|
+
# @param [String] path url path to append to the endpoint's URL
|
75
|
+
# @param [Hash] params body params to use for PATCH, :PUT and :POST requests
|
76
|
+
# @return [Object] the actual response body of the vendor platform
|
77
|
+
def endpoint_call(method, path, params)
|
78
|
+
case method
|
79
|
+
when :GET
|
80
|
+
get(path, native_call: true).body
|
81
|
+
when :POST
|
82
|
+
post(path, native_call: true, body: params).body
|
83
|
+
when :DELETE
|
84
|
+
delete(path, native_call: true).body
|
85
|
+
when :PUT
|
86
|
+
put(path, native_call: true, body: params).body
|
87
|
+
when :PATCH
|
88
|
+
patch(path, native_call: true, body: params).body
|
89
|
+
else
|
90
|
+
raise AdapterRequestError, 'Unsupported adapter call method. Allowed are: GET, POST, PATCH, PUT, DELETE'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Fail with a {Errors::PlatformSpecificSemanticError} error and format the error message to include the values
|
95
|
+
# that are passed in the params. Requires the adapter to provide a +semantic_error_messages+ method, which shall
|
96
|
+
# return a Hash with the platform specific semantic errors.
|
97
|
+
# @param [Symbol] error_name error that shall be returned
|
98
|
+
# @param [Array<String>] params values that are to be included in the error message template
|
99
|
+
# @raise [Errors::PlatformSpecificSemanticError]
|
100
|
+
def fail_with(error_name, params = nil)
|
101
|
+
unless respond_to?(:semantic_error_messages)
|
102
|
+
raise StandardError 'Invalid adapter implementation, no :semantic_error_messages method provided'
|
103
|
+
end
|
104
|
+
error = semantic_error_messages[error_name]
|
105
|
+
raise Errors::PlatformSpecificSemanticError.new(error[:message] % params, error[:code])
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|