Hi Sengor:

Thanks for the replies.

I manually patched vcloud.py by appending ".decide('utf-8')" in two
the places needing it, and that worked (... and makes sense ... I had
to the same decode() step in my non-libcloud httplib2/ReST case for
python-3).

So let me move onto the subsequent parsing exceptions I mentioned...
which is raised during processing of the HTTP XML Response
(indicating malformed). Tracking it down, this happens in
vcloud.py, here:

  =================
  class VCloudConnection(ConnectionUserAndKey):
  <snip>

      def _get_auth_token(self):
        ...
        <snip>
            body = ET.XML(resp.read())  <---
        <snip>
        ...
  <snip>
  =================


Through various print() and type() statements, I see that "resp.read()", which
when expanded translates to "http.client.HTTPResponse.read()", returns a
bytes string. However, I'm wondering if this may also need to be similarly
".decode('utf-8')", like this:

     body = ET.XML(resp.read().decode('utf-8'))


since the Python-3 documentation for "xml.etree.ElementTree.XML()"
(which is what ET.XML() expands to), indicates that it is expecting a string
(not a bytes encoded string).

So I tried the modification above. Here is the before and after:

   resp.read()  [ BEFORE .decode() inserted ]

<class 'bytes'>  <--- types is 'bytes', and the following is the actual bytes 
string...

b'b\'<OrgList xmlns="http://www.vmware.com/vcloud/v0.8"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema";>\\n  <Org 
href="https://services.vcloudexpress.terremark.com/api/v0.8/org/xxxx"; 
type="application/vnd.vmware.vcloud.org+xml" 
name="em...@example.com"/>\\n</OrgL'


  resp.read().decode('utf-8')  [ AFTER .decode() inserted ]


<class 'str'>  <--- types is 'str', and the following is the actual string...

b'<OrgList xmlns="http://www.vmware.com/vcloud/v0.8"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema";>\n  <Org 
href="https://services.vcloudexpress.terremark.com/api/v0.8/org/xxxx"; 
type="application/vnd.vmware.vcloud.org+xml" name="em...@example.com"/>\n</OrgL


Looking carefully at both the bytes string (un-decoded) and the string 
(decoded) above -- forgetting about whether we
decode() it or not for the moment -- both sequences appear to be malformed... 
They both have an extra "b'"
pre-pending it, and both are truncated at the end (i.e. the enclosing "</OrgL" 
... doesn't end correctly). Note: Just 

in case this was a print() artefact, I also wrote the output to a file (same 
truncation issue).

This above issue is only true for python-3. Python 2, (decode()ed or not) emits 
output correctly as:

   <OrgList xmlns="http://www.vmware.com/vcloud/v0.8"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema";> <Org 
href="https://services.vcloudexpress.terremark.com/api/v0.8/org/xxxx"; 
type="application/vnd.vmware.vcloud.org+xml" 
name="em...@example.com"/></OrgList>


So there appears to be two problems here:
   (1) missing ".decode('utf-8')" method call.
   (2) the output of "resp.read()", with or without  the ".decode('utf-8')" 
part, appears to be malformed.


To make matters more interesting, note that the python-3 case curl(1) output 
shows a result that is not truncated,
but still, however, has the pre-pending "b'" (so it's still malformed). And 
here is that curl(1) output
(remembering that the above were from print() debug statements of mine, not 
from curl(1)):

b'<OrgList xmlns="http://www.vmware.com/vcloud/v0.8"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema";>\n  <Org 
href="https://services.vcloudexpress.terremark.com/api/v0.8/org/xxxx"; 
type="application/vnd.vmware.vcloud.org+xml" 
name="em...@example.com"/>\n</OrgList>'


As I look more for the cause, any helpful feedback is appreciated.


Again,... the libcloud API is v0.10.1 with Python v3.2.3


Thank you,
Noel


>________________________________
> From: Sengor <seng...@gmail.com>
>To: users@libcloud.apache.org; Noel Milton Vega 
><nmv...@computingarchitects.com> 
>Sent: Thursday, June 21, 2012 10:21 PM
>Subject: Re: Terremark authentication example using libcloud ...
> 
>Hi Noel,
>
>Replies in line below:
>
>On 22 June 2012 09:30, Noel Milton Vega <nmv...@computingarchitects.com> wrote:
>> (1) I was surprised that that base64 line worked at all (even in Python 2)
>>     since I always thought use of "b" only worked for string literals
>>     (not generated strings).
>
>Patch has been applied to trunk which now works for both Python 2 & 3.
>For more info see: https://issues.apache.org/jira/browse/LIBCLOUD-204
>
>
>> (2) Not an issue for this specific thread, but even when I hard-coded
>>     my auth string (just to get past the Python-3 related auth issue), sadly
>>     another unrelated (xml parsing) issue arose almost immediately.
>>     Just as a heads up, it was this:
>>
>>
>> Traceback (most recent call last):
>>   File "/usr/lib64/python3.2/xml/etree/ElementTree.py", line 1668, in feed
>>     self._parser.Parse(data, 0)
>> xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, 
>> column 1
>>
>>    (So I never got my list_images() output.)
>>
>> (3) Similar to the last point, python-2 gets much further along, but also
>>     eventually experiences an parse-related exception too (as it's
>>     iterating through the list the of images too I believe). Again, as a 
>> heads-up fyi:
>>
>>
>>   File "/usr/lib/python2.7/site-packages/libcloud/common/base.py", line 76, 
>> in __init__
>>     raise Exception(self.parse_error())
>> Exception: <Element '{http://www.w3.org/1999/xhtml}html'; at 0x118dd10>
>
>Hard to say what the issue could be for these two. Could you post the
>debugging output for these two (don't forget to remove the private
>contents such as base64 encoded auth):
>http://libcloud.apache.org/docs/debugging.html
>
>Note I've only used the vCloud module under Python 2.x at the moment
>and don't have access to Terremark. We did slightly change the VDC
>object model when vCloud v1.5 support has been introduced. If this is
>related to what you see it'd be good to fix it up, otherwise it's
>something else getting in the way.
>
>-- 
>sengork
>
>
>

Reply via email to