Как я могу аутентифицировать сессию Nova с python-novaclient?

Я пытаюсь настроить клиент nova и убедиться в отсутствии ошибок аутентификации при создании клиента. Моя попытка ниже:

from novaclient import client
from keystoneauth1 import session
from keystoneauth1.identity import v3

def setup_nova(creds):
    """
    Creates a nova instance with which we can leverage the OpenStack virtualization
    platform.

    :param creds: A dictionary containing the authorization url, username,
                  password, version, and project ID associated with the OpenStack
                  cluster.
    :type creds: dict
    """
    password = v3.PasswordMethod(username=creds['USERNAME'],
                                 password=creds['PASSWORD'],
                                 user_domain_name='default')

    auth = v3.Auth(auth_url=creds['AUTH_URL'],
                   auth_methods=[password],
                   project_id=creds['PROJECT_ID'])

    sess = session.Session(auth=auth)
    nova = client.Client(creds['VERSION'], session=sess)
    nova.authenticate()
    return nova

Тем не менее nova.authenticate() вызов бросает novaclient.exceptions.InvalidUsage который говорит мне, чтобы аутентифицировать объект Session. Однако объект Session, похоже, не имеет способа аутентификации.

Хотя OpenStack будет пытаться выполнить аутентификацию по первому запросу и кэшировать аутентификацию, я бы предпочел немедленно узнать, авторизован ли пользователь делать запросы на основе предоставленных учетных данных.

Как я могу аутентифицировать объект сеанса по требованию?

1 ответ

Возможно, вы можете попробовать использовать пример документа keystoneclient, показанный ниже, для аутентификации сеанса nova:

>>> from keystoneauth1.identity import v3
>>> from keystoneauth1 import session
>>> from keystoneclient.v3 import client

>>> auth = v3.Password(auth_url='https://my.keystone.com:5000/v3',
...                    username='myuser',
...                    password='mypassword',
...                    project_id='proj',
...                    user_domain_id='domain')
>>> sess = session.Session(auth=auth,
...                        verify='/path/to/ca.cert')
>>> ks = client.Client(session=sess)
>>> users = ks.users.list()

Я ссылаюсь на приведенный выше пример, чтобы изменить ваш код:

from novaclient import client
from keystoneauth1 import session
from keystoneauth1.identity import v3

def setup_nova(creds):
    """
    Creates a nova instance with which we can leverage the OpenStack     virtualization
    platform.

    :param creds: A dictionary containing the authorization url, username,
                  password, version, and project ID associated with the     OpenStack
                  cluster.
    :type creds: dict
    """
    auth = v3.PasswordMethod(auth_url=creds['AUTH_URL'],
                                 username=creds['USERNAME'],
                                 password=creds['PASSWORD'],
                                 project_id=creds['PROJECT_ID'],
                                 user_domain_name='default')
    sess = session.Session(auth=auth, verify=False)
    nova = client.Client(creds['VERSION'], session=sess)
    return nova
Другие вопросы по тегам