add some docstring on StringifyMixin and relevant code

Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
YAMAMOTO Takashi 2013-09-17 12:34:31 +09:00 committed by FUJITA Tomonori
parent e1ae103b78
commit 71ea304be6
2 changed files with 111 additions and 2 deletions

View File

@ -77,6 +77,33 @@ _types = {
class StringifyMixin(object): class StringifyMixin(object):
_TYPE = {}
"""_TYPE class attribute is used to annotate types of attributes.
This type information is used to find an appropriate conversion for
a JSON style dictionary.
Currently the following types are implemented.
===== ==========
Type Descrption
===== ==========
ascii US-ASCII
utf-8 UTF-8
===== ==========
Example::
_TYPE = {
'ascii': [
'hw_addr',
],
'utf-8': [
'name',
]
}
"""
_class_prefixes = [] _class_prefixes = []
def stringify_attrs(self): def stringify_attrs(self):
@ -149,7 +176,31 @@ class StringifyMixin(object):
return _encode return _encode
def to_jsondict(self, encode_string=base64.b64encode): def to_jsondict(self, encode_string=base64.b64encode):
"""returns an object to feed json.dumps() """
This method returns a JSON style dict to describe this object.
The returned dict is compatible with json.dumps() and json.loads().
Suppose ClassName object inherits StringifyMixin.
For an object like the following::
ClassName(Param1=100, Param2=200)
this method would produce::
{ "ClassName": {"Param1": 100, "Param2": 200} }
This method takes the following arguments.
============= =====================================================
Argument Description
============= =====================================================
encode_string (Optional) specify how to encode attributes which has
python 'str' type.
The default is base64.
This argument is used only for attributes which don't
have explicit type annotations in _TYPE class attribute.
============= =====================================================
""" """
dict_ = {} dict_ = {}
encode = lambda k, x: self._encode_value(k, x, encode_string) encode = lambda k, x: self._encode_value(k, x, encode_string)
@ -217,7 +268,24 @@ class StringifyMixin(object):
@classmethod @classmethod
def from_jsondict(cls, dict_, decode_string=base64.b64decode, def from_jsondict(cls, dict_, decode_string=base64.b64decode,
**additional_args): **additional_args):
"""create an instance from a result of json.loads() """Create an instance from a JSON style dict.
Instantiate this class with parameters specified by the dict.
This method takes the following arguments.
=============== =====================================================
Argument Descrpition
=============== =====================================================
dict\_ A dictionary which describes the parameters.
For example, {"Param1": 100, "Param2": 200}
decode_string (Optional) specify how to decode strings.
The default is base64.
This argument is used only for attributes which don't
have explicit type annotations in _TYPE class
attribute.
additional_args (Optional) Additional kwargs for constructor.
=============== =====================================================
""" """
decode = lambda k, x: cls._decode_value(k, x, decode_string) decode = lambda k, x: cls._decode_value(k, x, decode_string)
kwargs = cls._restore_args(_mapdict_kv(decode, dict_)) kwargs = cls._restore_args(_mapdict_kv(decode, dict_))

View File

@ -68,6 +68,30 @@ def create_list_of_base_attributes(f):
def ofp_msg_from_jsondict(dp, jsondict): def ofp_msg_from_jsondict(dp, jsondict):
"""
This function instanticates an appropriate OpenFlow message class
from the given JSON style dictionary.
The objects created by following two code fragments are equivalent.
Code A::
jsonstr = '{ "OFPSetConfig": { "flags": 0, "miss_send_len": 128 } }'
jsondict = json.loads(jsonstr)
o = ofp_msg_from_jsondict(dp, jsondict)
Code B::
o = dp.ofproto_parser.OFPSetConfig(flags=0, miss_send_len=128)
This function takes the following arguments.
======== =======================================
Argument Description
======== =======================================
dp An instance of ryu.controller.Datapath.
jsondict A JSON style dict.
======== =======================================
"""
parser = dp.ofproto_parser parser = dp.ofproto_parser
assert len(jsondict) == 1 assert len(jsondict) == 1
for k, v in jsondict.iteritems(): for k, v in jsondict.iteritems():
@ -87,6 +111,23 @@ class StringifyMixin(stringify.StringifyMixin):
class MsgBase(StringifyMixin): class MsgBase(StringifyMixin):
"""
This is a base class for OpenFlow message classes.
An instance of this class has at least the following attributes.
========= ==============================
Attribute Description
========= ==============================
datapath A ryu.controller.controller.Datapath instance for this message
version OpenFlow protocol version
msg_type Type of OpenFlow message
msg_len Length of the message
xid Transaction id
buf Raw data
========= ==============================
"""
@create_list_of_base_attributes @create_list_of_base_attributes
def __init__(self, datapath): def __init__(self, datapath):
super(MsgBase, self).__init__() super(MsgBase, self).__init__()