Skip to content

Instantly share code, notes, and snippets.

@momijiame
Created May 26, 2012 18:31
Show Gist options
  • Save momijiame/2794870 to your computer and use it in GitHub Desktop.
Save momijiame/2794870 to your computer and use it in GitHub Desktop.
The CloudStack Web Services Query HTTP API Client Script
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import base64
import urllib
import hashlib
import hmac
import httplib
import urlparse
import argparse
import json
import xml.dom.minidom
class CloudStackApiSignatureBuilder(object):
def __init__(self, apikey, secretkey):
self.apikey = apikey
self.secretkey = secretkey
def build(self, query_dict):
query_dict['apikey'] = self.apikey
query_list = sorted(['%s=%s' % (k, urllib.quote(v, safe=''))
for k, v in query_dict.items()])
command_str = reduce(lambda s, e: '%s&%s' % (s, e),
query_list, '').lower()[1:]
digest = hmac.new(self.secretkey, command_str, hashlib.sha1).digest()
return urllib.quote(base64.encodestring(digest)[:-1], safe='')
class CloudStackApiClient(object):
def __init__(self, entrypoint, apikey, secretkey):
self.entrypoint = entrypoint
self.apikey = apikey
self.secretkey = secretkey
def request(self, query_dict, method='GET'):
if self.apikey != None and self.secretkey != None:
signature_builder = CloudStackApiSignatureBuilder(self.apikey,
self.secretkey)
sigunature = signature_builder.build(query_dict)
query_dict['signature'] = sigunature
query_dict['apikey'] = self.apikey
query_string = reduce(lambda s, (k, v): '%s&%s=%s' % (s, k, v),
query_dict.iteritems(), '')[1:]
url_parser = urlparse.urlparse(self.entrypoint)
connections = {'https': httplib.HTTPSConnection,
'http': httplib.HTTPConnection}
http_connection = connections[url_parser.scheme](url_parser.netloc)
http_connection.request(method, '%s?%s' % (url_parser.path,
query_string))
return http_connection.getresponse()
def main(args):
client = CloudStackApiClient(args.entrypoint, args.apikey, args.secretkey)
params = {}
for s in args.parameters:
params[s.split('=')[0]] = s.split('=')[1]
if args.json:
params['response'] = 'json'
response = client.request(params)
print '%s %s' % (response.status, response.reason)
print response.msg
if 'response' in params and params['response'] == 'json':
print json.dumps(json.loads(response.read(), 'UTF-8'), indent=4)
else:
print xml.dom.minidom.parseString(response.read()).toprettyxml()
if __name__ == '__main__':
description = 'The CloudStack Web Services Query HTTP API Client'
option_e_help = 'API entry point'
option_a_help = 'API key which can be taken from management WebUI'
option_s_help = 'SECRET key which can be taken from management WebUI'
option_j_help = 'JSON format'
parameters_help = 'key=value pairs (e.g. command=listHosts ...)'
option_e_default = os.environ.get('CLOUDSTACK_API_ENTRYPOINT')
option_a_default = os.environ.get('CLOUDSTACK_API_APIKEY')
option_s_default = os.environ.get('CLOUDSTACK_API_SECRETKEY')
arg_parser = argparse.ArgumentParser(description=description)
arg_parser.add_argument('-e', '--entrypoint', help=option_e_help,
required=False, default=option_e_default)
arg_parser.add_argument('-a', '--apikey', help=option_a_help,
required=False, default=option_a_default)
arg_parser.add_argument('-s', '--secretkey', help=option_s_help,
required=False, default=option_s_default)
arg_parser.add_argument('-j', '--json', help=option_j_help,
required=False, action='store_true')
arg_parser.add_argument('parameters', help=parameters_help, nargs='+')
main(arg_parser.parse_args())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment