2

尝试遵循我在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 相同的凭据,它可以工作。无法弄清楚可能是什么问题。

4

3 回答 3

1

您将 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)

更多可能有用的信息:

于 2015-11-13T22:29:15.633 回答
0

解决了这个问题:不知道为什么,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()

之后我使用 keystone 在 nova 中进行身份验证:

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

于 2015-11-17T15:16:55.537 回答
0

根据您的描述,CLI 工作正常,但脚本/解释器失败,所以这肯定是因为您以错误的方式初始化 novaclient.client.Client。

novaclient.client.Client 的用法取决于您使用的版本,但您的问题没有提供此类信息,因此目前我无法为您提供示例,您可以通过运行命令'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')

鼓励,当您尝试以错误的方式做某事时,它会暴露问题。

于 2015-11-15T04:24:48.467 回答