ridley 1.2.3 → 1.2.4

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.
@@ -1,11 +1,13 @@
1
- script: "bundle exec thor spec:all"
1
+ script: "bundle exec thor spec:$TEST_SUITE"
2
2
  language: ruby
3
+ env:
4
+ - TEST_SUITE=unit
5
+ - TEST_SUITE=acceptance
3
6
  rvm:
4
7
  - 1.9.2
5
8
  - 1.9.3
6
9
  - 2.0.0
7
10
  - jruby-19mode
8
-
9
11
  matrix:
10
12
  allow_failures:
11
- - rvm: jruby-19mode # Allow failure for now: https://github.com/RiotGames/ridley/issues/143
13
+ - rvm: jruby-19mode
@@ -50,6 +50,18 @@ module Ridley
50
50
 
51
51
  class RemoteCommandError < RidleyError; end
52
52
  class RemoteScriptError < RemoteCommandError; end
53
+ class CommandNotProvided < RemoteCommandError
54
+ attr_reader :connector_type
55
+
56
+ # @params [Symbol] connector_type
57
+ def initialize(connector_type)
58
+ @connector_type = connector_type
59
+ end
60
+
61
+ def to_s
62
+ "No command provided in #{connector_type.inspect}, however the #{connector_type.inspect} connector was selected."
63
+ end
64
+ end
53
65
 
54
66
  # Exception thrown when the maximum amount of requests is exceeded.
55
67
  class RedirectLimitReached < RidleyError
@@ -156,6 +156,36 @@ module Ridley
156
156
  execute(__method__, host, options)
157
157
  end
158
158
 
159
+ # Finds and returns the best HostConnector for a given host
160
+ #
161
+ # @param [String] host
162
+ # the host to attempt to connect to
163
+ # @option options [Hash] :ssh
164
+ # * :port (Fixnum) the ssh port to connect on the node the bootstrap will be performed on (22)
165
+ # * :timeout (Float) [5.0] timeout value for testing SSH connection
166
+ # @option options [Hash] :winrm
167
+ # * :port (Fixnum) the winrm port to connect on the node the bootstrap will be performed on (5985)
168
+ # @param block [Proc]
169
+ # an optional block that is yielded the best HostConnector
170
+ #
171
+ # @return [HostConnector::SSH, HostConnector::WinRM]
172
+ def connector_for(host, options = {})
173
+ options = options.reverse_merge(ssh: Hash.new, winrm: Hash.new)
174
+ options[:ssh][:port] ||= HostConnector::SSH::DEFAULT_PORT
175
+ options[:winrm][:port] ||= HostConnector::WinRM::DEFAULT_PORT
176
+
177
+ if connector_port_open?(host, options[:winrm][:port])
178
+ options.delete(:ssh)
179
+ winrm
180
+ elsif connector_port_open?(host, options[:ssh][:port], options[:ssh][:timeout])
181
+ options.delete(:winrm)
182
+ ssh
183
+ else
184
+ raise Errors::HostConnectionError, "No connector ports open on '#{host}'"
185
+ end
186
+ end
187
+
188
+
159
189
  private
160
190
 
161
191
  def execute(method, host, *args)
@@ -166,35 +196,6 @@ module Ridley
166
196
  abort(ex)
167
197
  end
168
198
 
169
- # Finds and returns the best HostConnector for a given host
170
- #
171
- # @param [String] host
172
- # the host to attempt to connect to
173
- # @option options [Hash] :ssh
174
- # * :port (Fixnum) the ssh port to connect on the node the bootstrap will be performed on (22)
175
- # * :timeout (Float) [5.0] timeout value for testing SSH connection
176
- # @option options [Hash] :winrm
177
- # * :port (Fixnum) the winrm port to connect on the node the bootstrap will be performed on (5985)
178
- # @param block [Proc]
179
- # an optional block that is yielded the best HostConnector
180
- #
181
- # @return [HostConnector::SSH, HostConnector::WinRM]
182
- def connector_for(host, options = {})
183
- options = options.reverse_merge(ssh: Hash.new, winrm: Hash.new)
184
- options[:ssh][:port] ||= HostConnector::SSH::DEFAULT_PORT
185
- options[:winrm][:port] ||= HostConnector::WinRM::DEFAULT_PORT
186
-
187
- if connector_port_open?(host, options[:winrm][:port])
188
- options.delete(:ssh)
189
- winrm
190
- elsif connector_port_open?(host, options[:ssh][:port], options[:ssh][:timeout])
191
- options.delete(:winrm)
192
- ssh
193
- else
194
- raise Errors::HostConnectionError, "No connector ports open on '#{host}'"
195
- end
196
- end
197
-
198
199
  # Checks to see if the given port is open for TCP connections
199
200
  # on the given host.
200
201
  #
@@ -80,7 +80,11 @@ module Ridley
80
80
  end
81
81
  end
82
82
  ensure
83
- command_uploaders.map(&:cleanup)
83
+ begin
84
+ command_uploaders.map(&:cleanup)
85
+ rescue ::WinRM::WinRMHTTPTransportError => ex
86
+ log.info "Error cleaning up leftover Powershell scripts on some hosts"
87
+ end
84
88
  end
85
89
 
86
90
  # Returns the command if it does not break the WinRM command length
@@ -132,12 +132,36 @@ module Ridley
132
132
  # @param [String] host
133
133
  # @param [String] command
134
134
  #
135
- # @return [Array<Symbol, HostConnector::Response>]
135
+ # @return [HostConnector::Response]
136
136
  def run(host, command)
137
137
  host_commander.run(host, command, ssh: ssh, winrm: winrm)
138
138
  end
139
139
  alias_method :execute_command, :run
140
140
 
141
+ # Executes the given command on a node using a platform specific
142
+ # command.
143
+ #
144
+ # @param [String] host
145
+ # @param [Hash] commands
146
+ #
147
+ # @example
148
+ # platform_specific_run("host.example.com", linux: "hostname -f", windows: "echo %COMPUTERNAME%")
149
+ #
150
+ # @return [HostConnector::Response]
151
+ def platform_specific_run(host, commands)
152
+ case (type = host_commander.connector_for(host, ssh: ssh, winrm: winrm))
153
+ when HostConnector::SSH
154
+ raise Errors::CommandNotProvided.new(:ssh) unless commands[:ssh] and !commands[:ssh].empty?
155
+ run(host, commands[:ssh])
156
+ when HostConnector::WinRM
157
+ raise Errors::CommandNotProvided.new(:winrm) unless commands[:winrm] and !commands[:winrm].empty?
158
+ run(host, commands[:winrm])
159
+ else
160
+ raise RuntimeError, "#{type.class.to_s} is not a supported connector for #{self.class}##{__method__}"
161
+ end
162
+ end
163
+ alias_method :execute_platform_specific_command, :platform_specific_run
164
+
141
165
  # Merges the given data with the the data of the target node on the remote
142
166
  #
143
167
  # @param [Ridley::NodeResource, String] target
@@ -1,3 +1,3 @@
1
1
  module Ridley
2
- VERSION = "1.2.3"
2
+ VERSION = "1.2.4"
3
3
  end
@@ -67,6 +67,77 @@ describe Ridley::NodeResource do
67
67
  end
68
68
  end
69
69
 
70
+ describe "#platform_specific_run" do
71
+ let(:ssh_command) { "hostname -f" }
72
+ let(:winrm_command) { "echo %COMPUTERNAME%" }
73
+ let(:ssh_connector) { Ridley::HostConnector::SSH.new }
74
+ let(:winrm_connector) { Ridley::HostConnector::WinRM.new }
75
+ let(:unsupported_connector) { Object.new }
76
+
77
+ describe "expecting the ssh connector" do
78
+ before do
79
+ host_commander.stub(:connector_for).and_return ssh_connector
80
+ end
81
+ it "sends the ssh command" do
82
+ instance.should_receive(:run).with(host, ssh_command)
83
+ instance.platform_specific_run(host, ssh: ssh_command, winrm: winrm_command)
84
+ end
85
+
86
+ it "raises an error if no command is provided for the ssh connector when the ssh connector is used" do
87
+ expect {
88
+ instance.platform_specific_run(host, winrm: winrm_command)
89
+ }.to raise_error(Ridley::Errors::CommandNotProvided)
90
+ end
91
+
92
+ it "raises an error if an empty command is provided for the ssh connector when the ssh connector is used" do
93
+ expect {
94
+ instance.platform_specific_run(host, ssh: "", winrm: winrm_command)
95
+ }.to raise_error(Ridley::Errors::CommandNotProvided)
96
+ end
97
+
98
+ it "raises an error if a nil command is provided for the ssh connector when the ssh connector is used" do
99
+ expect {
100
+ instance.platform_specific_run(host, ssh: nil, winrm: winrm_command)
101
+ }.to raise_error(Ridley::Errors::CommandNotProvided)
102
+ end
103
+ end
104
+
105
+ describe "expecting the winrm connector" do
106
+ before do
107
+ host_commander.stub(:connector_for).and_return winrm_connector
108
+ end
109
+ it "sends the ssh command if the connector is winrm" do
110
+ instance.should_receive(:run).with(host, winrm_command)
111
+ instance.platform_specific_run(host, ssh: ssh_command, winrm: winrm_command)
112
+ end
113
+
114
+ it "raises an error if no command is provided for the winrm connector when the winrm connector is used" do
115
+ expect {
116
+ instance.platform_specific_run(host, ssh: ssh_command)
117
+ }.to raise_error(Ridley::Errors::CommandNotProvided)
118
+ end
119
+
120
+ it "raises an error if an empty is provided for the winrm connector when the winrm connector is used" do
121
+ expect {
122
+ instance.platform_specific_run(host, ssh: ssh_command, winrm: "")
123
+ }.to raise_error(Ridley::Errors::CommandNotProvided)
124
+ end
125
+
126
+ it "raises a nil command is provided for the winrm connector when the winrm connector is used" do
127
+ expect {
128
+ instance.platform_specific_run(host, ssh: ssh_command, winrm: nil)
129
+ }.to raise_error(Ridley::Errors::CommandNotProvided)
130
+ end
131
+ end
132
+
133
+ it "raises a RuntimeError if an unsupported connector is used" do
134
+ host_commander.stub(:connector_for).and_return unsupported_connector
135
+ expect {
136
+ instance.platform_specific_run(host, ssh: ssh_command, winrm: winrm_command)
137
+ }.to raise_error(RuntimeError)
138
+ end
139
+ end
140
+
70
141
  describe "#merge_data" do
71
142
  let(:node_name) { "rspec-test" }
72
143
  let(:run_list) { [ "recipe[one]", "recipe[two]" ] }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ridley
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-06-20 00:00:00.000000000 Z
13
+ date: 2013-06-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: addressable
@@ -454,7 +454,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
454
454
  version: '0'
455
455
  segments:
456
456
  - 0
457
- hash: -2669705474346805003
457
+ hash: -3781892320161055859
458
458
  requirements: []
459
459
  rubyforge_project:
460
460
  rubygems_version: 1.8.23