rundock 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eef77dde29974f83d4bef90d7ac82886ebfc46d5
4
- data.tar.gz: 484b9c3e7f4f4f557a3ecb1d3d5ce506566bc45d
3
+ metadata.gz: 1185fca2a1ac6281bed2903980ac243aa515d728
4
+ data.tar.gz: 2a33d417121c653dbab71d14d20090bad52588df
5
5
  SHA512:
6
- metadata.gz: adf8f0dc23a9a4f38db95b77eb804ac336dae9aba7d0a8d671572221c635c8ec8fc6fd3b71ef0cc8979162f22253b603345a85b33578e413bbe30005037622be
7
- data.tar.gz: a8b0d0a20eb279a2ae8f46cbe800a38fe266736d4087a0eccb15546cea74d7e13525245e72706a999376e64fd622cad4198b8f4245a6b9408a8b397ab781f5da
6
+ metadata.gz: ee69507c2340f648f8d702d8fcb4d80153d1336633ab1eb55e3e4fd130a53f9318d408b73989aab65d3d95ef296b7790b1d5612a5c89984eb738ab76f9bf58e9
7
+ data.tar.gz: 6d319b172002d86612a4b986887dc76c0655268d36834b9e794b8c6946076985adbe1a28d07db30685bc0d4f26048dab62b77c0cf6a08362e850337b0c321495
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## v0.2.3
2
+
3
+ Fix
4
+
5
+ - Fix symbol host access if localhost
6
+
7
+ Improvements
8
+
9
+ - Support operation plugins for extension
10
+
1
11
  ## v0.2.2
2
12
 
3
13
  Fix
@@ -0,0 +1,30 @@
1
+ module Rundock
2
+ module Attribute
3
+ class Base
4
+ def initialize(attr = {})
5
+ attr.each { |k, v| define_attr(k.to_sym, v) }
6
+ end
7
+
8
+ def self.attr_accessor(*vars)
9
+ @attributes ||= []
10
+ @attributes.concat(vars)
11
+ super(*vars)
12
+ end
13
+
14
+ def self.list
15
+ @attributes
16
+ end
17
+
18
+ def list
19
+ self.class.list.each_with_object({}) do |a, result|
20
+ result[a] = self.send(a)
21
+ end
22
+ end
23
+
24
+ def define_attr(name, val)
25
+ self.class.send(:attr_accessor, name)
26
+ self.send("#{name}=", val)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,21 @@
1
+ module Rundock
2
+ module Attribute
3
+ class NodeAttribute < Base
4
+ attr_accessor :node
5
+ attr_accessor :nodename
6
+ attr_accessor :task_info
7
+ attr_accessor :errexit
8
+
9
+ AVAIL_TAKE_OVERS = [
10
+ :task_info,
11
+ :errexit
12
+ ]
13
+
14
+ def finalize_node
15
+ list.each do |k, _v|
16
+ define_attr(k, nil) unless AVAIL_TAKE_OVERS.include?(k)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -3,6 +3,7 @@ require 'singleton'
3
3
  require 'specinfra/core'
4
4
  require 'io/console'
5
5
  require 'net/ssh'
6
+ require 'net/ssh/proxy/command'
6
7
 
7
8
  Specinfra::Configuration.error_on_missing_backend_type = true
8
9
 
@@ -64,6 +65,10 @@ module Rundock
64
65
  def create_specinfra_backend
65
66
  raise NotImplementedError
66
67
  end
68
+
69
+ def method_missing(method, *args)
70
+ @backend.send(method, *args)
71
+ end
67
72
  end
68
73
 
69
74
  class Local < Base
@@ -88,10 +93,12 @@ module Rundock
88
93
  ssh_opts = Net::SSH::Config.for(options[:host])
89
94
  end
90
95
 
96
+ # priority = node_attributes > cli options
91
97
  ssh_opts[:host_name] = options[:host]
92
98
  ssh_opts[:keys] = Array(options[:key]) if options[:key]
93
99
  ssh_opts[:password] = parse_password_from_stdin if options[:ask_password]
94
100
  ssh_opts.merge!(filter_net_ssh_options(options))
101
+ ssh_opts[:proxy] = Kernel.eval(options[:proxy]) if options[:proxy]
95
102
 
96
103
  Logger.debug(%(Net::SSH Options: "#{ssh_opts}"))
97
104
 
@@ -41,7 +41,7 @@ module Rundock
41
41
  @options.keys.select { |o| o.to_s =~ /(\w+)_ssh_default$/ }.each do |oo|
42
42
  # no use default ssh options if local
43
43
  # set unless scenario file and cli options specified and not localhost
44
- next if @nodename =~ /localhost|127\.0\.0\.1/
44
+ next if localhost?
45
45
  opt = oo.to_s.gsub(/_ssh_default/, '').to_sym
46
46
  if !@node_info[@nodename.to_sym][:ssh_opts][opt] && !@options[opt]
47
47
  @node_info[@nodename.to_sym][:ssh_opts][opt] = @options[oo]
@@ -56,7 +56,7 @@ module Rundock
56
56
  end
57
57
 
58
58
  def parse_backend_type
59
- if @nodename =~ /localhost|127\.0\.0\.1/ &&
59
+ if localhost? &&
60
60
  !@node_info[@nodename.to_sym][:ssh_opts][:port] &&
61
61
  !@node_info[@nodename.to_sym][:ssh_opts][:user] &&
62
62
  !@node_info[@nodename.to_sym][:ssh_opts][:ssh_config]
@@ -67,6 +67,11 @@ module Rundock
67
67
 
68
68
  backend_type
69
69
  end
70
+
71
+ def localhost?
72
+ @nodename =~ /localhost|127\.0\.0\.1/ ||
73
+ @node_info[@nodename.to_sym][:host] =~ /localhost|127\.0\.0\.1/
74
+ end
70
75
  end
71
76
  end
72
77
  end
@@ -8,8 +8,8 @@ module Rundock
8
8
 
9
9
  node = nil
10
10
  scen = Scenario.new
11
- node_attributes = { :task => {} }
12
- tasks.each { |k, v| node_attributes[:task][k] = v } if tasks
11
+ node_attribute = Rundock::Attribute::NodeAttribute.new(task_info: {})
12
+ tasks.each { |k, v| node_attribute.task_info[k] = v } if tasks
13
13
  scen.node_info = node_info
14
14
  scen.tasks = tasks
15
15
 
@@ -19,10 +19,10 @@ module Rundock
19
19
 
20
20
  n.deep_symbolize_keys.each do |k, v|
21
21
  if k == :node
22
+ node_attribute.finalize_node
22
23
  backend = BackendBuilder.new(@options, v, node_info).build
23
24
  node = Node.new(v, backend)
24
- node_attributes[:nodename] = v
25
-
25
+ node_attribute.nodename = v
26
26
  if @options[:command]
27
27
  node.add_operation(build_cli_command_operation(@options[:command], @options))
28
28
  end
@@ -34,7 +34,7 @@ module Rundock
34
34
 
35
35
  next unless node
36
36
 
37
- ope = build_operations(k, Array(v), node_attributes, @options)
37
+ ope = build_operations(k, Array(v), node_attribute, @options)
38
38
  node.add_operation(ope)
39
39
  end
40
40
  end
@@ -44,12 +44,12 @@ module Rundock
44
44
  scen
45
45
  end
46
46
 
47
- def build_task(tasks, backend, node_attributes)
48
- node = Node.new(node_attributes[:nodename], backend)
47
+ def build_task(tasks, backend, node_attribute)
48
+ node = Node.new(node_attribute.nodename, backend)
49
49
  scen = Scenario.new
50
50
 
51
51
  tasks.each do |k, v|
52
- ope = build_operations(k, Array(v), node_attributes, nil)
52
+ ope = build_operations(k, Array(v), node_attribute, nil)
53
53
  node.add_operation(ope)
54
54
  end
55
55
 
@@ -73,15 +73,16 @@ module Rundock
73
73
  private
74
74
 
75
75
  def build_cli_command_operation(command, cli_options)
76
- node_attributes = {}
77
- node_attributes[:errexit] = !cli_options[:run_anyway]
76
+ node_attribute = Rundock::Attribute::NodeAttribute.new
77
+ node_attribute.errexit = !cli_options[:run_anyway]
78
78
  Rundock::OperationFactory.instance(:command).create(Array(command), nil)
79
79
  end
80
80
 
81
81
  def build_operations(ope_type, ope_content, node_attributes, cli_options)
82
- node_attributes[:errexit] = !cli_options[:run_anyway] if cli_options
83
- node_attributes[:errexit] = true if cli_options.nil?
84
- Rundock::OperationFactory.instance(ope_type).create(Array(ope_content), node_attributes)
82
+ node_attributes.errexit = !cli_options[:run_anyway] if cli_options
83
+ node_attributes.errexit = true if cli_options.nil?
84
+ node_attributes.define_attr(ope_type, ope_content)
85
+ Rundock::OperationFactory.instance(ope_type).create(Array(ope_content), node_attributes.list)
85
86
  end
86
87
  end
87
88
  end
data/lib/rundock/cli.rb CHANGED
@@ -52,5 +52,9 @@ module Rundock
52
52
 
53
53
  Runner.run(opts.merge(options.deep_symbolize_keys))
54
54
  end
55
+
56
+ def method_missing(command, *args)
57
+ help
58
+ end
55
59
  end
56
60
  end
@@ -3,13 +3,13 @@ module Rundock
3
3
  class Task < Base
4
4
  def run(backend, attributes = {})
5
5
  @instruction.each do |i|
6
- unless attributes[:task].key?(i.to_sym)
6
+ unless attributes[:task_info].key?(i.to_sym)
7
7
  Logger.warn("task not found and ignored: #{i}")
8
8
  next
9
9
  end
10
10
 
11
11
  scenario = Rundock::Builder::ScenarioBuilder.new(nil, nil).build_task(
12
- attributes[:task][i.to_sym], backend, attributes)
12
+ attributes[:task_info][i.to_sym], backend, Rundock::Attribute::NodeAttribute.new(attributes))
13
13
 
14
14
  scenario.run
15
15
  end
@@ -0,0 +1,44 @@
1
+ require 'rundock/operation/base'
2
+
3
+ module Rundock
4
+ module Operation
5
+ # You can use this sample as following scenario.yml for example.
6
+ #
7
+ # - node: anyhost-01
8
+ # sample_operation:
9
+ # - cmd: 'ls ~'
10
+ # all: true
11
+ # ---
12
+ # anyhost-01:
13
+ # host: 192.168.1.11
14
+ # ssh_opts:
15
+ # port: 22
16
+ # user: anyuser
17
+ # key: ~/.ssh/id_rsa
18
+ # ---
19
+ class SampleOperation < Base
20
+ def run(backend, attributes)
21
+ operation = attributes[:sample_operation][0]
22
+
23
+ cmd = ''
24
+ args_line = ''
25
+ operation.each do |k, v|
26
+ if k == :cmd
27
+ cmd = v
28
+ next
29
+ end
30
+
31
+ if v.is_a?(TrueClass)
32
+ args_line << " --#{k}"
33
+ elsif v.is_a?(String)
34
+ args_line << " --#{k} #{v}"
35
+ end
36
+ end
37
+
38
+ Logger.info("do #{cmd}#{args_line}")
39
+ result = backend.run_command("#{cmd}#{args_line}")
40
+ Logger.info(result.stdout)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -4,12 +4,14 @@ require 'open-uri'
4
4
  module Rundock
5
5
  class Runner
6
6
  ScenarioNotFoundError = Class.new(StandardError)
7
+ RUNDOCK_PLUGINS = %w(operation hook)
7
8
 
8
9
  class << self
9
10
  def run(options)
10
11
  Logger.debug 'Starting Rundoc:'
11
12
 
12
13
  runner = self.new(options)
14
+ runner.load_plugins
13
15
  runner.build(options)
14
16
  runner.run
15
17
  end
@@ -25,10 +27,6 @@ module Rundock
25
27
  @scenario.run
26
28
  end
27
29
 
28
- def run_tasks
29
- @scenario.run
30
- end
31
-
32
30
  def build(options)
33
31
  if options[:scenario] || options[:hostgroup]
34
32
  if options[:scenario] && !FileTest.exist?(options[:scenario])
@@ -55,5 +53,29 @@ module Rundock
55
53
  @scenario = Rundock::Builder::ScenarioBuilder.new(options, nil).build
56
54
  end
57
55
  end
56
+
57
+ def load_plugins
58
+ Dir.glob("#{File.expand_path(File.dirname(__FILE__))}/plugin/**/*.rb").each do |f|
59
+ require f.gsub(/.rb$/, '')
60
+ end
61
+
62
+ gems = []
63
+ Gem::Specification.each do |gem|
64
+ gems << gem.name
65
+ end
66
+ gems.uniq!
67
+
68
+ gems.each do |g|
69
+ RUNDOCK_PLUGINS.each do |plugin|
70
+ next if g !~ /^(rundock-plugin-#{plugin})-/
71
+ next if Gem::Specification.find_by_path(g).nil?
72
+ Logger.debug("Loading rundock plugin: #{g}")
73
+ libdir = "#{Gem::Specification.find_by_path(g).full_gem_path}/lib/rundock/plugin/#{Regexp.last_match(0)}"
74
+ Dir.glob("#{libdir}/*.rb").each do |f|
75
+ require f.gsub(/.rb$/, '')
76
+ end
77
+ end
78
+ end
79
+ end
58
80
  end
59
81
  end
@@ -1,3 +1,3 @@
1
1
  module Rundock
2
- VERSION = '0.2.2'
2
+ VERSION = '0.2.3'
3
3
  end
data/lib/rundock.rb CHANGED
@@ -7,6 +7,8 @@ require 'rundock/operation/task'
7
7
  require 'rundock/operation/command'
8
8
  require 'rundock/operation_factory'
9
9
  require 'rundock/node'
10
+ require 'rundock/attribute/base'
11
+ require 'rundock/attribute/node_attribute'
10
12
  require 'rundock/scenario'
11
13
  require 'rundock/backend'
12
14
  require 'rundock/builder/base'
data/scenario_sample.yml CHANGED
@@ -45,12 +45,12 @@
45
45
  - "rm /tmp/safetyfile"
46
46
  - "ls -1 /tmp"
47
47
  ---
48
- - anyhost-01:
48
+ anyhost-01:
49
49
  host: 192.168.1.11
50
50
  ssh_opts:
51
51
  port: 22
52
52
  user: anyuser
53
- - anyhost-02:
53
+ anyhost-02:
54
54
  host: 192.168.1.12
55
55
  ---
56
56
  echo_platform:
@@ -0,0 +1,10 @@
1
+ - node: anyhost-01
2
+ task:
3
+ - write_echo
4
+ ---
5
+ anyhost-01:
6
+ host: localhost
7
+ ---
8
+ write_echo:
9
+ sample_operation:
10
+ - cmd: "echo 'Hello Rundock from SampleOperationPlugin Scenario.' > /var/tmp/hello_rundock_from_sample_operation_scenario"
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe file('/var/tmp/hello_rundock_from_sample_operation_scenario') do
4
+ it { should be_file }
5
+ its(:content) { should match(/Hello Rundock from SampleOperationPlugin Scenario./) }
6
+ end
@@ -0,0 +1,14 @@
1
+ - node: anyhost-01
2
+ task:
3
+ - write_echo
4
+ ---
5
+ anyhost-01:
6
+ host: 172.17.42.1
7
+ ssh_opts:
8
+ port: 22222
9
+ user: tester
10
+ key: "<replaced_by_platforms>"
11
+ ---
12
+ write_echo:
13
+ sample_operation:
14
+ - cmd: "echo 'Hello Rundock from SampleOperationPlugin Scenario.' > /var/tmp/hello_rundock_from_sample_operation_scenario"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rundock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - hiracy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-07-20 00:00:00.000000000 Z
11
+ date: 2015-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -151,6 +151,8 @@ files:
151
151
  - default_ssh.yml
152
152
  - exe/rundock
153
153
  - lib/rundock.rb
154
+ - lib/rundock/attribute/base.rb
155
+ - lib/rundock/attribute/node_attribute.rb
154
156
  - lib/rundock/backend.rb
155
157
  - lib/rundock/builder/backend_builder.rb
156
158
  - lib/rundock/builder/base.rb
@@ -166,6 +168,7 @@ files:
166
168
  - lib/rundock/operation/command.rb
167
169
  - lib/rundock/operation/task.rb
168
170
  - lib/rundock/operation_factory.rb
171
+ - lib/rundock/plugin/operation/sample_operation.rb
169
172
  - lib/rundock/runner.rb
170
173
  - lib/rundock/scenario.rb
171
174
  - lib/rundock/version.rb
@@ -176,10 +179,13 @@ files:
176
179
  - spec/integration/platforms/centos6/setup.sh
177
180
  - spec/integration/platforms/localhost/scenarios/run_anyway_scenario.yml
178
181
  - spec/integration/platforms/localhost/scenarios/simple_echo_scenario.yml
182
+ - spec/integration/platforms/localhost/scenarios/simple_plugin_scenario.yml
179
183
  - spec/integration/platforms/localhost/scenarios/use_default_ssh_scenario.yml
180
184
  - spec/integration/recipes/simple_echo_scenario_spec.rb
181
185
  - spec/integration/recipes/simple_echo_spec.rb
186
+ - spec/integration/recipes/simple_plugin_scenario_spec.rb
182
187
  - spec/integration/scenarios/simple_echo_scenario.yml
188
+ - spec/integration/scenarios/simple_plugin_scenario.yml
183
189
  - spec/integration/scenarios/use_default_ssh_scenario.yml
184
190
  - spec/integration/spec_helper.rb
185
191
  homepage: https://github.com/hiracy/rundock