Roadmap 0.2 $\rightarrow$ 0.3 $\rightarrow$ 1.0
Что имеем
Проблемы пользователей
Раиса
- (norm, 0.3 -> 1.0) Большой сложный граф зависимостей IM выглядит довольно бесполезным
- (norm, 0.3) У узлов в графе стрёмные названия, нужно делать их понятнее или давать возможность переименовать
- (opt, 0.3) В графе никак не учитываются типы узлов, это тоже неинтуитивно
- (crit, 0.3) Хочется развёртываться на имеющихся ресурсах, чтобы Мичман о них знал, и не нужно было вводить данные руками каждый раз
- (opt, 0.3 -> 1.0) Есть шаблоны, которые невозможно задеплоить, они могут быть использованы только в substitution mapping. Таких шаблонов очень много, реестр шаблонов становится неинтуитивным
- (crit, 0.3) “А авторизация тут есть?”
- (crit, 0.3 -> 1.0) “Т.е. я ввожу пароли руками и они хранятся как plaintext у вас в базе?”
Остап
- (crit, 0.3) Скейлинг в кластерных сервисах (мастер $\rightarrow$ воркеры) работает не так, как нужно. Мастеру нужна возможность аггрегировать информацию о всех воркерах
- (crit, 0.3) Из-за отсутствия селектов инкапсуляция шаблонов сервисов
идет в жопунарушается, создаются копии шаблонов, отличающихся одним или двумя параметрами для предусмотрения наличия определенной опциональной функциональности - (norm, 1.0) Substutution mapping не всегда работает так, как хочется: property пробрасываются с самого верхнего абстрактного узла, поэтому input’ы не всегда получается организовать так, как хочется, создаются мусорные типы (
*.abstract) - (crit, 0.3) Убрать кэш в ресолвере (-> кэщ в репозитории)
- (crit, 0.3) Хочется грузить часть шаблонов, а не все (для разработки)
- (crit, 0.3) Хочется быстро обновлять шаблоны и артефакты при разработке
- (crit 0.3) FK Димы мешает обновлять шаблоны, ребята рестартят мичман полностью каждый раз
- (norm 0.3) при обновлении артефактов хочется жать редеплой, а не создавать новую IM
- (crit) Опциональные requirements
Проблемы разработчиков
- Неудобный API
- (norm, 0.3) Дублирующиеся ручки (resolver $\leftrightarrow$ repository)
- (norm, 0.3) 3 эндпоинта
- (opt, 0.3) Модель puccini
- (crit, 0.3) Каждый сервис делает resolve IM сам (чтобы не обращаться к resolver, т.к. это быстрее)
- (crit, 0.3) Размазанная модель данных, легко обновить в одном месте и забыть в другом
- (norm, 0.3) Хочется CI
- (opt, 0.3) Хочется CD
- (crit, 0.3) Нет документации (а для этого надо зафиксировать подход к документированию) $\rightarrow$ Рома выгорает от числа вопросов
- (crit, 0.3) Хочется пересмотреть практики добавления новых фич, чтобы у Алёши всё не ломалось
Глобальные заметки (на ретро?)
- Давайте как-нибудь поумерим буйство текста:
- то, что пишется, читают далеко не все (т.к. это не нужно читать всем) $\rightarrow$ тексты ревьюим, а не холиварно обсуждаем на созвонах
- история - один тикет, все истории должны быть атомарными
- техническое описание - наброски документации + заметки в тикете (буквально этап анализа)
- Алёша — пользователь Мичмана, а не разработчик (буквально пользователь API)
- разделить
Что делаем
репозиторий
(crit, 12) честный update
(crit, 12) переход на TOSCA 2.0
(crit, 12) обработка get-функций, хранение ссылок
... prop_0: { get_property: [prop_1] } -> "test-test-test" prop_1: { concat: [ { get_attribute: [attr_1] }, { get_property: [prop_2] } ] } -> "test-test-test" prop_2: "test" ... attr_1: { concat: [ { get_property: [prop_2] }, "-test-" ] } -> "test-test-"Нужно придумать, как хранить такие связи
(crit, 12) обработка select mapping
(norm, 16) фильтрация узлов по node_filter запросу:
f(узел, фильтр) -> bool(crit, 16) скейлинг узлов
(opt, 12) обработка substitution mapping
(crit, 4) версионирование шаблонов
(norm, 8) force-push шаблона
(crit, 12) вынесение preload за контур репозитория
(crit, 4) убираем мок-режим в репозитории
(opt, 16) добавление кэширующего слоя
(crit, 16) проход авторизацией
оркестратор
- вроде ничего?
resolver
- в процессе решения задач репозитория, он должен смержиться с ним
шаблоны
- добавляем select везде, где можем
глобально
- CI
- CD
h1. Описание 0.3
h2. План по времени
Начало: 1.08.2023 Конец: 1.09.2023
Бэк/Тоска:
- Миша
- Рома
- Дима
- Никита
- Лёня
- Андрей
- Макар
- Таня
- Костя
Фронт:
- Алёна
- Саша
Роли
Шаблоны задач
Core
Остап хочет использовать директиву
selectв TOSCA, чтобы добавить в свои шаблоны возможность развёртывания на существующих ресурсахОстап хочет использовать
node_filterв своих шаблонах, чтобы описать ограничения на узлы, которые могут встать на местоselectи сократить выдачу вариантов для РаисыОстап хочет использовать
substitution_filterв своих шаблонах, чтобы описать ограничения на узлы, которые могут быть подменены шаблонами и сократить выдачу вариантов для Раисы (а также, в теории, упростить свои шаблоны)Остап хочет группировать свои шаблоны по категориям, чтобы Раиса не терялась в растущем реестре шаблонов
Остап хочет описывать опциональные компоненты кластера, которые могут быть развернуты по желанию Раисы
Остап хочет аггрегировать информацию о requirement’ах с непостоянным количеством вхождений, чтобы описывать кластерные сервисы
Остап хочет делать минимальное количетсво действий с мичманом для применения изменений в его шаблоне, чтобы ускорить процесс разработки шаблона
Остап хочет ==/== в его артефакте, чтобы ускорить процесс разработки
Павел хочет RESTful API (зачем? До тех пор пока Павел не интегрирует API куда-то ещё, не пишет клиент)
Раиса не хочет, чтобы её узлы показывались в выдаче select для других пользователей
Алёша и Павел хотят получать актуальный и корректный
openapi.jsonпосле каждого нового MR в mainОстап (как ревьюер) хочет быть уверенным, что вливаемые им шаблоны соответствуют принятым в команде соглашениям
Макар (как ревьюер) хочет быть уверенным, что вливаемый им core код соответствует принятым в команде соглашениям
XaaS
Раиса разворачивает Slurm на физических узлах
Раиса добавляет сервисы на существующие в другой IM виртуальные машины
Раиса разворачивает шаблон в некотором облаке (= выбор облака)
Раиса создаёт виртуальную машину с монтированием ранее развёрнутого NFS
Раиса создаёт JupyterLab и монтирует в него бакет из ранее развёрнутого MiniO Server
Раиса хочет разворачивать GlusterFS, чтобы использовать его в других своих платформах
Раиса хочет разворачивать Талисман
Раиса хочет добавить мониторинг к узлам своего кластера и некоторым отдельным сервисам, чтобы исследовать производительность
Андрей хочет добавлять провайдера
Frontend
- Раиса хочет переименовать узлы в графе, чтобы лучше в нём ориентироваться
- Раиса хочет уменьшить детализацию графа, потому что ей хочется следить за состоянием сервисов в целом и не тратить время на сопоставление маленького узла с частью кластера, которая сломалась
- Остап хочет удобную навигацию по логам деплоя, чтобы быстро находить операции, завершившиеся с ошибками и чинить их
- Раиса хочет отправить логи упавшего деплоя Остапу и Макару, чтобы они нашли ошибку
Графовое представление TOSCA
#* Story/Макеты ## Раиса открывает краткое представление графа IM ## Раиса открывает альтернативное представление IM #* Backend ## Фильтры в API (какие?) ## Дополнительные запросы в API (какие?) ## Группировка узлов в API ## Агрегация данных по группам #* Frontend ## Узлы-агрегаторы ## Агрегация описаний #*# Детализация/раскрытие групп по кнопке
Директива Select
#* Story ## Раиса разворачивает Slurm на физических узлах ## Раиса добавляет сервисы на существующие в другой IM виртуальные машины ## Раиса разворачивает шаблон в некотором облаке (= выбор облака) ## Раиса создаёт виртуальную машину с монтированием ранее развёрнутого NFS ## Раиса создаёт JupyterLab и монтирует в него бакет из ранее развёрнутого MiniO Server # Backend ## Добавление IM с “внешними” узлами (baremetal, cloud, self-hosted Postgres etc.) ## Фильтры в API (какие?) ## Дополнительные запросы в API (какие?) ## Node Filter ## def NodeFilter(Node,Filter): bool ## get-функции ## Обработка TOSCA 2.0 ## Обработка директивы Select ## Корректный деплой при Select #* Frontend ## Обработка директивы Select ## Обработка обоих директив в одном узле ## Обозначение “внешних” узлов в графе # Шаблоны ## TOSCA 2.0 ## Запускаемые Type Extensions
Директива Substitution
#* Story/Analysis ## Остап хочет добавить опциональный substitution в свой шаблон # Backend ## Non-Inline substitution ## Node Filter (refs директива Select) ## Обработка опциональных requirements ## Обработка опциональных substitutions #* Frontend ## TODO # Шаблоны #*# Примеры
Масштабирование узлов при создании IM
#* Story/Analysis ## GlusterFS ## Slurm ## Мониторинг ## Создание кластера с масштабируемыми узлами от лица Раисы #* Backend ## TODO # Frontend #*# TODO
Развитие API
#* Story ## Остап разрабатывает шаблон @–>@ его нужно обновлять с минимумом перезапусков Мичмана ## Остап обновляет шаблон ## Павел создаёт IM через API @–>@ API Репозитория/Резловера ## Павел запускает IM через API @–>@ API Оркестратора #* Backend ## SQL-based обновление шаблонов ## Backend: Версионирование шаблонов #*# Фильтры в API (refs графовое представление TOSCA, refs директива Select)
Объединение сервисов
#* Story ## Павел создаёт IM через API (refs Развитие API) # Backend ## Перенос API оркестратора в модель данных ## Дедубликация запросов ## Перенос функциональности Resolver в Repository # Frontend #*# TODO (Отрицание, злость, торг, депрессия, принятие)
Развитие модели данных
#* Story/Analysis ## Остап разрабатывает шаблон (refs Развитие API) ## Остап хочет добавить опциональный substitution в свой шаблон (refs Директива substitution) #* Backend ## SQL-based обновление шаблонов (refs Развитие API) ## Версионирование шаблонов ## Объединение всех моделей в одном месте ## Перенос API оркестратора в модель данных (refs развитие API) #* Frontend ## TODO # Other #*# проверить puccini-CLOUT на применимость
Развитие Preload
#* Story ## Остап разрабатывает шаблон (refs Развитие API) @–>@ Остап хочет загружать только те шаблоны, которые касаются его текущей разработки ## Остап меняет плейбуки без изменения шаблона @–>@ Остап хочет обновить артефакты без перезагрузки Мичмана #* Backend ## Вынесение Preload из запуска Repository ## Преобразование Mock-репозитория для фронта в загрузку тестовых шаблонов #* Frontend #*# None?
Облачные провайдеры
#* Story ## Андрей добавляет нового провайдера ## Раиса разворачивает шаблон в некотором облаке (refs Директива Select) #* Backend ## Select? ## TODO #* Frontend ## Макеты (есть) ## TODO #* Шаблоны ## Облачные провайдеры ## Физические узлы
Аутентификация/Авторизация
#* Story/Analysis ## Раиса и Мирослав создают IM в одном Мичмане # Other ## Поднять KeyCloak ## Посмотреть на НЦМУ-OpenID ## Создать пользователей # Frontend #*# Аутентификация
Хранение чувствительных данных
#* Story ## Раиса вводит свои учётные данные от облака ## Раиса хочет сохранить свои учётные данные от развёрнутых сервисов #*# Раиса передаёт в Мичман свой приватный ключ для доступа к ресурсам в облаке.
CI
#* Story ## Остап разрабатывает шаблон (refs Развитие API) @–>@ При создании Merge Request Остап хочет автоматически видеть ошибки # Other ## Прогнать линтеры и форматтеры ## Влить ветку с CI
CD
#* Story ## Стенд разработчика # Other ## Актуальный стенд для показов ## Стенд для НЦМУ ## Талисман ## Интеграция с облаком
Документация
#* Other ## Унификация, актуализация документации для разработчиков ## Единый подход к ведению пользовательской и девелоперской документации (Readme/wiki/new pokemon)
Логи
#* Story/Analysis ## Раиса хочет посмотреть логи запуска своего кластера ## Остап хочет посмотреть логи Мичмана #* Backend ## Перенос API Оркестратора в модель данных (refs Развитие API) # Frontend ## TODO # Other #*# Нужно исследовать инструменты для складирования логов
Сертификация
Интеграция с облаком (refs CD)
Python 3.8
Сети на контроллерах
Братская могила высокоуровневых milestones
Талисман по кнопке
Slurm
Jupyter+MiniO
h2. Мапинг существующих задач на бигфичи
Упрощение графа
Склеивание узлов (#15253)
##* Фильтры
Названия узлов (#15028, #14984)
Типы узлов (#15295)
Select (#15232, #15286, #15207)
Деплой на существующих ресурсах
Запускаемые Type Extensions
Дедубликация шаблонов
##* Частично зависит и от substitution mapping ##* Node Filter (История + можно делать) @->@ Substitution filter ##* Опциональные requirements, substitutions (Истории)
Весрионирование шаблонов (#15150)
Авторизация (#14977)
Секреты (#14977, #14978)
Масштабируемые узлы (#15289)
Нужны агрегирующие функции сбора @->@ TOSCA 2.0
Кэш резолвера/репозитория (#15097, #15188)
#* История от Ромы на нужные запросы в репозитории
Частичный preload (#15206, #15090)
#* История для TOSCA-разработчиков #* История для фронт-разработчиков @->@ Mocks
Обновление шаблонов (и ролей) при разработке
#* FK IM @->@ Template @==>@ обновление шаблонов а рантайме #* Обновление артефактов (плейбуков) для отладки ансибла (мб починится о Ромин докер)
API (#14983, #15285, #15157, #14971, #15125)
Дедубликация ручек API (#14949)
Объединение сервисов (#15282, #15176, #15095)
Фильтры репозитории
Модель данных (#15199, #14970, #15199, #14920, #15180)
#* Посмотреть CLOUT(?) #* Единая библиотека для моделей?
Задачи по сертификации
Сборка дистрибутива
Деплой на контроллерах облака
Аккуратный переход на python3.8
CI (#15014)
#* Прогнать линтеры, форматтеры и влить ветку Макара. #* Писать дев-стори.
CD (#15183)
Логи (#14912, #15235, #14979)
Моки: упрощения новых фичей
Документация (#14974, #14957, #14921, #14991, #14896)
#* Единый подход: README/wiki/new pokemon #* Акутализировать и развивать