This repository was archived by the owner on Aug 22, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 48
This repository was archived by the owner on Aug 22, 2020. It is now read-only.
Bad processing of response structure #2
Copy link
Copy link
Open
Description
Issue in BaseClient.py, lines 48-62
https://github.com/jasonhancock/cloudstack-python-client/blob/master/CloudStack/BaseClient.py#L48-62
Example
listDomains returns a JSON structure like this:
{
"listdomainsresponse": {
"count": 42,
"domain": [
{
"id": "990e3623-e45c-4bb9-9de8-d584d1bbbf15",
"name": "ROOT",
"level": 0,
"haschild": true,
"path": "ROOT"
},
...
]
}
}listDomainChildren returns a JSON structure like this:
{
"listdomainchildrenresponse": {
"count": 22,
"domain": [
{
"id": "fdb1bda1-06fe-4855-be00-6492095fa62d",
"name": "somesubdomain",
"level": 1,
"parentdomainid": "990e3623-e45c-4bb9-9de8-d584d1bbbf15",
"parentdomainname": "ROOT",
"haschild": true,
"path": "ROOT/somesubdomain"
},
...
]
}
}Both responses contain a "count" number and a "domain" array.
The problem is that BaseClient() returns the responses differently:
- listDomains returns an object starting with the contents of the "domain" array (leaving out the top-level structure with the "count" number and "domain" array key/definition)
[{u'haschild': True,
u'id': u'990e3623-e45c-4bb9-9de8-d584d1bbbf15',
u'level': 0,
u'name': u'ROOT',
u'path': u'ROOT'}]- listDomainChildren returns an object starting with the top-level structure including the "count" number and the "domain" array key/definition
{u'count': 22,
u'domain': [{u'haschild': True,
u'id': u'fdb1bda1-06fe-4855-be00-6492095fa62d',
u'level': 1,
u'name': u'somesubdomain',
u'parentdomainid': u'990e3623-e45c-4bb9-9de8-d584d1bbbf15',
u'parentdomainname': u'ROOT',
u'path': u'ROOT/somesubdomain'}]}The issue is with the regex matching stuff:
- listDomains -> matches "domain" on "^list(\w+)s"
- listDomainChildren -> does not match "domain" on "^list(\w+)s" (would "expect/match" "domainchildren" or "domainchildrens" instead of "domain")
Possible solution
- Get rid of that regex stuff and always return the top-level JSON structure.
- Add the response structure main array name (e.g. "domain") to all API calls, handing them over to BaseClient() so that it knows what to expect.
Workaround
In order to get the same result structure for listDomains and listDomainChildren, I have to work around it like this:
domains = cloudstack.listDomains( { 'listall':'true', 'level':str(level) } )
domains = cloudstack.listDomainChildren( { 'listall':'true', 'id':parentdomainid } )
domains = domains['domain'] # workaroundMetadata
Metadata
Assignees
Labels
No labels