Added support for cpythonize to generate auxillary info
to stdout. Also added check for of_message_parse to
print out error if wrong version is called.
diff --git a/tools/munger/Makefile b/tools/munger/Makefile
index aa7394c..5a04a1f 100644
--- a/tools/munger/Makefile
+++ b/tools/munger/Makefile
@@ -21,16 +21,13 @@
PYTHONIZE = bin/pyopenflow-pythonize.py
OFP_GEN_CMD = (cd ${PYLIBOF_DIR} && ${PYTHONIZE} -i ${OF_HEADER} \
${TARGET_DIR}/ofp.py)
+OFP_AUX_INFO = ${TARGET_DIR}/ofp_aux.py
# Dependencies for ofp.py
OFP_DEP = ${ABS_OF_HEADER} $(wildcard ${PYLIBOF_DIR}/pylib/*.py)
-OFP_DEP = $(wildcard ${PYLIBOF_DIR}/pylib/of/*.py)
+OFP_DEP += $(wildcard ${PYLIBOF_DIR}/pylib/of/*.py)
-# FIXME: There are three types of .py files:
-# ofp.py from pylibopenflow output
-# %.py generated from %_gen.py
-# of_message.py and action_list.py -- hand built, already in src dir
-
+# Generated and other files
GEN_FILES := $(addprefix ${TARGET_DIR}/,ofp.py message.py error.py action.py)
OTHER_FILES := $(addprefix ${TARGET_DIR}/,action_list.py of_message.py)
LINT_SOURCE := ${GEN_FILES} ${OTHER_FILES}
@@ -40,13 +37,15 @@
all: ${GEN_FILES}
@echo "Generated files"
+# The core OpenFlow libraries generated from openflow.h
${TARGET_DIR}/ofp.py: ${OFP_DEP}
- ${OFP_GEN_CMD}
+ ${OFP_GEN_CMD} > ${OFP_AUX_INFO}
# General rule like src/message.py comes from scripts/message_gen.py
${TARGET_DIR}/%.py: scripts/%_gen.py ${TARGET_DIR}/ofp.py
python $< > $@
+# The pylint files
lint/%.log: ${TARGET_DIR}/%.py
(cd ${TARGET_DIR} && pylint -e $(notdir $<)) > $@
diff --git a/tools/munger/scripts/action_gen.py b/tools/munger/scripts/action_gen.py
index 22c7b4b..c66eb8f 100644
--- a/tools/munger/scripts/action_gen.py
+++ b/tools/munger/scripts/action_gen.py
@@ -4,6 +4,10 @@
#
import re
+import sys
+sys.path.append("../../src/python/oftest/ofmsg")
+from ofp import *
+from ofp_aux import class_to_members_map
print """
# Python OpenFlow action wrapper classes
@@ -12,7 +16,9 @@
# This will never happen; done to avoid lint warning
if __name__ == '__main__':
- def of_message_parse(msg): return None
+ def of_message_parse(msg):
+ print "ERROR: of_msg_parse in action.py called"
+ return None
"""
@@ -69,6 +75,8 @@
class action_--TYPE--(--PARENT_TYPE--):
\"""
Wrapper class for --TYPE-- action object
+
+ --DOC_INFO--
\"""
def __init__(self):
--PARENT_TYPE--.__init__(self)
@@ -81,10 +89,17 @@
if __name__ == '__main__':
for (t, parent) in action_class_map.items():
+ if not parent in class_to_members_map.keys():
+ doc_info = "Unknown parent action class: " + parent
+ else:
+ doc_info = "Data members inherited from " + parent + ":\n"
+ for var in class_to_members_map[parent]:
+ doc_info += " @arg " + var + "\n"
action_name = "OFPAT_" + t.upper()
to_print = re.sub('--TYPE--', t, template)
to_print = re.sub('--PARENT_TYPE--', parent, to_print)
to_print = re.sub('--ACTION_NAME--', action_name, to_print)
+ to_print = re.sub('--DOC_INFO--', doc_info, to_print)
print to_print
# Generate a list of action classes
diff --git a/tools/munger/scripts/error_gen.py b/tools/munger/scripts/error_gen.py
index 7dff087..9fce70d 100644
--- a/tools/munger/scripts/error_gen.py
+++ b/tools/munger/scripts/error_gen.py
@@ -4,6 +4,10 @@
#
import re
+import sys
+sys.path.append("../../src/python/oftest/ofmsg")
+from ofp import *
+from ofp_aux import class_to_members_map
print """
# Python OpenFlow error wrapper classes
@@ -12,7 +16,9 @@
# This will never happen; done to avoid lint warning
if __name__ == '__main__':
- def of_message_parse(msg): return None
+ def of_message_parse(msg):
+ print "ERROR: of_msg_parse in error.py called"
+ return None
"""
@@ -28,6 +34,12 @@
class --TYPE--_error_msg(ofp_error_msg):
\"""
Wrapper class for --TYPE-- error message class
+
+ Data members inherited from ofp_error_msg:
+ @arg type
+ @arg code
+ @arg data: Binary string following message members
+
\"""
def __init__(self):
ofp_error_msg.__init__(self)
diff --git a/tools/munger/scripts/message_gen.py b/tools/munger/scripts/message_gen.py
index f065874..61aada8 100644
--- a/tools/munger/scripts/message_gen.py
+++ b/tools/munger/scripts/message_gen.py
@@ -80,6 +80,9 @@
import re
import string
import sys
+sys.path.append("../../src/python/oftest/ofmsg")
+from ofp import *
+from ofp_aux import class_to_members_map
message_top_matter = """
# Python OpenFlow message wrapper classes
@@ -107,6 +110,7 @@
\"""
self.header = ofp_header()
# Additional base data members declared here
+
# Normally will define pack, unpack, __len__ functions
class template_msg(ofp_template_msg):
@@ -123,7 +127,11 @@
Must set the header type value appropriately for the message
\"""
+
+ ##@var header
+ # OpenFlow message header: length, version, xid, type
ofp_template_msg.__init__(self)
+ self.header = ofp_header()
# For a real message, will be set to an integer
self.header.type = "TEMPLATE_MSG_VALUE"
def pack(self):
@@ -268,21 +276,51 @@
_p1('"""')
_p1("Wrapper class for " + msg)
print
+ _p1("OpenFlow message header: length, version, xid, type")
+ _p1("@arg length: The total length of the message")
+ _p1("@arg version: The OpenFlow version (" + str(OFP_VERSION) + ")")
+ _p1("@arg xid: The transaction ID")
+ _p1("@arg type: The message type (" + msg_name + "=" +
+ str(eval(msg_name)) + ")")
+ print
+ if has_core_members and parent in class_to_members_map.keys():
+ _p1("Data members inherited from " + parent + ":")
+ for var in class_to_members_map[parent]:
+ _p1("@arg " + var)
if has_list:
if list_type == None:
- _p1("Has trailing variable array " + list_var);
+ _p1("@arg " + list_var + ": Variable length array of TBD")
else:
- _p1("Has trailing object " + list_var + " of type " + list_type);
- print
+ _p1("@arg " + list_var + ": Object of type " + list_type);
if has_string:
- _p1("Has trailing string data")
- print
+ _p1("@arg data: Binary string following message members")
+ print
_p1('"""')
print
_p1("def __init__(self):")
if has_core_members:
_p2(parent + ".__init__(self)")
+ _p2("##@var header")
+ _p2("# OpenFlow message header: length, version, xid, type")
+ _p2("# @arg length: The total length of the message")
+ _p2("# @arg version: The OpenFlow version (" + str(OFP_VERSION) + ")")
+ _p2("# @arg xid: The transaction ID")
+ _p2("# @arg type: The message type (" + msg_name + "=" +
+ str(eval(msg_name)) + ")")
+ print
+ if has_list:
+ _p2("##@var " + list_var)
+ if list_type == None:
+ _p2("# Array of objects of type TBD")
+ else:
+ _p2("# Object of type " + list_type)
+ print
+ if has_string:
+ _p2("##@var data")
+ _p2("# Binary string following message members")
+ print
+
_p2("self.header = ofp_header()")
_p2("self.header.type = " + msg_name)
if has_list: