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")
+ logger.debug("RobotFiles created")
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)
+ logger.debug("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)
+ logger.debug("mk_outdir: %s created", self.outdir)
def read_chunks(self, fp):
while True:
+import logging
import os
import unittest
OUTPATH = "/tmp/robotjob"
def setUp(self):
- logg.Logger()
+ logg.Logger(logging.INFO, logging.INFO)
def test_mk_outdir(self):
self.robotfile = RobotFiles(self.DATAPATH, self.OUTPATH)
self.robotfile.mk_outdir()
self.assertTrue(os.path.isdir(self.robotfile.outdir))
+ @unittest.skip("skipping")
def test_gunzip_xml_data_file(self):
self.robotfile = RobotFiles(self.DATAPATH, self.OUTPATH)
self.robotfile.mk_outdir()
self.robotfile.gunzip()
self.assertTrue(os.path.isfile(self.robotfile.datafilepath))
+ @unittest.skip("skipping")
def test_parse_xml_data_file(self):
self.robotfile = RobotFiles(self.DATAPATH, self.OUTPATH)
self.robotfile.print_config()
from odltools.mdsal.models.model import Model
-NAME = "elan"
+MODULE = "elan"
def elan_instances(store, args):
- return ElanInstances(NAME, ElanInstances.CONTAINER, store, args)
+ return ElanInstances(MODULE, store, args)
def elan_interfaces(store, args):
- return ElanInterfaces(NAME, ElanInterfaces.CONTAINER, store, args)
+ return ElanInterfaces(MODULE, store, args)
class ElanInstances(Model):
CONTAINER = "elan-instances"
- ELAN_INSTANCE = "elan-instance"
-
- def get_elan_instances(self):
- return self.data[self.CONTAINER][self.ELAN_INSTANCE]
-
- def get_elan_instances_by_key(self, key="elan-instance-name"):
- d = {}
- instances = self.get_elan_instances()
- for instance in instances:
- d[instance[key]] = instance
- return d
+ CLIST = "elan-instance"
+ CLIST_KEY = "elan-instance-name"
class ElanInterfaces(Model):
CONTAINER = "elan-interfaces"
- ELAN_INSTANCE = "elan-interface"
-
- def get_elan_interfaces(self):
- return self.data[self.CONTAINER][self.ELAN_INSTANCE]
-
- def get_elan_interfaces_by_key(self, key="name"):
- d = {}
- ifaces = self.get_elan_interfaces()
- for iface in ifaces:
- d[iface[key]] = iface
- return d
+ CLIST = "elan-interface"
+ CLIST_KEY = "name"
from odltools.mdsal.models.model import Model
-NAME = "id-manager"
+MODULE = "id-manager"
def id_pools(store, args):
- return IdPools(NAME, IdPools.CONTAINER, store, args)
+ return IdPools(MODULE, store, args)
class IdPools(Model):
CONTAINER = "id-pools"
- ID_POOL = "id-pool"
-
- def get_id_pools(self):
- return self.data[self.CONTAINER][self.ID_POOL]
-
- def get_id_pools_by_key(self, key="pool-name"):
- d = {}
- idpools = self.get_id_pools()
- if idpools is None:
- return None
- for idpool in idpools:
- d[idpool[key]] = idpool
- return d
+ CLIST = "id-pool"
+ CLIST_KEY = "pool-name"
from odltools.mdsal.models.model import Model
-NAME = "ietf-interfaces"
+MODULE = "ietf-interfaces"
def interfaces(store, args):
- return Interfaces(NAME, Interfaces.CONTAINER, store, args)
+ return Interfaces(MODULE, store, args)
def interfaces_state(store, args):
- return InterfacesState(NAME, InterfacesState.CONTAINER, store, args)
+ return InterfacesState(MODULE, store, args)
class Interfaces(Model):
CONTAINER = "interfaces"
- INTERFACE = "interface"
-
- def get_interfaces(self):
- return self.data and self.data[self.CONTAINER][self.INTERFACE]
-
- def get_interfaces_by_key(self, key="name"):
- d = {}
- ifaces = self.get_interfaces()
- if ifaces is None:
- return None
- for iface in ifaces:
- d[iface[key]] = iface
- return d
+ CLIST = "interface"
+ CLIST_KEY = "name"
class InterfacesState(Model):
- ROOT = NAME
CONTAINER = "interfaces-state"
- INTERFACE = "interface"
-
- def get_interfaces(self):
- return self.data[self.CONTAINER][self.INTERFACE]
-
- def get_interfaces_by_key(self, key="name"):
- d = {}
- ifaces = self.get_interfaces()
- if ifaces is None:
- return None
- for iface in ifaces:
- d[iface[key]] = iface
- return d
+ CLIST = "interface"
+ CLIST_KEY = "name"
from odltools.mdsal.models.model import Model
-NAME = "interface-service-bindings"
+MODULE = "interface-service-bindings"
def service_bindings(store, args):
- return ServiceBindings(NAME, ServiceBindings.CONTAINER, store, args)
+ return ServiceBindings(MODULE, store, args)
class ServiceBindings(Model):
CONTAINER = "service-bindings"
- SERVICES_INFO = "services-info"
-
- def get_services_infos(self):
- return self.data[self.CONTAINER][self.SERVICES_INFO]
+ CLIST = "services-info"
+ CLSIT_KEY = "interface-name"
def get_service_bindings(self):
sb_dict = collections.defaultdict(dict)
orphans_dict = collections.defaultdict(dict)
- sb_infos = self.get_services_infos()
- if sb_infos is None:
- return None
+ sb_infos = self.get_clist()
for sb_info in sb_infos:
service_mode = sb_info['service-mode'][len('interface-service-bindings:'):]
if sb_info.get('bound-services'):
from odltools.mdsal.models.model import Model
-NAME = "itm-state"
+MODULE = "itm-state"
def dpn_endpoints(store, args):
- return DpnEndpoints(NAME, DpnEndpoints.CONTAINER, store, args)
+ return DpnEndpoints(MODULE, store, args)
def interfaces(store, args):
- return DpnTepsState(NAME, DpnTepsState.CONTAINER, store, args)
+ return DpnTepsState(MODULE, store, args)
def tunnels_state(store, args):
- return TunnelsState(NAME, TunnelsState.CONTAINER, store, args)
+ return TunnelsState(MODULE, store, args)
class DpnEndpoints(Model):
CONTAINER = "dpn-endpoints"
- DPN_TEPS_INFO = "DPN-TEPs-info"
+ CLIST = "DPN-TEPs-info"
+ CLIST_KEY = ""
DPN_ID = "DPN-ID"
TUNNEL_END_POINTS = "tunnel-end-points"
IP_ADDRESS = "ip-address"
- def get_dpn_teps_infos(self):
- return self.data[self.CONTAINER][self.DPN_TEPS_INFO]
-
def get_dpn_teps_info(self, dpn_id):
- dpn_teps_infos = self.get_dpn_teps_infos()
+ dpn_teps_infos = self.get_clist()
for dpn_teps_info in dpn_teps_infos:
if dpn_teps_info[self.DPN_ID] == dpn_id:
return dpn_teps_info
def get_tunnel_endpoints(self, dpn_id):
- dpn_teps_infos = self.get_dpn_teps_infos()
+ dpn_teps_infos = self.get_clist()
for dpn_teps_info in dpn_teps_infos:
if dpn_teps_info[self.DPN_ID] == dpn_id:
return dpn_teps_info[self.TUNNEL_END_POINTS]
class DpnTepsState(Model):
CONTAINER = "dpn-teps-state"
- DPN_TEPS = "dpns-teps"
-
- def get_dpn_teps(self):
- return self.data[self.CONTAINER][self.DPN_TEPS]
+ CLIST = "dpns-teps"
def get_tuninterfaces_by_name(self):
d = {}
- tunifaces = self.get_dpn_teps()
- if tunifaces is None:
- return None
+ tunifaces = self.get_clist()
for sourcedpn in tunifaces:
for remotedpn in sourcedpn['remote-dpns']:
d[remotedpn['tunnel-name']] = remotedpn
class TunnelsState(Model):
CONTAINER = "tunnels_state"
- STATE_TUNNEL_LIST = "state-tunnel-list"
-
- def get_state_tunnel_list(self):
- return self.data[self.CONTAINER][self.STATE_TUNNEL_LIST]
-
- def get_tunnels_by_key(self, key="tunnel-interface-name"):
- d = {}
- tunnels = self.get_state_tunnel_list()
- if tunnels is None:
- return None
- for tunnel in tunnels:
- d[tunnel[key]] = tunnel
- return d
+ CLIST = "state-tunnel-list"
+ CLIST_KEY = "tunnel-interface-name"
from odltools.mdsal.models.model import Model
-NAME = "l3vpn"
+MODULE = "l3vpn"
def vpn_instance_to_vpn_id(store, args):
- return VpnInterfaces(NAME, VpnInterfaces.CONTAINER, store, args)
+ return VpnInterfaces(MODULE, store, args)
class VpnInterfaces(Model):
CONTAINER = "vpn-interfaces"
- VPN_INTERFACE = "vpn-interface"
-
- def get_vpn_interfaces(self):
- return self.data[self.CONTAINER][self.VPN_INTERFACE]
-
- def get_vpn_ids_by_key(self, key="name"):
- d = {}
- ifaces = self.get_vpn_interfaces()
- if ifaces is None:
- return None
- for iface in ifaces:
- d[iface[key]] = iface
- return d
+ CLIST = "vpn-interface"
+ CLIST_KEY = "name"
from odltools.mdsal.models.model import Model
-NAME = "mip"
+MODULE = "mip"
def mac(store, args):
- return Mac(NAME, Mac.CONTAINER, store, args)
+ return Mac(MODULE, store, args)
class Mac(Model):
CONTAINER = "mac"
- ENTRY = "entry"
-
- def get_entries(self):
- return self.data[self.CONTAINER][self.ENTRY]
-
- def get_entries_by_key(self, key="name"):
- d = {}
- entries = self.get_entries()
- if entries is None:
- return None
- for entry in entries:
- entry['mac'] = entry['mac'].lower()
- d[entry.get('mac')][entry.get('network-id')] = entry
- return d
+ CLIST = "entry"
+ CLIST_KEY = "name"
import json
+import logging
import odltools.mdsal.request
+logger = logging.getLogger("mdsal.model")
+
class Model:
CONFIG = "config"
OPERATIONAL = "operational"
USER = "admin"
PW = "admin"
-
- def __init__(self, name, container, store, args, mid=None):
- self.name = name
- self.container = container
+ CONTAINER = "container"
+ CLIST = "clist"
+ CLIST_KEY = "key"
+
+ def __init__(self, modul, store, args, mid=None):
+ self.modul = modul
+ self.container = self.CONTAINER # container
+ self.clist = self.CLIST # clist
+ self.clist_key = self.CLIST_KEY # clist_key
self.store = store
self.http = 'https' if args.https else 'http'
self.ip = args.ip
self.filename = self.make_filename_type(mid)
self.data = None
self.data = self.get_model_data()
+ if self.data is None:
+ logger.warning("Model data was not imported")
+ elif self.get_clist() is []:
+ logger.warning("Model data is wrong")
+ self.data = None
+
+ def get_list(self, data, container_key, lst):
+ c = data and data.get(container_key, {})
+ l = c.get(lst, [])
+ return l
+
+ def get_clist(self):
+ return self.get_list(self.data, self.container, self.clist)
+
+ def get_clist_by_key(self, key=None):
+ d = {}
+ key = key or self.clist_key
+ cl = self.get_clist()
+ for l in cl:
+ d[l[key]] = l
+ return d
def make_filename(self):
- return "{}/{}___{}__{}.json".format(self.path, self.store, self.name, self.container)
+ return "{}/{}___{}__{}.json".format(self.path, self.store, self.modul, self.container)
def make_filename_type(self, mid):
fmid = mid.replace(":", "__")
- return "{}/{}___{}__{}___topology___{}.json".format(self.path, self.store, self.name, self.container, fmid)
+ return "{}/{}___{}__{}___topology___{}.json".format(self.path, self.store, self.modul, self.container, fmid)
def make_url(self):
return "{}://{}:{}/restconf/{}/{}:{}".format(self.http, self.ip, self.port,
- self.store, self.name,
+ self.store, self.modul,
self.container)
def make_url_type(self, mid):
return "{}://{}:{}/restconf/{}/{}:{}/topology/{}".format(self.http, self.ip, self.port,
- self.store, self.name,
+ self.store, self.modul,
self.container, mid)
def get_from_odl(self):
from odltools.mdsal.models.model import Model
-NAME = "network-topology"
+MODULE = "network-topology"
def network_topology(store, args, mid="ovsdb:1"):
- return NetworkTopology(NAME, NetworkTopology.CONTAINER, store, args, mid)
+ return NetworkTopology(MODULE, store, args, mid)
class NetworkTopology(Model):
NODE = "node"
OVSDB1 = "ovsdb:1"
- def get_topologies(self):
+ def get_clist(self):
return self.data[self.TOPOLOGY]
def get_topology_by_tid(self, tid="ovsdb:1"):
- topologies = self.get_topologies()
- if topologies is None:
- return None
+ topologies = self.get_clist()
for topology in topologies:
if topology['topology-id'] == tid:
return topology
+ return {}
def get_nodes_by_tid(self, tid="ovsdb:1"):
topology = self.get_topology_by_tid(tid)
- return topology[self.NODE]
+ return topology.get(self.NODE, [])
def get_nodes_by_tid_and_key(self, tid="ovsdb:1", key='node-id'):
d = {}
nodes = self.get_nodes_by_tid(tid)
- if nodes is None:
- return None
for node in nodes:
d[node[key]] = node
return d
from odltools.mdsal.models.model import Model
-NAME = "neutron"
+MODULE = "neutron"
def neutron(store, args):
- return Neutron(NAME, Neutron.CONTAINER, store, args)
+ return Neutron(MODULE, store, args)
class Neutron(Model):
ROUTER = "router"
TRUNKS = "trunks"
TRUNK = "trunk"
- NAME = "name"
+ MODULE = "name"
UUID = "uuid"
- def get_ports(self):
- return self.data[self.CONTAINER][self.PORTS][self.PORT]
+ def get_clist(self):
+ return self.data[self.CONTAINER]
- def get_ports_by_key(self, key="uuid"):
+ def get_ccl(self, parent, child, item):
+ c = self.data and self.data.get(parent, {})
+ l = self.get_list(c, child, item)
+ return l
+
+ def get_ccl_by_key(self, parent, child, item, key="uuid"):
d = {}
- ports = self.get_ports()
- if ports is None:
- return None
- for port in ports:
- d[port[key]] = port
+ lst = self.get_ccl(parent, child, item)
+ for l in lst:
+ d[l[key]] = l
return d
- def get_trunks(self):
- return self.data[self.CONTAINER][self.TRUNKS][self.TRUNK]
+ def get_networks_by_key(self, key="uuid"):
+ return self.get_ccl_by_key(self.CONTAINER, self.NETWORKS, self.NETWORK, key)
+
+ def get_ports_by_key(self, key="uuid"):
+ return self.get_ccl_by_key(self.CONTAINER, self.PORTS, self.PORT, key)
def get_trunks_by_key(self, key="uuid"):
- d = {}
- trunks = self.get_trunks()
- if trunks is None:
- return None
- for trunk in trunks:
- d[trunk[key]] = trunk
- return d
+ return self.get_ccl_by_key(self.CONTAINER, self.TRUNKS, self.TRUNK, key)
from odltools.mdsal.models.model import Model
-NAME = "odl-fib"
+MODULE = "odl-fib"
def fib_entries(store, args):
- return FibEntries(NAME, FibEntries.CONTAINER, store, args)
+ return FibEntries(MODULE, store, args)
class FibEntries(Model):
CONTAINER = "fibEntries"
- VRFTABLES = "vrfTables"
+ CLIST = "vrfTables"
+ CLIST_KEY = "routeDistinguisher"
VRFENTRY = "vrfEntry"
ROUTEDISTINGUISHER = "routeDistinguisher"
+ ROUTEPATHS = "route-paths"
RD = "rd"
- def get_vrf_tables(self):
- return self.data[self.CONTAINER][self.VRFTABLES]
-
def get_vrf_entries_by_key(self, key="label"):
d = {}
- vrf_tables = self.get_vrf_tables()
- if vrf_tables is None:
- return None
+ vrf_tables = self.get_clist()
for vrf_table in vrf_tables:
for vrf_entry in vrf_table.get(self.VRFENTRY, []):
- if vrf_entry.get('label'):
- vrf_entry[self.RD] = vrf_table[self.ROUTEDISTINGUISHER]
- d[vrf_entry[key]] = vrf_entry
+ for route_paths in vrf_entry.get(FibEntries.ROUTEPATHS, {}):
+ if route_paths.get(key):
+ vrf_entry[self.RD] = vrf_table[self.ROUTEDISTINGUISHER]
+ d[route_paths.get(key)] = vrf_entry
return d
from odltools.mdsal.models.model import Model
-NAME = "odl-interface-meta"
+MODULE = "odl-interface-meta"
def if_indexes_interface_map(store, args):
- return IfIndexesInterfaceMap(NAME, IfIndexesInterfaceMap.CONTAINER, store, args)
+ return IfIndexesInterfaceMap(MODULE, store, args)
class IfIndexesInterfaceMap(Model):
CONTAINER = "if-indexes-interface-map"
- IF_INDEX_INTERFACE = "if-index-interface"
-
- def get_if_index_interfaces(self):
- return self.data[self.CONTAINER][self.IF_INDEX_INTERFACE]
-
- def get_if_index_interfaces_by_key(self, key="if-index"):
- d = {}
- ifaces = self.get_if_index_interfaces()
- if ifaces is None:
- return None
- for iface in ifaces:
- d[iface[key]] = iface
- return d
-
-
-class ElanInterfaces(Model):
- CONTAINER = "elan-interfaces"
- ELAN_INSTANCE = "elan-instance"
-
- def get_elan_interfaces(self):
- return self.data[self.CONTAINER][self.ELAN_INSTANCE]
-
- def get_elan_interfaces_by_key(self, key="name"):
- d = {}
- ifaces = self.get_elan_interfaces()
- if ifaces is None:
- return None
- for iface in ifaces:
- d[iface[key]] = iface
- return d
+ CLIST = "if-index-interface"
+ CLIST_KEY= "if-index"
from odltools.mdsal.models.model import Model
-NAME = "odl-l3vpn"
+MODULE = "odl-l3vpn"
def vpn_id_to_vpn_instance(store, args):
- return VpnIdToVpnInstance(NAME, VpnIdToVpnInstance.CONTAINER, store, args)
+ return VpnIdToVpnInstance(MODULE, store, args)
def vpn_instance_to_vpn_id(store, args):
- return VpnInstanceToVpnId(NAME, VpnInstanceToVpnId.CONTAINER, store, args)
+ return VpnInstanceToVpnId(MODULE, store, args)
class VpnIdToVpnInstance(Model):
CONTAINER = "vpn-id-to-vpn-instance"
- VPN_IDS = "vpn-ids"
-
- def get_vpn_ids(self):
- return self.data[self.CONTAINER][self.VPN_IDS]
-
- def get_vpn_ids_by_key(self, key="vpn-id"):
- d = {}
- vpnids = self.get_vpn_ids()
- if vpnids is None:
- return None
- for vpnid in vpnids:
- d[vpnid[key]] = vpnid
- return d
+ CLIST = "vpn-ids"
+ CLIST_KEY = "vpn-id"
class VpnInstanceToVpnId(Model):
CONTAINER = "vpn-instance-to-vpn-id"
- VPN_INSTANCE = "vpn-instance"
-
- def get_vpn_instances(self):
- return self.data[self.CONTAINER][self.VPN_INSTANCE]
-
- def get_vpn_instances_by_key(self, key="vpn-id"):
- d = {}
- instances = self.get_vpn_instances()
- if instances is None:
- return None
- for instance in instances:
- d[instance[key]] = instance
- return d
+ CLIST = "vpn-instance"
+ CLIST_KEY = "vpn-id"
from odltools.mdsal.models.model import Model
-NAME = "opendaylight-inventory"
+MODULE = "opendaylight-inventory"
def nodes(store, args):
- return Nodes(NAME, Nodes.CONTAINER, store, args)
+ return Nodes(MODULE, store, args)
class Nodes(Model):
CONTAINER = "nodes"
- NODE = "node"
+ CLIST = "node"
+ CLIST_KEY = "id"
NODE_GROUP = 'flow-node-inventory:group'
NODE_TABLE = 'flow-node-inventory:table'
- def get_nodes(self):
- return self.data[self.CONTAINER][self.NODE]
-
- def get_nodes_by_key(self, key="id"):
- d = {}
- nodez = self.get_nodes()
- if nodez is None:
- return None
- for node in nodez:
- d[node[key]] = node
- return d
-
def get_groups(self, of_nodes=None):
key = "group-id"
group_dict = collections.defaultdict(dict)
- for node in of_nodes.itervalues():
+ nodez = of_nodes or self.get_clist_by_key()
+ for node in nodez.itervalues():
dpnid = self.get_dpn_from_ofnodeid(node['id'])
for group in node.get(Nodes.NODE_GROUP, []):
if group_dict.get(dpnid) and group_dict.get(dpnid).get(group[key]):
def get_dpn_host_mapping(self, oper_nodes=None):
nodes_dict = {}
- nodes = oper_nodes or self.get_nodes_by_key()
- for node in nodes.itervalues():
+ nodez = oper_nodes or self.get_clist_by_key()
+ for node in nodez.itervalues():
dpnid = self.get_dpn_from_ofnodeid(node['id'])
nodes_dict[dpnid] = node.get('flow-node-inventory:description', '')
return nodes_dict
+import os
+
+
class Args:
- def __init__(self, ip="localhost", port=8181, user="admin", pw="admin", path="/tmp", pretty_print=False):
+ def __init__(self, https="http", ip="localhost", port=8181, user="admin", pw="admin", path="/tmp",
+ pretty_print=False):
+ self.https = https
self.ip = ip
self.port = port
self.user = user
self.pw = pw
self.path = path
- self.pretty_print=pretty_print
+ self.pretty_print = pretty_print
+
+
+def get_resources_path():
+ return os.path.join(os.path.dirname(__file__), '../../tests/resources')
from odltools.mdsal.tests import Args
+@unittest.skip("skipping")
class TestCmd(unittest.TestCase):
def setUp(self):
- logg.Logger(logging.DEBUG, logging.DEBUG)
+ logg.Logger(logging.INFO, logging.INFO)
self.args = Args(path="/tmp/testmodels", pretty_print=True)
def test_get_all_dumps(self):
# Ensure odl is running at localhost:8181
- shutil.rmtree(self.args.path)
+ # Remove an existing directory
+ if os.path.exists(self.args.path):
+ if os.path.islink(self.args.path):
+ os.unlink(self.args.path)
+ else:
+ shutil.rmtree(self.args.path)
+
cmd.get_all_dumps(self.args)
# assert each model has been saved to a file
+import logging
import unittest
from odltools import logg
from odltools.mdsal.models.ietf_interfaces import interfaces
+from odltools.mdsal.models.ietf_interfaces import interfaces_state
from odltools.mdsal.models.model import Model
-from odltools.mdsal.tests import Args
+from odltools.mdsal import tests
class TestIetfInterfaces(unittest.TestCase):
def setUp(self):
- logg.Logger()
- args = Args(path="../../tests/resources")
+ logg.Logger(logging.INFO, logging.INFO)
+ args = tests.Args(path=tests.get_resources_path())
self.interfaces = interfaces(Model.CONFIG, args)
+ self.interfaces_state = interfaces_state(Model.OPERATIONAL, args)
def test_get_interfaces_by_key(self):
- d = self.interfaces.get_interfaces_by_key()
- self.assertIsNotNone(d and d['tun95fee4d7132'])
+ d = self.interfaces.get_clist_by_key()
+ self.assertIsNotNone(d.get('tun95fee4d7132'))
+
+ def test_get_interfaces_state_by_key(self):
+ d = self.interfaces_state.get_clist_by_key()
+ self.assertIsNotNone(d.get('tap67eb9b7f-db'))
if __name__ == '__main__':
unittest.main()
+import logging
import unittest
from odltools import logg
from odltools.mdsal.models.itm_state import dpn_endpoints
from odltools.mdsal.models.itm_state import DpnEndpoints
+from odltools.mdsal.models.itm_state import tunnels_state
from odltools.mdsal.models.model import Model
-from odltools.mdsal.tests import Args
+from odltools.mdsal import tests
+
+logger = logging.getLogger("test.itmstate")
class TestItmState(unittest.TestCase):
def setUp(self):
- logg.Logger()
- args = Args(path="../../tests/resources")
+ logg.Logger(logging.INFO, logging.INFO)
+ args = tests.Args(path=tests.get_resources_path())
self.dpn_endpoints = dpn_endpoints(Model.CONFIG, args)
+ self.tunnels_state = tunnels_state(Model.OPERATIONAL, args)
def test_read_file(self):
- print "dpn-endpoints: {}".format(self.dpn_endpoints.data)
- print "dpn-endpoints: \n{}".format(self.dpn_endpoints.pretty_format(self.dpn_endpoints.data))
+ logger.debug("dpn-endpoints: %s",self.dpn_endpoints.data)
+ logger.debug("dpn-endpoints: \n%s",self.dpn_endpoints.pretty_format(self.dpn_endpoints.data))
def test_get_ip_address(self):
dpn_ids = self.dpn_endpoints.get_dpn_ids()
dpn_id = dpn_ids[0]
ip_address = self.dpn_endpoints.get_ip_address(dpn_id)
- print "dpn_id: {}, ip_address: {}".format(dpn_id, ip_address)
+ logger.debug("dpn_id: %s, ip_address: %s", dpn_id, ip_address)
self.assertEqual(dpn_id, 132319289050514)
self.assertEqual(ip_address, "10.30.170.17")
def test_get_all(self):
- print "dpn-endpoints: {}".format(self.dpn_endpoints.data)
- print "dpn-endpoints: \n{}".format(self.dpn_endpoints.pretty_format(self.dpn_endpoints.data))
+ logger.debug("dpn-endpoints: %s", self.dpn_endpoints.data)
+ logger.debug("dpn-endpoints: \n%s", self.dpn_endpoints.pretty_format(self.dpn_endpoints.data))
dpn_ids = self.dpn_endpoints.get_dpn_ids()
dpn_id = dpn_ids[0]
dpn_teps_info = self.dpn_endpoints.get_dpn_teps_info(dpn_id)
- print "dpn_teps_info for {}: {}".format(dpn_id, dpn_teps_info)
+ logger.debug("dpn_teps_info for %s: %s", dpn_id, dpn_teps_info)
ip_address = self.dpn_endpoints.get_ip_address(dpn_id)
- print "ip_address: {}".format(ip_address)
+ logger.debug("ip_address: %s", ip_address)
self.assertEqual(ip_address, "10.30.170.17")
self.get_info(DpnEndpoints.CONTAINER)
- self.get_info(DpnEndpoints.DPN_TEPS_INFO)
+ self.get_info(DpnEndpoints.CLIST)
self.get_info(DpnEndpoints.TUNNEL_END_POINTS)
self.get_info(DpnEndpoints.DPN_ID)
def get_info(self, key):
info = self.dpn_endpoints.get_kv(key, self.dpn_endpoints.data, values=[])
- print "dpn info for {}: {}".format(key, info)
+ logger.debug("dpn info for %s: %s", key, info)
return info
+ def test_get_tunnels_state(self):
+ d = self.tunnels_state.get_clist_by_key()
+ self.assertIsNotNone(d and d['tun428ee8c4fe7'])
+
if __name__ == '__main__':
unittest.main()
+import logging
import unittest
from odltools import logg
from odltools.mdsal.models.model import Model
from odltools.mdsal.models.network_topology import NetworkTopology
from odltools.mdsal.models.network_topology import network_topology
-from odltools.mdsal.tests import Args
+from odltools.mdsal import tests
class TestNetworkTopology(unittest.TestCase):
def setUp(self):
- logg.Logger()
- args = Args(path="../../tests/resources")
+ logg.Logger(logging.INFO, logging.INFO)
+ args = tests.Args(path=tests.get_resources_path())
self.network_topology = network_topology(Model.CONFIG, args, NetworkTopology.OVSDB1)
def test_get_topologies(self):
- self.assertIsNotNone(self.network_topology.get_topologies())
+ self.assertIsNotNone(self.network_topology.get_clist())
def test_get_nodes_by_key(self):
d = self.network_topology.get_nodes_by_tid_and_key()
- self.assertIsNotNone(d and d['ovsdb://uuid/8eabb815-5570-42fc-9635-89c880ebc4ac/bridge/br-int'])
+ self.assertIsNotNone(d.get('ovsdb://uuid/8eabb815-5570-42fc-9635-89c880ebc4ac/bridge/br-int'))
if __name__ == '__main__':
unittest.main()
--- /dev/null
+import logging
+import unittest
+
+from odltools import logg
+from odltools.mdsal.models.neutron import neutron
+from odltools.mdsal.models.model import Model
+from odltools.mdsal import tests
+
+
+class TestNeutron(unittest.TestCase):
+ def setUp(self):
+ logg.Logger(logging.INFO, logging.INFO)
+ args = tests.Args(path=tests.get_resources_path())
+ self.neutron = neutron(Model.CONFIG, args)
+
+ def test_get_ports_by_key(self):
+ d = self.neutron.get_networks_by_key()
+ self.assertIsNotNone(d.get('bd8db3a8-2b30-4083-a8b3-b3fd46401142'))
+
+ def test_get_networks_by_key(self):
+ d = self.neutron.get_ports_by_key()
+ self.assertIsNotNone(d.get('8e3c262e-7b45-4222-ac4e-528db75e5516'))
+
+ @unittest.skip("skipping")
+ def test_get_trunks_by_key(self):
+ d = self.neutron.get_trunks_by_key()
+ self.assertIsNotNone(d.get('8e3c262e-7b45-4222-ac4e-528db75e5516'))
+
+if __name__ == '__main__':
+ unittest.main()
--- /dev/null
+import logging
+import unittest
+
+from odltools import logg
+from odltools.mdsal.models.odl_fib import fib_entries
+from odltools.mdsal.models.model import Model
+from odltools.mdsal import tests
+
+
+class TestOdlFib(unittest.TestCase):
+ def setUp(self):
+ logg.Logger(logging.INFO, logging.INFO)
+ args = tests.Args(path=tests.get_resources_path())
+ self.fib_entries = fib_entries(Model.CONFIG, args)
+
+ def test_get_clist_by_key(self):
+ d = self.fib_entries.get_clist_by_key()
+ self.assertIsNotNone(d.get('c7922261-90ab-4757-bc03-93ef3bbbaa19'))
+
+ def test_get_vrf_entries_by_key(self):
+ d = self.fib_entries.get_vrf_entries_by_key()
+ self.assertIsNotNone(d.get(100011))
+
+if __name__ == '__main__':
+ unittest.main()
--- /dev/null
+import logging
+import unittest
+
+from odltools import logg
+from odltools.mdsal.models.opendaylight_inventory import nodes
+from odltools.mdsal.models.model import Model
+from odltools.mdsal import tests
+
+
+class TestOpendaylightInventory(unittest.TestCase):
+ def setUp(self):
+ logg.Logger(logging.INFO, logging.INFO)
+ args = tests.Args(path=tests.get_resources_path())
+ self.nodes = nodes(Model.CONFIG, args)
+
+ def test_get_clist_by_key(self):
+ d = self.nodes.get_clist_by_key()
+ self.assertIsNotNone(d.get('openflow:132319289050514'))
+
+ def test_get_groups(self):
+ d = self.nodes.get_groups()
+ self.assertIsNotNone(d.get('132319289050514'))
+
+ def test_get_dpn_host_mapping(self):
+ d = self.nodes.get_dpn_host_mapping()
+ self.assertIsNotNone(d.get('132319289050514'))
+
+if __name__ == '__main__':
+ unittest.main()
+import logging
+import os
import unittest
from odltools import logg
from odltools.mdsal import request
+from odltools.mdsal import tests
class TestRequest(unittest.TestCase):
def setUp(self):
- logg.Logger()
- self.filename = "../../tests/resources/config___itm-state__dpn-endpoints.json"
+ logg.Logger(logging.INFO, logging.INFO)
+ self.filename = os.path.join(tests.get_resources_path(), 'config___itm-state__dpn-endpoints.json')
def test_read_file(self):
data = request.read_file(self.filename)
import config
import flow_parser
import flows
-import tables
-
from odltools.mdsal.models import constants
from odltools.mdsal.models import ietf_interfaces
from odltools.mdsal.models import itm_state
ports = neutron_neutron.get_ports_by_key()
port = ports.get(ifname)
elif iface and iface.get('type') == constants.IFTYPE_TUNNEL:
- # tunnels = itm_state_tunnels_state.get_tunnels_by_key()
+ # tunnels = itm_state_tunnels_state.get_clist_by_key()
# tunnel = tunnels.get(ifname)
- tun_states = itm_state_tunnels_state.get_tunnels_by_key()
+ tun_states = itm_state_tunnels_state.get_clist_by_key()
tun_state = tun_states.get(ifname)
else:
print "UNSUPPORTED IfType"
def analyze_interface(args):
ietf_interfaces_interfaces = ietf_interfaces.interfaces(Model.CONFIG, args)
- ifaces = ietf_interfaces_interfaces.get_interfaces_by_key()
+ ifaces = ietf_interfaces_interfaces.get_clist_by_key()
ietf_interfaces_interfaces_state = ietf_interfaces.interfaces_state(Model.OPERATIONAL, args)
- ifstates = ietf_interfaces_interfaces_state.get_interfaces_by_key()
+ ifstates = ietf_interfaces_interfaces_state.get_clist_by_key()
if not args.ifName:
print_keys(ifaces, ifstates)
nports = neutron_neutron.get_ports_by_key()
ntrunks = neutron_neutron.get_trunks_by_key()
- vpninterfaces = l3vpn_vpn_interfaces.get_vpn_ids_by_key()
- ifaces = ietf_interfaces_interfaces.get_interfaces_by_key()
- ifstates = ietf_interfaces_interfaces_state.get_interfaces_by_key()
+ vpninterfaces = l3vpn_vpn_interfaces.get_clist_by_key()
+ ifaces = ietf_interfaces_interfaces.get_clist_by_key()
+ ifstates = ietf_interfaces_interfaces_state.get_clist_by_key()
subport_dict = {}
for v in ntrunks.itervalues():
nport = nports.get(v.get('port-id'))
if flow.get('vlanid') and flow.get('vlanid') != vlanid:
flow_status = 'VlanId mismatch for SubPort:{} and Flow:{}'.format(subport, flow.get('flow'))
if subport:
- print 'SubPort:{},Table:{}/{},FlowStatus:{}'.format(
- subport.get('port-id'), flow.get('table'),
- tables.get_table_name(flow.get('table')),
- flow_status)
+ print 'SubPort:{},Table:{},FlowStatus:{}'.format(
+ subport.get('port-id'), flow.get('table'), flow_status)
def analyze_neutron_port(port, iface, ifstate):
if ((flow.get('ifname') == port['uuid']) or
(flow.get('lport') and ifstate and flow['lport'] == ifstate.get('if-index')) or
(iface['name'] == flow.get('ifname'))):
- result = 'Table:{}/{},FlowId:{}{}'.format(
- flow['table'], tables.get_table_name(flow['table']),
- flow['id'], utils.show_optionals(flow))
+ result = 'Table:{},FlowId:{}{}'.format(
+ flow['table'], flow['id'],
+ utils.show_optionals(flow))
print result
print 'Flow:', utils.format_json(None, flow_parser.parse_flow(flow.get('flow')))
"odl_inventory_nodes_operational"})
if args.isConfig:
- nodes = config.gmodels.odl_inventory_nodes_config.get_nodes_by_key()
+ nodes = config.gmodels.odl_inventory_nodes_config.get_clist_by_key()
print "Inventory Config:"
else:
print "Inventory Operational:"
- nodes = config.gmodels.odl_inventory_nodes_operational.get_nodes_by_key()
+ nodes = config.gmodels.odl_inventory_nodes_operational.get_clist_by_key()
node = nodes.get("openflow:" + args.nodeId)
if node is None:
print "node: {} was not found".format("openflow:" + args.nodeId)
flow_list.append(flow_dict)
flows = sorted(flow_list, key=lambda x: x['table'])
for flow in flows:
- print 'Table:{}/{}'.format(flow['table'],
- tables.get_table_name(flow['table']))
+ print 'Table:', flow['table']
print 'FlowId:', flow['id'], 'FlowName:', flow.get('name')
from odltools.netvirt import utils
import config
import flow_parser
-import tables
logger = logging.getLogger("netvirt.flows")
table_list = list(set([table for mod in modules for table in TABLE_MAP[mod]]))
# models = Models(args)
# odl_inventory_nodes_config = opendaylight_inventory.nodes(Model.CONFIG, args)
- of_nodes = config.gmodels.odl_inventory_nodes_config.get_nodes_by_key()
+ of_nodes = config.gmodels.odl_inventory_nodes_config.get_clist_by_key()
# ietf_interfaces_interfaces = ietf_interfaces.interfaces(Model.CONFIG, args)
# ietf_interfaces_interfaces_state = ietf_interfaces.interfaces_state(Model.OPERATIONAL, args)
# odl_interface_meta_if_index_interface_map = odl_interface_meta.if_indexes_interface_map(Model.OPERATIONAL, args)
# odl_fib_fib_entries = odl_fib.fib_entries(Model.CONFIG, args)
# odl_l3vpn_vpn_instance_to_vpn_id = odl_l3vpn.vpn_instance_to_vpn_id(Model.CONFIG, args)
if 'ifm' in modules:
- ifaces = config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- ifstates = config.gmodels.ietf_interfaces_interfaces_state.get_interfaces_by_key()
+ ifaces = config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ ifstates = config.gmodels.ietf_interfaces_interfaces_state.get_clist_by_key()
if 'l3vpn' in modules:
- ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_if_index_interfaces_by_key()
+ ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_clist_by_key()
fibentries = fibentries or config.gmodels.odl_fib_fib_entries.get_vrf_entries_by_key()
- vpnids = vpnids or config.gmodels.odl_l3vpn_vpn_instance_to_vpn_id.get_vpn_ids_by_key()
- vpninterfaces = vpninterfaces or config.gmodels.l3vpn_vpn_interfaces.get_vpn_ids_by_key()
+ vpnids = vpnids or config.gmodels.odl_l3vpn_vpn_instance_to_vpn_id.get_clist_by_key()
+ vpninterfaces = vpninterfaces or config.gmodels.l3vpn_vpn_interfaces.get_clist_by_key()
groups = groups or config.gmodels.odl_inventory_nodes_config.get_groups(of_nodes)
if 'acl' in modules:
- ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_if_index_interfaces_by_key()
- einsts = einsts or config.gmodels.elan_elan_instances.get_elan_instances_by_key()
+ ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_clist_by_key()
+ einsts = einsts or config.gmodels.elan_elan_instances.get_clist_by_key()
eifaces = eifaces or config.gmodels.elan_elan_interfaces.get_elan_interfaces_by_key()
if 'elan' in modules:
- ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- einsts = einsts or config.gmodels.elan_elan_instances.get_elan_instances_by_key()
+ ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ einsts = einsts or config.gmodels.elan_elan_instances.get_clist_by_key()
eifaces = eifaces or config.gmodels.elan_elan_interfaces.get_elan_interfaces_by_key()
- ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_if_index_interfaces_by_key()
+ ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_clist_by_key()
if 'all' in modules:
groups = groups or config.gmodels.odl_inventory_nodes_config.get_groups(of_nodes)
- ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- ifstates = ifstates or config.gmodels.ietf_interfaces_interfaces_state.get_interfaces_by_key()
- ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_if_index_interfaces_by_key()
+ ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ ifstates = ifstates or config.gmodels.ietf_interfaces_interfaces_state.get_clist_by_key()
+ ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_clist_by_key()
fibentries = fibentries or config.gmodels.odl_fib_fib_entries.get_vrf_entries_by_key()
- vpnids = vpnids or config.gmodels.odl_l3vpn_vpn_instance_to_vpn_id.get_vpn_ids_by_key()
- vpninterfaces = vpninterfaces or config.gmodels.l3vpn_vpn_interfaces.get_vpn_ids_by_key()
- einsts = einsts or config.gmodels.elan_elan_instances.get_elan_instances_by_key()
+ vpnids = vpnids or config.gmodels.odl_l3vpn_vpn_instance_to_vpn_id.get_clist_by_key()
+ vpninterfaces = vpninterfaces or config.gmodels.l3vpn_vpn_interfaces.get_clist_by_key()
+ einsts = einsts or config.gmodels.elan_elan_instances.get_clist_by_key()
eifaces = eifaces or config.gmodels.elan_elan_interfaces.get_elan_interfaces_by_key()
flows = []
for node in of_nodes.itervalues():
def get_eltag_for_iface(eifaces, einsts, iface):
+ print eifaces
ifname = iface.get('name') if iface else None
eiface = eifaces.get(ifname) if ifname else None
einst_name = eiface.get('elan-instance-name') if eiface else None
table_list = list(set([table for module in modules for table in TABLE_MAP[module]]))
##table_list = [214, 244]
- of_nodes = config.gmodels.odl_inventory_nodes_config.get_nodes_by_key()
+ of_nodes = config.gmodels.odl_inventory_nodes_config.get_clist_by_key()
if 'ifm' in modules:
- ifaces = config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- ifstates = config.gmodels.ietf_interfaces_interfaces_state.get_interfaces_by_key()
+ ifaces = config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ ifstates = config.gmodels.ietf_interfaces_interfaces_state.get_clist_by_key()
if 'l3vpn' in modules:
- ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_if_index_interfaces_by_key()
+ ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_clist_by_key()
fibentries = fibentries or config.gmodels.odl_fib_fib_entries.get_vrf_entries_by_key()
- vpnids = vpnids or config.gmodels.odl_l3vpn_vpn_instance_to_vpn_id.get_vpn_instances_by_key()
- vpninterfaces = vpninterfaces or config.gmodels.l3vpn_vpn_interfaces.get_vpn_ids_by_key()
+ vpnids = vpnids or config.gmodels.odl_l3vpn_vpn_instance_to_vpn_id.get_clist_by_key()
+ vpninterfaces = vpninterfaces or config.gmodels.l3vpn_vpn_interfaces.get_clist_by_key()
groups = groups or config.gmodels.odl_inventory_nodes_config.get_groups(of_nodes)
if 'acl' in modules:
- ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_if_index_interfaces_by_key()
- einsts = einsts or config.gmodels.elan_elan_instances.get_elan_instances_by_key()
+ ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_clist_by_key()
+ einsts = einsts or config.gmodels.elan_elan_instances.get_clist_by_key()
eifaces = eifaces or config.gmodels.elan_elan_interfaces.get_elan_interfaces_by_key()
if 'elan' in modules:
- ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
- einsts = einsts or config.gmodels.elan_elan_instances.get_elan_instances_by_key()
+ ifaces = ifaces or config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
+ einsts = einsts or config.gmodels.elan_elan_instances.get_clist_by_key()
eifaces = eifaces or config.gmodels.elan_elan_interfaces.get_elan_interfaces_by_key()
- ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_if_index_interfaces_by_key()
+ ifindexes = ifindexes or config.gmodels.odl_interface_meta_if_index_interface_map.get_clist_by_key()
stale_flows = []
for node in of_nodes.itervalues():
tables = [x for x in node[Nodes.NODE_TABLE] if x['id'] in table_list]
print 'Flow without binding: ', flow['ifname']
-def get_flow_url(args, flow):
- base_url = 'http://{}:{}/restconf/config'.format(args.ip, args.port)
- flow_path = 'opendaylight-inventory:nodes/node/openflow:{}/' \
- 'flow-node-inventory:table/{}/flow/{}'.format(
- flow['dpnid'], flow['table'], flow['id'])
- return '{}/{}'.format(base_url, flow_path)
-
-
def show_stale_flows(args, sort_by='table'):
config.get_models(args, {
"elan_elan_instances",
ip_list = get_ips_for_iface(nports, flow.get('ifname'))
if ip_list:
flow['iface-ips'] = ip_list
- result = 'Table:{}/{}, Host:{}, FlowId:{}{}'.format(
- flow['table'], tables.get_table_name(flow.get('table')),
- host, flow['id'],
+ result = 'Table:{}, Host:{}, FlowId:{}{}'.format(
+ flow['table'], host, flow['id'],
utils.show_optionals(flow))
print result
- if args.urls:
- print('http://{}'.format(get_flow_url(args, flow)))
- if not args.metaOnly:
- print 'Flow:{}'.format(utils.format_json(args, flow_parser.parse_flow(flow['flow'])))
+ ##path = get_data_path('flows', flow)
+ #print('http://192.168.2.32:8383/restconf/config/{}'.format(path))
+ #print 'Flow:', utils.format_json(args, flow_parser.parse_flow(flow['flow']))
def show_elan_flows(args):
compute_map = config.gmodels.odl_inventory_nodes_operational.get_dpn_host_mapping()
for flow in utils.sort(get_all_flows(args, modules=['elan']), 'id'):
host = compute_map.get(flow.get('dpnid'), flow.get('dpnid'))
- result = 'MacHost:{}{}, Table:{}/{}, FlowId:{}, {}, Flow:{}'.format(
- flow['id'][-17:], host, flow['table'],
- tables.get_table_name(flow['table']),
- flow['id'], utils.show_optionals(flow),
+ result = 'MacHost:{}{}, Table:{}, FlowId:{}, {}, Flow:{}'.format(
+ flow['id'][-17:], host, flow['table'], flow['id'], utils.show_optionals(flow),
utils.format_json(args, flow_parser.parse_flow(flow['flow'])))
print result
- if not args.metaOnly:
- print 'Flow:{}'.format(utils.format_json(args, flow_parser.parse_flow(flow['flow'])))
+ #print 'Flow:', utils.format_json(args, flow_parser.parse_flow(flow['flow']))
def get_matchstr(args, flow):
"odl_inventory_nodes_config",
"odl_inventory_nodes_operational"})
mmac = {} # config.gmodels.mip_mac.get_entries_by_key()
- einsts = config.gmodels.elan_elan_instances.get_elan_instances_by_key()
+ einsts = config.gmodels.elan_elan_instances.get_clist_by_key()
compute_map = config.gmodels.odl_inventory_nodes_operational.get_dpn_host_mapping()
flows = utils.sort(get_all_flows(['elan']), 'table')
nports.get(flow_info.get('src-mac'))) or
(flow_info.get('table') == 51 and
not nports.get(flow_info.get('dst-mac')))):
- result = 'Table:{}/{}, Host:{}, FlowId:{}{}'.format(
- flow_info.get('table'),
- tables.get_table_name(flow['table']),
- host, flow.get('id'), utils.show_optionals(flow_info))
+ result = 'Table:{}, Host:{}, FlowId:{}{}'.format(
+ flow_info.get('table'), host, flow.get('id'),
+ utils.show_optionals(flow_info))
print result
- if not args.metaOnly:
- print 'Flow:{}'.format(utils.format_json(args,flow_parser.parse_flow(flow)))
+ print 'Flow:{}'.format(utils.format_json(args, flow_parser.parse_flow(flow)))
def get_stale_bindings(args):
# ietf_interfaces_interfaces = ietf_interfaces.interfaces(Model.CONFIG, args)
# interface_service_bindings_service_bindings = interface_service_bindings.service_bindings(Model.CONFIG, args)
- ifaces = config.gmodels.ietf_interfaces_interfaces.get_interfaces_by_key()
+ ifaces = config.gmodels.ietf_interfaces_interfaces.get_clist_by_key()
bindings, orphans = config.gmodels.interface_service_bindings_service_bindings.get_service_bindings()
return set(bindings.keys()) - set(ifaces.keys()), bindings
ip_list = get_ips_for_iface(nports, flow.get('ifname'))
if ip_list:
flow['iface-ips'] = ip_list
- result = 'Table:{}/{}, Host:{}, FlowId:{}{}'.format(
- flow['table'], tables.get_table_name(flow['table']),
- host, flow['id'],
+ result = 'Table:{}, Host:{}, FlowId:{}{}'.format(
+ flow['table'], host, flow['id'],
utils.show_optionals(flow))
print result
- if not args.metaOnly:
- print 'Flow:', utils.format_json(args, flow_parser.parse_flow(flow['flow']))
+ print 'Flow:', utils.format_json(args, flow_parser.parse_flow(flow['flow']))
def show_all_flows(args):
def show_elan_instances(args):
elan_elan_instances = elan.elan_instances(Model.CONFIG, args)
- instances = elan_elan_instances.get_elan_instances_by_key()
+ instances = elan_elan_instances.get_clist_by_key()
for k, v in instances.items():
print "ElanInstance: {}, {}".format(k, utils.format_json(args, v))
def show_groups(args):
odl_inventory_nodes_config = opendaylight_inventory.nodes(Model.CONFIG, args)
- of_nodes = odl_inventory_nodes_config.get_nodes_by_key()
+ of_nodes = odl_inventory_nodes_config.get_clist_by_key()
groups = odl_inventory_nodes_config.get_groups(of_nodes)
for dpn in groups:
for group_key in groups[dpn]:
def show_tables(args):
odl_inventory_nodes_config = opendaylight_inventory.nodes(Model.CONFIG, args)
- of_nodes = odl_inventory_nodes_config.get_nodes_by_key()
+ of_nodes = odl_inventory_nodes_config.get_clist_by_key()
tables = set()
for node in of_nodes.itervalues():
for table in node[Nodes.NODE_TABLE]:
+import os
+
+
class Args:
- def __init__(self, ip="localhost", port=8181, user="admin", pw="admin", path="/tmp", pretty_print=False):
+ def __init__(self, https="http", ip="localhost", port=8181, user="admin", pw="admin", path="/tmp",
+ pretty_print=False, if_name=""):
+ self.https = https
self.ip = ip
self.port = port
self.user = user
self.pw = pw
self.path = path
- self.pretty_print=pretty_print
+ self.pretty_print = pretty_print
+ self.ifName = if_name
+
+
+def get_resources_path():
+ return os.path.join(os.path.dirname(__file__), '../../tests/resources')
+import logging
import unittest
from odltools import logg
from odltools.netvirt import analyze
-from odltools.netvirt.tests import Args
+from odltools.netvirt import tests
class TestAnalyze(unittest.TestCase):
# TODO: capture stdout and check for list of tables.
def setUp(self):
- logg.Logger()
- self.args = Args(path="../../tests/resources")
+ logg.Logger(logging.INFO, logging.INFO)
+ self.args = tests.Args(path=tests.get_resources_path(), if_name="98c2e265-b4f2-40a5-8f31-2fb5d2b2baf6")
+ @unittest.skip("skipping")
def test_analyze_trunks(self):
analyze.analyze_trunks(self.args)
+ def test_analyze_interface(self):
+ analyze.analyze_interface(self.args)
+
if __name__ == '__main__':
unittest.main()
+import logging
import unittest
import os
from odltools import logg
-from odltools.netvirt import request, ovs_flows
+from odltools.netvirt import ovs_flows
+from odltools.netvirt import request
+from odltools.netvirt import tests
class TestFlows(unittest.TestCase):
def setUp(self):
- logg.Logger()
- self.filename = "../../tests/resources/flow_dumps.3.txt"
+ logg.Logger(logging.INFO, logging.INFO)
+ self.filename = "{}/flow_dumps.1.txt".format(tests.get_resources_path())
self.data = request.read_file(self.filename)
self.flows = ovs_flows.Flows(self.data)
from odltools import logg
from odltools.netvirt import request
+from odltools.netvirt import tests
class TestRequest(unittest.TestCase):
def setUp(self):
logg.Logger(logging.DEBUG, logging.DEBUG)
- self.filename = "../../tests/resources/flow_dumps.1.txt"
+ self.filename = "{}/flow_dumps.1.txt".format(tests.get_resources_path())
self.outpath = "/tmp/flow_dumps.1.out.txt"
def test_read_file(self):
+import logging
import unittest
from odltools import logg
from odltools.netvirt import show
-from odltools.netvirt.tests import Args
+from odltools.netvirt import tests
class TestShow(unittest.TestCase):
# TODO: capture stdout and check for list of tables.
def setUp(self):
- logg.Logger()
- self.args = Args(path="../../tests/resources")
+ logg.Logger(logging.INFO, logging.INFO)
+ self.args = tests.Args(path=tests.get_resources_path())
def test_show_elan_instances(self):
show.show_elan_instances(self.args)
+import logging
import unittest
from odltools import logg
class TestTables(unittest.TestCase):
def setUp(self):
- logg.Logger()
+ logg.Logger(logging.INFO, logging.INFO)
def test_get_table_name(self):
self.assertEqual(tables.get_table_name(17), "DISPATCHER")
--- /dev/null
+{
+ "tunnels_state": {
+ "state-tunnel-list": [
+ {
+ "dst-info": {
+ "tep-device-id": "233201308854882",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.13"
+ },
+ "oper-state": "up",
+ "src-info": {
+ "tep-device-id": "66870777175113",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.41"
+ },
+ "transport-type": "odl-interface:tunnel-type-vxlan",
+ "tunnel-interface-name": "tun428ee8c4fe7",
+ "tunnel-state": true
+ },
+ {
+ "dst-info": {
+ "tep-device-id": "203251201875890",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.31"
+ },
+ "oper-state": "up",
+ "src-info": {
+ "tep-device-id": "66870777175113",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.41"
+ },
+ "transport-type": "odl-interface:tunnel-type-vxlan",
+ "tunnel-interface-name": "tun789af3b29bf",
+ "tunnel-state": true
+ },
+ {
+ "dst-info": {
+ "tep-device-id": "233201308854882",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.13"
+ },
+ "oper-state": "up",
+ "src-info": {
+ "tep-device-id": "203251201875890",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.31"
+ },
+ "transport-type": "odl-interface:tunnel-type-vxlan",
+ "tunnel-interface-name": "tun4ec984af0f9",
+ "tunnel-state": true
+ },
+ {
+ "dst-info": {
+ "tep-device-id": "66870777175113",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.41"
+ },
+ "oper-state": "up",
+ "src-info": {
+ "tep-device-id": "233201308854882",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.13"
+ },
+ "transport-type": "odl-interface:tunnel-type-vxlan",
+ "tunnel-interface-name": "tunaf7425faccd",
+ "tunnel-state": true
+ },
+ {
+ "dst-info": {
+ "tep-device-id": "66870777175113",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.41"
+ },
+ "oper-state": "up",
+ "src-info": {
+ "tep-device-id": "203251201875890",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.31"
+ },
+ "transport-type": "odl-interface:tunnel-type-vxlan",
+ "tunnel-interface-name": "tuna221648ca0a",
+ "tunnel-state": true
+ },
+ {
+ "dst-info": {
+ "tep-device-id": "203251201875890",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.31"
+ },
+ "oper-state": "up",
+ "src-info": {
+ "tep-device-id": "233201308854882",
+ "tep-device-type": "itm-state:tep-type-internal",
+ "tep-ip": "10.30.170.13"
+ },
+ "transport-type": "odl-interface:tunnel-type-vxlan",
+ "tunnel-interface-name": "tuna877bff3c2d",
+ "tunnel-state": true
+ }
+ ]
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "if-indexes-interface-map": {
+ "if-index-interface": [
+ {
+ "if-index": 16,
+ "interface-name": "233201308854882:br-physnet1-pa:trunk"
+ },
+ {
+ "if-index": 13,
+ "interface-name": "66870777175113:br-physnet1-pa:trunk"
+ },
+ {
+ "if-index": 26,
+ "interface-name": "66870777175113:br-physnet1-pa:1131"
+ },
+ {
+ "if-index": 25,
+ "interface-name": "13eb9a56-ae36-4fa4-9c88-6710bd6d7016"
+ },
+ {
+ "if-index": 24,
+ "interface-name": "1be4e467-fbf8-48bd-a1e9-e307716f1523"
+ },
+ {
+ "if-index": 23,
+ "interface-name": "54f620f8-acda-429b-a68b-bd56fa5c1207"
+ },
+ {
+ "if-index": 22,
+ "interface-name": "203251201875890:br-physnet1-pa:1131"
+ },
+ {
+ "if-index": 21,
+ "interface-name": "c4857784-4fee-4229-bdaa-312c45021c6c"
+ },
+ {
+ "if-index": 2,
+ "interface-name": "tuna221648ca0a"
+ },
+ {
+ "if-index": 34,
+ "interface-name": "c8047b56-7d60-4ac9-88ad-c8ede52e9315"
+ },
+ {
+ "if-index": 1,
+ "interface-name": "tun789af3b29bf"
+ },
+ {
+ "if-index": 33,
+ "interface-name": "1f82f53d-5235-486f-b344-471804badfbd"
+ },
+ {
+ "if-index": 32,
+ "interface-name": "1defce3a-2897-4030-960c-8073e7ac9bcb"
+ },
+ {
+ "if-index": 31,
+ "interface-name": "8a4ccb62-9057-40fc-94d7-7a2bd2182ddb"
+ },
+ {
+ "if-index": 30,
+ "interface-name": "3ddd65c8-e946-4747-a5f8-7e1e14361f6f"
+ },
+ {
+ "if-index": 29,
+ "interface-name": "233201308854882:br-physnet1-pa:1131"
+ },
+ {
+ "if-index": 28,
+ "interface-name": "afe0eeae-e6c0-4e7e-acf4-009123e023eb"
+ },
+ {
+ "if-index": 27,
+ "interface-name": "8bbf2bf2-3f6b-4e6b-80f7-a40f6e419b29"
+ },
+ {
+ "if-index": 8,
+ "interface-name": "203251201875890:br-physnet1-pa:trunk"
+ },
+ {
+ "if-index": 6,
+ "interface-name": "tunaf7425faccd"
+ },
+ {
+ "if-index": 5,
+ "interface-name": "tun4ec984af0f9"
+ },
+ {
+ "if-index": 4,
+ "interface-name": "tun428ee8c4fe7"
+ },
+ {
+ "if-index": 3,
+ "interface-name": "tuna877bff3c2d"
+ },
+ {
+ "if-index": 35,
+ "interface-name": "e8c2f851-beaf-41e5-8900-bf4f15018325"
+ }
+ ]
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "nodes": {
+ "node": [
+ {
+ "flow-node-inventory:description": "None",
+ "flow-node-inventory:hardware": "Open vSwitch",
+ "flow-node-inventory:ip-address": "10.30.170.31",
+ "flow-node-inventory:manufacturer": "Nicira, Inc.",
+ "flow-node-inventory:port-number": 50810,
+ "flow-node-inventory:serial-number": "None",
+ "flow-node-inventory:software": "2.7.3",
+ "flow-node-inventory:switch-features": {
+ "capabilities": [
+ "flow-node-inventory:flow-feature-capability-flow-stats",
+ "flow-node-inventory:flow-feature-capability-queue-stats",
+ "flow-node-inventory:flow-feature-capability-port-stats",
+ "flow-node-inventory:flow-feature-capability-table-stats",
+ "flow-node-inventory:flow-feature-capability-group-stats"
+ ],
+ "max_buffers": 0,
+ "max_tables": 254
+ },
+ "flow-node-inventory:table": [
+ {
+ "id": 235
+ },
+ {
+ "id": 209
+ },
+ {
+ "id": 175
+ },
+ {
+ "id": 89
+ },
+ {
+ "id": 119
+ },
+ {
+ "id": 21
+ },
+ {
+ "id": 51
+ },
+ {
+ "id": 234
+ },
+ {
+ "id": 208
+ },
+ {
+ "id": 174
+ },
+ {
+ "id": 88
+ },
+ {
+ "id": 118
+ },
+ {
+ "id": 20
+ },
+ {
+ "id": 50
+ },
+ {
+ "id": 237
+ },
+ {
+ "id": 207
+ },
+ {
+ "id": 177
+ },
+ {
+ "id": 0
+ },
+ {
+ "id": 87
+ },
+ {
+ "id": 121
+ },
+ {
+ "id": 19
+ },
+ {
+ "id": 53
+ },
+ {
+ "id": 236
+ },
+ {
+ "id": 206
+ },
+ {
+ "id": 176
+ },
+ {
+ "id": 1
+ },
+ {
+ "id": 86
+ },
+ {
+ "id": 120
+ },
+ {
+ "id": 18
+ },
+ {
+ "id": 52
+ },
+ {
+ "id": 239
+ },
+ {
+ "id": 205
+ },
+ {
+ "id": 171
+ },
+ {
+ "id": 85
+ },
+ {
+ "id": 115
+ },
+ {
+ "id": 25
+ },
+ {
+ "id": 55
+ },
+ {
+ "id": 238
+ },
+ {
+ "id": 204
+ },
+ {
+ "id": 170
+ },
+ {
+ "id": 84
+ },
+ {
+ "id": 114
+ },
+ {
+ "id": 24
+ },
+ {
+ "id": 54
+ },
+ {
+ "id": 241
+ },
+ {
+ "id": 203
+ },
+ {
+ "id": 173
+ },
+ {
+ "id": 83
+ },
+ {
+ "id": 117
+ },
+ {
+ "id": 23
+ },
+ {
+ "id": 57
+ },
+ {
+ "id": 240
+ },
+ {
+ "id": 202
+ },
+ {
+ "id": 172
+ },
+ {
+ "id": 82
+ },
+ {
+ "id": 116
+ },
+ {
+ "id": 22
+ },
+ {
+ "id": 56
+ },
+ {
+ "id": 227
+ },
+ {
+ "id": 201
+ },
+ {
+ "id": 167
+ },
+ {
+ "id": 97
+ },
+ {
+ "id": 127
+ },
+ {
+ "id": 29
+ },
+ {
+ "id": 59
+ },
+ {
+ "id": 226
+ },
+ {
+ "id": 200
+ },
+ {
+ "id": 166
+ },
+ {
+ "id": 96
+ },
+ {
+ "id": 126
+ },
+ {
+ "id": 28
+ },
+ {
+ "id": 58
+ },
+ {
+ "id": 229
+ },
+ {
+ "id": 199
+ },
+ {
+ "id": 169
+ },
+ {
+ "id": 95
+ },
+ {
+ "id": 129
+ },
+ {
+ "id": 27
+ },
+ {
+ "id": 61
+ },
+ {
+ "id": 228
+ },
+ {
+ "id": 198
+ },
+ {
+ "id": 168
+ },
+ {
+ "id": 94
+ },
+ {
+ "id": 128
+ },
+ {
+ "id": 26
+ },
+ {
+ "id": 60
+ },
+ {
+ "id": 231
+ },
+ {
+ "id": 197
+ },
+ {
+ "id": 163
+ },
+ {
+ "id": 93
+ },
+ {
+ "id": 123
+ },
+ {
+ "id": 33
+ },
+ {
+ "id": 63
+ },
+ {
+ "id": 230
+ },
+ {
+ "id": 196
+ },
+ {
+ "id": 162
+ },
+ {
+ "id": 92
+ },
+ {
+ "id": 122
+ },
+ {
+ "id": 32
+ },
+ {
+ "id": 62
+ },
+ {
+ "id": 233
+ },
+ {
+ "id": 195
+ },
+ {
+ "id": 165
+ },
+ {
+ "id": 91
+ },
+ {
+ "id": 125
+ },
+ {
+ "id": 31
+ },
+ {
+ "id": 65
+ },
+ {
+ "id": 232
+ },
+ {
+ "id": 194
+ },
+ {
+ "id": 164
+ },
+ {
+ "id": 90
+ },
+ {
+ "id": 124
+ },
+ {
+ "id": 30
+ },
+ {
+ "id": 64
+ },
+ {
+ "id": 252
+ },
+ {
+ "id": 218
+ },
+ {
+ "id": 192
+ },
+ {
+ "id": 158
+ },
+ {
+ "id": 15
+ },
+ {
+ "id": 104
+ },
+ {
+ "id": 134
+ },
+ {
+ "id": 36
+ },
+ {
+ "id": 66
+ },
+ {
+ "id": 253
+ },
+ {
+ "id": 219
+ },
+ {
+ "id": 193
+ },
+ {
+ "id": 159
+ },
+ {
+ "id": 14
+ },
+ {
+ "id": 105
+ },
+ {
+ "id": 135
+ },
+ {
+ "id": 37
+ },
+ {
+ "id": 67
+ },
+ {
+ "id": 250
+ },
+ {
+ "id": 220
+ },
+ {
+ "id": 190
+ },
+ {
+ "id": 160
+ },
+ {
+ "id": 17
+ },
+ {
+ "id": 102
+ },
+ {
+ "id": 136
+ },
+ {
+ "id": 34
+ },
+ {
+ "id": 68
+ },
+ {
+ "id": 251
+ },
+ {
+ "id": 221
+ },
+ {
+ "id": 191
+ },
+ {
+ "id": 161
+ },
+ {
+ "id": 16
+ },
+ {
+ "id": 103
+ },
+ {
+ "id": 137
+ },
+ {
+ "id": 35
+ },
+ {
+ "id": 69
+ },
+ {
+ "id": 222
+ },
+ {
+ "id": 188
+ },
+ {
+ "id": 154
+ },
+ {
+ "id": 11
+ },
+ {
+ "id": 100
+ },
+ {
+ "id": 130
+ },
+ {
+ "id": 40
+ },
+ {
+ "id": 70
+ },
+ {
+ "id": 223
+ },
+ {
+ "id": 189
+ },
+ {
+ "id": 155
+ },
+ {
+ "id": 10
+ },
+ {
+ "id": 101
+ },
+ {
+ "id": 131
+ },
+ {
+ "id": 41
+ },
+ {
+ "id": 71
+ },
+ {
+ "id": 224
+ },
+ {
+ "id": 186
+ },
+ {
+ "id": 156
+ },
+ {
+ "id": 13
+ },
+ {
+ "id": 98
+ },
+ {
+ "id": 132
+ },
+ {
+ "id": 38
+ },
+ {
+ "id": 72
+ },
+ {
+ "id": 225
+ },
+ {
+ "id": 187
+ },
+ {
+ "id": 157
+ },
+ {
+ "id": 12
+ },
+ {
+ "id": 99
+ },
+ {
+ "id": 133
+ },
+ {
+ "id": 39
+ },
+ {
+ "id": 73
+ },
+ {
+ "id": 244
+ },
+ {
+ "id": 210
+ },
+ {
+ "id": 184
+ },
+ {
+ "id": 150
+ },
+ {
+ "id": 7
+ },
+ {
+ "id": 112
+ },
+ {
+ "id": 142
+ },
+ {
+ "id": 44
+ },
+ {
+ "id": 74
+ },
+ {
+ "id": 245
+ },
+ {
+ "id": 211
+ },
+ {
+ "id": 185
+ },
+ {
+ "id": 151
+ },
+ {
+ "id": 6
+ },
+ {
+ "id": 113
+ },
+ {
+ "id": 143
+ },
+ {
+ "id": 45
+ },
+ {
+ "id": 75
+ },
+ {
+ "id": 242
+ },
+ {
+ "id": 212
+ },
+ {
+ "id": 182
+ },
+ {
+ "id": 152
+ },
+ {
+ "id": 9
+ },
+ {
+ "id": 110
+ },
+ {
+ "id": 144
+ },
+ {
+ "id": 42
+ },
+ {
+ "id": 76
+ },
+ {
+ "id": 243
+ },
+ {
+ "id": 213
+ },
+ {
+ "id": 183
+ },
+ {
+ "id": 153
+ },
+ {
+ "id": 8
+ },
+ {
+ "id": 111
+ },
+ {
+ "id": 145
+ },
+ {
+ "id": 43
+ },
+ {
+ "id": 77
+ },
+ {
+ "id": 248
+ },
+ {
+ "id": 214
+ },
+ {
+ "id": 180
+ },
+ {
+ "id": 146
+ },
+ {
+ "id": 3
+ },
+ {
+ "id": 108
+ },
+ {
+ "id": 138
+ },
+ {
+ "id": 48
+ },
+ {
+ "id": 78
+ },
+ {
+ "id": 249
+ },
+ {
+ "id": 215
+ },
+ {
+ "id": 181
+ },
+ {
+ "id": 147
+ },
+ {
+ "id": 2
+ },
+ {
+ "id": 109
+ },
+ {
+ "id": 139
+ },
+ {
+ "id": 49
+ },
+ {
+ "id": 79
+ },
+ {
+ "id": 246
+ },
+ {
+ "id": 216
+ },
+ {
+ "id": 178
+ },
+ {
+ "id": 148
+ },
+ {
+ "id": 5
+ },
+ {
+ "id": 106
+ },
+ {
+ "id": 140
+ },
+ {
+ "id": 46
+ },
+ {
+ "id": 80
+ },
+ {
+ "id": 247
+ },
+ {
+ "id": 217
+ },
+ {
+ "id": 179
+ },
+ {
+ "id": 149
+ },
+ {
+ "id": 4
+ },
+ {
+ "id": 107
+ },
+ {
+ "id": 141
+ },
+ {
+ "id": 47
+ },
+ {
+ "id": 81
+ }
+ ],
+ "id": "openflow:203251201875890",
+ "node-connector": [
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "a6:44:fe:57:31:e9",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "br-physnet1-pa",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 1,
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:203251201875890:1"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "PORT-DOWN",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "b8:db:1b:b0:1f:b2",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "br-int",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 4294967294,
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": true,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:203251201875890:LOCAL"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "be:a4:33:6a:2e:56",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tuna221648ca0a",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 2,
+ "flow-node-inventory:reason": "add",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:203251201875890:2"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "6e:9c:0f:0d:8d:06",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tun4ec984af0f9",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 3,
+ "flow-node-inventory:reason": "add",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:203251201875890:3"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "PORT-DOWN",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "00:00:00:00:b0:b1",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tapc4857784-4f",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 6,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": true,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:203251201875890:6"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "PORT-DOWN",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "00:00:00:00:40:a2",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tap54f620f8-ac",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 7,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": true,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:203251201875890:7"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "PORT-DOWN",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "00:00:00:00:30:8e",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tap1be4e467-fb",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 8,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": true,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:203251201875890:8"
+ }
+ ],
+ "opendaylight-group-statistics:group-features": {
+ "actions": [
+ 67076097
+ ],
+ "group-capabilities-supported": [
+ "opendaylight-group-types:chaining",
+ "opendaylight-group-types:select-liveness",
+ "opendaylight-group-types:select-weight"
+ ],
+ "group-types-supported": [
+ "opendaylight-group-types:group-all",
+ "opendaylight-group-types:group-indirect",
+ "opendaylight-group-types:group-select",
+ "opendaylight-group-types:group-ff"
+ ],
+ "max-groups": [
+ 4294967040
+ ]
+ }
+ },
+ {
+ "flow-node-inventory:description": "None",
+ "flow-node-inventory:hardware": "Open vSwitch",
+ "flow-node-inventory:ip-address": "10.30.170.41",
+ "flow-node-inventory:manufacturer": "Nicira, Inc.",
+ "flow-node-inventory:port-number": 58874,
+ "flow-node-inventory:serial-number": "None",
+ "flow-node-inventory:software": "2.7.3",
+ "flow-node-inventory:switch-features": {
+ "capabilities": [
+ "flow-node-inventory:flow-feature-capability-flow-stats",
+ "flow-node-inventory:flow-feature-capability-queue-stats",
+ "flow-node-inventory:flow-feature-capability-port-stats",
+ "flow-node-inventory:flow-feature-capability-table-stats",
+ "flow-node-inventory:flow-feature-capability-group-stats"
+ ],
+ "max_buffers": 0,
+ "max_tables": 254
+ },
+ "flow-node-inventory:table": [
+ {
+ "id": 235
+ },
+ {
+ "id": 209
+ },
+ {
+ "id": 175
+ },
+ {
+ "id": 89
+ },
+ {
+ "id": 119
+ },
+ {
+ "id": 21
+ },
+ {
+ "id": 51
+ },
+ {
+ "id": 234
+ },
+ {
+ "id": 208
+ },
+ {
+ "id": 174
+ },
+ {
+ "id": 88
+ },
+ {
+ "id": 118
+ },
+ {
+ "id": 20
+ },
+ {
+ "id": 50
+ },
+ {
+ "id": 237
+ },
+ {
+ "id": 207
+ },
+ {
+ "id": 177
+ },
+ {
+ "id": 0
+ },
+ {
+ "id": 87
+ },
+ {
+ "id": 121
+ },
+ {
+ "id": 19
+ },
+ {
+ "id": 53
+ },
+ {
+ "id": 236
+ },
+ {
+ "id": 206
+ },
+ {
+ "id": 176
+ },
+ {
+ "id": 1
+ },
+ {
+ "id": 86
+ },
+ {
+ "id": 120
+ },
+ {
+ "id": 18
+ },
+ {
+ "id": 52
+ },
+ {
+ "id": 239
+ },
+ {
+ "id": 205
+ },
+ {
+ "id": 171
+ },
+ {
+ "id": 85
+ },
+ {
+ "id": 115
+ },
+ {
+ "id": 25
+ },
+ {
+ "id": 55
+ },
+ {
+ "id": 238
+ },
+ {
+ "id": 204
+ },
+ {
+ "id": 170
+ },
+ {
+ "id": 84
+ },
+ {
+ "id": 114
+ },
+ {
+ "id": 24
+ },
+ {
+ "id": 54
+ },
+ {
+ "id": 241
+ },
+ {
+ "id": 203
+ },
+ {
+ "id": 173
+ },
+ {
+ "id": 83
+ },
+ {
+ "id": 117
+ },
+ {
+ "id": 23
+ },
+ {
+ "id": 57
+ },
+ {
+ "id": 240
+ },
+ {
+ "id": 202
+ },
+ {
+ "id": 172
+ },
+ {
+ "id": 82
+ },
+ {
+ "id": 116
+ },
+ {
+ "id": 22
+ },
+ {
+ "id": 56
+ },
+ {
+ "id": 227
+ },
+ {
+ "id": 201
+ },
+ {
+ "id": 167
+ },
+ {
+ "id": 97
+ },
+ {
+ "id": 127
+ },
+ {
+ "id": 29
+ },
+ {
+ "id": 59
+ },
+ {
+ "id": 226
+ },
+ {
+ "id": 200
+ },
+ {
+ "id": 166
+ },
+ {
+ "id": 96
+ },
+ {
+ "id": 126
+ },
+ {
+ "id": 28
+ },
+ {
+ "id": 58
+ },
+ {
+ "id": 229
+ },
+ {
+ "id": 199
+ },
+ {
+ "id": 169
+ },
+ {
+ "id": 95
+ },
+ {
+ "id": 129
+ },
+ {
+ "id": 27
+ },
+ {
+ "id": 61
+ },
+ {
+ "id": 228
+ },
+ {
+ "id": 198
+ },
+ {
+ "id": 168
+ },
+ {
+ "id": 94
+ },
+ {
+ "id": 128
+ },
+ {
+ "id": 26
+ },
+ {
+ "id": 60
+ },
+ {
+ "id": 231
+ },
+ {
+ "id": 197
+ },
+ {
+ "id": 163
+ },
+ {
+ "id": 93
+ },
+ {
+ "id": 123
+ },
+ {
+ "id": 33
+ },
+ {
+ "id": 63
+ },
+ {
+ "id": 230
+ },
+ {
+ "id": 196
+ },
+ {
+ "id": 162
+ },
+ {
+ "id": 92
+ },
+ {
+ "id": 122
+ },
+ {
+ "id": 32
+ },
+ {
+ "id": 62
+ },
+ {
+ "id": 233
+ },
+ {
+ "id": 195
+ },
+ {
+ "id": 165
+ },
+ {
+ "id": 91
+ },
+ {
+ "id": 125
+ },
+ {
+ "id": 31
+ },
+ {
+ "id": 65
+ },
+ {
+ "id": 232
+ },
+ {
+ "id": 194
+ },
+ {
+ "id": 164
+ },
+ {
+ "id": 90
+ },
+ {
+ "id": 124
+ },
+ {
+ "id": 30
+ },
+ {
+ "id": 64
+ },
+ {
+ "id": 252
+ },
+ {
+ "id": 218
+ },
+ {
+ "id": 192
+ },
+ {
+ "id": 158
+ },
+ {
+ "id": 15
+ },
+ {
+ "id": 104
+ },
+ {
+ "id": 134
+ },
+ {
+ "id": 36
+ },
+ {
+ "id": 66
+ },
+ {
+ "id": 253
+ },
+ {
+ "id": 219
+ },
+ {
+ "id": 193
+ },
+ {
+ "id": 159
+ },
+ {
+ "id": 14
+ },
+ {
+ "id": 105
+ },
+ {
+ "id": 135
+ },
+ {
+ "id": 37
+ },
+ {
+ "id": 67
+ },
+ {
+ "id": 250
+ },
+ {
+ "id": 220
+ },
+ {
+ "id": 190
+ },
+ {
+ "id": 160
+ },
+ {
+ "id": 17
+ },
+ {
+ "id": 102
+ },
+ {
+ "id": 136
+ },
+ {
+ "id": 34
+ },
+ {
+ "id": 68
+ },
+ {
+ "id": 251
+ },
+ {
+ "id": 221
+ },
+ {
+ "id": 191
+ },
+ {
+ "id": 161
+ },
+ {
+ "id": 16
+ },
+ {
+ "id": 103
+ },
+ {
+ "id": 137
+ },
+ {
+ "id": 35
+ },
+ {
+ "id": 69
+ },
+ {
+ "id": 222
+ },
+ {
+ "id": 188
+ },
+ {
+ "id": 154
+ },
+ {
+ "id": 11
+ },
+ {
+ "id": 100
+ },
+ {
+ "id": 130
+ },
+ {
+ "id": 40
+ },
+ {
+ "id": 70
+ },
+ {
+ "id": 223
+ },
+ {
+ "id": 189
+ },
+ {
+ "id": 155
+ },
+ {
+ "id": 10
+ },
+ {
+ "id": 101
+ },
+ {
+ "id": 131
+ },
+ {
+ "id": 41
+ },
+ {
+ "id": 71
+ },
+ {
+ "id": 224
+ },
+ {
+ "id": 186
+ },
+ {
+ "id": 156
+ },
+ {
+ "id": 13
+ },
+ {
+ "id": 98
+ },
+ {
+ "id": 132
+ },
+ {
+ "id": 38
+ },
+ {
+ "id": 72
+ },
+ {
+ "id": 225
+ },
+ {
+ "id": 187
+ },
+ {
+ "id": 157
+ },
+ {
+ "id": 12
+ },
+ {
+ "id": 99
+ },
+ {
+ "id": 133
+ },
+ {
+ "id": 39
+ },
+ {
+ "id": 73
+ },
+ {
+ "id": 244
+ },
+ {
+ "id": 210
+ },
+ {
+ "id": 184
+ },
+ {
+ "id": 150
+ },
+ {
+ "id": 7
+ },
+ {
+ "id": 112
+ },
+ {
+ "id": 142
+ },
+ {
+ "id": 44
+ },
+ {
+ "id": 74
+ },
+ {
+ "id": 245
+ },
+ {
+ "id": 211
+ },
+ {
+ "id": 185
+ },
+ {
+ "id": 151
+ },
+ {
+ "id": 6
+ },
+ {
+ "id": 113
+ },
+ {
+ "id": 143
+ },
+ {
+ "id": 45
+ },
+ {
+ "id": 75
+ },
+ {
+ "id": 242
+ },
+ {
+ "id": 212
+ },
+ {
+ "id": 182
+ },
+ {
+ "id": 152
+ },
+ {
+ "id": 9
+ },
+ {
+ "id": 110
+ },
+ {
+ "id": 144
+ },
+ {
+ "id": 42
+ },
+ {
+ "id": 76
+ },
+ {
+ "id": 243
+ },
+ {
+ "id": 213
+ },
+ {
+ "id": 183
+ },
+ {
+ "id": 153
+ },
+ {
+ "id": 8
+ },
+ {
+ "id": 111
+ },
+ {
+ "id": 145
+ },
+ {
+ "id": 43
+ },
+ {
+ "id": 77
+ },
+ {
+ "id": 248
+ },
+ {
+ "id": 214
+ },
+ {
+ "id": 180
+ },
+ {
+ "id": 146
+ },
+ {
+ "id": 3
+ },
+ {
+ "id": 108
+ },
+ {
+ "id": 138
+ },
+ {
+ "id": 48
+ },
+ {
+ "id": 78
+ },
+ {
+ "id": 249
+ },
+ {
+ "id": 215
+ },
+ {
+ "id": 181
+ },
+ {
+ "id": 147
+ },
+ {
+ "id": 2
+ },
+ {
+ "id": 109
+ },
+ {
+ "id": 139
+ },
+ {
+ "id": 49
+ },
+ {
+ "id": 79
+ },
+ {
+ "id": 246
+ },
+ {
+ "id": 216
+ },
+ {
+ "id": 178
+ },
+ {
+ "id": 148
+ },
+ {
+ "id": 5
+ },
+ {
+ "id": 106
+ },
+ {
+ "id": 140
+ },
+ {
+ "id": 46
+ },
+ {
+ "id": 80
+ },
+ {
+ "id": 247
+ },
+ {
+ "id": 217
+ },
+ {
+ "id": 179
+ },
+ {
+ "id": 149
+ },
+ {
+ "id": 4
+ },
+ {
+ "id": 107
+ },
+ {
+ "id": 141
+ },
+ {
+ "id": 47
+ },
+ {
+ "id": 81
+ }
+ ],
+ "id": "openflow:66870777175113",
+ "node-connector": [
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:68:bc:43",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tap13eb9a56-ae",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 7,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:7"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "PORT-DOWN",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "3c:d1:90:eb:5c:49",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "br-int",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 4294967294,
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": true,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:LOCAL"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:9b:e4:19",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tap3ddd65c8-e9",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 9,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:9"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:18:08:32",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tapc8047b56-7d",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 11,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:11"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:82:00:d4",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tap8bbf2bf2-3f",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 8,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:8"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:ad:b3:d5",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tap1f82f53d-52",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 10,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:10"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "a2:b7:c4:5a:db:86",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tun428ee8c4fe7",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 3,
+ "flow-node-inventory:reason": "add",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:3"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "12:c6:a1:42:20:bf",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tun789af3b29bf",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 2,
+ "flow-node-inventory:reason": "add",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:2"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "e6:aa:a3:17:fb:68",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "br-physnet1-pa",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 1,
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:66870777175113:1"
+ }
+ ],
+ "opendaylight-group-statistics:group-features": {
+ "actions": [
+ 67076097
+ ],
+ "group-capabilities-supported": [
+ "opendaylight-group-types:chaining",
+ "opendaylight-group-types:select-liveness",
+ "opendaylight-group-types:select-weight"
+ ],
+ "group-types-supported": [
+ "opendaylight-group-types:group-all",
+ "opendaylight-group-types:group-indirect",
+ "opendaylight-group-types:group-select",
+ "opendaylight-group-types:group-ff"
+ ],
+ "max-groups": [
+ 4294967040
+ ]
+ }
+ },
+ {
+ "flow-node-inventory:description": "None",
+ "flow-node-inventory:hardware": "Open vSwitch",
+ "flow-node-inventory:ip-address": "10.30.170.13",
+ "flow-node-inventory:manufacturer": "Nicira, Inc.",
+ "flow-node-inventory:port-number": 44734,
+ "flow-node-inventory:serial-number": "None",
+ "flow-node-inventory:software": "2.7.3",
+ "flow-node-inventory:switch-features": {
+ "capabilities": [
+ "flow-node-inventory:flow-feature-capability-flow-stats",
+ "flow-node-inventory:flow-feature-capability-queue-stats",
+ "flow-node-inventory:flow-feature-capability-port-stats",
+ "flow-node-inventory:flow-feature-capability-table-stats",
+ "flow-node-inventory:flow-feature-capability-group-stats"
+ ],
+ "max_buffers": 0,
+ "max_tables": 254
+ },
+ "flow-node-inventory:table": [
+ {
+ "id": 235
+ },
+ {
+ "id": 209
+ },
+ {
+ "id": 175
+ },
+ {
+ "id": 89
+ },
+ {
+ "id": 119
+ },
+ {
+ "id": 21
+ },
+ {
+ "id": 51
+ },
+ {
+ "id": 234
+ },
+ {
+ "id": 208
+ },
+ {
+ "id": 174
+ },
+ {
+ "id": 88
+ },
+ {
+ "id": 118
+ },
+ {
+ "id": 20
+ },
+ {
+ "id": 50
+ },
+ {
+ "id": 237
+ },
+ {
+ "id": 207
+ },
+ {
+ "id": 177
+ },
+ {
+ "id": 0
+ },
+ {
+ "id": 87
+ },
+ {
+ "id": 121
+ },
+ {
+ "id": 19
+ },
+ {
+ "id": 53
+ },
+ {
+ "id": 236
+ },
+ {
+ "id": 206
+ },
+ {
+ "id": 176
+ },
+ {
+ "id": 1
+ },
+ {
+ "id": 86
+ },
+ {
+ "id": 120
+ },
+ {
+ "id": 18
+ },
+ {
+ "id": 52
+ },
+ {
+ "id": 239
+ },
+ {
+ "id": 205
+ },
+ {
+ "id": 171
+ },
+ {
+ "id": 85
+ },
+ {
+ "id": 115
+ },
+ {
+ "id": 25
+ },
+ {
+ "id": 55
+ },
+ {
+ "id": 238
+ },
+ {
+ "id": 204
+ },
+ {
+ "id": 170
+ },
+ {
+ "id": 84
+ },
+ {
+ "id": 114
+ },
+ {
+ "id": 24
+ },
+ {
+ "id": 54
+ },
+ {
+ "id": 241
+ },
+ {
+ "id": 203
+ },
+ {
+ "id": 173
+ },
+ {
+ "id": 83
+ },
+ {
+ "id": 117
+ },
+ {
+ "id": 23
+ },
+ {
+ "id": 57
+ },
+ {
+ "id": 240
+ },
+ {
+ "id": 202
+ },
+ {
+ "id": 172
+ },
+ {
+ "id": 82
+ },
+ {
+ "id": 116
+ },
+ {
+ "id": 22
+ },
+ {
+ "id": 56
+ },
+ {
+ "id": 227
+ },
+ {
+ "id": 201
+ },
+ {
+ "id": 167
+ },
+ {
+ "id": 97
+ },
+ {
+ "id": 127
+ },
+ {
+ "id": 29
+ },
+ {
+ "id": 59
+ },
+ {
+ "id": 226
+ },
+ {
+ "id": 200
+ },
+ {
+ "id": 166
+ },
+ {
+ "id": 96
+ },
+ {
+ "id": 126
+ },
+ {
+ "id": 28
+ },
+ {
+ "id": 58
+ },
+ {
+ "id": 229
+ },
+ {
+ "id": 199
+ },
+ {
+ "id": 169
+ },
+ {
+ "id": 95
+ },
+ {
+ "id": 129
+ },
+ {
+ "id": 27
+ },
+ {
+ "id": 61
+ },
+ {
+ "id": 228
+ },
+ {
+ "id": 198
+ },
+ {
+ "id": 168
+ },
+ {
+ "id": 94
+ },
+ {
+ "id": 128
+ },
+ {
+ "id": 26
+ },
+ {
+ "id": 60
+ },
+ {
+ "id": 231
+ },
+ {
+ "id": 197
+ },
+ {
+ "id": 163
+ },
+ {
+ "id": 93
+ },
+ {
+ "id": 123
+ },
+ {
+ "id": 33
+ },
+ {
+ "id": 63
+ },
+ {
+ "id": 230
+ },
+ {
+ "id": 196
+ },
+ {
+ "id": 162
+ },
+ {
+ "id": 92
+ },
+ {
+ "id": 122
+ },
+ {
+ "id": 32
+ },
+ {
+ "id": 62
+ },
+ {
+ "id": 233
+ },
+ {
+ "id": 195
+ },
+ {
+ "id": 165
+ },
+ {
+ "id": 91
+ },
+ {
+ "id": 125
+ },
+ {
+ "id": 31
+ },
+ {
+ "id": 65
+ },
+ {
+ "id": 232
+ },
+ {
+ "id": 194
+ },
+ {
+ "id": 164
+ },
+ {
+ "id": 90
+ },
+ {
+ "id": 124
+ },
+ {
+ "id": 30
+ },
+ {
+ "id": 64
+ },
+ {
+ "id": 252
+ },
+ {
+ "id": 218
+ },
+ {
+ "id": 192
+ },
+ {
+ "id": 158
+ },
+ {
+ "id": 15
+ },
+ {
+ "id": 104
+ },
+ {
+ "id": 134
+ },
+ {
+ "id": 36
+ },
+ {
+ "id": 66
+ },
+ {
+ "id": 253
+ },
+ {
+ "id": 219
+ },
+ {
+ "id": 193
+ },
+ {
+ "id": 159
+ },
+ {
+ "id": 14
+ },
+ {
+ "id": 105
+ },
+ {
+ "id": 135
+ },
+ {
+ "id": 37
+ },
+ {
+ "id": 67
+ },
+ {
+ "id": 250
+ },
+ {
+ "id": 220
+ },
+ {
+ "id": 190
+ },
+ {
+ "id": 160
+ },
+ {
+ "id": 17
+ },
+ {
+ "id": 102
+ },
+ {
+ "id": 136
+ },
+ {
+ "id": 34
+ },
+ {
+ "id": 68
+ },
+ {
+ "id": 251
+ },
+ {
+ "id": 221
+ },
+ {
+ "id": 191
+ },
+ {
+ "id": 161
+ },
+ {
+ "id": 16
+ },
+ {
+ "id": 103
+ },
+ {
+ "id": 137
+ },
+ {
+ "id": 35
+ },
+ {
+ "id": 69
+ },
+ {
+ "id": 222
+ },
+ {
+ "id": 188
+ },
+ {
+ "id": 154
+ },
+ {
+ "id": 11
+ },
+ {
+ "id": 100
+ },
+ {
+ "id": 130
+ },
+ {
+ "id": 40
+ },
+ {
+ "id": 70
+ },
+ {
+ "id": 223
+ },
+ {
+ "id": 189
+ },
+ {
+ "id": 155
+ },
+ {
+ "id": 10
+ },
+ {
+ "id": 101
+ },
+ {
+ "id": 131
+ },
+ {
+ "id": 41
+ },
+ {
+ "id": 71
+ },
+ {
+ "id": 224
+ },
+ {
+ "id": 186
+ },
+ {
+ "id": 156
+ },
+ {
+ "id": 13
+ },
+ {
+ "id": 98
+ },
+ {
+ "id": 132
+ },
+ {
+ "id": 38
+ },
+ {
+ "id": 72
+ },
+ {
+ "id": 225
+ },
+ {
+ "id": 187
+ },
+ {
+ "id": 157
+ },
+ {
+ "id": 12
+ },
+ {
+ "id": 99
+ },
+ {
+ "id": 133
+ },
+ {
+ "id": 39
+ },
+ {
+ "id": 73
+ },
+ {
+ "id": 244
+ },
+ {
+ "id": 210
+ },
+ {
+ "id": 184
+ },
+ {
+ "id": 150
+ },
+ {
+ "id": 7
+ },
+ {
+ "id": 112
+ },
+ {
+ "id": 142
+ },
+ {
+ "id": 44
+ },
+ {
+ "id": 74
+ },
+ {
+ "id": 245
+ },
+ {
+ "id": 211
+ },
+ {
+ "id": 185
+ },
+ {
+ "id": 151
+ },
+ {
+ "id": 6
+ },
+ {
+ "id": 113
+ },
+ {
+ "id": 143
+ },
+ {
+ "id": 45
+ },
+ {
+ "id": 75
+ },
+ {
+ "id": 242
+ },
+ {
+ "id": 212
+ },
+ {
+ "id": 182
+ },
+ {
+ "id": 152
+ },
+ {
+ "id": 9
+ },
+ {
+ "id": 110
+ },
+ {
+ "id": 144
+ },
+ {
+ "id": 42
+ },
+ {
+ "id": 76
+ },
+ {
+ "id": 243
+ },
+ {
+ "id": 213
+ },
+ {
+ "id": 183
+ },
+ {
+ "id": 153
+ },
+ {
+ "id": 8
+ },
+ {
+ "id": 111
+ },
+ {
+ "id": 145
+ },
+ {
+ "id": 43
+ },
+ {
+ "id": 77
+ },
+ {
+ "id": 248
+ },
+ {
+ "id": 214
+ },
+ {
+ "id": 180
+ },
+ {
+ "id": 146
+ },
+ {
+ "id": 3
+ },
+ {
+ "id": 108
+ },
+ {
+ "id": 138
+ },
+ {
+ "id": 48
+ },
+ {
+ "id": 78
+ },
+ {
+ "id": 249
+ },
+ {
+ "id": 215
+ },
+ {
+ "id": 181
+ },
+ {
+ "id": 147
+ },
+ {
+ "id": 2
+ },
+ {
+ "id": 109
+ },
+ {
+ "id": 139
+ },
+ {
+ "id": 49
+ },
+ {
+ "id": 79
+ },
+ {
+ "id": 246
+ },
+ {
+ "id": 216
+ },
+ {
+ "id": 178
+ },
+ {
+ "id": 148
+ },
+ {
+ "id": 5
+ },
+ {
+ "id": 106
+ },
+ {
+ "id": 140
+ },
+ {
+ "id": 46
+ },
+ {
+ "id": 80
+ },
+ {
+ "id": 247
+ },
+ {
+ "id": 217
+ },
+ {
+ "id": 179
+ },
+ {
+ "id": 149
+ },
+ {
+ "id": 4
+ },
+ {
+ "id": 107
+ },
+ {
+ "id": 141
+ },
+ {
+ "id": 47
+ },
+ {
+ "id": 81
+ }
+ ],
+ "id": "openflow:233201308854882",
+ "node-connector": [
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "PORT-DOWN",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "d4:18:69:2c:ea:62",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "br-int",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 4294967294,
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": true,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:233201308854882:LOCAL"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:bf:eb:b0",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tapafe0eeae-e6",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 7,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:233201308854882:7"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:16:6b:45",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tap8a4ccb62-90",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 8,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:233201308854882:8"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:f0:bc:6a",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tap1defce3a-28",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 9,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:233201308854882:9"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "ten-mb-fd copper",
+ "flow-node-inventory:current-speed": 10000,
+ "flow-node-inventory:hardware-address": "fe:16:3e:ed:ee:13",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tape8c2f851-be",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 10,
+ "flow-node-inventory:reason": "update",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:233201308854882:10"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "62:29:e9:a2:e3:1a",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "br-physnet1-pa",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 1,
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:233201308854882:1"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "92:c5:a2:6d:39:1c",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tuna877bff3c2d",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 2,
+ "flow-node-inventory:reason": "add",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:233201308854882:2"
+ },
+ {
+ "flow-node-inventory:advertised-features": "",
+ "flow-node-inventory:configuration": "",
+ "flow-node-inventory:current-feature": "",
+ "flow-node-inventory:current-speed": 0,
+ "flow-node-inventory:hardware-address": "ce:b0:6f:28:36:81",
+ "flow-node-inventory:maximum-speed": 0,
+ "flow-node-inventory:name": "tunaf7425faccd",
+ "flow-node-inventory:peer-features": "",
+ "flow-node-inventory:port-number": 3,
+ "flow-node-inventory:reason": "add",
+ "flow-node-inventory:state": {
+ "blocked": false,
+ "link-down": false,
+ "live": false
+ },
+ "flow-node-inventory:supported": "",
+ "id": "openflow:233201308854882:3"
+ }
+ ],
+ "opendaylight-group-statistics:group-features": {
+ "actions": [
+ 67076097
+ ],
+ "group-capabilities-supported": [
+ "opendaylight-group-types:chaining",
+ "opendaylight-group-types:select-liveness",
+ "opendaylight-group-types:select-weight"
+ ],
+ "group-types-supported": [
+ "opendaylight-group-types:group-all",
+ "opendaylight-group-types:group-indirect",
+ "opendaylight-group-types:group-select",
+ "opendaylight-group-types:group-ff"
+ ],
+ "max-groups": [
+ 4294967040
+ ]
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
--- /dev/null
+[tox]
+envlist = py27
+
+[testenv]
+deps = discover
+commands = python -m unittest discover -v
+
+[testenv:flake8]
+deps = flake8
+basepython = python2.7
+commands = flake8 .
\ No newline at end of file