python3: Use six.binary_type for I/O of ryu.lib.rpc
While msgpack has default binary-unicode conversion, the feature is somehow disabled in ryu. As the other parts of ryu requires binary_type data where they directly appear on-wire, simply follow the policy. Signed-off-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
464f56070d
commit
675f33d664
@ -20,6 +20,7 @@
|
|||||||
# http://wiki.msgpack.org/display/MSGPACK/RPC+specification
|
# http://wiki.msgpack.org/display/MSGPACK/RPC+specification
|
||||||
|
|
||||||
import msgpack
|
import msgpack
|
||||||
|
import six
|
||||||
|
|
||||||
|
|
||||||
class MessageType(object):
|
class MessageType(object):
|
||||||
@ -49,7 +50,7 @@ class MessageEncoder(object):
|
|||||||
return this_id
|
return this_id
|
||||||
|
|
||||||
def create_request(self, method, params):
|
def create_request(self, method, params):
|
||||||
assert isinstance(method, str)
|
assert isinstance(method, six.binary_type)
|
||||||
assert isinstance(params, list)
|
assert isinstance(params, list)
|
||||||
msgid = self._create_msgid()
|
msgid = self._create_msgid()
|
||||||
return (self._packer.pack([MessageType.REQUEST, msgid, method,
|
return (self._packer.pack([MessageType.REQUEST, msgid, method,
|
||||||
@ -62,7 +63,7 @@ class MessageEncoder(object):
|
|||||||
return self._packer.pack([MessageType.RESPONSE, msgid, error, result])
|
return self._packer.pack([MessageType.RESPONSE, msgid, error, result])
|
||||||
|
|
||||||
def create_notification(self, method, params):
|
def create_notification(self, method, params):
|
||||||
assert isinstance(method, str)
|
assert isinstance(method, six.binary_type)
|
||||||
assert isinstance(params, list)
|
assert isinstance(params, list)
|
||||||
return self._packer.pack([MessageType.NOTIFY, method, params])
|
return self._packer.pack([MessageType.NOTIFY, method, params])
|
||||||
|
|
||||||
|
@ -62,11 +62,11 @@ class RpcVRRPManager(app_manager.RyuApp):
|
|||||||
error = None
|
error = None
|
||||||
result = None
|
result = None
|
||||||
try:
|
try:
|
||||||
if target_method == "vrrp_config":
|
if target_method == b'vrrp_config':
|
||||||
result = self._config(msgid, params)
|
result = self._config(msgid, params)
|
||||||
elif target_method == "vrrp_list":
|
elif target_method == b'vrrp_list':
|
||||||
result = self._list(msgid, params)
|
result = self._list(msgid, params)
|
||||||
elif target_method == "vrrp_config_change":
|
elif target_method == b'vrrp_config_change':
|
||||||
result = self._config_change(msgid, params)
|
result = self._config_change(msgid, params)
|
||||||
else:
|
else:
|
||||||
error = 'Unknown method %s' % (target_method)
|
error = 'Unknown method %s' % (target_method)
|
||||||
|
@ -36,20 +36,22 @@ class Test_rpc(unittest.TestCase):
|
|||||||
def _handle_request(self, m):
|
def _handle_request(self, m):
|
||||||
e = self._server_endpoint
|
e = self._server_endpoint
|
||||||
msgid, method, params = m
|
msgid, method, params = m
|
||||||
if method == "resp":
|
if method == b'resp':
|
||||||
e.send_response(msgid, result=params[0])
|
e.send_response(msgid, result=params[0])
|
||||||
elif method == "err":
|
elif method == b'err':
|
||||||
e.send_response(msgid, error=params[0])
|
e.send_response(msgid, error=params[0])
|
||||||
elif method == "callback":
|
elif method == b'callback':
|
||||||
n, cb, v = params
|
n, cb, v = params
|
||||||
assert n > 0
|
assert n > 0
|
||||||
self._requests.add(e.send_request(cb, [msgid, n, cb, v]))
|
self._requests.add(e.send_request(cb, [msgid, n, cb, v]))
|
||||||
elif method == "notify1":
|
elif method == b'notify1':
|
||||||
e.send_notification(params[1], params[2])
|
e.send_notification(params[1], params[2])
|
||||||
e.send_response(msgid, result=params[0])
|
e.send_response(msgid, result=params[0])
|
||||||
elif method == "shutdown":
|
elif method == b'shutdown':
|
||||||
import socket
|
import socket
|
||||||
how = getattr(socket, params[0])
|
# Though six.text_type is not needed in python2, it is
|
||||||
|
# unconditionally applied for code simplicityp
|
||||||
|
how = getattr(socket, six.text_type(params[0], 'utf-8'))
|
||||||
self._server_sock.shutdown(how)
|
self._server_sock.shutdown(how)
|
||||||
e.send_response(msgid, result=method)
|
e.send_response(msgid, result=method)
|
||||||
else:
|
else:
|
||||||
@ -58,7 +60,7 @@ class Test_rpc(unittest.TestCase):
|
|||||||
def _handle_notification(self, m):
|
def _handle_notification(self, m):
|
||||||
e = self._server_endpoint
|
e = self._server_endpoint
|
||||||
method, params = m
|
method, params = m
|
||||||
if method == "notify2":
|
if method == b'notify2':
|
||||||
e.send_notification(params[0], params[1])
|
e.send_notification(params[0], params[1])
|
||||||
|
|
||||||
def _handle_response(self, m):
|
def _handle_response(self, m):
|
||||||
@ -94,8 +96,8 @@ class Test_rpc(unittest.TestCase):
|
|||||||
|
|
||||||
def test_0_call_str(self):
|
def test_0_call_str(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = "hoge"
|
obj = b'hoge'
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, bytes)
|
assert isinstance(result, bytes)
|
||||||
|
|
||||||
@ -103,7 +105,7 @@ class Test_rpc(unittest.TestCase):
|
|||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = 12345
|
obj = 12345
|
||||||
assert isinstance(obj, int)
|
assert isinstance(obj, int)
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, type(obj))
|
assert isinstance(result, type(obj))
|
||||||
|
|
||||||
@ -111,7 +113,7 @@ class Test_rpc(unittest.TestCase):
|
|||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = six.MAXSIZE
|
obj = six.MAXSIZE
|
||||||
assert isinstance(obj, int)
|
assert isinstance(obj, int)
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, type(obj))
|
assert isinstance(result, type(obj))
|
||||||
|
|
||||||
@ -119,7 +121,7 @@ class Test_rpc(unittest.TestCase):
|
|||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = - six.MAXSIZE - 1
|
obj = - six.MAXSIZE - 1
|
||||||
assert isinstance(obj, int)
|
assert isinstance(obj, int)
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, type(obj))
|
assert isinstance(result, type(obj))
|
||||||
|
|
||||||
@ -128,7 +130,7 @@ class Test_rpc(unittest.TestCase):
|
|||||||
obj = 0xffffffffffffffff # max value for msgpack
|
obj = 0xffffffffffffffff # max value for msgpack
|
||||||
_long = int if six.PY3 else long
|
_long = int if six.PY3 else long
|
||||||
assert isinstance(obj, _long)
|
assert isinstance(obj, _long)
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, type(obj))
|
assert isinstance(result, type(obj))
|
||||||
|
|
||||||
@ -137,15 +139,15 @@ class Test_rpc(unittest.TestCase):
|
|||||||
# NOTE: the python type of this value is int for 64-bit arch
|
# NOTE: the python type of this value is int for 64-bit arch
|
||||||
obj = -0x8000000000000000 # min value for msgpack
|
obj = -0x8000000000000000 # min value for msgpack
|
||||||
assert isinstance(obj, numbers.Integral)
|
assert isinstance(obj, numbers.Integral)
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, type(obj))
|
assert isinstance(result, type(obj))
|
||||||
|
|
||||||
@raises(TypeError)
|
@raises(TypeError)
|
||||||
def test_0_call_bytearray(self):
|
def test_0_call_bytearray(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = bytearray("foo")
|
obj = bytearray(b'foo')
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, bytes)
|
assert isinstance(result, bytes)
|
||||||
|
|
||||||
@ -158,48 +160,48 @@ class Test_rpc(unittest.TestCase):
|
|||||||
@raises(EOFError)
|
@raises(EOFError)
|
||||||
def test_1_client_shutdown_wr(self):
|
def test_1_client_shutdown_wr(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
c.call("shutdown", ["SHUT_WR"])
|
c.call(b'shutdown', [b'SHUT_WR'])
|
||||||
|
|
||||||
def test_1_call_True(self):
|
def test_1_call_True(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = True
|
obj = True
|
||||||
assert c.call("resp", [obj]) == obj
|
assert c.call(b'resp', [obj]) == obj
|
||||||
|
|
||||||
def test_2_call_None(self):
|
def test_2_call_None(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = None
|
obj = None
|
||||||
assert c.call("resp", [obj]) is None
|
assert c.call(b'resp', [obj]) is None
|
||||||
|
|
||||||
def test_2_call_False(self):
|
def test_2_call_False(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = False
|
obj = False
|
||||||
assert c.call("resp", [obj]) == obj
|
assert c.call(b'resp', [obj]) == obj
|
||||||
|
|
||||||
def test_2_call_dict(self):
|
def test_2_call_dict(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = {"hoge": 1, "fuga": 2}
|
obj = {b'hoge': 1, b'fuga': 2}
|
||||||
assert c.call("resp", [obj]) == obj
|
assert c.call(b'resp', [obj]) == obj
|
||||||
|
|
||||||
def test_2_call_empty_dict(self):
|
def test_2_call_empty_dict(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = {}
|
obj = {}
|
||||||
assert c.call("resp", [obj]) == obj
|
assert c.call(b'resp', [obj]) == obj
|
||||||
|
|
||||||
def test_2_call_array(self):
|
def test_2_call_array(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = [1, 2, 3, 4]
|
obj = [1, 2, 3, 4]
|
||||||
assert c.call("resp", [obj]) == obj
|
assert c.call(b'resp', [obj]) == obj
|
||||||
|
|
||||||
def test_2_call_empty_array(self):
|
def test_2_call_empty_array(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = []
|
obj = []
|
||||||
assert c.call("resp", [obj]) == obj
|
assert c.call(b'resp', [obj]) == obj
|
||||||
|
|
||||||
def test_2_call_tuple(self):
|
def test_2_call_tuple(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
# note: msgpack library implicitly convert a tuple into a list
|
# note: msgpack library implicitly convert a tuple into a list
|
||||||
obj = (1, 2, 3)
|
obj = (1, 2, 3)
|
||||||
assert c.call("resp", [obj]) == list(obj)
|
assert c.call(b'resp', [obj]) == list(obj)
|
||||||
|
|
||||||
@raises(TypeError)
|
@raises(TypeError)
|
||||||
def test_2_call_unicode(self):
|
def test_2_call_unicode(self):
|
||||||
@ -211,7 +213,7 @@ class Test_rpc(unittest.TestCase):
|
|||||||
# it seems to be going to change.
|
# it seems to be going to change.
|
||||||
# https://gist.github.com/methane/5022403
|
# https://gist.github.com/methane/5022403
|
||||||
obj = u"hoge"
|
obj = u"hoge"
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, bytes)
|
assert isinstance(result, bytes)
|
||||||
|
|
||||||
@ -219,21 +221,21 @@ class Test_rpc(unittest.TestCase):
|
|||||||
import struct
|
import struct
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = struct.pack("100x")
|
obj = struct.pack("100x")
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, bytes)
|
assert isinstance(result, bytes)
|
||||||
|
|
||||||
def test_3_call_complex(self):
|
def test_3_call_complex(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = [1, "hoge", {"foo": 1, 3: "bar"}]
|
obj = [1, b'hoge', {b'foo': 1, 3: b'bar'}]
|
||||||
assert c.call("resp", [obj]) == list(obj)
|
assert c.call(b'resp', [obj]) == list(obj)
|
||||||
|
|
||||||
def test_4_call_large_binary(self):
|
def test_4_call_large_binary(self):
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = struct.pack("10000000x")
|
obj = struct.pack("10000000x")
|
||||||
result = c.call("resp", [obj])
|
result = c.call(b'resp', [obj])
|
||||||
assert result == obj
|
assert result == obj
|
||||||
assert isinstance(result, bytes)
|
assert isinstance(result, bytes)
|
||||||
|
|
||||||
@ -243,15 +245,15 @@ class Test_rpc(unittest.TestCase):
|
|||||||
def callback(n):
|
def callback(n):
|
||||||
l.append(n)
|
l.append(n)
|
||||||
c = rpc.Client(self._client_sock, notification_callback=callback)
|
c = rpc.Client(self._client_sock, notification_callback=callback)
|
||||||
obj = "hogehoge"
|
obj = b'hogehoge'
|
||||||
robj = "fugafuga"
|
robj = b'fugafuga'
|
||||||
assert c.call("notify1", [robj, "notify_hoge", [obj]]) == robj
|
assert c.call(b'notify1', [robj, b'notify_hoge', [obj]]) == robj
|
||||||
c.receive_notification()
|
c.receive_notification()
|
||||||
assert len(l) == 1
|
assert len(l) == 1
|
||||||
n = l.pop(0)
|
n = l.pop(0)
|
||||||
assert n is not None
|
assert n is not None
|
||||||
method, params = n
|
method, params = n
|
||||||
assert method == "notify_hoge"
|
assert method == b'notify_hoge'
|
||||||
assert params[0] == obj
|
assert params[0] == obj
|
||||||
|
|
||||||
def test_0_notification2(self):
|
def test_0_notification2(self):
|
||||||
@ -260,21 +262,21 @@ class Test_rpc(unittest.TestCase):
|
|||||||
def callback(n):
|
def callback(n):
|
||||||
l.append(n)
|
l.append(n)
|
||||||
c = rpc.Client(self._client_sock, notification_callback=callback)
|
c = rpc.Client(self._client_sock, notification_callback=callback)
|
||||||
obj = "hogehogehoge"
|
obj = b'hogehogehoge'
|
||||||
c.send_notification("notify2", ["notify_hoge", [obj]])
|
c.send_notification(b'notify2', [b'notify_hoge', [obj]])
|
||||||
c.receive_notification()
|
c.receive_notification()
|
||||||
assert len(l) == 1
|
assert len(l) == 1
|
||||||
n = l.pop(0)
|
n = l.pop(0)
|
||||||
assert n is not None
|
assert n is not None
|
||||||
method, params = n
|
method, params = n
|
||||||
assert method == "notify_hoge"
|
assert method == b'notify_hoge'
|
||||||
assert params[0] == obj
|
assert params[0] == obj
|
||||||
|
|
||||||
def test_0_call_error(self):
|
def test_0_call_error(self):
|
||||||
c = rpc.Client(self._client_sock)
|
c = rpc.Client(self._client_sock)
|
||||||
obj = "hoge"
|
obj = b'hoge'
|
||||||
try:
|
try:
|
||||||
c.call("err", [obj])
|
c.call(b'err', [obj])
|
||||||
raise Exception("unexpected")
|
raise Exception("unexpected")
|
||||||
except rpc.RPCError as e:
|
except rpc.RPCError as e:
|
||||||
assert e.get_value() == obj
|
assert e.get_value() == obj
|
||||||
@ -285,18 +287,18 @@ class Test_rpc(unittest.TestCase):
|
|||||||
def callback(n):
|
def callback(n):
|
||||||
l.append(n)
|
l.append(n)
|
||||||
c = rpc.Client(self._client_sock, notification_callback=callback)
|
c = rpc.Client(self._client_sock, notification_callback=callback)
|
||||||
c.send_notification("notify2", ["notify_foo", []])
|
c.send_notification(b'notify2', [b'notify_foo', []])
|
||||||
hub.sleep(0.5) # give the peer a chance to run
|
hub.sleep(0.5) # give the peer a chance to run
|
||||||
obj = "hoge"
|
obj = b'hoge'
|
||||||
try:
|
try:
|
||||||
c.call("err", [obj])
|
c.call(b'err', [obj])
|
||||||
raise Exception("unexpected")
|
raise Exception("unexpected")
|
||||||
except rpc.RPCError as e:
|
except rpc.RPCError as e:
|
||||||
assert e.get_value() == obj
|
assert e.get_value() == obj
|
||||||
assert len(l) == 1
|
assert len(l) == 1
|
||||||
n = l.pop(0)
|
n = l.pop(0)
|
||||||
method, params = n
|
method, params = n
|
||||||
assert method == "notify_foo"
|
assert method == b'notify_foo'
|
||||||
assert params == []
|
assert params == []
|
||||||
|
|
||||||
def test_4_async_call(self):
|
def test_4_async_call(self):
|
||||||
@ -308,7 +310,7 @@ class Test_rpc(unittest.TestCase):
|
|||||||
e = rpc.EndPoint(self._client_sock)
|
e = rpc.EndPoint(self._client_sock)
|
||||||
s = set()
|
s = set()
|
||||||
for i in range(1, num_calls + 1):
|
for i in range(1, num_calls + 1):
|
||||||
s.add(e.send_request("resp", [i]))
|
s.add(e.send_request(b'resp', [i]))
|
||||||
sum = 0
|
sum = 0
|
||||||
while s:
|
while s:
|
||||||
e.block()
|
e.block()
|
||||||
@ -338,7 +340,7 @@ class Test_rpc(unittest.TestCase):
|
|||||||
e = rpc.EndPoint(self._client_sock)
|
e = rpc.EndPoint(self._client_sock)
|
||||||
s = set()
|
s = set()
|
||||||
for i in range(1, num_calls + 1):
|
for i in range(1, num_calls + 1):
|
||||||
s.add(e.send_request("callback", [i, "ourcallback", 0]))
|
s.add(e.send_request(b'callback', [i, b'ourcallback', 0]))
|
||||||
sum = 0
|
sum = 0
|
||||||
while s:
|
while s:
|
||||||
e.block()
|
e.block()
|
||||||
@ -357,10 +359,10 @@ class Test_rpc(unittest.TestCase):
|
|||||||
r = e.get_request()
|
r = e.get_request()
|
||||||
if r is not None:
|
if r is not None:
|
||||||
msgid, method, params = r
|
msgid, method, params = r
|
||||||
assert method == "ourcallback"
|
assert method == b'ourcallback'
|
||||||
omsgid, n, cb, v = params
|
omsgid, n, cb, v = params
|
||||||
assert omsgid in s
|
assert omsgid in s
|
||||||
assert cb == "ourcallback"
|
assert cb == b'ourcallback'
|
||||||
assert n > 0
|
assert n > 0
|
||||||
e.send_response(msgid, result=[omsgid, n - 1, cb, v + 1])
|
e.send_response(msgid, result=[omsgid, n - 1, cb, v + 1])
|
||||||
assert sum == (1 + num_calls) * num_calls / 2
|
assert sum == (1 + num_calls) * num_calls / 2
|
||||||
|
Loading…
Reference in New Issue
Block a user