04-26-2018 04:03 PM
Hi,
I am seeing a failure for a listProcessNode response when using python-zeep:
File "C:\Users\jonathan.els\Envs\suds\lib\site-packages\zeep\xsd\elements\element.py", line 114, in parse
schema_type=self.type)
File "C:\Users\jonathan.els\Envs\suds\lib\site-packages\zeep\xsd\types\complex.py", line 169, in parse_xmlelement
elements, schema, name, context=context)
File "C:\Users\jonathan.els\Envs\suds\lib\site-packages\zeep\xsd\elements\indicators.py", line 600, in parse_xmlelements
xmlelements, schema, name, context=context)
File "C:\Users\jonathan.els\Envs\suds\lib\site-packages\zeep\xsd\elements\element.py", line 160, in parse_xmlelements
xmlelement, schema, allow_none=True, context=context)
File "C:\Users\jonathan.els\Envs\suds\lib\site-packages\zeep\xsd\elements\element.py", line 114, in parse
schema_type=self.type)
File "C:\Users\jonathan.els\Envs\suds\lib\site-packages\zeep\xsd\types\complex.py", line 178, in parse_xmlelement
raise XMLParseError("Unexpected element %r" % elements[0].tag)
zeep.exceptions.XMLParseError: Unexpected element 'mac'
This is happening because the xml response does not match the WSDL schema for LProcessNode:
The schema is:
<xsd:complexType name="LProcessNode">
<xsd:sequence minOccurs="0">
<xsd:element maxOccurs="1" minOccurs="0" name="name" type="axlapi:String255">
<xsd:annotation>
<xsd:documentation>The primary hostname of the process node.</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element maxOccurs="1" minOccurs="0" name="description" type="axlapi:String50"/>
<xsd:element maxOccurs="1" minOccurs="0" name="mac" type="axlapi:XMacAddress">
<xsd:annotation>
<xsd:documentation>The mac address of the host.</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element maxOccurs="1" minOccurs="0" name="ipv6Name" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="nodeUsage" type="axlapi:XNodeUsage"/>
<xsd:element maxOccurs="1" minOccurs="0" name="lbmHubGroup" type="axlapi:XFkType"/>
<xsd:element maxOccurs="1" minOccurs="0" name="processNodeRole" type="axlapi:XProcessNodeRole"/>
</xsd:sequence>
<xsd:attribute name="uuid" type="axlapi:XUUID"/>
</xsd:complexType>
However, on the wire, we see:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:listProcessNodeResponse xmlns:ns="http://www.cisco.com/AXL/API/11.5">
<return>
<processNode uuid="{00000000-1111-0000-0000-000000000000}">
<name>EnterpriseWideData</name>
<description/>
<processNodeRole>CUCM Voice/Video</processNodeRole>
<mac/>
<ipv6Name/>
<nodeUsage>Subscriber</nodeUsage>
<lbmHubGroup/>
</processNode>
<processNode uuid="{77D0E44B-E006-401E-A7C1-A9CC9C870838}">
<name>hq-cucm-pub</name>
<description/>
<processNodeRole>CUCM Voice/Video</processNodeRole>
<mac/>
<ipv6Name/>
<nodeUsage>Publisher</nodeUsage>
<lbmHubGroup/>
</processNode>
<processNode uuid="{BD1F5630-F85E-D345-8D24-41CAB521E37E}">
<name>hq-cups.abc.inc</name>
<description/>
<processNodeRole>CUCM IM and Presence</processNodeRole>
<mac/>
<ipv6Name/>
<nodeUsage>Publisher</nodeUsage>
<lbmHubGroup/>
</processNode>
<processNode uuid="{13143A95-4CB6-FA7C-1844-B3758C69F9D2}">
<name>hq-cucm-sub1.abc.inc</name>
<description>Subscriber1</description>
<processNodeRole>CUCM Voice/Video</processNodeRole>
<mac/>
<ipv6Name/>
<nodeUsage>Subscriber</nodeUsage>
<lbmHubGroup/>
</processNode>
</return>
</ns:listProcessNodeResponse>
</soapenv:Body>
</soapenv:Envelope>
This is a bug. The AXL server-side response should be ordered correctly to match the WSDL definition:
Sample script:
from zeep import Client
from zeep.cache import SqliteCache
from zeep.transports import Transport
from zeep.plugins import HistoryPlugin
from zeep.exceptions import XMLParseError
from requests import Session
from requests.auth import HTTPBasicAuth
from urllib3 import disable_warnings
from urllib3.exceptions import InsecureRequestWarning
from lxml import etree
disable_warnings(InsecureRequestWarning)
USERNAME = 'administrator'
PASSWORD = 'ciscopsdt'
FQDN = '10.10.20.1'
WSDL = 'file://C://path//to////AXLAPI.wsdl'
BINDING_NAME = "{http://www.cisco.com/AXLAPIService/}AXLAPIBinding"
ADDRESS = "https://{fqdn}:8443/axl/".format(fqdn=FQDN)
def main():
session = Session()
session.verify = False
session.auth = HTTPBasicAuth(USERNAME, PASSWORD)
# cache = SqliteCache(path='C://Users//jonathan.els//develop//pvt-repos//UCToolkit//out//db//zeep.db', timeout=10)
# transport = Transport(cache=cache, session=session, timeout=60)
transport = Transport(cache=SqliteCache(), session=session, timeout=60)
# transport = Transport(session=session, timeout=60)
history = HistoryPlugin()
client = Client(wsdl=WSDL, transport=transport, plugins=[history])
axl = client.create_service(BINDING_NAME, ADDRESS)
try:
print(axl.listProcessNode(searchCriteria={"name": "%"},
returnedTags={
"name": "",
"description": "",
"mac": "",
"ipv6Name": "",
"nodeUsage": "",
"lbmHubGroup": "",
"processNodeRole": "",
}
))
except XMLParseError as parse_error:
print(parse_error.message)
print()
finally:
try:
for hist in [history.last_sent, history.last_received]:
print(etree.tostring(hist["envelope"], encoding="unicode", pretty_print=True))
except IndexError:
pass
if __name__ == '__main__':
main()
Find answers to your questions by entering keywords or phrases in the Search bar above. New here? Use these resources to familiarize yourself with the community: