以下内容是本人这周的经验总结,如有不正确的地方欢迎指正,希望大家共同进步
glance请求流程参见http://www.aboutyun.com/thread-10737-1-1.html和http://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的信息
|
|