Bug 49102 - Ошибка при использовании библиотеки
Summary: Ошибка при использовании библиотеки
Status: CLOSED NOTABUG
Alias: None
Product: Branch p10
Classification: Unclassified
Component: python3-module-neutronclient (show other bugs)
Version: не указана
Hardware: x86_64 Linux
: P5 normal
Assignee: Grigory Ustinov
QA Contact: qa-p10@altlinux.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2024-01-17 15:56 MSK by Алексей Родыгин
Modified: 2024-02-09 16:27 MSK (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Алексей Родыгин 2024-01-17 15:56:55 MSK
Стенды:
server-10.1-x86-64
workstation-10.1-x86-64
kworkstation-10.2.1-x86-64
education-10.2-x86-64-kde
education-10.2-x86-64

Версия пакета:
python3-module-neutronclient-7.1.1-alt2.noarch

Шаги воспроизведения:
Настроить openstack-keystone и neutron:

# apt-get install openstack-keystone mariadb memcached

# systemctl start mariadb 
# systemctl start memcached

# echo "CREATE DATABASE keystone;" | mysql -u root
# echo "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '1';" | mysql -u root
# echo "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '1';" | mysql -u root

В файле /etc/keystone/keystone.conf в секцию [database] добавить строку:

connection = mysql+pymysql://keystone:1@127.0.0.1/keystone

можно добавить командой:
# awk '/^\[database\]/{p=1} p && /^$/ && !a {print "connection = mysql+pymysql://keystone:1@127.0.0.1/keystone"; a=1} 1' /etc/keystone/keystone.conf > /etc/keystone/keystone.conf.tmp && mv /etc/keystone/keystone.conf.tmp /etc/keystone/keystone.conf

В файле /etc/keystone/keystone.conf в секцию [cache] добавить строку:

enabled = true
backend = dogpile.cache.memcached

можно добавить командой:
# awk '/^\[cache\]/{p=1} p && /^$/ && !a {print "enabled = true\nbackend = dogpile.cache.memcached"; a=1} 1' /etc/keystone/keystone.conf > /etc/keystone/keystone.conf.tmp && mv /etc/keystone/keystone.conf.tmp /etc/keystone/keystone.conf

Настроить подключение к бд:

1. # cat > /etc/my.cnf.d/openstack.cnf <<'EOF'
[mysqld]
bind-address = 127.0.0.1
default-storage-engine = innodb
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
EOF

2. # sed -i "/skip-networking/d" /etc/my.cnf.d/server.cnf

3. # systemctl restart mariadb

# keystone-manage db_sync
# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
# keystone-manage bootstrap --bootstrap-password 1 --bootstrap-admin-url http://$(hostname -i):5000/v3/ --bootstrap-internal-url http://$(hostname -i):5000/v3/ --bootstrap-public-url http://$(hostname -i):5000/v3/ --bootstrap-region-id RegionOne

Поднять http2: 

# chown -R keystone:keystone /etc/keystone
# systemctl enable --now httpd2.service

 

Настройка клиента:

Установлены пакеты:

# apt-get install python3-module-openstackclient

Создать файл auth_data с переменными среды 

# cat > auth_data <<'EOF'
export OS_AUTH_URL=http://127.0.0.1:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_USERNAME=admin
export OS_PASSWORD=1
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_ REGION_NAME=RegionOne
EOF

# . auth_data

# openstack domain create --description "An Example Domain" example
# openstack project create --domain default --description "Service Project" service
# openstack project create --domain default --description "Demo Project" myproject
# openstack user create --domain default --password-prompt myuser (ввести пароль 1)
# openstack role create myrole
# openstack role add --project myproject --user myuser myrole


# echo "CREATE DATABASE neutron;" | mysql -u root
# echo "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '1';" | mysql -u root
# echo "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '1';" | mysql -u root

Отредактировать нужные секции в конфиге /etc/neutron/neutron.conf

[DEFAULT]
auth_strategy=keystone
core_plugin = ml2

[keystone_authtoken]

auth_type=password

# Complete public Identity API endpoint
www_authenticate_uri=http://127.0.0.1:5000

# Complete admin Identity API endpoint.
auth_url=http://127.0.0.1:5000

# Service username.
username=neutron

# Service account password.
password=1

# Service tenant name.
project_name=service

# Domain name containing project
project_domain_name=Default

# User's domain name
user_domain_name=Default

# memcached setting
memcached_servers=127.0.0.1:11211

[database]
connection=mysql+pymysql://neutron:1@127.0.0.1/neutron

Выполнить:
 
# neutron-db-manage upgrade head

 
Создать новый сервис в openstack и эндпоинты:

# openstack service create --name neutron   --description "OpenStack Networking" network
# openstack endpoint create --region RegionOne network public http://127.0.0.1:9696
# openstack endpoint create --region RegionOne network internal http://127.0.0.1:9696
# openstack endpoint create --region RegionOne network admin http://127.0.0.1:9696

Настроить httpd2:

# vim /etc/httpd2/conf/sites-available/neutron.conf

Listen 9696

<VirtualHost *:9696>
   WSGIDaemonProcess neutron-server processes=1 threads=1 user=neutron group=neutron display-name=%{GROUP}
   WSGIProcessGroup neutron-server
   WSGIScriptAlias / /usr/bin/neutron-api
   WSGIApplicationGroup %{GLOBAL}
   WSGIPassAuthorization On
   ErrorLogFormat "%{cu}t %M"
   ErrorLog /var/log/httpd2/neutron.log
   CustomLog /var/log/httpd2/neutron_access.log combined

   <Directory /usr/bin>
       Require all granted
   </Directory>
</VirtualHost>

Alias /networking /usr/bin/neutron-api
<Location /networking>
   SetHandler wsgi-script
   Options +ExecCGI
   WSGIProcessGroup neutron-server
   WSGIApplicationGroup %{GLOBAL}
   WSGIPassAuthorization On
</Location>

WSGISocketPrefix /var/run/httpd2

# a2ensite neutron
# systemctl restart httpd2

Создать и запустить тестовый скрипт 

# cat > test_neutron.py<<'EOF'
from neutronclient.v2_0 import client
from keystoneauth1 import loading
from keystoneauth1 import session

# Load credentials
loader = loading.get_plugin_loader('password')
auth = loader.load_from_options(auth_url='http://127.0.0.1:5000/v3',
                                username='admin',
                                password='1',
                                project_name='admin',
                                user_domain_name='Default',
                                project_domain_name='Default')

sess = session.Session(auth=auth)
neutron = client.Client(session=sess)
networks = neutron.list_networks()
print("Networks: ", networks)


# List Subnets
subnets = neutron.list_subnets()
print("Subnets: ", subnets)


# List Ports
ports = neutron.list_ports()
print("Ports: ", ports)

EOF

# python3 test_neutron.py

Ожидаемая реакция:
Вывод без ошибок.
Networks:  {'networks': []}
Subnets:  {'subnets': []}
Ports:  {'ports': []}
 
Фактический результат:
# python3 test_neutron.py
Traceback (most recent call last):
  File "/root/test_neutron.py", line 16, in <module>
    networks = neutron.list_networks()
  File "/usr/lib/python3/site-packages/neutronclient/v2_0/client.py", line 842, in list_networks
    return self.list('networks', self.networks_path, retrieve_all,
  File "/usr/lib/python3/site-packages/neutronclient/v2_0/client.py", line 369, in list
    for r in self._pagination(collection, path, **params):
  File "/usr/lib/python3/site-packages/neutronclient/v2_0/client.py", line 384, in _pagination
    res = self.get(path, params=params)
  File "/usr/lib/python3/site-packages/neutronclient/v2_0/client.py", line 353, in get
    return self.retry_request("GET", action, body=body,
  File "/usr/lib/python3/site-packages/neutronclient/v2_0/client.py", line 330, in retry_request
    return self.do_request(method, action, body=body,
  File "/usr/lib/python3/site-packages/neutronclient/v2_0/client.py", line 294, in do_request
    self._handle_fault_response(status_code, replybody, resp)
  File "/usr/lib/python3/site-packages/neutronclient/v2_0/client.py", line 269, in _handle_fault_response
    exception_handler_v20(status_code, error_body)
  File "/usr/lib/python3/site-packages/neutronclient/v2_0/client.py", line 91, in exception_handler_v20
    raise client_exc(message=error_message,
neutronclient.common.exceptions.ServiceUnavailable: The server is currently unavailable. Please try again at a later time.<br /><br />
The Keystone service is temporarily unavailable.


Neutron server returns request_ids: ['req-d016b0a4-17d7-4f9d-b7eb-3c9f32da3b6b']

Невозможно проверить в Sisyphus, т.к. openstack-neutron удален из данного репозитория.
Comment 1 Nikolai Zurabishvili 2024-02-09 16:27:51 MSK
python3-module-neutronclient-9.0.0-alt0.p10

Не воспроизводится если создать пользователя neutron, добавить роль:

# openstack user create --domain default --password-prompt neutron
# openstack role add --project service --user neutron admin

и правильно указать ip адрес сервера где развернут openstack в коде test_neutron.py:

...
auth = loader.load_from_options(auth_url='http://<IP Сервера>:5000/v3',
                                username='admin',
                                password='1',
                                project_name='admin',
                                user_domain_name='Default',
                                project_domain_name='Default')
...