X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=csit%2Flibraries%2Fnetvirt%2Fexcepts.py;h=92677473c3e12e50bfe51845968d16513dd1401f;hb=50569870e68e436d097ebcfab827f14db426a800;hp=092f2b7005e5badf1d8ebbc3aa084a69feeb8dca;hpb=08e1de3549b36c61366ec909477ac4d1a57f2f37;p=integration%2Ftest.git diff --git a/csit/libraries/netvirt/excepts.py b/csit/libraries/netvirt/excepts.py index 092f2b7005..92677473c3 100644 --- a/csit/libraries/netvirt/excepts.py +++ b/csit/libraries/netvirt/excepts.py @@ -1,5 +1,7 @@ import collections +import errno import logging +import os import re # Make sure to have unique matches in different lines @@ -12,11 +14,7 @@ _whitelist = [ "Optimistic lock failed for path /(urn:opendaylight:inventory?revision=2013-08-19)nodes/node/node" + "[{(urn:opendaylight:inventory?revision=2013-08-19)id=openflow", "table/table[{(urn:opendaylight:flow:inventory?revision=2013-08-19)id=21}]/flow/flow" + - "[{(urn:opendaylight:flow:inventory?revision=2013-08-19)id=L3.", - "Conflicting modification for path /(urn:opendaylight:inventory?revision=2013-08-19)nodes/node/node" + - "[{(urn:opendaylight:inventory?revision=2013-08-19)id=", - "table/table[{(urn:opendaylight:flow:inventory?revision=2013-08-19)id=21}]/flow/flow" + - "[{(urn:opendaylight:flow:inventory?revision=2013-08-19)id=L3.", ".21.", ".42." + "[{(urn:opendaylight:flow:inventory?revision=2013-08-19)id=L3." ]}, # oxygen {"issue": "https://jira.opendaylight.org/browse/NETVIRT-972", @@ -35,10 +33,6 @@ _whitelist = [ "Node was created by other transaction", "Optimistic lock failed for path /(urn:opendaylight:inventory?revision=2013-08-19)nodes/node/node" + "[{(urn:opendaylight:inventory?revision=2013-08-19)id=openflow:", - "Conflicting modification for path /(urn:opendaylight:inventory?revision=2013-08-19)nodes/node/node" + - "[{(urn:opendaylight:inventory?revision=2013-08-19)id=openflow:", - "table/table[{(urn:opendaylight:flow:inventory?revision=2013-08-19)id=47}]/flow/flow" + - "[{(urn:opendaylight:flow:inventory?revision=2013-08-19)id=SNAT.", ".47." ]}, # oxygen {"issue": "https://jira.opendaylight.org/browse/NETVIRT-1135", @@ -57,9 +51,6 @@ _whitelist = [ "Optimistic lock failed for path /(urn:opendaylight:netvirt:elan?revision=2015-06-02)elan-" + "forwarding-tables/mac-table/mac-table[{(urn:opendaylight:netvirt:elan?revision=2015-06-02)" + "elan-instance-name=", - "Conflicting modification for path /(urn:opendaylight:netvirt:elan?revision=2015-06-02)elan-" + - "forwarding-tables/mac-table/mac-table[{(urn:opendaylight:netvirt:elan?revision=2015-06-02)" + - "elan-instance-name=" ]}, # oxygen version of NETVIRT-1136 {"issue": "https://jira.opendaylight.org/browse/NETVIRT-1136", @@ -74,11 +65,8 @@ _whitelist = [ {"issue": "https://jira.opendaylight.org/browse/NETVIRT-1260", "id": "ConflictingModificationAppliedException", "context": [ - "Node was deleted by other transaction", "Optimistic lock failed for path /(urn:ietf:params:xml:ns:yang:ietf-interfaces?revision=2014-05-08)" + "interfaces/interface/interface[{(urn:ietf:params:xml:ns:yang:ietf-interfaces?revision=2014-05-08)name=", - "Conflicting modification for path /(urn:ietf:params:xml:ns:yang:ietf-interfaces?revision=2014-05-08)" + - "interfaces/interface/interface[{(urn:ietf:params:xml:ns:yang:ietf-interfaces?revision=2014-05-08)name=" ]}, {"issue": "https://jira.opendaylight.org/browse/NETVIRT-1270", "id": "ConflictingModificationAppliedException", @@ -156,7 +144,7 @@ def get_exceptions(lines): The lines are parsed to create a list where all lines related to a timestamp are aggregated. Timestamped lines with exception (case insensitive) are copied to the exception map keyed to the index of the timestamp line. Each exception value - also has a 3 element list containing the last three WARN and ERROR lines. + also has a list containing WARN and ERROR lines proceeding the exception. :param list lines: :return OrderedDict _ex_map: map of exceptions @@ -243,3 +231,38 @@ def verify_exceptions(lines): return get_exceptions(lines) return check_exceptions() + + +def write_exceptions_map_to_file(testname, filename, mode="a+"): + """ + Write the exceptions map to a file under the testname header. The output + will include all lines in the exception itself as well as any previous + contextual warning or error lines. The output will be appended or overwritten + depending on the mode parameter. It is assumed that the caller has called + verify_exceptions() earlier to populate the exceptions map, otherwise only + the testname and header will be printed to the file. + + :param str testname: The name of the test + :param str filename: The file to open for writing + :param str mode: Append (a+) or overwrite (w+) + """ + try: + os.makedirs(os.path.dirname(filename)) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise + + with open(filename, mode) as fp: + fp.write("{}\n".format("=" * 60)) + fp.write("Starting test: {}\n".format(testname)) + for ex_idx, ex in _ex_map.items(): + fp.write("{}\n".format("-" * 40)) + if "issue" in ex: + fp.write("Exception was matched to: {}\n".format(ex.get("issue"))) + else: + fp.write("Exception is new\n") + for exwe_index in ex.get("warnerr_list")[:-1]: + for line in _ts_list[exwe_index]: + fp.write("{}\n".format(line)) + fp.writelines(ex.get("lines")) + fp.write("\n")