pythonazurecloudlibcloud

Create a vm or cloud service on azure using libcloud?


I’m having a problem with libcloud/drivers/azure.py when I create a VM or a cloud service, I receive always a 400 bad request without a body. Could someone help me out of this please?

Here is my code:

# connectHandler use my pem file to create a connection with the server, return a AzureNodeDriver objet
conn = _connectHandler.api_connect(compute_ressource)
try:
    result = conn.ex_create_cloud_service(name= "testCloudServiceZT200", location= "Central US")
except Exception as e:
    logger.error(e)
else:
    return result

and here is what I got in return: <LibcloudError in <libcloud.compute.drivers.azure.AzureNodeDriver object at 0x7fceaeb457d0> 'Message: Bad Request, Body: , Status code: 400'>

Could someone please tell me why this error, and maybe give me some examples of azure.py, it will be very grateful. thx!!


Solution

  • The Azure driver seems very new, since it's not even included in the latest release available via PyPI. I had the same problem, used ipdb to look at the request and XML that is created by the Azure driver. At first I thought I found a number of problems, but after looking at the source and not only the output of the debugger it boils down to a simple fix.

    The following curl request works for me:

    curl -v -E {PATH_TO_PEM_FILE} -H 'x-ms-version: 2015-04-01' -H 'Content-Type: application/xml' -d '<?xml version="1.0" encoding="utf-8"?><CreateHostedService xmlns="http://schemas.microsoft.com/windowsazure"><ServiceName>test-cloudservice-libcloud-azure-driver</ServiceName><Label>dGVzdC1jbG91ZHNlcnZpY2UtbGliY2xvdWQtYXp1cmUtZHJpdmVyCg==</Label><Location>West Europe</Location></CreateHostedService>' https://management.core.windows.net/{SUBSCRIPTION_ID}/services/hostedservices
    

    But the XML that is generated by the Azure driver contains encoding='utf8', which doesn't work. It has to be utf-8. If you replace line 2710 in the current head of the github repo (e105433e941262e03eb3bb922db47dabdd8efa75) with result = ensure_string(ET.tostring(doc, encoding='utf-8')), it works, encoding='utf8' was the culprit, at least for me.

    I have opened a pull request, hope it solves the issue for you as well: https://github.com/apache/libcloud/pull/538