[cozy-lib] Fix malformed ResourceQuota rendering for LoadBalancer services (#1642)

This patch adds special handling for raw Kubernetes ResourceQuota
fields, such as `services.loadbalancers`, preventing them from being
wrapped as `limits.*` or `requests.*` keys by the flatten helper. This
ensures that LoadBalancer quotas render correctly in tenant
specifications.

```release-note
[cozy-lib] Correctly render services.loadbalancers in ResourceQuota without limits.* or requests.* prefixes.
```

<!-- Thank you for making a contribution! Here are some tips for you:
- Start the PR title with the [label] of Cozystack component:
- For system components: [platform], [system], [linstor], [cilium],
[kube-ovn], [dashboard], [cluster-api], etc.
- For managed apps: [apps], [tenant], [kubernetes], [postgres],
[virtual-machine] etc.
- For development and maintenance: [tests], [ci], [docs], [maintenance].
- If it's a work in progress, consider creating this PR as a draft.
- Don't hesistate to ask for opinion and review in the community chats,
even if it's still a draft.
- Add the label `backport` if it's a bugfix that needs to be backported
to a previous version.
-->

## What this PR does


### Release note

<!--  Write a release note:
- Explain what has changed internally and for users.
- Start with the same [label] as in the PR title
- Follow the guidelines at
https://github.com/kubernetes/community/blob/master/contributors/guide/release-notes.md.
-->

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Refactor**
* Resource flattening now handles compute and quota keys separately:
compute values are sanitized/flattened, quota-like inputs are emitted
directly as plain YAML.

* **Documentation**
* Added in-template comments and clarified examples for resource
processing behavior.

* **New Features**
* CI now runs unit tests; new test targets and test harnesses added
along with a test chart and test cases for quota handling.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Andrei Kvapil
2025-11-25 14:45:50 +01:00
committed by GitHub

View File

@@ -174,15 +174,68 @@
{{- end }}
{{- define "cozy-lib.resources.flatten" -}}
{{- /*
This helper either outputs raw ResourceQuota fields (e.g., services.loadbalancers)
as-is, or flattens sanitized resource maps into limits.* / requests.* keys.
If ALL keys in the input are recognized quota keys (pods, services.*, etc.),
the input is output directly as YAML. Otherwise, the input is treated as a
resource map and processed through sanitize + flatten.
Do not mix quota keys and resource keys in a single call.
*/ -}}
{{- $input := index . 0 -}}
{{- $ctx := index . 1 -}}
{{- $rawQuotaKeys := list
"pods"
"services"
"services.loadbalancers"
"services.nodeports"
"services.clusterip"
"configmaps"
"secrets"
"persistentvolumeclaims"
"replicationcontrollers"
"resourcequotas"
-}}
{{- $computeKeys := list
"cpu"
"memory"
"ephemeral-storage"
-}}
{{- $out := dict -}}
{{- $res := include "cozy-lib.resources.sanitize" . | fromYaml -}}
{{- $computeResources := dict -}}
{{- $quotaResources := dict -}}
{{- range $k, $v := $input }}
{{- if or (has $k $computeKeys) (hasPrefix "limits." $k) (hasPrefix "requests." $k) }}
{{- $_ := set $computeResources $k $v }}
{{- else if has $k $rawQuotaKeys }}
{{- $_ := set $quotaResources $k $v }}
{{- else }}
{{- $_ := set $computeResources $k $v }}
{{- end }}
{{- end }}
{{- if $computeResources }}
{{- $res := include "cozy-lib.resources.sanitize" (list $computeResources (index . 1)) | fromYaml -}}
{{- range $section, $values := $res }}
{{- range $k, $v := $values }}
{{- $key := printf "%s.%s" $section $k }}
{{- if ne $key "limits.storage" }}
{{- $_ := set $out $key $v }}
{{- end }}
{{- end }}
{{- range $k, $v := $values }}
{{- $key := printf "%s.%s" $section $k }}
{{- if ne $key "limits.storage" }}
{{- $_ := set $out $key $v }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- range $k, $v := $quotaResources }}
{{- $_ := set $out $k $v }}
{{- end }}
{{- $out | toYaml }}
{{- end }}