Openstack Swift中間件編寫

關於openstack swift的資料能夠看這裏這裏還有這裏html

準備環境

從零開始接觸的同窗能夠先從swift的all in one部署開始學習,在本機搭建好swift環境就能夠進行簡單的測試了。因爲swift是用Python語言寫的,若是要開發swift的中間件的還須要在本地安裝Pythone的IDE,我比較喜歡JETBRAIN(他們比較出名的是JAVA的IDE——IDEA)公司的IDE——Pycharm。準備環境以下:node

  • Ububutn 12.04 LTS 64bit
  • Python2.7(雖然如今已經有Python3了,但swift是用2.x的Python寫的,Python3不向後兼容Python2)
  • Pycharm3

中間件介紹

swift經過提供基於HTTP協議的API給外界調用來完成對象存儲的功能,咱們從swift的各個部署說明裏面能夠看到,proxy server和storage node的配置文件裏面都有一個[pipeline:main],這個是swift各個服務的請求鏈,由多箇中間件組成的一箇中間件集合。pipeline有點像J2EE裏面filter,每一個http請求須要通過各個服務的pipeline。python

proxy-server.conf
1
2
3
4
5
6
... [pipeline:main] # Yes, proxy-logging appears twice. This is so that # middleware-originated requests get logged too. pipeline = catch_errors healthcheck proxy-logging bulk ratelimit crossdomain slo cache tempurl tempauth staticweb account-quotas container-quotas proxy-logging proxy-server ... 
account-server.conf
1
2
3
4
... [pipeline:main] pipeline = recon account-server ... 

中間件編寫

瞭解了swift的基本功能流程後,咱們就能夠來寫本身的中間件了。git

沒有寫過中間件的同窗能夠經過學習其餘中間件開始,在swift的源碼中配置了不少中間件,有一些功能很是簡單。好比name_check中間件,這個中間件的做用是拿來分析請求的url,判斷url中是否有特殊字符,長度是否超出規定長度等。這個中間件沒有配置在swift的標準配置中,有須要的能夠自行加上本機的swift環境作測試。github

咱們先來看一下name_check中間件的配置信息:web

proxy-server.conf
1
2
3
4
5
6
7
8
[pipeline:main] pipeline = catch_errors healthcheck name_check cache ratelimit tempauth sos  proxy-logging proxy-server  [filter:name_check] use = egg:swift#name_check forbidden_chars = '"`<> maximum_length = 255 

在上面的例子中,name_check中間件加在healthcheck這個中間件後面,filter:name_check下面的配置信息是name_check的一些配置參數。shell

  • forbidden_chars: 指url中不能包含的特殊字符
  • maximum_length: 指url的最大長度

咱們再來看name_check的單元測試:ubuntu

test_name_check.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class FakeApp(object):   def __call__(self, env, start_response):  return Response(body="OK")(env, start_response)   class TestNameCheckMiddleware(unittest.TestCase):   def setUp(self):  self.conf = {'maximum_length': MAX_LENGTH, 'forbidden_chars':  FORBIDDEN_CHARS, 'forbidden_regexp': FORBIDDEN_REGEXP}  self.test_check = name_check.filter_factory(self.conf)(FakeApp())   def test_valid_length_and_character(self):  path = '/V1.0/' + 'c' * (MAX_LENGTH - 6)  resp = Request.blank(path, environ={'REQUEST_METHOD': 'PUT'}  ).get_response(self.test_check)  self.assertEquals(resp.body, 'OK')   ...... # other test cases  if __name__ == '__main__':  unittest.main() 

看源碼先從單元測試看起,能夠以最快的速度瞭解源代碼的功能。在這個測試案例中,測試先mock了一個虛擬的app,這個app不會真實的調用swift,而是會將http response返回預設好的值。
再看其中的一個測試案例,這裏給定了一個最大長度url,而後經過調用name_check中間件,指望請求能夠正常經過。swift

最後咱們再來看name_check中間件的源碼幾個方法: * init: 中間件的初始化方法 * call: 中間件被調用時觸發的方法 * filter_factory: 這個是類之外的方法,在swift服務啓動時會建立中間件實例,並加入到pipeline中。app

學習完這個簡單的中間件後,相信你們均可以依葫蘆畫瓢開始寫本身的中間件了。

修改配置文件

編寫完中間件以後,還須要將中間件配置到swift中,這樣纔算真正完成中間件的建立。

首先先中止swift的服務

shell
1
swift@ubuntu:~$ swift-init main stop 

接着修改conf文件

假設你增長的中間件是proxy server的中間件,就修改proxy-server.conf,自行決定要放到pipeline中的哪一個位置,具體要看你的中間件是執行什麼功能。

proxy-server.conf
1
2
3
4
5
6
7
8
[pipeline:main] pipeline = catch_errors healthcheck your_middleware cache ratelimit tempauth sos  proxy-logging proxy-server  [filter:your_middleware] use = egg:swift#your_middleware your_middleware_config1 = value1 your_middleware_config1 = value2 

要修改swift的根目錄下的setup.cfg文件

setup.cfg
1
2
3
paste.filter_factory =  #這裏加入一行本身的中間件,能夠看下name_check中間件是怎麼寫的  name_check = swift.common.middleware.name_check:filter_factory 

執行命令從新安裝swift

shell
1
2
swift@ubuntu:~$ cd swift目錄 swift@ubuntu:~$ sudo python setyp.py develop 

最後重啓swift服務

shell
1
swift@ubuntu:~$ swift-init main start 
相關文章
相關標籤/搜索