-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmakeApiCall.py
More file actions
73 lines (57 loc) · 2.14 KB
/
Copy pathmakeApiCall.py
File metadata and controls
73 lines (57 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/env python
# By: Kelcey Damage, 2012 & Kraig Amador, 2012
# From https://cwiki.apache.org/confluence/display/CLOUDSTACK/Simple+class+for+making+API+calls,+Python
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, 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 {commandresponse: actual-data}
key = command.lower() + "response"
return json.loads(data)[key]
#Usage
#api = CloudStack(api_url, apiKey, secret)
#request = {'listall': 'true'}
#result = api.listVirtualMachines(request)
#print "count", result['count']
#print "api url", api.value