[openstack-dev] [qa][keystone] Help with XML Tempest API tests

Adam Young ayoung at redhat.com
Thu Oct 31 23:58:25 UTC 2013


On 10/31/2013 03:40 PM, Steven Hardy wrote:
> Hi all,
>
> So firstly, if you're an XML guru, I apologize, the questions below are
> probably really basic, I always prefer JSON or YAML, because every time I
> deal with XML, I get a week-long-headache ;)
>
> So I'm writing Tempest API tests for the keystone OS-TRUST extension, as
> was previously requested - it's going pretty well, & I'm finding some real
> bugs.  Here's a WIP review:
>
> https://review.openstack.org/#/c/54810/
>
> However, I've got a bit stuck formatting the POST body for the trust create
> in XML (all works fine via JSON).  The json body looks like:
>
> {
>      "trust": {
>          "expires_at": "2013-02-27T18:30:59.999999Z",
>          "impersonation": true,
>          "project_id": "ddef321",
>          "roles": [
>              {
>                  "name": "member"
>              }
>          ],
>          "trustee_user_id": "86c0d5",
>          "trustor_user_id": "a0fdfd"
>      }
> }
>
> And looking at other XML tests which format a POST body, they do something
> like:
>
> post_body = Element("trust",
>                      xmlns=XMLNS,
>                      trustor_user_id=trustor_user_id,
>                      trustee_user_id=trustee_user_id,
>                      project_id=project_id,
>                      impersonation=impersonation,
>                      expires_at=expires_at)
>
> This gives me a post body which looks weird (but seems to work):
>
> <trust impersonation="True"
> xmlns="http://docs.openstack.org/identity/api/v3"
> trustor_user_id="efc6504105c54fbe95928a51459d06c9" expires_at=""
> trustee_user_id="f55efd1d617e4367891d202a811d7728"
> project_id="b5d498f9631244b59912ce2a0025cf8d"/>
>
>
> So my questions are:
> 1. Why do we create a single element like this, instead of appending
> subelements so the XML body looks more like the JSON request?

There are two sides. Some would say that the above is more like a JSON map

   ['a':'1','b':'2','c':'3']

compare

<'a':'1','b':'2','c':'3' />

to

<'a'='1'>,<'b'='2'>,<'c'='3'>

And is starts getting even wonkier when the nested element is a 
map...XML has two abstractions where JSON has one.  THere is no clean 
way to always map on to the other (IMHO).

>
> 2. If any elements have a None value, they are encoded as a zero-length
> string, is that expected?
>
> 3. How do I go about encoding the list of roles, as in the sample request
> (it's a list of dicts, where each dict has one key called "name")
That, I think is

<role>
<"name": "member">
</role>

However, all of this should be viewable with the existing unit tests.  
Each API gets run with both JSON and XML.  In the keystone proejct, the 
test is in tests/test_v3_auth.py

I still use run_test.sh even though it is deprecated

run_tests.sh  keystone.tests.test_v3_auth.TestAuthXML

If you run that in a debugger you should be able to grab the actual XML 
that gets marshalled.


>
> Any help, review feedback or pointers to docs/examples would be hugely
> appreciated!
>
> Thanks,
>
> Steve
>
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev




More information about the OpenStack-dev mailing list