| 189 | |
| 190 | |
| 191 | class 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 |
no outgoing calls