博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
novaclient的api调用流程与开发
阅读量:6984 次
发布时间:2019-06-27

本文共 3551 字,大约阅读时间需要 11 分钟。

novaclient的api调用流程与开发

另一个地址:

从nova client的入口查看

cat /usr/bin/nova
[python] 
 
 
 
  1. #!/usr/bin/python # PBR Generated from 'console_scripts' import fromimport if:  
  2.     sys.exit(main())  
其中导入了novaclient.shell这个文件中导入了main方法,进入novaclient.shell.py查看
[python] 
 
 
 
  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] 
 
 
 
  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] 
 
 
 
  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] 
 
 
 
  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] 
 
 
 
  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] 
 
 
 
  1. if .api.client.post(url, body=body)  
  2. else .api.client.get(url)  

 

[python] 
 
 
 
  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] 
 
 
 
  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] 
 
 
 
  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] 
 
 
 
novaclient.shell.py
class OpenStackComputeShell(object) 的get_subcommand_parser 方法里指定了actions_module
转到novaclient.v1_1.shell.py
增加一个新的方法,装饰器里是需要的参数,有顺序,和执行时的参数顺序一致
[python] 
 
 
 
  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] 
 
 
 
  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>

转载于:https://www.cnblogs.com/zpaixx/p/10662403.html

你可能感兴趣的文章
【MOS】RAC 环境中最常见的 5 个数据库和/或实例性能问题 (文档 ID 1602076.1)
查看>>
新年图书整理和相关的产品
查看>>
Struts2的核心文件
查看>>
Spring Boot集成Jasypt安全框架
查看>>
GIS基础软件及操作(十)
查看>>
HDOJ 2041 超级楼梯
查看>>
1108File Space Bitmap Block损坏能修复吗2
查看>>
遭遇DBD::mysql::dr::imp_data_size unexpectedly
查看>>
人人都会设计模式:03-策略模式--Strategy
查看>>
被忽视但很实用的那部分SQL
查看>>
解读阿里云oss-android/ios-sdk 断点续传(多线程)
查看>>
ML之监督学习算法之分类算法一 ——— 决策树算法
查看>>
骡夫电商地址
查看>>
亚信安全火力全开猎捕“坏兔子”,全歼详解
查看>>
[二]RabbitMQ-客户端源码之AMQConnection
查看>>
通过添加HTTP Header实现上下文数据在WCF的自动传递
查看>>
Emacs之魂(三):列表,引用和求值策略
查看>>
【ARM】一步一步移植Linux Kernel 2.6.13到板子
查看>>
智能家居——IoT零基础入门篇
查看>>
《Linux From Scratch》第一部分:介绍 第一章:介绍-1.3. 更新日志
查看>>