一 Glance源码目录结构
[root@localhost glance]# tree -L 2
.
├── api-ref
│ └── source
├── etc
│ ├── glance-api.conf
│ ├── glance-api-paste.ini
│ ├── glance-cache.conf
│ ├── glance-glare.conf
│ ├── glance-glare-paste.ini
│ ├── glance-manage.conf
│ ├── glance-registry.conf
│ ├── glance-registry-paste.ini
│ ├── glance-scrubber.conf
│ ├── glance-swift.conf.sample
│ ├── metadefs
│ ├── oslo-config-generator
│ ├── ovf-metadata.json.sample
│ ├── policy.json
│ ├── property-protections-policies.conf.sample
│ ├── property-protections-roles.conf.sample
│ └── schema-image.json
├── glance
│ ├── api
│ ├── async
│ ├── cmd
│ ├── common
│ ├── context.py
│ ├── contrib
│ ├── db
│ ├── domain
│ ├── gateway.py
│ ├── glare
│ ├── hacking
│ ├── i18n.py
│ ├── i18n.pyc
│ ├── image_cache
│ ├── __init__.py
│ ├── locale
│ ├── location.py
│ ├── notifier.py
│ ├── opts.py
│ ├── quota
│ ├── registry
│ ├── schema.py
│ ├── scrubber.py
│ ├── tests
│ ├── version.py
│ └── version.pyc
├── glance.egg-info
│ ├── dependency_links.txt
│ ├── entry_points.txt
│ ├── not-zip-safe
│ ├── pbr.json
│ ├── PKG-INFO
│ ├── requires.txt
│ ├── SOURCES.txt
│ └── top_level.txt
├── HACKING.rst
├── LICENSE
├── MANIFEST.in
├── pylintrc
├── rally-jobs
│ ├── extra
│ ├── glance.yaml
│ ├── plugins
│ └── README.rst
├── README.rst
├── releasenotes
│ ├── notes
│ └── source
├── requirements.txt
├── setup.cfg
├── setup.py
├── test-requirements.txt
├── tools
│ └── test-setup.sh
└── tox.ini
二 源码结构分析
Glance的核心代码位于glance目录。
glance/cmd:所有服务以及工具的执行脚本。
glance/api:Glance API
glance/registry:glance-registry服务具体实现。
glance-api可以为镜像建立本地缓存,实现API服务节点的数量扩展,提供多个API节点为同一个镜像提供服务的效率,如果只有一个API节点,缓存机制并没有意义。本地的Image Cache是镜像文件的完全复制,这种复制缓存机制对用户来说是透明的,用户并不知道得到的镜像文件是来自存储后台还是本地缓存。
glance/image_cache:镜像缓存实现。
可以通过配置文件/etc/glance/glance-cache.conf指定Cache文件存放的路径、本地能够用于Cache的存储空间等信息。
image_cache_dir = /opt/stack/data/glance/cache/
image_cache_max_size = 10737418240
针对import、export、clone等镜像操作,Glance统一引入了Task的概念,从而方便管理,Task是针对镜像的异步操作,glance/async即是部分实现。
Glance采用了责任链的设计模式实现用户请求的处理流程。在责任链模式里,各个对象通过前一个对象对后一个对象引用而连接起来形成一条链,请求在这个链上传递,直到链上的某一个对象决定处理此请求。发起请求的用户或客户端并不知道链上的哪一个对象最终处理这个请求,从而使系统可以在不影响客户端的情况下动态重新组织链和分配责任。glance/domain目录与glance/gateway.py文件即是相关的一些实现,glance.domain模块定义了一些基类或接口,比如ImageFactory、Repo等,而glance.gateway.Gateway模块则是实现了责任链的建立。
Rally是一个性能测试的项目,glance/rally-jobs目录是一些用于Rally的文件或插件。
三 setup.cfg
依照惯例,分析具体实现之前,我们首先看看setup.cfg文件
[entry_points]
console_scripts =
glance-api = glance.cmd.api:main
glance-cache-prefetcher = glance.cmd.cache_prefetcher:main
glance-cache-pruner = glance.cmd.cache_pruner:main
glance-cache-manage = glance.cmd.cache_manage:main
glance-cache-cleaner = glance.cmd.cache_cleaner:main
glance-control = glance.cmd.control:main
glance-manage = glance.cmd.manage:main
glance-registry = glance.cmd.registry:main
glance-replicator = glance.cmd.replicator:main
glance-scrubber = glance.cmd.scrubber:main
glance-glare = glance.cmd.glare:main
"entry_points"中的命名空间"console_scripts"里,涵盖了Glance所提供的所有服务以及工具,其中的每一个项都是一个可执行的脚本,这些脚本在部署时被安装,它们同时也是Glance各项工作的入口。
- glance-cache-*:四个对Image Cache进行管理的工具。比如glance-cache-pruner用于执行一些周期性的任务,glance-cache-cleaner可以清理Cache文件释放空间。
- glance-manage:用于Glance数据库的管理。
- glance-replicator:实现镜像复制功能。
- glance-scrubber:用于清理已经删除的Image
- glance-control:Glance提供了glance-api、glance-registry两个WSGI Server,以及一个glance-scrubber后台服务进程,这里的glance-control工具即是用于控制这三个服务的进程,包括start、stop、restart等。