OpenStack Meetup St.Petersburg 24.01.2018 (https://www.meetup.com/OpenStack-Russia-St-Petersburg/events/246061055/)
In this talk, I explained how to write OpenStack Neutron extension when (and if) you really need to. This talk contains Neutron architecture, libraries, and tricks that you have to use to write the correct extension or plugin. Neutron is a modular service and you can achieve one goal with different solutions and this talk will help you with it.
6. Service plugin + agent
6
1. три функции для neutron API: get_plugin_type(),
get_plugin_name(), get_plugin_description()
2. список supported_extension_aliases
3. функции оповещения агентов
4. функции для предоставления информации агентам
https://github.com/openstack/neutron-lib/blob/master/neutron_lib/services/base.py#L52
8. Service plugin + agent
8
1. три функции для neutron API: get_state(), after_start(),
after_updated()
2. функции обработки событий от плагина
3. функции для запроса к плагину
17. API extension
17
1. модель для работы с базой
2. миграция (alembic)
3. Mixin с CRUD методами ресурса: get_chatbot(), get_chatbots(),
create_chatbot(), update_chatbot()
4. дополнительные методы: bind_port(), unbind_port()
5. плагин для работы с API extension
get/create/update/delete_chatbot()
get_chatbots()
18. API extension
18
1. GET, POST -> http://<neutron_url>/chatbots
2. GET, PUT -> http://<neutron_url>/chatbots/<uuid>
3. PUT - > http://<neutron_url>/chatbots/<uuid>/bind_port
4. PUT - > http://<neutron_url>/chatbots/<uuid>/unbind_port
19. scheduler API extension
19
1. список ботов на агенте: GET -> .../agents/<agent_id>/chatbots
2. добавление бота на агент: POST -> .../agents/<agent_id>/chatbots
3. удаление бота: DELETE -> .../agents/<agent_id>/chatbots/<chatbot_id>
4. список агентов с ботом: GET -> .../chatbots/<chatbot_id>/foobar-agents
22. scheduler API extension
22
1. модель для работы с биндингом agent_id <-> chatbot_id
2. миграция (alembic)
3. Mixin с CRUD методами ресурса: list_chatbot_on_agent(),
add_chatbot_to_agent(), remove_chatbot_from_agent(),
list_agent_hosting_chatbot()
4. плагин для работы с API extension
23. scheduler API extension
23
1. список ботов на агенте: GET -> .../agents/<agent_id>/chatbots
2. добавление бота на агент: POST -> .../agents/<agent_id>/chatbots
3. удаление бота: DELETE -> .../agents/<agent_id>/chatbots/<chatbot_id>
4. список агентов с ботом: GET -> .../chatbots/<chatbot_id>/foobar-agents
25. failover / auto scheduling
25
Failover
1. периодические проверки статуса агента
2. если агент стал недоступен -> запуск функции перемещения
3. получает список ресурсов на недоступном агенте
4. загружает scheduler driver
5. выбирает целевой агент(ы) -> вызов filter_agents()
6. запускает функцию переноса для каждой единицы ресурса -> вызов
bind()
Auto scheduling
1. периодические проверки списка ресурсов
2. получает список свободных ресурсов
3. загружает scheduler driver
4. выбирает целевой агент(ы) -> вызов filter_agents()
5. запускает функцию переноса для каждой единицы ресурса -> вызов
bind()
https://github.com/openstack/neutron/blob/master/neutron/scheduler/base_scheduler.py
29. failover / auto scheduling
29
Что умеет плагин:
1. управлять ресурсом chatbot
2. управлять портами
3. предоставляет API для настройки ресурса
4. предоставляет API для биндинга chatbotа к агентам
5. есть failover / auto scheduling
31. ML2 plugin extension
31
Процесс получения информации:
1. запрос к Neutron API
2. вызов функции get_port() плагина ML2
3. вызов extend_port_dict() у всех ML2 extension
4. возвращение результата
32. ML2 plugin extension
32
1. GET -> extend_port/network/subnet_dict()
2. POST -> process_create_port/network/subnet()
3. PUT -> process_update_port/network/subnet()
https://github.com/openstack/neutron-lib/blob/master/neutron_lib/plugins/ml2/api.py#L1008
36. Testing
36
1. Unit тесты <- local
2. Functional <- local
3. Fullstack <- devstack / live
4. Tempest <- devstack / live <- rally
a. Api
b. Scenario
https://docs.openstack.org/neutron/ocata/devref/development.environment.html