| image-create 创建image |
POST /images
|
glance/api/v1/images.py
def create(self, req, image_meta, image_data):
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
2. api/v1/images.py: _handle_source 处理 image data,根据image data 来源分为三种情况: 2.1 如果 image_data // 如果直接传入了 image data
2.1.1 def _upload(self, req, image_meta): 将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 // check_quota //检查用户quota store_api.store_add_to_backend //调用 backend.py 的方法 store.add //调用 backend store 实现的方法 filesystems.py. def add //如果是filesystem的话,将 image chunk data 写入到一个以 image id 为文件名的文件
2.1.2 def _activate //调用 glance-registry 设置 image 状态为 active
2.2 如果是 copy_from,则异步执行上面2.1.1 ~ 2.1.2
2.3 如果是指定 location的话, 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) Updates an existing image with the registry |
注意: (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) Deletes the image and all its chunks from the Glance |
1. 调用 registry.get_image_metadata,获取 image 元数据 2. 检查 image 是否可以被删除,比如是否是 protected等 3. 调用 registry.update_image_metadata 设置状态为 deleted 或者 pending_delete 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. 调用 registry.delete_image_metadata 删除 image 元数据 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) Returns the following information for all public, available images:
- id -- The opaque image identifier
- name -- The name of the image
- disk_format -- The disk image format
- container_format -- The "container" format of the image
- checksum -- MD5 checksum of the image data
- size -- Size of image data in bytes
比如: { "name": "name3", "container_format": null, "disk_format": null, "checksum": null, "id": "1e7b0a5a-7b78-4673-8d56-3abff7b491ae", "size": 12336128 } |
调用 registry.get_images_list ,从 db 中获取 image 元数据 |
| 获取所有image的详细信息 |
GET /images/detail -- Returns a set of detailed metadata about images |
glance/api/v1/images.py
def detail(self, req)
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 1.1 调用 registry/api/v1/images.py 中的 def detail 1.1.1 调用 db/sqlalchemy/api.py 中的 image_get_all |
| 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) Returns metadata about an image in the HTTP headers of the response object |
从 db 中获取 image 部分元数据 1. 调用 self.get_image_meta_or_404(self, request, image_id) 1.1 调用 registry.get_image_metadata 1.1.1 调用 db_api.image_get
|
| image-download 下载image |
GET /images/<ID>
-- Return image data for image with id <ID>
|
glance/api/v1/images.py
def show(self, req, id) Returns an iterator that can be used to retrieve an image's data along with the image metadata |
调用 glance-store 方法返回 image data。
1. 调用 r
egistry.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) Return a list of dictionaries indicating the members of the image, i.e., those tenants the image is shared with |
通过 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) Retrieves list of image memberships for the given member. |
通过 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
def update(self, req, image_id, id, body=None) 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
def delete(self, req, image_id, id) //Removes a membership from the image |
通过 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 |