分享

编程实现对OpenStack的访问

xioaxu790 发表于 2014-12-14 18:30:48 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 12094
问题导读
1、这样通过编程访问OpenStack?
2、如何使用urllib2访问Keystone?
3、如何使用novaclient访问Nova?






1. 使用novaclient访问Nova
  1. #!/usr/bin/env python  
  2. import logging  
  3. import novaclient  
  4. from novaclient.v1_1 import client  
  5. # enable debug logging  
  6. logger = logging.getLogger('novaclient.client')  
  7. logger.setLevel(logging.DEBUG)  
  8. debug_stream = logging.StreamHandler()  
  9. logger.addHandler(debug_stream)  
  10. auth_url = 'http://182.168.61.21:5000/v2.0'  
  11. user = 'admin'  
  12. password = 'Galax8800'  
  13. project = 'admin'  
  14. region = 'RegionOne'  
  15. service = 'compute'  
  16.   
  17. nova = client.Client(user, password, project, auth_url,  
  18.                     region_name=region, service_type=service)  
  19. results = nova.images.list(detailed=True)  
  20.   
  21. for image in results:  
  22.     print image.id, image.name, image.status  
复制代码



输出:
  1. root@openstack:~# python novatest.py   
  2. d06482b4-beda-4f7e-b63f-deffc6e8072d winxp-mini ACTIVE  
  3. b1efe625-cb81-4754-a46d-6e00c13c9d05 Ubuntu 12.04 cloudimg amd64 ACTIVE  
  4. a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1 cirros-0.3.0-x86_64 ACTIVE  
复制代码



2. 使用urllib2访问Keystone
  1. import urllib2  
  2. import json  
  3.   
  4. def get_keystone_token():  
  5.     """authenticate against keystone identity service
  6.     returns an auth token, and the service url
  7.     """  
  8.     user = 'admin'  
  9.     password = 'Galax8800'  
  10.     project = 'admin'  
  11.     auth_url = 'http://182.168.61.21:5000/v2.0/tokens'  
  12.     auth_request = urllib2.Request(auth_url)  
  13.     auth_request.add_header('Content-Type', 'application/json;charset=utf8')  
  14.     auth_request.add_header('Accept', 'application/json')  
  15.     auth_request.add_header('User-Agent', 'python-mikeyp')  
  16.     auth_data = {"auth":  
  17.                     {  
  18.                         "tenantName": project,  
  19.                         "passwordCredentials": {  
  20.                             "username": user,  
  21.                             "password": password}  
  22.                     }  
  23.                 }  
  24.                   
  25.     auth_request.add_data(json.dumps(auth_data))  
  26.     auth_response = urllib2.urlopen(auth_request)  
  27.     response_data = json.loads(auth_response.read())  
  28.       
  29.     token = response_data['access']['token']['id']  
  30.     service_list = response_data['access']['serviceCatalog']  
  31.       
  32.     for s in service_list:  
  33.         if s['type'] == 'compute' and s['name'] == "'Compute Service'":  
  34.             break  
  35.     nova_url = s['endpoints'][0]['publicURL']  
  36.       
  37.     return (token, nova_url)  
  38.   
  39. if __name__ == '__main__':  
  40.     print get_keystone_token()  
复制代码



输出(G版的keystone中,token变长了……):
  1. root@openstack:~# python keystonetest.py   
  2. (u'MIILBAYJKoZIhvcNAQcCoIIK9TCCCvECAQExCTAHBgUrDgMCGjCCCd0GCSqGSIb3DQEHAaCCCc4EggnKeyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxMy0wNC0xOFQwMzowMTozMS4wMjM0NTIiLCAiZXhwaXJlcyI6ICIyMDEzLTA0LTE5VDAzOjAxOjMwWiIsICJpZCI6ICJwbGFjZWhvbGRlciIsICJ0ZW5hbnQiOiB7ImRlc2NyaXB0aW9uIjogbnVsbCwgImVuYWJsZWQiOiB0cnVlLCAiaWQiOiAiMGJmZTZhMDk0ZGIxNGFiNjg1OTE0NmIzYWQwNGFhMGIiLCAibmFtZSI6ICJhZG1pbiJ9fSwgInNlcnZpY2VDYXRhbG9nIjogW3siZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovLzE4Mi4xNjguNjEuMjE6ODc3NC92Mi8wYmZlNmEwOTRkYjE0YWI2ODU5MTQ2YjNhZDA0YWEwYiIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjIxOjg3NzQvdjIvMGJmZTZhMDk0ZGIxNGFiNjg1OTE0NmIzYWQwNGFhMGIiLCAiaWQiOiAiNzY4OTY2NzgxMTI0NDVlZDljNWM4YTExODRlYzAwMGYiLCAicHVibGljVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjUwOjg3NzQvdjIvMGJmZTZhMDk0ZGIxNGFiNjg1OTE0NmIzYWQwNGFhMGIifV0sICJlbmRwb2ludHNfbGlua3MiOiBbXSwgInR5cGUiOiAiY29tcHV0ZSIsICJuYW1lIjogIm5vdmEifSwgeyJlbmRwb2ludHMiOiBbeyJhZG1pblVSTCI6ICJodHRwOi8vMTgyLjE2OC42MS4yMTo5Njk2LyIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjIxOjk2OTYvIiwgImlkIjogIjAxMTc4MWQ4NDg3YjQyOGU4ZWVhZjJkNmMzMjdjMmIzIiwgInB1YmxpY1VSTCI6ICJodHRwOi8vMTgyLjE2OC42MS41MDo5Njk2LyJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAidHlwZSI6ICJuZXR3b3JrIiwgIm5hbWUiOiAicXVhbnR1bSJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjIxOjkyOTIvdjIiLCAicmVnaW9uIjogIlJlZ2lvbk9uZSIsICJpbnRlcm5hbFVSTCI6ICJodHRwOi8vMTgyLjE2OC42MS4yMTo5MjkyL3YyIiwgImlkIjogIjE0NTJjY2ZhY2NmNjQyZTE4MDY3NjQ4MDA5YTM2NThjIiwgInB1YmxpY1VSTCI6ICJodHRwOi8vMTgyLjE2OC42MS41MDo5MjkyL3YyIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImltYWdlIiwgIm5hbWUiOiAiZ2xhbmNlIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovLzE4Mi4xNjguNjEuMjE6ODc3Ni92MS8wYmZlNmEwOTRkYjE0YWI2ODU5MTQ2YjNhZDA0YWEwYiIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjIxOjg3NzYvdjEvMGJmZTZhMDk0ZGIxNGFiNjg1OTE0NmIzYWQwNGFhMGIiLCAiaWQiOiAiNzRhY2YyNDZlOTY2NDZiNjljODIwMWRhOTkzNjIzYmEiLCAicHVibGljVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjUwOjg3NzYvdjEvMGJmZTZhMDk0ZGIxNGFiNjg1OTE0NmIzYWQwNGFhMGIifV0sICJlbmRwb2ludHNfbGlua3MiOiBbXSwgInR5cGUiOiAidm9sdW1lIiwgIm5hbWUiOiAiY2luZGVyIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovLzE4Mi4xNjguNjEuMjE6ODc3My9zZXJ2aWNlcy9BZG1pbiIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjIxOjg3NzMvc2VydmljZXMvQ2xvdWQiLCAiaWQiOiAiNzVlMWE3MTkxN2RkNDk5M2E3MWQ0ZTAxMGU4Mzg1MmEiLCAicHVibGljVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjUwOjg3NzMvc2VydmljZXMvQ2xvdWQifV0sICJlbmRwb2ludHNfbGlua3MiOiBbXSwgInR5cGUiOiAiZWMyIiwgIm5hbWUiOiAiZWMyIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovLzE4Mi4xNjguNjEuMjE6MzUzNTcvdjIuMCIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xODIuMTY4LjYxLjIxOjUwMDAvdjIuMCIsICJpZCI6ICI0NDU3NmY5N2NjZGY0ZmNjYTM5NzIxMDcyYzA3Y2M0MSIsICJwdWJsaWNVUkwiOiAiaHR0cDovLzE4Mi4xNjguNjEuNTA6NTAwMC92Mi4wIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImlkZW50aXR5IiwgIm5hbWUiOiAia2V5c3RvbmUifV0sICJ1c2VyIjogeyJ1c2VybmFtZSI6ICJhZG1pbiIsICJyb2xlc19saW5rcyI6IFtdLCAiaWQiOiAiZTIwZTU1MmRmNmNmNDM0MGFjOGY4OWFjNWY0YWEzYWMiLCAicm9sZXMiOiBbeyJuYW1lIjogImFkbWluIn0sIHsibmFtZSI6ICJLZXlzdG9uZVNlcnZpY2VBZG1pbiJ9LCB7Im5hbWUiOiAiS2V5c3RvbmVBZG1pbiJ9XSwgIm5hbWUiOiAiYWRtaW4ifSwgIm1ldGFkYXRhIjogeyJpc19hZG1pbiI6IDAsICJyb2xlcyI6IFsiMzNhNzAxZTJlMTU1NDFjZWEwMzExMDcwYWQ2ZGIxYmUiLCAiYjE3NWRiZDdiYjZmNGRlZTk0NjgwZmQ2MzdkYmU5ZmUiLCAiNjk1YTVjN2JlMGY4NDlkZThhNDBhM2I1ZTcxMmE2N2UiXX19fTGB-zCB-AIBATBcMFcxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIEwVVbnNldDEOMAwGA1UEBxMFVW5zZXQxDjAMBgNVBAoTBVVuc2V0MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20CAQEwBwYFKw4DAhowDQYJKoZIhvcNAQEBBQAEgYAH+FJcMZzORMRyK3efj8VPa2XgArhBRLdwefmbleT3ntWOSDpaf-rYXd-klAVlqUQVcMzSuTnP17acCuE7KSsyYipyLUZ++t3IwYb2Z+MT0k1E9VxrVTbiJIw53AWQYBnILS29Qe0PAIuyenyT5cXEAUQ73WD2B3McOSJnPH0gjg==', u'http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b')  
复制代码



3. 使用urllib2通过Nova调用Glance
这里会用到上面调用Keystone的代码,因为要获取token。
  1. #!/usr/bin/env python  
  2. import urllib2  
  3. import json  
  4.   
  5. def get_keystone_token():  
  6.     """authenticate against keystone identity service
  7.     returns an auth token, and the service url
  8.     """  
  9.     user = 'admin'  
  10.     password = 'Galax8800'  
  11.     project = 'admin'  
  12.     auth_url = 'http://182.168.61.21:5000/v2.0/tokens'  
  13.     auth_request = urllib2.Request(auth_url)  
  14.     auth_request.add_header('Content-Type', 'application/json;charset=utf8')  
  15.     auth_request.add_header('Accept', 'application/json')  
  16.     auth_request.add_header('User-Agent', 'python-mikeyp')  
  17.     auth_data = {"auth":  
  18.                     {  
  19.                         "tenantName": project,  
  20.                         "passwordCredentials": {  
  21.                             "username": user,  
  22.                             "password": password}  
  23.                     }  
  24.                 }  
  25.                   
  26.     auth_request.add_data(json.dumps(auth_data))  
  27.     auth_response = urllib2.urlopen(auth_request)  
  28.     response_data = json.loads(auth_response.read())  
  29.       
  30.     token = response_data['access']['token']['id']  
  31.     service_list = response_data['access']['serviceCatalog']  
  32.       
  33.     for s in service_list:  
  34.         if s['type'] == 'compute':  
  35.             service_url = s['endpoints'][0]['publicURL']  
  36.             break  
  37.       
  38.     return (token, service_url)  
  39.       
  40. token, service_url = get_keystone_token()  
  41. image_api = service_url + '/images/detail'  
  42. print image_api  
  43. images_request = urllib2.Request(image_api)  
  44. images_request.add_header('Content-Type', 'application/json;charset=utf8')  
  45. images_request.add_header('Accept', 'application/json')  
  46. images_request.add_header('User-Agent', 'python-mikeyp')  
  47. images_request.add_header('X-Auth-Token', token)  
  48. images_request.add_header('X-Auth-Project-Id', 'admin')  
  49. image_response = urllib2.urlopen(images_request)  
  50. image_data = json.loads(image_response.read())  
  51. print json.dumps(image_data, indent=4)  
复制代码



输出:
  1. root@openstack:~# python glancetest.py   
  2. http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b/images/detail  
  3. {  
  4.     "images": [  
  5.         {  
  6.             "status": "ACTIVE",   
  7.             "updated": "2013-04-10T03:33:03Z",   
  8.             "name": "winxp-mini",   
  9.             "links": [  
  10.                 {  
  11.                     "href": "http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b/images/d06482b4-beda-4f7e-b63f-deffc6e8072d",   
  12.                     "rel": "self"  
  13.                 },   
  14.                 {  
  15.                     "href": "http://182.168.61.50:8774/0bfe6a094db14ab6859146b3ad04aa0b/images/d06482b4-beda-4f7e-b63f-deffc6e8072d",   
  16.                     "rel": "bookmark"  
  17.                 },   
  18.                 {  
  19.                     "href": "http://182.168.61.21:9292/0bfe6a094db14ab6859146b3ad04aa0b/images/d06482b4-beda-4f7e-b63f-deffc6e8072d",   
  20.                     "type": "application/vnd.openstack.image",   
  21.                     "rel": "alternate"  
  22.                 }  
  23.             ],   
  24.             "created": "2013-04-10T03:32:48Z",   
  25.             "minDisk": 0,   
  26.             "progress": 100,   
  27.             "minRam": 0,   
  28.             "metadata": {},   
  29.             "id": "d06482b4-beda-4f7e-b63f-deffc6e8072d",   
  30.             "OS-EXT-IMG-SIZE:size": 2147483648  
  31.         },   
  32.         {  
  33.             "status": "ACTIVE",   
  34.             "updated": "2013-04-08T13:34:19Z",   
  35.             "name": "Ubuntu 12.04 cloudimg amd64",   
  36.             "links": [  
  37.                 {  
  38.                     "href": "http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b/images/b1efe625-cb81-4754-a46d-6e00c13c9d05",   
  39.                     "rel": "self"  
  40.                 },   
  41.                 {  
  42.                     "href": "http://182.168.61.50:8774/0bfe6a094db14ab6859146b3ad04aa0b/images/b1efe625-cb81-4754-a46d-6e00c13c9d05",   
  43.                     "rel": "bookmark"  
  44.                 },   
  45.                 {  
  46.                     "href": "http://182.168.61.21:9292/0bfe6a094db14ab6859146b3ad04aa0b/images/b1efe625-cb81-4754-a46d-6e00c13c9d05",   
  47.                     "type": "application/vnd.openstack.image",   
  48.                     "rel": "alternate"  
  49.                 }  
  50.             ],   
  51.             "created": "2013-04-08T13:34:17Z",   
  52.             "minDisk": 0,   
  53.             "progress": 100,   
  54.             "minRam": 0,   
  55.             "metadata": {},   
  56.             "id": "b1efe625-cb81-4754-a46d-6e00c13c9d05",   
  57.             "OS-EXT-IMG-SIZE:size": 213123072  
  58.         },   
  59.         {  
  60.             "status": "ACTIVE",   
  61.             "updated": "2013-04-08T13:16:49Z",   
  62.             "name": "cirros-0.3.0-x86_64",   
  63.             "links": [  
  64.                 {  
  65.                     "href": "http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b/images/a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1",   
  66.                     "rel": "self"  
  67.                 },   
  68.                 {  
  69.                     "href": "http://182.168.61.50:8774/0bfe6a094db14ab6859146b3ad04aa0b/images/a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1",   
  70.                     "rel": "bookmark"  
  71.                 },   
  72.                 {  
  73.                     "href": "http://182.168.61.21:9292/0bfe6a094db14ab6859146b3ad04aa0b/images/a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1",   
  74.                     "type": "application/vnd.openstack.image",   
  75.                     "rel": "alternate"  
  76.                 }  
  77.             ],   
  78.             "created": "2013-04-08T13:16:48Z",   
  79.             "minDisk": 0,   
  80.             "progress": 100,   
  81.             "minRam": 0,   
  82.             "metadata": {},   
  83.             "id": "a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1",   
  84.             "OS-EXT-IMG-SIZE:size": 9159168  
  85.         }  
  86.     ]  
  87. }  
复制代码





本文转载自:孔令贤

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条