cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
664
Views
0
Helpful
0
Replies

11.5 ListProcessNodeRes does not honour the schema sequence order for LProcessNode in actual response

Jonathan Els
Level 5
Level 5

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:

XML Schema sequence Element

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()

0 Replies 0
Getting Started

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: