openstack: не работает новый Python API

Попытка следовать простому учебнику по API-интерфейсу openstack python, который я нашел по адресу http://docs.openstack.org/developer/python-novaclient/api.html но, похоже, не работает. Когда я пытаюсь бежать

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, который работает. Не могу понять, в чем может быть проблема.

3 ответа

Решение

Решил проблему: не уверен почему, openstack пожаловался на отсутствие пользовательского домена в auth (не помню точно сообщение об ошибке). Не удалось найти, как сообщить домен пользователя в Новой, но я нашел его на 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

Вы используете 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 работает нормально, но скрипт / интерпретатор не работает, так что это определенно потому, что вы неправильно инициализировали 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')

рекомендуется, если вы попытаетесь сделать что-то неправильно, это может вызвать проблемы.

Другие вопросы по тегам