right_agent 2.1.4 → 2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/right_agent/clients/non_blocking_client.rb +4 -2
- data/lib/right_agent/command/command_serializer.rb +35 -0
- data/lib/right_agent/serialize/serializer.rb +1 -0
- data/right_agent.gemspec +2 -2
- data/spec/clients/non_blocking_client_spec.rb +11 -0
- data/spec/command/command_io_spec.rb +14 -0
- data/spec/command/command_serializer_spec.rb +2 -1
- metadata +3 -3
@@ -124,7 +124,8 @@ module RightScale
|
|
124
124
|
fiber = Fiber.current
|
125
125
|
connection = EM::HttpRequest.new(uri.to_s, connect_options)
|
126
126
|
http = connection.send(verb, request_options)
|
127
|
-
http.errback { fiber.resume(http.error.to_s == "Errno::ETIMEDOUT" ? 504 : 500,
|
127
|
+
http.errback { fiber.resume(http.error.to_s == "Errno::ETIMEDOUT" ? 504 : 500,
|
128
|
+
(http.error && http.error.to_s) || "HTTP connection failure for #{verb.to_s.upcase}") }
|
128
129
|
http.callback { fiber.resume(http.response_header.status, http.response, http.response_header) }
|
129
130
|
response_code, response_body, response_headers = Fiber.yield
|
130
131
|
response_headers = beautify_headers(response_headers) if response_headers
|
@@ -172,7 +173,8 @@ module RightScale
|
|
172
173
|
# @raise [HttpException] HTTP failure with associated status code
|
173
174
|
def poll_again(fiber, connection, request_options, stop_at)
|
174
175
|
http = connection.send(:get, request_options)
|
175
|
-
http.errback { fiber.resume(http.error.to_s == "Errno::ETIMEDOUT" ? 504 : 500,
|
176
|
+
http.errback { fiber.resume(http.error.to_s == "Errno::ETIMEDOUT" ? 504 : 500,
|
177
|
+
(http.error && http.error.to_s) || "HTTP connection failure for POLL") }
|
176
178
|
http.callback do
|
177
179
|
code, body, headers = http.response_header.status, http.response, http.response_header
|
178
180
|
if code == 200 && (body.nil? || body == "null") && Time.now < stop_at
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#
|
2
3
|
# Copyright (c) 2009-2011 RightScale Inc
|
3
4
|
#
|
@@ -36,6 +37,12 @@ module RightScale
|
|
36
37
|
# === Return
|
37
38
|
# data(String):: Corresponding serialized data
|
38
39
|
def self.dump(command)
|
40
|
+
# Set the encoding before serialization otherwise YAML will serialize
|
41
|
+
# UTF8 characters as binary data. This can cause some quirks we'd rather
|
42
|
+
# avoid, such as the deserialized binary data having no encoding on
|
43
|
+
# deserialization
|
44
|
+
set_encoding(command)
|
45
|
+
|
39
46
|
data = YAML::dump(command)
|
40
47
|
data += SEPARATOR
|
41
48
|
end
|
@@ -51,7 +58,12 @@ module RightScale
|
|
51
58
|
# === Raise
|
52
59
|
# (RightScale::Exceptions::IO): If serialized data is incorrect
|
53
60
|
def self.load(data)
|
61
|
+
# Data coming from eventmachine is cleaned of it's encoding, so set it
|
62
|
+
# to UTF-8 manually before deserializing or you'll throw transcode errors.
|
63
|
+
set_encoding(data)
|
64
|
+
|
54
65
|
command = YAML::load(data)
|
66
|
+
|
55
67
|
raise RightScale::Exceptions::IO, "Invalid serialized command:\n#{data}" unless command
|
56
68
|
command
|
57
69
|
rescue RightScale::Exceptions::IO
|
@@ -59,5 +71,28 @@ module RightScale
|
|
59
71
|
rescue Exception => e
|
60
72
|
raise RightScale::Exceptions::IO, "Invalid serialized command: #{e.message}\n#{data}"
|
61
73
|
end
|
74
|
+
|
75
|
+
private
|
76
|
+
# Force set encodings on ruby strings.
|
77
|
+
#
|
78
|
+
# === Parameters
|
79
|
+
# obj(Object):: String, or Hash/Array of Strings
|
80
|
+
#
|
81
|
+
# === Return
|
82
|
+
# (nil):: Returns nothing, edits object in place
|
83
|
+
def self.set_encoding(obj, encoding = "UTF-8")
|
84
|
+
if obj.is_a?(Hash)
|
85
|
+
obj.each do |k,v|
|
86
|
+
set_encoding(v, encoding)
|
87
|
+
end
|
88
|
+
elsif obj.is_a?(Array)
|
89
|
+
obj.each do |v|
|
90
|
+
set_encoding(v, encoding)
|
91
|
+
end
|
92
|
+
elsif obj.is_a?(String) && !obj.frozen?
|
93
|
+
obj.force_encoding(encoding) if obj.respond_to?(:force_encoding)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
62
97
|
end
|
63
98
|
end
|
@@ -27,6 +27,7 @@ require 'json'
|
|
27
27
|
|
28
28
|
require File.normalize_path(File.join(File.dirname(__FILE__), 'message_pack'))
|
29
29
|
|
30
|
+
|
30
31
|
# Monkey patch common classes to support MessagePack serialization
|
31
32
|
# As with JSON, unserializing them is manual using existing methods such as parse
|
32
33
|
class Date
|
data/right_agent.gemspec
CHANGED
@@ -25,8 +25,8 @@ require 'rbconfig'
|
|
25
25
|
|
26
26
|
Gem::Specification.new do |spec|
|
27
27
|
spec.name = 'right_agent'
|
28
|
-
spec.version = '2.1.
|
29
|
-
spec.date = '2014-04-
|
28
|
+
spec.version = '2.1.5'
|
29
|
+
spec.date = '2014-04-15'
|
30
30
|
spec.authors = ['Lee Kirchhoff', 'Raphael Simon', 'Tony Spataro', 'Scott Messier']
|
31
31
|
spec.email = 'lee@rightscale.com'
|
32
32
|
spec.homepage = 'https://github.com/rightscale/right_agent'
|
@@ -253,6 +253,17 @@ describe RightScale::NonBlockingClient do
|
|
253
253
|
@request_options[:path].should == "/api/foo/bar"
|
254
254
|
end
|
255
255
|
|
256
|
+
it "converts connection errors to 500 by default" do
|
257
|
+
@headers.http_status = 500
|
258
|
+
@response.should_receive(:errback).and_yield.once
|
259
|
+
@response.should_receive(:error).and_return(nil)
|
260
|
+
@fiber.should_receive(:resume).with(500, "HTTP connection failure for GET").once
|
261
|
+
flexmock(Fiber).should_receive(:yield).and_return([500, "HTTP connection failure for GET"]).once
|
262
|
+
flexmock(EM::HttpRequest).should_receive(:new).with(@host, @connect_options).and_return(@request).once
|
263
|
+
lambda { @client.request(:get, @path, @host, @connect_options, @request_options) }.
|
264
|
+
should raise_error(RightScale::HttpExceptions::InternalServerError)
|
265
|
+
end
|
266
|
+
|
256
267
|
it "converts Errno::ETIMEDOUT error to 504" do
|
257
268
|
@headers.http_status = 504
|
258
269
|
@response.should_receive(:errback).and_yield.once
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
#
|
2
3
|
# Copyright (c) 2009-2011 RightScale Inc
|
3
4
|
#
|
@@ -66,6 +67,19 @@ describe RightScale::CommandIO do
|
|
66
67
|
@input.should == 'input'
|
67
68
|
end
|
68
69
|
|
70
|
+
it 'should receive a command with UTF-8 characters' do
|
71
|
+
@input = ''
|
72
|
+
EM.run do
|
73
|
+
RightScale::CommandIO.instance.listen(@socket_port) { |input, _| @input = input; stop }
|
74
|
+
send_input({:command => "say_hello", :data => 'Привет world'})
|
75
|
+
EM.add_timer(2) { stop }
|
76
|
+
end
|
77
|
+
|
78
|
+
@input.should == {:command => "say_hello", :data => 'Привет world'}
|
79
|
+
@input[:command].encoding.to_s.should == "UTF-8" if "".respond_to?(:encoding)
|
80
|
+
@input[:data].encoding.to_s.should == "UTF-8" if "".respond_to?(:encoding)
|
81
|
+
end
|
82
|
+
|
69
83
|
it 'should receive many commands' do
|
70
84
|
@inputs = []
|
71
85
|
EM.run do
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
#
|
2
3
|
# Copyright (c) 2009-2011 RightScale Inc
|
3
4
|
#
|
@@ -25,7 +26,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
|
25
26
|
describe RightScale::CommandSerializer do
|
26
27
|
|
27
28
|
before(:all) do
|
28
|
-
@sample_data = [ 42, 'fourty two', { :haha => 42, 'hoho' => 'fourty_two' }]
|
29
|
+
@sample_data = [ 42, 'fourty two', { :hello => 'Привет', :haha => 42, 'hoho' => 'fourty_two' }]
|
29
30
|
end
|
30
31
|
|
31
32
|
it 'should serialize' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2014-04-
|
15
|
+
date: 2014-04-15 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: right_support
|
@@ -412,7 +412,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
412
412
|
version: '0'
|
413
413
|
segments:
|
414
414
|
- 0
|
415
|
-
hash:
|
415
|
+
hash: -210695347725236548
|
416
416
|
requirements: []
|
417
417
|
rubyforge_project:
|
418
418
|
rubygems_version: 1.8.26
|