最近弄了一阵子OSTF,小记一下。
OSTF 是什么
openstack的庞大就不多说了,小可也刚刚摸出点门道,觉得晕的,自己开始能搭起来一个环境,看到虚机跑起来了就已经拜谢六丁六甲了,但是千里之堤溃于蚁穴,这样庞大复杂的系统想不出问题是不可能的,而对于我们平时搭建和基本的使用来说,有些问题是不容易发现的,这时候需要进行系统的和业务逻辑相关的测试来保证系统的正常运行。
duangduangduang。。。
这就是OSTF要做的了,OSTF 是 OpenStack Testing Framework 的缩写,也就是openstack框架测试,其实是Fuel-OSTF,看的出来了吧,其实是FUEL的一个项目,但是如果不用fuel的话通过写改造还是很容易和自己的环境配合的,这个找时间再系统整理下吧。
OSTF 优缺点
缺点
与fuel集成
fuel没有用过,ostf是人家的一部分也无可厚非,不过好用的东西还是拿出来啊木有nose的attr
这个嘛觉得不是很方便啊,本来也是基于nose的,不好用attr不是很方便啊一些值都写死在用例里面,加到conf里面会方便些
优点
- RESTapi
代码梳理
做东西总是逃不过代码啊,简单梳理下吧
结构
整体上OSTF由两部分组成
- fuel_health 主要是测试用例及其相关内容
- fuel_plugin OSTF本身的server,client等都在这里了,还有处理restapi
话说如果只是要使用测试用例来检查openstack的话,基本可以不用fuel_plugin了,小调整下基本就能用nose直接跑fuel_health里面的用例了
还有一个Nailgun,这个不太熟悉是什么东西,看文档感觉是OSTF中传递数据和配置的,反倒我自己环境的时候这个我基本给踢掉了(If you want run OSTF for non Fuel installation, change the initialization of NailgunConfig() to FileConfig()
)。不用fuel的话就用不到nailgun了应该,配置文件可以通过FileConfig()来处理。
def FuelConfig():
if 'CUSTOM_FUEL_CONFIG' in os.environ:
return FileConfig()
else:
try:
return NailgunConfig()
except exceptions.SetProxy as e:
raise unittest2.TestCase.failureException(str(e))
一个环境变量CUSTOM_FUEL_CONFIG=fuel_health/etc/test.conf
就可以搞定了。配置文件主要是openstack各个组件的一些信息。
流程
ostf服务起来后可以通过restapi访问了,OSTF是用pecan处理请求的。
fuel_plugin/ostf_adapter/wsgi/root.py
中定义了三个controller分别负责tests,testsets和testruns的请求的分发。
from fuel_plugin.ostf_adapter.wsgi import controllers
from pecan import expose
class V1Controller(object):
# TODO(???) Rewrite it with wsme expose
tests = controllers.TestsController()
testsets = controllers.TestsetsController()
testruns = controllers.TestrunsController()
class RootController(object):
v1 = V1Controller()
@expose('json', generic=True)
def index(self):
return {}
fuel_plugin/ostf_adapter/wsgi/controllers.py
文件中对各个controller做了相应定义。
其中TestrunsController()中对post方法做了处理,因为通过这个方法要来出发测试代码的执行的。
st=>start: 接收post Request
op1=>operation: [TestrunsContorller.post()] - models.TestRun.start
op2=>operation: [ostf_adapter.storage.modles] - TestRun.start
op3=>operation: [fuel_plugin.ostf_adapter.nose_plugin] - nose_adapter.run
e=>end: [nose_adapter._run_tests] - nose_test_runner
st->op1->op2->op3->e
最终由nose_test_runner也就是nose的接口了来执行测试代码。