0

I've been working on getting Cisco Call Manager's AXL working with Python rather than php (where I have it running without a problem), and have been running into an issue. I've spent hours beating my head against it, so I figured it's time to request an outside opinion to see if you can offer any insight. My sanitized code is below:

from suds.client import Client
from suds.transport.https import HttpAuthenticated
import logging

logging.basicConfig(level=logging.CRITICAL)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.CRITICAL)
logging.getLogger('suds.xsd.schema').setLevel(logging.CRITICAL)
logging.getLogger('suds.wsdl').setLevel(logging.CRITICAL)

service = 'https://IPADDRESS:PORT/axl/'

wsdl = 'file:///PATH/TO/LOCAL/WSDL/AXLAPI.wsdl'

username = "username"

password = "password"

client = Client(wsdl, location = service, transport = HttpAuthenticated(username = username, password = password))

name = "NAME_DP"

tags = ["regionName"]

print "<THIS IS A LISTDEVICEPOOL REQUEST>"
dp = client.factory.create('ns0:ListDevicePoolReq')
dp.searchCriteria.name = name
dp.returnedTags = tags
result = client.service.listDevicePool(dp)
print "<THIS IS THE RESULT>"
print result

The issue is the soap output ends up being:

DEBUG:suds.client:headers = {'SOAPAction': u'"CUCM:DB ver=8.5 listDevicePool"',
'Content-Type': 'text/xml; charset=utf-8'}
ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://www.cisco.com/AXL/API/8.5" xmlns:ns1="http:
//schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchem
a-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <ns1:Body>
      <ns0:listDevicePool>
         <searchCriteria>
            <searchCriteria>
               <name>NAME_DP</name>
            </searchCriteria>
            <returnedTags>regionName</returnedTags>
         </searchCriteria>
      </ns0:listDevicePool>
   </ns1:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:http failed:
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://sc
hemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode>soapen
v:Server</faultcode><faultstring>Usage: Required returnedTags as empty tag or sh
ould contain requested tags</faultstring><detail><axlError><axlcode>5003</axlcod
e><axlmessage>Usage: Required returnedTags as empty tag or should contain reques
ted tags</axlmessage><request>listDevicePool</request></axlError></detail></soap
env:Fault></soapenv:Body></soapenv:Envelope>
Traceback (most recent call last):
  File "C:\Users\C53170\Desktop\sudstest\barebones.py", line 39, in <module>
    result = client.service.listDevicePool(dp)
  File "C:\Python27\lib\site-packages\suds\client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "C:\Python27\lib\site-packages\suds\client.py", line 602, in invoke
    result = self.send(soapenv)
  File "C:\Python27\lib\site-packages\suds\client.py", line 649, in send
    result = self.failed(binding, e)
  File "C:\Python27\lib\site-packages\suds\client.py", line 702, in failed
    r, p = binding.get_fault(reply)
  File "C:\Python27\lib\site-packages\suds\bindings\binding.py", line 265, in ge
t_fault
    raise WebFault(p, faultroot)
suds.WebFault: Server raised fault: 'Usage: Required returnedTags as empty tag or should         contain requested tags'

As you can see, it's nesting everything (including the defined searchCriteria) inside the searchCriteria attribute, which results in the returnedTags attribute being seen as part of the searchCriteria. I'm having trouble discovering why, or determining how to correct it. Is this a problem with how the wsdl is imported?

If you need to see the wsdl, or the xsd file that are imported, let me know. They're quite large, and I don't have access to pastebin or google docs from this computer (blocked at work), but I can find some place to throw them up.

Thank you in advance for your assistance!

1 Answers1

0

This is the code for the listPhone but it should work for listPoolDevice as well. Use the debug and logging commands in your code with mine to see how your request should look when it is being sent, but I think this will solve your problem and get you started utilizing python with CUCM and AXL.

from suds.client import Client

cmserver = '10.10.10.10'
cmport = '8443'
wsdl = 'file:///your/system/path/schema/current/AXLAPI.wsdl'
location = 'https://' + cmserver + ':' + cmport + '/axl/'
username = 'username'
password = 'password'

client = Client(wsdl,location=location, username=username, password=password)

result = client.service.listPhone({'name':'SEP%'},{'name':'','model':''})

for node in result['return']['phone']:
    print str(node['name']), str(node['model'])