分享

glance如何添加自定义api

eason 发表于 2015-7-15 11:33:09 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 14378
以下内容是本人这周的经验总结,如有不正确的地方欢迎指正,希望大家共同进步
glance请求流程参见http://www.aboutyun.com/thread-10737-1-1.htmlhttp://www.tuicool.com/articles/auQbmeI

每次修改glance里面的代码,都需要重启g-api  g-registry服务
本人测试使用的是curl访问
curl -s  -X GET  -H "X-Auth-Token:84d35a51fa1c48cb9d65cae0dd9fa8dd"   http://127.0.0.1:9292/v1/images/hqc
X-Auth-Token后面是当前登陆用户的token

不管是用curl直接请求glance 的api还是openstack的python sdk请求,都会访问到glance的api,以http://127.0.0.1:9292/v1/images/hqc(该请求是为了拿到所有images,和请求details相同)为例子
1、请求首先来到glance/api/v1/router.py,查看是否存在相应的请求hqc(自行添加相关信息,参照detail),看到如下内容
mapper.connect("/images/hqc",
                       controller=images_resource,
                       action='hqc',
                       conditions={'method': ['GET']})
说明请求会来到同目录下的images.py,执行方法是hqc,action是hqc
2.然后来到同目录下的images.py,查看方法hqc(参照同文件下的detail方法),核心代码如下
        self._enforce(req, 'get_images')
        params = self._get_query_params(req)
        try:
            images = registry.get_images_detail(req.context, **params)
            for image in images:
                redact_loc(image, copy_dict=False)#分配空间
                self._enforce_read_protected_props(image, req)
        #异常处理。。。。。
        return dict(images=images)

可以看到,该方法先确认是否有权限获得images信息,然后获得请求参数,在从registry中拿到iamges的信息,最后返回images信息。核心是images = registry.get_images_detail(req.context, **params)
3.来到glance/registry/client/v1/api.py,查看get_images_detail方法
def get_images_detail(context, **kwargs):
    c = get_registry_client(context)
    return c.get_images_detailed(**kwargs)

该方法获得registry的client,然后获得images信息,
4.来到api.py的同级文件client.py下,查看get_images_detailed
        res = self.do_request("GET", "/images/detail", params=params)
        image_list = jsonutils.loads(res.read())['images']#打印image_list可以看到确实拿到了images的信息
        for image in image_list:
            image = self.decrypt_metadata(image)
        return image_list

该方法请求/images/detail,它请求的是registry的api
5.来到glance/registry/api/v1/__init__.py,他类似于router,找到detail,来到imges.py的detail方法
images = self._get_images(req.context, **params)
查看_get_images方法,核心代码是return self.db_api.image_get_all(context, filters=filters,**params)
至此,整个流程就结束了,但是我请求hqc却得不到想要的信息,而且直接报错

File "/opt/stack/glance/glance/api/middleware/cache.py", line 276, in process_response
    return process_response_method(resp, image_id, version=version)
  File "/opt/stack/glance/glance/api/middleware/cache.py", line 297, in _process_GET_response
    image_metadata = method(resp.request, image_id)
  File "/opt/stack/glance/glance/api/middleware/cache.py", line 113, in _get_v1_image_metadata
    image_id)
  File "/opt/stack/glance/glance/registry/client/v1/api.py", line 160, in get_image_metadata
    return c.get_image(image_id)
  File "/opt/stack/glance/glance/registry/client/v1/client.py", line 163, in get_image
    print jsonutils.loads(res.read())['image']


从middleware的cache.py来到registry的api和client,根据以上的分析,我们知道请求是不需要走cache中间件的,可是为什么呢,查看/etc/glance/glance-api-paste.ini,看到如下
# Use this pipeline for no auth or image caching - DEFAULT
[pipeline:glance-api]
pipeline = versionnegotiation osprofiler unauthenticated-context rootapp

# Use this pipeline for image caching and no auth
[pipeline:glance-api-caching]
pipeline = versionnegotiation osprofiler unauthenticated-context cache rootapp

默认是不走cache的,但是为什么走呢,来到cache的程序:glance/api/middleware/cache.py中,看到__init__、_verify_metadata都没问题,接着看到_match_request,发现问题
if image_id != 'detail' :
                return (version, method, image_id)

只要image_id不是detail的时候,就执行image_id(里面内容不是具体image的id,而是类似与detail,show等的action),这就是为什么走cache的原因了。
至此在请求hqc,发现确实获得了images的信息

已有(2)人评论

跳转到指定楼层
Alkaloid0515 发表于 2015-7-15 21:59:52
楼主淫才啊,膜拜
回复

使用道具 举报

zhen657778102 发表于 2015-9-13 20:02:25
好 好 好 好 好 好 好
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条