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
@@ -1,97 +1,97 @@
|
|
1
|
-
module Nucleus
|
2
|
-
module Adapters
|
3
|
-
module V1
|
4
|
-
class CloudFoundryV2 < Stub
|
5
|
-
module Data
|
6
|
-
# @see Stub#deploy
|
7
|
-
def deploy(application_name_or_id, file, file_compression_format)
|
8
|
-
# could be made async, too
|
9
|
-
# resources: [] says that no previous data shall be reused, see also:
|
10
|
-
# http://apidocs.cloudfoundry.org/202/apps/uploads_the_bits_for_an_app.html
|
11
|
-
|
12
|
-
app_guid = app_guid(application_name_or_id)
|
13
|
-
# deploy by guid
|
14
|
-
# deploy_response = put("/v2/apps/#{app_guid}/bits", body: { resources: [], application: file.read },
|
15
|
-
# headers: { 'Content-Type' => 'multipart/form-data; '\
|
16
|
-
# 'boundary=nucleus-cloud-foundry-adapter-file-upload-boundary' })
|
17
|
-
|
18
|
-
begin
|
19
|
-
# convert all archives to .zip archives
|
20
|
-
converted_file = ArchiveConverter.convert(file, file_compression_format, 'zip', true)
|
21
|
-
unless converted_file.respond_to?(:path) && converted_file.respond_to?(:read)
|
22
|
-
tmpfile = Tempfile.new(["nucleus-cf-deploy-upload-#{app_guid}", '.zip'])
|
23
|
-
tmpfile.binmode
|
24
|
-
tmpfile.write converted_file.read
|
25
|
-
tmpfile.rewind
|
26
|
-
converted_file = tmpfile
|
27
|
-
end
|
28
|
-
|
29
|
-
# TODO: this is only a temporary solution until excon supports multipart requests
|
30
|
-
# See also: https://github.com/excon/excon/issues/353
|
31
|
-
url = "#{@endpoint_url}/v2/apps/#{app_guid}/bits"
|
32
|
-
request_body = { multipart: true, application: converted_file, async: false, resources: '[]' }
|
33
|
-
begin
|
34
|
-
RestClient::Request.execute(method: :put, url: url, payload: request_body,
|
35
|
-
headers: headers, verify_ssl: @check_certificates)
|
36
|
-
rescue RestClient::BadRequest => e
|
37
|
-
raise Errors::AdapterRequestError, e.http_body
|
38
|
-
end
|
39
|
-
ensure
|
40
|
-
if tmpfile
|
41
|
-
tmpfile.close
|
42
|
-
tmpfile.unlink # deletes this temporary file
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# @see Stub#download
|
48
|
-
def download(application_name_or_id, compression_format)
|
49
|
-
app_guid = app_guid(application_name_or_id)
|
50
|
-
# fail if there is no deployment
|
51
|
-
unless deployed?(app_guid)
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
download_response = get("/v2/apps/#{app_guid}/download", follow_redirects: false, expects: [200, 302])
|
56
|
-
if download_response.status == 200
|
57
|
-
data = download_response.body
|
58
|
-
else
|
59
|
-
download_location = download_response.headers[:Location]
|
60
|
-
# if IBM f*cked with the download URL, fix the address
|
61
|
-
download_location = download_location.gsub(/objectstorage.service.networklayer.com/, 'objectstorage.softlayer.net')
|
62
|
-
# omit_default_port: https://github.com/excon/excon/issues/475
|
63
|
-
data = Excon.new(download_location, omit_default_port: true).get.body
|
64
|
-
end
|
65
|
-
|
66
|
-
# write data to tmpfile so that it can be converted
|
67
|
-
downloaded_application_archive = Tempfile.new(["nucleus-cf-deployment-download-#{app_guid}", '.zip'])
|
68
|
-
downloaded_application_archive.binmode
|
69
|
-
downloaded_application_archive.write StringIO.new(data).read
|
70
|
-
downloaded_application_archive.rewind
|
71
|
-
|
72
|
-
# convert from current format (which is always a zip archive) to the destination format
|
73
|
-
ArchiveConverter.convert(downloaded_application_archive, 'zip', compression_format, false)
|
74
|
-
ensure
|
75
|
-
if downloaded_application_archive
|
76
|
-
downloaded_application_archive.close
|
77
|
-
downloaded_application_archive.unlink
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# @see Stub#rebuild
|
82
|
-
def rebuild(application_name_or_id)
|
83
|
-
app_guid = app_guid(application_name_or_id)
|
84
|
-
# fail if there is no deployment
|
85
|
-
unless deployed?(app_guid)
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
# rebuild by name or id
|
90
|
-
rebuild_response = post("/v2/apps/#{app_guid}/restage")
|
91
|
-
to_nucleus_app(rebuild_response.body)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
1
|
+
module Nucleus
|
2
|
+
module Adapters
|
3
|
+
module V1
|
4
|
+
class CloudFoundryV2 < Stub
|
5
|
+
module Data
|
6
|
+
# @see Stub#deploy
|
7
|
+
def deploy(application_name_or_id, file, file_compression_format)
|
8
|
+
# could be made async, too
|
9
|
+
# resources: [] says that no previous data shall be reused, see also:
|
10
|
+
# http://apidocs.cloudfoundry.org/202/apps/uploads_the_bits_for_an_app.html
|
11
|
+
|
12
|
+
app_guid = app_guid(application_name_or_id)
|
13
|
+
# deploy by guid
|
14
|
+
# deploy_response = put("/v2/apps/#{app_guid}/bits", body: { resources: [], application: file.read },
|
15
|
+
# headers: { 'Content-Type' => 'multipart/form-data; '\
|
16
|
+
# 'boundary=nucleus-cloud-foundry-adapter-file-upload-boundary' })
|
17
|
+
|
18
|
+
begin
|
19
|
+
# convert all archives to .zip archives
|
20
|
+
converted_file = ArchiveConverter.convert(file, file_compression_format, 'zip', true)
|
21
|
+
unless converted_file.respond_to?(:path) && converted_file.respond_to?(:read)
|
22
|
+
tmpfile = Tempfile.new(["nucleus-cf-deploy-upload-#{app_guid}", '.zip'])
|
23
|
+
tmpfile.binmode
|
24
|
+
tmpfile.write converted_file.read
|
25
|
+
tmpfile.rewind
|
26
|
+
converted_file = tmpfile
|
27
|
+
end
|
28
|
+
|
29
|
+
# TODO: this is only a temporary solution until excon supports multipart requests
|
30
|
+
# See also: https://github.com/excon/excon/issues/353
|
31
|
+
url = "#{@endpoint_url}/v2/apps/#{app_guid}/bits"
|
32
|
+
request_body = { multipart: true, application: converted_file, async: false, resources: '[]' }
|
33
|
+
begin
|
34
|
+
RestClient::Request.execute(method: :put, url: url, payload: request_body,
|
35
|
+
headers: headers, verify_ssl: @check_certificates)
|
36
|
+
rescue RestClient::BadRequest => e
|
37
|
+
raise Errors::AdapterRequestError, e.http_body
|
38
|
+
end
|
39
|
+
ensure
|
40
|
+
if tmpfile
|
41
|
+
tmpfile.close
|
42
|
+
tmpfile.unlink # deletes this temporary file
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# @see Stub#download
|
48
|
+
def download(application_name_or_id, compression_format)
|
49
|
+
app_guid = app_guid(application_name_or_id)
|
50
|
+
# fail if there is no deployment
|
51
|
+
unless deployed?(app_guid)
|
52
|
+
raise Errors::SemanticAdapterRequestError, 'Application must be deployed before data can be downloaded'
|
53
|
+
end
|
54
|
+
|
55
|
+
download_response = get("/v2/apps/#{app_guid}/download", follow_redirects: false, expects: [200, 302])
|
56
|
+
if download_response.status == 200
|
57
|
+
data = download_response.body
|
58
|
+
else
|
59
|
+
download_location = download_response.headers[:Location]
|
60
|
+
# if IBM f*cked with the download URL, fix the address
|
61
|
+
download_location = download_location.gsub(/objectstorage.service.networklayer.com/, 'objectstorage.softlayer.net')
|
62
|
+
# omit_default_port: https://github.com/excon/excon/issues/475
|
63
|
+
data = Excon.new(download_location, omit_default_port: true).get.body
|
64
|
+
end
|
65
|
+
|
66
|
+
# write data to tmpfile so that it can be converted
|
67
|
+
downloaded_application_archive = Tempfile.new(["nucleus-cf-deployment-download-#{app_guid}", '.zip'])
|
68
|
+
downloaded_application_archive.binmode
|
69
|
+
downloaded_application_archive.write StringIO.new(data).read
|
70
|
+
downloaded_application_archive.rewind
|
71
|
+
|
72
|
+
# convert from current format (which is always a zip archive) to the destination format
|
73
|
+
ArchiveConverter.convert(downloaded_application_archive, 'zip', compression_format, false)
|
74
|
+
ensure
|
75
|
+
if downloaded_application_archive
|
76
|
+
downloaded_application_archive.close
|
77
|
+
downloaded_application_archive.unlink
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# @see Stub#rebuild
|
82
|
+
def rebuild(application_name_or_id)
|
83
|
+
app_guid = app_guid(application_name_or_id)
|
84
|
+
# fail if there is no deployment
|
85
|
+
unless deployed?(app_guid)
|
86
|
+
raise Errors::SemanticAdapterRequestError, 'Application must be deployed before it can be rebuild'
|
87
|
+
end
|
88
|
+
|
89
|
+
# rebuild by name or id
|
90
|
+
rebuild_response = post("/v2/apps/#{app_guid}/restage")
|
91
|
+
to_nucleus_app(rebuild_response.body)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -29,8 +29,8 @@ module Nucleus
|
|
29
29
|
def create_domain(application_name_or_id, domain)
|
30
30
|
domains(application_name_or_id).each do |existing_domain|
|
31
31
|
if existing_domain[:name] == domain[:name]
|
32
|
-
|
33
|
-
|
32
|
+
raise Errors::SemanticAdapterRequestError,
|
33
|
+
"Domain '#{domain[:name]}' is already assigned to the application"
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -51,12 +51,12 @@ module Nucleus
|
|
51
51
|
if delete_response.status == 400
|
52
52
|
cf_error = delete_response.body[:code]
|
53
53
|
if cf_error == 1002
|
54
|
-
|
54
|
+
raise Errors::AdapterResourceNotFoundError, 'Domain not found. '\
|
55
55
|
'CF context specific: Route does not exist or is not assigned with this application'
|
56
56
|
else
|
57
57
|
# delete failed with 400, but not due to invalid domain
|
58
|
-
|
59
|
-
|
58
|
+
raise Errors::AdapterRequestError,
|
59
|
+
"#{delete_response.body[:description]} (#{cf_error} - #{delete_response.body[:error_code]})"
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -1,41 +1,41 @@
|
|
1
|
-
module Nucleus
|
2
|
-
module Adapters
|
3
|
-
module V1
|
4
|
-
class CloudFoundryV2 < Stub
|
5
|
-
module Lifecycle
|
6
|
-
# @see Stub#start
|
7
|
-
def start(application_name_or_id)
|
8
|
-
app_guid = app_guid(application_name_or_id)
|
9
|
-
# fail if there is no deployment
|
10
|
-
unless deployed?(app_guid)
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
# start by name or id
|
15
|
-
start_response = put("/v2/apps/#{app_guid}", body: { state: 'STARTED' })
|
16
|
-
to_nucleus_app(start_response.body)
|
17
|
-
end
|
18
|
-
|
19
|
-
# @see Stub#stop
|
20
|
-
def stop(application_name_or_id)
|
21
|
-
app_guid = app_guid(application_name_or_id)
|
22
|
-
# fail if there is no deployment
|
23
|
-
unless deployed?(app_guid)
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
# stop by name or id
|
28
|
-
stop_response = put("/v2/apps/#{app_guid}", body: { state: 'STOPPED' })
|
29
|
-
to_nucleus_app(stop_response.body)
|
30
|
-
end
|
31
|
-
|
32
|
-
# @see Stub#restart
|
33
|
-
def restart(application_name_or_id)
|
34
|
-
stop(application_name_or_id)
|
35
|
-
start(application_name_or_id)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
1
|
+
module Nucleus
|
2
|
+
module Adapters
|
3
|
+
module V1
|
4
|
+
class CloudFoundryV2 < Stub
|
5
|
+
module Lifecycle
|
6
|
+
# @see Stub#start
|
7
|
+
def start(application_name_or_id)
|
8
|
+
app_guid = app_guid(application_name_or_id)
|
9
|
+
# fail if there is no deployment
|
10
|
+
unless deployed?(app_guid)
|
11
|
+
raise Errors::SemanticAdapterRequestError, 'Application must be deployed before it can be started'
|
12
|
+
end
|
13
|
+
|
14
|
+
# start by name or id
|
15
|
+
start_response = put("/v2/apps/#{app_guid}", body: { state: 'STARTED' })
|
16
|
+
to_nucleus_app(start_response.body)
|
17
|
+
end
|
18
|
+
|
19
|
+
# @see Stub#stop
|
20
|
+
def stop(application_name_or_id)
|
21
|
+
app_guid = app_guid(application_name_or_id)
|
22
|
+
# fail if there is no deployment
|
23
|
+
unless deployed?(app_guid)
|
24
|
+
raise Errors::SemanticAdapterRequestError, 'Application must be deployed before it can be stopped'
|
25
|
+
end
|
26
|
+
|
27
|
+
# stop by name or id
|
28
|
+
stop_response = put("/v2/apps/#{app_guid}", body: { state: 'STOPPED' })
|
29
|
+
to_nucleus_app(stop_response.body)
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see Stub#restart
|
33
|
+
def restart(application_name_or_id)
|
34
|
+
stop(application_name_or_id)
|
35
|
+
start(application_name_or_id)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -117,8 +117,8 @@ module Nucleus
|
|
117
117
|
filter = nil
|
118
118
|
else
|
119
119
|
# invalid log requests --> 404
|
120
|
-
|
121
|
-
|
120
|
+
raise Errors::AdapterResourceNotFoundError,
|
121
|
+
"Invalid log file '#{log_id}', not available for application '#{app_guid}'"
|
122
122
|
end
|
123
123
|
filter
|
124
124
|
end
|
@@ -146,8 +146,8 @@ module Nucleus
|
|
146
146
|
log_files = get("/v2/apps/#{app_guid}/instances/0/files/#{file_path}",
|
147
147
|
follow_redirects: false, expects: expected_statuses, headers: headers_to_use)
|
148
148
|
if log_files.status == 400 || log_files.status == 404
|
149
|
-
|
150
|
-
|
149
|
+
raise Errors::AdapterResourceNotFoundError,
|
150
|
+
"Invalid log file: '#{file_path}' not available for application '#{app_guid}'"
|
151
151
|
end
|
152
152
|
return log_files.body if log_files.status == 200
|
153
153
|
|
@@ -162,8 +162,8 @@ module Nucleus
|
|
162
162
|
downloaded_logfile_response = connection.request(method: :get, expects: expected_statuses)
|
163
163
|
|
164
164
|
if downloaded_logfile_response.status == 404
|
165
|
-
|
166
|
-
|
165
|
+
raise Errors::AdapterResourceNotFoundError,
|
166
|
+
"Invalid log file: '#{file_path}' not available for application '#{app_guid}'"
|
167
167
|
end
|
168
168
|
downloaded_logfile_response.body
|
169
169
|
end
|
@@ -1,33 +1,33 @@
|
|
1
|
-
module Nucleus
|
2
|
-
module Adapters
|
3
|
-
module V1
|
4
|
-
class CloudFoundryV2 < Stub
|
5
|
-
module Regions
|
6
|
-
# @see Stub#regions
|
7
|
-
def regions
|
8
|
-
[default_region]
|
9
|
-
end
|
10
|
-
|
11
|
-
# @see Stub#region
|
12
|
-
def region(region_name)
|
13
|
-
unless region_name.casecmp('default') == 0
|
14
|
-
|
15
|
-
end
|
16
|
-
default_region
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def default_region
|
22
|
-
{
|
23
|
-
id: 'default',
|
24
|
-
description: 'Default region, Cloud Foundry does not support multi regions yet.',
|
25
|
-
created_at: Time.at(0).to_datetime,
|
26
|
-
updated_at: Time.at(0).to_datetime
|
27
|
-
}
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
1
|
+
module Nucleus
|
2
|
+
module Adapters
|
3
|
+
module V1
|
4
|
+
class CloudFoundryV2 < Stub
|
5
|
+
module Regions
|
6
|
+
# @see Stub#regions
|
7
|
+
def regions
|
8
|
+
[default_region]
|
9
|
+
end
|
10
|
+
|
11
|
+
# @see Stub#region
|
12
|
+
def region(region_name)
|
13
|
+
unless region_name.casecmp('default') == 0
|
14
|
+
raise Errors::AdapterResourceNotFoundError, "Region '#{region_name}' does not exist at the endpoint"
|
15
|
+
end
|
16
|
+
default_region
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def default_region
|
22
|
+
{
|
23
|
+
id: 'default',
|
24
|
+
description: 'Default region, Cloud Foundry does not support multi regions yet.',
|
25
|
+
created_at: Time.at(0).to_datetime,
|
26
|
+
updated_at: Time.at(0).to_datetime
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -46,8 +46,8 @@ module Nucleus
|
|
46
46
|
service_guid = service_guid(service_id_or_name)
|
47
47
|
cf_binding = binding(app_guid, service_guid)
|
48
48
|
# make sure there is a binding
|
49
|
-
|
50
|
-
|
49
|
+
raise Errors::AdapterResourceNotFoundError,
|
50
|
+
"No such service '#{service_id_or_name}' for application '#{application_name_or_id}'" unless cf_binding
|
51
51
|
to_nucleus_installed_service(cf_binding)
|
52
52
|
end
|
53
53
|
|
@@ -138,8 +138,8 @@ module Nucleus
|
|
138
138
|
services = get('/v2/services').body[:resources]
|
139
139
|
# find a match and use the service's guid
|
140
140
|
service_match = services.find { |service| service[:entity][:label] == service_id_or_name }
|
141
|
-
|
142
|
-
|
141
|
+
raise error_class,
|
142
|
+
"Invalid service: Could not find service with name '#{service_id_or_name}'" unless service_match
|
143
143
|
service_match[:metadata][:guid]
|
144
144
|
end
|
145
145
|
|
@@ -159,8 +159,8 @@ module Nucleus
|
|
159
159
|
plans = get("/v2/services/#{service_id}/service_plans").body[:resources]
|
160
160
|
# find a match and use the plan's guid
|
161
161
|
plan_match = plans.find { |plan| plan[:entity][:name] == plan_name_or_id }
|
162
|
-
|
163
|
-
|
162
|
+
raise error_class,
|
163
|
+
"Invalid plan: No such plan '#{plan_name_or_id}' for service '#{service_id}'" unless plan_match
|
164
164
|
plan_match[:metadata][:guid]
|
165
165
|
end
|
166
166
|
|
@@ -1,80 +1,80 @@
|
|
1
|
-
module Nucleus
|
2
|
-
module Adapters
|
3
|
-
module V1
|
4
|
-
class CloudFoundryV2 < Stub
|
5
|
-
module Vars
|
6
|
-
# @see Stub#env_vars
|
7
|
-
def env_vars(application_name_or_id)
|
8
|
-
app_guid = app_guid(application_name_or_id)
|
9
|
-
app_vars = get("/v2/apps/#{app_guid}/env").body[:environment_json]
|
10
|
-
formatted_vars = []
|
11
|
-
app_vars.each do |key, value|
|
12
|
-
formatted_vars.push(id: key, key: key, value: value)
|
13
|
-
end
|
14
|
-
formatted_vars
|
15
|
-
end
|
16
|
-
|
17
|
-
# @see Stub#env_var
|
18
|
-
def env_var(application_name_or_id, env_var_key)
|
19
|
-
app_guid = app_guid(application_name_or_id)
|
20
|
-
all_vars = get("/v2/apps/#{app_guid}/env").body[:environment_json]
|
21
|
-
|
22
|
-
|
23
|
-
{ id: env_var_key, key: env_var_key, value: all_vars[env_var_key.to_sym] }
|
24
|
-
end
|
25
|
-
|
26
|
-
# @see Stub#create_env_var
|
27
|
-
def create_env_var(application_name_or_id, env_var)
|
28
|
-
app_guid = app_guid(application_name_or_id)
|
29
|
-
|
30
|
-
|
31
|
-
set_var(app_guid, env_var[:key].to_sym, env_var[:value])
|
32
|
-
end
|
33
|
-
|
34
|
-
# @see Stub#update_env_var
|
35
|
-
def update_env_var(application_name_or_id, env_var_key, env_var)
|
36
|
-
app_guid = app_guid(application_name_or_id)
|
37
|
-
|
38
|
-
|
39
|
-
set_var(app_guid, env_var_key.to_sym, env_var[:value])
|
40
|
-
end
|
41
|
-
|
42
|
-
# @see Stub#delete_env_var
|
43
|
-
def delete_env_var(application_name_or_id, env_var_key)
|
44
|
-
app_guid = app_guid(application_name_or_id)
|
45
|
-
|
46
|
-
|
47
|
-
request_body = get("/v2/apps/#{app_guid}/env").body[:environment_json]
|
48
|
-
request_body.delete(env_var_key.to_sym)
|
49
|
-
put("/v2/apps/#{app_guid}", body: { environment_json: request_body }).body[:entity][:environment_json]
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
# Set the variable value (create or update) and include all already existing variables
|
55
|
-
# to protect them from being deleted.
|
56
|
-
# @param [String] app_guid GUID of the CF application
|
57
|
-
# @param [Symbol] key variable key name
|
58
|
-
# @param [String, Integer, Float, Double] value value to apply to the variable
|
59
|
-
# @return [Hash] Nucleus representation of the modified variable
|
60
|
-
def set_var(app_guid, key, value)
|
61
|
-
request_body = get("/v2/apps/#{app_guid}/env").body[:environment_json]
|
62
|
-
request_body[key] = value
|
63
|
-
vars = put("/v2/apps/#{app_guid}", body: { environment_json: request_body }).body[:entity]
|
64
|
-
{ id: key, key: key, value: vars[:environment_json][key] }
|
65
|
-
end
|
66
|
-
|
67
|
-
# Checks if a variable with the env_var_key already exists.
|
68
|
-
# @param [String] app_guid GUID of the CF application
|
69
|
-
# @param [Symbol] env_var_key key name that shall be checked for existence
|
70
|
-
# @param [Hash] all_vars collection of currently existing variables for the application
|
71
|
-
# @return [Boolean] true if there is a variable with the env_var_key, otherwise false
|
72
|
-
def env_var?(app_guid, env_var_key, all_vars = nil)
|
73
|
-
all_vars = get("/v2/apps/#{app_guid}/env").body[:environment_json] if all_vars.nil?
|
74
|
-
all_vars.key? env_var_key.to_sym
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
1
|
+
module Nucleus
|
2
|
+
module Adapters
|
3
|
+
module V1
|
4
|
+
class CloudFoundryV2 < Stub
|
5
|
+
module Vars
|
6
|
+
# @see Stub#env_vars
|
7
|
+
def env_vars(application_name_or_id)
|
8
|
+
app_guid = app_guid(application_name_or_id)
|
9
|
+
app_vars = get("/v2/apps/#{app_guid}/env").body[:environment_json]
|
10
|
+
formatted_vars = []
|
11
|
+
app_vars.each do |key, value|
|
12
|
+
formatted_vars.push(id: key, key: key, value: value)
|
13
|
+
end
|
14
|
+
formatted_vars
|
15
|
+
end
|
16
|
+
|
17
|
+
# @see Stub#env_var
|
18
|
+
def env_var(application_name_or_id, env_var_key)
|
19
|
+
app_guid = app_guid(application_name_or_id)
|
20
|
+
all_vars = get("/v2/apps/#{app_guid}/env").body[:environment_json]
|
21
|
+
raise Errors::AdapterResourceNotFoundError,
|
22
|
+
"Env. var key '#{env_var_key}' does not exist" unless env_var?(app_guid, env_var_key, all_vars)
|
23
|
+
{ id: env_var_key, key: env_var_key, value: all_vars[env_var_key.to_sym] }
|
24
|
+
end
|
25
|
+
|
26
|
+
# @see Stub#create_env_var
|
27
|
+
def create_env_var(application_name_or_id, env_var)
|
28
|
+
app_guid = app_guid(application_name_or_id)
|
29
|
+
raise Errors::SemanticAdapterRequestError,
|
30
|
+
"Env. var key '#{env_var[:key]}' already taken" if env_var?(app_guid, env_var[:key])
|
31
|
+
set_var(app_guid, env_var[:key].to_sym, env_var[:value])
|
32
|
+
end
|
33
|
+
|
34
|
+
# @see Stub#update_env_var
|
35
|
+
def update_env_var(application_name_or_id, env_var_key, env_var)
|
36
|
+
app_guid = app_guid(application_name_or_id)
|
37
|
+
raise Errors::AdapterResourceNotFoundError,
|
38
|
+
"Env. var key '#{env_var_key}' does not exist" unless env_var?(app_guid, env_var_key)
|
39
|
+
set_var(app_guid, env_var_key.to_sym, env_var[:value])
|
40
|
+
end
|
41
|
+
|
42
|
+
# @see Stub#delete_env_var
|
43
|
+
def delete_env_var(application_name_or_id, env_var_key)
|
44
|
+
app_guid = app_guid(application_name_or_id)
|
45
|
+
raise Errors::AdapterResourceNotFoundError,
|
46
|
+
"Env. var key '#{env_var_key}' does not exist" unless env_var?(app_guid, env_var_key)
|
47
|
+
request_body = get("/v2/apps/#{app_guid}/env").body[:environment_json]
|
48
|
+
request_body.delete(env_var_key.to_sym)
|
49
|
+
put("/v2/apps/#{app_guid}", body: { environment_json: request_body }).body[:entity][:environment_json]
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# Set the variable value (create or update) and include all already existing variables
|
55
|
+
# to protect them from being deleted.
|
56
|
+
# @param [String] app_guid GUID of the CF application
|
57
|
+
# @param [Symbol] key variable key name
|
58
|
+
# @param [String, Integer, Float, Double] value value to apply to the variable
|
59
|
+
# @return [Hash] Nucleus representation of the modified variable
|
60
|
+
def set_var(app_guid, key, value)
|
61
|
+
request_body = get("/v2/apps/#{app_guid}/env").body[:environment_json]
|
62
|
+
request_body[key] = value
|
63
|
+
vars = put("/v2/apps/#{app_guid}", body: { environment_json: request_body }).body[:entity]
|
64
|
+
{ id: key, key: key, value: vars[:environment_json][key] }
|
65
|
+
end
|
66
|
+
|
67
|
+
# Checks if a variable with the env_var_key already exists.
|
68
|
+
# @param [String] app_guid GUID of the CF application
|
69
|
+
# @param [Symbol] env_var_key key name that shall be checked for existence
|
70
|
+
# @param [Hash] all_vars collection of currently existing variables for the application
|
71
|
+
# @return [Boolean] true if there is a variable with the env_var_key, otherwise false
|
72
|
+
def env_var?(app_guid, env_var_key, all_vars = nil)
|
73
|
+
all_vars = get("/v2/apps/#{app_guid}/env").body[:environment_json] if all_vars.nil?
|
74
|
+
all_vars.key? env_var_key.to_sym
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|