integrate various updates 22/71322/1
authorSam Hague <shague@redhat.com>
Wed, 25 Apr 2018 16:51:49 +0000 (12:51 -0400)
committerSam Hague <shague@redhat.com>
Wed, 25 Apr 2018 16:53:39 +0000 (12:53 -0400)
- move model map to models.py
- add json pretty_print for model dumps to files

Change-Id: I0553da82f3fa4f5ca441b45ee3122c6859c8deea
Signed-off-by: Sam Hague <shague@redhat.com>
resources/tools/odltools/csit/tests/test_robotfiles.py
resources/tools/odltools/mdsal/models.py
resources/tools/odltools/mdsal/request.py
resources/tools/odltools/mdsal/tests/test_models.py [new file with mode: 0644]
resources/tools/odltools/netvirt/constants.py
resources/tools/odltools/odltools/logg.py
resources/tools/odltools/ovs/request.py
resources/tools/odltools/ovs/tests/test_request.py

index 2fa282ee9bbd81d2fb26d23aab3468507b6dbcb4..bdba34539550067588250f6024b30edd7bbe8d5a 100644 (file)
@@ -1,4 +1,3 @@
-import logging
 import os
 import unittest
 from csit.robotfiles import RobotFiles
index 9320067ead6d4ff3ba7a27c1abce25e6f8172148..fbdad9e08262cfe46f8b35fa1f70ed98503429e4 100644 (file)
@@ -1,3 +1,4 @@
+import request
 from mdsal.model import Model
 from mdsal import elan
 from mdsal import id_manager
@@ -14,44 +15,172 @@ from mdsal import odl_l3vpn
 from mdsal import opendaylight_inventory
 
 
-modelpath = "/tmp/robotjob/s1-t1_Create_VLAN_Network_net_1/models"
-elan_elan_instances = None
-elan_elan_interfaces = None
-id_manager_id_pools = None
-ietf_interfaces_interfaces = None
-ietf_interfaces_interfaces_state = None
-interface_service_bindings_service_bindings = None
-itm_state_tunnels_state = None
-l3vpn_vpn_interfaces = None
-mip_mac = None
-network_topology_network_topology_config = None
-network_topology_network_topology_operational = None
-neutron_neutron = None
-odl_fib_fib_entries = None
-odl_interface_meta_if_index_interface_map = None
-odl_inventory_nodes_config = None
-odl_inventory_nodes_operational = None
-odl_l3vpn_vpn_instance_to_vpn_id = None
-
-
-def get_all_dumps():
-    global elan_elan_instances
-    global elan_elan_interfaces
-    global id_manager_id_pools
-    global ietf_interfaces_interfaces
-    global ietf_interfaces_interfaces_state
-    global interface_service_bindings_service_bindings
-    global itm_state_tunnels_state
-    global l3vpn_vpn_interfaces
-    global mip_mac
-    global network_topology_network_topology_config
-    global network_topology_network_topology_operational
-    global neutron_neutron
-    global odl_fib_fib_entries
-    global odl_interface_meta_if_index_interface_map
-    global odl_inventory_nodes_config
-    global odl_inventory_nodes_operational
-    global odl_l3vpn_vpn_instance_to_vpn_id
+DSM_FILE = 0
+DSM_DSTYPE = 1
+DSM_PATH = 2
+DSM_ROOT1 = 3
+DSM_ROOT2 = 4
+"""
+   source map to fetch data from data store.
+   Format is:
+   resource-key-name:[filename,datastore_type,resource-url,container-name,list-title]
+"""
+
+DSMAP = {
+    'acls': ['acls.json', 'config','ietf-access-control-list:access-lists',
+             'access-lists', 'acls'],
+    'bindings': ['service-bindings.json', 'config', 'interface-service-bindings:service-bindings',
+                 'service-bindings', 'services-info'],
+    'bound-servicesstate': ['bound-services-state-list.json', 'operational',
+                            'interface-service-bindings:bound-services-state-list',
+                            'bound-services-state-list', 'bound-services-state'],
+    'dpnendpoints': ['dpn-endpoints.json', 'config', 'itm-state:dpn-endpoints',
+                     'dpn-endpoints', 'DPN-TEPs-info'],
+    'bgp': ['ebgp-bgp.json', 'config', 'ebgp:bgp',
+            'bgp', 'tbd'],
+    'elan-dpninterfaces': ['elan-dpn-interfaces.json', 'operational', 'elan:elan-dpn-interfaces',
+                           'elan-dpn-interfaces', 'elan-dpn-interfaces-list'],
+    'elan-forwardingtables': ['elan-forwarding-tables.json', 'operational', 'elan:elan-forwarding-tables',
+                              'elan-forwarding-tables', 'mac-tables'],
+    'elaninstances': ['elan-instances.json', 'config', 'elan:elan-instances',
+                      'elan-instances', 'elan-instance'],
+    'elaninterfaces': ['elan-interfaces.json', 'config', 'elan:elan-interfaces',
+                       'elan-interfaces', 'elan-interface'],
+    'elanstate': ['elan-state.json', 'config', 'elan:elan-state',
+                  'elan-instances', 'elan-instance'],
+    'fibentries': ['fibentries.json', 'config', 'odl-fib:fibEntries',
+                   'fibEntries', 'vrfTables'],
+    'idpools': ['idpools.json', 'config', 'id-manager:id-pools',
+                'id-pools', 'id-pool'],
+    'ifconfig': ['iface-config.json', 'config', 'ietf-interfaces:interfaces',
+                 'interfaces', 'interface'],
+    'itmconfig': ['itm-config.json', 'config', 'itm-state:dpn-teps-state',
+                  'dpn-teps-state', 'dpns-teps'],
+    'ifchildinfo': ['ifchildinfo.json', 'config', 'odl-interface-meta:interface-child-info',
+                    'interface-child-info', 'interface-parent-entry'],
+    'ifindexes': ['ifindexes.json', 'operational', 'odl-interface-meta:if-indexes-interface-map',
+                  'if-indexes-interface-map', 'if-index-interface'],
+    'ifstate': ['ifstate.json', 'operational', 'ietf-interfaces:interfaces-state',
+                'interfaces-state', 'interface'],
+    'inventory': ['inventory-config.json', 'config',
+                  'opendaylight-inventory:nodes', 'nodes', 'node'],
+    'inventory-oper': ['inventory-oper.json', 'operational',
+                       'opendaylight-inventory:nodes', 'nodes', 'node'],
+    'l3nexthop': ['l3nexthop.json', 'operational', 'l3nexthop:l3nexthop',
+                  'l3nexthop', 'vpnNextHops'],
+    'labelroutemap': ['label-route-map.json', 'operational', 'odl-fib:label-route-map',
+                      'label-route-map', 'tbd'],
+    'learntvpnvip-to-port': ['learnt-vpn-vip-to-port-data.json', 'operational',
+                             'odl-l3vpn:learnt-vpn-vip-to-port-data',
+                             'learnt-vpn-vip-to-port-data', 'learnt-vpn-vip-to-port'],
+    'nat-extrouters': ['nat-ext-routers.json', 'config', 'odl-nat:ext-routers',
+                       'ext-routers', 'routers'],
+    'nat-extnetworks': ['nat-external-networks.json', 'config', 'odl-nat:external-networks',
+                        'external-networks', 'networks'],
+    'nat-extsubnets': ['nat-external-subnets.json', 'config', 'odl-nat:external-subnets',
+                       'external-subnets', 'subnets'],
+    'nat-flowtingip': ['nat-floating-ip-info.json', 'config', 'odl-nat:floating-ip-info',
+                       'floating-ip-info', 'router-ports'],
+    'nat-flowtingip-oper': ['nat-floating-ip-info-oper.json', 'operational', 'odl-nat:floating-ip-info',
+                            'floating-ip-info', 'router-ports'],
+    'nat-intextip-map': ['nat-intext-ip-map.json', 'operational', 'odl-nat:intext-ip-map',
+                         'intext-ip-port-map', 'tbd'],
+    'nat-intextip-portmap': ['nat-intext-ip-port-map.json', 'config', 'odl-nat:intext-ip-port-map',
+                             'intext-ip-port-map', 'tbd'],
+    'nat-naptswitches': ['nat-napt-switches.json', 'config', 'odl-nat:napt-switches',
+                         'napt-switches', 'router-to-napt-switch'],
+    'nat-routeridname': ['nat-router-id-name.json', 'config', 'odl-nat:router-id-name',
+                         'router-id-name', 'routerIds'],
+    'nat-snatintip-portmap': ['nat-snatint-ip-port-map.json', 'config', 'odl-nat:snatint-ip-port-map',
+                              'snatint-ip-port-map', 'tbd'],
+    'neutron-routerdpns': ['neutron-router-dpns.json', 'operational', 'odl-l3vpn:neutron-router-dpns',
+                           'neutron-router-dpns', 'router-dpn-list'],
+    'neutronnetworks': ['neutron-networks.json', 'config', 'neutron:neutron/networks',
+                        'networks', 'network'],
+    'neutronports': ['neutron-ports.json', 'config', 'neutron:neutron/ports',
+                     'ports', 'port'],
+    'neutronrouters': ['neutron-routers.json', 'config', 'neutron:neutron/routers',
+                       'routers', 'router'],
+    'neutronsubnets': ['neutron-subnets.json', 'config', 'neutron:neutron/subnets',
+                       'subnets', 'subnet'],
+    'neutrontrunks': ['neutron-trunks.json', 'config', 'neutron:neutron/trunks',
+                      'trunks', 'trunk'],
+    'neutronvpn-networkmap': ['neutronvpn-networkmaps.json', 'config', 'neutronvpn:networkMaps',
+                              'networkMaps', 'networkMap'],
+    'neutronvpn-portip': ['neutronvpn-portip-port.json', 'config', 'neutronvpn:neutron-vpn-portip-port-data',
+                          'neutron-vpn-portip-port-data', 'vpn-portip-to-port'],
+    'neutronvpn-routerinterfaces-map': ['neutronvpn-routerinterfacesmap.json', 'config',
+                                        'neutronvpn:router-interfaces-map',
+                                        'router-interfaces-map', 'tbd'],
+    'neutronvpn-subnetmap': ['neutronvpn-sunbnetmaps.json', 'config', 'neutronvpn:subnetMaps',
+                             'subnetMaps', 'subnetMap'],
+    'neutronvpn-vpnmap': ['neutronvpn-vpnmaps.json', 'config', 'neutronvpn:vpnMaps',
+                          'vpnMaps', 'vpnMap'],
+    'ovsdb': ['ovsdb-config.json', 'config', 'network-topology:network-topology',
+              'network-topology', 'topology'],
+    'ovsdb-oper': ['ovsdb-oper.json', 'operational', 'network-topology:network-topology',
+                   'network-topology', 'topology'],
+    'portopdata': ['port-op-data.json', 'operational', 'odl-l3vpn:port-op-data',
+                   'port-op-data', 'port-op-data-entry'],
+    'prefix-to-interface': ['prefix-to-interface.json', 'operational', 'odl-l3vpn:prefix-to-interface',
+                            'prefix-to-interface', 'vpnids'],
+    'subnetopdata': ['subnet-op-data.json', 'operational', 'odl-l3vpn:subnet-op-data',
+                     'subnet-op-data', 'subnet-op-data-entry'],
+    'transportzone': ['transport-zones.json', 'config', 'itm:transport-zones',
+                      'transport-zones', 'transport-zone'],
+    'tunconfig-external': ['tunnel-config-external.json', 'config', 'itm-state:external-tunnel-list',
+                           'external-tunnel-list', 'external-tunnel'],
+    'tunconfig': ['tunnel-config.json', 'config', 'itm-state:tunnel-list',
+                  'tunnel-list', 'internal-tunnel'],
+    'tunstate': ['tunnel-state.json', 'operational', 'itm-state:tunnels_state',
+                 'tunnels_state', 'state-tunnel-list'],
+    'vpninstance-opdata': ['vpn-instance-op-data.json', 'operational', 'odl-l3vpn:vpn-instance-op-data',
+                           'vpn-instance-op-data', 'vpn-instance-op-data-entry'],
+    'vpninterface-opdata': ['vpn-interface-op-data.json', 'operational', 'odl-l3vpn:vpn-interface-op-data',
+                            'vpn-interface-op-data', 'vpn-interface-op-data-entry'],
+    'vpninstance-to-vpnid': ['vpninstance-to-vpnid.json', 'config', 'odl-l3vpn:vpn-instance-to-vpn-id',
+                             'vpn-instance-to-vpn-id', 'vpn-instance'],
+    'vpntoextraroute': ['vpn-to-extraroute.json', 'operational', 'odl-l3vpn:vpn-to-extraroute',
+                        'vpn-to-extraroute', 'tbd'],
+    'vpnid-to-vpninstance': ['vpnid-to-vpninstance.json', 'config', 'odl-l3vpn:vpn-id-to-vpninstance',
+                             'vpn-id-to-vpninstance', 'vpn-ids'],
+    'vpninterfaces': ['vpn-interfaces.json', 'config', 'l3vpn:vpn-interfaces',
+                      'vpn-interfaces', 'vpn-interface'],
+    'vpn-routerinterfaces': ['router-interfaces.json', 'config', 'odl-l3vpn:router-interfaces',
+                             'router-interfaces', 'router-interface']
+}
+
+
+def get_all_dumps(path, ip, port, user, pw, pretty_print=False):
+    for res in DSMAP.itervalues():
+        store = res[DSM_DSTYPE]
+        model_path = res[DSM_PATH]
+        path_split = split_model_path(model_path)
+        filename = make_filename(path, store, path_split.name, path_split.container)
+        url = make_url(ip, port, store, path_split.name, path_split.container)
+        get_model_data(filename, url, user, pw, pretty_print)
+
+
+def get_all_model_dumps():
+    modelpath = "/tmp/robotjob/s1-t1_Create_VLAN_Network_net_1/models"
+    elan_elan_instances = None
+    elan_elan_interfaces = None
+    id_manager_id_pools = None
+    ietf_interfaces_interfaces = None
+    ietf_interfaces_interfaces_state = None
+    interface_service_bindings_service_bindings = None
+    itm_state_tunnels_state = None
+    l3vpn_vpn_interfaces = None
+    mip_mac = None
+    network_topology_network_topology_config = None
+    network_topology_network_topology_operational = None
+    neutron_neutron = None
+    odl_fib_fib_entries = None
+    odl_interface_meta_if_index_interface_map = None
+    odl_inventory_nodes_config = None
+    odl_inventory_nodes_operational = None
+    odl_l3vpn_vpn_instance_to_vpn_id = None
+
 
     elan_elan_instances = elan.elan_instances(Model.CONFIG, modelpath)
     elan_elan_interfaces = elan.elan_interfaces(Model.CONFIG, modelpath)
@@ -71,3 +200,41 @@ def get_all_dumps():
     odl_inventory_nodes_config = opendaylight_inventory.nodes(Model.CONFIG, modelpath)
     odl_inventory_nodes_operational = opendaylight_inventory.nodes(Model.OPERATIONAL, modelpath)
     odl_l3vpn_vpn_instance_to_vpn_id = odl_l3vpn.vpn_instance_to_vpn_id(Model.CONFIG, modelpath)
+
+
+class ModelSplit:
+    def __init__(self, name, container):
+        self.name = name
+        self.container = container
+
+
+def split_model_path(model_path):
+    path_split = model_path.split(":")
+    return ModelSplit(path_split[0], path_split[1])
+
+
+def make_filename(path, store, name, container):
+    return "{}/{}_{}:{}.json".format(path, store, name, container.replace("/", "_"))
+
+
+def make_url(ip, port, store, name, container):
+    return "http://{}:{}/restconf/{}/{}:{}".format(ip, port, store,
+                                                   name, container)
+
+
+def get_from_odl(url, user, pw):
+    return request.get(url, user, pw)
+
+
+def read_file(filename):
+    return request.read_file(filename)
+
+
+def get_model_data(filename, url, user, pw, pretty_print=False):
+    data = read_file(filename)
+    if data is not None:
+        return
+
+    data = get_from_odl(url, user, pw)
+    if data is not None:
+        request.write_file(filename, data, pretty_print)
index 28e1e0ef3b50511ce2eb6b73383135f0f0abd43b..f0d900a4e141ef47dc77cbc9aa9fd5ba526a55ae 100644 (file)
@@ -1,34 +1,59 @@
+import errno
 import json
 import logging
+import os
 import requests
 
 
 logger = logging.getLogger("mdsal.request")
 
 
-def debug_print(text1, data):
-    logger.debug("request: %s: processed %d lines", text1, len(data))
-    logger.debug("request: %s", text1)
-    logger.debug("%s", json.dumps(data))
-    logger.debug("%s", json.dumps(data, indent=4, separators=(',', ': ')))
+def debug_print(fname, text1, data):
+    logger.debug("%s: request: %s: processed %d lines", fname, text1, len(data))
+    logger.debug("%s:\n%s", fname, json.dumps(data))
+    logger.debug("%s:\n%s", fname, json.dumps(data, indent=4, separators=(',', ': ')))
 
 
 def get(url, user, pw):
-    resp = requests.get(url, auth=(user, pw))
-    # TODO: add error checking of the response
-    data = resp.json()
-    debug_print(url, data)
+    try:
+        resp = requests.get(url, auth=(user, pw))
+    except requests.exceptions.RequestException:
+        logger.exception("Failed to get url")
+        return None
+
+    try:
+        data = resp.json()
+    except ValueError:
+        logger.exception("Failed to get url")
+        return None
+
+    if logger.isEnabledFor(logging.DEBUG):
+        debug_print("get", url, data)
     return data
 
 
 def read_file(filename):
+    if os.path.isfile(filename) is False:
+        return None
+
     with open(filename) as json_file:
         data = json.load(json_file)
-    debug_print(filename, data)
+    if logger.isEnabledFor(logging.DEBUG):
+        debug_print("read_file", filename, data)
     return data
 
 
-def write_file(filename, data):
+def write_file(filename, data, pretty_print=False):
+    try:
+        os.makedirs(os.path.dirname(filename))
+    except OSError as exception:
+        if exception.errno != errno.EEXIST:
+            raise
+
     with open(filename, 'w') as fp:
-        json.dump(data, fp)
-    logger.debug("write_file: File: %s", filename)
+        if pretty_print:
+            json.dump(data, fp, indent=4, separators=(',', ': '))
+        else:
+            json.dump(data, fp)
+    if logger.isEnabledFor(logging.DEBUG):
+        debug_print("write_file", filename, data)
diff --git a/resources/tools/odltools/mdsal/tests/test_models.py b/resources/tools/odltools/mdsal/tests/test_models.py
new file mode 100644 (file)
index 0000000..2f0fe8e
--- /dev/null
@@ -0,0 +1,32 @@
+import logging
+import os
+import shutil
+import unittest
+from mdsal import models
+from odltools import logg
+
+
+class TestModels(unittest.TestCase):
+    def setUp(self):
+        logg.Logger(logging.DEBUG, logging.DEBUG)
+        self.path = "/tmp/testmodels"
+        self.ip = "127.0.0.1"
+        self.port = "8181"
+        self.user = "admin"
+        self.pw = "admin"
+
+    def test_get_all_dumps(self):
+        shutil.rmtree(self.path)
+        models.get_all_dumps(self.path, self.ip, self.port, self.user, self.pw, True)
+
+        # assert each model has been saved to a file
+        for res in models.DSMAP.itervalues():
+            store = res[models.DSM_DSTYPE]
+            model_path = res[models.DSM_PATH]
+            path_split = models.split_model_path(model_path)
+            filename = models.make_filename(self.path, store, path_split.name, path_split.container)
+            self.assertTrue(os.path.isfile(filename))
+
+
+if __name__ == '__main__':
+    unittest.main()
index 568babe716adedca9fcbfcaeb205b0eb4029dd1c..4126d82cb0c78456cbf6cda97526f86f2527bd40 100644 (file)
@@ -12,140 +12,6 @@ IFTYPE_TUNNEL = 'iana-if-type:tunnel'
 NODE_GROUP = 'flow-node-inventory:group'
 NODE_TABLE = 'flow-node-inventory:table'
 
-DSM_FILE = 0
-DSM_DSTYPE = 1
-DSM_PATH = 2
-DSM_ROOT1 = 3
-DSM_ROOT2 = 4
-"""
-   source map to fetch data from data store.
-   Format is:
-   resource-key-name:[filename,datastore_type,resource-url,container-name,list-title]
-"""
-
-DSMAP = {
-    'acls': ['acls.json', 'config','ietf-access-control-list:access-lists',
-             'access-lists', 'acls'],
-    'bindings': ['service-bindings.json', 'config', 'interface-service-bindings:service-bindings',
-                 'service-bindings', 'services-info'],
-    'bound-servicesstate': ['bound-services-state-list.json', 'operational',
-                            'interface-service-bindings:bound-services-state-list',
-                            'bound-services-state-list', 'bound-services-state'],
-    'dpnendpoints': ['dpn-endpoints.json', 'config', 'itm-state:dpn-endpoints',
-                     'dpn-endpoints', 'DPN-TEPs-info'],
-    'bgp': ['ebgp-bgp.json', 'config', 'ebgp:bgp',
-            'bgp', 'tbd'],
-    'elan-dpninterfaces': ['elan-dpn-interfaces.json', 'operational', 'elan:elan-dpn-interfaces',
-                           'elan-dpn-interfaces', 'elan-dpn-interfaces-list'],
-    'elan-forwardingtables': ['elan-forwarding-tables.json', 'operational', 'elan:elan-forwarding-tables',
-                              'elan-forwarding-tables', 'mac-tables'],
-    'elaninstances': ['elan-instances.json', 'config', 'elan:elan-instances',
-                      'elan-instances', 'elan-instance'],
-    'elaninterfaces': ['elan-interfaces.json', 'config', 'elan:elan-interfaces',
-                       'elan-interfaces', 'elan-interface'],
-    'elanstate': ['elan-state.json', 'config', 'elan:elan-state',
-                  'elan-instances', 'elan-instance'],
-    'fibentries': ['fibentries.json', 'config', 'odl-fib:fibEntries',
-                   'fibEntries', 'vrfTables'],
-    'idpools': ['idpools.json', 'config', 'id-manager:id-pools',
-                'id-pools', 'id-pool'],
-    'ifconfig': ['iface-config.json', 'config', 'ietf-interfaces:interfaces',
-                 'interfaces', 'interface'],
-    'itmconfig': ['itm-config.json', 'config', 'itm-state:dpn-teps-state',
-                  'dpn-teps-state', 'dpns-teps'],
-    'ifchildinfo': ['ifchildinfo.json', 'config', 'odl-interface-meta:interface-child-info',
-                    'interface-child-info', 'interface-parent-entry'],
-    'ifindexes': ['ifindexes.json', 'operational', 'odl-interface-meta:if-indexes-interface-map',
-                  'if-indexes-interface-map', 'if-index-interface'],
-    'ifstate': ['ifstate.json', 'operational', 'ietf-interfaces:interfaces-state',
-                'interfaces-state', 'interface'],
-    'inventory': ['inventory-config.json', 'config',
-                  'opendaylight-inventory:nodes', 'nodes', 'node'],
-    'inventory-oper': ['inventory-oper.json', 'oper',
-                       'opendaylight-inventory:nodes', 'nodes', 'node'],
-    'l3nexthop': ['l3nexthop.json', 'operational', 'l3nexthop:l3nexthop',
-                  'l3nexthop', 'vpnNextHops'],
-    'labelroutemap': ['label-route-map.json', 'operational', 'odl-fib:label-route-map',
-                      'label-route-map', 'tbd'],
-    'learntvpnvip-to-port': ['learnt-vpn-vip-to-port-data.json', 'operational',
-                             'odl-l3vpn:learnt-vpn-vip-to-port-data',
-                             'learnt-vpn-vip-to-port-data', 'learnt-vpn-vip-to-port'],
-    'nat-extrouters': ['nat-ext-routers.json', 'config', 'odl-nat:ext-routers',
-                       'ext-routers', 'routers'],
-    'nat-extnetworks': ['nat-external-networks.json', 'config', 'odl-nat:external-networks',
-                        'external-networks', 'networks'],
-    'nat-extsubnets': ['nat-external-subnets.json', 'config', 'odl-nat:external-subnets',
-                       'external-subnets', 'subnets'],
-    'nat-flowtingip': ['nat-floating-ip-info.json', 'config', 'odl-nat:floating-ip-info',
-                       'floating-ip-info', 'router-ports'],
-    'nat-flowtingip-oper': ['nat-floating-ip-info-oper.json', 'operational', 'odl-nat:floating-ip-info',
-                            'floating-ip-info', 'router-ports'],
-    'nat-intextip-map': ['nat-intext-ip-map.json', 'operational', 'odl-nat:intext-ip-map',
-                         'intext-ip-port-map', 'tbd'],
-    'nat-intextip-portmap': ['nat-intext-ip-port-map.json', 'config', 'odl-nat:intext-ip-port-map',
-                             'intext-ip-port-map', 'tbd'],
-    'nat-naptswitches': ['nat-napt-switches.json', 'config', 'odl-nat:napt-switches',
-                         'napt-switches', 'router-to-napt-switch'],
-    'nat-routeridname': ['nat-router-id-name.json', 'config', 'odl-nat:router-id-name',
-                         'router-id-name', 'routerIds'],
-    'nat-snatintip-portmap': ['nat-snatint-ip-port-map.json', 'config', 'odl-nat:snatint-ip-port-map',
-                              'snatint-ip-port-map', 'tbd'],
-    'neutron-routerdpns': ['neutron-router-dpns.json', 'operational', 'odl-l3vpn:neutron-router-dpns',
-                           'neutron-router-dpns', 'router-dpn-list'],
-    'neutronnetworks': ['neutron-networks.json', 'config', 'neutron:neutron/networks',
-                        'networks', 'network'],
-    'neutronports': ['neutron-ports.json', 'config', 'neutron:neutron/ports',
-                     'ports', 'port'],
-    'neutronrouters': ['neutron-routers.json', 'config', 'neutron:neutron/routers',
-                       'routers', 'router'],
-    'neutronsubnets': ['neutron-subnets.json', 'config', 'neutron:neutron/subnets',
-                       'subnets', 'subnet'],
-    'neutrontrunks': ['neutron-trunks.json', 'config', 'neutron:neutron/trunks',
-                      'trunks', 'trunk'],
-    'neutronvpn-networkmap': ['neutronvpn-networkmaps.json', 'config', 'neutronvpn:networkMaps',
-                              'networkMaps', 'networkMap'],
-    'neutronvpn-portip': ['neutronvpn-portip-port.json', 'config', 'neutronvpn:neutron-vpn-portip-port-data',
-                          'neutron-vpn-portip-port-data', 'vpn-portip-to-port'],
-    'neutronvpn-routerinterfaces-map': ['neutronvpn-routerinterfacesmap.json', 'config',
-                                        'neutronvpn:router-interfaces-map',
-                                        'router-interfaces-map', 'tbd'],
-    'neutronvpn-subnetmap': ['neutronvpn-sunbnetmaps.json', 'config', 'neutronvpn:subnetMaps',
-                             'subnetMaps', 'subnetMap'],
-    'neutronvpn-vpnmap': ['neutronvpn-vpnmaps.json', 'config', 'neutronvpn:vpnMaps',
-                          'vpnMaps', 'vpnMap'],
-    'ovsdb': ['ovsdb-config.json', 'config', 'network-topology:network-topology',
-              'network-topology', 'topology'],
-    'ovsdb-oper': ['ovsdb-oper.json', 'operational', 'network-topology:network-topology',
-                   'network-topology', 'topology'],
-    'portopdata': ['port-op-data.json', 'operational', 'odl-l3vpn:port-op-data',
-                   'port-op-data', 'port-op-data-entry'],
-    'prefix-to-interface': ['prefix-to-interface.json', 'operational', 'odl-l3vpn:prefix-to-interface',
-                            'prefix-to-interface', 'vpnids'],
-    'subnetopdata': ['subnet-op-data.json', 'operational', 'odl-l3vpn:subnet-op-data',
-                     'subnet-op-data', 'subnet-op-data-entry'],
-    'transportzone': ['transport-zones.json', 'config', 'itm:transport-zones',
-                      'transport-zones', 'transport-zone'],
-    'tunconfig-external': ['tunnel-config-external.json', 'config', 'itm-state:external-tunnel-list',
-                           'external-tunnel-list', 'external-tunnel'],
-    'tunconfig': ['tunnel-config.json', 'config', 'itm-state:tunnel-list',
-                  'tunnel-list', 'internal-tunnel'],
-    'tunstate': ['tunnel-state.json', 'operational', 'itm-state:tunnels_state',
-                 'tunnels_state', 'state-tunnel-list'],
-    'vpninstance-opdata': ['vpn-instance-op-data.json', 'operational', 'odl-l3vpn:vpn-instance-op-data',
-                           'vpn-instance-op-data', 'vpn-instance-op-data-entry'],
-    'vpninterface-opdata': ['vpn-interface-op-data.json', 'operational', 'odl-l3vpn:vpn-interface-op-data',
-                            'vpn-interface-op-data', 'vpn-interface-op-data-entry'],
-    'vpninstance-to-vpnid': ['vpninstance-to-vpnid.json', 'config', 'odl-l3vpn:vpn-instance-to-vpn-id',
-                             'vpn-instance-to-vpn-id', 'vpn-instance'],
-    'vpntoextraroute': ['vpn-to-extraroute.json', 'operational', 'odl-l3vpn:vpn-to-extraroute',
-                        'vpn-to-extraroute', 'tbd'],
-    'vpnid-to-vpninstance': ['vpnid-to-vpninstance.json', 'config', 'odl-l3vpn:vpn-id-to-vpninstance',
-                             'vpn-id-to-vpninstance', 'vpn-ids'],
-    'vpninterfaces': ['vpn-interfaces.json', 'config', 'l3vpn:vpn-interfaces',
-                      'vpn-interfaces', 'vpn-interface'],
-    'vpn-routerinterfaces': ['router-interfaces.json', 'config', 'odl-l3vpn:router-interfaces',
-                             'router-interfaces', 'router-interface']
-}
 
 TABLE_MAP = {
     'ifm': [0, 17, 220],
index 1b008f080262e7ece50785d902e160ae01aa0ef1..50f937d912c85fe2424a9752595d3ed54a11dd14 100644 (file)
@@ -2,15 +2,15 @@ import logging
 
 
 class Logger:
-    def __init__(self):
+    def __init__(self, console_level=logging.INFO, file_level=logging.DEBUG):
         logger = logging.getLogger()
         formatter = logging.Formatter('%(asctime)s | %(levelname).3s | %(name)-20s | %(lineno)04d | %(message)s')
         ch = logging.StreamHandler()
-        ch.setLevel(logging.INFO)
+        ch.setLevel(console_level)
         ch.setFormatter(formatter)
         logger.addHandler(ch)
         fh = logging.FileHandler("/tmp/odltools.txt", "w")
-        fh.setLevel(logging.DEBUG)
+        fh.setLevel(file_level)
         fh.setFormatter(formatter)
         logger.addHandler(fh)
         logger.setLevel(min([ch.level, fh.level]))
index 497c283f93fe605fbcc2b0dd6b149abd6b75e1ec..d9df56bbeafcef2414f559efd1a3f26cbd8fb398 100644 (file)
@@ -1,5 +1,6 @@
+import errno
 import logging
-
+import os
 
 # TODO:
 # - requests to get flow dumps via ovs-vsctl, ssh
@@ -9,6 +10,9 @@ logger = logging.getLogger("ovs.request")
 
 
 def read_file(filename):
+    if os.path.isfile(filename) is False:
+        return None
+
     lines = []
     with open(filename, 'r') as fp:
         for line in fp:
@@ -19,6 +23,12 @@ def read_file(filename):
 
 
 def write_file(filename, lines):
+    try:
+        os.makedirs(os.path.dirname(filename))
+    except OSError as exception:
+        if exception.errno != errno.EEXIST:
+            raise
+
     with open(filename, 'w') as fp:
         fp.writelines(lines)
     logger.debug("write_file: File: %s: wrote %d lines", filename, len(lines))
index cec294c07d6f63345ebfe91ba023c3da1660bbb1..ea5b88919cb4bfb4aafcfdfe4425810c4c4ed948 100644 (file)
@@ -1,3 +1,4 @@
+import logging
 import unittest
 from odltools import logg
 from ovs import request
@@ -5,7 +6,7 @@ from ovs import request
 
 class TestRequest(unittest.TestCase):
     def setUp(self):
-        logg.Logger()
+        logg.Logger(logging.DEBUG, logging.DEBUG)
         self.filename = "./resources/flow_dumps.1.txt"
 
     def test_read_file(self):
@@ -15,7 +16,7 @@ class TestRequest(unittest.TestCase):
     def test_write_file(self):
         data = request.read_file(self.filename)
         self.assertEquals(len(data), 76)
-        request.write_file("/tmp/flow_dumps.1.out.txt", data)
+        request.write_file("/tmp/somedir/flow_dumps.1.out.txt", data)
 
 if __name__ == '__main__':
     unittest.main()