最近弄了一陣子OSTF,小記一下。
OSTF 是什么
openstack的龐大就不多說了,小可也剛剛摸出點(diǎn)門道,覺得暈的,自己開始能搭起來一個(gè)環(huán)境,看到虛機(jī)跑起來了就已經(jīng)拜謝六丁六甲了,但是千里之堤潰于蟻穴,這樣龐大復(fù)雜的系統(tǒng)想不出問題是不可能的,而對(duì)于我們平時(shí)搭建和基本的使用來說,有些問題是不容易發(fā)現(xiàn)的,這時(shí)候需要進(jìn)行系統(tǒng)的和業(yè)務(wù)邏輯相關(guān)的測(cè)試來保證系統(tǒng)的正常運(yùn)行。
duangduangduang。。。
這就是OSTF要做的了,OSTF 是 OpenStack Testing Framework 的縮寫,也就是openstack框架測(cè)試,其實(shí)是Fuel-OSTF,看的出來了吧,其實(shí)是FUEL的一個(gè)項(xiàng)目,但是如果不用fuel的話通過寫改造還是很容易和自己的環(huán)境配合的,這個(gè)找時(shí)間再系統(tǒng)整理下吧。
OSTF 優(yōu)缺點(diǎn)
缺點(diǎn)
與fuel集成
fuel沒有用過,ostf是人家的一部分也無可厚非,不過好用的東西還是拿出來啊木有nose的attr
這個(gè)嘛覺得不是很方便啊,本來也是基于nose的,不好用attr不是很方便啊一些值都寫死在用例里面,加到conf里面會(huì)方便些
優(yōu)點(diǎn)
- RESTapi
代碼梳理
做東西總是逃不過代碼啊,簡(jiǎn)單梳理下吧
結(jié)構(gòu)
整體上OSTF由兩部分組成
- fuel_health 主要是測(cè)試用例及其相關(guān)內(nèi)容
- fuel_plugin OSTF本身的server,client等都在這里了,還有處理restapi
話說如果只是要使用測(cè)試用例來檢查openstack的話,基本可以不用fuel_plugin了,小調(diào)整下基本就能用nose直接跑fuel_health里面的用例了
還有一個(gè)Nailgun,這個(gè)不太熟悉是什么東西,看文檔感覺是OSTF中傳遞數(shù)據(jù)和配置的,反倒我自己環(huán)境的時(shí)候這個(gè)我基本給踢掉了(If you want run OSTF for non Fuel installation, change the initialization of NailgunConfig() to FileConfig())。不用fuel的話就用不到nailgun了應(yīng)該,配置文件可以通過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))
一個(gè)環(huán)境變量CUSTOM_FUEL_CONFIG=fuel_health/etc/test.conf就可以搞定了。配置文件主要是openstack各個(gè)組件的一些信息。
流程
ostf服務(wù)起來后可以通過restapi訪問了,OSTF是用pecan處理請(qǐng)求的。
fuel_plugin/ostf_adapter/wsgi/root.py中定義了三個(gè)controller分別負(fù)責(zé)tests,testsets和testruns的請(qǐng)求的分發(fā)。
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文件中對(duì)各個(gè)controller做了相應(yīng)定義。
其中TestrunsController()中對(duì)post方法做了處理,因?yàn)橥ㄟ^這個(gè)方法要來出發(fā)測(cè)試代碼的執(zhí)行的。
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的接口了來執(zhí)行測(cè)試代碼。