**/target
bin/
dist
+**egg-info
**/logs
products
repository
.recommenders
/.gitignore
.fbExcludeFilterFile
-xtend-gen
\ No newline at end of file
+xtend-gen
--- /dev/null
+v0.1.0
+------
+* Initial release.
\ No newline at end of file
This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
\ No newline at end of file
+and is available at http://www.eclipse.org/legal/epl-v10.html
\ No newline at end of file
-include *.md
-include LICENSE.txt
\ No newline at end of file
+include CHANGES.rst
+include LICENSE.txt
+include requirements.txt
\ No newline at end of file
+++ /dev/null
-odltools
-========
-
-Tools and scripts used with OpenDaylight and OpenStack.
\ No newline at end of file
--- /dev/null
+========
+odltools
+========
+A tool to troubleshoot the NetVirt OpenDaylight OpenStack integration.
+
+The tool can be used to get mdsal model dumps, openvswitch flow dumps
+and extracting dumps from CSIT output.xml files.
+
+*****
+Usage
+*****
+::
+
+ usage: python -m odltools [-h] [-v] [-V] {csit,model,analyze} ...
+
+ OpenDaylight Troubleshooting Tools
+
+ optional arguments:
+ -h, --help show this help message and exit
+ -v, --verbose verbosity (-v, -vv)
+ -V, --version show program's version number and exit
+
+ subcommands:
+ Command Tool
+
+ {csit,model,analyze}
+
+************
+Installation
+************
+::
+
+ pip install odltools
-__version__ = '0.1.0'
+__version__ = '0.1.1'
import logg
-if __name__ == "__main__":
+def main():
logg.Logger()
cli.main()
+
+if __name__ == "__main__":
+ main()
import argparse
-import csit.cli
+
import mdsal.cli
import netvirt.cli
+import odltools.csit.cli
__version__ = "0.1"
parser.add_argument("-V", "--version", action="version",
version="%(prog)s (version {version})".format(version=__version__))
subparsers = parser.add_subparsers(dest="command", description="Command Tool")
- csit.cli.add_parser(subparsers)
- mdsal.cli.add_parser(subparsers)
- netvirt.cli.add_parser(subparsers)
+ odltools.csit.cli.add_parser(subparsers)
+ odltools.mdsal.cli.add_parser(subparsers)
+ odltools.netvirt.cli.add_parser(subparsers)
return parser
import logging
-import os
-import re
import xml.etree.cElementTree as ET
from subprocess import Popen
-from ovs import flows
+import os
+import re
+
+from odltools.ovs import flows
logger = logging.getLogger("csit.robotfiles")
self.re_normalize_text = re.compile(r"( \n)|(\[A\[C.*)")
# uri=restconf/config/interface-service-bindings:service-bindings, headers=None json=None</msg>
self.re_uri = re.compile(r"uri=(?P<uri>.*),")
+ logger.info("RobotFiles created")
- def gunzip_output_file(self):
+ def gunzip(self):
infile = self.datafilepath
basename = os.path.splitext(os.path.basename(self.datafilepath))[0]
self.datafilepath = "{}/{}".format(self.outdir, basename)
Popen("gunzip -cfk {} > {}".format(infile, self.datafilepath), shell=True).wait()
+ logger.info("gunzip -cfk %s > %s", infile, self.datafilepath)
def mkdir(self, path):
try:
def mk_outdir(self):
self.mkdir(self.outdir)
+ logger.info("mk_outdir: %s created", self.outdir)
def read_chunks(self, fp):
while True:
robotfile.print_config()
robotfile.mk_outdir()
if args.gunzip:
- robotfile.gunzip_output_file()
+ robotfile.gunzip()
robotfile.print_config()
robotfile.parse_xml_data_file()
robotfile.write_pdata()
import os
import unittest
-from csit.robotfiles import RobotFiles
+
from odltools import logg
+from odltools.csit.robotfiles import RobotFiles
# Requirements
# - running tests will create job dir, unzip, parse and format output
class TestRobotFiles(unittest.TestCase):
- DATAPATH = "/tmp/output_01_l2.xml.gz"
+ DATAPATH = "/tmp/output_02_l3.xml.gz"
OUTPATH = "/tmp/robotjob"
def setUp(self):
def test_gunzip_xml_data_file(self):
self.robotfile = RobotFiles(self.DATAPATH, self.OUTPATH)
self.robotfile.mk_outdir()
- self.robotfile.gunzip_output_file()
+ self.robotfile.gunzip()
self.assertTrue(os.path.isfile(self.robotfile.datafilepath))
def test_parse_xml_data_file(self):
self.robotfile = RobotFiles(self.DATAPATH, self.OUTPATH)
self.robotfile.print_config()
self.robotfile.mk_outdir()
- self.robotfile.gunzip_output_file()
+ self.robotfile.gunzip()
self.robotfile.parse_xml_data_file()
print "tests: {}".format(len(self.robotfile.pdata))
-import models
+import cmd
def add_dump_parser(parsers):
help="OpenDaylight restconf username, default: admin")
parser.add_argument("-w", "--pw", default="admin",
help="OpenDaylight restconf password, default: admin")
- parser.set_defaults(func=models.run_dump)
+ parser.set_defaults(func=cmd.run_dump)
def add_parser(parsers):
import request
-from mdsal.model import Model
-from mdsal import elan
-from mdsal import id_manager
-from mdsal import ietf_interfaces
-from mdsal import interface_service_bindings
-from mdsal import itm_state
-from mdsal import l3vpn
-from mdsal import mip
-from mdsal import network_topology
-from mdsal import neutron
-from mdsal import odl_fib
-from mdsal import odl_interface_meta
-from mdsal import odl_l3vpn
-from mdsal import opendaylight_inventory
-
+from model import Model
+from odltools.mdsal.models import opendaylight_inventory, network_topology, itm_state, elan, id_manager, \
+ ietf_interfaces, interface_service_bindings, l3vpn, mip, neutron, odl_fib, odl_interface_meta, odl_l3vpn
DSM_FILE = 0
DSM_DSTYPE = 1
import json
+
import request
-from model import Model
+from odltools.mdsal.model import Model
NAME = "elan"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "id-manager"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "ietf-interfaces"
import collections
-from model import Model
+from odltools.mdsal.model import Model
NAME = "interface-service-bindings"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "itm-state"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "l3vpn"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "mip"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "network-topology"
return topology[self.NODE]
def get_nodes_by_tid_and_key(self, tid="ovsdb:1", key='node-id'):
- nodes = self.get_nodes_by_tid_and_key(tid, key)
+ nodes = self.get_nodes_by_tid(tid)
d = {}
for node in nodes:
d[node[key]] = node
-from model import Model
+from odltools.mdsal.model import Model
NAME = "neutron"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "odl-fib"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "odl-interface-meta"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "odl-l3vpn"
-from model import Model
+from odltools.mdsal.model import Model
NAME = "opendaylight-inventory"
import unittest
-from mdsal.model import Model
-from mdsal.ietf_interfaces import interfaces
+
from odltools import logg
+from odltools.mdsal.model import Model
+from odltools.mdsal.models.ietf_interfaces import interfaces
ip = "127.0.0.1"
port = "8080"
import unittest
-from mdsal import itm_state
-from mdsal.model import Model
-from mdsal.itm_state import DpnEndpoints
+
from odltools import logg
+from odltools.mdsal.model import Model
+from odltools.mdsal.models import itm_state
+from odltools.mdsal.models.itm_state import DpnEndpoints
ip = "127.0.0.1"
port = "8080"
import os
import shutil
import unittest
-from mdsal import models
+
from odltools import logg
+from odltools.mdsal import models
class TestModels(unittest.TestCase):
import unittest
-from mdsal.model import Model
-from mdsal.network_topology import network_topology
-from mdsal.network_topology import NetworkTopology
+
from odltools import logg
+from odltools.mdsal.model import Model
+from odltools.mdsal.models.network_topology import NetworkTopology
+from odltools.mdsal.models.network_topology import network_topology
ip = "127.0.0.1"
port = "8080"
import unittest
-from mdsal import request
+
from odltools import logg
+from odltools.mdsal import request
class TestRequest(unittest.TestCase):
-import constants as const
-import flow_parser as fp
import json
-import netvirt_utils as utils
from collections import defaultdict
-from mdsal.model import Model
-from mdsal import elan
-from mdsal import id_manager
-from mdsal import ietf_interfaces
-from mdsal import interface_service_bindings
-from mdsal import itm_state
-from mdsal import l3vpn
-from mdsal import mip
-from mdsal import network_topology
-from mdsal import neutron
-from mdsal import odl_fib
-from mdsal import odl_interface_meta
-from mdsal import odl_l3vpn
-from mdsal import opendaylight_inventory
+import constants as const
+import flow_parser as fp
+import netvirt_utils as utils
+from odltools.mdsal.model import Model
+from odltools.mdsal.models import opendaylight_inventory, network_topology, itm_state, elan, id_manager, \
+ ietf_interfaces, interface_service_bindings, l3vpn, mip, neutron, odl_fib, odl_interface_meta, odl_l3vpn
# Required
ifaces = None
if __name__ == '__main__':
- import sys
main()
import logging
from pprint import pformat
+
import re
-import tables
-import request
+import request
+import tables
logger = logging.getLogger("ovs.flows")
elif type(data) is list:
self.data = data
else:
- logger.error("init: data is not a supproted type")
+ logger.error("init: data is not a supported type")
return
self.start = 0
logger.info("init: Copied %d lines", len(self.data))
fline = "{:3} {:9} {:8} {:3} {:13} {:6} {:12} {:1} {:3} {:5}\n" \
" matches={}\n" \
" actions={}\n" \
- .format(i+1, line[Flows.COOKIE], line[Flows.DURATION],
+ .format(i + 1, line[Flows.COOKIE], line[Flows.DURATION],
line[Flows.TABLE], tables.get_table_name(int(line[Flows.TABLE])),
line[Flows.N_PACKETS], line[Flows.N_BYTES],
line[Flows.SEND_FLOW_REMOVED][0], line[Flows.IDLE_TIMEOUT],
import unittest
-from odltools import logg
-from ovs import flows
+
from ovs import request
+from odltools import logg
+from odltools.ovs import flows
+
class TestFlows(unittest.TestCase):
def setUp(self):
import logging
import unittest
+
from odltools import logg
-from ovs import request
+from odltools.ovs import request
class TestRequest(unittest.TestCase):
import unittest
+
from odltools import logg
-from ovs import tables
+from odltools.ovs import tables
class TestTables(unittest.TestCase):
import unittest
+
from odltools import cli
-from csit import robotfiles
+from odltools.csit import robotfiles
class TestOdltools(unittest.TestCase):
--- /dev/null
+requests
\ No newline at end of file
[bdist_wheel]
universal=1
-[metadata]
-license_file = LICENSE.txt
\ No newline at end of file
+[egg_info]
+#tag_build = dev
+tag_build =
\ No newline at end of file
import io
-import re
from setuptools import find_packages
from setuptools import setup
+import textwrap
+from odltools import __version__
-# with io.open('README.rst', 'rt', encoding='utf8') as f:
-# readme = f.read()
-
-with io.open('odltools/__init__.py', 'rt', encoding='utf8') as f:
- version = re.search(r'__version__ = \'(.*?)\'', f.read()).group(1)
+with io.open("README.rst", "rt", encoding="utf8") as f:
+ readme = f.read()
+with open("requirements.txt") as f:
+ requirements = f.read().splitlines()
setup(
- name='odltools',
- version=version,
- description='OpenDaylight Troubleshooting Tools',
- url='http://github.com/shague/odltools',
- author='Sam Hague, Vishal Thapar',
- author_email='shague@gmail.com, thapar@gmail.com',
- license='EPL',
- packages=find_packages(exclude=['*.iml', 'tests*']),
- install_requires=['requests'],
+ name="odltools",
+ version=__version__,
+ description="NetVirt tools for troubleshooting OpenDaylight and "
+ "OpenStack integration",
+ long_description=readme,
+ long_description_content_type="text/x-rst; charset=UTF-8",
+ url="http://github.com/shague/odltools",
+ author="Sam Hague, Vishal Thapar",
+ author_email="shague@gmail.com, thapar@gmail.com",
+ license="Eclipse Public License",
+ packages=find_packages(exclude=["tests"]),
+ install_requires=requirements,
+ platforms=["All"],
+ python_requires=">=2.7",
+ keywords="development",
zip_safe=False,
- classifiers=[
- 'Development Status :: 3 - Alpha',
- 'Intended Audience :: Developers',
- 'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
- 'Topic :: Software Development'
- ],
- keywords='development',
- python_requires='>=2.7'
-)
\ No newline at end of file
+ # entry_points={"console_scripts": ["odltools=odltools.__main__:main"]},
+ classifiers=textwrap.dedent("""
+ Development Status :: 1 - Planning
+ Intended Audience :: Developers
+ License :: OSI Approved :: Eclipse Public License 1.0 (EPL-1.0)
+ Natural Language :: English
+ Operating System :: OS Independent
+ Programming Language :: Python
+ Programming Language :: Python :: 2.7
+ Topic :: Software Development
+ Topic :: Utilities
+ """).strip().splitlines()
+)