Ticket #8828: no_servers_found.patch
| File no_servers_found.patch, 13.2 kB (added by halorgium, 2 years ago) |
|---|
-
a/lib/capistrano/configuration/connections.rb
old new 93 93 raise ArgumentError, "expected a block" unless block_given? 94 94 95 95 if task = current_task 96 servers =find_servers_for_task(task, options)97 96 task_options = options_to_find_servers_for_task(task, options) 97 servers = find_servers(task_options) 98 98 if servers.empty? 99 raise ScriptError, "`#{task.fully_qualified_name}' is only run for servers matching #{task.options.inspect}, but no servers matched"99 raise Capistrano::NoMatchingServersError, "`#{task.fully_qualified_name}' is only run for servers matching #{task_options.inspect}, but no servers matched" 100 100 end 101 101 102 102 if task.continue_on_error? … … 105 105 end 106 106 else 107 107 servers = find_servers(options) 108 raise ScriptError, "no servers found to match #{options.inspect}" if servers.empty?108 raise Capistrano::NoMatchingServersError, "no servers found to match #{options.inspect}" if servers.empty? 109 109 end 110 110 111 111 servers = [servers.first] if options[:once] -
a/lib/capistrano/configuration/servers.rb
old new 1 1 module Capistrano 2 2 class Configuration 3 3 module Servers 4 # Returns a hash for use with #find_servers using the given task. 5 def options_to_find_servers_for_task(task, options={}) 6 task.options_without_desc.merge(options) 7 end 8 4 9 # Identifies all servers that the given task should be executed on. 5 10 # The options hash accepts the same arguments as #find_servers, and any 6 11 # preexisting options there will take precedence over the options in 7 12 # the task. 8 13 def find_servers_for_task(task, options={}) 9 find_servers( task.options.merge(options))14 find_servers(options_to_find_servers_for_task(task, options)) 10 15 end 11 16 12 17 # Attempts to find all defined servers that match the given criteria. -
a/lib/capistrano/errors.rb
old new 3 3 4 4 class CaptureError < Error; end 5 5 class NoSuchTaskError < Error; end 6 class NoMatchingServersError < Error; end 6 7 7 8 class RemoteError < Error 8 9 attr_accessor :hosts -
a/lib/capistrano/shell.rb
old new 160 160 connect(task) 161 161 configuration.execute_task(task) 162 162 end 163 rescue Capistrano::No SuchTaskError => error163 rescue Capistrano::NoMatchingServersError, Capistrano::NoSuchTaskError => error 164 164 warn "error: #{error.message}" 165 165 end 166 166 -
a/lib/capistrano/task_definition.rb
old new 9 9 @name, @namespace, @options = name, namespace, options 10 10 @body = block or raise ArgumentError, "a task requires a block" 11 11 @servers = nil 12 end 13 14 def options_without_desc 15 o = options.dup 16 o.delete(:desc) 17 o 12 18 end 13 19 14 20 # Returns the task's fully-qualified name, including the namespace -
a/test/configuration/connections_test.rb
old new 138 138 139 139 def test_execute_on_servers_without_current_task_should_raise_error_if_no_matching_servers 140 140 @config.expects(:find_servers).with(:a => :b, :c => :d).returns([]) 141 assert_raises( ScriptError) { @config.execute_on_servers(:a => :b, :c => :d) { |list| } }141 assert_raises(Capistrano::NoMatchingServersError) { @config.execute_on_servers(:a => :b, :c => :d) { |list| } } 142 142 end 143 143 144 144 def test_execute_on_servers_should_raise_an_error_if_the_current_task_has_no_matching_servers_by_default 145 145 @config.current_task = mock_task 146 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([]) 147 assert_raises(ScriptError) do 146 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 147 @config.expects(:find_servers).with(mock_task.options).returns([]) 148 assert_raises(Capistrano::NoMatchingServersError) do 148 149 @config.execute_on_servers do 149 150 flunk "should not get here" 150 151 end … … 154 155 def test_execute_on_servers_should_determine_server_list_from_active_task 155 156 assert @config.sessions.empty? 156 157 @config.current_task = mock_task 157 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([server("cap1"), server("cap2"), server("cap3")]) 158 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 159 @config.expects(:find_servers).with(mock_task.options).returns([server("cap1"), server("cap2"), server("cap3")]) 158 160 Capistrano::SSH.expects(:connect).times(3).returns(:success) 159 161 @config.execute_on_servers {} 160 162 assert_equal %w(cap1 cap2 cap3), @config.sessions.keys.sort.map { |s| s.host } … … 163 165 def test_execute_on_servers_should_yield_server_list_to_block 164 166 assert @config.sessions.empty? 165 167 @config.current_task = mock_task 166 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([server("cap1"), server("cap2"), server("cap3")]) 168 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 169 @config.expects(:find_servers).with(mock_task.options).returns([server("cap1"), server("cap2"), server("cap3")]) 167 170 Capistrano::SSH.expects(:connect).times(3).returns(:success) 168 171 block_called = false 169 172 @config.execute_on_servers do |servers| … … 179 182 def test_execute_on_servers_with_once_option_should_establish_connection_to_and_yield_only_the_first_server 180 183 assert @config.sessions.empty? 181 184 @config.current_task = mock_task 182 @config.expects(:find_servers_for_task).with(@config.current_task, :once => true).returns([server("cap1"), server("cap2"), server("cap3")]) 185 mock_options = mock_task.options.merge(:once => true) 186 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, :once => true).returns(mock_options) 187 @config.expects(:find_servers).with(mock_options).returns([server("cap1"), server("cap2"), server("cap3")]) 183 188 Capistrano::SSH.expects(:connect).returns(:success) 184 189 block_called = false 185 190 @config.execute_on_servers(:once => true) do |servers| … … 192 197 193 198 def test_execute_servers_should_raise_connection_error_on_failure_by_default 194 199 @config.current_task = mock_task 195 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([server("cap1")]) 200 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 201 @config.expects(:find_servers).with(mock_task.options).returns([server("cap1")]) 196 202 Capistrano::SSH.expects(:connect).raises(Exception) 197 203 assert_raises(Capistrano::ConnectionError) { 198 204 @config.execute_on_servers do … … 203 209 204 210 def test_execute_servers_should_not_raise_connection_error_on_failure_with_on_errors_continue 205 211 @config.current_task = mock_task(:on_error => :continue) 206 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([server("cap1"), server("cap2")]) 212 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 213 @config.expects(:find_servers).with(mock_task.options).returns([server("cap1"), server("cap2")]) 207 214 Capistrano::SSH.expects(:connect).times(2).raises(Exception).then.returns(:success) 208 215 assert_nothing_raised { 209 216 @config.execute_on_servers do |servers| … … 215 222 def test_execute_on_servers_should_not_try_to_connect_to_hosts_with_connection_errors_with_on_errors_continue 216 223 list = [server("cap1"), server("cap2")] 217 224 @config.current_task = mock_task(:on_error => :continue) 218 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns(list) 225 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 226 @config.expects(:find_servers).with(mock_task.options).returns(list) 219 227 Capistrano::SSH.expects(:connect).times(2).raises(Exception).then.returns(:success) 220 228 @config.expects(:failed!).with(server("cap1")) 221 229 @config.execute_on_servers do |servers| 222 230 assert_equal %w(cap2), servers.map { |s| s.host } 223 231 end 224 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns(list) 232 @config.expects(:options_to_find_servers_for_task).returns(mock_task.options) 233 @config.expects(:find_servers).with(mock_task.options).returns(list) 225 234 @config.execute_on_servers do |servers| 226 235 assert_equal %w(cap2), servers.map { |s| s.host } 227 236 end … … 231 240 cap1 = server("cap1") 232 241 cap2 = server("cap2") 233 242 @config.current_task = mock_task(:on_error => :continue) 234 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([cap1, cap2]) 243 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 244 @config.expects(:find_servers).with(mock_task.options).returns([cap1, cap2]) 235 245 Capistrano::SSH.expects(:connect).times(2).returns(:success) 236 246 @config.execute_on_servers do |servers| 237 247 error = Capistrano::CommandError.new 238 248 error.hosts = [cap1] 239 249 raise error 240 250 end 241 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([cap1, cap2]) 251 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 252 @config.expects(:find_servers).with(mock_task.options).returns([cap1, cap2]) 242 253 @config.execute_on_servers do |servers| 243 254 assert_equal %w(cap2), servers.map { |s| s.host } 244 255 end … … 248 259 cap1 = server("cap1") 249 260 cap2 = server("cap2") 250 261 @config.current_task = mock_task(:on_error => :continue) 251 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([cap1, cap2]) 262 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 263 @config.expects(:find_servers).with(mock_task.options).returns([cap1, cap2]) 252 264 Capistrano::SSH.expects(:connect).times(2).returns(:success) 253 265 @config.execute_on_servers do |servers| 254 266 error = Capistrano::UploadError.new 255 267 error.hosts = [cap1] 256 268 raise error 257 269 end 258 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([cap1, cap2]) 270 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 271 @config.expects(:find_servers).with(mock_task.options).returns([cap1, cap2]) 259 272 @config.execute_on_servers do |servers| 260 273 assert_equal %w(cap2), servers.map { |s| s.host } 261 274 end … … 264 277 def test_connect_should_establish_connections_to_all_servers_in_scope 265 278 assert @config.sessions.empty? 266 279 @config.current_task = mock_task 267 @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([server("cap1"), server("cap2"), server("cap3")]) 280 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, {}).returns(mock_task.options) 281 @config.expects(:find_servers).with(mock_task.options).returns([server("cap1"), server("cap2"), server("cap3")]) 268 282 Capistrano::SSH.expects(:connect).times(3).returns(:success) 269 283 @config.connect! 270 284 assert_equal %w(cap1 cap2 cap3), @config.sessions.keys.sort.map { |s| s.host } … … 273 287 def test_connect_should_honor_once_option 274 288 assert @config.sessions.empty? 275 289 @config.current_task = mock_task 276 @config.expects(:find_servers_for_task).with(@config.current_task, :once => true).returns([server("cap1"), server("cap2"), server("cap3")]) 290 @config.expects(:options_to_find_servers_for_task).with(@config.current_task, :once => true).returns(mock_task.options) 291 @config.expects(:find_servers).with(mock_task.options).returns([server("cap1"), server("cap2"), server("cap3")]) 277 292 Capistrano::SSH.expects(:connect).returns(:success) 278 293 @config.connect! :once => true 279 294 assert_equal %w(cap1), @config.sessions.keys.sort.map { |s| s.host }