共通コンテキスト

Qmonus SDKでは、Scenarioサーバで定義管理するプラグインを様々なプログラミングスポットから利用するための共通コンテキストを提供しています。 これにより、様々なプラグインから共通的に利用する部品をモジュール化することが可能になります。

context

プラグインモジュール、及びファンクションを格納するダイナミックコンテキストです。modulefunctionリソースを作成すると本コンテキスト配下に収容され、すぐに利用することができます。

プラグインモジュールに含まれる関数呼び出しは以下のように記述します。

# sampleModuleのhello関数を呼び出す例
context.sampleModule.hello()

プラグインファンクション関数呼び出しは以下のように記述します。

# sampleFunction関数を呼び出す例
context.sampleFunction()

Tip

プラグインモジュールやファンクションの実行空間でも後述するatommodelのリファレンスを利用できます。

Note

Scenarioのプログラミング空間におけるcontextには、プラグインモジュール/ファンクション以外にHTTPセッションに関する情報が追加で格納されます。詳しくは、Scenarioにおけるプログラミングの章を参照してください。

Warning

import文使用時の注意事項
作成した Module, Function をimport文でimportしようとすると想定した動作にならない可能性があります。Qmonus SDK ではcontextを使用するようにしてください。


atom

ATOMクラスを格納するダイナミックコンテキストです。classリソースを作成すると本コンテキスト配下にクラスオブジェクトが収容され、すぐに利用することができます。

o = atom.Human(name="Adam")


ATOMインスタンスは、上述したコンストラクタによる生成以外にATOMコンテキストのatom.instantiationクラスメソッドで生成する方法があります。
atom.instantiationは、yamlもしくはjson文字列、あるいはdictのインスタンス化パラメータからインスタンスを生成します。

>>> yamltext = """↵
... Tenant:↵
...   tenant_name: hoge↵
...   networks:↵
...   - Network:↵
...       name: nw1↵
...       subnets:↵
...       - Subnet:↵
...           name: subnw1↵
...       - Subnet:↵
...           name: subnw2↵
... """↵
... ↵
↵
>>> tenant = await atom.instantiation(yamltext)↵
... print(tenant)↵
... ↵
↵
Tenant(instance='VGVuYW50OjhhYzczYWMyM2I0MjExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, tenant_id=None, tenant_name='hoge', description=None, networks=[Network(instance='TmV0d29yazo4YWM2Y2FlMjNiNDIxMWViOGFkMmFjZGU0ODAwMTEyMg==', xid=None, xname=None, id=None, name='nw1', description=None, status=None, tenant_id=None, subnets=[Subnet(instance='U3VibmV0OjhhYzZiMGU4M2I0MjExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw1', description=None, status=None, tenant_id=None, network_id=None), Subnet(instance='U3VibmV0OjhhYzZiZWRhM2I0MjExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw2', description=None, status=None, tenant_id=None, network_id=None)])])
>>>

Tip

atom.instantiationに渡すデータはリスト型もサポートされています。以下のようにリスト型の場合は、インスタンスのリストが返却されます。

>>> yamltext = """↵
... - Tenant:↵
...     tenant_name: hoge1↵
...     networks:↵
...     - Network:↵
...         name: nw1↵
...         subnets:↵
...         - Subnet:↵
...             name: subnw1↵
...         - Subnet:↵
...             name: subnw2↵
... - Tenant:↵
...     tenant_name: hoge2↵
...     networks:↵
...     - Network:↵
...         name: nw2↵
...         subnets:↵
...         - Subnet:↵
...             name: subnw3↵
...         - Subnet:↵
...             name: subnw4↵
... - Example:↵
...     name: test↵
... """↵
... ↵
↵
>>> instances = await atom.instantiation(yamltext)↵
>>> print(instances)↵
... ↵
↵
[Tenant(instance='VGVuYW50OjQ5MzZiN2ZjM2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, tenant_id=None, tenant_name='hoge1', description=None, networks=[Network(instance='TmV0d29yazo0OTM2NWRjYTNiNDQxMWViOGFkMmFjZGU0ODAwMTEyMg==', xid=None, xname=None, id=None, name='nw1', description=None, status=None, tenant_id=None, subnets=[Subnet(instance='U3VibmV0OjQ5MzY0ODA4M2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw1', description=None, status=None, tenant_id=None, network_id=None), Subnet(instance='U3VibmV0OjQ5MzY1NDEwM2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw2', description=None, status=None, tenant_id=None, network_id=None)])]), Tenant(instance='VGVuYW50OjQ5MzgzMGQyM2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, tenant_id=None, tenant_name='hoge2', description=None, networks=[Network(instance='TmV0d29yazo0OTM3ZTU4MjNiNDQxMWViOGFkMmFjZGU0ODAwMTEyMg==', xid=None, xname=None, id=None, name='nw2', description=None, status=None, tenant_id=None, subnets=[Subnet(instance='U3VibmV0OjQ5MzdkNDhlM2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw3', description=None, status=None, tenant_id=None, network_id=None), Subnet(instance='U3VibmV0OjQ5MzdkZDc2M2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw4', description=None, status=None, tenant_id=None, network_id=None)])]), Example(instance='RXhhbXBsZTo0OTM5NWM3ODNiNDQxMWViOGFkMmFjZGU0ODAwMTEyMg==', xid=None, xname=None, name='test', region=None, description=None, hogeID=None, createdAt=None)]
>>>


model

データベーステーブルを格納するダイナミックORM(Object-relational mapping)コンテキストです。modelschemaもしくはclassリソースを作成すると本コンテキスト配下にテーブルオブジェクトが収容され、すぐに利用することができます。

データベース接続は、次の構文でasync withを使用する必要があります。model配下には、データベース接続機能を提供するaiodbコンテキストマネージャとプラグインによって生成されたテーブルオブジェクトが格納されています。

async with model.aiodb() as conn:
    cursor = await conn.execute(model.employee.select())
    employees = await cursor.fetchall()

データベーストランザクションは以下のように記述します。

async with model.aiodb() as conn:
    async with conn.begin() as tran:
        cursor = await conn.execute(model.employee.select().where(model.employee.c.status=="retired"))
        employees = await cursor.fetchall()
        [await conn.execute(model.employee.delete().where(model.employee.c.id==i.id)) for i in employees]

SQL組込クラスを利用して以下のような記述も可能です。

# SQLAlchemy
employees = await SQL.run(model.employee.select())

# Raw SQL statement
employees = await SQL.run("SELECT * FROM employee;")

# When using SQL function in transaction scope
async with model.aiodb() as conn:
    async with conn.begin() as tran:
        employees = await SQL.run(model.employee.select(), conn=conn)