import collections
+import errno
import logging
+import os
import re
# Make sure to have unique matches in different lines
"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",
"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",
"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",
"id": "ConflictingModificationAppliedException",
"context": [
"Node was deleted by other transaction",
- "OptimisticLockFailedException: Optimistic lock failed."
+ "OptimisticLockFailedException: Optimistic lock failed.",
"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="
{"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",
{"issue": "https://jira.opendaylight.org/browse/NETVIRT-1270",
"id": "ExecutionException",
"context": [
- "OptimisticLockFailedException: Optimistic lock failed.",
+ "OptimisticLockFailedException: Optimistic lock failed",
"ConflictingModificationAppliedException: Node children was modified by other transaction",
"removeOrUpdateVpnToDpnList: Error removing from dpnToVpnList for vpn "
]},
{"issue": "https://jira.opendaylight.org/browse/NEUTRON-157",
"id": "ConflictingModificationAppliedException",
"context": [
- "Node was deleted by other transaction",
"Optimistic lock failed for path /(urn:opendaylight:neutron?revision=2015-07-12)" +
"neutron/networks/network/network[{(urn:opendaylight:neutron?revision=2015-07-12)uuid=",
- "Got OptimisticLockFailedException"
+ "Conflicting modification for path /(urn:opendaylight:neutron?revision=2015-07-12)" +
+ "neutron/networks/network/network[{(urn:opendaylight:neutron?revision=2015-07-12)uuid="
+ ]},
+ {"issue": "https://jira.opendaylight.org/browse/NEUTRON-157",
+ "id": "OptimisticLockFailedException",
+ "context": [
+ "Got OptimisticLockFailedException",
+ "AbstractTranscriberInterface"
+ ]},
+ {"issue": "https://jira.opendaylight.org/browse/NEUTRON-157",
+ "id": "ConflictingModificationAppliedException",
+ "context": [
+ "Optimistic lock failed for path /(urn:opendaylight:neutron?revision=2015-07-12)neutron"
]},
# oxygen
{"issue": "https://jira.opendaylight.org/browse/NEUTRON-157",
"id": "ConflictingModificationAppliedException",
"context": [
- "Node was deleted by other transaction",
"OptimisticLockFailedException: Optimistic lock failed.",
- "Got OptimisticLockFailedException",
"Conflicting modification for path /(urn:opendaylight:neutron?revision=2015-07-12)" +
"neutron/networks/network/network[{(urn:opendaylight:neutron?revision=2015-07-12)uuid=",
]},
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
exwe_str = "__".join(_ts_list[exwe_index])
if whitelist_context in exwe_str:
num_context_matches += 1
- break
# Mark this exception as a known issue if all the context's matched
- if num_context_matches == len(whitelist_contexts):
+ if num_context_matches >= len(whitelist_contexts):
ex["issue"] = whitelist.get("issue")
_match.append(ex)
logging.info("known exception was seen: {}".format(ex["issue"]))
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("Starting test: {}\n".format(testname))
+ fp.write("{}\n".format("-" * 40))
+ for ex_idx, ex in _ex_map.items():
+ for exwe_index in ex.get("warnerr_list"):
+ for line in _ts_list[exwe_index]:
+ fp.write(line)
+ fp.writelines(ex.get("lines"))