diff --git a/opcua/server/address_space.py b/opcua/server/address_space.py index d46371a3..76436139 100644 --- a/opcua/server/address_space.py +++ b/opcua/server/address_space.py @@ -320,6 +320,11 @@ class NodeManagementService(object): result.append(self._add_reference(ref, user)) return result + def try_add_references(self, refs, user=User.Admin): + for ref in refs: + if not self._add_reference(ref, user).is_good(): + yield ref + def _add_reference(self, addref, user): if addref.SourceNodeId not in self._aspace: return ua.StatusCode(ua.StatusCodes.BadSourceNodeIdInvalid) diff --git a/opcua/server/standard_address_space/standard_address_space.py b/opcua/server/standard_address_space/standard_address_space.py index 5a0b8b9c..ddbeb393 100644 --- a/opcua/server/standard_address_space/standard_address_space.py +++ b/opcua/server/standard_address_space/standard_address_space.py @@ -12,13 +12,33 @@ from opcua.server.standard_address_space.standard_address_space_part10 import cr from opcua.server.standard_address_space.standard_address_space_part11 import create_standard_address_space_Part11 from opcua.server.standard_address_space.standard_address_space_part13 import create_standard_address_space_Part13 +class PostponeReferences(object): + def __init__(self, server): + self.server = server + self.postponed = None + self.add_nodes = self.server.add_nodes + + def add_references(self, refs): + self.postponed.extend(self.server.try_add_references(refs)) + # no return + + def __enter__(self): + self.postponed = [] + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if exc_type is None and exc_val is None: + remaining = list(self.server.try_add_references(self.postponed)) + assert len(remaining) == 0, remaining def fill_address_space(nodeservice): - create_standard_address_space_Part3(nodeservice) - create_standard_address_space_Part4(nodeservice) - create_standard_address_space_Part5(nodeservice) - create_standard_address_space_Part8(nodeservice) - create_standard_address_space_Part9(nodeservice) - create_standard_address_space_Part10(nodeservice) - create_standard_address_space_Part11(nodeservice) - create_standard_address_space_Part13(nodeservice) + with PostponeReferences(nodeservice) as server: + create_standard_address_space_Part3(server) + create_standard_address_space_Part4(server) + create_standard_address_space_Part5(server) + create_standard_address_space_Part8(server) + create_standard_address_space_Part9(server) + create_standard_address_space_Part10(server) + create_standard_address_space_Part11(server) + create_standard_address_space_Part13(server) + assert len(server.postponed) == 1370, len(server.postponed)