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