python访问cloudstack的api接口

1.CloudStack API

如同 AWS API 一样,CloudStack API 也是基于 Web Service,可以使用任何一种支持 HTTP 调用的语言(例如 Java,python,)编写代码。

调用代码(caller)首先需要在管理服务器进行认证。目前 CloudStack 采用两种认证方式:

  • Session 认证:通过 login API,获得一个 JSESSIONID cookie 和一个 SESSIONKEY token。
  • API Key 认证。

本文代码示例采用 API Key 进行认证。其过程如下:

管理员给调用者分配 API Key 和 Security Key(由 Admin 通过 web console 或者用 registerUserKeys在程序中生成,本文是用python自己生成)。

调用者用 Security Key 以 HMAC SHA-1 哈希算法对 API Key + Command String 生成签名。

最后的 API Request=Base URL+API Path+Command String+Signature。

2.具体操作:

1.下面具体为 admin 用户生成两个 key

  1. 1.首先登陆管理台:http://x.x.x.x:8080/client。

          

  2.点击(账户) accounts,选择 admin,点击 users tab,找到 admin。

      

  3.可以看到 API Key 和 Security Key,如果两个框没有值,点击工具栏的钥匙小图标,“Generate Keys”,如图 。

  生成秘钥:注意生成后,请不要随意修改。

     

  查看秘钥结果:

       

  4.admin 用户的api key 和security key。

  apikey:xxxxxxxxaaaaaa

  security key:sssssssssggggg

2.用python生成对应的访问url

注意生成时涉及到了三个点:apikey,securitykey 和command,三者其中一个变了,生成的signature就不能在用

直接上实例代码:

 1 #!/usr/bin/env python
 2 #-*- coding:utf-8 -*-
 4 import urllib2
 5 import urllib
 6 import hashlib
 7 import hmac
 8 import base64
10 import json 11 12 def requestUrl(url,apikey,signature,command): 13 request={} 14 request['command']=command 15 request['apikey']=apikey 16 request['response']='json' #以json方式返回结果,自己根据需求确定,如xml 17 secretkey=signature 18 request_url='&'.join(['='.join([r,urllib.quote_plus(request[r])]) for r in request.keys()]) 19 sig_url='&'.join(['='.join([r.lower(),urllib.quote_plus(request[r]).lower()]) for r in sorted(request.iterkeys())]) 20 sig=urllib.quote_plus(base64.encodestring(hmac.new(secretkey,sig_url,hashlib.sha1).digest()).strip()) 21 req=url+'?'+request_url+'&signature='+sig 22 return req 23 def reqresults(request_url): #取api结果参数 24 res = urllib2.urlopen(request_url) 25 return res.read() 26 27 if __name__ == '__main__': 28 url = 'http://x.x.x.x:8080/client/api' 29 apikey = 'ssssssssddddd' 30 command = 'listHosts' #命令行,这个根据自己索取内容填写 31 secretkey = 'ddddddssss' 32 request_url = requestUrl(url,apikey,secretkey,command) 33 resultsNeed=json.loads(reqresults(request_url))#变成一个json对象,自己去.来.去吧!

在强调一下:

1.只是提供了一个思路,具体方式最后如何访问,自己敲定,也可以用requests。

2.接口已经打通,命令参数如下连接:http://cloudstack.apache.org/docs/api/apidocs-4.2/TOC_Root_Admin.html

posted @ 2016-04-28 10:08  楚时邀月  阅读(1158)  评论(0编辑  收藏  举报