标签:
本篇博文来探讨下镜像服务Glance。
Glance提供REST API来支持以下镜像操作:
Glance有两个版本的REST API V1 和 V2,两者之间还是有蛮大的不同:
(1). V1只提供了基本的image和member操作功能:镜像创建、删除、下载、列表、详细信息查询、更新,以及镜像tenant成员的创建、删除和列表。
(2). V2除了支持V1的所有功能外,主要是增加了如下功能:
(3).V1 和V2对 image store 的支持是相同的。
V1的实现上,有glance-api和glance-registry两个WSGI 服务,都提供REST API,只不过glance-API的REST API对外使用,glance-registry的API只由glance-api使用。
而 V2在实现上,把 glance-registry 的功能合并到了 glance-api 中,减少了一个中间环节。
目前,Glance Cli和Horizon默认还是使用V1版本的API。究其原因,
image 的元数据 通过glance-registry 存放在 db 中; image 的chunk 数据 通过 glance-store 存放在各种 backend store 中,并从中获取。
image 的 访问权限分为:
状态图:
‘queued‘ => (‘saving‘, ‘active‘, ‘deleted‘)
‘saving‘ => (‘active‘, ‘killed‘, ‘deleted‘, ‘queued‘)
‘active‘ => (‘queued‘, ‘pending_delete‘, ‘deleted‘)
‘killed‘ => (‘deleted‘)
‘pending_delete‘ => (‘deleted‘)
‘deleted‘ => ()
从上图也可以看出,Glance V1主要是三个模块:
Glance Cli | glanceclient SDK调用的REST API | Glance 内部函数 |
Gance 内部函数的具体实现 |
image-create 创建image |
POST /images
|
glance/api/v1/images.py
Adds a new image to Glance
|
1. api/v1/images.py: _reserve. 添加image 元数据到db,获取 image id,设置 image 状态为 queued。 1.1. registry/client/v1/client.py: def add_image(self, image_metadata) 1.2. registry/api/v1/images.py: def create(self, req, body) 1.3. db/sqlalchemy/api.py: image_create 处理 image data,根据image data 来源分为三种情况: 2.1 如果 image_data // 如果直接传入了 image data 将image data 存入指定的 backend store。注意Content-Type 必须为 application/octet-stream。 2.1.1.1 registry.update_image_metadata // 设置 image 状态 为 saving 2.1.1.2 upload_utils.upload_data_to_store // 2.3.1 从location 指定的backend store 中获取 image size 2.3.2 设置 image 状态 为 active |
image-update 修改image metadata属性或者数据 |
PUT /images/<ID>
|
glance/api/v1/images.py
def update(self, req, id, image_meta, image_data)
|
注意: (1)只允许使用 Location|Copy-From 来 修改状态为 queued 的 image (2)可修改image 访问权限属性,以及元数据。
1. 修改 image 访问权限,调用 registry.get_image_members,再调用 store.set_acls 方法,但是它只有swift支持。 2. 修改image 元数据,调用 registry.update_image_metadata 方法 3. 上传 image data,调用 self._handle_source,见上面 #2. |
image-delete 根据image id 删除 指定image |
DELETE /images/<ID>
|
glance/api/v1/images.py
def delete(self, req, id)
|
1. 调用 registry.get_image_metadata,获取 image 元数据
4. 调用 upload_utils.initiate_deletion 开始 删除操作 4.1 调用backend.py 的delete_from_backend 方法,它会调用 store.delete ,如果image存放在文件系统中的话,调用os.unlink(fn) 方法 删除文件。 4.2 db_api.get_api().image_location_delete // 设置表image_locations的id和image_id对应item的 deleted,status,updated_at,deleted_at
5.1 registry/images.py: def delete(self, req, id) 5.1.1 db/sqlalchemy/api.py: _image_locations_delete_all //Delete all image entries in db table image_locations for the given image id 5.1.2 db/sqlalchemy/api.py: _image_child_entry_delete_all //Deletes all the entries in db table image_properties for the given image id 5.1.3 db/sqlalchemy/api.py: _image_child_entry_delete_all //Deletes all the entries in db table image_members for the given image id
5.1.4 db/sqlalchemy/api.py: _image_child_entry_delete_all //Deletes all the entries in db table image_tags for the given image id
|
image-list 获取image列表 |
GET /images -- Returns a set of brief metadata about images
|
glance/api/v1/images.py
def index(self, req)
比如: { |
调用 registry.get_images_list ,从 db 中获取 image 元数据 |
获取所有image的详细信息 | GET /images/detail -- Returns a set of detailed metadata about images |
glance/api/v1/images.py
Returns detailed information for all available images。比如: { "status": "queued", "deleted_at": null, "name": "name3", "deleted": false, "container_format": null, "created_at": "2015-01-21T23:05:54", "disk_format": null, "updated_at": "2015-01-21T23:05:54", "min_disk": 0, "protected": false, "id": "1e7b0a5a-7b78-4673-8d56-3abff7b491ae", "min_ram": 0, "checksum": null, "owner": "fa2046aaead44a698de8268f94759fc1", "is_public": false, "virtual_size": null, "properties": {}, "size": 12336128 }, |
直接从 db 中获取 image 的各项数据。 1. 调用 registry.get_images_detail |
glance image-show 根据image id显示指定image的元数据 |
HEAD /images/<ID> -- Return metadata about an image with id <ID> |
glance/api/v1/images.py
def meta(self, req, id)
|
从 db 中获取 image 部分元数据 1. 调用 self.get_image_meta_or_404(self, request, image_id) |
image-download
下载image |
GET /images/<ID>
-- Return image data for image with id <ID>
|
glance/api/v1/images.py
def show(self, req, id)
|
调用 glance-store 方法返回 image data。
1. 调用 registry.get_image_metadata,再调用 self.db_api.image_get 来获取 image 元数据
2. 调用 self._get_from_store 获取 image 数据
2.1 调用 glance_store.location.get_location_from_uri, 从 image uri 中获取 location
2.2 调用 backend.py 的 get_store_from_uri, 获取所用的 store
2.3 调用 store.get 获取 image data
|
member-list --image-id 获取可访问指定image的tenant成员列表 |
GET /images/{image_id}/members |
glance/api/v1/members.py
def index(self, req, image_id)
|
通过 glance-registry 执行 数据库操作。 1.1 registry.get_image_members 1.1.1 registry/api/v1/members.py: def index 1.1.1.1db/sqlalchemy/api.py: image_get 1.1.1.2db/sqlalchemy/api.py: image_member_find |
member-list --tenant-id 获取指定tenant的可访问image列表 |
GET /shared-images/{id} |
glance/api/v1/members.py
def index_shared_images(self, req, id)
|
通过 glance-registry 执行 数据库操作。 1.1 registry.get_member_images 1.1.1 registry/api/v1/members.py: def index_shared_images 1.1.1.1 db/sqlalchemy/api.py: image_member_find |
member-create 向指定image添加指定tenant可访问成员 |
PUT /images/{image_id}/members/{id} |
glance/api/v1/members.py
Adds a membership to the image, or updates an existing one. |
通过 glance-registry 执行 数据库操作。 1.1 registry.add_member 1.1.1 registry/api/v1/members.py: def delete 1.1.1.1 db/sqlalchemy/api.py: image_update
|
member-delete 删除指定image的指定可访问tenant成员 |
DELETE /images/{image_id}/members/{id} |
glance/api/v1/members.py
|
通过 glance-registry 执行 数据库操作。 1.1 registry.delete_member 1.1.1 registry/api/v1/members.py: def delete 1.1.1.1db/sqlalchemy/api.py: image_get 1.1.1.2 db/sqlalchemy/api.py: image_member_find 1.1.1.3 db/sqlalchemy/api.py: image_member_delete |
Glance 的原理和实现相比较其它组件较简单、直接。V2 REST API 内容有不少增加,还需要进一步的研究。
探索 OpenStack 之(10):深入镜像服务Glance
标签:
原文地址:http://www.cnblogs.com/sammyliu/p/4249151.html