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 #* Акутализировать и развивать

Талисман по кнопке

Slurm (#15222, #15210, #15294, #15231, #15232)

Jupyter+MiniO