深挖Openstack Glance - 源码分析(1)

本文详细解析了OpenStack Glance v1版本API的功能,包括创建、更新、获取image信息、删除image、获取image列表、获取image元数据及下载image等操作。着重介绍了创建image的过程,涉及权限检查、数据验证、元数据存储、image数据处理等步骤,特别是深入到具体的存储组件和状态管理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

v1版本API功能解析

1. 创建image

2. 更新image

3. 获取image信息(metadata和data)

4. 删除image

5. 获取image列表

6. 获取image元数据(metadata)

7. 下载image

这些功能都在/glance/api/v1/images.py里,该文件主要是提供与image相关的操作。

接下来将对这些功能逐个分析:


1. 创建image

@utils.mutating
def create(self, req, image_meta, image_data):

1.1 首先检查是否有权限进行所要的操作

# 检查各种操作的权限
# _enforce:检查是否有该操作的权限
self._enforce(req, 'add_image')
is_public = image_meta.get('is_public')
if is_public:
    self._enforce(req, 'publicize_image')
if Controller._copy_from(req):
    self._enforce(req, 'copy_from')
if image_data or Controller._copy_from(req):
    self._enforce(req, 'upload_image')


1.2 对image的数据进行其他检查

# 检查image元数据是否创建了受保护的属性
self._enforce_create_protected_props(image_meta['properties'].keys(),
                                     req)
# 检查image属性是否太大,超过了配额
self._enfore_image_property_quota(image_meta, req=req)


1.3 保存image元数据到db中

# 获取image id,设置image状态为queued
# queued状态:没有上传update,只预留了image id
image_meta = self._reserve(req, image_meta)

深入_reserve方法:

1.3.1 获取外部存储地址

location = self._external_source(image_meta, req)

1.3.2 对选择的后端store类型进行判断

# 后端存储store类型必须是glance所支持的存储store类型
scheme = image_meta.get('store')
if scheme and scheme not in store.get_known_schemes():
    msg = _("Required store %s is invalid") % scheme
    LOG.warn(msg)
    raise HTTPBadRequest(explanation=msg,
                         content_type='text/plain')

1.3.3 获取image元数据状态(active/queued)

image_meta['status'] = ('active' if image_meta.get('size') == 0)
                        else 'queued')

1.3.4 获取需要使用到的具体的存储组件

# 根据存储路径获取后端存储
backend = store.get_store_from_location(location)
# 在创建image前需要根据backend获取具体的存储组件,存储组件是哪一种类型并不关心
self.get_store_or_400(req, backend)

1.3.5 设置image元数据的size值

# 如果没有提供image大小,则从远程存储中重新获取
image_meta['size'] = self._get_size(req.context, image_meta,
                                    location)

1.3.6 将image元数据存储在db中,并将创建信息发送出去

# 将image元数据存到db中
image_meta = registry.add_image_metadata(req.contenxt, image_meta)
# 记录创建image信息
self.notifier.info("image.create", redact_loc(image_meta))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值