nyl 0.10.2__tar.gz → 0.10.4__tar.gz

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.
Files changed (140) hide show
  1. nyl-0.10.4/.changelog/0.10.3.toml +13 -0
  2. {nyl-0.10.2 → nyl-0.10.4}/.github/workflows/docs.yaml +16 -14
  3. {nyl-0.10.2 → nyl-0.10.4}/PKG-INFO +1 -1
  4. {nyl-0.10.2 → nyl-0.10.4}/argocd-cmp/Dockerfile +4 -4
  5. {nyl-0.10.2 → nyl-0.10.4}/argocd-cmp/plugin.yaml +1 -1
  6. {nyl-0.10.2 → nyl-0.10.4}/docs/content/changelog.md +12 -1
  7. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/argocd-plugin.md +4 -0
  8. {nyl-0.10.2 → nyl-0.10.4}/pyproject.toml +1 -1
  9. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/__init__.py +4 -1
  10. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/template.py +2 -1
  11. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/kubernetes.py +14 -0
  12. {nyl-0.10.2 → nyl-0.10.4}/uv.lock +333 -332
  13. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.10.0.toml +0 -0
  14. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.10.1.toml +0 -0
  15. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.10.2.toml +0 -0
  16. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.7.0.toml +0 -0
  17. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.7.1.toml +0 -0
  18. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.7.2.toml +0 -0
  19. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.8.0.toml +0 -0
  20. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.8.1.toml +0 -0
  21. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.9.0.toml +0 -0
  22. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.9.1.toml +0 -0
  23. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.9.2.toml +0 -0
  24. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.9.3.toml +0 -0
  25. {nyl-0.10.2 → nyl-0.10.4}/.changelog/0.9.4.toml +0 -0
  26. {nyl-0.10.2 → nyl-0.10.4}/.envrc +0 -0
  27. {nyl-0.10.2 → nyl-0.10.4}/.github/workflows/docker.yaml +0 -0
  28. {nyl-0.10.2 → nyl-0.10.4}/.github/workflows/python.yaml +0 -0
  29. {nyl-0.10.2 → nyl-0.10.4}/.github/workflows/update-flake-lock.yaml +0 -0
  30. {nyl-0.10.2 → nyl-0.10.4}/.gitignore +0 -0
  31. {nyl-0.10.2 → nyl-0.10.4}/README.md +0 -0
  32. {nyl-0.10.2 → nyl-0.10.4}/argocd-cmp/README.md +0 -0
  33. {nyl-0.10.2 → nyl-0.10.4}/argocd-with-nyl/.envrc +0 -0
  34. {nyl-0.10.2 → nyl-0.10.4}/argocd-with-nyl/.secrets.yaml +0 -0
  35. {nyl-0.10.2 → nyl-0.10.4}/argocd-with-nyl/.sops.yaml +0 -0
  36. {nyl-0.10.2 → nyl-0.10.4}/argocd-with-nyl/README.md +0 -0
  37. {nyl-0.10.2 → nyl-0.10.4}/argocd-with-nyl/argocd.yaml +0 -0
  38. {nyl-0.10.2 → nyl-0.10.4}/argocd-with-nyl/nyl-project.yaml +0 -0
  39. {nyl-0.10.2 → nyl-0.10.4}/argocd-with-nyl/nyl-secrets.yaml +0 -0
  40. {nyl-0.10.2 → nyl-0.10.4}/docs/content/index.md +0 -0
  41. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/applysets.md +0 -0
  42. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/cluster-connectivity.md +0 -0
  43. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/configuration/environment.md +0 -0
  44. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/configuration/profiles.md +0 -0
  45. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/configuration/projects.md +0 -0
  46. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/configuration/secrets.md +0 -0
  47. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/configuration-api/profiles.md +0 -0
  48. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/configuration-api/secrets.md +0 -0
  49. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/glossary.md +0 -0
  50. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/templating/basics.md +0 -0
  51. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/templating/components.md +0 -0
  52. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/templating/inlining/helmcharts.md +0 -0
  53. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/templating/inlining/overview.md +0 -0
  54. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/templating/inlining/postprocessor.md +0 -0
  55. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/templating/locals.md +0 -0
  56. {nyl-0.10.2 → nyl-0.10.4}/docs/content/reference/templating/secrets.md +0 -0
  57. {nyl-0.10.2 → nyl-0.10.4}/docs/mkdocs.yml +0 -0
  58. {nyl-0.10.2 → nyl-0.10.4}/docs/pyproject.toml +0 -0
  59. {nyl-0.10.2 → nyl-0.10.4}/docs/uv.lock +0 -0
  60. {nyl-0.10.2 → nyl-0.10.4}/example/manifests/postgres.yaml +0 -0
  61. {nyl-0.10.2 → nyl-0.10.4}/example/nyl-profiles.toml +0 -0
  62. {nyl-0.10.2 → nyl-0.10.4}/example/nyl-profiles.yaml +0 -0
  63. {nyl-0.10.2 → nyl-0.10.4}/example/nyl-secrets.yaml +0 -0
  64. {nyl-0.10.2 → nyl-0.10.4}/example/secrets.yaml +0 -0
  65. {nyl-0.10.2 → nyl-0.10.4}/flake.lock +0 -0
  66. {nyl-0.10.2 → nyl-0.10.4}/flake.nix +0 -0
  67. {nyl-0.10.2 → nyl-0.10.4}/nix/uv.nix +0 -0
  68. {nyl-0.10.2 → nyl-0.10.4}/renovate.json +0 -0
  69. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/README.md +0 -0
  70. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/__init__.pyi +0 -0
  71. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/dynamic/__init__.pyi +0 -0
  72. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/dynamic/client.pyi +0 -0
  73. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/dynamic/discovery.pyi +0 -0
  74. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/dynamic/exceptions.pyi +0 -0
  75. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/dynamic/resource.pyi +0 -0
  76. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/watch/__init__.pyi +0 -0
  77. {nyl-0.10.2 → nyl-0.10.4}/src/kubernetes/watch/watch.pyi +0 -0
  78. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/__init__.py +0 -0
  79. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/add.py +0 -0
  80. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/crds.py +0 -0
  81. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/new.py +0 -0
  82. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/profile.py +0 -0
  83. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/run.py +0 -0
  84. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/secrets.py +0 -0
  85. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/tools/__init__.py +0 -0
  86. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/tools/bcrypt.py +0 -0
  87. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/tools/sops.py +0 -0
  88. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/commands/tun.py +0 -0
  89. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/daemon.py +0 -0
  90. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/generator/__init__.py +0 -0
  91. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/generator/components.py +0 -0
  92. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/generator/dispatch.py +0 -0
  93. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/generator/dispatch_test.py +0 -0
  94. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/generator/helmchart.py +0 -0
  95. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/generator/helmchart_test.py +0 -0
  96. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/generator/statefulsecret.py +0 -0
  97. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/profiles/__init__.py +0 -0
  98. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/profiles/config.py +0 -0
  99. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/profiles/config_test.py +0 -0
  100. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/profiles/kubeconfig.py +0 -0
  101. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/profiles/tunnel.py +0 -0
  102. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/project/config.py +0 -0
  103. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/__init__.py +0 -0
  104. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/applyset.py +0 -0
  105. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/applyset_test.py +0 -0
  106. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/helmchart.py +0 -0
  107. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/helmchart_test.py +0 -0
  108. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/placeholder.py +0 -0
  109. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/postprocessor.py +0 -0
  110. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/postprocessor_test.py +0 -0
  111. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/resources/statefulsecret.py +0 -0
  112. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/secrets/__init__.py +0 -0
  113. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/secrets/config.py +0 -0
  114. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/secrets/config_test.py +0 -0
  115. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/secrets/kubernetes.py +0 -0
  116. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/secrets/null.py +0 -0
  117. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/secrets/sops.py +0 -0
  118. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/secrets/sops_test.py +0 -0
  119. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/templating.py +0 -0
  120. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/templating_test.py +0 -0
  121. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/di.py +0 -0
  122. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/fs.py +0 -0
  123. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/fs_test.py +0 -0
  124. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/kubectl.py +0 -0
  125. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/kvstore.py +0 -0
  126. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/loads.py +0 -0
  127. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/logging.py +0 -0
  128. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/pyroscope.py +0 -0
  129. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/shell.py +0 -0
  130. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/testing.py +0 -0
  131. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/typer.py +0 -0
  132. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/types.py +0 -0
  133. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/url.py +0 -0
  134. {nyl-0.10.2 → nyl-0.10.4}/src/nyl/tools/yaml.py +0 -0
  135. {nyl-0.10.2 → nyl-0.10.4}/src/pyroscope/__init__.pyi +0 -0
  136. {nyl-0.10.2 → nyl-0.10.4}/testdata/helm-test-chart/Chart.yaml +0 -0
  137. {nyl-0.10.2 → nyl-0.10.4}/testdata/helm-test-chart/templates/sa.yaml +0 -0
  138. {nyl-0.10.2 → nyl-0.10.4}/testdata/helm-test-chart/values.yaml +0 -0
  139. {nyl-0.10.2 → nyl-0.10.4}/tests/__init__.py +0 -0
  140. {nyl-0.10.2 → nyl-0.10.4}/tests/conftest.py +0 -0
@@ -0,0 +1,13 @@
1
+ release-date = "2025-05-08"
2
+
3
+ [[entries]]
4
+ id = "67d4932f-0e84-4299-90ae-333cf7774ee0"
5
+ type = "improvement"
6
+ description = "Further improve filtering of env vars that start with ARGOCD_ but are Kubernetes-specific"
7
+ author = "@NiklasRosenstein"
8
+
9
+ [[entries]]
10
+ id = "5b794574-bca0-4160-b2ff-3f5d68e296a9"
11
+ type = "improvement"
12
+ description = "Automatically drop empty `.metadata.labels` fields from resources generated with `nyl template` to prevent resources with such labels to immediately be `OutOfSync` after apply in ArgoCD"
13
+ author = "@NiklasRosenstein"
@@ -2,19 +2,21 @@ name: Documentation
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [ develop ]
6
- tags: [ '*' ]
7
- pull_request:
8
- branches: [ develop ]
5
+ branches: [develop]
9
6
 
10
7
  jobs:
11
8
  build:
12
9
  runs-on: ubuntu-latest
13
10
  permissions:
14
- contents: write
15
-
11
+ contents: read
12
+ pages: write
13
+ id-token: write
14
+ environment:
15
+ name: github-pages
16
+ url: ${{steps.deployment.outputs.page_url}}
16
17
  steps:
17
18
  - uses: actions/checkout@v4
19
+ - uses: actions/configure-pages@v5
18
20
  - name: Check Nix flake Nixpkgs inputs
19
21
  uses: DeterminateSystems/flake-checker-action@main
20
22
  - uses: cachix/install-nix-action@v31
@@ -24,15 +26,15 @@ jobs:
24
26
  with:
25
27
  name: mycache
26
28
  # If you chose signing key for write access
27
- signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
29
+ signingKey: "${{ secrets.CACHIX_SIGNING_KEY }}"
28
30
  # If you chose API tokens for write access OR if you have a private cache
29
- authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
30
-
31
+ authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
31
32
  - name: Build docs
32
33
  run: nix run .#docs build
33
-
34
- - name: Publish documentation
35
- uses: peaceiris/actions-gh-pages@v4
34
+ - name: Upload Artifact
35
+ uses: actions/upload-pages-artifact@v3
36
36
  with:
37
- personal_token: ${{ secrets.GITHUB_TOKEN }}
38
- publish_dir: ./docs/site
37
+ path: ./docs/site
38
+ - name: Deploy to GitHub Pages
39
+ id: deployment
40
+ uses: actions/deploy-pages@v4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nyl
3
- Version: 0.10.2
3
+ Version: 0.10.4
4
4
  Summary: Advanced templating engine for Kubernetes and GitOps.
5
5
  Author-email: Niklas Rosenstein <rosensteinniklas@gmail.com>
6
6
  License: MIT
@@ -1,5 +1,5 @@
1
1
  FROM python:3.13-slim AS build_base
2
- COPY --from=ghcr.io/astral-sh/uv:0.7.2 /uv /bin/uv
2
+ COPY --from=ghcr.io/astral-sh/uv:0.7.12 /uv /bin/uv
3
3
 
4
4
  #: Build Nyl itself.
5
5
  #: -----------------
@@ -41,7 +41,7 @@ RUN \
41
41
  FROM fetch-bin-base AS argocd-bin
42
42
  # Find ArgoCD releases at https://github.com/argoproj/argo-cd/releases
43
43
  # renovate: datasource=github-releases depName=argocd packageName=argoproj/argo-cd
44
- ARG ARGOCD_VERSION=v2.14.11
44
+ ARG ARGOCD_VERSION=v2.14.14
45
45
  RUN curl -sSfLo /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/${ARGOCD_VERSION}/argocd-linux-$(cat /BINARY_ARCH) \
46
46
  && chmod +x /usr/local/bin/argocd \
47
47
  && upx /usr/local/bin/argocd \
@@ -50,7 +50,7 @@ RUN curl -sSfLo /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releas
50
50
  FROM fetch-bin-base AS helm-bin
51
51
  # Find Helm releases at https://github.com/helm/helm/releases
52
52
  # renovate: datasource=github-releases depName=helm packageName=helm/helm
53
- ARG HELM_VERSION=v3.17.3
53
+ ARG HELM_VERSION=v3.18.2
54
54
  RUN curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 \
55
55
  && chmod 700 get_helm.sh \
56
56
  && ./get_helm.sh --version $HELM_VERSION \
@@ -69,7 +69,7 @@ RUN curl -fLO https://github.com/getsops/sops/releases/download/${SOPS_VERSION}/
69
69
 
70
70
  FROM fetch-bin-base AS kyverno-bin
71
71
  # renovate: datasource=github-releases depName=kyverno packageName=kyverno/kyverno
72
- ARG KYVERNO_VERSION=1.14.1
72
+ ARG KYVERNO_VERSION=1.14.2
73
73
  RUN \
74
74
  case "$(uname -m)" in \
75
75
  x86_64) KYVERNO_ARCH='x86_64' ;; \
@@ -16,7 +16,7 @@ spec:
16
16
  - -c
17
17
  - |
18
18
  cd $(git rev-parse --show-toplevel)
19
- find -name 'nyl-secrets.*' || find -name 'nyl-project.*'
19
+ (find . -name 'nyl-secrets.*' | grep .) || (find . -name 'nyl-project.*' | grep .)
20
20
 
21
21
  # init:
22
22
  # command:
@@ -1,3 +1,14 @@
1
+ ## 0.10.3 (2025-05-08)
2
+
3
+ <table><tr><th>Type</th><th>Description</th><th>PR</th><th>Issues</th><th>Author</th></tr>
4
+ <tr><td>Improvement</td><td>
5
+
6
+ Further improve filtering of env vars that start with ARGOCD_ but are Kubernetes-specific</td><td></td><td></td><td>@NiklasRosenstein</td></tr>
7
+ <tr><td>Improvement</td><td>
8
+
9
+ Automatically drop empty `.metadata.labels` fields from resources generated with `nyl template` to prevent resources with such labels to immediately be `OutOfSync` after apply in ArgoCD</td><td></td><td></td><td>@NiklasRosenstein</td></tr>
10
+ </table>
11
+
1
12
  ## 0.10.2 (2025-05-08)
2
13
 
3
14
  <table><tr><th>Type</th><th>Description</th><th>PR</th><th>Issues</th><th>Author</th></tr>
@@ -192,6 +203,6 @@ Refactor `PostProcessor` implementation for generating policy files and invoking
192
203
  `PostProcessor` log for invoking Kyverno now lists the policy file paths that are going to be applied</td><td></td><td></td><td>@NiklasRosenstein</td></tr>
193
204
  <tr><td>Fix</td><td>
194
205
 
195
- `nyl new chart` now generates 2-space indented YAML and has a more complete template</td><td></td><td><a href="https://github.com/NiklasRosenstein/nyl/issues/47">47</a></td><td>@NiklasRosenstein</td></tr>
206
+ `nyl new chart` now generates 2-space indented YAML and has a more complete template</td><td></td><td><a href="https://github.com/NiklasRosenstein/nyl/issues/47">NiklasRosenstein/nyl#47</a></td><td>@NiklasRosenstein</td></tr>
196
207
  </table>
197
208
 
@@ -53,6 +53,10 @@ repoServer:
53
53
 
54
54
  ## Installation (Daemon)
55
55
 
56
+ !!! warning
57
+
58
+ The daemon mode is currently in an experimental state and not recommended for production use.
59
+
56
60
  The above example will invoke the `nyl template` command again and again for each time an application's manifests are
57
61
  refreshed by ArgoCD. This carries a bit of a performance penalty, since a new Nyl process is spawned each time and
58
62
  loading its code from disk.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nyl"
7
- version = "0.10.2"
7
+ version = "0.10.4"
8
8
  description = "Advanced templating engine for Kubernetes and GitOps."
9
9
  authors = [
10
10
  {name = "Niklas Rosenstein", email = "rosensteinniklas@gmail.com"},
@@ -88,7 +88,10 @@ def _callback(
88
88
  for key, value in os.environ.items():
89
89
  if (
90
90
  # Keep ARGOCD_ environment variables but filter out those that are likely set by Kubernetes.
91
- (key.startswith("ARGOCD_") and not (key.endswith("_PORT") or key.endswith("_TCP") or key.endswith("_ADDR")))
91
+ (
92
+ key.startswith("ARGOCD_")
93
+ and not any(x in key for x in ["_PORT", "_PROTO", "_SERVER", "_HOST", "_SERVICE", "_TCP", "_UDP"])
94
+ )
92
95
  or key.startswith("NYL_")
93
96
  or key.startswith("KUBE_")
94
97
  ):
@@ -27,7 +27,7 @@ from nyl.secrets.config import SecretsConfig
27
27
  from nyl.templating import NylTemplateEngine
28
28
  from nyl.tools import yaml
29
29
  from nyl.tools.kubectl import Kubectl
30
- from nyl.tools.kubernetes import populate_namespace_to_resources
30
+ from nyl.tools.kubernetes import drop_empty_metadata_labels, populate_namespace_to_resources
31
31
  from nyl.tools.logging import lazy_str
32
32
  from nyl.tools.types import Resource, ResourceList
33
33
 
@@ -365,6 +365,7 @@ def template(
365
365
  labels[APPLYSET_LABEL_PART_OF] = applyset.id
366
366
 
367
367
  populate_namespace_to_resources(source.resources, current_default_namespace)
368
+ drop_empty_metadata_labels(source.resources)
368
369
 
369
370
  # Now apply the post-processor.
370
371
  source.resources = PostProcessor.apply_all(source.resources, post_processors, source.file)
@@ -51,6 +51,20 @@ def populate_namespace_to_resources(resources: list[Resource], namespace: str) -
51
51
  resource["metadata"]["namespace"] = namespace
52
52
 
53
53
 
54
+ def drop_empty_metadata_labels(resources: list[Resource]) -> None:
55
+ """
56
+ Drop the `metadata.labels` field from all resources that have it but are empty.
57
+
58
+ This gets applied to resources after templating as it can cause the resources to be OutOfSync immediately
59
+ after apply as the Kubernetes API stores the empty labels as `null` instead of `{}`.
60
+ """
61
+
62
+ for resource in resources:
63
+ if "metadata" in resource and "labels" in resource["metadata"]:
64
+ if not resource["metadata"]["labels"]:
65
+ del resource["metadata"]["labels"]
66
+
67
+
54
68
  def is_cluster_scoped_resource(manifest: Resource) -> bool:
55
69
  """
56
70
  Check if a manifest is a cluster scoped resource.