novaclient的api调用流程与开发

Posted ぐ箛茗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了novaclient的api调用流程与开发相关的知识,希望对你有一定的参考价值。

novaclient的api调用流程与开发

http://blog.csdn.net/tpiperatgod/article/details/18375387?utm_source=tuicool

另一个地址:http://neuromancer.sinaapp.com/?p=64

从nova client的入口查看


cat /usr/bin/nova

[python] view plaincopy技术图片技术图片
 
 
 
  1. #!/usr/bin/python # PBR Generated from ‘console_scripts‘ import fromimport if:  
  2.     sys.exit(main())  

其中导入了novaclient.shell这个文件中导入了main方法,进入novaclient.shell.py查看

[python] view plaincopy技术图片技术图片
 
 
 
  1. def try :]))  
  2. except )  
  3. print"ERROR: %s" )  
  4. .cs = client.Client(options.os_compute_api_version, os_username,  
  5. .extensions, service_type=service_type,  
  6.                 cacert=cacert, timeout=timeout)  

self.cs是从client中创建出的一个Client实例,进入novaclient.client.py查看这个实例的具体方法

[python] view plaincopy技术图片技术图片
 
 
 
  1. def ,  
  2. ,  
  3. ,  
  4. try except .join(version_map.keys())))  
  5. raise return def return client_class(*args, **kwargs)  

用的是v1_1这个版本的api,对应的是novaclient.v1_1.client.py里的Client类

[python] view plaincopy技术图片技术图片
 
 
 
  1. class     Top-level object to access the OpenStack Compute API. 
  2.  
  3.     Create an instance with your creds:: 
  4.  
  5.         >>> client = Client(USERNAME, PASSWORD, PROJECT_ID, AUTH_URL) 
  6.  
  7.     Then call methods on its managers:: 
  8.  
  9.         >>> client.servers.list() 
  10.         ... 
  11.         >>> client.flavors.list() 
  12.         ... 
  13.  
  14.     """  

注释里讲了怎么使用python命令行调用nova的client

client里给流入的指令分了很多类,以flavors为例,看nova flavor-list这个命令的流程

[python] view plaincopy技术图片技术图片
 
 
 
  1. self)  
  2. class     Manage :class:`Flavor` resources. 
  3.     """   
  4. def, detailed=, is_public=):  
  5.         Get a list of all flavors. 
  6.  
  7.         :rtype: list of :class:`Flavor`. 
  8.         """   
  9.   
  10.   
  11. ifnot ] = is_public  
  12.  % urlutils.urlencode(qparams) ifelse<span "  <="" span="">
  13. <span "  <="" span="">
  14. if   
  15. return._list( % (detail, query_string), )  

self._list进入novaclient.base.py

[python] view plaincopy技术图片技术图片
 
 
 
  1. class     Managers interact with a particular type of API (servers, flavors, images, 
  2.     etc.) and provide CRUD operations for them. 
  3.     """   
  4. def, api):  
  5. .api = api  
  6. def, url, response_key, obj_class=, body=):  
  7. if .api.client.post(url, body=body)  
  8. else .api.client.get(url)  
  9. ifis:  
  10. .resource_class  
  11.   
  12.   
  13. if try ]  
  14. except pass .completion_cache(, obj_class, mode=):  
  15. .completion_cache(, obj_class, mode=):  
  16. return, res, loaded=)  
  17. forinif res]  

novaclient.v1_1.flavors.py里FlavorManager的resource_class = Flavor即class Flavor(base.Resource)
所以最后obj_class为Flavor

调用api的过程:

[python] view plaincopy技术图片技术图片
 
 
 
  1. if .api.client.post(url, body=body)  
  2. else .api.client.get(url)  

 

[python] view plaincopy技术图片技术图片
 
 
 
  1. 通过.api到了nova的api里nova.api.openstack.compute.__init__.py  
  2. ifis or in .resources[] = flavors.create_resource()  
  3. ,  
  4. .resources[],  
  5. },  
  6. })  

 

找到nova.api.openstack.flavors.py
[python] view plaincopy技术图片技术图片
 
 
 
  1. @wsgi def, req):  
  2. ._get_flavors(req)  
  3. return._view_builder.index(req, limited_flavors)  

它最后会返回一个存放flavors信息的字典,这些原始数据经过提取和加工,最后在终端被打印出来

nova.api.openstack.compute.views.flavors.py

[python] view plaincopy技术图片技术图片
 
 
 
  1. def, func, request, flavors):  
  2. forin ._get_collection_links(request,  
  3. ._collection_name,  
  4. )  
  5. if ] = flavors_links  
  6. return flavors_dict  

添加一个新的client流程:

功能:快速备份虚拟机,三个参数,虚拟机uuid、备份的名字、备份的描述,调用地方和方法如下:

[plain] view plaincopy技术图片技术图片
 
 
 

novaclient.shell.py
class OpenStackComputeShell(object) 的get_subcommand_parser 方法里指定了actions_module

转到novaclient.v1_1.shell.py

增加一个新的方法,装饰器里是需要的参数,有顺序,和执行时的参数顺序一致

[python] view plaincopy技术图片技术图片
 
 
 
  1. @utils‘server‘, help=)  
  2. @utils‘displayname‘ ,  
  3. )  
  4. @utils‘description‘ ,  
  5. ,  
  6. )  
  7. def                         args.description)  

这个功能是加在servers部分里的,转到novaclient.v1_1.servers.py

在ServerManager类里添加

[python] view plaincopy技术图片技术图片
 
 
 
  1. def, server, backup_name, backup_description):  
  2.     Backup a server instance quickly. 
  3.  
  4.     :param server: The :class:`Server` (or its ID) to share onto. 
  5.     :param backup_name: Name of the backup image 
  6.     :param backup_description: The backup description 
  7.     """ : backup_name,  
  8. : backup_description}  
  9.   
  10. return._create( % base.getid(server),  
  11. )  

response_key是指返回数据里的key,这里返回的数据是{‘id‘: "*****"},所以response_key = "id"

因为这个api返回的是一个json字符串,不能通过novaclient.base.py里Manager类里的方法把数据提取出来(它需要字典),于是把return_raw这个参数设置为True

然后就可以在nova的命令行里看到这个新的功能了:nova backup-instance;使用方法:nova backup-instance <server_id> <bak_name> <bak_description>

以上是关于novaclient的api调用流程与开发的主要内容,如果未能解决你的问题,请参考以下文章

小程序调用接口

vue中给的默认值是调接口取到的

Paypal API 调用以获取订单详情

如何从http调用获取调用者信息到c#中的另一个api

导出Promise API调用以重用

调用 GMAIL API 时出现间歇性错误 - “调用者没有权限”