@nitra/cursor 1.8.122 → 1.8.124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/mdc/abie.mdc +4 -2
- package/mdc/k8s.mdc +1 -1
- package/package.json +1 -1
- package/scripts/check-abie.mjs +182 -19
package/mdc/abie.mdc
CHANGED
|
@@ -4,7 +4,7 @@ alwaysApply: true
|
|
|
4
4
|
version: '1.15'
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Правило **abie** для споживачів **@nitra/cursor**: **k8s** (Deployment + **HealthCheckPolicy** у **`hc.yaml`**, overlay **ua** / **ru** — **nodeSelector**, **HTTPRoute** (будь-який непорожній **`target.name`**, для спільних сервісів **`auth-run-hl`** / **`file-link-hl`** — **`namespace: dev`** у base та patch **`…/backendRefs/…/namespace`** у **ua** / **ru**), у overlay **ru** — кожен **Service** (у т. ч. **headless** / **`-hl`**) → **`spec.type: NodePort`** через **JSON6902** у **`kustomization.yaml`**, видалення **HealthCheckPolicy** у **ru**), гілки **dev**, **ua**, **ru** у **clean-merged-branch**, а також заборона
|
|
7
|
+
Правило **abie** для споживачів **@nitra/cursor**: **k8s** (Deployment + **HealthCheckPolicy** у **`hc.yaml`**, overlay **ua** / **ru** — **nodeSelector**, **HTTPRoute** (будь-який непорожній **`target.name`**, для спільних сервісів **`auth-run-hl`** / **`file-link-hl`** — **`namespace: dev`** у base та patch **`…/backendRefs/…/namespace`** у **ua** / **ru**), у overlay **ru** — кожен **Service** (у т. ч. **headless** / **`-hl`**) → **`spec.type: NodePort`** через **JSON6902** у **`kustomization.yaml`**, видалення **HealthCheckPolicy** у **ru**), гілки **dev**, **ua**, **ru** у **clean-merged-branch**, а також заборона тримати артефакти **Firebase Hosting** у **підкаталогах першого рівня** (безпосередні діти кореня репозиторію; у самому корені ці імена не вимагаються до видалення).
|
|
8
8
|
|
|
9
9
|
**`npx @nitra/cursor check abie`** виконується лише якщо в **`.n-cursor.json`** у **`rules`** є **`abie`** — інакше вихід **0** без зауважень.
|
|
10
10
|
|
|
@@ -40,6 +40,8 @@ spec:
|
|
|
40
40
|
|
|
41
41
|
### HTTPRoute: спільні сервіси **`auth-run-hl`**, **`file-link-hl`**
|
|
42
42
|
|
|
43
|
+
У **HTTPRoute** у шляху з **`…/k8s/base/…`** у **`spec.hostnames`** дозволені лише **`aiml.live`**, **`*.aiml.live`** та інші піддомени **aiml.live** (перевірка в **`check-abie.mjs`**).
|
|
44
|
+
|
|
43
45
|
Ці **Service** (headless **`-hl`**) живуть у **базовому** неймспейсі **`dev`**. У маніфесті **HTTPRoute** під **`k8s`** (шар без **`ua/`** та **`ru/`** — наприклад **`…/k8s/base/hr.yaml`**) для кожного **`backendRefs`** до такого сервісу явно вкажи **`namespace: dev`** і порт **8080**:
|
|
44
46
|
|
|
45
47
|
```yaml title="…/k8s/base/hr.yaml (фрагмент)"
|
|
@@ -332,7 +334,7 @@ spec:
|
|
|
332
334
|
|
|
333
335
|
## Firebase Hosting
|
|
334
336
|
|
|
335
|
-
У корені
|
|
337
|
+
У **кожному** підкаталозі, що лежить **безпосередньо** в корені репозиторію, не тримати конфіг і кеш **Firebase Hosting**: у таких каталогах не повинно бути **`.firebaserc`**, **`firebase.json`** та каталогу **`.firebase/`** (у **самому** корені репозиторію ці імена перевіркою abie **не** розглядаються; `node_modules` / `.git` зі скану вилучаються).
|
|
336
338
|
|
|
337
339
|
## Git branches
|
|
338
340
|
|
package/mdc/k8s.mdc
CHANGED
package/package.json
CHANGED
package/scripts/check-abie.mjs
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* **`phpdocker-io/github-actions-delete-abandoned-branches`** у **`with.ignore_branches`** мають бути
|
|
9
9
|
* **dev**, **ua** та **ru** (разом з іншими гілками, якщо потрібно).
|
|
10
10
|
*
|
|
11
|
-
* **Firebase Hosting:** у
|
|
11
|
+
* **Firebase Hosting:** у **підкаталогах першого рівня** (безпосередні діти кореня репозиторію; `node_modules` / `.git` пропускаються) не має бути
|
|
12
|
+
* **`.firebaserc`**, **`firebase.json`** та каталогу **`.firebase/`**; у **самому** корені репозиторію ці імена не перевіряються.
|
|
12
13
|
*
|
|
13
14
|
* **k8s:** якщо під деревом із сегментом **`k8s`** є YAML з **`kind: Deployment`**, у тій самій директорії
|
|
14
15
|
* має існувати **`hc.yaml`** із **`HealthCheckPolicy`** (**`networking.gke.io/v1`**), modeline **`$schema`**
|
|
@@ -29,6 +30,7 @@
|
|
|
29
30
|
* — тоді в **`ua`/`ru` kustomization** потрібен patch на **`kind: HTTPRoute`**, **непорожній `target.name`**: **`/spec/hostnames`**
|
|
30
31
|
* (домени abie.mdc), **`/spec/parentRefs/0/namespace`** (**ua** / **ru**); для **ru** — **`gwin.yandex.cloud/rules.http.upgradeTypes: websocket`**,
|
|
31
32
|
* якщо в тому ж **`kustomization.yaml`** згадується **`HASURA_GRAPHQL_JWT_SECRET`** (Hasura + JWT).
|
|
33
|
+
* **HTTPRoute (base / dev):** у маніфесті **HTTPRoute** у шляху з сегментом **`base`** (наприклад **`…/k8s/base/hr.yaml`**) у **`spec.hostnames`** дозволені лише **`aiml.live`**, **`*.aiml.live`** та інші піддомени **aiml.live** (канонічно порівняння без урахування регістру).
|
|
32
34
|
* **Спільні бекенди (`auth-run-hl`, `file-link-hl`):** у **HTTPRoute** під **`k8s`** поза overlay **ua** та **ru** (шлях не містить **`k8s/ua/`** чи **`k8s/ru/`**) кожен такий **`backendRefs`** має **`namespace: dev`** і порт **8080**;
|
|
33
35
|
* у patch overlay **ua** та **ru** — по одному **JSON6902** на **`/spec/rules/…/backendRefs/…/namespace`** з **`value`**: **ua** або **ru** (кількість patch-ів = кількість таких **`backendRefs`** у пакеті).
|
|
34
36
|
* Вибір **`op`** — **k8s.mdc**.
|
|
@@ -37,7 +39,7 @@
|
|
|
37
39
|
* у файлі **`k8s/ru/kustomization.yaml`** того ж пакета (overlay середовища **ru**) — inline **JSON6902** на **`kind: Service`** з тим самим **`target.name`**: **`path: /spec/type`**, **`value: NodePort`**; якщо в base було **`spec.clusterIP: None`** — **`op: remove`** для **`/spec/clusterIP`**; якщо в base **явно** задано **`spec.clusterIPs`** — також **`remove`** для **`/spec/clusterIPs`** (інакше **API** може залишити **`None`** для **NodePort**; без ключа **`clusterIPs`** у base **`remove`** на **`/spec/clusterIPs`** ламає **`kubectl kustomize`**).
|
|
38
40
|
*/
|
|
39
41
|
import { existsSync } from 'node:fs'
|
|
40
|
-
import { readFile } from 'node:fs/promises'
|
|
42
|
+
import { readdir, readFile } from 'node:fs/promises'
|
|
41
43
|
import { dirname, join, relative } from 'node:path'
|
|
42
44
|
|
|
43
45
|
import { parseAllDocuments } from 'yaml'
|
|
@@ -49,6 +51,9 @@ import { walkDir } from './utils/walkDir.mjs'
|
|
|
49
51
|
|
|
50
52
|
const CONFIG_FILE = '.n-cursor.json'
|
|
51
53
|
|
|
54
|
+
/** Каталоги-діти в корені, які пропускаються при скануванні на артефакти Firebase Hosting (abie). */
|
|
55
|
+
const ABIE_FIREBASE_HOSTING_SCAN_SKIP_TOP_DIR_NAMES = new Set(['.git', 'node_modules'])
|
|
56
|
+
|
|
52
57
|
/** Маркер у kustomization.yaml: якщо зустрічається у файлі — для overlay ru у patch HTTPRoute потрібна анотація gwin…websocket. */
|
|
53
58
|
const HASURA_JWT_SECRET_IN_KUSTOMIZATION = 'HASURA_GRAPHQL_JWT_SECRET'
|
|
54
59
|
|
|
@@ -63,6 +68,9 @@ const ABIE_SHARED_CROSS_NS_BACKEND_SET = new Set(ABIE_SHARED_CROSS_NS_BACKEND_NA
|
|
|
63
68
|
/** Очікуваний URL **`$schema`** для **hc.yaml** (abie.mdc). */
|
|
64
69
|
export const ABIE_HC_SCHEMA_URL = 'https://datreeio.github.io/CRDs-catalog/networking.gke.io/healthcheckpolicy_v1.json'
|
|
65
70
|
|
|
71
|
+
/** Кореневий домен **`spec.hostnames`** для **HTTPRoute** у **`…/k8s/base/…`** (середовище dev, abie.mdc). */
|
|
72
|
+
export const ABIE_BASE_DEV_HTTPROUTE_HOST_ROOT = 'aiml.live'
|
|
73
|
+
|
|
66
74
|
const MODELINE_RE = /^#\s*yaml-language-server:\s*\$schema=(\S+)\s*$/
|
|
67
75
|
const LINE_SPLIT_RE = /\r?\n/u
|
|
68
76
|
const RU_KUSTOMIZATION_PATH_RE = /(^|\/)ru\/kustomization\.yaml$/u
|
|
@@ -191,6 +199,84 @@ export function isAbieK8sBaseYamlPath(rel) {
|
|
|
191
199
|
return BASE_SEGMENT_RE.test(norm)
|
|
192
200
|
}
|
|
193
201
|
|
|
202
|
+
/**
|
|
203
|
+
* Чи **hostname** дозволений для **HTTPRoute** у **base** (dev): **aiml.live**, **\*.aiml.live** або **\*.…\.aiml.live** (без урахування регістру).
|
|
204
|
+
* @param {string} hostname значення з **spec.hostnames**
|
|
205
|
+
* @returns {boolean} **true**, якщо hostname відповідає abie.mdc
|
|
206
|
+
*/
|
|
207
|
+
export function isAllowedAbieBaseDevHostname(hostname) {
|
|
208
|
+
if (typeof hostname !== 'string') {
|
|
209
|
+
return false
|
|
210
|
+
}
|
|
211
|
+
const h = hostname.trim().toLowerCase()
|
|
212
|
+
if (h === '') {
|
|
213
|
+
return false
|
|
214
|
+
}
|
|
215
|
+
const root = ABIE_BASE_DEV_HTTPROUTE_HOST_ROOT
|
|
216
|
+
if (h === root) {
|
|
217
|
+
return true
|
|
218
|
+
}
|
|
219
|
+
if (h === `*.${root}`) {
|
|
220
|
+
return true
|
|
221
|
+
}
|
|
222
|
+
if (h.endsWith(`.${root}`)) {
|
|
223
|
+
return true
|
|
224
|
+
}
|
|
225
|
+
return false
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Повідомлення про недопустимі **spec.hostnames** у **HTTPRoute** у шляху **…/base/…** (abie.mdc).
|
|
230
|
+
* @param {unknown} obj корінь YAML-документа
|
|
231
|
+
* @param {string} rel відносний шлях від кореня репозиторію
|
|
232
|
+
* @returns {string[]} порожньо, якщо перевірка не застосовується або hostnames коректні
|
|
233
|
+
*/
|
|
234
|
+
export function abieBaseHttpRouteHostnamesErrors(obj, rel) {
|
|
235
|
+
if (!isAbieK8sBaseYamlPath(rel)) {
|
|
236
|
+
return []
|
|
237
|
+
}
|
|
238
|
+
if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) {
|
|
239
|
+
return []
|
|
240
|
+
}
|
|
241
|
+
const rec = /** @type {Record<string, unknown>} */ (obj)
|
|
242
|
+
if (rec.kind !== 'HTTPRoute') {
|
|
243
|
+
return []
|
|
244
|
+
}
|
|
245
|
+
const spec = rec.spec
|
|
246
|
+
if (spec === null || typeof spec !== 'object' || Array.isArray(spec)) {
|
|
247
|
+
return []
|
|
248
|
+
}
|
|
249
|
+
const hostnames = /** @type {Record<string, unknown>} */ (spec).hostnames
|
|
250
|
+
if (hostnames === undefined) {
|
|
251
|
+
return []
|
|
252
|
+
}
|
|
253
|
+
/** @type {string[]} */
|
|
254
|
+
const hosts = []
|
|
255
|
+
if (Array.isArray(hostnames)) {
|
|
256
|
+
for (const h of hostnames) {
|
|
257
|
+
if (typeof h === 'string' && h.trim() !== '') {
|
|
258
|
+
hosts.push(h)
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
} else if (typeof hostnames === 'string' && hostnames.trim() !== '') {
|
|
262
|
+
hosts.push(hostnames)
|
|
263
|
+
}
|
|
264
|
+
if (hosts.length === 0) {
|
|
265
|
+
return []
|
|
266
|
+
}
|
|
267
|
+
const root = ABIE_BASE_DEV_HTTPROUTE_HOST_ROOT
|
|
268
|
+
/** @type {string[]} */
|
|
269
|
+
const errors = []
|
|
270
|
+
for (const h of hosts) {
|
|
271
|
+
if (!isAllowedAbieBaseDevHostname(h)) {
|
|
272
|
+
errors.push(
|
|
273
|
+
`${rel}: HTTPRoute у base (dev): hostname "${h}" недопустимий — дозволені лише ${root} та піддомени, зокрема *.${root} (abie.mdc)`
|
|
274
|
+
)
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return errors
|
|
278
|
+
}
|
|
279
|
+
|
|
194
280
|
/**
|
|
195
281
|
* Чи значення **`preem`** у base **Deployment** вважається «істинним» за abie.mdc (**true** або рядок **`true`** без урахування регістру).
|
|
196
282
|
* @param {unknown} v значення з YAML
|
|
@@ -1050,7 +1136,8 @@ export async function analyzeAbieSharedBackendRefsInPackageK8s(root, pkgAbs, yam
|
|
|
1050
1136
|
if (docs) {
|
|
1051
1137
|
for (const doc of docs) {
|
|
1052
1138
|
if (doc.errors.length === 0) {
|
|
1053
|
-
const
|
|
1139
|
+
const json = doc.toJSON()
|
|
1140
|
+
const st = httpRouteDocSharedCrossNsBackendStats(json, rel)
|
|
1054
1141
|
refCount += st.refCount
|
|
1055
1142
|
baseErrors.push(...st.errors)
|
|
1056
1143
|
}
|
|
@@ -1504,6 +1591,60 @@ async function checkHttpRouteKustomization(abs, rel, mode, root, yamlFilesAbs, c
|
|
|
1504
1591
|
return true
|
|
1505
1592
|
}
|
|
1506
1593
|
|
|
1594
|
+
/**
|
|
1595
|
+
* Для кожного **HTTPRoute** у **`…/k8s/base/…`** з непорожніми **`spec.hostnames`** — лише **aiml.live** та піддомени (abie.mdc).
|
|
1596
|
+
* @param {string} root корінь репозиторію
|
|
1597
|
+
* @param {string[]} yamlFilesAbs yaml під k8s
|
|
1598
|
+
* @param {(msg: string) => void} fail callback при помилці
|
|
1599
|
+
* @param {(msg: string) => void} passFn callback при успішній перевірці
|
|
1600
|
+
* @returns {Promise<void>}
|
|
1601
|
+
*/
|
|
1602
|
+
async function ensureAbieBaseHttpRouteHostnames(root, yamlFilesAbs, fail, passFn) {
|
|
1603
|
+
let baseHttpRoutesWithHostnames = 0
|
|
1604
|
+
for (const abs of yamlFilesAbs) {
|
|
1605
|
+
const rel = relative(root, abs).replaceAll('\\', '/') || abs
|
|
1606
|
+
if (isAbieK8sBaseYamlPath(rel)) {
|
|
1607
|
+
const docs = await readAndParseYamlDocs(abs, rel, fail)
|
|
1608
|
+
if (!docs) {
|
|
1609
|
+
return
|
|
1610
|
+
}
|
|
1611
|
+
for (const doc of docs) {
|
|
1612
|
+
if (doc.errors.length === 0) {
|
|
1613
|
+
const json = doc.toJSON()
|
|
1614
|
+
const errs = abieBaseHttpRouteHostnamesErrors(json, rel)
|
|
1615
|
+
if (errs.length > 0) {
|
|
1616
|
+
for (const e of errs) {
|
|
1617
|
+
fail(e)
|
|
1618
|
+
}
|
|
1619
|
+
return
|
|
1620
|
+
}
|
|
1621
|
+
if (json !== null && typeof json === 'object' && !Array.isArray(json)) {
|
|
1622
|
+
const rec = /** @type {Record<string, unknown>} */ (json)
|
|
1623
|
+
if (rec.kind === 'HTTPRoute') {
|
|
1624
|
+
const spec = rec.spec
|
|
1625
|
+
if (spec !== null && typeof spec === 'object' && !Array.isArray(spec)) {
|
|
1626
|
+
const hostnames = /** @type {Record<string, unknown>} */ (spec).hostnames
|
|
1627
|
+
if (Array.isArray(hostnames) && hostnames.some(h => typeof h === 'string' && h.trim() !== '')) {
|
|
1628
|
+
baseHttpRoutesWithHostnames++
|
|
1629
|
+
} else if (typeof hostnames === 'string' && hostnames.trim() !== '') {
|
|
1630
|
+
baseHttpRoutesWithHostnames++
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
if (baseHttpRoutesWithHostnames > 0) {
|
|
1640
|
+
passFn(
|
|
1641
|
+
`HTTPRoute у …/k8s/base/…: spec.hostnames відповідають ${ABIE_BASE_DEV_HTTPROUTE_HOST_ROOT} та піддоменам (abie.mdc)`
|
|
1642
|
+
)
|
|
1643
|
+
} else {
|
|
1644
|
+
passFn('Немає HTTPRoute у …/k8s/base/… з непорожніми spec.hostnames — перевірку aiml.live пропущено')
|
|
1645
|
+
}
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1507
1648
|
/**
|
|
1508
1649
|
* Якщо є **Deployment** під **k8s**, вимагає в overlay **ua** та **ru** patch **HTTPRoute** (непорожній **target.name**) за abie.mdc
|
|
1509
1650
|
* лише для пакетів з **vite.config.{js,mjs,ts}** у каталозі пакета (батько **k8s**).
|
|
@@ -1542,27 +1683,46 @@ async function ensureUaRuAbieHttpRoutePatches(root, yamlFilesAbs, fail, passFn)
|
|
|
1542
1683
|
}
|
|
1543
1684
|
|
|
1544
1685
|
/**
|
|
1545
|
-
* Перевіряє відсутність артефактів Firebase Hosting у
|
|
1686
|
+
* Перевіряє відсутність артефактів Firebase Hosting у **кожному** **підкаталозі першого рівня** від кореня
|
|
1687
|
+
* (не в самому корені репозиторію) — abie.mdc. Каталоги **`.git`** і **`node_modules`** у скануванні пропускаються.
|
|
1688
|
+
*
|
|
1546
1689
|
* @param {string} root корінь репозиторію
|
|
1547
1690
|
* @param {(msg: string) => void} passFn успішне повідомлення
|
|
1548
1691
|
* @param {(msg: string) => void} failFn повідомлення про порушення
|
|
1549
|
-
* @returns {void}
|
|
1550
|
-
*/
|
|
1551
|
-
function ensureNoFirebaseHostingArtifacts(root, passFn, failFn) {
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1692
|
+
* @returns {Promise<void>}
|
|
1693
|
+
*/
|
|
1694
|
+
async function ensureNoFirebaseHostingArtifacts(root, passFn, failFn) {
|
|
1695
|
+
let entries
|
|
1696
|
+
try {
|
|
1697
|
+
entries = await readdir(root, { withFileTypes: true })
|
|
1698
|
+
} catch (error) {
|
|
1699
|
+
const msg = error instanceof Error ? error.message : String(error)
|
|
1700
|
+
failFn(`Не вдалося прочитати ${root} для перевірки Firebase Hosting: ${msg} (abie.mdc)`)
|
|
1701
|
+
return
|
|
1702
|
+
}
|
|
1703
|
+
const topDirs = entries.filter(
|
|
1704
|
+
e => e.isDirectory() && !ABIE_FIREBASE_HOSTING_SCAN_SKIP_TOP_DIR_NAMES.has(e.name)
|
|
1705
|
+
)
|
|
1706
|
+
let hasViolation = false
|
|
1707
|
+
for (const e of topDirs) {
|
|
1708
|
+
for (const name of ['.firebaserc', 'firebase.json']) {
|
|
1709
|
+
const rel = join(e.name, name).replaceAll('\\', '/')
|
|
1710
|
+
if (existsSync(join(root, e.name, name))) {
|
|
1711
|
+
failFn(`Знайдено заборонений файл Firebase Hosting: ${rel} — видали його (abie.mdc)`)
|
|
1712
|
+
hasViolation = true
|
|
1713
|
+
}
|
|
1714
|
+
}
|
|
1715
|
+
if (existsSync(join(root, e.name, '.firebase'))) {
|
|
1716
|
+
failFn(`Знайдено заборонену директорію: ${e.name}/.firebase/ — видали її (abie.mdc)`)
|
|
1717
|
+
hasViolation = true
|
|
1558
1718
|
}
|
|
1559
1719
|
}
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
failFn('Знайдено директорію .firebase — видали її (abie.mdc)')
|
|
1563
|
-
} else {
|
|
1564
|
-
passFn('Немає .firebase/')
|
|
1720
|
+
if (hasViolation) {
|
|
1721
|
+
return
|
|
1565
1722
|
}
|
|
1723
|
+
passFn(
|
|
1724
|
+
'Підкаталоги кореня (1-й рівень, без .git/node_modules): артефактів Firebase Hosting не знайдено (abie.mdc)'
|
|
1725
|
+
)
|
|
1566
1726
|
}
|
|
1567
1727
|
|
|
1568
1728
|
/**
|
|
@@ -1938,7 +2098,7 @@ export async function check() {
|
|
|
1938
2098
|
}
|
|
1939
2099
|
|
|
1940
2100
|
pass('Правило abie увімкнено — виконуємо перевірки')
|
|
1941
|
-
ensureNoFirebaseHostingArtifacts(root, pass, fail)
|
|
2101
|
+
await ensureNoFirebaseHostingArtifacts(root, pass, fail)
|
|
1942
2102
|
await checkCleanMergedBranch(root, pass, fail)
|
|
1943
2103
|
|
|
1944
2104
|
const yamlFiles = await findK8sYamlFiles(root)
|
|
@@ -1959,6 +2119,9 @@ export async function check() {
|
|
|
1959
2119
|
pass('Перевіряємо Service → NodePort у ru/kustomization (abie.mdc)')
|
|
1960
2120
|
await ensureRuAbieServiceNodePortPatches(root, yamlFiles, fail, pass)
|
|
1961
2121
|
|
|
2122
|
+
pass('Перевіряємо HTTPRoute spec.hostnames у …/k8s/base/… (aiml.live, abie.mdc)')
|
|
2123
|
+
await ensureAbieBaseHttpRouteHostnames(root, yamlFiles, fail, pass)
|
|
2124
|
+
|
|
1962
2125
|
if (deploymentDirs.size > 0) {
|
|
1963
2126
|
pass('Є Deployment — перевіряємо nodeSelector у ua/ru kustomization (abie.mdc)')
|
|
1964
2127
|
await ensureUaRuAbieNodeSelectorPatches(root, yamlFiles, deploymentDirs, fail, pass)
|