【OpenStack】编程实现对OpenStack的访问

声明:
本博客欢迎转发,但请保留原作者信息!
新浪微博:@孔令贤HW;
博客地址:http://blog.csdn.net/lynn_kong
内容系本人学习、研究和总结,如有雷同,实属荣幸!

1. 使用novaclient访问Nova

#!/usr/bin/env python
import logging
import novaclient
from novaclient.v1_1 import client
# enable debug logging
logger = logging.getLogger('novaclient.client')
logger.setLevel(logging.DEBUG)
debug_stream = logging.StreamHandler()
logger.addHandler(debug_stream)
auth_url = 'http://182.168.61.21:5000/v2.0'
user = 'admin'
password = 'Galax8800'
project = 'admin'
region = 'RegionOne'
service = 'compute'

nova = client.Client(user, password, project, auth_url,
                    region_name=region, service_type=service)
results = nova.images.list(detailed=True)

for image in results:
    print image.id, image.name, image.status
输出:
root@openstack:~# python novatest.py 
d06482b4-beda-4f7e-b63f-deffc6e8072d winxp-mini ACTIVE
b1efe625-cb81-4754-a46d-6e00c13c9d05 Ubuntu 12.04 cloudimg amd64 ACTIVE
a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1 cirros-0.3.0-x86_64 ACTIVE

2. 使用urllib2访问Keystone

import urllib2
import json

def get_keystone_token():
    """authenticate against keystone identity service
    returns an auth token, and the service url
    """
    user = 'admin'
    password = 'Galax8800'
    project = 'admin'
    auth_url = 'http://182.168.61.21:5000/v2.0/tokens'
    auth_request = urllib2.Request(auth_url)
    auth_request.add_header('Content-Type', 'application/json;charset=utf8')
    auth_request.add_header('Accept', 'application/json')
    auth_request.add_header('User-Agent', 'python-mikeyp')
    auth_data = {"auth":
                    {
                        "tenantName": project,
                        "passwordCredentials": {
                            "username": user,
                            "password": password}
                    }
                }
                
    auth_request.add_data(json.dumps(auth_data))
    auth_response = urllib2.urlopen(auth_request)
    response_data = json.loads(auth_response.read())
    
    token = response_data['access']['token']['id']
    service_list = response_data['access']['serviceCatalog']
    
    for s in service_list:
        if s['type'] == 'compute' and s['name'] == "'Compute Service'":
            break
    nova_url = s['endpoints'][0]['publicURL']
    
    return (token, nova_url)

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

3. 使用urllib2通过Nova调用Glance

这里会用到上面调用Keystone的代码,因为要获取token。
#!/usr/bin/env python
import urllib2
import json

def get_keystone_token():
    """authenticate against keystone identity service
    returns an auth token, and the service url
    """
    user = 'admin'
    password = 'Galax8800'
    project = 'admin'
    auth_url = 'http://182.168.61.21:5000/v2.0/tokens'
    auth_request = urllib2.Request(auth_url)
    auth_request.add_header('Content-Type', 'application/json;charset=utf8')
    auth_request.add_header('Accept', 'application/json')
    auth_request.add_header('User-Agent', 'python-mikeyp')
    auth_data = {"auth":
                    {
                        "tenantName": project,
                        "passwordCredentials": {
                            "username": user,
                            "password": password}
                    }
                }
                
    auth_request.add_data(json.dumps(auth_data))
    auth_response = urllib2.urlopen(auth_request)
    response_data = json.loads(auth_response.read())
    
    token = response_data['access']['token']['id']
    service_list = response_data['access']['serviceCatalog']
    
    for s in service_list:
        if s['type'] == 'compute':
            service_url = s['endpoints'][0]['publicURL']
            break
    
    return (token, service_url)
    
token, service_url = get_keystone_token()
image_api = service_url + '/images/detail'
print image_api
images_request = urllib2.Request(image_api)
images_request.add_header('Content-Type', 'application/json;charset=utf8')
images_request.add_header('Accept', 'application/json')
images_request.add_header('User-Agent', 'python-mikeyp')
images_request.add_header('X-Auth-Token', token)
images_request.add_header('X-Auth-Project-Id', 'admin')
image_response = urllib2.urlopen(images_request)
image_data = json.loads(image_response.read())
print json.dumps(image_data, indent=4)
输出:
root@openstack:~# python glancetest.py 
http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b/images/detail
{
    "images": [
        {
            "status": "ACTIVE", 
            "updated": "2013-04-10T03:33:03Z", 
            "name": "winxp-mini", 
            "links": [
                {
                    "href": "http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b/images/d06482b4-beda-4f7e-b63f-deffc6e8072d", 
                    "rel": "self"
                }, 
                {
                    "href": "http://182.168.61.50:8774/0bfe6a094db14ab6859146b3ad04aa0b/images/d06482b4-beda-4f7e-b63f-deffc6e8072d", 
                    "rel": "bookmark"
                }, 
                {
                    "href": "http://182.168.61.21:9292/0bfe6a094db14ab6859146b3ad04aa0b/images/d06482b4-beda-4f7e-b63f-deffc6e8072d", 
                    "type": "application/vnd.openstack.image", 
                    "rel": "alternate"
                }
            ], 
            "created": "2013-04-10T03:32:48Z", 
            "minDisk": 0, 
            "progress": 100, 
            "minRam": 0, 
            "metadata": {}, 
            "id": "d06482b4-beda-4f7e-b63f-deffc6e8072d", 
            "OS-EXT-IMG-SIZE:size": 2147483648
        }, 
        {
            "status": "ACTIVE", 
            "updated": "2013-04-08T13:34:19Z", 
            "name": "Ubuntu 12.04 cloudimg amd64", 
            "links": [
                {
                    "href": "http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b/images/b1efe625-cb81-4754-a46d-6e00c13c9d05", 
                    "rel": "self"
                }, 
                {
                    "href": "http://182.168.61.50:8774/0bfe6a094db14ab6859146b3ad04aa0b/images/b1efe625-cb81-4754-a46d-6e00c13c9d05", 
                    "rel": "bookmark"
                }, 
                {
                    "href": "http://182.168.61.21:9292/0bfe6a094db14ab6859146b3ad04aa0b/images/b1efe625-cb81-4754-a46d-6e00c13c9d05", 
                    "type": "application/vnd.openstack.image", 
                    "rel": "alternate"
                }
            ], 
            "created": "2013-04-08T13:34:17Z", 
            "minDisk": 0, 
            "progress": 100, 
            "minRam": 0, 
            "metadata": {}, 
            "id": "b1efe625-cb81-4754-a46d-6e00c13c9d05", 
            "OS-EXT-IMG-SIZE:size": 213123072
        }, 
        {
            "status": "ACTIVE", 
            "updated": "2013-04-08T13:16:49Z", 
            "name": "cirros-0.3.0-x86_64", 
            "links": [
                {
                    "href": "http://182.168.61.50:8774/v2/0bfe6a094db14ab6859146b3ad04aa0b/images/a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1", 
                    "rel": "self"
                }, 
                {
                    "href": "http://182.168.61.50:8774/0bfe6a094db14ab6859146b3ad04aa0b/images/a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1", 
                    "rel": "bookmark"
                }, 
                {
                    "href": "http://182.168.61.21:9292/0bfe6a094db14ab6859146b3ad04aa0b/images/a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1", 
                    "type": "application/vnd.openstack.image", 
                    "rel": "alternate"
                }
            ], 
            "created": "2013-04-08T13:16:48Z", 
            "minDisk": 0, 
            "progress": 100, 
            "minRam": 0, 
            "metadata": {}, 
            "id": "a0dbf801-e919-4cb5-be79-c8b9dbc2bbf1", 
            "OS-EXT-IMG-SIZE:size": 9159168
        }
    ]
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习要求: 熟悉基本的linux命令 具备基本的网络知识 掌握一门编程语言 课程特点: 深刻理解:OpenStack的设计原理,体系构架和关键技术,构建一个OpenStack环境所需的核心组件以及核心组件间的联系; 全面掌握:如何通过不同的部署工具比如packstack,部署OpenStack环境;如何通过单独部署OpenStack核心组件逐渐搭建出OpenStack环境; 定制研发:在学习openstack源码级深度解析培训后,你能了解openstack源码的体系结构,并能根据需要进行定制开发,满足您在实际生产环境中OpenStack的各种疑问和不满足的功能。 ------------------------课程内容------------------------ 课时1、课前学习环境准备 课时2、课程介绍 课时3、OpenStack概论 课时4、实例:OpenStack自动安装(Fuel) 课时5、作业:OpenStack Fuel 课时6、OpenStack安装部署答问 课时7、Keystone 详解 课时8、实例:OpenStack 手动安装 - 环境准 课时9、实例:Keystone 手动安装 课时10、实例:Keystone CLI 使用 课时11、实例:Keystone API使用 课时12、Glance详解 课时13、实例:Glance手动安装以及CLI、API 课时14、实例:Glance镜像制作 课时15、实例:Glance镜像修改 课时16、作业:Keystone手动练习 课时17、Keystone答问 课时18、作业:Glance手动练习 课时19、Nova架构及原理详解 课时20、实例:Nova手动安装 课时21、实例:Instance启动过程回顾 课时22、网络基础知识盘点 课时23、Neutron原理详解 课时24、实例:Neutron手动安装 课时25、实例:网络命名空间 课时26、实例:物理机连接openvswitch的虚 课时27、实例:租户私有网络创建 课时28、Neutron SDN 实现详解 课时29、实例:Neutron SDN 手动实现 课时30、作业:Nova、Neuron手动安装练习 课时31、作业:Neutron 相关实例练习 课时32、Neutron 答问 课时33、Cinder 原理详解 课时34、Cinder iSCSI实现原理详解 课时35、实例:Cinder 手动安装 课时36、Swift 架构与原理详解 课时37、实例:Swift 手动安装 课时38、Dashboard 介绍与演示 课时39、实例:Dashboard 手动安装 课时40、实例:Dashboard 浮动IP访问实例 课时41、实例:Dashboard 块存储的使用 课时42、实例:Dashboard 对象存储的使用 课时43、实例:OpenStack 命令行接口使用 课时44、OpenStack HA与性能调优 课时45、OpenStack Devstack 自动安 课时46、配置 OpenStack Eclipse 开发环境 课时47、配置 OpenStack Eclipse 开发环境 课时48、OpenStack 自动化测试 - 单元测试 课时49、OpenStack 自动化测试 - 集成测试 课时50、Nova 源码结构 课时51、Nova 调用流程源码解析 课时52、Nova 分层架构与业务模型剖析 课时53、Nova 自定义 API 扩展编码实现 课时54、Django 介绍与快速开始 课时55、Django view 和 urls 的用法 课时56、Django Templates 模板的用法(一) 课时57、Django Templates 模板的用法(二) 课时58、Django Form 表单的用法 课时59、Horizon 结构源码剖析(1) 课时60、Horizon 自定义 Panel 编码实现 课时61、Horizon 自定义 DataView 编码实 课时62、企业部署案例:企业私有云规划与案 课时63、OpenStack 和其他开源云平台比较
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值