4fd61eb8c5
I've been using the latest RYU source from GIT, and building my own python eggs. When launching ryu-manager, I get the following error: [root@hostname ryu]# ryu-manager Traceback (most recent call last): File "/usr/bin/ryu-manager", line 5, in <module> pkg_resources.run_script('ryu==2.2', 'ryu-manager') File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 461, in run_script self.require(requires)[0].run_script(script_name, ns) File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 1194, in run_script execfile(script_filename, namespace, namespace) File "/usr/lib/python2.6/site-packages/ryu-2.2-py2.6.egg/EGG-INFO/scripts/ryu-manage\ r", line 43, in <module> from ryu.topology import switches File "build/bdist.linux-x86_64/egg/ryu/topology/switches.py", line 427, in <module> File "build/bdist.linux-x86_64/egg/ryu/topology/switches.py", line 574, in Switches AttributeError: 'module' object has no attribute 'EventOFPPortStatus' [root@hostname ryu]# python ./bin/ryu-manager Traceback (most recent call last): File "./bin/ryu-manager", line 55, in <module> from ryu.topology import switches File "build/bdist.linux-x86_64/egg/ryu/topology/switches.py", line 427, in <module> File "build/bdist.linux-x86_64/egg/ryu/topology/switches.py", line 574, in Switches AttributeError: 'module' object has no attribute 'EventOFPPortStatus' I found that I could execute ryu-manager correctly from the interactive python shell but not from the command line, and looked at the derivation of Event classes from pathnames. It occurred to me that the eggs would not necessarily include the source files, so I tried successfully to make the code look up both source and compiled filenames, and return the union of that. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
|
|
# Copyright (C) 2013 Isaku Yamahata <yamahata at private email ne jp>
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import glob
|
|
import inspect
|
|
import os.path
|
|
|
|
from ryu import utils
|
|
|
|
|
|
_OFPROTO_DIR = os.path.dirname(__file__)
|
|
|
|
_OFPROTO_PARSER_FILE_NAMES = glob.glob(os.path.join(
|
|
_OFPROTO_DIR, 'ofproto_v[0-9]*_[0-9]*_parser.py*'))
|
|
_OFPROTO_PARSER_FILE_NAMES = [os.path.basename(name)
|
|
for name in _OFPROTO_PARSER_FILE_NAMES]
|
|
|
|
|
|
_OFPROTO_MODULES = {}
|
|
for parser_file_name in _OFPROTO_PARSER_FILE_NAMES:
|
|
# drop tailing '.py*'
|
|
parser_mod_name = __name__ + '.' + \
|
|
'.'.join(parser_file_name.split('.')[:-1])
|
|
consts_mod_name = parser_mod_name[:-7] # drop trailing '_parser'
|
|
try:
|
|
parser_mod = utils.import_module(parser_mod_name)
|
|
consts_mod = utils.import_module(consts_mod_name)
|
|
except:
|
|
continue
|
|
|
|
if consts_mod.OFP_VERSION not in _OFPROTO_MODULES:
|
|
_OFPROTO_MODULES[consts_mod.OFP_VERSION] = (consts_mod, parser_mod)
|
|
|
|
|
|
def get_ofp_modules():
|
|
"""get modules pair for the constants and parser of OF-wire of
|
|
a given OF version.
|
|
"""
|
|
return _OFPROTO_MODULES
|
|
|
|
|
|
def get_ofp_module(ofp_version):
|
|
"""get modules pair for the constants and parser of OF-wire of
|
|
a given OF version.
|
|
"""
|
|
return _OFPROTO_MODULES[ofp_version]
|
|
|
|
|
|
def get_ofp_cls(ofp_version, name):
|
|
"""get class for name of a given OF version"""
|
|
(_consts_mod, parser_mod) = get_ofp_module(ofp_version)
|
|
for i in inspect.getmembers(parser_mod, inspect.isclass):
|
|
if i[0] == name:
|
|
return i[1]
|
|
return None
|