neutron(quantum)のopenvswitchエージェント用構成管理テーブルは誰が作るん?

忘れないようにメモしておく。
あぁようやくnova-computeまで到達したのに、quantum-openvswitch-agentに逆戻り...

■neutronのopenvswitchエージェント用構成管理テーブル

以下のようなサーバがいて、

192.168.100.1 -> CloudController
192.168.100.2 -> Network Node
192.168.100.3 -> Compute Node

データベースは他のコンポーネントと同様に、こんな感じで手動で作るとして、

mysql> CREATE DATABASE quantum;
mysql> GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'changeme';
mysql> GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'192.168.100.1' IDENTIFIED BY 'changeme';
mysql> GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'192.168.100.2' IDENTIFIED BY 'changeme';
mysql> GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'192.168.100.3' IDENTIFIED BY 'changeme';
mysql> flush privileges;

neutronでopenvswitch-agentを利用するためには、構成管理用にデータベースと以下のようなテーブルが必要になる。

+---------------------------+
| Tables_in_quantum         |
+---------------------------+
| agents                    |
| dnsnameservers            |
| externalnetworks          |
| floatingips               |
| ipallocationpools         |
| ipallocations             |
| ipavailabilityranges      |
| networkdhcpagentbindings  |
| networks                  |
| ovs_network_bindings      |
| ovs_tunnel_allocations    |
| ovs_tunnel_endpoints      |
| ovs_tunnel_ips            |
| ovs_vlan_allocations      |
| ports                     |
| quotas                    |
| routerl3agentbindings     |
| routerroutes              |
| routers                   |
| securitygroupportbindings |
| securitygrouprules        |
| securitygroups            |
| subnetroutes              |
| subnets                   |
+---------------------------+

困ったのは、「誰」が「いつ」作るんだろうということ。
novaであれば、構成管理データベースは明示的にnova-manage db syncで作成するんだけれどneutronでは、このようなコマンドは提供されていない。

このデータベースが存在しないままNetworkノードやComputeノードでquantum-openvswitch-agentを起動しようとすると、以下のように

quantum.plugins.openvswitch.agent.ovs_quantum_agent] Unable to sync tunnel IP 192.168.100.2: Remote error: OperationalError (OperationalError) no such table: ovs_tunnel_endpoints u'SELECT ovs_tunnel_endpoints.ip_address AS ovs_tunnel_endpoints_ip_address, ovs_tunnel_endpoints.id AS ovs_tunnel_endpoints_id \nFROM ovs_tunnel_endpoints \nWHERE ovs_tunnel_endpoints.ip_address = ?' (u'192.168.100.2',)

agentが激怒して起動してくれない。そりゃ怒るわ。

■このテーブルって誰がいつ作るの?

どうやら quantum-server が quantum.conf内の core_plugin で指定されているパラメータ(OVSQuantumPluginV2)にしたがって ovs_quantum_plugin の中で定義されている同名のクラスを読み込んでいるみたい。

plugins/openvswitch/ovs_quantum_plugin.pyを抜粋
class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                         extraroute_db.ExtraRoute_db_mixin,
                         sg_db_rpc.SecurityGroupServerRpcMixin,
                         agentschedulers_db.AgentSchedulerDbMixin):
    <...中略...>
    def __init__(self, configfile=None):
        ovs_db_v2.initialize()
    <...以下略...>
plugins/openvswitch/ovs_db_v2.pyを抜粋
def initialize():
    db.configure_db()
db/api.pyを抜粋
def configure_db():
    <...中略...>
        if not register_models():
            if cfg.CONF.DATABASE.reconnect_interval:
                remaining = cfg.CONF.DATABASE.sql_max_retries
                reconnect_interval = cfg.CONF.DATABASE.reconnect_interval
                retry_registration(remaining, reconnect_interval)
    <...中略...>

def register_models(base=BASE):
    """Register Models and create properties"""
    global _ENGINE
    assert _ENGINE
    try:
        base.metadata.create_all(_ENGINE)           <-- ココで作ってる
    except sql.exc.OperationalError as e:
        LOG.info(_("Database registration exception: %s"), e)
        return False
    return True

このようにプラグイン(OVSQuantumPluginV2)が読み込まれてSQLAlchemyのcreate_all()が流れることでテーブルが作られる。

■まとめ

quantum-serverを動かすノードでは、
1) quantum.conf で core_plugin を指定する
2) ovs_quantum_plugin.ini で sql_connection を設定する
3) デフォルトのパス以外に上記2つのファイルを置く場合は --config-file を2つ書いてそれぞれを指定する
ということみたい。

quantum.confを抜粋
core_plugin = quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2
ovs_quantum_plugin.iniを抜粋
sql_connection = mysql://quantum:changeme@192.168.100.1/quantum
quantum-server起動時の指定例
$ quantum-openvswitch-agent --config-file /usr/local/etc/quantum.conf --config-file /usr/local/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini -d -v

quantum-serverに対して--config-fileじゃなくてnova-*と同様に--config-dirで指定できるとディレクトリ指定だけで済むので楽でいいんだけど、どうもquantumは--config-dirが効いてない気がする。
これまで追いかけているといつまでも終わらないので今日はここまで。