<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>49102</bug_id>
          
          <creation_ts>2024-01-17 15:56:55 +0300</creation_ts>
          <short_desc>Ошибка при использовании библиотеки</short_desc>
          <delta_ts>2024-02-09 16:27:51 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>Branch p10</product>
          <component>python3-module-neutronclient</component>
          <version>не указана</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>NOTABUG</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Алексей Родыгин">rodyginao</reporter>
          <assigned_to name="Grigory Ustinov">grenka</assigned_to>
          <cc>zurabishvilinn</cc>
          
          <qa_contact name="qa-p10@altlinux.org">qa-p10</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>240283</commentid>
    <comment_count>0</comment_count>
    <who name="Алексей Родыгин">rodyginao</who>
    <bug_when>2024-01-17 15:56:55 +0300</bug_when>
    <thetext>Стенды:
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 &quot;CREATE DATABASE keystone;&quot; | mysql -u root
# echo &quot;GRANT ALL PRIVILEGES ON keystone.* TO &apos;keystone&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;1&apos;;&quot; | mysql -u root
# echo &quot;GRANT ALL PRIVILEGES ON keystone.* TO &apos;keystone&apos;@&apos;%&apos; IDENTIFIED BY &apos;1&apos;;&quot; | mysql -u root

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

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

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

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

enabled = true
backend = dogpile.cache.memcached

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

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

1. # cat &gt; /etc/my.cnf.d/openstack.cnf &lt;&lt;&apos;EOF&apos;
[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 &quot;/skip-networking/d&quot; /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 &gt; auth_data &lt;&lt;&apos;EOF&apos;
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 &quot;An Example Domain&quot; example
# openstack project create --domain default --description &quot;Service Project&quot; service
# openstack project create --domain default --description &quot;Demo Project&quot; myproject
# openstack user create --domain default --password-prompt myuser (ввести пароль 1)
# openstack role create myrole
# openstack role add --project myproject --user myuser myrole


# echo &quot;CREATE DATABASE neutron;&quot; | mysql -u root
# echo &quot;GRANT ALL PRIVILEGES ON neutron.* TO &apos;neutron&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;1&apos;;&quot; | mysql -u root
# echo &quot;GRANT ALL PRIVILEGES ON neutron.* TO &apos;neutron&apos;@&apos;%&apos; IDENTIFIED BY &apos;1&apos;;&quot; | 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&apos;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 &quot;OpenStack Networking&quot; 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

&lt;VirtualHost *:9696&gt;
   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 &quot;%{cu}t %M&quot;
   ErrorLog /var/log/httpd2/neutron.log
   CustomLog /var/log/httpd2/neutron_access.log combined

   &lt;Directory /usr/bin&gt;
       Require all granted
   &lt;/Directory&gt;
&lt;/VirtualHost&gt;

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

WSGISocketPrefix /var/run/httpd2

# a2ensite neutron
# systemctl restart httpd2

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

# cat &gt; test_neutron.py&lt;&lt;&apos;EOF&apos;
from neutronclient.v2_0 import client
from keystoneauth1 import loading
from keystoneauth1 import session

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

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


# List Subnets
subnets = neutron.list_subnets()
print(&quot;Subnets: &quot;, subnets)


# List Ports
ports = neutron.list_ports()
print(&quot;Ports: &quot;, ports)

EOF

# python3 test_neutron.py

Ожидаемая реакция:
Вывод без ошибок.
Networks:  {&apos;networks&apos;: []}
Subnets:  {&apos;subnets&apos;: []}
Ports:  {&apos;ports&apos;: []}
 
Фактический результат:
# python3 test_neutron.py
Traceback (most recent call last):
  File &quot;/root/test_neutron.py&quot;, line 16, in &lt;module&gt;
    networks = neutron.list_networks()
  File &quot;/usr/lib/python3/site-packages/neutronclient/v2_0/client.py&quot;, line 842, in list_networks
    return self.list(&apos;networks&apos;, self.networks_path, retrieve_all,
  File &quot;/usr/lib/python3/site-packages/neutronclient/v2_0/client.py&quot;, line 369, in list
    for r in self._pagination(collection, path, **params):
  File &quot;/usr/lib/python3/site-packages/neutronclient/v2_0/client.py&quot;, line 384, in _pagination
    res = self.get(path, params=params)
  File &quot;/usr/lib/python3/site-packages/neutronclient/v2_0/client.py&quot;, line 353, in get
    return self.retry_request(&quot;GET&quot;, action, body=body,
  File &quot;/usr/lib/python3/site-packages/neutronclient/v2_0/client.py&quot;, line 330, in retry_request
    return self.do_request(method, action, body=body,
  File &quot;/usr/lib/python3/site-packages/neutronclient/v2_0/client.py&quot;, line 294, in do_request
    self._handle_fault_response(status_code, replybody, resp)
  File &quot;/usr/lib/python3/site-packages/neutronclient/v2_0/client.py&quot;, line 269, in _handle_fault_response
    exception_handler_v20(status_code, error_body)
  File &quot;/usr/lib/python3/site-packages/neutronclient/v2_0/client.py&quot;, 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.&lt;br /&gt;&lt;br /&gt;
The Keystone service is temporarily unavailable.


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

Невозможно проверить в Sisyphus, т.к. openstack-neutron удален из данного репозитория.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241354</commentid>
    <comment_count>1</comment_count>
    <who name="Nikolai Zurabishvili">zurabishvilinn</who>
    <bug_when>2024-02-09 16:27:51 +0300</bug_when>
    <thetext>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=&apos;http://&lt;IP Сервера&gt;:5000/v3&apos;,
                                username=&apos;admin&apos;,
                                password=&apos;1&apos;,
                                project_name=&apos;admin&apos;,
                                user_domain_name=&apos;Default&apos;,
                                project_domain_name=&apos;Default&apos;)
...</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>