MCPcopy Create free account
hub / github.com/FreeOpcUa/python-opcua / NodeManagementService

Class NodeManagementService

opcua/server/address_space.py:191–453  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

189
190
191class NodeManagementService(object):
192
193 def __init__(self, aspace):
194 self.logger = logging.getLogger(__name__)
195 self._aspace = aspace
196
197 def add_nodes(self, addnodeitems, user=UserManager.User.Admin):
198 results = []
199 for item in addnodeitems:
200 results.append(self._add_node(item, user))
201 return results
202
203 def try_add_nodes(self, addnodeitems, user=UserManager.User.Admin, check=True):
204 for item in addnodeitems:
205 ret = self._add_node(item, user, check=check)
206 if not ret.StatusCode.is_good():
207 yield item
208
209 def _add_node(self, item, user, check=True):
210 self.logger.debug("Adding node %s %s", item.RequestedNewNodeId, item.BrowseName)
211 result = ua.AddNodesResult()
212
213 if not user == UserManager.User.Admin:
214 result.StatusCode = ua.StatusCode(ua.StatusCodes.BadUserAccessDenied)
215 return result
216
217 if item.RequestedNewNodeId.has_null_identifier():
218 # If Identifier of requested NodeId is null we generate a new NodeId using
219 # the namespace of the nodeid, this is an extention of the spec to allow
220 # to requests the server to generate a new nodeid in a specified namespace
221 self.logger.debug("RequestedNewNodeId has null identifier, generating Identifier")
222 item.RequestedNewNodeId = self._aspace.generate_nodeid(item.RequestedNewNodeId.NamespaceIndex)
223 else:
224 if item.RequestedNewNodeId in self._aspace:
225 self.logger.warning("AddNodesItem: Requested NodeId %s already exists", item.RequestedNewNodeId)
226 result.StatusCode = ua.StatusCode(ua.StatusCodes.BadNodeIdExists)
227 return result
228
229 if item.ParentNodeId.is_null():
230 self.logger.info("add_node: while adding node %s, requested parent node is null %s %s",
231 item.RequestedNewNodeId, item.ParentNodeId, item.ParentNodeId.is_null())
232 if check:
233 result.StatusCode = ua.StatusCode(ua.StatusCodes.BadParentNodeIdInvalid)
234 return result
235
236 parentdata = self._aspace.get(item.ParentNodeId)
237 if parentdata is None and not item.ParentNodeId.is_null():
238 self.logger.info("add_node: while adding node %s, requested parent node %s does not exists",
239 item.RequestedNewNodeId, item.ParentNodeId)
240 result.StatusCode = ua.StatusCode(ua.StatusCodes.BadParentNodeIdInvalid)
241 return result
242
243 nodedata = NodeData(item.RequestedNewNodeId)
244
245 self._add_node_attributes(nodedata, item, add_timestamps=check)
246
247 # now add our node to db
248 self._aspace[nodedata.nodeid] = nodedata

Callers 3

__init__Method · 0.90
setUpMethod · 0.90
save_aspace_to_diskFunction · 0.90

Calls

no outgoing calls

Tested by 1

setUpMethod · 0.72