# ua_node_selector

## Огляд

Check-правило `abie`, яке гарантує: якщо в дереві `k8s/` пакета присутній `Deployment`, то в `ua`-оверлеї (`ua/kustomization.yaml`) обовʼязково має бути inline-patch на цей `Deployment` зі шляхом `/spec/template/spec/nodeSelector` і `preem: false`. Так продакшн-навантаження (`ua`-оверлей) закріплюється за непреемптивними (стабільними) нодами. Перевіряється лише abie-специфічна вимога; структурні обмеження формату JSON6902-патчів (наприклад, заборона `remove + add` на той самий path) перевіряє окреме правило k8s і тут не дублюються.

## Поведінка

1. Зчитує перелік шляхів-винятків (cursor-ignore) і збирає всі k8s YAML-файли в межах кореня репозиторію.
2. Визначає директорії, де оголошено `Deployment`. Якщо `Deployment` у дереві немає — правило проходить (pass) із поясненням, що patch `nodeSelector` для `ua` не вимагається, і завершується.
3. Серед знайдених YAML відбирає файли, що є `ua/kustomization.yaml`. Якщо `Deployment` є, але жодного `ua`-kustomization не знайдено — це провал (fail) з вказівкою додати `ua/kustomization.yaml` із потрібним patch.
4. Для кожного знайденого `ua/kustomization.yaml`:
   - Якщо в дереві k8s саме того пакета, до якого належить цей оверлей, немає `Deployment` — patch не вимагається, правило проходить для цього файлу.
   - Інакше читає вміст файлу. Якщо файл не вдалося прочитати — фіксує провал із текстом помилки й переходить до наступного.
   - Перевіряє наявність коректного patch на target kind `Deployment` зі шляхом `/spec/template/spec/nodeSelector` та `preem: false`. За відсутності — провал; за наявності — прохід.
5. Підсумковий код виходу формується з накопичених pass/fail: нуль, якщо жодного провалу не зафіксовано.

## Де використовується

Файл — один із check-модулів набору правил `abie` (`npm/rules/abie/js/`). Запускається інфраструктурою перевірок правил, яка викликає експортовану функцію `check` і інтерпретує повернутий код виходу як результат лінту репозиторію.

## Гарантії поведінки

- Read-only: жодних файлів не змінює, лише читає YAML-конфігурації; мережу не використовує.
- Fail-safe для відсутніх ресурсів: відсутність `Deployment` у дереві трактується як легітимний прохід, а не помилка.
- Помилка читання окремого `ua/kustomization.yaml` не зупиняє перевірку — фіксується як провал для конкретного файлу, решта файлів продовжує оброблятися.
- Кожен `ua`-файл оцінюється незалежно; результат правила агрегує всі окремі pass/fail.
- Шляхи у звітах нормалізуються до відносних із прямими слешами, тож вивід стабільний і коректний незалежно від платформи (POSIX/Windows).
