Posted by & filed under Uncategorized.

About pengpeng

Peng Peng has written 42 post in this blog.

CloudStack4.0里API做了不少调整, 这些不影响CloudStack API的易用性. 我们仍然很容易添加新的API或对现有的API进行测试.本文将试着从下列几点对CloudStack 4.0做些探讨, 欢迎大家给出见解或评论:

1. CloudStack的所有API
2. 如何测试CLoudStack API功能
3. 如何添加新的API到CloudStack

1. CloudStack的所有API
CloudStack根据不同的帐户等级对于API的访问权限有不同的限制.账户分为管理员,域管理员,用户等. 管理员是所有的API都可以调用,用户API则受限,是管理员API的一个子集, 如果你只是想了解CloudStack支持的API,可以访问:
http://incubator.apache.org/cloudstack/docs/api/index.html即可, 在安装好CloudStack管理服务器节点后,也可以在如下配置文件找到系统支持的所有API及对应权限:
/etc/cloud/management/*commands*.properties
CloudStack自身的API定义都可以在commands.properties和commands-ext.properties里找到, 有一些第三方硬件支持添加的API可以在自己单独的文件里找到,比如nicira-nvp_commands.properties,f5bigip_commands.properties,junipersrx_commands.properties等.
在*commands*.properties文件中,定义的所有命令或者称所有的API,都是相同的格式:
Command=<class>:<level>,比如列出CloudStack所有账号信息:
listAccounts=com.cloud.api.commands.ListAccountsCmd;15
Command是Http请求时的命令参数, Class是处理当前请求命令的类, 数字15表示当前API支持的运行级别或者称权限. CloudStack里API有四个权限级别: ADMIN:1, RESOURCE_DOMAIN_ADMIN:2, DOMAIN_ADMIN:4, USER:8. 它们之前做与操作得出此命令可供哪些权限的账户操作. 15(1 & 2 & 4 & 8)表示四种账户权限都可以访问此API.

2. 如何测试CloudStack API的功能
测试CloudStack有几种方法:
a) 通过CloudStack管理服务器Web UI直接进行测试, 查看结果, 建议用Firefox或Chrome加上Firebug插件进行
b) 在全局配置中打开API服务器端口(integration.api.port),比如设置成8096, 通过Http工具进行测试, 拿listUsers命令举例, 选用Linux下常用工具curl调用方式如下:
curl "http://localhost:8096/?command=listUsers&response=xml"
返回结果(略去apikey与secretkey的值):
<?xml version=”1.0″ encoding=”UTF-8″?>
<listusersresponse cloud-stack-version=”4.0.0.2012-10-26T02:30:29Z”>
<count>3</count>
<user><id>f4633bf4-e37c-417b-add1-3a1b3761300d</id>
<username>admin</username><firstname>Admin</firstname><lastname>User</lastname>
<email>admin@mailprovider.com</email><created>2012-10-26T18:46:03+0800</created><state>enabled</state><account>admin</account>
<accounttype>1</accounttype><domainid>4578a7ac-31b3-45a5-876d-1aecf0071d9f</domainid>
<domain>ROOT</domain>
<apikey>…</apikey>
<secretkey>…</secretkey>
<accountid>4c323271-6cb8-4124-937e-fc8266c62e9e</accountid></user>
<user><id>1e3f4498-b4c4-406f-bfd1-3c396d4c2109</id><username>gavin1</username><firstname>a</firstname><lastname>b</lastname>
<email>aa@bb.com</email><created>2012-10-26T17:39:04+0800</created><state>enabled</state><account>gavin1</account>
<accounttype>0</accounttype><domainid>4578a7ac-31b3-45a5-876d-1aecf0071d9f</domainid><domain>ROOT</domain>
<accountid>75027797-738b-49fb-bb03-f578971d30fd</accountid></user>
</listusersresponse>

需要特别注意, 在全局配置打开Api服务端口之后, 用户要自己对安全负责. 因为这里没有任何的认证及鉴权的步骤.建议仅在内部测试使用.

c) 利用一些Http的工具调用相应的API访问8080端口, 拿Linux下的curl命令为例, 要列出CloudStack中所有的账户需要调用如下命令(略去apikey的值):
curl “http://localhost:8080/client/api?apikey=…&command=listUsers&signature=KEO%2BTzvs9B02vhA3LnoT%2B2akR6Y%3D”
以上命令要注意两个请求参数:apikey和signature, 我们以CloudStack管理员的身份(admin)为例, 可以先在CloudStack UI上生成用户的apikey和secretkey, 只有管理员权限可以生成这两个key.上述请求的apikey直接填生成的即可, signature是通过请求的命令及参数 + Secretkey 再通过HmacSHA1哈希算法共同生成的, 大多数语言都提供类似的库来生成这种signature. 在CloudStack中可以参考测试类:test/src/com/cloud/test/utils/UtilsForTest.java里的实现, 或直接用其产生signature, 这个测试类要生成上述API调用的signature, 输入参数为(apikey, secretkey省略):
-u "command=listUsers" -a "apikey" -s "secretkey"
运行测试类后就会生成请求的命令包含signature, 这种方法保证调用API的安全检查, 但是非常不方便, 因为实际上每个命令会产生一个单独的signature, 但如果是进行自动化测试, 用这种方法会是一个比较好的选择, 相关代码片段如下 (request和secretkey为输入项):
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec keySpec = new SecretKeySpec(secretkey.getBytes(),
"HmacSHA1");
mac.init(keySpec);
mac.update(request.getBytes());
byte[] encryptedBytes = mac.doFinal();
//System.out.println("HmacSHA1 hash: " + encryptedBytes);
return Base64.encodeBase64String(encryptedBytes);

3. 如何添加新的API到CloudStack
首先要明白添加新的API做什么用? 要查看一些信息, 要支持新的硬件设备还是要添加功能更改现在API的行为? 你是要同步的API还是异步的?
下图是API命令的类继承关系:
cloudstack api cmd class

如果是简单的访问数据库获得相关信息, 可以从BaseListCmd继承并实现execute()方法;
如果是异步访问,比如激活网络, 启动虚拟机等, 可以从BaseAsyncCmd继承并实现execute()方法; 这个方法会返回Job ID供UI轮询任务执行结果.
如果是异步创建, 比如添加主存储, 部署新的虚拟机, 可以从BaseAsyncCreateCmd继承并实现execute()方法; 这个方法会返回Job ID和新建的Object ID, UI可以轮询任务执行结果.
大家一定不要忘记把新实现的API命令放置到合适的*command*.properties文件中并设置相关的权限.

比较复杂的API需要动到CloudStack管理服务器的四层架构: Service, Management, Resource和DAO, 可以参照1里讲述的API配置文件*command*.properties,跟踪一个相似的API实现即可明白. 所有的API实现都是同样的原理.

源码之下,了无秘密; 如果想进一步深入了解CloudStack, 请研究其源代码.

本文链接地址:http://www.cloudstack-china.org/2012/12/1465.html

Leave a Reply

  • (will not be published)