openstack: novaclient Python API 不工作
openstack: novaclient Python API not working
尝试遵循我在 http://docs.openstack.org/developer/python-novaclient/api.html 找到的 openstack python API 的简单教程,但似乎没有用。当我尝试 运行
nova.servers.list()
或
nova.flavors.list()
从 python 解释器的教程中,我得到以下错误:
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/novaclient/v2/servers.py", line 617, in list
return self._list("/servers%s%s" % (detail, query_string), "servers")
File "/usr/lib/python2.7/dist-packages/novaclient/base.py", line 64, in _list
_resp, body = self.api.client.get(url)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 440, in get
return self._cs_request(url, 'GET', **kwargs)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 399, in _cs_request
self.authenticate()
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 569, in authenticate
self._v2_auth(auth_url)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 634, in _v2_auth
return self._authenticate(url, body)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 647, in _authenticate
**kwargs)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 392, in _time_request
resp, body = self.request(url, method, **kwargs)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 386, in request
raise exceptions.from_response(resp, body, url, method)
novaclient.exceptions.NotFound: The resource could not be found. (HTTP 404)
我使用与 admin_openrc.sh 相同的凭据,这很有效。无法弄清楚可能是什么问题。
您正在使用 python-novaclient 作为一个库,它从来没有被设计成这样使用。不幸的是,人们将其用作库的 CLI。
试用官方 Python OpenStack SDK。
pip install openstacksdk
用于列出服务器或风味的代码。
import sys
from openstack import connection
from openstack import profile
from openstack import utils
utils.enable_logging(True, stream=sys.stdout)
prof = profile.Profile()
prof.set_region(prof.ALL, 'RegionOne')
conn = connection.Connection(
auth_url='http://my.openstack.com:5000/v2.0',
profile=prof,
username='demo',
project_name='demo',
password='demo')
for server in conn.compute.servers():
print(server)
for flavor in conn.compute.flavors():
print(flavor)
更多可能也有帮助的信息:
根据您的描述,CLI 工作正常但 script/interpreter 失败,所以这肯定是因为您以错误的方式初始化 novaclient.client.Client。
novaclient.client.Client的用法取决于你使用的是什么版本,但是你的问题没有提供这样的信息,所以目前我无法为你提供示例,你可以通过[=27=查看] 命令 'nova --version'。
您可以从 python-novaclient http://docs.openstack.org/developer/python-novaclient/api.html
的开发者文档中获得帮助
请记住,最好使用关键字参数而不是普通参数,这意味着
nc = client.Client(version=2, user='admin', password='password',
project_id='12345678', auth_url='http://127.0.0.1:5000')
鼓励,当你试图以错误的方式做某事时,它会暴露问题。
解决了问题:不知道为什么,openstack 抱怨 auth 中缺少用户域(不记得确切的消息错误)。无法在 nova 中找到如何通知用户域,但我在 keystone 上找到了!
from keystoneclient.auth.identity import v3
from keystoneclient import session
from keystoneclient.v3 import client
auth_url = 'http://10.37.135.89:5000/v3/'
username = 'admin'
user_domain_name = 'Default'
project_name = 'admin'
project_domain_name = 'Default'
password = '123456'
auth = v3.Password(auth_url=auth_url,
username=username,
password=password,
project_id='d5eef1aae54742e787d0653eea57254b',
user_domain_name=user_domain_name)
sess = session.Session(auth=auth)
keystone = client.Client(session=sess)
keystone.projects.list()
然后我在 nova 中使用 keystone 进行身份验证:
from novaclient import client
nova = client.Client(2, session=keystone.session)
nova.flavors.list()
我用于此答案的一些有用链接:
http://docs.openstack.org/developer/python-keystoneclient/authentication-plugins.html
http://docs.openstack.org/developer/python-keystoneclient/using-api-v3.html
http://docs.openstack.org/developer/python-novaclient/api.html
尝试遵循我在 http://docs.openstack.org/developer/python-novaclient/api.html 找到的 openstack python API 的简单教程,但似乎没有用。当我尝试 运行
nova.servers.list()
或
nova.flavors.list()
从 python 解释器的教程中,我得到以下错误:
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/novaclient/v2/servers.py", line 617, in list
return self._list("/servers%s%s" % (detail, query_string), "servers")
File "/usr/lib/python2.7/dist-packages/novaclient/base.py", line 64, in _list
_resp, body = self.api.client.get(url)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 440, in get
return self._cs_request(url, 'GET', **kwargs)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 399, in _cs_request
self.authenticate()
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 569, in authenticate
self._v2_auth(auth_url)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 634, in _v2_auth
return self._authenticate(url, body)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 647, in _authenticate
**kwargs)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 392, in _time_request
resp, body = self.request(url, method, **kwargs)
File "/usr/lib/python2.7/dist-packages/novaclient/client.py", line 386, in request
raise exceptions.from_response(resp, body, url, method)
novaclient.exceptions.NotFound: The resource could not be found. (HTTP 404)
我使用与 admin_openrc.sh 相同的凭据,这很有效。无法弄清楚可能是什么问题。
您正在使用 python-novaclient 作为一个库,它从来没有被设计成这样使用。不幸的是,人们将其用作库的 CLI。
试用官方 Python OpenStack SDK。
pip install openstacksdk
用于列出服务器或风味的代码。
import sys
from openstack import connection
from openstack import profile
from openstack import utils
utils.enable_logging(True, stream=sys.stdout)
prof = profile.Profile()
prof.set_region(prof.ALL, 'RegionOne')
conn = connection.Connection(
auth_url='http://my.openstack.com:5000/v2.0',
profile=prof,
username='demo',
project_name='demo',
password='demo')
for server in conn.compute.servers():
print(server)
for flavor in conn.compute.flavors():
print(flavor)
更多可能也有帮助的信息:
根据您的描述,CLI 工作正常但 script/interpreter 失败,所以这肯定是因为您以错误的方式初始化 novaclient.client.Client。
novaclient.client.Client的用法取决于你使用的是什么版本,但是你的问题没有提供这样的信息,所以目前我无法为你提供示例,你可以通过[=27=查看] 命令 'nova --version'。
您可以从 python-novaclient http://docs.openstack.org/developer/python-novaclient/api.html
的开发者文档中获得帮助请记住,最好使用关键字参数而不是普通参数,这意味着
nc = client.Client(version=2, user='admin', password='password',
project_id='12345678', auth_url='http://127.0.0.1:5000')
鼓励,当你试图以错误的方式做某事时,它会暴露问题。
解决了问题:不知道为什么,openstack 抱怨 auth 中缺少用户域(不记得确切的消息错误)。无法在 nova 中找到如何通知用户域,但我在 keystone 上找到了!
from keystoneclient.auth.identity import v3
from keystoneclient import session
from keystoneclient.v3 import client
auth_url = 'http://10.37.135.89:5000/v3/'
username = 'admin'
user_domain_name = 'Default'
project_name = 'admin'
project_domain_name = 'Default'
password = '123456'
auth = v3.Password(auth_url=auth_url,
username=username,
password=password,
project_id='d5eef1aae54742e787d0653eea57254b',
user_domain_name=user_domain_name)
sess = session.Session(auth=auth)
keystone = client.Client(session=sess)
keystone.projects.list()
然后我在 nova 中使用 keystone 进行身份验证:
from novaclient import client
nova = client.Client(2, session=keystone.session)
nova.flavors.list()
我用于此答案的一些有用链接:
http://docs.openstack.org/developer/python-keystoneclient/authentication-plugins.html http://docs.openstack.org/developer/python-keystoneclient/using-api-v3.html http://docs.openstack.org/developer/python-novaclient/api.html