Keystoneの認証を利用してOpenStack APIを利用する
OpenStackをAPIでいろいろ操作する必要が出てきたので、OpenStack SDKに入門したのですが、微妙に躓いたのでメモを残して置きます。
2018年7月28日での話
実現したかったこと
自分が利用するOpenStack環境は、各エンドポイントがURLパスではなくドメインで分割されていたので、以下を実現したかった。
- keystoneに対して認証して
- 各エンドポイントに対してAPIをコールする
kestone認証を利用する
keystoneでsession情報を取得し、他の各クライアントにsession情報を引数で渡す。
以下のような感じでSDKを利用しておけば良い気がする。
pre requirement
pip install python-novaclient python-glanceclient python-keystoneclient
コード
import os from keystoneauth1.identity import v3 from keystoneauth1 import session from glanceclient import Client from novaclient import client as novaclient def get_keystone_credential(): return { 'auth_url': os.getenv('OS_AUTH_URL', ''), 'user_id': os.getenv('OS_USER_ID', ''), 'password': os.getenv('OS_PASSWORD', ''), 'project_id': os.getenv('OS_PROJECT_ID', ''), } if __name__ == '__main__': auth = v3.Password(**get_keystone_credential()) sess = session.Session(auth=auth) glance = Client('2', session=sess) print("---images---") for image in glance.images.list(): print(image['name']) print("---servers---") nova = novaclient.Client('2', session=sess) for s in nova.servers.list(): print(s.name)
エンドポイントを指定する
こちらに関しては、利用したい各クライアントによって指定方法が異なる気がする。
glanceなら Clientを生成するときの引数で endpoint
を指定するし、
https://github.com/openstack/python-glanceclient/blob/master/glanceclient/client.py#L23
novaだとhttps://github.com/openstack/python-novaclient/blob/master/novaclient/client.py#L270 から生成されるであろう https://github.com/openstack/python-novaclient/blob/master/novaclient/v2/client.py#L50 には endpoint_override
という引数で指定できそう
ココらへんのことを書いてあるドキュメントを見つけられず、コードを読んで結論を出したので、もしかしたらもっと良い方法があるかもしれない。
反省点
軽い気持ちでSDKというくくりの日本語ドキュメントを読み始めたのが間違いだった。
各クライアントのドキュメントを読むと良い気がする。
OpenStack Docs: Python bindings to the OpenStack Identity API (Keystone)
OpenStack Docs: Python Bindings for the OpenStack Images API