corl 0.5.15 → 0.5.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/corl.gemspec +11 -3
- data/lib/core/plugin/agent.rb +12 -6
- data/lib/core/plugin/agent_wrapper.rb +26 -0
- data/lib/core/plugin/cloud_action_wrapper.rb +26 -0
- data/lib/core/plugin/configuration.rb +2 -0
- data/lib/core/plugin/node.rb +53 -19
- data/lib/corl.rb +49 -47
- data/lib/nucleon/action/agent/manager.rb +75 -0
- data/lib/nucleon/action/node/agent/status.rb +53 -0
- data/lib/nucleon/action/node/agent/stop.rb +44 -0
- data/lib/nucleon/action/node/agents.rb +44 -0
- data/lib/nucleon/action/node/download.rb +82 -0
- data/lib/nucleon/action/node/upload.rb +83 -0
- data/locales/en.yml +30 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6525066ff89087597683642d763aaf33dc8d4f30
|
4
|
+
data.tar.gz: 4d6ffa51014c3f8316a118ef6f5b8476da2e0b0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 668c3569ee4d16da744d12da994f72565fa0b01b90c254359b5315fe28c7d5d313d351b8d3e061d45b5cfd3e316aed13522da50812aab605ba2774c6de72dee2
|
7
|
+
data.tar.gz: b4b76ae9c30d0993a305ce6f872159861bdbd898763f66bb614a20d16def26556e1feb717050834fa13bf63d4cc01f080794f6c3a45acc53b27aafc213ccf636
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.16
|
data/corl.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: corl 0.5.
|
5
|
+
# stub: corl 0.5.16 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "corl"
|
9
|
-
s.version = "0.5.
|
9
|
+
s.version = "0.5.16"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Adrian Webb"]
|
14
|
-
s.date = "2015-02-
|
14
|
+
s.date = "2015-02-26"
|
15
15
|
s.description = "Framework that provides a simple foundation for growing organically in the cloud"
|
16
16
|
s.email = "adrian.webb@coralnexus.com"
|
17
17
|
s.executables = ["corl"]
|
@@ -78,8 +78,10 @@ Gem::Specification.new do |s|
|
|
78
78
|
"lib/core/mod/fog_rackspace_server.rb",
|
79
79
|
"lib/core/mod/hiera_backend.rb",
|
80
80
|
"lib/core/plugin/agent.rb",
|
81
|
+
"lib/core/plugin/agent_wrapper.rb",
|
81
82
|
"lib/core/plugin/builder.rb",
|
82
83
|
"lib/core/plugin/cloud_action.rb",
|
84
|
+
"lib/core/plugin/cloud_action_wrapper.rb",
|
83
85
|
"lib/core/plugin/configuration.rb",
|
84
86
|
"lib/core/plugin/fog_machine.rb",
|
85
87
|
"lib/core/plugin/fog_node.rb",
|
@@ -106,6 +108,7 @@ Gem::Specification.new do |s|
|
|
106
108
|
"lib/facter/custom_facts.rb",
|
107
109
|
"lib/facter/vagrant_exists.rb",
|
108
110
|
"lib/hiera/corl_logger.rb",
|
111
|
+
"lib/nucleon/action/agent/manager.rb",
|
109
112
|
"lib/nucleon/action/network/config.rb",
|
110
113
|
"lib/nucleon/action/network/create.rb",
|
111
114
|
"lib/nucleon/action/network/images.rb",
|
@@ -117,11 +120,15 @@ Gem::Specification.new do |s|
|
|
117
120
|
"lib/nucleon/action/network/vagrantfile.rb",
|
118
121
|
"lib/nucleon/action/node/IP.rb",
|
119
122
|
"lib/nucleon/action/node/SSH.rb",
|
123
|
+
"lib/nucleon/action/node/agent/status.rb",
|
124
|
+
"lib/nucleon/action/node/agent/stop.rb",
|
125
|
+
"lib/nucleon/action/node/agents.rb",
|
120
126
|
"lib/nucleon/action/node/authorize.rb",
|
121
127
|
"lib/nucleon/action/node/bootstrap.rb",
|
122
128
|
"lib/nucleon/action/node/build.rb",
|
123
129
|
"lib/nucleon/action/node/cache.rb",
|
124
130
|
"lib/nucleon/action/node/destroy.rb",
|
131
|
+
"lib/nucleon/action/node/download.rb",
|
125
132
|
"lib/nucleon/action/node/exec.rb",
|
126
133
|
"lib/nucleon/action/node/fact.rb",
|
127
134
|
"lib/nucleon/action/node/facts.rb",
|
@@ -139,6 +146,7 @@ Gem::Specification.new do |s|
|
|
139
146
|
"lib/nucleon/action/node/start.rb",
|
140
147
|
"lib/nucleon/action/node/status.rb",
|
141
148
|
"lib/nucleon/action/node/stop.rb",
|
149
|
+
"lib/nucleon/action/node/upload.rb",
|
142
150
|
"lib/nucleon/action/plugin/create.rb",
|
143
151
|
"lib/nucleon/action/plugin/list.rb",
|
144
152
|
"lib/nucleon/action/plugins.rb",
|
data/lib/core/plugin/agent.rb
CHANGED
@@ -59,12 +59,11 @@ class Agent < Nucleon.plugin_class(:nucleon, :cloud_action)
|
|
59
59
|
def execute(use_network = true, &block)
|
60
60
|
super do |node|
|
61
61
|
ensure_network do
|
62
|
-
add_agent(node)
|
63
|
-
|
64
62
|
trap(:INT) do
|
65
63
|
safe_exit
|
66
64
|
end
|
67
65
|
|
66
|
+
add_agent(node)
|
68
67
|
block.call(node)
|
69
68
|
remove_agent(node) if myself.status == code.success
|
70
69
|
end
|
@@ -75,12 +74,19 @@ class Agent < Nucleon.plugin_class(:nucleon, :cloud_action)
|
|
75
74
|
# Utilities
|
76
75
|
|
77
76
|
def add_agent(node)
|
78
|
-
|
77
|
+
args = []
|
78
|
+
|
79
|
+
ARGV.each do |arg|
|
80
|
+
args << ( arg =~ /^\-/ ? arg : "'#{arg}'" )
|
81
|
+
end
|
79
82
|
|
80
|
-
|
81
|
-
|
83
|
+
agent_config = Config.new({
|
84
|
+
:pid => Process.pid,
|
85
|
+
:args => args.join(' ')
|
86
|
+
}).import(Util::Data.clean(settings.export))
|
82
87
|
|
83
|
-
|
88
|
+
agent_config = Util::Data.rm_keys(agent_config.export, [ :node_provider, :nodes, :color, :version ])
|
89
|
+
node.add_agent(plugin_provider, agent_config)
|
84
90
|
end
|
85
91
|
protected :add_agent
|
86
92
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
nucleon_require(File.dirname(__FILE__), :agent)
|
3
|
+
|
4
|
+
#---
|
5
|
+
|
6
|
+
module Nucleon
|
7
|
+
module Plugin
|
8
|
+
class AgentWrapper < Nucleon.plugin_class(:nucleon, :agent)
|
9
|
+
|
10
|
+
#-----------------------------------------------------------------------------
|
11
|
+
# Operations
|
12
|
+
|
13
|
+
def execute(use_network = true, &block)
|
14
|
+
super do |node|
|
15
|
+
bin_dir = File.join(network.directory, 'bin')
|
16
|
+
bin_dir = ( File.directory?(bin_dir) ? bin_dir : network.directory )
|
17
|
+
|
18
|
+
Dir.chdir(bin_dir) do
|
19
|
+
result = node.exec({ :commands => [ block.call(node) ] }).first
|
20
|
+
myself.status = result.status
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
nucleon_require(File.dirname(__FILE__), :cloud_action)
|
3
|
+
|
4
|
+
#---
|
5
|
+
|
6
|
+
module Nucleon
|
7
|
+
module Plugin
|
8
|
+
class CloudActionWrapper < Nucleon.plugin_class(:nucleon, :cloud_action)
|
9
|
+
|
10
|
+
#-----------------------------------------------------------------------------
|
11
|
+
# Operations
|
12
|
+
|
13
|
+
def execute(use_network = true, &block)
|
14
|
+
super do |node|
|
15
|
+
bin_dir = File.join(network.directory, 'bin')
|
16
|
+
bin_dir = ( File.directory?(bin_dir) ? bin_dir : network.directory )
|
17
|
+
|
18
|
+
Dir.chdir(bin_dir) do
|
19
|
+
result = node.exec({ :commands => [ block.call(node) ] }).first
|
20
|
+
myself.status = result.status
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -176,6 +176,7 @@ class Configuration < Nucleon.plugin_class(:nucleon, :base)
|
|
176
176
|
config.import(properties, method_config)
|
177
177
|
end
|
178
178
|
end
|
179
|
+
success = cache.load if success
|
179
180
|
else
|
180
181
|
logger.warn("Loading of source configuration failed")
|
181
182
|
end
|
@@ -195,6 +196,7 @@ class Configuration < Nucleon.plugin_class(:nucleon, :base)
|
|
195
196
|
|
196
197
|
success = yield(method_config) if block_given?
|
197
198
|
end
|
199
|
+
success = cache.save if success
|
198
200
|
else
|
199
201
|
logger.warn("Can not save source configuration")
|
200
202
|
end
|
data/lib/core/plugin/node.rb
CHANGED
@@ -377,31 +377,63 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
377
377
|
#---
|
378
378
|
|
379
379
|
def agents
|
380
|
-
|
380
|
+
if local?
|
381
|
+
agents = cache_setting([ :agents ], {}, :hash)
|
382
|
+
else
|
383
|
+
agents = remote_cache_setting([ :agents ], {}, :hash)
|
384
|
+
end
|
385
|
+
Util::Data.symbol_map(agents)
|
381
386
|
end
|
382
387
|
|
383
388
|
def agent(provider)
|
384
|
-
|
389
|
+
if local?
|
390
|
+
agent = cache_setting([ :agents, provider ], {}, :hash)
|
391
|
+
else
|
392
|
+
agent = remote_cache_setting([ :agents, provider ], {}, :hash)
|
393
|
+
end
|
394
|
+
Util::Data.symbol_map(agent)
|
385
395
|
end
|
386
396
|
|
387
|
-
def
|
388
|
-
|
397
|
+
def agent_running(provider)
|
398
|
+
if local?
|
399
|
+
agent_options = agent(provider)
|
400
|
+
return false unless agent_options.has_key?(:pid)
|
389
401
|
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
402
|
+
Process.kill(0, agent_options[:pid].to_i)
|
403
|
+
true
|
404
|
+
else
|
405
|
+
result = run.node_agents
|
406
|
+
|
407
|
+
if result.status == code.success
|
408
|
+
result_data = Util::Data.parse_json(result.errors)
|
409
|
+
running = Util::Data.value(result_data[provider.to_s]["running"], false)
|
410
|
+
end
|
411
|
+
return running
|
412
|
+
end
|
413
|
+
rescue Errno::ESRCH # No process (local)
|
414
|
+
false
|
415
|
+
rescue Errno::EPERM # The process exists, but no permission to send signal to it (local)
|
416
|
+
true
|
395
417
|
end
|
396
418
|
|
397
|
-
def
|
398
|
-
|
419
|
+
def add_agent(provider, options)
|
420
|
+
if local?
|
421
|
+
set_cache_setting([ :agents, provider ], Config.new(options).export)
|
422
|
+
else
|
423
|
+
remote_set_cache_setting([ :agents, provider ], Config.new(options).export)
|
424
|
+
end
|
425
|
+
end
|
399
426
|
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
427
|
+
def remove_agent(provider)
|
428
|
+
if local?
|
429
|
+
agent_options = agent(provider)
|
430
|
+
if agent_options && agent_running(provider)
|
431
|
+
Process.kill("SIGINT", agent_options[:pid].to_i)
|
432
|
+
end
|
433
|
+
delete_cache_setting([ :agents, provider ])
|
434
|
+
else
|
435
|
+
remote_delete_cache_setting([ :agents, provider ])
|
436
|
+
end
|
405
437
|
end
|
406
438
|
|
407
439
|
#-----------------------------------------------------------------------------
|
@@ -715,6 +747,7 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
715
747
|
config = Config.ensure(options)
|
716
748
|
hook_config = Config.new({ :local_path => local_path, :remote_path => remote_path, :config => config }, {}, true, false)
|
717
749
|
quiet = config.get(:quiet, false)
|
750
|
+
progress = config.get(:progress, true)
|
718
751
|
|
719
752
|
if extension_check(:download, hook_config)
|
720
753
|
logger.info("Downloading from #{plugin_name}")
|
@@ -725,7 +758,7 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
725
758
|
active_machine = local? ? local_machine : machine
|
726
759
|
|
727
760
|
success = active_machine.download(remote_path, local_path, config.export) do |name, received, total|
|
728
|
-
info("#{name}: Sent #{received} of #{total}", { :i18n => false })
|
761
|
+
info("#{name}: Sent #{received} of #{total}", { :i18n => false }) if progress && ! quiet
|
729
762
|
yield(:progress, { :name => name, :received => received, :total => total })
|
730
763
|
end
|
731
764
|
|
@@ -754,6 +787,7 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
754
787
|
config = Config.ensure(options)
|
755
788
|
hook_config = Config.new({ :local_path => local_path, :remote_path => remote_path, :config => config }, {}, true, false)
|
756
789
|
quiet = config.get(:quiet, false)
|
790
|
+
progress = config.get(:progress, true)
|
757
791
|
|
758
792
|
if extension_check(:upload, hook_config)
|
759
793
|
logger.info("Uploading to #{plugin_name}")
|
@@ -764,7 +798,7 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
764
798
|
active_machine = local? ? local_machine : machine
|
765
799
|
|
766
800
|
success = active_machine.upload(local_path, remote_path, config.export) do |name, sent, total|
|
767
|
-
info("#{name}: Sent #{sent} of #{total}", { :i18n => false })
|
801
|
+
info("#{name}: Sent #{sent} of #{total}", { :i18n => false }) if progress && ! quiet
|
768
802
|
yield(:progress, { :name => name, :sent => sent, :total => total })
|
769
803
|
end
|
770
804
|
|
@@ -788,7 +822,7 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
788
822
|
|
789
823
|
def send_files(local_path, remote_path, files = nil, permission = '0644', options = {}, &code)
|
790
824
|
local_path = File.expand_path(local_path)
|
791
|
-
return false unless File.directory?(local_path)
|
825
|
+
return false unless File.directory?(local_path) || File.exists?(local_path)
|
792
826
|
|
793
827
|
success = true
|
794
828
|
|
data/lib/corl.rb
CHANGED
@@ -42,59 +42,61 @@ vagrant_exists = defined?(Vagrant) == 'constant' && Vagrant.class == Module
|
|
42
42
|
#
|
43
43
|
# For agent options processed here, see lib/core/plugin/agent.rb
|
44
44
|
#
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
45
|
+
unless vagrant_exists
|
46
|
+
action_start_index = 0
|
47
|
+
|
48
|
+
if ARGV[action_start_index].to_sym == :agent
|
49
|
+
remote_exec = false
|
50
|
+
|
51
|
+
log = true
|
52
|
+
truncate_log = true
|
53
|
+
|
54
|
+
log_file = nil
|
55
|
+
agent_provider = []
|
56
|
+
process_log_file_value = false
|
57
|
+
|
58
|
+
first_option_found = false
|
59
|
+
|
60
|
+
# Argument processing
|
61
|
+
ARGV[(action_start_index + 1)..-1].each do |arg|
|
62
|
+
first_option_found = true if arg[0] == '-'
|
63
|
+
|
64
|
+
if arg =~ /^\-\-nodes\=?/
|
65
|
+
remote_exec = true
|
66
|
+
elsif arg == "--no-log"
|
67
|
+
log = false
|
68
|
+
elsif arg == "--no-truncate_log"
|
69
|
+
truncate_log = false
|
70
|
+
elsif arg =~ /^\-\-log_file(?=\=(.*))?/
|
71
|
+
if $1
|
72
|
+
log_file = $1
|
73
|
+
else
|
74
|
+
process_log_file_value = true
|
75
|
+
end
|
76
|
+
elsif process_log_file_value
|
77
|
+
log_file = arg
|
78
|
+
process_log_file_value = false
|
79
|
+
elsif ! first_option_found
|
80
|
+
agent_provider << arg
|
74
81
|
end
|
75
|
-
elsif process_log_file_value
|
76
|
-
log_file = arg
|
77
|
-
process_log_file_value = false
|
78
|
-
elsif ! first_option_found
|
79
|
-
agent_provider << arg
|
80
82
|
end
|
81
|
-
end
|
82
83
|
|
83
|
-
|
84
|
-
|
84
|
+
# TODO: Need better way to share with base agent default log file. (mixin?)
|
85
|
+
log_file = "/var/log/corl/agent_#{agent_provider.join('_')}.log" unless log_file
|
85
86
|
|
86
|
-
|
87
|
-
|
88
|
-
|
87
|
+
unless remote_exec
|
88
|
+
# Daemonize process
|
89
|
+
Process.daemon
|
89
90
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
91
|
+
# Log all output, or not
|
92
|
+
if log
|
93
|
+
FileUtils.mkdir_p('/var/log/corl')
|
94
|
+
File.write(log_file, '') if truncate_log
|
94
95
|
|
95
|
-
|
96
|
-
|
97
|
-
|
96
|
+
$stderr.reopen(log_file, 'a')
|
97
|
+
$stdout.reopen($stderr)
|
98
|
+
$stdout.sync = $stderr.sync = true
|
99
|
+
end
|
98
100
|
end
|
99
101
|
end
|
100
102
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
|
2
|
+
module Nucleon
|
3
|
+
module Action
|
4
|
+
module Agent
|
5
|
+
class Manager < Nucleon.plugin_class(:nucleon, :agent)
|
6
|
+
|
7
|
+
#-----------------------------------------------------------------------------
|
8
|
+
# Info
|
9
|
+
|
10
|
+
def self.describe
|
11
|
+
super(nil, :manager, 1100)
|
12
|
+
end
|
13
|
+
|
14
|
+
#-----------------------------------------------------------------------------
|
15
|
+
# Settings
|
16
|
+
|
17
|
+
def configure
|
18
|
+
super do
|
19
|
+
codes :network_failure
|
20
|
+
|
21
|
+
register_int :sleep_interval, 15
|
22
|
+
register_int :network_retries, 3
|
23
|
+
register_int :agent_restart_retries, 2
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
#---
|
28
|
+
|
29
|
+
def arguments
|
30
|
+
[ :sleep_interval ]
|
31
|
+
end
|
32
|
+
|
33
|
+
#-----------------------------------------------------------------------------
|
34
|
+
# Operations
|
35
|
+
|
36
|
+
def execute
|
37
|
+
super do |node|
|
38
|
+
ensure_node(node) do
|
39
|
+
network_retry = 0
|
40
|
+
agent_restart_retry = {}
|
41
|
+
|
42
|
+
while status == code.success
|
43
|
+
if network.load({ :remote => settings[:net_remote], :pull => true })
|
44
|
+
network_retry = 0
|
45
|
+
|
46
|
+
node.agents.each do |provider, agent_options|
|
47
|
+
agent_restart_retry[provider] = 0 unless agent_restart_retry.has_key?(provider)
|
48
|
+
|
49
|
+
unless provider == :agent_manager || node.agent_running(provider)
|
50
|
+
if agent_restart_retry[provider] < settings[:agent_restart_retries]
|
51
|
+
command = "corl #{agent_options[:args]} --log_level=warn"
|
52
|
+
result = node.exec({ :commands => [ command ] }).first
|
53
|
+
|
54
|
+
if result.status == code.success
|
55
|
+
agent_restart_retry[provider] = 0
|
56
|
+
else
|
57
|
+
agent_restart_retry[provider] += 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
elsif network_retry < settings[:network_retries]
|
63
|
+
network_retry += 1
|
64
|
+
else
|
65
|
+
myself.status = code.network_failure
|
66
|
+
end
|
67
|
+
sleep settings[:sleep_interval]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
module Nucleon
|
3
|
+
module Action
|
4
|
+
module Node
|
5
|
+
module Agent
|
6
|
+
class Status < Nucleon.plugin_class(:nucleon, :cloud_action)
|
7
|
+
|
8
|
+
#-----------------------------------------------------------------------------
|
9
|
+
# Info
|
10
|
+
|
11
|
+
def self.describe
|
12
|
+
super([ :node, :agent ], :status, 650)
|
13
|
+
end
|
14
|
+
|
15
|
+
#-----------------------------------------------------------------------------
|
16
|
+
# Settings
|
17
|
+
|
18
|
+
def configure
|
19
|
+
super do
|
20
|
+
register_array :provider, nil
|
21
|
+
register_translator :format, :json
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
#---
|
26
|
+
|
27
|
+
def arguments
|
28
|
+
[ :provider ]
|
29
|
+
end
|
30
|
+
|
31
|
+
#-----------------------------------------------------------------------------
|
32
|
+
# Operations
|
33
|
+
|
34
|
+
def execute
|
35
|
+
super do |node|
|
36
|
+
ensure_node(node) do
|
37
|
+
translator = CORL.translator({}, settings[:format])
|
38
|
+
|
39
|
+
agent_provider = "agent_#{settings[:provider].join('_')}"
|
40
|
+
agent_record = node.agent(agent_provider)
|
41
|
+
|
42
|
+
agent_record[:running] = node.agent_running(agent_provider) unless agent_record.empty?
|
43
|
+
|
44
|
+
myself.result = agent_record
|
45
|
+
$stderr.puts translator.generate(result) unless result.empty?
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
module Nucleon
|
3
|
+
module Action
|
4
|
+
module Node
|
5
|
+
module Agent
|
6
|
+
class Stop < Nucleon.plugin_class(:nucleon, :cloud_action)
|
7
|
+
|
8
|
+
#-----------------------------------------------------------------------------
|
9
|
+
# Info
|
10
|
+
|
11
|
+
def self.describe
|
12
|
+
super([ :node, :agent ], :stop, 640)
|
13
|
+
end
|
14
|
+
|
15
|
+
#-----------------------------------------------------------------------------
|
16
|
+
# Settings
|
17
|
+
|
18
|
+
def configure
|
19
|
+
super do
|
20
|
+
register_array :provider, nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#---
|
25
|
+
|
26
|
+
def arguments
|
27
|
+
[ :provider ]
|
28
|
+
end
|
29
|
+
|
30
|
+
#-----------------------------------------------------------------------------
|
31
|
+
# Operations
|
32
|
+
|
33
|
+
def execute
|
34
|
+
super do |node|
|
35
|
+
ensure_node(node) do
|
36
|
+
node.remove_agent("agent_#{settings[:provider].join('_')}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
module Nucleon
|
3
|
+
module Action
|
4
|
+
module Node
|
5
|
+
class Agents < Nucleon.plugin_class(:nucleon, :cloud_action)
|
6
|
+
|
7
|
+
#-----------------------------------------------------------------------------
|
8
|
+
# Info
|
9
|
+
|
10
|
+
def self.describe
|
11
|
+
super(:node, :agents, 800)
|
12
|
+
end
|
13
|
+
|
14
|
+
#-----------------------------------------------------------------------------
|
15
|
+
# Settings
|
16
|
+
|
17
|
+
def configure
|
18
|
+
super do
|
19
|
+
register_translator :format, :json
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
#-----------------------------------------------------------------------------
|
24
|
+
# Operations
|
25
|
+
|
26
|
+
def execute
|
27
|
+
super do |node|
|
28
|
+
ensure_node(node) do
|
29
|
+
translator = CORL.translator({}, settings[:format])
|
30
|
+
agent_records = node.agents
|
31
|
+
|
32
|
+
agent_records.each do |provider, agent_options|
|
33
|
+
agent_records[provider][:running] = node.agent_running(provider)
|
34
|
+
end
|
35
|
+
|
36
|
+
myself.result = agent_records
|
37
|
+
$stderr.puts translator.generate(result) unless result.empty?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
|
2
|
+
module Nucleon
|
3
|
+
module Action
|
4
|
+
module Node
|
5
|
+
class Download < Nucleon.plugin_class(:nucleon, :cloud_action)
|
6
|
+
|
7
|
+
#-----------------------------------------------------------------------------
|
8
|
+
# Info
|
9
|
+
|
10
|
+
def self.describe
|
11
|
+
super(:node, :download, 500)
|
12
|
+
end
|
13
|
+
|
14
|
+
#-----------------------------------------------------------------------------
|
15
|
+
# Settings
|
16
|
+
|
17
|
+
def configure
|
18
|
+
super do
|
19
|
+
register_str :remote_path, nil
|
20
|
+
register_str :local_path, nil
|
21
|
+
|
22
|
+
register_bool :progress, true
|
23
|
+
|
24
|
+
register_array :download_nodes, nil do |values|
|
25
|
+
if values.nil?
|
26
|
+
warn('download_nodes_empty')
|
27
|
+
next false
|
28
|
+
end
|
29
|
+
|
30
|
+
node_plugins = CORL.loaded_plugins(:CORL, :node)
|
31
|
+
success = true
|
32
|
+
|
33
|
+
values.each do |value|
|
34
|
+
if info = CORL.plugin_class(:CORL, :node).translate_reference(value)
|
35
|
+
if ! node_plugins.keys.include?(info[:provider].to_sym) || info[:name].empty?
|
36
|
+
warn('download_nodes', { :value => value, :node_provider => info[:provider], :name => info[:name] })
|
37
|
+
success = false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
success
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
#---
|
47
|
+
|
48
|
+
def ignore
|
49
|
+
[ :nodes, :parallel ]
|
50
|
+
end
|
51
|
+
|
52
|
+
def arguments
|
53
|
+
[ :remote_path, :local_path, :upload_nodes ]
|
54
|
+
end
|
55
|
+
|
56
|
+
#-----------------------------------------------------------------------------
|
57
|
+
# Operations
|
58
|
+
|
59
|
+
def execute
|
60
|
+
super do |local_node|
|
61
|
+
ensure_network do
|
62
|
+
batch_success = network.batch(settings[:download_nodes], settings[:node_provider], false) do |node|
|
63
|
+
render_options = { :id => node.id, :hostname => node.hostname, :remote_path => settings[:remote_path], :local_path => settings[:local_path] }
|
64
|
+
|
65
|
+
info('start', render_options)
|
66
|
+
success = node.download(settings[:remote_path], settings[:local_path], { :progress => settings[:progress] })
|
67
|
+
|
68
|
+
if success
|
69
|
+
success('complete', render_options)
|
70
|
+
else
|
71
|
+
error('failure', render_options)
|
72
|
+
end
|
73
|
+
success
|
74
|
+
end
|
75
|
+
myself.status = code.batch_error unless batch_success
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
|
2
|
+
module Nucleon
|
3
|
+
module Action
|
4
|
+
module Node
|
5
|
+
class Upload < Nucleon.plugin_class(:nucleon, :cloud_action)
|
6
|
+
|
7
|
+
#-----------------------------------------------------------------------------
|
8
|
+
# Info
|
9
|
+
|
10
|
+
def self.describe
|
11
|
+
super(:node, :upload, 500)
|
12
|
+
end
|
13
|
+
|
14
|
+
#-----------------------------------------------------------------------------
|
15
|
+
# Settings
|
16
|
+
|
17
|
+
def configure
|
18
|
+
super do
|
19
|
+
register_str :local_path, nil
|
20
|
+
register_str :remote_path, nil
|
21
|
+
register_str :file_mode, '0755'
|
22
|
+
|
23
|
+
register_bool :progress, true
|
24
|
+
|
25
|
+
register_array :upload_nodes, nil do |values|
|
26
|
+
if values.nil?
|
27
|
+
warn('upload_nodes_empty')
|
28
|
+
next false
|
29
|
+
end
|
30
|
+
|
31
|
+
node_plugins = CORL.loaded_plugins(:CORL, :node)
|
32
|
+
success = true
|
33
|
+
|
34
|
+
values.each do |value|
|
35
|
+
if info = CORL.plugin_class(:CORL, :node).translate_reference(value)
|
36
|
+
if ! node_plugins.keys.include?(info[:provider].to_sym) || info[:name].empty?
|
37
|
+
warn('upload_nodes', { :value => value, :node_provider => info[:provider], :name => info[:name] })
|
38
|
+
success = false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
success
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#---
|
48
|
+
|
49
|
+
def ignore
|
50
|
+
[ :nodes ]
|
51
|
+
end
|
52
|
+
|
53
|
+
def arguments
|
54
|
+
[ :local_path, :remote_path, :upload_nodes ]
|
55
|
+
end
|
56
|
+
|
57
|
+
#-----------------------------------------------------------------------------
|
58
|
+
# Operations
|
59
|
+
|
60
|
+
def execute
|
61
|
+
super do |local_node|
|
62
|
+
ensure_network do
|
63
|
+
batch_success = network.batch(settings[:upload_nodes], settings[:node_provider], settings[:parallel]) do |node|
|
64
|
+
render_options = { :id => node.id, :hostname => node.hostname, :local_path => settings[:local_path], :remote_path => settings[:remote_path] }
|
65
|
+
|
66
|
+
info('start', render_options)
|
67
|
+
success = node.send_files(settings[:local_path], settings[:remote_path], nil, settings[:file_mode], { :progress => settings[:progress] })
|
68
|
+
|
69
|
+
if success
|
70
|
+
success('complete', render_options)
|
71
|
+
else
|
72
|
+
error('failure', render_options)
|
73
|
+
end
|
74
|
+
success
|
75
|
+
end
|
76
|
+
myself.status = code.batch_error unless batch_success
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/locales/en.yml
CHANGED
@@ -667,6 +667,36 @@ en:
|
|
667
667
|
info:
|
668
668
|
start: |-
|
669
669
|
Destroying %{provider} machine %{name}
|
670
|
+
upload:
|
671
|
+
description: |-
|
672
|
+
Upload a file or directory to a specified location on remote nodes
|
673
|
+
help: |-
|
674
|
+
Upload a file or directory to a specified location on remote nodes
|
675
|
+
options:
|
676
|
+
upload_nodes: |-
|
677
|
+
Nodes to upload file or directory to
|
678
|
+
local_path: |-
|
679
|
+
Local file or directory to upload to nodes (default %{default_value})
|
680
|
+
remote_path: |-
|
681
|
+
Remote path to upload local file or directory to (default %{default_value})
|
682
|
+
file_mode: |-
|
683
|
+
File mode to set for remote file or directory uploaded (default %{default_value})
|
684
|
+
progress: |-
|
685
|
+
Show upload progress (default %{default_value})
|
686
|
+
info:
|
687
|
+
start: |-
|
688
|
+
Starting upload of %{local_path} to %{remote_path} on %{hostname} (id %{id})
|
689
|
+
success:
|
690
|
+
complete: |-
|
691
|
+
Upload completed
|
692
|
+
warn:
|
693
|
+
upload_nodes_empty: |-
|
694
|
+
Nodes must be specified in order to run the upload action
|
695
|
+
upload_nodes: |-
|
696
|
+
Provider %{node_provider} node %{name} is not a valid node to upload (%{value} given)
|
697
|
+
error:
|
698
|
+
failure: |-
|
699
|
+
Upload failed
|
670
700
|
ip:
|
671
701
|
description: |-
|
672
702
|
Return the public IP address for nodes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: corl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Webb
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nucleon
|
@@ -238,8 +238,10 @@ files:
|
|
238
238
|
- lib/core/mod/fog_rackspace_server.rb
|
239
239
|
- lib/core/mod/hiera_backend.rb
|
240
240
|
- lib/core/plugin/agent.rb
|
241
|
+
- lib/core/plugin/agent_wrapper.rb
|
241
242
|
- lib/core/plugin/builder.rb
|
242
243
|
- lib/core/plugin/cloud_action.rb
|
244
|
+
- lib/core/plugin/cloud_action_wrapper.rb
|
243
245
|
- lib/core/plugin/configuration.rb
|
244
246
|
- lib/core/plugin/fog_machine.rb
|
245
247
|
- lib/core/plugin/fog_node.rb
|
@@ -266,6 +268,7 @@ files:
|
|
266
268
|
- lib/facter/custom_facts.rb
|
267
269
|
- lib/facter/vagrant_exists.rb
|
268
270
|
- lib/hiera/corl_logger.rb
|
271
|
+
- lib/nucleon/action/agent/manager.rb
|
269
272
|
- lib/nucleon/action/network/config.rb
|
270
273
|
- lib/nucleon/action/network/create.rb
|
271
274
|
- lib/nucleon/action/network/images.rb
|
@@ -277,11 +280,15 @@ files:
|
|
277
280
|
- lib/nucleon/action/network/vagrantfile.rb
|
278
281
|
- lib/nucleon/action/node/IP.rb
|
279
282
|
- lib/nucleon/action/node/SSH.rb
|
283
|
+
- lib/nucleon/action/node/agent/status.rb
|
284
|
+
- lib/nucleon/action/node/agent/stop.rb
|
285
|
+
- lib/nucleon/action/node/agents.rb
|
280
286
|
- lib/nucleon/action/node/authorize.rb
|
281
287
|
- lib/nucleon/action/node/bootstrap.rb
|
282
288
|
- lib/nucleon/action/node/build.rb
|
283
289
|
- lib/nucleon/action/node/cache.rb
|
284
290
|
- lib/nucleon/action/node/destroy.rb
|
291
|
+
- lib/nucleon/action/node/download.rb
|
285
292
|
- lib/nucleon/action/node/exec.rb
|
286
293
|
- lib/nucleon/action/node/fact.rb
|
287
294
|
- lib/nucleon/action/node/facts.rb
|
@@ -299,6 +306,7 @@ files:
|
|
299
306
|
- lib/nucleon/action/node/start.rb
|
300
307
|
- lib/nucleon/action/node/status.rb
|
301
308
|
- lib/nucleon/action/node/stop.rb
|
309
|
+
- lib/nucleon/action/node/upload.rb
|
302
310
|
- lib/nucleon/action/plugin/create.rb
|
303
311
|
- lib/nucleon/action/plugin/list.rb
|
304
312
|
- lib/nucleon/action/plugins.rb
|