Стенды: 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 удален из данного репозитория.
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') ...