cloudstack java api_CloudStack API编程指引

前言

本文阐述为CloudStack编写新API或者更新已存在API时应遵循的约定和编程指引。

参考文档

(暂略)

介绍

当你需要为CS添加新的API时,需要创建一个Request类和Response类(或者在扩展CS API功能时它的API Responese已经定义的情况下重用已经存在的API Response类)。

编写CS API Request类

1、request继承自*Cmd抽象类

CUD(新增/更新/删除 命令)

7beaaede886ce3fcbc75965ccbf15e5a.png

R(读取列表)命令

5e52aa0e8a8435f1fc4a8883f9d3f4b1.png

重要-从2.x开始,新的CUD API命令不再继承自BaseCmd 类,它们被看做是异步命令,继承自BaseAsyncCmd或者BaseAsyncCreateCmd。

扩展BaseAsyncCmd或者BaseAsyncCreateCmd,创建新的CS实体命令扩展BaseAsyncCreateCmd,UD命令扩展BaseAsyncCmd。

2、新添加的command类应以“*Cmd”结尾且标注@ApiCommand。更多请阅参考文档Annotations use in the API中的@ parameters。

3、定义所有的请求参数,且所有的都用@Parameter标注。

4、为RUD命令实现execute()方法,为R命令实现execute()/create()。

5、增加s_name--响应的名字,并且为小写。

6、在为命令命名时,根据含义优先使用create/delete/update/list,只有当这些前缀不能满足你的逻辑时才考虑用你自己的(如assign)。

编写CS API Response类

1、让你的类继承自BaseResponse。

2、用@EntityReference标注Response类,并设定关联的CloudStack接口,它是你返回给API用户的对象。比如VolumeResponse 用EntityReference 标注关联Volume接口。

3、将每个参数用@SerializedName 和 @Param注解。 请阅在Annotations use in the API中关于这些注解的细节。

4、参数名称都是小写。

5、确保没有将真实的DB id设置到id字段将其暴漏,请用UUID值代替。

API位置和注册

命令的位置取决于该命令将是可用/禁用插件或者CloudStack核心的一部分。

当命令是CS核心的一部分

位置:Reque/Response代码放在cloud-api/cloud-engine-api下。

访问权限:命令的访问控制权限(谁有能调用它)在commands.properties.in里注册。

命令注册:命令应添加到CS支持的所有的API列表中,该列表由ManagementServerImpl.getCommands()获得

注意当命令调用完成时,它们关联的只能是cloud-api 或 cloud-util包里的接口

ca0b793b0187ad2a63096de11d36d6c7.png

当命令是插件/服务的一部分

位置:Reque/Response代码放在plugin包下。

访问权限:在Cmd文件里定义权限,使用@APICommand 注解"authorized"字段,如authorized = {RoleType.Admin}) 。

命令注册:让插件管理类继承自PluggableService 接口,增加到命令列表的命令由getCommands()返回。

定义在插件中的命令只关联位于cloud-api/cloud-utils/中的接口。

83c8932543b6753cce0a05029c568ecd.png

修改已存在API的规则

1、对Request:不要将参数从可选改为必需的;

2、对Request:不要在已存在的命令里增加一个required=true的参数;

3、对Request:不要降低command的权限,从对普通用户可用降到只对管理员可用;

4、对Request/Response:不要重命名已有的参数;

5、对Request/Response:不要更改参数的类型(如从String改为Map)

6、对Response:不要删除Response的参数,由于第三方软件会依赖它。

其它规则:

1、当新增一个参数时,应该在它的@Parameter 里标注"since=release #" 字段;

2、如果你认为有些参数会在未来被删除掉,请标注@Deprecated,并确保在第n版本里记录。当它发布后,客户有机会去检查/修改代码以去掉这个参数。于是可以在第n+1个版本去除该参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析hostname

结论:/etc/sysconfig/network 确实是hostname的配置文件,hostname的值跟该配置文件中的HOSTNAME有一定的关联关系,但是没有必然关系,hostname的值来自内核参数/proc/sys/kernel/hostname,如果我通过命令sysctl kernel.…

在ODM公司要不要跳槽到创业公司

读者朋友提问: 发哥,我现在在手机odm公司做指纹模块做了两三个月,基本天天加班到十点以后,后面要被调到camera团队,但是从这几个月的经历来看,感觉学到的不多,代码都是供应商写的,很…

php des加密 和java胡同_PHP版本DES加密解(对应.net版与JAVA版)

标签:/**** DES FOR .NET版本* author Administrator**/class DES_NET{var $key;var $iv; //偏移量function DES_NET( $key, $iv0 ) {//key长度8例如:1234abcd$this->key $key;if( $iv 0 ) {$this->iv $key; //默认以$key 作为 iv} else {$this->iv $i…

安卓系统应用启动流程分析

随着移动开发的兴起,安卓系统的重要性愈加突显。本文简要介绍安卓系统上应用启动流程,对于应用开发、系统定制以及性能优化人员来说,熟悉应用启动流程会使得在今后的工作中更加得心应手,做到知其然,知其所以然。本文主…

bootstrap 居中 表格中_使用Twitter Bootstrap在表格单元格中垂直居中

Tom Sarduy..156FOR BOOTSTRAP 3.X:Bootstrap现在具有表格单元格的以下样式:.table tbody > tr > td{vertical-align: top;}要做的就是添加自己的类,为前一个选择器添加更多特异性:.table tbody > tr > td.vert-aligned {vertical-align: middle;}然后将类添加到您…

撞车咋办

出门行车,最怕的就是遇到事故,老司机倒还好,这新手司机以及咱们的女司机遇到事故第一反应肯定是傻眼了。那么真要遇到事故了怎么办呢? 今天小编就来给大家讲讲遇到事故应该如何理智应对! 一、单方事故 就是你没碰到人或…

物联网通信协议全解析

随着物联网设备数量的持续增加,这些设备之间的通信或连接已成为一个重要的思考课题。通信对物联网来说十分常用且关键,无论是近距离无线传输技术还是移动通信技术,都影响着物联网的发展。而在通信中,通信协议尤其重要,…

【长沙集训】2017.10.10

Adore 1.1 问题描述 小 w 偶然间遇到了一个 DAG。 这个 DAG 有 m 层&#xff0c;第一层只有1个源点&#xff0c;最后一层只有1个汇点&#xff0c;剩下的每一层都有 k 个 节点。 现在小 w 每次可以取反第 i(1 < i < n − 1) 层和第 i 1 层之间的连边。也就是把原本从 (i,…

elasticsearch mongodb mysql_Elasticsearch 与 Mongodb 数据同步问题

1、mongo-connector工具首先安装python环境wget http://www.python.org/ftp/python/3.0.1/Python-3.0.1.tgztar -zxvf Python-3.0.1.tgzcd Python-3.0.1./configuremake allmake install看来新装的版本生效了&#xff0c;做个软连接应该就OK。ln -s /usr/local/bin/python3.0 /…

Linux中断子系统之Workqueue

背景说明Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 概述Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制&#xff1b;Workqueue工作队列可以用作中断处理的Bott…

python3一个简单的网页抓取

python3一个简单的网页抓取 都是学PYTHON。怎么学都是学&#xff0c;按照基础学也好&#xff0c;按照例子增加印象也好&#xff0c;反正都是学 import urllib import urllib.requestdata{} data[word]baker95935url_valuesurllib.parse.urlencode(data) url"http://www.ba…

给你准备的Linux启动流程

读者朋友提问&#xff1a; 昨天在后台看到一个读者朋友跟我说&#xff0c;发哥&#xff0c;你能不能讲一下嵌入式Linux的开机流程&#xff0c;然后我看了下&#xff0c;我是没有写过这方面的文章&#xff0c;所以&#xff0c;就有了这篇文章。回答&#xff1a;我们都知道pc指针…

[linux]服务器apache配置vhost

官网示例&#xff1a; http://httpd.apache.org/docs/current/vhosts/examples.html转载于:https://www.cnblogs.com/oDoraemon/p/7650748.html

java dao 单元测试_Spring Service、Dao进行Junit单元测试

pring对Controller、Service、Dao进行Junit单元测试总结​ 所有用Junit进行单元测试&#xff0c;都需要下面的配置RunWith(SpringJUnit4ClassRunner.class)ContextConfiguration(locations {"classpath:applicationContext.xml"})​ applicationContext.xml 是整个项…

Linus Torvalds:我们都老了,但Linux维护者真的很难找

Linux 之父Linus Torvalds非常担忧没人继续维护内核「真的很难找到维护者&#xff01;」在本周召开的Linux开源峰会与嵌入式大会上&#xff0c; VMware的首席开放源代码官Dirk Hohndel和Linux的创建者Linus Torvalds再次就Linux开发展开了远程对话讨论。左&#xff1a;Dirk Ho…

判断线程结束

判断线程结束 使用ExecutorService.isTerminated方式 public void executor() throws InterruptedException{ExecutorService executorService Executors.newFixedThreadPool(threadNum);List<Callable<Object>> calls new ArrayList<>();for (int i 0; …

java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析

大家都知道java中有很多的基础知识&#xff0c;需要大家花费一定的时间去消化。关于java中ConcurrentHashMap的扩容机制不知道大家是否了解过&#xff0c;其实内容也是很好理解的&#xff0c;一起来看看吧。首先&#xff0c;我们需要知道的是&#xff1a;1. 计算每个线程可以处…

看printk引发的一点思考

在源码位置kernel/printk/函数原型asmlinkage __visible int printk(const char *fmt, ...) {printk_func_t vprintk_func;va_list args;int r;va_start(args, fmt);/** If a caller overrides the per_cpu printk_func, then it needs* to disable preemption when calling pr…

寄语

寄语&#xff1a; 前面漆黑一片&#xff0c;什么都看不到。 也不是&#xff0c;天亮后就会很美的。转载于:https://www.cnblogs.com/doudou-taste/p/7660997.html

我毕业时候写的简历

写简历这个事情&#xff0c;一直是一个非常让人头疼的&#xff0c;在我看来&#xff0c;写简历并不是一件简单的事情&#xff0c;所以&#xff0c;现在是晚上一点钟&#xff0c;我倒腾了一个晚上&#xff0c;才有了这篇文章。我认为写简历有几个需要注意的地方&#xff0c;不啰…