You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 9 Next »

#!/ usr/bin/env python# By: Kelcey Damage, 2012 & Kraig Amador, 2012

api_url = 'your_stuff_here'apiKey = 'your_stuff_here'secret = 'your_stuff_here'

import hashlib, hmac, string, base64, urllibimport json, urllib

class SignedAPICall(object):    def _init_(self, api_url, apiKey, secret):        self.api_url = api_url        self.apiKey = apiKey        self.secret = secret

    def request(self, args):        args['apiKey'] = self.apiKey        self.params = []        self._sort_request(args)        self._create_signature()        self._build_post_request()

    def _sort_request(self, args):        keys = sorted(args.keys())        for key in keys:            self.params.append(key + '=' + urllib.quote_plus(args[key]))

    def _create_signature(self):        self.query = '&'.join(self.params)        digest = hmac.new(            self.secret,            msg=self.query.lower(),            digestmod=hashlib.sha1).digest()        self.signature = base64.b64encode(digest)

    def _build_post_request(self):        self.query += '&signature=' + urllib.quote_plus(self.signature)        self.value = self.api_url + '?' + self.query

class CloudStack(SignedAPICall):    def _getattr_(self, name):        def handlerFunction(*args, **kwargs):            if kwargs:                return self._make_request(name, kwargs)            return self._make_request(name, args[0])        return handlerFunction

    def _http_get(self, url):        response = urllib.urlopen(url)        return response.read()

    def _make_request(self, command, args):        args['response'] = 'json'        args['command'] = command        self.request(args)        data = self._http_get(self.value)        # The response is of the format

Unknown macro: {commandresponse}

        key = command.lower() + "response"        return json.loads(data)[key]

api = CloudStack(api_url, apiKey, secret)

request =

Unknown macro: {'listall'}

result = api.listVirtualMachines(request)print "count", result['count']print "api url", api.value

  • No labels