# Dynamic constraints and other ADCM improvements
### Проблемы
1. Отсутствие ~~динамического дефолтного значения~~, возможности получить актуальное значение, например:
ha + kerberos_enabled -> flink.sasl=true
ha + kerberos_disabled -> flink.sasl=false
Значение параметра нельзя откатить к дефолту, если "дефолт" определяется в процессе экшна, включает проверку состояния объектов.
Таким параметрам нельзя разрешить кастомизацию без отдельного экшна или галки use custom value, иначе пользователь на non-read-only параметре может через кнопку откатиться к статическому дефолту, который может оказаться некорректным для текущего состояния объектов.
2. Использование мультистейтов для реализации логики приложений неудобно:
1. Разброс источников сведений о состоянии объектов.
До появления мультистейтов и, в некоторых случаях, до сих пор изменения логики опирались на проверку конфига кластера/бандла:
Пример - действия по if и when в бандле (when cluster.config.kerberos_client.enable_kerberos и тп).
Относительно новая логика,например, HA, может использовать мультистейты: если мультистейт ha_on отсутствует/удален, удалить znode ha-сервиса
2. Параметр конфига и мультистейт отличаются количеством допустимых состояний:
1.Конфиг имеет 2 состояния: записан или не записан
2.Мультистейт имеет 3 состояния: наличие (true), отсутствие (false) или faulty, при этом оно не отражает реальное состояние объекта. Например, faulty_kerberized из-за чеков.
Использование мультистейта затрудняет описание логики: нужно уточнять, faulty считать как true или как false?
3. Faulty-состояние - костыль, заменяющий retry и чек
... и, возможно, пометку need action (need action) для отложенных действий?
Faulty не производит отката изменений конфига.
3. Слишком много экшнов
4. Динамические констрейнты отсутствуют
1. На уровне HC-map нельзя выяснить, сколько нужно RM для Yarn в зависимости от HA_mode. Сложная логика
### Варианты решения
1. Jinja-переменные вместо жестко заданных дефолтов
2. Убрать мультистейты? - пока рано. Нужно при смене конфигов реализовать смену мультистейтов. При чеках - тоже. Узнать все места, где меняются статусы.
3. Фильтрация экшнов
1. Если не использовать мультистейты для реализации логики приложения, то их цель - фильтрация экшнов.
2. Экшнов слишком много, нужна группировка в один экшн Manage:
1. Manage cluster - набор галочек в модалке, перечисляющих допустимые экшны над кластером
2. Manage object - набор галочек с допустимыми экшнами над сервисом, компонентом (MVP) и, в дальнейшем, хостом
3. Доступность галочек экшнов для должна определяться дополнительным параметром - или мультистейтом, или параметром конфигурации, например, kerberos_enabled или kerberos_disabled. Т.к. не успеем проверить весь конфиг кластера на керберизацию при запуске модалки, нужен заранее записанный параметр.
4. Возможность заменить мультистейты ~~интерактивными модальными окнами~~ агентом
Нужно знать состояние объектов - введение агента.
4. Динамические констрейнты в HC-map - продумать
1. Добавить кнопку Manage HC map: туда добавить добавление, удаление, перемещение
2. Сделать REST для смены констрейнтов
### Заметки
Не hc-mapa, а delete-service используется для удаления замапленных экшнов
Переделать Main кластера в страничку со статусами и ссылками:
* добавить стейты, мультистейты,
* разбивку компонентов по хостам,
* состояния, полученные от агента
Экшны хоста добавить.
Переход от экшнов хоста к экшнам сервиса