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