Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
32
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@tfukushima

入門 MidoNet

まえ書き

こんにちは、@tfukushima です。今回がQiitaへの初投稿となります。よろしくお願いします。今SpainはBarcelonaからこの記事を投稿しています。Barcelonaの写真が見たい方はこちらへどうぞ。

Note: 本文中にこのようないくつかのNoteを書きましたが、基本的には読むのは必須ではなく、興味のある場合のみ読んでいただくのが良いと思います。

MidoNetとは

midonet-logo.png

MidoNetはオープンソースのクラウドIaaS向けネットワーク仮想化プラットフォームです。以下の機能を提供します。

  • 完全に仮想化されたL2L3そしてL4のネットワーキング
  • VLANレス VLAN
    • 従来のVLANの限界に縛られない仮想的なL2のアイソレーションとスイッチング
  • VXLANサポート
    • VXLAN tunnel zonesとVXLAN L2 Gateway
  • Single point of failure(SPoF; 単一障害点)のない完全な分散アーキテクチャ
  • 仮想L3分散ルーティング
  • BGPサポート
  • 分散ロードバランサ・ファイアウォール
  • ステートフルおよびステートレスなNAT
  • 遅延なしNATコネクショントラッキング
  • Access Control Lists (ACLs)
  • RESTful API
  • ネットワークサービスのモニタリング

Screen Shot 2014-12-01 at 12.34.29 PM.png

主な情報源

過去の発表スライド

MidoNetのコンポーネント

MidoNet Architecture Overview.png

Network State Database(NSDB)

Screen Shot 2015-02-14 at 10.59.01 PM.png

仮想ネットワークのトポロジを保存しておく場所です。すべての仮想ネットワーキングで必要な情報が保存されていて、SPoFになることを避けるためにレプリケーションされています。現在のMidoNetではZooKeeperとCassandraが使用されています。

Datapath

名前の通り、datapathは各ホストに存在しVM間やホスト外部のネットワークと接続されているパケットの通り道です。実際にはdatapathはMidoNetの一部ではなく、MidoNetのrequirementsの一つになります。現在のMidoNetではLinux Kernelのmainlineに統合されたOpen vSwitch Data path (ODP)をサポートしています。

Note: Open vSwitch(OVS)とOpen vSwitch Datapath(ODP)
OVSは二つの部分に分かれています。kernel spaceに存在するdatapath(ODP)とuserlandに存在するそれを管理するユーティリティ群です。OpenFlowプロトコルを実装しているovs-vswitchdなどはuserlandにありますが、MidoNetではこれらuserlandに存在するOVSの機能は必要な場面以外では基本的に使用しておらず、ODPのみ利用しています。ODPとはNetlinkで直接やりとりしています。

他にもIntel DPDKを使用して高速なスイッチングを行なうことを目的としたIntel® DPDK vSwitch (OVDK)や総務省後援のO3プロジェクトの一部であるLagopusなどが存在します。

Note: OVDKの死
先日IntelがOVSのフォークを止めてOVDKの開発を中止し、OVSのmainstreamにコミットすることを決定しました。

Midolman

Screen Shot 2015-02-14 at 10.57.33 PM.png

Midolmanは各ホスト上に存在するagentで、NSDBの情報をキャッシュしており、ホスト上のVMからのトラフィックが通過するdatapathを制御します。実際にはパケットにマッチするflow ruleが無かった場合に起こるdatapathからのupcallに対応し、仮想ネットワークトポロジ上でのパケットフローをシミュレーションした上で導き出されたflow ruleを新たにdatapathへ追加します。

Note: OpenFlow controllerではないMidolman
Midolmanが登場した背景にはOpenFlowという規格の登場とOpenFlowに対応したソフトウェアによる仮想スイッチのリファレンス実装であるOpen vSwitchが関わっています。Midolmanは当初はuserlandの機能を含むOpen vSwitchを使用していましたが、現在はOpenFlowを実装しているとい言えるuserland部分を基本的に使用しておらず、独自のflow ruleによるforwardingを行なうようになっています。

MidolmanはNSDBをwatch(ZooKeeper用語; 一般的にはsubscribeまたはlisten)しており、仮想ネットワークトポロジの状態が更新された場合にはNSDBへ変更を書き出し、NSDBが変更をすべてのwatcherに通知します。

また、forwardすべきポートが別ホストのdatapathに存在する場合にはパケットをencapsulationして対象のホストへトンネリングします。

MidolmanはJavaとScalaで書かれています。パケットのシミュレーションを効率的に処理するためにFutureが多用され、RxJavaAkkaも使用されています。Midolmanの内部構造などは別途まとめられたら良いなぁ、と思っています。

Note: 元々はPythonで書かれていたMidolman
実はJavaで書き直される前にはMidolmanはPythonで書かれていました。若かりし頃の自分は「Pythonで何か面白いことができる!」と喜び勇んでいたのですが、ある日「Javaで書き直す」とCEO兼CTOに言われ、「えっ...」という感じで途方に暮れたり「C++じゃダメなのか?」と言ってみたり"Revenge of the Nerds"を見せてチクチク攻撃したりしながらもカウンターとしてScalaを導入した覚えがあります。ちなみに残念ながら歴史的にJava7で始められたMidolmanのJava部分はまだJava8で書かれていないのですが、移行による影響などを解決してから移行していく予定です。PythonはOpenStackとのインテグレーションや後述のMidoNet CLIなどで広く使用されています。ソフトウェアにもそれに関わる人間にも色々と歴史がありますね。

Midolmanはそのまま「ミドルマン」と発音します。middle man、middleware manのような意味で名付けられたようですが、実は詳細な経緯は僕も知りません。ちなみにMiddlemanというgemがありますが、関係ありません。

MidoNet REST API

Screen Shot 2015-02-14 at 11.02.17 PM.png

MidoNet REST APIはMidoNetの機能を使用するためのRESTfulなHTTP APIサーバです。以下にREST APIのドキュメントがまとめられています。

REST APIはAuthn/Authzなしで動かすことも可能ですが、MidoStackを使用して環境を構築した場合にはにはOpenStackのKeystoneが使用されています。

Note: 突然の死
折角MidoNet REST APIの説明をしてきましたが、MidoNet REST APIは将来的に取り除かれる予定です。MidoNet REST APIはNeutronによって置き替えられ、ユーザはNeutronの提供するREST APIを使用することになります。MidoNetを使用する場合にはNeutronのpluginとしてMidoNet Pluginが指定され、MidoNet PluginはRPCでNSDBとやりとりするproxyのような存在になる予定です。

MidoNet CLI

MidoNet CLIはMidoNet REST APIをコールするCLIです。もちろんcurlでも同様のことはできますが、毎回tokenをHTTPヘッダに指定しなければいけない手間などを考えるとずっと使いやすいと思います。

Note: 突然の死 パート2
折角MidoNet CLIの説明をしてきましたが、MidoNet CLIは将来的に取り除かれる予定です。MidoNet CLIはNeutron CLIによって置き替えられ、ユーザはNeutron CLIを使用してMidoNetの設定を行なうことになります。Neutron APIがOpenStackにおける仮想ネットワーク APIの標準となるためです。Neutron APIはPOSIX APIと似ていると言うとイメージしやすいかもしれません。

MidoNet Manager

いわゆるWebUIです。すみません、Midokura Enterprise MidoNet限定です。痛い、石を投げないで!

MidoNetをインストールする

MidoStackでインストール (推奨)

@jedipunkz さんがご自身のブログで早速試してくださった過程を書いてくださっています。ありがとうございます。

OpenStackに慣れていらっしゃるようで、というよりOpenStackでクラウド基盤を構築されている方のようで、途中でMidoStackが止まった場合でも最後まで到達されていて流石です。

MidoStackとは

MidoStackはDevStackにMidoNet用のパッチを適応し、一つのスクリプトを実行するだけでOpenStack+MidoNet環境を構築できるようにするプロジェクトです。MidoNet PluginがNeutronのpluginとして指定された上で基本的なMidoNetの設定が終わった状態の環境を作ることができます。CI上でのテスト環境を構築する際に使用されることもあります。

Note: DevStackは辛いよ
スクリプト一発でOpenStackの環境ができあがるDevStack、「何て素晴しいんだ!」と思われるかもしれません。確かにDevStackは素晴しいツールで、うまくscriptが実行し終った時は爽快ですね。しかし、実際に最後までscriptがうまく実行し切ることは実はなかなかありません。DevStackのmasterを使用すると失敗することは多々あります。理由はscriptがうまく動かない、Pythonパッケージのdependencyがおかしい、リポジトリが一時的にダウンしているなど様々です。DevStackは基本的にはShellScriptの集まりなので、途中で失敗したらそこで止まってしまいます。MidoStackはDevStackで環境を構築した後にMidoNet固有の設定を行なうので、途中DevStackが失敗してしまった場合にはMidoStackも失敗してしまいます。

MidoStackを実行するのはとても簡単です。以下のようにmidostackディレクトリにあるmidonet_stack.shを実行するだけです。最後に"Midostack has successfully completed in t seconds."(tはスクリプトの実行時間)というメッセージが出れば正常に完了したことになります。

$ cd midostack
midostack$ ./midonet_stack.sh
...
==================================
Executing post devstack scripts...
==================================
Executing /home/ubuntu/midostack/scripts/post_devstack.d/005.add_rootwrap_for_nova_neutron.sh... [OK]
Executing /home/ubuntu/midostack/scripts/post_devstack.d/010.setup_dot_midonetrc.sh... [OK]
Executing /home/ubuntu/midostack/scripts/post_devstack.d/015.install_midonet_cli.sh... [OK]
Executing /home/ubuntu/midostack/scripts/post_devstack.d/020.setup_fake_uplink.sh... [OK]
Executing /home/ubuntu/midostack/scripts/post_devstack.d/030.configure_libvirt.sh... [OK]
Midostack has successfully completed in _ seconds.

DevStack、MidoStackはシステムグローバルにdependencyをインストールしますので、手元の環境を汚したくない場合にはVagrantを使用してください。要求システムはmidostackのREADME.md"Requirements"では"Ubuntu 14.04 with 4GB of RAM + swap"となっています。割り当てメモリが少ないとDevStackが失敗することがありますので、注意してください。

もし途中でMidoStackが止まってしまうことがあった場合、まずはunstackしてから再びstackしてみましょう。

midostack$ ./midonet_unstack.sh
midostack$ ./midonet_stack.sh

Note: DockerとMidoNet
MidoStackが正常に終わるためには時間がかかり、DevStackに依存しているため最後まで走り切るとは必ずしも限りません。現在このプロセスを改善するためにMidoNetのDockerイメージを用意するという議論がML上で開始されています。

UPDATE

各Linuxディストリビュション向けの各MidoNetコンポーネント用Dockerfilefig.ymlを含むmidonet-dockerfileの提供を試験的に開始しました。midonet-dockerfielはOpenStackを含まずMidoNetコンポーネント(Midolman, MidoNet APIおよびMidoNet CLIに加えてZooKeeperとCassandra)のみを含むことに注意してください。

Vagrantを使用する場合 (推奨)

Vagrantfilemidostackトップディレクトリに含まれているので、それを使用してください。現在のmidostackディレクトリは/midostackへマウントされます。

$ git clone http://github.com/midonet/midostack
$ cd midostack
midostack$ vagrant up
...
midostack$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ cd /midostack
vagrant@vagrant-ubuntu-trusty-64:/midostack$ ./midonet_stack.sh
...
Midostack has successfully completed in 372 seconds.
vagrant@vagrant-ubuntu-trusty-64:/midostack$ screen -x mido

Bare metalなUbuntuマシンを使用する場合

再掲ですが、DevStack、MidoStackはシステムグローバルにdependencyをインストールしますので、手元の環境を汚したくない場合にはVagrantを使用してください。 僕はMidoStackを実行することで生じる損害に対する責任を何ら負いません。

$ git clone http://github.com/midonet/midostack
$ cd midostack
midostack$ ./midonet_stack.sh
...
Midostack has successfully completed in 372 seconds.
midostack$ screen -x mido

DockerとFigでインストール (Beta)

この方法ではDockerFigを使用してMidoStackを使用せず、MidoNetコンポーネントのみをインストールします。手軽にMidoNetがどのように構成されているのかを確認したり、開発やCIをする上で有用です。Dockerのインストール方法などは省略しますので、Docker公式サイトのドキュメントにて確認してください。

なお、DockerとFigでのインストールであってもkernel moduleとしてホストにODPをインストールしなければならず、システムグローバルな環境を汚染するので、Virtual BoxなどのVMを使用することをお勧めします。しつこく再掲して申し訳ありませんが、僕はDockerとFigによってMidoNetをインストールすることで生じる損害に対する責任を何ら負いません。

ODPがkernel moduleとしてロードされていることを確認

作成されるDockerイメージはホストにOpen vSwitchのkernel moduleがインストールされていることを仮定します。Ubuntuではopenvswitch-datapath-dkmsという名前でdebパッケージが提供されているので、aptなどでインストールしてください。インストール後は以下のコマンドでkernel moduleがロードされていることを確認してください。

$ sudo modprobe openvswitch
$ sudo lsmod | grep openvswitch
openvswitch            66901  0 
gre                    13796  1 openvswitch
vxlan                  37619  1 openvswitch
libcrc32c              12644  1 openvswitch

midonet-dockerfileをGitHubよりcloneする

各Linuxディストリビューション用のDockerfilefig.ymlより構成されているmidonet-dockerfileをGitHubのリポジトリよりcloneします。

$ git clone http://github.com/midonet/midonet-dockerfile

Figをインストール

Figがインストールされていない場合、以下のコマンドでインストールしてください。環境を汚染したくない場合、virtualenvvirtualenvwrapperを使用してください。

$ sudo pip install fig

FigでMidoNetをデプロイする

fig.ymlを含むmidonet-dockerfileのトップディレクトリで以下のコマンドを実行してください。

$ cd midonet-dockerfile
$ fig up -d

各コンポーネント用のDockerイメージが作成されます。

Creating midonetdockerfile_zookeeper_1...
Pulling image midonet/zookeeper...
e284c89a84c9: Download complete
511136ea3c5a: Download complete
01bf15a18638: Download complete
30541f8f3062: Download complete
e1cdf371fbde: Download complete
9bd07e480c5b: Download complete
b5b5adea0a69: Download complete
a1e9388d25b9: Download complete
7af7e7e33a06: Download complete
Status: Downloaded newer image for midonet/zookeeper
Creating midonetdockerfile_api_1...
Pulling image midonet/midonet-api...
5e17eb055344: Download complete
511136ea3c5a: Download complete
01bf15a18638: Download complete
30541f8f3062: Download complete
e1cdf371fbde: Download complete
9bd07e480c5b: Download complete
b5b5adea0a69: Download complete
2941ef71600c: Download complete
f4836f3f64c5: Download complete
7efb46c32c04: Download complete
cdb8a2b45b92: Download complete
0d988203b28b: Download complete
1a7edcccacbf: Download complete
376e5fbb72a5: Download complete
2c860c715c0e: Download complete
Status: Downloaded newer image for midonet/midonet-api
Creating midonetdockerfile_cli_1...
Pulling image midonet/midonet-cli...
c87db896136e: Download complete
511136ea3c5a: Download complete
01bf15a18638: Download complete
30541f8f3062: Download complete
e1cdf371fbde: Download complete
9bd07e480c5b: Download complete
b5b5adea0a69: Download complete
2941ef71600c: Download complete
f4836f3f64c5: Download complete
3570c94b2d03: Download complete
9d17148ea9f0: Download complete
cc20a98f046f: Download complete
dec0462f7520: Download complete
Status: Downloaded newer image for midonet/midonet-cli
Creating midonetdockerfile_cassandra_1...
Pulling image midonet/cassandra...
ee3236fd22a0: Download complete
511136ea3c5a: Download complete
01bf15a18638: Download complete
30541f8f3062: Download complete
e1cdf371fbde: Download complete
9bd07e480c5b: Download complete
b5b5adea0a69: Download complete
12ae10aae0ac: Download complete
b2b832a54354: Download complete
e53b3f9a60f0: Download complete
8e5b6d34687f: Download complete
efe6442e72ff: Download complete
7c2a037ae86e: Download complete
d3e5b2a59e11: Download complete
e3201e6e5432: Download complete
Status: Downloaded newer image for midonet/cassandra
Creating midonetdockerfile_midolman_1...
Pulling image midonet/midolman...
c44a66aaaa2e: Download complete
511136ea3c5a: Download complete
01bf15a18638: Download complete
30541f8f3062: Download complete
e1cdf371fbde: Download complete
9bd07e480c5b: Download complete
b5b5adea0a69: Download complete
5ba35a02097f: Download complete
508f1d1c564b: Download complete
97489ffb5d39: Download complete
7dca77f2fedf: Download complete
fdfb544601c7: Download complete
8e087fc50b13: Download complete
Status: Downloaded newer image for midonet/midolman

MidoNet CLIを試してみる

以下のコマンドでMidoNet CLIがインストールされたDockerイメージでmidonet-cliが実行されます。

$ fig run cli midonet-cli
midonet>

MidoStackを使用した場合と異なり、最初は何もリソースがありません。MidoStackではOpenStack用にProvider Routerなどが作成されていました。

midonet> list router
midonet> list bridge

現時点ではまだDockerやKubernetesなどとの直接的なインテグレーションはされておらず、midonet-dockerfileはDockerized MidoNetのみを提供するものです。

.debまたは.rpmでインストール

repo.midonet.orgよりダウンロードしてください。

インストール後の確認

"Midostack has successfully completed in t seconds."というメッセージが出てMidoStackが正常に完了した後にはmidoという名前でscreenセッションが作られます。これはDevStackがstackというscreenセッションを作成するのに倣っています。

このscreenセッションではMidoNetのコンポーネントを使用するのに必要な設定などが既に適応されています。以下のコマンドでscreenセッションへattachしてください。

$ screen -x mido

MidoNet CLIを試してみる

こちらも@komeiyさんが試してくださっています。

失礼ながらIRCで海外の方がブログに言及するまで寡聞にして存じ上げなかったのですが、このエントリ以外にもOpenStack関連のものだけでなく様々なトピックがあって大変参考になります。第20回日本OpenStackユーザ会(Neutron deep dive)に参加できなかったので、以下の記事はとてもありがたく読ませていただきました。

midoセッションに入った後、MidoNet CLI(以下CLI)を起動してみましょう。すべてのPATHなど必要な情報が設定されているため、以下のコマンドで起動できます。

$ midonet-cli
midonet>

試しにルータ(Router)やブリッジ(Bridge)を表示してみましょう。

midonet> list router
router router0 name MidoNet Provider Router state up
router router1 name router1 state up infilter chain0 outfilter chain1
midonet> list bridge
bridge bridge0 name public state up
bridge bridge1 name private state up

表示できたでしょうか?今度はルータやブリッジのポート(Port)を表示してみましょう。

midonet> list router router0 port
port port0 device router0 state up mac ac:ca:ba:1b:5a:a5 address 172.19.0.2 net 172.19.0.0/30
port port1 device router0 state up mac ac:ca:ba:cd:22:99 address 200.200.200.1 net 200.200.200.0/24 peer bridge0:port0
port port2 device router0 state up mac ac:ca:ba:9d:fb:ed address 169.254.255.1 net 169.254.255.0/30 peer router1:port0

デフォルトでCLIはインタラクティブモードになりますが、以下のように-eまたは--evalオプションで1コマンドのみ実行することもできます。

$ midonet-cli -e 'list router'
router 898f63ab-2b06-4448-a58d-4f8c50baf634 name MidoNet Provider Router state up
router d20f78e6-2bba-4290-b8d9-2658cdf3471f name router1 state up infilter 464f1b10-9172-4565-8d25-2b9511aa8ed8 outfilter 20b2a520-40c6-4a56-9a30-e235e26bfe96

これらのオプションは-hまたは--helpオプションを使用することで見ることができます。

$ midonet-cli -h
Usage: midonet-cli [options]

Options:
  -h, --help            show this help message and exit
  -A, --no-auth         Skip authentication
  --midonet-url=URL     Midonet API server URL
  -u USERNAME, --user=USERNAME
                        Username
  -i PROJECT_ID, --project-id=PROJECT_ID
                        Midonet Project ID
  --tenant=UUID         Tenant id
  -e, --eval            Evaluate a single command, given at the end of the
                        argument list
  -p, --password        Ask for password interactively
  -d, --debug           Enable debugging

Note: 困ったときのhelpdebug on/debug off
CLIを実行していると困る局面に遭遇することがあると思います。何をしたら良いか分からなければhelpコマンドを、何が起きてるか分からなくてデバッグ情報が欲しい場合にはdebug onコマンドを使用してデバッグモードに入ってみてください。デバッグモードから抜けるにはdebug offを使用してください。

ちなみにCLIはreadlineライクな補完機能を持っていますので、事あるごとにTabCtrl-Iを押して補完すると非常に便利です。例えば、list router router0まで入力してからTabを入力し、補完してみましょう。

midonet> list router router0 
port  route

routerというリソースのサブリソース(URIで言えば/routers/:routerId/portsなど)にportrouteというものがあることが分かります。他の場面でもこの補完機能は非常に強力ですので、是非試してみてください。

次に何かリソースを作成してみましょう。ルール(Rule)などがいいかもしれません。ルールはいわゆるflow ruleで、パケットに対するパターンマッチとそれに対してdispatchする処理を記述するこができます。ルールはチェイン(Chain)に複数含まれており、その順番(position)通りに適応されます。ChainとRuleを使用してNATなどを行なうことができます。ざっくり言えばiptablesのように使えます。では、簡単なルールを作ってみましょう。その前に、どのようなパラメータを渡せるのかdescribe(またはdesc)コマンドで調べてみましょう。

midonet> desc chain chain0 rule 
Object collections:
    <NONE>
Fields:
    id           ethertype  src-port              ip-address-group-dst  pos    
hw-src       src        dst-port              in-ports              type   
hw-src-mask  dst        flow                  out-ports             action 
hw-dst       proto      port-group            fragment-policy       jump-to
hw-dst-mask  tos        ip-address-group-src  chain                 target 

かなり色々ありそうですね。ルールは最もパラメータが多いリソースです。最初は小さく始めましょう。

midonet> create chain chain0 rule dst 8.8.8.8/32 type drop 
chain0:rule2

ルールを作成した時にchain0:rule2という結果が表示されました。全てのリソースにはUUIDが割り当てられますが、長い上に見にくいので簡単のためにこのようにリソース名+番号というエイリアス(Alias)を付けています。注意していただきたいのは、このエイリアスは現在のCLIセッションでのみ有効だということです。 次回CLIを起動した時はこのエイリアスが変わるかもしれません。エイリアスを使用したくない場合には-eオプションでノンインタラクティブモードを使用してください。

ところで、このルールは8.8.8.8(GoogleのDNSサーバ)へのパケット(dstで指定)をすべてドロップ(type dropで指定)します。これはヤバいルールですね。作った矢先なのですが、早速削除しましょう。

midonet> delete chain chain0 rule rule2

このようにCLIはREST APIのリソースの階層と対応するCRUD操作へのアクセスを簡単にします。より詳しい情報や目的別の設定方法などは下記オペレーションガイドを参照してください。

コントリビュートする

ここまででMidoNetに興味を持っていただけたら嬉しいのですが、もしコントリビュートされたいと思われたとしたらとても嬉しいです。ここではどのようにMidoNetへコントリビューとすれば良いかを説明します。

コントリビュートする方法の詳細は以下のようにREADME.mdやWikiに記述されています。

オープンソース前にはMidokura内部で独自にGerritをホストしていました。オープンソース化に伴なって、GitHubインテグレーション付きのGerritHubへ移行しました。GerritHubによってGitHubへポストされたPull Requestが簡単にインポートできます。

Note: なぜGitHubのPull Requestでなく、Gerritなのか?
GerritはAndroidChromiumOpenStackで使用されているコードレビューツールです。最近ではGoもGitHubへ移動しつつもコードレビューはGerritを使用することが決まりました。現在MidoNetはOpenStackのネットワークコンポーネントNeutronのバックエンドとして使用されることを想定されていて、コミットごとにgateと呼ばれるOpenStackのpre-commitテストがCIによって実行され、これによってNeutronの要件を満たすかを毎回チェックしています。また、それに加えてMidoNetのユニットテストやMidoNet Distributed Testing System (MDTS)によるgateも実行されます。OpenStackがGerritを採用しているためgateはGerritとの親和性が非常に高くなっています。MidokuraではNeutronのMidoNet pluginも開発しており、OpenStackの開発も同時に行なっているためワークフローを統一するという観点でGerritが採用されました。

OpenStackの開発者によるGitHubとGerritの比較が以下のリンクより辿れるので、よろしければご参照ください。

Contributor License Agreement (CLA)へサインする

以下のサイトへアクセスし、条項を読んだ後CLAへサインしてください。

git-reviewをインストールする

パッチをコードレビューシステムへ投稿するにはgit-reviewをインストールし、GerritサーバをGitのremoteリポジトリとして登録します。以下はグローバル環境へgit-reviewをインストールする方法ですが、環境を汚染したくない方はvitualenvvirtualenvwrapperを使用してください。

$ sudo pip install git-review

GerritHubをリモートリポジトリgerritとして登録する

git-reviewをインストール後にGerritHubをGitのremoteジポジトリに追加します。設定は.gitreviewに書いてあるので、以下のコマンドをMidoNetのトップディレクトリで実行するだけです。

$ git-review -s
$ git remote show gerrit
* remote gerrit
  Fetch URL: ssh://tfukushima@review.gerrithub.io:29418/midonet/midonet
  Push  URL: ssh://tfukushima@review.gerrithub.io:29418/midonet/midonet
  HEAD branch: master
  Remote branch:
    master tracked
  Local ref configured for 'git push':
    master pushes to master (local out of date)

コードを変更する

作業を開始する前に現在のワーキングツリーが最新であることを確かめておくと後でconflictが起きにくくなります。また、新たに作業用のブランチを作成すると良いでしょう。以下のコマンドでoriginmidonet/midonetのリモートリポジトリ名です。

$ git fetch origin
$ git checkout origin/master -b new_branch_name

ワーキングツリーでコードを変更し、コミットしましょう。コミットメッセージは英語で一行目にサマリを、2行目に空行を入れて3行目以降はコミットの詳細な説明を記述してください。コミットは-sオプションでsign-offを追加することが奨励されます。

$ git add -p
$ git commit -s

パッチを投稿する

ワーキングツリーでコードを変更してコミットを作成し、パッチを投稿する準備ができたところで現在のパッチが最新のmasterブランチへ適応できることを確認しましょう。

$ git fetch origin
$ git rebase origin/master

そしていよいよパッチをGerritHubへ投稿します。初めて投稿する時はドキドキしますね。git-reviewをインストールしていればgitコマンドにreviewというサブコマンドが追加されています。自分の変更が何であるかを示すために-tオプションで分かりやすいタグ名を付けておきましょう。ある機能を追加するためにパッチが複数あった場合にそれらをグルーピングするのにも役立ちます。

$ git review master -t tag

パッチが複数個あった場合には確認のプロンプトが出ますのでyesと入力してください。

Note: GerritとRietveld
Gerritはオランダ人の家具デザイナー/建築家のGerrit Rietveldにちなんで名付けられました。RietveldはGoogleの社内コードレビューツールであったMondrianのオープンソース版であり、Python作者のGuido van Rossumによって作られました。GerritはAndroid Open Source Projectが採用したGit向けレビューコードシステムの必要性から始まり、Rietveldへのパッチを経て現在ではGoogle App Engine上のPython実装からJ2EEサーブレットコンテナ上のJavaアプリケーションとなっています。

まとめ

この記事ではMidoNetの概要と導入を紹介しました。より詳細なアーキテクチャやコードの説明は追って投稿したいと思います。待てない方はdocs以下にあるドキュメント、例えばmidolman.mdから始めてみるのが良いと思います。また、英語になりますがMidolmanのcode walk-throughをYouTube上でプレイリストとして公開しています。ご興味のある方はぜひご覧ください。Chromecastで大画面に写して見ると快適かもしれません。

Disclosure

私はMidoNetを開発しているMidokuraで働いています。しかし、MidoNetコミュニティでの活動で述べられていることは私の個人的な意見に基づくものであり、私の雇用者には一切の関係はありません。この記事は勤務中および勤務外に書かれましたが、現在は会社の出張でSpainのBarcelonaへ来ています。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
32
Help us understand the problem. What are the problem?