Cobra SDK を使用して、このワークフローに概ね従っている MIT を操作します。
- 操作するオブジェクトを特定します。
- 属性を変更する、あるいは子オブジェクトを追加または削除する要求を構築します。
- オブジェクトに加えた変更をコミットします。
たとえば、新しいテナントを作成する場合は、まず、MIT のどこにテナントが配置されるか、この場合は、policy Universe の監視対象オブジェクトの子オブジェクト(polUniMo)を特定します。
import cobra.model.pol
polUniMo = cobra.model.pol.Uni('')
polUniMo オブジェクトを定義すると、テナント オブジェクトを polUniMo の子として作成できます。
import cobra.model.fv
tenantMo = cobra.model.fv.Tenant(polUniMo, 'cisco')
これらのすべての操作によって作成されるのは、Python オブジェクトだけです。構成を適用するには、その構成をコミットする必要があります。これを行うには、ConfigRequest というオブジェクトを使用します。ConfigRequest は、単一コンテキストに分類される MO ベースのクラスのコンテナとして機能し、単一のアトミック POST 操作にすべてコミットできます。
import cobra.mit.request
config = cobra.mit.request.ConfigRequest()
config.addMo(tenantMo)
md.commit(config)
ConfigRequest オブジェクトが作成された後、tenantMo オブジェクトが要求に追加されたら、その構成を MoDirectory オブジェクトを使用してコミットします。
先の例では、最初のステップで polUni オブジェクトのローカル コピーを構築します。命名プロパティがないため(二重の空の単一引用符によって反映されている)、MIT でルックアップしてオブジェクトの完全な Dn を把握する必要がありません。常に uni として知られています。
MIT により詳細なものをポストする場合で、オブジェクトに命名プロパティがあるときは、そのオブジェクトのルックアップを実行する必要があります。たとえば、構成を既存のテナントにポストする場合は、そのテナントを照会し、その下にオブジェクトを作成します。
tenantMo = md.lookupByClass('fvTenant', propFilter='eq(fvTenant.name, "cisco")')
tenantMo = tenantMo[0] if tenantMo else None
その結果の tenantMo オブジェクトのクラスは cobra.model.fv.Tenant となり、.dn、.status、.name など、オブジェクト自体をすべて説明するプロパティが含まれます。lookupByClass() エントリはアレイを返します。これは、複数のオブジェクトを返すことができるためです。この場合、コマンドは限定的であり、特定の名前を使用して fvTenant オブジェクトでフィルタリングします。テナントの場合、name 属性は命名属性と呼ばれる特殊なタイプの属性です。命名属性は、ローカルの名前空間で一意である必要がある相対名の構築に使用されます。その結果、名前に関するフィルタを使用した fvTenant での lookupByClass は、長さ 1 または None のアレイ、つまり何も検出されなかったことを返します。
ルックアップを全面的に避けるには、Dn オブジェクトを構築し、その Dn の子オブジェクトを作成できます。この方法は、親オブジェクトが存在する場合にだけ有効です。
topDn = cobra.mit.naming.Dn.fromString('uni/tn-cisco')
fvAp = cobra.model.fv.Ap(topMo, name='AppProfile')
Cobra と対話するためのこのような基本的な方法によって、ネットワーク構成の自動化、トラブルシューティングの実行、およびネットワークの管理に役立てることができる、より複雑なワークフローの作成に必要な構成要素が提供されます。