本来想学习一下 OpenStack,想从 glance 入手,glance 也是一个相对比较独立的子系统。
但是其最新版比较庞大,而且依赖的包好像也挺多,环境搭建有些麻烦,遇到了一些问题。
搜了一下 OpenStack 网站,找到了其最初的版本,可能还没有集成好 nova 和 swift。不过,
只是想快速了解一下其实现框架,从简单的入手可以节省时间。等搞明白了,再看看最新的
进展是怎样的。
首先看一下 setup.py 文件,看看 glance-0.1.7 用到哪些标准安装自带之外的模块。整个文
件很短,可以看到需要预先安装下面几个模块:
setuptools 用于支持 python setup.py 和 easy_install 命令的执行
http://pypi.python.org/pypi/setuptools
sphinx 用于生成帮助文档
http://sphinx.pocoo.org/
安装 setuptools (http://www.ibm.com/developerworks/cn/linux/l-cppeak3.html)这个东西
很简单,先去下载一个脚本:
http://peak.telecommunity.com/dist/ez_setup.py
下载完后直接执行它就会帮你把setuptools给装好了:
# python ez_setup.py
ez_setup.py 试图在后台下载并安装 setuptools。
setuptools 最大的优势是它在包管理能力方面的增强。它可以使用一种更加透明的方法来查
找、下载并安装依赖包;并可以在一个包的多个版本中自由进行切换,这些版本都安装在同
一个系统上;也可以声明对某个包的特定版本的需求;还可以只使用一个简单的命令就能更
新到某个包的最新版本。这里只是简单了解,并不打算深入 setuptools 本身,感兴趣的可以
参考:
http://peak.telecommunity.com/DevCenter/setuptools
对于 sphinx,已经安装了 setuptools,直接 easy_install 安装就好了:
# easy_install sphinx
easy_install 可以自动解决依赖性问题;easy_install 要在 www.python.org/pypi/ 上查找有关
依赖包的信息,然后查找真正可以下载这些包的地方去下载并安装包。
glance-0.1.7 中的 setup.py 是非常简单的,install_requires=[] 说明也没有使用什么特殊的包。
当然,实际用到的一些包 easy_install 都会帮你来安装好。在 Debian 6.0 上安装 glance-0.1.7
很顺利:
glance-0.1.7# python setup.py install
running install
Checking .pth file support in /usr/local/lib/python2.6/dist-packages/
/usr/bin/python -E -c pass
TEST PASSED: /usr/local/lib/python2.6/dist-packages/ appears to support .pth files
running bdist_egg
running egg_info
writing glance.egg-info/PKG-INFO
writing top-level names to glance.egg-info/top_level.txt
writing dependency_links to glance.egg-info/dependency_links.txt
reading manifest file 'glance.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'LICENSE'
warning: no files found matching 'tests/test_data.py'
writing manifest file 'glance.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-i686/egg
running install_lib
running build_py
creating build
creating build/lib.linux-i686-2.6
creating build/lib.linux-i686-2.6/glance
copying glance/client.py -> build/lib.linux-i686-2.6/glance
copying glance/server.py -> build/lib.linux-i686-2.6/glance
copying glance/util.py -> build/lib.linux-i686-2.6/glance
copying glance/__init__.py -> build/lib.linux-i686-2.6/glance
creating build/lib.linux-i686-2.6/glance/registry
copying glance/registry/client.py -> build/lib.linux-i686-2.6/glance/registry
copying glance/registry/server.py -> build/lib.linux-i686-2.6/glance/registry
copying glance/registry/__init__.py -> build/lib.linux-i686-2.6/glance/registry
creating build/lib.linux-i686-2.6/glance/common
copying glance/common/exception.py -> build/lib.linux-i686-2.6/glance/common
copying glance/common/utils.py -> build/lib.linux-i686-2.6/glance/common
copying glance/common/server.py -> build/lib.linux-i686-2.6/glance/common
copying glance/common/wsgi.py -> build/lib.linux-i686-2.6/glance/common
copying glance/common/flags.py -> build/lib.linux-i686-2.6/glance/common
copying glance/common/__init__.py -> build/lib.linux-i686-2.6/glance/common
creating build/lib.linux-i686-2.6/glance/store
copying glance/store/filesystem.py -> build/lib.linux-i686-2.6/glance/store
copying glance/store/http.py -> build/lib.linux-i686-2.6/glance/store
copying glance/store/swift.py -> build/lib.linux-i686-2.6/glance/store
copying glance/store/__init__.py -> build/lib.linux-i686-2.6/glance/store
copying glance/store/s3.py -> build/lib.linux-i686-2.6/glance/store
creating build/lib.linux-i686-2.6/tests
creating build/lib.linux-i686-2.6/tests/unit
copying tests/unit/test_clients.py -> build/lib.linux-i686-2.6/tests/unit
copying tests/unit/swiftfakehttp.py -> build/lib.linux-i686-2.6/tests/unit
copying tests/unit/test_stores.py -> build/lib.linux-i686-2.6/tests/unit
copying tests/unit/test_api.py -> build/lib.linux-i686-2.6/tests/unit
copying tests/unit/__init__.py -> build/lib.linux-i686-2.6/tests/unit
copying tests/unit/test_registry_api.py -> build/lib.linux-i686-2.6/tests/unit
creating build/lib.linux-i686-2.6/glance/registry/db
copying glance/registry/db/api.py -> build/lib.linux-i686-2.6/glance/registry/db
copying glance/registry/db/__init__.py -> build/lib.linux-i686-2.6/glance/registry/db
creating build/lib.linux-i686-2.6/glance/common/db
copying glance/common/db/__init__.py -> build/lib.linux-i686-2.6/glance/common/db
creating build/lib.linux-i686-2.6/glance/store/backends
copying glance/store/backends/__init__.py -> build/lib.linux-i686-2.6/glance/store/backends
creating build/lib.linux-i686-2.6/glance/registry/db/sqlalchemy
copying glance/registry/db/sqlalchemy/api.py -> build/lib.linux-i686-2.6/glance/registry/db/sqlalchemy
copying glance/registry/db/sqlalchemy/models.py -> build/lib.linux-i686-2.6/glance/registry/db/sqlalchemy
copying glance/registry/db/sqlalchemy/__init__.py -> build/lib.linux-i686-2.6/glance/registry/db/sqlalchemy
creating build/lib.linux-i686-2.6/glance/common/db/sqlalchemy
copying glance/common/db/sqlalchemy/session.py -> build/lib.linux-i686-2.6/glance/common/db/sqlalchemy
copying glance/common/db/sqlalchemy/__init__.py -> build/lib.linux-i686-2.6/glance/common/db/sqlalchemy
creating build/bdist.linux-i686
creating build/bdist.linux-i686/egg
creating build/bdist.linux-i686/egg/glance
creating build/bdist.linux-i686/egg/glance/registry
creating build/bdist.linux-i686/egg/glance/registry/db
copying build/lib.linux-i686-2.6/glance/registry/db/api.py -> build/bdist.linux-i686/egg/glance/registry/db
copying build/lib.linux-i686-2.6/glance/registry/db/__init__.py -> build/bdist.linux-i686/egg/glance/registry/db
creating build/bdist.linux-i686/egg/glance/registry/db/sqlalchemy
copying build/lib.linux-i686-2.6/glance/registry/db/sqlalchemy/api.py -> build/bdist.linux-i686/egg/glance/registry/db/sqlalchemy
copying build/lib.linux-i686-2.6/glance/registry/db/sqlalchemy/models.py -> build/bdist.linux-i686/egg/glance/registry/db/sqlalchemy
copying build/lib.linux-i686-2.6/glance/registry/db/sqlalchemy/__init__.py -> build/bdist.linux-i686/egg/glance/registry/db/sqlalchemy
copying build/lib.linux-i686-2.6/glance/registry/client.py -> build/bdist.linux-i686/egg/glance/registry
copying build/lib.linux-i686-2.6/glance/registry/server.py -> build/bdist.linux-i686/egg/glance/registry
copying build/lib.linux-i686-2.6/glance/registry/__init__.py -> build/bdist.linux-i686/egg/glance/registry
creating build/bdist.linux-i686/egg/glance/common
creating build/bdist.linux-i686/egg/glance/common/db
copying build/lib.linux-i686-2.6/glance/common/db/__init__.py -> build/bdist.linux-i686/egg/glance/common/db
creating build/bdist.linux-i686/egg/glance/common/db/sqlalchemy
copying build/lib.linux-i686-2.6/glance/common/db/sqlalchemy/session.py -> build/bdist.linux-i686/egg/glance/common/db/sqlalchemy
copying build/lib.linux-i686-2.6/glance/common/db/sqlalchemy/__init__.py -> build/bdist.linux-i686/egg/glance/common/db/sqlalchemy
copying build/lib.linux-i686-2.6/glance/common/exception.py -> build/bdist.linux-i686/egg/glance/common
copying build/lib.linux-i686-2.6/glance/common/utils.py -> build/bdist.linux-i686/egg/glance/common
copying build/lib.linux-i686-2.6/glance/common/server.py -> build/bdist.linux-i686/egg/glance/common
copying build/lib.linux-i686-2.6/glance/common/wsgi.py -> build/bdist.linux-i686/egg/glance/common
copying build/lib.linux-i686-2.6/glance/common/flags.py -> build/bdist.linux-i686/egg/glance/common
copying build/lib.linux-i686-2.6/glance/common/__init__.py -> build/bdist.linux-i686/egg/glance/common
creating build/bdist.linux-i686/egg/glance/store
copying build/lib.linux-i686-2.6/glance/store/filesystem.py -> build/bdist.linux-i686/egg/glance/store
copying build/lib.linux-i686-2.6/glance/store/http.py -> build/bdist.linux-i686/egg/glance/store
copying build/lib.linux-i686-2.6/glance/store/swift.py -> build/bdist.linux-i686/egg/glance/store
copying build/lib.linux-i686-2.6/glance/store/__init__.py -> build/bdist.linux-i686/egg/glance/store
copying build/lib.linux-i686-2.6/glance/store/s3.py -> build/bdist.linux-i686/egg/glance/store
creating build/bdist.linux-i686/egg/glance/store/backends
copying build/lib.linux-i686-2.6/glance/store/backends/__init__.py -> build/bdist.linux-i686/egg/glance/store/backends
copying build/lib.linux-i686-2.6/glance/client.py -> build/bdist.linux-i686/egg/glance
copying build/lib.linux-i686-2.6/glance/server.py -> build/bdist.linux-i686/egg/glance
copying build/lib.linux-i686-2.6/glance/util.py -> build/bdist.linux-i686/egg/glance
copying build/lib.linux-i686-2.6/glance/__init__.py -> build/bdist.linux-i686/egg/glance
creating build/bdist.linux-i686/egg/tests
creating build/bdist.linux-i686/egg/tests/unit
copying build/lib.linux-i686-2.6/tests/unit/test_clients.py -> build/bdist.linux-i686/egg/tests/unit
copying build/lib.linux-i686-2.6/tests/unit/swiftfakehttp.py -> build/bdist.linux-i686/egg/tests/unit
copying build/lib.linux-i686-2.6/tests/unit/test_stores.py -> build/bdist.linux-i686/egg/tests/unit
copying build/lib.linux-i686-2.6/tests/unit/test_api.py -> build/bdist.linux-i686/egg/tests/unit
copying build/lib.linux-i686-2.6/tests/unit/__init__.py -> build/bdist.linux-i686/egg/tests/unit
copying build/lib.linux-i686-2.6/tests/unit/test_registry_api.py -> build/bdist.linux-i686/egg/tests/unit
byte-compiling build/bdist.linux-i686/egg/glance/registry/db/api.py to api.pyc
byte-compiling build/bdist.linux-i686/egg/glance/registry/db/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/glance/registry/db/sqlalchemy/api.py to api.pyc
byte-compiling build/bdist.linux-i686/egg/glance/registry/db/sqlalchemy/models.py to models.pyc
byte-compiling build/bdist.linux-i686/egg/glance/registry/db/sqlalchemy/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/glance/registry/client.py to client.pyc
byte-compiling build/bdist.linux-i686/egg/glance/registry/server.py to server.pyc
byte-compiling build/bdist.linux-i686/egg/glance/registry/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/db/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/db/sqlalchemy/session.py to session.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/db/sqlalchemy/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/exception.py to exception.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/utils.py to utils.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/server.py to server.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/wsgi.py to wsgi.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/flags.py to flags.pyc
byte-compiling build/bdist.linux-i686/egg/glance/common/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/glance/store/filesystem.py to filesystem.pyc
byte-compiling build/bdist.linux-i686/egg/glance/store/http.py to http.pyc
byte-compiling build/bdist.linux-i686/egg/glance/store/swift.py to swift.pyc
byte-compiling build/bdist.linux-i686/egg/glance/store/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/glance/store/s3.py to s3.pyc
byte-compiling build/bdist.linux-i686/egg/glance/store/backends/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/glance/client.py to client.pyc
byte-compiling build/bdist.linux-i686/egg/glance/server.py to server.pyc
byte-compiling build/bdist.linux-i686/egg/glance/util.py to util.pyc
byte-compiling build/bdist.linux-i686/egg/glance/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/tests/unit/test_clients.py to test_clients.pyc
byte-compiling build/bdist.linux-i686/egg/tests/unit/swiftfakehttp.py to swiftfakehttp.pyc
byte-compiling build/bdist.linux-i686/egg/tests/unit/test_stores.py to test_stores.pyc
byte-compiling build/bdist.linux-i686/egg/tests/unit/test_api.py to test_api.pyc
byte-compiling build/bdist.linux-i686/egg/tests/unit/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-i686/egg/tests/unit/test_registry_api.py to test_registry_api.pyc
creating build/bdist.linux-i686/egg/EGG-INFO
installing scripts to build/bdist.linux-i686/egg/EGG-INFO/scripts
running install_scripts
running build_scripts
creating build/scripts-2.6
copying and adjusting bin/glance-api -> build/scripts-2.6
copying and adjusting bin/glance-registry -> build/scripts-2.6
copying and adjusting bin/glance-upload -> build/scripts-2.6
changing mode of build/scripts-2.6/glance-api from 644 to 755
changing mode of build/scripts-2.6/glance-registry from 644 to 755
changing mode of build/scripts-2.6/glance-upload from 644 to 755
creating build/bdist.linux-i686/egg/EGG-INFO/scripts
copying build/scripts-2.6/glance-upload -> build/bdist.linux-i686/egg/EGG-INFO/scripts
copying build/scripts-2.6/glance-api -> build/bdist.linux-i686/egg/EGG-INFO/scripts
copying build/scripts-2.6/glance-registry -> build/bdist.linux-i686/egg/EGG-INFO/scripts
changing mode of build/bdist.linux-i686/egg/EGG-INFO/scripts/glance-upload to 755
changing mode of build/bdist.linux-i686/egg/EGG-INFO/scripts/glance-api to 755
changing mode of build/bdist.linux-i686/egg/EGG-INFO/scripts/glance-registry to 755
copying glance.egg-info/PKG-INFO -> build/bdist.linux-i686/egg/EGG-INFO
copying glance.egg-info/SOURCES.txt -> build/bdist.linux-i686/egg/EGG-INFO
copying glance.egg-info/dependency_links.txt -> build/bdist.linux-i686/egg/EGG-INFO
copying glance.egg-info/top_level.txt -> build/bdist.linux-i686/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
glance.common.utils: module references __file__
glance.common.utils: module MAY be using inspect.stack
creating dist
creating 'dist/glance-0.1.7-py2.6.egg' and adding 'build/bdist.linux-i686/egg' to it
removing 'build/bdist.linux-i686/egg' (and everything under it)
Processing glance-0.1.7-py2.6.egg
creating /usr/local/lib/python2.6/dist-packages/glance-0.1.7-py2.6.egg
Extracting glance-0.1.7-py2.6.egg to /usr/local/lib/python2.6/dist-packages
Removing glance 2012.2 from easy-install.pth file
Adding glance 0.1.7 to easy-install.pth file
Installing glance-upload script to /usr/local/bin
Installing glance-api script to /usr/local/bin
Installing glance-registry script to /usr/local/bin
Installed /usr/local/lib/python2.6/dist-packages/glance-0.1.7-py2.6.egg
Processing dependencies for glance==0.1.7
Finished processing dependencies for glance==0.1.7
root@crossover:/home/snailpy/dev/glance-0.1.7# ls
bin ChangeLog glance PKG-INFO run_tests.py setup.py
build dist glance.egg-info pylintrc run_tests.sh tests
builddeb.sh doc MANIFEST.in README setup.cfg tools
root@crossover:/home/snailpy/dev/glance-0.1.7# cd build/
root@crossover:/home/snailpy/dev/glance-0.1.7/build# ls
bdist.linux-i686 lib.linux-i686-2.6 scripts-2.6
root@crossover:/home/snailpy/dev/glance-0.1.7/build# ls -l
total 12
drwxr-xr-x 2 root root 4096 May 31 11:05 bdist.linux-i686
drwxr-xr-x 4 root root 4096 May 31 11:05 lib.linux-i686-2.6
drwxr-xr-x 2 root root 4096 May 31 11:05 scripts-2.6
root@crossover:/home/snailpy/dev/glance-0.1.7/build# cd ..
root@crossover:/home/snailpy/dev/glance-0.1.7# ls
bin ChangeLog glance PKG-INFO run_tests.py setup.py
build dist glance.egg-info pylintrc run_tests.sh tests
builddeb.sh doc MANIFEST.in README setup.cfg tools
root@crossover:/home/snailpy/dev/glance-0.1.7# cd bin/
root@crossover:/home/snailpy/dev/glance-0.1.7/bin# ls
glance-api glance-registry glance-upload
root@crossover:/home/snailpy/dev/glance-0.1.7/bin# cd ..
root@crossover:/home/snailpy/dev/glance-0.1.7# ls
bin ChangeLog glance PKG-INFO run_tests.py setup.py
build dist glance.egg-info pylintrc run_tests.sh tests
builddeb.sh doc MANIFEST.in README setup.cfg tools
root@crossover:/home/snailpy/dev/glance-0.1.7# easy_install sphinx
Searching for sphinx
Reading http://pypi.python.org/simple/sphinx/
Reading http://sphinx.pocoo.org/
Best match: Sphinx 1.1.3
Downloading http://pypi.python.org/packages/2.6/S/Sphinx/Sphinx-1.1.3-py2.6.egg#md5=f0873b56630070f661ec3abc3eaf4457
Processing Sphinx-1.1.3-py2.6.egg
creating /usr/local/lib/python2.6/dist-packages/Sphinx-1.1.3-py2.6.egg
Extracting Sphinx-1.1.3-py2.6.egg to /usr/local/lib/python2.6/dist-packages
Adding Sphinx 1.1.3 to easy-install.pth file
Installing sphinx-apidoc script to /usr/local/bin
Installing sphinx-build script to /usr/local/bin
Installing sphinx-quickstart script to /usr/local/bin
Installing sphinx-autogen script to /usr/local/bin
Installed /usr/local/lib/python2.6/dist-packages/Sphinx-1.1.3-py2.6.egg
Processing dependencies for sphinx
Searching for docutils>=0.7
Reading http://pypi.python.org/simple/docutils/
Reading http://docutils.sourceforge.net/
Best match: docutils 0.9
Downloading http://prdownloads.sourceforge.net/docutils/docutils-0.9.tar.gz?download
Processing docutils-0.9.tar.gz
Writing /tmp/easy_install-_FFcyu/docutils-0.9/setup.cfg
Running docutils-0.9/setup.py -q bdist_egg --dist-dir /tmp/easy_install-_FFcyu/docutils-0.9/egg-dist-tmp-BcQStB
warning: no files found matching 'MANIFEST'
warning: no files found matching '*' under directory 'extras'
warning: no previously-included files matching '.cvsignore' found under directory '*'
warning: no previously-included files matching '*.pyc' found under directory '*'
warning: no previously-included files matching '*~' found under directory '*'
warning: no previously-included files matching '.DS_Store' found under directory '*'
zip_safe flag not set; analyzing archive contents...
docutils.writers.odf_odt.__init__: module references __file__
docutils.writers.latex2e.__init__: module references __file__
docutils.writers.html4css1.__init__: module references __file__
docutils.writers.s5_html.__init__: module references __file__
docutils.writers.pep_html.__init__: module references __file__
docutils.parsers.rst.directives.misc: module references __file__
Adding docutils 0.9 to easy-install.pth file
Installing rst2xml.py script to /usr/local/bin
Installing rst2odt.py script to /usr/local/bin
Installing rst2pseudoxml.py script to /usr/local/bin
Installing rst2odt_prepstyles.py script to /usr/local/bin
Installing rst2latex.py script to /usr/local/bin
Installing rst2html.py script to /usr/local/bin
Installing rst2man.py script to /usr/local/bin
Installing rst2s5.py script to /usr/local/bin
Installing rstpep2html.py script to /usr/local/bin
Installing rst2xetex.py script to /usr/local/bin
Installed /usr/local/lib/python2.6/dist-packages/docutils-0.9-py2.6.egg
Searching for Jinja2>=2.3
Reading http://pypi.python.org/simple/Jinja2/
Reading http://jinja.pocoo.org/
Best match: Jinja2 2.6
Downloading http://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.6.tar.gz#md5=1c49a8825c993bfdcf55bb36897d28a2
Processing Jinja2-2.6.tar.gz
Writing /tmp/easy_install-RhD8iu/Jinja2-2.6/setup.cfg
Running Jinja2-2.6/setup.py -q bdist_egg --dist-dir /tmp/easy_install-RhD8iu/Jinja2-2.6/egg-dist-tmp-_FFu6x
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no previously-included files matching '*.pyc' found under directory 'jinja2'
warning: no previously-included files matching '*.pyc' found under directory 'docs'
warning: no previously-included files matching '*.pyo' found under directory 'jinja2'
warning: no previously-included files matching '*.pyo' found under directory 'docs'
Adding Jinja2 2.6 to easy-install.pth file
Installed /usr/local/lib/python2.6/dist-packages/Jinja2-2.6-py2.6.egg
Searching for Pygments>=1.2
Reading http://pypi.python.org/simple/Pygments/
Reading http://pygments.org/
Reading http://pygments.pocoo.org/
Best match: Pygments 1.5
Downloading http://pypi.python.org/packages/2.6/P/Pygments/Pygments-1.5-py2.6.egg#md5=359d667ed004b6d1bee20917a7d06a7b
Processing Pygments-1.5-py2.6.egg
creating /usr/local/lib/python2.6/dist-packages/Pygments-1.5-py2.6.egg
Extracting Pygments-1.5-py2.6.egg to /usr/local/lib/python2.6/dist-packages
Adding Pygments 1.5 to easy-install.pth file
Installing pygmentize script to /usr/local/bin
Installed /usr/local/lib/python2.6/dist-packages/Pygments-1.5-py2.6.egg
Finished processing dependencies for sphinx
安装完毕。以后就在 glance-0.1.7 上先活动一下筋骨了。