packet lib: bpdu: fix reversibility about json

to_jsondict() JSON-izes public member variables of the object.
from_jsondict() calls the constructor using JSON members as the arguments.
BPDU has the public member that is not required for the constructor, so TypeError occurs in from_jsondict().
this patch suppresses the output of to_jsondict() by changing unnecessary public members into protected members.

examination code:

    from ryu.lib.packet import bpdu
    msg1 = bpdu.RstBPDUs()
    print msg1
    jsondict = msg1.to_jsondict()
    msg2 = bpdu.RstBPDUs.from_jsondict(jsondict['RstBPDUs'])
    print msg2
    print str(msg1) == str(msg2)

before applying this patch:

    RstBPDUs(bpdu_type=2,bridge_mac_address='00:00:00:00:00:00',bridge_priority=32768,bridge_system_id_extension=0,flags=0,forward_delay=15,hello_time=2,max_age=20,message_age=0,port_number=0,port_priority=128,protocol_id=0,root_mac_address='00:00:00:00:00:00',root_path_cost=0,root_priority=32768,root_system_id_extension=0,version_1_length=0,version_id=2)
    CLS <class 'ryu.lib.packet.bpdu.RstBPDUs'>
    ARG {'max_age': 20, 'bpdu_type': 2, 'bridge_mac_address': 'MDA6MDA6MDA6MDA6MDA6MDA=', 'hello_time': 2, 'protocol_id': 0, 'bridge_priority': 32768, 'message_age': 0, 'version_id': 2, 'port_priority': 128, 'flags': 0, 'root_priority': 32768, 'version_1_length': 0, 'root_path_cost': 0, 'port_number': 0, 'root_mac_address': 'MDA6MDA6MDA6MDA6MDA6MDA=', 'root_system_id_extension': 0, 'forward_delay': 15, 'bridge_system_id_extension': 0}
    KWARG {'max_age': 20, 'bpdu_type': 2, 'bridge_mac_address': '00:00:00:00:00:00', 'hello_time': 2, 'protocol_id': 0, 'bridge_priority': 32768, 'message_age': 0, 'version_id': 2, 'port_priority': 128, 'flags': 0, 'root_priority': 32768, 'version_1_length': 0, 'root_path_cost': 0, 'port_number': 0, 'root_mac_address': '00:00:00:00:00:00', 'root_system_id_extension': 0, 'forward_delay': 15, 'bridge_system_id_extension': 0}
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python2.7/dist-packages/ryu/lib/stringify.py", line 293, in from_jsondict
        return cls(**dict(kwargs, **additional_args))
    TypeError: __init__() got an unexpected keyword argument 'bpdu_type'

after applying this patch:

    RstBPDUs(bridge_mac_address='00:00:00:00:00:00',bridge_priority=32768,bridge_system_id_extension=0,flags=0,forward_delay=15,hello_time=2,max_age=20,message_age=0,port_number=0,port_priority=128,root_mac_address='00:00:00:00:00:00',root_path_cost=0,root_priority=32768,root_system_id_extension=0)
    RstBPDUs(bridge_mac_address='00:00:00:00:00:00',bridge_priority=32768,bridge_system_id_extension=0,flags=0,forward_delay=15,hello_time=2,max_age=20,message_age=0,port_number=0,port_priority=128,root_mac_address='00:00:00:00:00:00',root_path_cost=0,root_priority=32768,root_system_id_extension=0)
    True

Signed-off-by: Yuichi Ito <ito.yuichi0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
Yuichi Ito 2013-12-12 15:31:57 +09:00 committed by FUJITA Tomonori
parent 9b0c24c6df
commit 1c6bc8ae57
2 changed files with 11 additions and 14 deletions

View File

@ -180,9 +180,9 @@ class bpdu(packet_base.PacketBase):
assert hasattr(self, 'VERSION_ID')
assert hasattr(self, 'BPDU_TYPE')
self.protocol_id = PROTOCOL_IDENTIFIER
self.version_id = self.VERSION_ID
self.bpdu_type = self.BPDU_TYPE
self._protocol_id = PROTOCOL_IDENTIFIER
self._version_id = self.VERSION_ID
self._bpdu_type = self.BPDU_TYPE
if hasattr(self, 'check_parameters'):
self.check_parameters()
@ -205,8 +205,8 @@ class bpdu(packet_base.PacketBase):
return buf, None, None
def serialize(self, payload, prev):
return struct.pack(bpdu._PACK_STR, self.protocol_id,
self.version_id, self.bpdu_type)
return struct.pack(bpdu._PACK_STR, self._protocol_id,
self._version_id, self._bpdu_type)
@bpdu.register_bpdu_type
@ -450,7 +450,7 @@ class RstBPDUs(ConfigurationBPDUs):
message_age=0, max_age=DEFAULT_MAX_AGE,
hello_time=DEFAULT_HELLO_TIME,
forward_delay=DEFAULT_FORWARD_DELAY):
self.version_1_length = VERSION_1_LENGTH
self._version_1_length = VERSION_1_LENGTH
super(RstBPDUs, self).__init__(flags, root_priority,
root_system_id_extension,
@ -482,5 +482,5 @@ class RstBPDUs(ConfigurationBPDUs):
def serialize(self, payload, prev):
base = super(RstBPDUs, self).serialize(payload, prev)
sub = struct.pack(RstBPDUs._PACK_STR, self.version_1_length)
sub = struct.pack(RstBPDUs._PACK_STR, self._version_1_length)
return base + sub

View File

@ -1441,9 +1441,9 @@ class TestPacket(unittest.TestCase):
# bpdu
ok_(p_bpdu)
eq_(bpdu.PROTOCOL_IDENTIFIER, p_bpdu.protocol_id)
eq_(bpdu.PROTOCOLVERSION_ID_BPDU, p_bpdu.version_id)
eq_(bpdu.TYPE_CONFIG_BPDU, p_bpdu.bpdu_type)
eq_(bpdu.PROTOCOL_IDENTIFIER, p_bpdu._protocol_id)
eq_(bpdu.PROTOCOLVERSION_ID_BPDU, p_bpdu._version_id)
eq_(bpdu.TYPE_CONFIG_BPDU, p_bpdu._bpdu_type)
eq_(0, p_bpdu.flags)
eq_(32768, p_bpdu.root_priority)
eq_(0, p_bpdu.root_system_id_extension)
@ -1484,10 +1484,7 @@ class TestPacket(unittest.TestCase):
if k in llc_values])
llc_str = '%s(%s)' % (llc.llc.__name__, _llc_str)
bpdu_values = {'protocol_id': bpdu.PROTOCOL_IDENTIFIER,
'version_id': bpdu.PROTOCOLVERSION_ID_BPDU,
'bpdu_type': bpdu.TYPE_CONFIG_BPDU,
'flags': 0,
bpdu_values = {'flags': 0,
'root_priority': long(32768),
'root_system_id_extension': long(0),
'root_mac_address': self.src_mac,