zoukankan      html  css  js  c++  java
  • 怎样写 OpenStack Neutron 的 Extension (四)

    上文说到需要在 /neutronclient/v2_0/myextension/extension.py 中分别定义五个 class:List/Show/Create/Delete/UpdateExtension。具体形式如下:

    import argparse
    import logging
    
    from neutronclient.neutron import v2_0 as neutronV20
    from neutronclient.openstack.common.gettextutils import _
    
    RESOURCE = 'myextension'
    class ListExtension(neutronV20.ListCommand): """List extensions""" resource = RESOURCE log = logging.getLogger(__name__ + '.ListExtension') list_columns = ['id', 'name'] class ShowExtension(neutronV20.ShowCommand): """Show information of a given extension.""" resource = RESOURCE log = logging.getLogger(__name__ + '.ShowExtension') class CreatePhysicalGateway(neutronV20.CreateCommand): """Create an extension.""" resource = RESOURCE log = logging.getLogger(__name__ + '.CreateExtension') def add_known_arguments(self, parser): parser.add_argument( 'name', metavar='NAME', help=_('Name of extension to create')) def args2body(self, parsed_args): body = {self.resource: { 'name': parsed_args.name}} return body

    class UpdateExtension(neutronV20.UpdateCommand):
        """update a given extension."""
    
        resource = RESOURCE
        log = logging.getLogger(__name__ + '.UpdateExtension')      
    class DeleteExtension(neutronV20.DeleteCommand):
        """Delete a given extension."""
    
        resource = RESOURCE
        log = logging.getLogger(__name__ + '.DeleteExtension')       

    这些 class 处在接受 CLI 命令的第一线,负责将命令转化成 API call。需要特别注意的是 CreateExtension 这个类,它有两个方法 add_known_arguments 和 args2body。前者定义了 CLI 命令接受哪些参数,后者规定如何将收到的参数打包起来。

    这些参数打包之后就会发给 neutron 后台中我们自己定义的 plugin controller,但是如何发送这些参数还需要我们去 /neutronclient/v2_0/client.py 的 Client 类中设置:

    首先是 uri 路径:

        myextensions_path = "/myextensions"
        myextension_path = "/myextensions/%s"

    然后是每个操作所对应的传递方法:

       @APIParamsCall
        def list_myextensions(self, retrieve_all=True, **_params):
            """Fetches a list of all myextensions for a tenant."""
            return self.list('myextensions', self.myextensions_path, retrieve_all,
                             **_params)
                             
        @APIParamsCall
        def show_myextension(self, myextension, **_params):
            """Fetches information of a certain entry in myextension."""
            return self.get(self.myextension_path % (myextension), params=_params)
            
        @APIParamsCall
        def create_myextension(self, body=None):
            """Creates a new myextension entry."""
            return self.post(self.myextensions_path, body=body)
            
        @APIParamsCall
        def delete_myextension(self, myextension):
            """Deletes the specified myextension."""
            return self.delete(self.myextension_path % (myextension))
    
       @APIParamsCall
        def update_myextension(self, myextension, body=None):
            """Updates a myextension."""
            return self.put(self.myextension_path % (myextension), body=body)

    如此一来,我们自己实现的 neutron plugin 就能够收到 CLI 发送过来的命令啦。

    下一章再来说说怎么修改 OpenStack 的 Dashboard 来显示我们在 extension 中添加的新元素。

    ----------------------------------------------------------------
    作者:好大一片云
    博客地址:http://www.cnblogs.com/zhutianshi/
    转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!
    Creative Commons License
    This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.
  • 相关阅读:
    Android SHA1与Package获取方式
    《C++语言基础》实践參考——数组作数据成员
    Linux进程间通信——使用共享内存
    Java中ArrayList和LinkedList差别
    hdu1695(莫比乌斯)或欧拉函数+容斥
    Android学习路线(二十四)ActionBar Fragment运用最佳实践
    HTML——使用表格对表单进行布局
    Nginx 訪问日志增长暴增出现尖刀的具体分析
    基于特定值来推断隐藏显示元素的jQuery插件
    怎样配置PHP环境和安装Zendstdio编辑器
  • 原文地址:https://www.cnblogs.com/zhutianshi/p/3926240.html
Copyright © 2011-2022 走看看