nucleus 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|