【OpenStack】【转载】OpenStack extension api

来源:互联网 发布:免费数据库软件有哪些 编辑:程序博客网 时间:2024/05/23 21:59

原作者:张华
原文链接:http://blog.csdn.net/quqi99/article/details/8502034
如需再次转载,请注明原作者信息!

openstack的扩展API有两类:

1) resource extension, 可参见:$nova/nova/api/openstack/compute/contrib/server_password.py, 需实现get_resource方法,如:
  def get_resources(self):        member_actions = {'action': 'POST'}        collection_actions = {'add': 'POST'}        res = extensions.ResourceExtension(            'os-networks',            NetworkController(),            member_actions=member_actions,            collection_actions=collection_actions)        return [res]
    会产生如下格式的REST URL:
    GET    /os-networks           
    POST   /os-networks      
    POST   /os-networks/add      
    PUT    /os-networks/id     
    DELETE /os-networks/id     
    GET    /os-networks/id    
    POST   /os-networks/id/action

2) controller extension, 可参见:$nova/nova/api/openstack/compute/contrib/server_password.py, 需实现get_controller_extensions方法,如:
 def get_controller_extensions(self):         controller = Controller(self.ext_mgr)         extension = extensions.ControllerExtension(self, 'servers', controller)         return [extension]
  但是,如果不是新建,而是想扩展已存在的resource extension和extroller extension呢,如下的例子:
  1)加@wsgi.extends(action='resize')修饰符即可
  2)记得加yield,让它成为一个生成器,这样就会先执行我们自己扩展的extension api,然后再去执行原有的api,相当于继承吧。
    class Server_resource(extensions.ExtensionDescriptor):        """Start/Stop instance compute API support."""        name = "ServerResource"        alias = "os-server-resource"        namespace = "http://docs.openstack.org/compute/ext/server-resource/api/v1.1"        updated = "2013-01-13T00:00:00+00:00"        def get_controller_extensions(self):            controller = ServerController()            extension = extensions.ControllerExtension(self, 'servers', controller)            return [extension]    class ServerController(wsgi.Controller):        def __init__(self):            print 'init'        @wsgi.extends        def create(self, req, body):            print 'update'          yield        @wsgi.extends(action='resize')        def _action_resize(self, req, id, body):            print 'resize'            yield

因为上面是一个生成器,可以这样调用: self.controller.create(req, body).next(), 或者用for循环调用。另外在单元测试时使用assertRaises时调用它时传给Mock的应该是一个函数地址,所以下面的调用在next后面不要加括号哦。

self.assertRaises(exc.HTTPBadRequest, self.controller.create(req, body).next)


测试:
TOKEN=`curl -s -d "{\"auth\":{\"passwordCredentials\":{\"username\": \"$OS_USERNAME\", \"password\":\"$OS_PASSWORD\"}, \"tenantName\":\"$OS_TENANT_NAME\"}}" -H "Content-type:application/json" $OS_AUTH_URL/tokens | python -c"import sys; import json; tok = json.loads(sys.stdin.read()); print tok['access']['token']['id'];"`

curl -i -X POST -H "Content-Type: application/json" -H "X-Auth-Token:$TOKEN" -d '{"server": {"flavorRef": "http://openstack.example.com/openstack/flavors/1","imageRef": "http://openstack.example.com/openstack/images/e0ba6d0a-c705-4dbd-bd3b-b35bbbb8f8a5","name":"i1","ram":"1024","vcpus":"1","disk":"10"}}' http://192.168.0.1:8774/v2/5685706e11ff4e9fb4ffdfac7ed2fb6e/servers

curl -i -X POST -H "Content-Type: application/json" -H "X-Auth-Token:$TOKEN" -d '{"resize" : {"flavorRef" : "2","ram":"1024","vcpus":"1","disk":"10"}}' http://192.168.0.1:8774/v2/5685706e11ff4e9fb4ffdfac7ed2fb6e/servers/ec95e413-f033-4f02-a9c4-b16fe7d398cd/action
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 八字五行同类强怎么办? 重装系统出现两个系统盘怎么办 看视频手机发烫怎么办 dhcp获取ip失败怎么办 苹果笔记本打不出数字怎么办 系统盘读不出来怎么办 waifai密码忘了怎么办 window xp忘记密码怎么办 winxp密码忘了怎么办 xp电脑密码忘记怎么办 xp桌面图标有阴影怎么办 联想电脑忘记登录密码怎么办 xp系统忘掉密码怎么办 xp密码忘记了怎么办 电脑忘记开机密码怎么办 注销了win7用户名怎么办 xp启动后黑屏怎么办 开机要按esc怎么办 excel产品激活失败怎么办 米粉卡激活失败怎么办 电脑死机ppt保存怎么办 电脑装系统黑屏怎么办 电脑c盘无法访问怎么办 d盘变成ntfs怎么办 系统重装卡住了怎么办 系统关机没反应怎么办 232串口打开失败怎么办 逆水寒cpu不支持怎么办 显卡被禁用了怎么办 vmvare注册错了怎么办 电脑主机未成功启动怎么办 主机未成功启动怎么办 电脑主机未能成功启动怎么办 虚拟机没有自带怎么办 错误连接为720怎么办 dns错误不能上网怎么办 家里无线用不了怎么办 磁盘c5坏了怎么办 一体机装xp蓝屏怎么办 虚拟机密码忘记了怎么办 vivoy66手机太卡怎么办