def _add_node(self, item, user): result = ua.AddNodesResult() # If Identifier of requested NodeId is null we generate a new NodeId using # the namespace of the nodeid, this is an extention of the spec to allow # to requests the server to generate a new nodeid in a specified namespace if item.RequestedNewNodeId.has_null_identifier(): self.logger.debug( "RequestedNewNodeId has null identifier, generating Identifier" ) nodedata = NodeData( self._aspace.generate_nodeid( item.RequestedNewNodeId.NamespaceIndex)) else: nodedata = NodeData(item.RequestedNewNodeId) if nodedata.nodeid in self._aspace: self.logger.warning( "AddNodesItem: Requested NodeId %s already exists", nodedata.nodeid) result.StatusCode = ua.StatusCode(ua.StatusCodes.BadNodeIdExists) return result if item.ParentNodeId.is_null(): # self.logger.warning("add_node: creating node %s without parent", nodedata.nodeid) # should return Error here, but the standard namespace define many nodes without parents... pass elif item.ParentNodeId not in self._aspace: self.logger.warning( "add_node: while adding node %s, requested parent node %s does not exists", nodedata.nodeid, item.ParentNodeId) result.StatusCode = ua.StatusCode( ua.StatusCodes.BadParentNodeIdInvalid) return result if not user == User.Admin: result.StatusCode = ua.StatusCode( ua.StatusCodes.BadUserAccessDenied) return result self._add_node_attributes(nodedata, item) # now add our node to db self._aspace[nodedata.nodeid] = nodedata if not item.ParentNodeId.is_null(): self._add_ref_from_parent(nodedata, item) self._add_ref_to_parent(nodedata, item, user) # add type definition if item.TypeDefinition != ua.NodeId(): self._add_type_definition(nodedata, item, user) result.StatusCode = ua.StatusCode() result.AddedNodeId = nodedata.nodeid return result
def _add_node(self, item, user): result = ua.AddNodesResult() if item.RequestedNewNodeId in self._aspace: self.logger.warning("AddNodeItem: node already exists") result.StatusCode = ua.StatusCode(ua.StatusCodes.BadNodeIdExists) return result nodedata = NodeData(item.RequestedNewNodeId) # add common attrs nodedata.attributes[ua.AttributeIds.NodeId] = AttributeValue(ua.DataValue(ua.Variant(item.RequestedNewNodeId, ua.VariantType.NodeId))) nodedata.attributes[ua.AttributeIds.BrowseName] = AttributeValue(ua.DataValue(ua.Variant(item.BrowseName, ua.VariantType.QualifiedName))) nodedata.attributes[ua.AttributeIds.NodeClass] = AttributeValue(ua.DataValue(ua.Variant(item.NodeClass, ua.VariantType.Int32))) # add requested attrs self._add_nodeattributes(item.NodeAttributes, nodedata) # add parent if item.ParentNodeId == ua.NodeId(): #self.logger.warning("add_node: creating node %s without parent", item.RequestedNewNodeId) pass elif item.ParentNodeId not in self._aspace: #self.logger.warning("add_node: while adding node %s, requested parent node %s does not exists", item.RequestedNewNodeId, item.ParentNodeId) result.StatusCode = ua.StatusCode(ua.StatusCodes.BadParentNodeIdInvalid) return result else: if not user == User.Admin: result.StatusCode = ua.StatusCode(ua.StatusCodes.BadUserAccessDenied) return result desc = ua.ReferenceDescription() desc.ReferenceTypeId = item.ReferenceTypeId desc.NodeId = item.RequestedNewNodeId desc.NodeClass = item.NodeClass desc.BrowseName = item.BrowseName desc.DisplayName = ua.LocalizedText(item.BrowseName.Name) desc.TypeDefinition = item.TypeDefinition desc.IsForward = True self._aspace[item.ParentNodeId].references.append(desc) # now add our node to db self._aspace[item.RequestedNewNodeId] = nodedata # add type definition if item.TypeDefinition != ua.NodeId(): addref = ua.AddReferencesItem() addref.SourceNodeId = item.RequestedNewNodeId addref.IsForward = True addref.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasTypeDefinition) addref.TargetNodeId = item.TypeDefinition addref.TargetNodeClass = ua.NodeClass.DataType self._add_reference(addref, user) result.StatusCode = ua.StatusCode() result.AddedNodeId = item.RequestedNewNodeId return result
def _add_node(self, item, user, check=True): self.logger.debug("Adding node %s %s", item.RequestedNewNodeId, item.BrowseName) result = ua.AddNodesResult() if not user == User.Admin: result.StatusCode = ua.StatusCode(ua.StatusCodes.BadUserAccessDenied) return result if item.RequestedNewNodeId.has_null_identifier(): # If Identifier of requested NodeId is null we generate a new NodeId using # the namespace of the nodeid, this is an extention of the spec to allow # to requests the server to generate a new nodeid in a specified namespace self.logger.debug("RequestedNewNodeId has null identifier, generating Identifier") item.RequestedNewNodeId = self._aspace.generate_nodeid(item.RequestedNewNodeId.NamespaceIndex) else: if item.RequestedNewNodeId in self._aspace: self.logger.warning("AddNodesItem: Requested NodeId %s already exists", item.RequestedNewNodeId) result.StatusCode = ua.StatusCode(ua.StatusCodes.BadNodeIdExists) return result if item.ParentNodeId.is_null(): self.logger.info("add_node: while adding node %s, requested parent node is null %s %s", item.RequestedNewNodeId, item.ParentNodeId, item.ParentNodeId.is_null()) if check: result.StatusCode = ua.StatusCode(ua.StatusCodes.BadParentNodeIdInvalid) return result parentdata = self._aspace.get(item.ParentNodeId) if parentdata is None and not item.ParentNodeId.is_null(): self.logger.info("add_node: while adding node %s, requested parent node %s does not exists", item.RequestedNewNodeId, item.ParentNodeId) result.StatusCode = ua.StatusCode(ua.StatusCodes.BadParentNodeIdInvalid) return result nodedata = NodeData(item.RequestedNewNodeId) self._add_node_attributes(nodedata, item, add_timestamps=check) # now add our node to db self._aspace[nodedata.nodeid] = nodedata if parentdata is not None: self._add_ref_from_parent(nodedata, item, parentdata) self._add_ref_to_parent(nodedata, item, parentdata) # add type definition if item.TypeDefinition != ua.NodeId(): self._add_type_definition(nodedata, item) result.StatusCode = ua.StatusCode() result.AddedNodeId = nodedata.nodeid return result
def _add_node(self, item, user): result = ua.AddNodesResult() # If Identifier of requested NodeId is null we generate a new NodeId using # the namespace of the nodeid, this is an extention of the spec to allow # to requests the server to generate a new nodeid in a specified namespace if item.RequestedNewNodeId.has_null_identifier(): self.logger.debug( "RequestedNewNodeId has null identifier, generating Identifier" ) nodedata = NodeData( self._aspace.generate_nodeid( item.RequestedNewNodeId.NamespaceIndex)) else: nodedata = NodeData(item.RequestedNewNodeId) if nodedata.nodeid in self._aspace: self.logger.warning("AddNodesItem: node already exists") result.StatusCode = ua.StatusCode(ua.StatusCodes.BadNodeIdExists) return result if item.ParentNodeId.is_null(): # self.logger.warning("add_node: creating node %s without parent", nodedata.nodeid) # We should return Error here, but the standard namespace seems to define many nodes # without parents, so ignore... pass elif item.ParentNodeId not in self._aspace: self.logger.warning( "add_node: while adding node %s, requested parent node %s does not exists", nodedata.nodeid, item.ParentNodeId) result.StatusCode = ua.StatusCode( ua.StatusCodes.BadParentNodeIdInvalid) return result if not user == User.Admin: result.StatusCode = ua.StatusCode( ua.StatusCodes.BadUserAccessDenied) return result # add common attrs nodedata.attributes[ua.AttributeIds.NodeId] = AttributeValue( ua.DataValue(ua.Variant(nodedata.nodeid, ua.VariantType.NodeId))) nodedata.attributes[ua.AttributeIds.BrowseName] = AttributeValue( ua.DataValue( ua.Variant(item.BrowseName, ua.VariantType.QualifiedName))) nodedata.attributes[ua.AttributeIds.NodeClass] = AttributeValue( ua.DataValue(ua.Variant(item.NodeClass, ua.VariantType.Int32))) # add requested attrs self._add_nodeattributes(item.NodeAttributes, nodedata) if not item.ParentNodeId.is_null(): desc = ua.ReferenceDescription() desc.ReferenceTypeId = item.ReferenceTypeId desc.NodeId = nodedata.nodeid desc.NodeClass = item.NodeClass desc.BrowseName = item.BrowseName desc.DisplayName = ua.LocalizedText(item.BrowseName.Name) desc.TypeDefinition = item.TypeDefinition desc.IsForward = True self._aspace[item.ParentNodeId].references.append(desc) # now add our node to db self._aspace[nodedata.nodeid] = nodedata # add type definition if item.TypeDefinition != ua.NodeId(): addref = ua.AddReferencesItem() addref.SourceNodeId = nodedata.nodeid addref.IsForward = True addref.ReferenceTypeId = ua.NodeId(ua.ObjectIds.HasTypeDefinition) addref.TargetNodeId = item.TypeDefinition addref.TargetNodeClass = ua.NodeClass.DataType self._add_reference(addref, user) result.StatusCode = ua.StatusCode() result.AddedNodeId = nodedata.nodeid return result