novaclient的api調用流程與開發

novaclient的api調用流程與開發

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

另外一個地址:http://neuromancer.sinaapp.com/?p=64
python

從nova client的入口查看shell


cat /usr/bin/nova

[python]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  1. #!/usr/bin/python # PBR Generated from 'console_scripts' import fromimport if:  
  2.     sys.exit(main())  

其中導入了novaclient.shell這個文件中導入了main方法,進入novaclient.shell.py查看

[python]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  1. if .api.client.post(url, body=body)  
  2. else .api.client.get(url)  

 

[python]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 

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

轉到novaclient.v1_1.shell.py

增長一個新的方法,裝飾器裏是須要的參數,有順序,和執行時的參數順序一致

[python]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
 
 
  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>
相關文章
相關標籤/搜索