1. 程式人生 > >(一)Openstack系列之 如何修改 並且除錯 觀察效果

(一)Openstack系列之 如何修改 並且除錯 觀察效果

一、Openstack 如何修改程式碼並且觀察效果

寫這篇文章是為了給Openstack 新手提供一些基本的幫助,例如哪裡修改,怎麼修改,修改了之後如何重啟等等。

1      檔案的位置

現在網上的安裝方法基本都是通過配置安裝源安裝,那麼安裝後的Openstack工程的程式檔案在哪呢?以nova為例:

/usr/share/pyshared/nova

這個目錄下的結構是不是十分熟悉,對,基本跟在eclipse下瀏覽工程的結構一模一樣,這就是安裝openstack後原始碼路徑。再看下面的目錄:

/usr/lib/python2.7/dist-package/nova

這裡就是nova工程經過編譯後的檔案,其中的py檔案是上面那個目錄中對應檔案的連結而已。

2      動手修改python檔案

當我們知道了原始檔和編譯檔案位置之後,那我們就很容易的修改程式以滿足我們自己的要求。以修改nova操作許可權判斷流程為例。nova建立虛擬機器時,會呼叫nova/compute/api.py中API類的_check_create_policies方法根據policy.json檔案內容進行操作許可權的判斷,而該方法最終會呼叫nova/policy.py中的enforce方法:

如果我們想知道程式執行到此時,context中到底有什麼內容,那麼我們可以修改檔案如下,注意對比上面程式碼新增的4行:

LOG =logging.getLogger(_name_);

LOG.debug(‘*’*20)

LOG.debug(credentials)

LOG.debug(‘*’*20)

Raise exception.PolicyNotAuthorized(action=action)

需要注意是:要在檔案的開頭處將logging引入,同時,定義:

LOG = logging.getLogger(__name__)

我們列印兩行*號以便快速定位日誌,同時將context內容打印出來,並顯式的丟擲一個異常讓本次處理停止。

3      編譯檔案

檔案修改完,必須經過編譯並把原始檔和編譯後的檔案覆蓋現有工程中相應的檔案。python中提供了很方便的模組對原始檔進行編譯,我們可以把如下內容儲存到一個指令碼中並執行:

(echo 'import py_compile'; echo'py_compile.compile(r"/root/pydir/policy.py",r"/root/pydir/policy.pyc")') | python 

簡單解釋:/root/pydir/policy.py為原始檔,/root/pydir/policy.pyc是你想要將編譯後的檔案放在哪。

4      實驗

分別將policy.py檔案和policy.pyc檔案替換/usr/share/pyshared/nova/policy.py和/usr/lib/python2.7/dist-packages/nova/policy.pyc(強烈建議在替換前先備份原來的檔案!)

重啟nova各個程序:

cd /etc/init.d/; for i in $( ls nova-* ); do sudoservice $i restart; done

隨便呼叫任意一個nova命令,如nova list,將會得到以下輸出:

說明我們的修改生效。開啟日誌,可以看到context中的具體內容。

路徑為/var/log/nova-*.log.