在windows上搭建OpenStack开发环境

很多开发OpenStack的朋友是工作在Windows上的,因为Windows无法部署OpenStack,只能选择通过SSH连接到远端主机,修改完代码,重启OpenStack服务,看看效果。如果出错,则只好通过pdb来调试。对于像OpenStack这样大规模的系统,使用这种方式开发调试,效率非常低。本篇文章就是为了解救这些朋友的。

虽然Windows上不能直接安装OpenStack,但开发OpenStack也并不一定要能够把服务都运行起来。事实上,我们只需要搭建一个可以运行OpenStack单元测试的环境,就可以支持80%的开发工作了。所以,我们先把目标重新设定一下:

在Windows上搭建OpenStack单元测试运行和调试环境
**在Windows上搭建OpenStack单元测试运行和调试环境**

#第一步:准备

本文的运行环境是运行在VirtualBox里的Windows 7 32bit系统,从一个完全纯净的环境搭建OpenStack开发环境。首先,需要安装以下软件:

  1. 最基本的,Python环境:Python 2.7.9
  2. 因为OpenStack用到的一些包需要C写的,需要编译环境:Microsoft Visual C++ Compiler for Python 2.7
  3. 下载OpenStack代码,需要Git:mysysGit
  4. 本文使用PyCharm作为IDE:PyCharm

#第二步:安装

##安装Microsoft Visual C++ Compiler for Python 2.7

运行第一步中下载的VCForPython27.msi,按照提示进行安装即可。

##安装Python

安装Python

注意上图中,要选中Add python.exe to Path,这样安装完成后,就可以在命令提示符中直接使用pythonpip命令,否则要手动添加环境变量。

安装完成后,打开命令提示符,输入python --versionpip --version,查看Python是否安装成功。

1
2
3
4
C:\Users\openstack>python --version
Python 2.7.9
C:\Users\openstack>pip --version
pip 1.5.6 from C:\Python27\lib\site-packages (python 2.7)

##安装virtualenv和virtualenvwrapper-win

作为一个Pythoner,如果你还没开始用virtualenv,那从现在开始,你一定要开始用它,尤其当你同时开发多个项目时,使用virtualenv来隔离各个环境是非常有帮助的。如果你已经用了virtualenv,但你还没用过virtualenvwrapper,那你一定要开始用它。(在Windows上,与vritualenvwrapper提供同样功能的,是virtualenvwrapper-win)

1
2
3
4
5
6
7
8
9
10
11
C:\Users\openstack>pip install virtualenv virtualenvwrapper-win
Downloading/unpacking virtualenv
Downloading/unpacking virtualenvwrapper-win
Downloading virtualenvwrapper-win-1.2.0.zip
Running setup.py (path:c:\users\openst~1\appdata\local\temp\pip_build_openstack\virtualenvwrapper-win\setup.py) egg_info for package virtualenvwrapper-win
Installing collected packages: virtualenv, virtualenvwrapper-win
Running setup.py install for virtualenvwrapper-win
Successfully installed virtualenv virtualenvwrapper-win
Cleaning up...

重新打开一个命令提示符,输入mkvirtualenv openstack,创建一个名为openstack的虚拟环境:

1
2
3
4
5
C:\Users\openstack>mkvirtualenv openstack
New python executable in openstack\Scripts\python.exe
Installing setuptools, pip...done.
(openstack) C:\Users\openstack>

可以看到,在原来的命令提示符前,有一个(openstack),说明当前工作在名为openstack的虚拟环境中。virtualenvwrapp-win还提供了很多其他操作虚拟环境的命令,详情参考这里

##获取OpenStack代码

运行mysysGit安装程序,如果要在命令提示符下使用git命令,需要选择“Use Git from the Windows Command Prompt”:

Use Git from the Windows Command Prompt

其他选项使用默认配置即可。安装成功后,如下图:

安装mysysGit

重新打开一个命令提示符,输入git --version,验证Git安装成功:

1
2
C:\Users\openstack>git --version
git version 1.9.5.msysgit.1

成功安装Git后,就可以下载最新的OpenStack代码了。OpenStack的代码托管在一个Git仓库中,可以到该网站查看所有OpenStack组件的Git地址。以Nova为例,通过git clone命令获取最新代码:

1
2
3
4
5
6
7
8
C:\Users\openstack\code>git clone git://git.openstack.org/openstack/nova
Cloning into 'nova'...
remote: Counting objects: 329276, done.
remote: Compressing objects: 100% (142108/142108), done.
remote: Total 329276 (delta 257278), reused 245794 (delta 176537)
Receiving objects: 100% (329276/329276), 99.86 MiB | 54.00 KiB/s, done.
Resolving deltas: 100% (257278/257278), done.
Checking connectivity... done.

##安装依赖包

这是整个过程中最困难的部分。

克隆好代码后,进入代码目录。确认一下,如果当前不在openstack虚拟环境内,可以通过workon openstack切换过去(workon命令是virtualenvwrapper-win带来的),这样我们安装的依赖包就只影响当前的虚拟环境,不会影响其他环境:

1
2
C:\Users\openstack\code>workon openstack
(openstack) C:\Users\openstack\code>

在Nova代码目录下,有两个文件,一个是requirements.txt,里面是Nova运行环境所需要的依赖包,一个是test-requirement.txt,是Nova运行测试时需要的依赖包,将所有的依赖包都装上,理论上就环境搭建就应该完成了。通过pip install -r命令来执行安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(openstack) C:\Users\openstack\code\nova>pip install -r requirements.txt
Collecting pbr!=0.7,<1.0,>=0.6 (from -r requirements.txt (line 5))
Downloading pbr-0.10.8-py2.py3-none-any.whl (70kB)
100% |################################| 73kB 195kB/s
Collecting SQLAlchemy<=0.9.99,>=0.9.7 (from -r requirements.txt (line 6))
Downloading SQLAlchemy-0.9.9.tar.gz (4.2MB)
100% |################################| 4.2MB 34kB/s
Collecting boto>=2.32.1 (from -r requirements.txt (line 7))
Downloading boto-2.36.0-py2.py3-none-any.whl (1.3MB)
100% |################################| 1.3MB 43kB/s
Collecting decorator>=3.4.0 (from -r requirements.txt (line 8))
Downloading decorator-3.4.0.tar.gz
Collecting eventlet>=0.16.1 (from -r requirements.txt (line 9))
Downloading eventlet-0.17.1-py2.py3-none-any.whl (140kB)
100% |################################| 143kB 57kB/s
...

下载完成后,会执行安装过程,不出意外的话,安装过程会失败,提示应该接近下面这个样子:

1
2
3
4
5
6
posix_ipc_module.c(37) : fatal error C1083: Cannot open include file: 'sys/time.h': No such file or directory
error: command 'C:\\Users\\openstack\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\cl.exe' failed with exit status 2
----------------------------------------
Command "C:\Users\openstack\Envs\openstack\Scripts\python.exe -c "import setuptools, tokenize;__file__='c:\\users\\openst~1\\appdata\\local\\temp\\pip-build-4inhye\\posix-ipc\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record c:\users\openst~1\appdata\local\temp\pip-vjuv3x-record\install-record.txt --single-version-externally-managed --compile --install-headers C:\Users\openstack\Envs\openstack\include\site\python2.7" failed with error code 1 in c:\users\openst~1\appdata\local\temp\pip-build-4inhye\posix-ipc

这是因为安装posix_ipc需要sys/time.h头文件来进行编译,而Windows并不是完整的Posix标准操作系统,所以没有这个文件,也就无法编译。要解决这个问题,有两个可选方案:

  1. 使用MinGW或者Cygwin,在Windows上模拟一个Posix环境,将OpenStack安装在这个环境中。经过试验,虽然可以成功安装依赖包,但是在使用IDE进行集成时,PyCharm无法识别MinGW或者Cygwin环境,如果不能和IDE进行集成,我们就没有必要在Windows上搭建环境了;
  2. 绕过编译直接安装这个包。Python的包都放在虚拟环境的Lib/site-packages目录下,在安装时,如果检测到这个目录下有对应的文件,pip程序会认为这个包已经安装,就会跳过安装它。这样做的一个弊端是,虽然pip认为这个包已经安装成功,但实际上只是posix_ipc的Python接口部分存在,而底层的C库因为没有编译成功,所以不存在——也就是说,这个包实际上无法使用。

在这里,我们选择第二种方案。理由是,我们的目标是“搭建一个OpenStack单元测试运行和调试环境”,而通常单元测试运行时会把ipc通信以及读写数据库等操作通过Mock的方式屏蔽起来,也就是说,如果我们只是运行单元测试,只要这个包存在,代码中可以正常import进来,至于是否能运行,其实影响不大。

因为我的工作环境是Mac OS X Yosemite,在这个环境下是可以正常安装所有包的,所以我将这个环境下对应包的文件(posix_ipc-1.0.0-py2.7.egg-info)拷贝到Windows环境下对应的虚拟环境(C:\Users\openstack\Envs\openstack\Lib\site-packages)中。再次运行安装命令。

如果你看到类似下面这段话,恭喜你,说明你的依赖库都已经安装成功:

1
Successfully installed Babel-1.3 Jinja2-2.7.3 Paste-1.7.5.1 PasteDeploy-1.5.2 PrettyTable-0.7.2 Routes-2.1 SQLAlchemy-0.9.9 Tempita-0.5.2 WebOb-1.4 argparse-1.3.0 boto-2.36.0 cliff-1.10.1 decorator-3.4.0 ecdsa-0.13 eventlet-0.17.1 fixtures-1.0.0 greenlet-0.4.5 iso8601-0.1.10 jsonschema-2.4.0 keystonemiddleware-1.5.0 lxml-3.4.2 markupsafe-0.23 netaddr-0.7.13 numpy-1.9.2 oslo.concurrency-1.8.0 oslo.config-1.9.3 oslo.context-0.2.0 oslo.db-1.7.1 oslo.i18n-1.5.0 oslo.log-1.0.0 oslo.messaging-1.8.0 oslo.middleware-1.0.0 oslo.rootwrap-1.6.0 oslo.serialization-1.4.0 oslo.utils-1.4.0 paramiko-1.15.2 psutil-1.2.1 pyOpenSSL-0.14 pyasn1-0.1.7 pycadf-0.8.0 pycrypto-2.6.1 python-cinderclient-1.1.1 python-glanceclient-0.17.0 python-keystoneclient-1.2.0 python-neutronclient-2.3.11 pytz-2014.10 repoze.lru-0.6 requests-2.6.0 retrying-1.3.3 rfc3986-0.2.1 simplejson-3.6.5 six-1.9.0 sqlalchemy-migrate-0.9.5 sqlparse-0.1.14 stevedore-1.3.0 suds-0.4 warlock-1.1.0 websockify-0.6.0

但是革命尚未成功,同志仍需努力。接下来还要安装测试环境依赖包,继续执行以下命令:

1
2
3
4
5
6
7
8
9
10
(openstack) C:\Users\openstack\code\nova>pip install -r test-requirements.txt
Collecting hacking<0.11,>=0.10.0 (from -r test-requirements.txt (line 5))
Downloading hacking-0.10.1-py2.py3-none-any.whl
Collecting coverage>=3.6 (from -r test-requirements.txt (line 6))
Downloading coverage-3.7.1-cp27-none-win32.whl (115kB)
100% |################################| 118kB 57kB/s
Collecting discover (from -r test-requirements.txt (line 7))
Downloading discover-0.4.0.tar.gz
...

又失败了,提示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
...
Collecting psycopg2 (from -r test-requirements.txt (line 12))
Downloading psycopg2-2.6.tar.gz (367kB)
100% |################################| 368kB 43kB/s
Error: pg_config executable not found.
Please add the directory containing pg_config to the PATH
or specify the full executable path with the option:
python setup.py build_ext --pg-config /path/to/pg_config build ...
or with the pg_config option in 'setup.cfg'.
Complete output from command python setup.py egg_info:
running egg_info
creating pip-egg-info\psycopg2.egg-info
writing pip-egg-info\psycopg2.egg-info\PKG-INFO
writing top-level names to pip-egg-info\psycopg2.egg-info\top_level.txt
writing dependency_links to pip-egg-info\psycopg2.egg-info\dependency_links.txt
writing manifest file 'pip-egg-info\psycopg2.egg-info\SOURCES.txt'
warning: manifest_maker: standard file '-c' not found
Error: pg_config executable not found.
Please add the directory containing pg_config to the PATH
or specify the full executable path with the option:
python setup.py build_ext --pg-config /path/to/pg_config build ...
or with the pg_config option in 'setup.cfg'.
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in c:\users\openst~1\appdata\local\temp\pip-build-ywup8i\psycopg2

是不是有点信心受挫?不要怕,有应对方案。

还记得我们在第一步中下载的PostgreSQL么?就是为了解决这个问题而存在的。提示pg_config找不到,这个pg_config是PostgreSQL数据库的一个命令行工具,因为Nova组件支持PostgreSQL数据库,所以需要相关的库,而安装这个库在安装时需要配置本地已经安装的PostgreSQL。所以这里的应对方案就是安装PostgreSQL数据库。

但是,别忘了我们的初衷,运行单元测试,基本上也不需要真的访问数据库,所以更简单的解决方案,是如法炮制posix_ipc的方案。我们只要拷贝psycopg2目录和psycopg2-2.6-py2.7.egg-info目录到虚拟环境中即可。事实上,接下来我们还会遇到MySQL相关的错误,所以我们再拷贝两个包(MySQLdbMySQL_python-1.2.5-py2.7.egg-info)过来,把MySQL的问题也一起解决。

在此运行安装命令,看到如下输出,说明安装成功:

1
Successfully installed coverage-3.7.1 discover-0.4.0 hacking-0.10.1 mock-1.0.1 mox3-0.7.0

最后,在Nova源代码目录下,运行pip install -e .,将当前的项目代码,以编辑模式(-e, editable)安装到当前虚拟环境中,如果前面两步都没什么问题,这条命令应该很顺利。

至此,你可以长嘘一口气了。

#第三步:配置IDE

如果你一路跟着前面的说明到了这里,你可能觉得前面费的功夫对你的工作效率没什么提升。坚持一下,做完最后一步,你一定不会后悔。

##安装PyCharm

很简单,运行,按照提示,下一步,下一步,...,直到完成。

##配置项目解释器

启动PyCharm,第一次启动时会提示设置工作目录,配置主题等等(推荐Darcula主题),然后你会看到下面这个界面:

PyCharm

点击Open,找到前面下载的Nova代码目录,选中,打开,然后就是这样了:

PyCharm打开项目

随便打开一个代码文件,大概是这个样子:

PyCharm打开项目

你可能会觉得奇怪,为什么会有这些红色的波浪线?仔细读一下上面的提示,你会发现,PyCharm找不到这些包。但是这些包我们刚刚安装过了,为什么会找不到呢?

还记得virtualenv吧?我们安装的包,都在虚拟环境下,而PyCharm默认只能找到系统安装的Python解释器,所以我们需要告诉PyCharm,Nova要用哪一个环境。选择File->Settings,或者按Ctrl + Alt + S,打开设置窗口,找到Project:Nova,在右上角,有一个设置按钮:

PyCharm打开项目

选择Add Local,找到你的虚拟环境目录,在下面的Scripts目录下找到Python.exe,比如我的配置是C:\Users\openstack\Envs\openstack\Scripts\python.exe

PyCharm打开项目

确认后,会看到在虚拟环境中的依赖包都被识别到了。

PyCharm打开项目

点击OK,稍微等一小会儿(PyCharm正在索引所有的依赖库,如果你的机器配置比较低,这个过程可能会持续几分钟),你应该就可以看到,之前的红色波浪线和找不到包的提示都不见了,这说明你的环境已经配置成功。

##运行,调试单元测试

环境已经配置好,我们来测试一下。

打开一个单元测试源文件(nova.tests.unit.compute.test_resources.py),选择一个测试类(TestVCPU),右键点击类名,选择Run 'Unittests in TestVCPU'

PyCharm打开项目

测试结果会显示在下面:

PyCharm打开项目

再来试试Debug,先设置一个断点,然后同样的操作,右键选择类名,点击Debug 'Unittests in TestVCPU'

PyCharm打开项目

Hooray!

#总结

至此,OpenStack单元测试运行和调试环境全部配置完成,也许即使按照这个教程,你依然会花半天时间才能把环境配好,但这些时间花的值得,有了工具的有力支持,你的开发效率一定会成倍提升!