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
@@ -1,65 +1,65 @@
|
|
1
|
-
module Nucleus
|
2
|
-
module Adapters
|
3
|
-
module V1
|
4
|
-
class Heroku < Stub
|
5
|
-
module Vars
|
6
|
-
# @see Stub#env_vars
|
7
|
-
def env_vars(application_id)
|
8
|
-
all_vars = get("/apps/#{application_id}/config-vars").body
|
9
|
-
formatted_vars = []
|
10
|
-
all_vars.each do |key, value|
|
11
|
-
formatted_vars.push(id: key, key: key, value: value)
|
12
|
-
end
|
13
|
-
formatted_vars
|
14
|
-
end
|
15
|
-
|
16
|
-
# @see Stub#env_var
|
17
|
-
def env_var(application_id, env_var_key)
|
18
|
-
all_vars = get("/apps/#{application_id}/config-vars").body
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
{ id: env_var_key, key: env_var_key, value: all_vars[env_var_key.to_sym] }
|
23
|
-
end
|
24
|
-
|
25
|
-
# @see Stub#create_env_var
|
26
|
-
def create_env_var(application_id, env_var)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
request_body = { env_var[:key] => env_var[:value] }
|
31
|
-
all_vars = patch("/apps/#{application_id}/config-vars", body: request_body).body
|
32
|
-
{ id: env_var[:key], key: env_var[:key], value: all_vars[env_var[:key].to_sym] }
|
33
|
-
end
|
34
|
-
|
35
|
-
# @see Stub#update_env_var
|
36
|
-
def update_env_var(application_id, env_var_key, env_var)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
request_body = { env_var_key => env_var[:value] }
|
41
|
-
updated_vars = patch("/apps/#{application_id}/config-vars", body: request_body).body
|
42
|
-
{ id: env_var_key, key: env_var_key, value: updated_vars[env_var_key.to_sym] }
|
43
|
-
end
|
44
|
-
|
45
|
-
# @see Stub#delete_env_var
|
46
|
-
def delete_env_var(application_id, env_var_key)
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
# vars can be deleted by setting them to null / nil
|
51
|
-
request_body = { env_var_key => nil }
|
52
|
-
patch("/apps/#{application_id}/config-vars", body: request_body).body
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def env_var?(application_id, env_var_key, all_vars = nil)
|
58
|
-
all_vars = get("/apps/#{application_id}/config-vars").body if all_vars.nil?
|
59
|
-
all_vars.key? env_var_key.to_sym
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
1
|
+
module Nucleus
|
2
|
+
module Adapters
|
3
|
+
module V1
|
4
|
+
class Heroku < Stub
|
5
|
+
module Vars
|
6
|
+
# @see Stub#env_vars
|
7
|
+
def env_vars(application_id)
|
8
|
+
all_vars = get("/apps/#{application_id}/config-vars").body
|
9
|
+
formatted_vars = []
|
10
|
+
all_vars.each do |key, value|
|
11
|
+
formatted_vars.push(id: key, key: key, value: value)
|
12
|
+
end
|
13
|
+
formatted_vars
|
14
|
+
end
|
15
|
+
|
16
|
+
# @see Stub#env_var
|
17
|
+
def env_var(application_id, env_var_key)
|
18
|
+
all_vars = get("/apps/#{application_id}/config-vars").body
|
19
|
+
raise Errors::AdapterResourceNotFoundError,
|
20
|
+
"Env. var key '#{env_var_key}' does not exist" unless env_var?(application_id, env_var_key, all_vars)
|
21
|
+
|
22
|
+
{ id: env_var_key, key: env_var_key, value: all_vars[env_var_key.to_sym] }
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see Stub#create_env_var
|
26
|
+
def create_env_var(application_id, env_var)
|
27
|
+
raise Errors::SemanticAdapterRequestError,
|
28
|
+
"Env. var key '#{env_var[:key]}' already taken" if env_var?(application_id, env_var[:key])
|
29
|
+
|
30
|
+
request_body = { env_var[:key] => env_var[:value] }
|
31
|
+
all_vars = patch("/apps/#{application_id}/config-vars", body: request_body).body
|
32
|
+
{ id: env_var[:key], key: env_var[:key], value: all_vars[env_var[:key].to_sym] }
|
33
|
+
end
|
34
|
+
|
35
|
+
# @see Stub#update_env_var
|
36
|
+
def update_env_var(application_id, env_var_key, env_var)
|
37
|
+
raise Errors::AdapterResourceNotFoundError,
|
38
|
+
"Env. var key '#{env_var_key}' does not exist" unless env_var?(application_id, env_var_key)
|
39
|
+
|
40
|
+
request_body = { env_var_key => env_var[:value] }
|
41
|
+
updated_vars = patch("/apps/#{application_id}/config-vars", body: request_body).body
|
42
|
+
{ id: env_var_key, key: env_var_key, value: updated_vars[env_var_key.to_sym] }
|
43
|
+
end
|
44
|
+
|
45
|
+
# @see Stub#delete_env_var
|
46
|
+
def delete_env_var(application_id, env_var_key)
|
47
|
+
raise Errors::AdapterResourceNotFoundError,
|
48
|
+
"Env. var key '#{env_var_key}' does not exist" unless env_var?(application_id, env_var_key)
|
49
|
+
|
50
|
+
# vars can be deleted by setting them to null / nil
|
51
|
+
request_body = { env_var_key => nil }
|
52
|
+
patch("/apps/#{application_id}/config-vars", body: request_body).body
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def env_var?(application_id, env_var_key, all_vars = nil)
|
58
|
+
all_vars = get("/apps/#{application_id}/config-vars").body if all_vars.nil?
|
59
|
+
all_vars.key? env_var_key.to_sym
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,68 +1,68 @@
|
|
1
|
-
module Nucleus
|
2
|
-
module Adapters
|
3
|
-
module V1
|
4
|
-
class OpenshiftV2 < Stub
|
5
|
-
module AppStates
|
6
|
-
# Determine the current state of the application in the Nucleus lifecycle.
|
7
|
-
# @return [Symbol] application state according to {Nucleus::Enums::ApplicationStates}
|
8
|
-
def application_state(app, gear_groups = nil, deployments = nil)
|
9
|
-
deployments = load_deployments(app[:id]) unless deployments
|
10
|
-
gear_groups = load_gears(app[:id]) unless gear_groups
|
11
|
-
|
12
|
-
return :created if state_created?(app, gear_groups, deployments)
|
13
|
-
return :deployed if state_deployed?(app, gear_groups, deployments)
|
14
|
-
return :running if gear_groups[0][:gears].any? { |gear| gear[:state] == 'started' }
|
15
|
-
return :stopped if gear_groups[0][:gears].all? { |gear| gear[:state] == 'stopped' }
|
16
|
-
return :idle if gear_groups[0][:gears].all? { |gear| gear[:state] == 'idle' }
|
17
|
-
|
18
|
-
log.debug("Failed to determine state for: #{app}")
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def state_created?(app, gear_groups, deployments)
|
26
|
-
# this state exists, but only within the first seconds before the original deployment is applied
|
27
|
-
return true if gear_groups[0][:gears].all? { |gear| gear[:state] == 'new' }
|
28
|
-
|
29
|
-
if app[:keep_deployments].to_i > 1
|
30
|
-
if deployments.length == 1
|
31
|
-
original_os_deployment = original_deployment(app, deployments)
|
32
|
-
currently_activated = active_deployment(app, deployments)
|
33
|
-
# if the current deployment still is the default, the state must be :created
|
34
|
-
return true if original_os_deployment && original_os_deployment[:id] == currently_activated[:id]
|
35
|
-
end
|
36
|
-
# if there is more than 1 deployment, state can't be :created
|
37
|
-
else
|
38
|
-
# app was not created with nucleus or has recently been modified :/
|
39
|
-
diff = Time.parse(deployments[0][:created_at]).to_i - Time.parse(app[:creation_time]).to_i
|
40
|
-
# we can analyse if the deployment was created within 15 seconds after the application,
|
41
|
-
# then there can't possibly be an actual code deployment
|
42
|
-
return true if diff.abs < 15
|
43
|
-
end
|
44
|
-
# does not seem to be in state :created
|
45
|
-
false
|
46
|
-
end
|
47
|
-
|
48
|
-
def state_deployed?(app, gear_groups, deployments)
|
49
|
-
# Gears must all be stopped
|
50
|
-
return false unless gear_groups[0][:gears].all? { |gear| gear[:state] == 'stopped' }
|
51
|
-
|
52
|
-
deployments = load_deployments(app[:id]) unless deployments
|
53
|
-
|
54
|
-
# If there still is the initial deployment, then the state can be deployed.
|
55
|
-
original_os_deployment = original_deployment(app, deployments) unless original_os_deployment
|
56
|
-
return false unless original_os_deployment
|
57
|
-
|
58
|
-
activations = deployments.inject(0) { |a, e| a + e[:activations].length }
|
59
|
-
# deduct the activations of the original deployment
|
60
|
-
activations -= original_os_deployment[:activations].length
|
61
|
-
return false if activations > 1
|
62
|
-
true
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
1
|
+
module Nucleus
|
2
|
+
module Adapters
|
3
|
+
module V1
|
4
|
+
class OpenshiftV2 < Stub
|
5
|
+
module AppStates
|
6
|
+
# Determine the current state of the application in the Nucleus lifecycle.
|
7
|
+
# @return [Symbol] application state according to {Nucleus::Enums::ApplicationStates}
|
8
|
+
def application_state(app, gear_groups = nil, deployments = nil)
|
9
|
+
deployments = load_deployments(app[:id]) unless deployments
|
10
|
+
gear_groups = load_gears(app[:id]) unless gear_groups
|
11
|
+
|
12
|
+
return :created if state_created?(app, gear_groups, deployments)
|
13
|
+
return :deployed if state_deployed?(app, gear_groups, deployments)
|
14
|
+
return :running if gear_groups[0][:gears].any? { |gear| gear[:state] == 'started' }
|
15
|
+
return :stopped if gear_groups[0][:gears].all? { |gear| gear[:state] == 'stopped' }
|
16
|
+
return :idle if gear_groups[0][:gears].all? { |gear| gear[:state] == 'idle' }
|
17
|
+
|
18
|
+
log.debug("Failed to determine state for: #{app}")
|
19
|
+
raise Errors::UnknownAdapterCallError,
|
20
|
+
'Could not determine app state. Please verify the Openshift V2 adapter'
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def state_created?(app, gear_groups, deployments)
|
26
|
+
# this state exists, but only within the first seconds before the original deployment is applied
|
27
|
+
return true if gear_groups[0][:gears].all? { |gear| gear[:state] == 'new' }
|
28
|
+
|
29
|
+
if app[:keep_deployments].to_i > 1
|
30
|
+
if deployments.length == 1
|
31
|
+
original_os_deployment = original_deployment(app, deployments)
|
32
|
+
currently_activated = active_deployment(app, deployments)
|
33
|
+
# if the current deployment still is the default, the state must be :created
|
34
|
+
return true if original_os_deployment && original_os_deployment[:id] == currently_activated[:id]
|
35
|
+
end
|
36
|
+
# if there is more than 1 deployment, state can't be :created
|
37
|
+
else
|
38
|
+
# app was not created with nucleus or has recently been modified :/
|
39
|
+
diff = Time.parse(deployments[0][:created_at]).to_i - Time.parse(app[:creation_time]).to_i
|
40
|
+
# we can analyse if the deployment was created within 15 seconds after the application,
|
41
|
+
# then there can't possibly be an actual code deployment
|
42
|
+
return true if diff.abs < 15
|
43
|
+
end
|
44
|
+
# does not seem to be in state :created
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
def state_deployed?(app, gear_groups, deployments)
|
49
|
+
# Gears must all be stopped
|
50
|
+
return false unless gear_groups[0][:gears].all? { |gear| gear[:state] == 'stopped' }
|
51
|
+
|
52
|
+
deployments = load_deployments(app[:id]) unless deployments
|
53
|
+
|
54
|
+
# If there still is the initial deployment, then the state can be deployed.
|
55
|
+
original_os_deployment = original_deployment(app, deployments) unless original_os_deployment
|
56
|
+
return false unless original_os_deployment
|
57
|
+
|
58
|
+
activations = deployments.inject(0) { |a, e| a + e[:activations].length }
|
59
|
+
# deduct the activations of the original deployment
|
60
|
+
activations -= original_os_deployment[:activations].length
|
61
|
+
return false if activations > 1
|
62
|
+
true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -18,7 +18,7 @@ module Nucleus
|
|
18
18
|
def create_application(application_entity)
|
19
19
|
# handle runtimes / cartridges
|
20
20
|
fail_with(:only_one_runtime) if application_entity[:runtimes].length > 1
|
21
|
-
fail_with(:must_have_runtime) if application_entity[:runtimes].
|
21
|
+
fail_with(:must_have_runtime) if application_entity[:runtimes].empty?
|
22
22
|
application_entity[:cartridge] = cartridge(application_entity.delete(:runtimes)[0])
|
23
23
|
|
24
24
|
# updates the application with a valid region identity
|
@@ -1,96 +1,96 @@
|
|
1
|
-
module Nucleus
|
2
|
-
module Adapters
|
3
|
-
module V1
|
4
|
-
class OpenshiftV2 < Stub
|
5
|
-
module Data
|
6
|
-
# @see Stub#deploy
|
7
|
-
def deploy(application_id, file, file_compression_format)
|
8
|
-
app_id = app_id_by_name(application_id)
|
9
|
-
app = get("/application/#{app_id}").body[:data]
|
10
|
-
app_state = application_state(app)
|
11
|
-
account = get('/user').body[:data]
|
12
|
-
repo_name = "nucleus.app.repo.openshift_v2.deploy.#{application_id}.#{SecureRandom.uuid}"
|
13
|
-
# clone, extract, push and finally delete cloned repository (sync)
|
14
|
-
with_ssh_key do
|
15
|
-
GitDeployer.new(repo_name, app[:git_url], account[:email]).deploy(file, file_compression_format)
|
16
|
-
end
|
17
|
-
|
18
|
-
# auto deployment could be active for applications not created with Nucleus
|
19
|
-
return if app[:auto_deploy]
|
20
|
-
|
21
|
-
build_deployment(app_id)
|
22
|
-
|
23
|
-
return unless app_state == Enums::ApplicationStates::CREATED
|
24
|
-
|
25
|
-
# and finally stop so we don't get to see the sample application and switch to the deployed state
|
26
|
-
send_event(application_id, 'stop')
|
27
|
-
end
|
28
|
-
|
29
|
-
# @see Stub#download
|
30
|
-
def download(application_id, compression_format)
|
31
|
-
# Only possible with git
|
32
|
-
app = get("/application/#{app_id_by_name(application_id)}").body[:data]
|
33
|
-
if application_state(app) == Enums::ApplicationStates::CREATED
|
34
|
-
|
35
|
-
end
|
36
|
-
# compress files to archive but exclude the .git repo
|
37
|
-
repo_name = "nucleus.app.repo.openshift_v2.download.#{application_id}.#{SecureRandom.uuid}"
|
38
|
-
with_ssh_key do
|
39
|
-
GitDeployer.new(repo_name, app[:git_url], nil).download(compression_format, true)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# @see Stub#rebuild
|
44
|
-
def rebuild(application_id)
|
45
|
-
app_id = app_id_by_name(application_id)
|
46
|
-
app = get("/application/#{app_id}").body[:data]
|
47
|
-
if application_state(app) == Enums::ApplicationStates::CREATED
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
account = get('/user').body[:data]
|
52
|
-
repo_name = "nucleus.app.repo.openshift_v2.rebuild.#{application_id}.#{SecureRandom.uuid}"
|
53
|
-
|
54
|
-
with_ssh_key do
|
55
|
-
GitDeployer.new(repo_name, app[:git_url], account[:email]).trigger_build
|
56
|
-
end
|
57
|
-
|
58
|
-
# if auto deployment ist disabled, we must also trigger a clean build
|
59
|
-
build_deployment(app_id) unless app[:auto_deploy]
|
60
|
-
|
61
|
-
# return with updated application
|
62
|
-
application(application_id)
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def build_deployment(app_id)
|
68
|
-
# deploy
|
69
|
-
post("/application/#{app_id}/deployments", body: { force_clean_build: true })
|
70
|
-
end
|
71
|
-
|
72
|
-
def with_ssh_key
|
73
|
-
# 409 Conflict:
|
74
|
-
# - 120: SSH key with name #{name} already exists. Use a different name or delete conflicting key and retry
|
75
|
-
# - 121: Given public key is already in use. Use different key or delete conflicting key and retry.
|
76
|
-
|
77
|
-
# load ssh key into Openshift
|
78
|
-
matches = nucleus_config.ssh.handler.public_key.match(/(.*)\s{1}(.*)\s{1}(.*)/)
|
79
|
-
key_name = register_key(matches[1], matches[2])
|
80
|
-
return yield
|
81
|
-
ensure
|
82
|
-
# unload ssh key, allow 404 if the key couldn't be registered at first
|
83
|
-
delete("/user/keys/#{key_name}", expects: [200, 204, 404]) if key_name
|
84
|
-
end
|
85
|
-
|
86
|
-
def register_key(type, key)
|
87
|
-
key_name = "nucleus-#{SecureRandom.uuid}"
|
88
|
-
# ignore if the key was already assigned to a different name (status == 409 && exit_code == 121)
|
89
|
-
post('/user/keys', body: { name: key_name, type: type, content: key }, expects: [201, 409])
|
90
|
-
key_name
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
1
|
+
module Nucleus
|
2
|
+
module Adapters
|
3
|
+
module V1
|
4
|
+
class OpenshiftV2 < Stub
|
5
|
+
module Data
|
6
|
+
# @see Stub#deploy
|
7
|
+
def deploy(application_id, file, file_compression_format)
|
8
|
+
app_id = app_id_by_name(application_id)
|
9
|
+
app = get("/application/#{app_id}").body[:data]
|
10
|
+
app_state = application_state(app)
|
11
|
+
account = get('/user').body[:data]
|
12
|
+
repo_name = "nucleus.app.repo.openshift_v2.deploy.#{application_id}.#{SecureRandom.uuid}"
|
13
|
+
# clone, extract, push and finally delete cloned repository (sync)
|
14
|
+
with_ssh_key do
|
15
|
+
GitDeployer.new(repo_name, app[:git_url], account[:email]).deploy(file, file_compression_format)
|
16
|
+
end
|
17
|
+
|
18
|
+
# auto deployment could be active for applications not created with Nucleus
|
19
|
+
return if app[:auto_deploy]
|
20
|
+
|
21
|
+
build_deployment(app_id)
|
22
|
+
|
23
|
+
return unless app_state == Enums::ApplicationStates::CREATED
|
24
|
+
|
25
|
+
# and finally stop so we don't get to see the sample application and switch to the deployed state
|
26
|
+
send_event(application_id, 'stop')
|
27
|
+
end
|
28
|
+
|
29
|
+
# @see Stub#download
|
30
|
+
def download(application_id, compression_format)
|
31
|
+
# Only possible with git
|
32
|
+
app = get("/application/#{app_id_by_name(application_id)}").body[:data]
|
33
|
+
if application_state(app) == Enums::ApplicationStates::CREATED
|
34
|
+
raise Errors::SemanticAdapterRequestError, 'Application must be deployed before data can be downloaded'
|
35
|
+
end
|
36
|
+
# compress files to archive but exclude the .git repo
|
37
|
+
repo_name = "nucleus.app.repo.openshift_v2.download.#{application_id}.#{SecureRandom.uuid}"
|
38
|
+
with_ssh_key do
|
39
|
+
GitDeployer.new(repo_name, app[:git_url], nil).download(compression_format, true)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# @see Stub#rebuild
|
44
|
+
def rebuild(application_id)
|
45
|
+
app_id = app_id_by_name(application_id)
|
46
|
+
app = get("/application/#{app_id}").body[:data]
|
47
|
+
if application_state(app) == Enums::ApplicationStates::CREATED
|
48
|
+
raise Errors::SemanticAdapterRequestError, 'Application must be deployed before data can be rebuild'
|
49
|
+
end
|
50
|
+
|
51
|
+
account = get('/user').body[:data]
|
52
|
+
repo_name = "nucleus.app.repo.openshift_v2.rebuild.#{application_id}.#{SecureRandom.uuid}"
|
53
|
+
|
54
|
+
with_ssh_key do
|
55
|
+
GitDeployer.new(repo_name, app[:git_url], account[:email]).trigger_build
|
56
|
+
end
|
57
|
+
|
58
|
+
# if auto deployment ist disabled, we must also trigger a clean build
|
59
|
+
build_deployment(app_id) unless app[:auto_deploy]
|
60
|
+
|
61
|
+
# return with updated application
|
62
|
+
application(application_id)
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def build_deployment(app_id)
|
68
|
+
# deploy
|
69
|
+
post("/application/#{app_id}/deployments", body: { force_clean_build: true })
|
70
|
+
end
|
71
|
+
|
72
|
+
def with_ssh_key
|
73
|
+
# 409 Conflict:
|
74
|
+
# - 120: SSH key with name #{name} already exists. Use a different name or delete conflicting key and retry
|
75
|
+
# - 121: Given public key is already in use. Use different key or delete conflicting key and retry.
|
76
|
+
|
77
|
+
# load ssh key into Openshift
|
78
|
+
matches = nucleus_config.ssh.handler.public_key.match(/(.*)\s{1}(.*)\s{1}(.*)/)
|
79
|
+
key_name = register_key(matches[1], matches[2])
|
80
|
+
return yield
|
81
|
+
ensure
|
82
|
+
# unload ssh key, allow 404 if the key couldn't be registered at first
|
83
|
+
delete("/user/keys/#{key_name}", expects: [200, 204, 404]) if key_name
|
84
|
+
end
|
85
|
+
|
86
|
+
def register_key(type, key)
|
87
|
+
key_name = "nucleus-#{SecureRandom.uuid}"
|
88
|
+
# ignore if the key was already assigned to a different name (status == 409 && exit_code == 121)
|
89
|
+
post('/user/keys', body: { name: key_name, type: type, content: key }, expects: [201, 409])
|
90
|
+
key_name
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|