Add eol for warn/error list
[integration/test.git] / csit / libraries / netvirt / excepts.py
index 092f2b7005e5badf1d8ebbc3aa084a69feeb8dca..92677473c3e12e50bfe51845968d16513dd1401f 100644 (file)
@@ -1,5 +1,7 @@
 import collections
 import collections
+import errno
 import logging
 import logging
+import os
 import re
 
 # Make sure to have unique matches in different lines
 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" +
          "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",
      ]},
     # 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:",
          "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",
      ]},
     # 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=",
          "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",
      ]},
     # 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": [
     {"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=",
          "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",
      ]},
     {"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
     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
 
     :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()
         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")