def provision_node_instance(self, instance_id: str, service_id: str, plan_id: str, parameters: dict=None) -> ProvisionedServiceSpec: url = parameters.get("url") if not url: print("Error: {0}\n".format("url not contained in provision parameters!")) return ProvisionedServiceSpec(state="failed") nodes_to_add = parameters.get("nodesToAdd") if not nodes_to_add: print("Error: {0}\n".format("nodes_to_add not contained in provision parameters!")) return ProvisionedServiceSpec(state="failed") add_nodes_items = [] for node_to_add in nodes_to_add: add_nodes_item = ua.AddNodesItem() if "parentNodeId" in node_to_add: add_nodes_item.ParentNodeId = ua.ExpandedNodeId(node_to_add.get("parentNodeId")) if "referenceTypeId" in node_to_add: add_nodes_item.ReferenceTypeId = ua.NodeId(node_to_add.get("referenceTypeId")) if "requestedNewNodeId" in node_to_add: add_nodes_item.RequestedNewNodeId = ua.ExpandedNodeId(node_to_add.get("requestedNewNodeId")) if "browseName" in node_to_add: add_nodes_item.BrowseName = ua.QualifiedName(node_to_add.get("browseName")) if "nodeClass" in node_to_add: add_nodes_item.NodeClass = ua.NodeClass(node_to_add.get("nodeClass")) add_nodes_items.append(add_nodes_item) print(add_nodes_items) client = Client(url) try: client.connect() nodes = [] for add_nodes_item in add_nodes_items: parent_node = client.get_node(add_nodes_item.ParentNodeId) if add_nodes_item.NodeClass == 1: obj = parent_node.add_object(add_nodes_item.RequestedNewNodeId, add_nodes_item.BrowseName) nodes.append(obj) elif add_nodes_item.NodeClass == 2: var = parent_node.add_variable(add_nodes_item.RequestedNewNodeId, add_nodes_item.BrowseName) nodes.append(var) elif add_nodes_item.NodeClass == 4: method = parent_node.add_method() nodes.append(method) else: folder = parent_node.add_folder(add_nodes_item.RequestedNewNodeId, add_nodes_item.BrowseName) nodes.append(folder) service_instance = OpcuaServiceInstance(instance_id, service_id, plan_id, parameters) service_instance.params["nodes"] = nodes service_instance_map = dict() service_instance_map[instance_id] = service_instance self.service_instance_map = service_instance_map except Exception as e: print("Error: {0}\n".format(e)) return ProvisionedServiceSpec(state="failed") print("Node management service instance {0} is provisioned successfully\n".format(instance_id)) return ProvisionedServiceSpec()
def read(self, parameters): self.logger.info("read") request = ua.ReadRequest() request.Parameters = parameters data = self._uasocket.send_request(request) response = ua.ReadResponse.from_binary(data) response.ResponseHeader.ServiceResult.check() # cast to Enum attributes that need to for idx, rv in enumerate(parameters.NodesToRead): if rv.AttributeId == ua.AttributeIds.NodeClass: dv = response.Results[idx] if dv.StatusCode.is_good(): dv.Value.Value = ua.NodeClass(dv.Value.Value) elif rv.AttributeId == ua.AttributeIds.ValueRank: dv = response.Results[idx] if dv.StatusCode.is_good() and dv.Value.Value in (-3, -2, -1, 0, 1, 2, 3, 4): dv.Value.Value = ua.ValueRank(dv.Value.Value) return response.Results