Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Available for download at: GITHUB Download

Code Block
titleSignedAPICall.py
borderStylesolid

#!/
Wiki Markup
\#\!/ usr/bin/env python
\# By: Kelcey Damage, 2012

import hashlib,& hmac, string. base64Kraig Amador, urllib

\# Reference GET/POST sample request
\#
\# 1. http://10.10.0.1:8080/client/api
\# 2. ?apiKey={API_KEY}
\# 3. &command={API_COMMAND}
\# 4. &response={JSON/XML}
\# 5. &zoneid={ZONE_ID}
\# 6. &signature={SIGNATURE}

\# Reference required signature elements
\#
\# 1. request
\# 2. apiKey
\# 3. private_key

api_url =

secret =

apiKey =

request =

class SignedAPICall(Object):
    def \2012

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

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

class SignedAPICall(object):
    def __init__(self, api_url, apikeyapiKey,, secret):
                self.api_url = api_url
        self.apikey        self.apiKey = apiKey
                self.secret = secret

        def request(self, args):
        args\        args['apiKey'\] = self.apiKey

                self.params = \[\]
                self._sort_request(args)
                self._creatcreate_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)

api = SignedAPICall        data = self._http_get(self.value)
        # The response is of the format {commandresponse: actual-data}
        key = command.lower() + "response"
        return json.loads(data)[key]

#Usage

#api = CloudStack(api_url, apiKey,, secret)

#request = {'listall': 'true'}
#result = api.requestlistVirtualMachines(request)

print#print "count", result['count']
#print "api url", api.value