## Перевірки NetworkPolicy

Rego-пакет: `k8s.network_policy`

**Цільові файли:** `networkpolicy.yaml` / будь-який YAML з `kind: NetworkPolicy` або `apiVersion: networking.k8s.io/…`.

**Що перевіряється:**

- `apiVersion: networking.k8s.io/v1`
- `kind: NetworkPolicy`
- `spec` — присутній об'єкт
- `spec.podSelector.matchLabels` — присутній об'єкт; поле `app` обов'язкове і непорожнє
- `spec.policyTypes` — містить `Ingress` і `Egress`
- `spec.ingress` — хоча б одне правило з `from.podSelector`
- **Superset-перевірка egress/ingress:** кожне правило з канон-сніпета має бути присутнє в `spec.egress` / `spec.ingress` (extra-правила дозволені). Канон обирається за анотацією `nitra.dev/workload-kind`:
  - `StatefulSet` → [stateful-set.snippet.yaml](./template/stateful-set.snippet.yaml) (додає intra-replica ingress/egress)
  - решта (default) → [deployment.snippet.yaml](./template/deployment.snippet.yaml)
- Заборонено `egress: [{}]` (allow-all) — навіть як extra-правило

**Передача snippets:** через `--data` при виклику conftest (JS передає `templateData` для `runConftestBatch`).

**Примітка:** cross-file визначення `metadata.name` воркнавантаження і мітки `app` — JS (`validateNetworkPolicyForWorkload`).

## Обов'язковість і авто-створення

Для **кожного** workload (**Deployment**, **StatefulSet**, **DaemonSet**, **Job**, **CronJob**) під `k8s` обов'язковий **NetworkPolicy** у **`base/networkpolicy.yaml`** поруч з workload-маніфестом (multi-doc через `---`, якщо workload-ів кілька). Відсутні документи **`check k8s`** створює автоматично (канон і snippet-структура — вище) і додає `networkpolicy.yaml` у `base/kustomization.yaml` `resources:`.

Перевірка/генерація — **`crates/rules-core/src/concerns/k8s_manifests_workloads.rs`** (`validateNetworkPoliciesForK8sWorkloads`, `regenerateLegacyNetworkPolicyDocsInFile`).

## HTTPRoute → NetworkPolicy ingress (GCLB + Envoy)

Якщо в каталозі workload є **`HTTPRoute`** (Gateway API, див. **`gateway.mdc`**) з **`backendRef`** на **`<workload>-hl`** Service, **`check k8s`** автоматично додає в NetworkPolicy цього workload **ingress-правило** з фіксованим набором CIDR-ів і **TCP-портами з `backendRefs[].port`** (дедуп, відсортовано за зростанням).

Без цього правила трафік від **GKE Gateway** (Envoy proxy-only subnet) і **Google health checks** блокується базовим NetworkPolicy.

CIDR-набір зафіксовано (`crates/rules-core/src/concerns/k8s_manifests_workloads.rs`, `NETWORK_POLICY_GCLB_INGRESS_FROM`):

- `35.191.0.0/16` — GCP HC global
- `130.211.0.0/22` — GCP HC global (legacy)
- `10.0.0.0/8` — широкий range, покриває proxy-only subnets усіх регіонів GKE

```yaml title="k8s/base/networkpolicy.yaml — workload з HTTPRoute (з GCLB ingress)"
spec:
  ingress:
    - from:
        - podSelector: {}
    - from: # auto-added by check k8s for HTTPRoute-paired workloads
        - ipBlock: { cidr: 35.191.0.0/16 }
        - ipBlock: { cidr: 130.211.0.0/22 }
        - ipBlock: { cidr: 10.0.0.0/8 }
      ports:
        - { protocol: TCP, port: 8080 }
```

Алгоритм: функція `collectHttpRouteIngressForWorkload` у **`crates/rules-core/src/concerns/k8s_manifests_workloads.rs`** (mapping `backendRef.name` → `Service.metadata.name` → `service.spec.selector.matchLabels.app`).
