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
[DOWNLOAD AS A FILE|^cs_api_request_client.py]



{{\#\!/ usr/bin/env python}}
{{\# By: Kelcey Damage, 2012}}

{{import hashlib, hmac, string. base64, 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 =}} *_'http://10.10.0.1:8080/client/api'_*

{{secret =}} {{{*}{_}Secret Key{_}{*}}}


{{apiKey =}} {{{*}{_}API Key{_}{*}}}


{{request =}} *{_}{ 'command': 'restartNetwork', 'id': '214', 'response': 'json'}{_}*

{{class SignedAPICall(Object):}}
{{    def}} {{init{_}{}}}{{\ & Kraig Amador, 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}}

{{api = SignedAPICall

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 {commandresponse: actual-data}
        key = command.lower() + "response"
        return json.loads(data)[key]

#Usage

#api = CloudStack(api_url, apiKey,, secret)}}
{{api.request

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

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