Browsing for HasTypeDefinition references is broken
Browsing a server built with opcua-asyncio for HasTypeDefinition references is broken.
When specifying a NodeClassMask of only ObjectType or VariableType, no results are returned.
If the NodeClassMask is set to 0 (all NodeClasses should be returned), then 1 result is returned, however it incorrectly identifies the NodeClass as NodeClass.DataType. (I suspect this is the cause of the 0 length result when a mask is supplied).
This code written against Eclipse Milo dev/1.0 branch reproduces, though you should be able to reproduce from any OPC UA SDK: https://gist.github.com/kevinherron/f85ce3b0eebe84008e59a5192f6b404d
Results:
Browsing with NodeClass mask: 24
No references found
Browsing with NodeClass mask: 0
Reference[0]:
NodeId: ExpandedNodeId{ns=0, id=2138, serverIndex=0}
BrowseName: QualifiedName{name=ServerStatusType, namespaceIndex=0}
DisplayName: LocalizedText{text=ServerStatusType, locale=null}
NodeClass: DataType
TypeDefinition: ExpandedNodeId{ns=0, id=0, serverIndex=0}
Wireshark capture: browse_has_type_definition.zip
I dug into this a little in hopes the additional information might nudge a maintainer to attempt to fix this.
For Nodes belonging to the standard OPC UA address space (ns0), the problem can be traced back to here: https://github.com/FreeOpcUa/opcua-asyncio/blob/d4d4c84366dea6bc0ede632fff0821b00f85d8eb/schemas/generate_address_space.py#L345-L359
where the target NodeClass of every ReferenceDescription created is hardcoded as NodeClass.DataType.
In custom address spaces it can be traced to here: https://github.com/FreeOpcUa/opcua-asyncio/blob/d4d4c84366dea6bc0ede632fff0821b00f85d8eb/asyncua/server/address_space.py#L382-L389
where again, the target NodeClass is hardcoded as NodeClass.DataType. Obviously wrong, because the target of a HasTypeDefinition reference is always going to be either an ObjectTypeNode or VariableTypeNode.