OpenStack NeutronのML2プラグインはどのようにドライバーを呼び出しているか

Neutron ML2プラグインについて

3rd Partyの製品を使う場合にはML2のメカニズムドライバーでの実装が増えて来ました。ML2は構成上タイプドライバーとメカニズムドライバーがあります。今回はざっくりとML2がどのようにメカニズムドライバーを呼び出しているかをみて、ドライバーの動作を理解する時の助けとします。処理の流れを理解しておくとSDN Controllerにどのような命令を実際に送るのかを見ることが出来ます。ML2のプラグインは起動時に指定されたMech_driverをリスト化しています。何らかの操作を行う場合は、まずprecommit+操作が呼び出されてます。precommitはDatabaseのTransaction中に呼び出されます。precommitはDriver側で必ずしも実装している必要はありません。その後実際の設定変更を行うpostcommit+操作が呼び出されます。以下のML2 Pluginのコードを見るとcreate_subnetが呼ばれると、それぞれcreate_subnet_precommitとcreate_subnet_postcommitを呼び出しているのがわかります。

def create_subnet(self, context, subnet):
     session = context.session
     with session.begin(subtransactions=True):
         result = super(Ml2Plugin, self).create_subnet(context, subnet)
         self.extension_manager.process_create_subnet(session, subnetresult)
         mech_context = driver_context.SubnetContext(self, context, result)
         self.mechanism_manager.create_subnet_precommit(mech_context)
     try:
       self.mechanism_manager.create_subnet_postcommit(mech_context)
     except ml2_exc.MechanismDriverError:
         with excutils.save_and_reraise_exception():
             LOG.error(_LE("mechanism_manager.create_subnet_postcommit "
                                     "failed, deleting subnet '%s'"), result['id'])
             self.delete_subnet(context, result['id'])
   return result

Precommitの処理

Precommitは多くは実装されていないことが多いですが、以下CiscoのAPICドライバー中のPrecommitの処理をサンプルとして挙げます。

def update_port_precommit(self, context):
 orig = context.original
 curr = context.current
 if (orig['device_owner'] != curr['device_owner']
 or orig['device_id'] != curr['device_id']):
 raise exc.ApicOperationNotSupported(
 resource='Port', msg='Port device owner and id cannot be '
 'changed.')

PostCommitの処理

多くのMechanizm DriverはPostcommitで処理を実装しています。以下Bigswitchの実装例を挙げます。BigswitchのMechanizm Driverは実装済みの上位のBigswitch Pluginを指し示しています。いくつかのDriverはこのような構成を取っています。

@put_context_in_serverpool
 def create_port_postcommit(self, context):
    # create port on the network controller
    port = self._prepare_port_for_controller(context)
    if port:
    self.async_port_create(port["network"]["tenant_id"],
    port["network"]["id"], port)
広告
OpenStack NeutronのML2プラグインはどのようにドライバーを呼び出しているか

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中