mirror of
https://github.com/projectcapsule/capsule.git
synced 2026-08-25 16:07:24 +00:00
* fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update codecov/codecov-action action to v5.5.2 (#1783) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to 43a17d6 (#1781) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module k8s.io/dynamic-resource-allocation to v0.34.3 (#1786) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module k8s.io/apiextensions-apiserver to v0.34.3 (#1785) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(controller): allow no spaces in template references (#1789) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix(controller): allow no spaces in template references Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix(controller): allow no spaces in template references Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update securego/gosec action to v2.22.11 (#1788) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1791) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update k8s.io/utils digest to 61b37f7 (#1801) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(controller): template concurrency (#1802) Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1795) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency kubernetes-sigs/kind to v0.31.0 (#1796) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update kubernetes packages to v0.35.0 (#1797) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module k8s.io/dynamic-resource-allocation to v0.35.0 (#1798) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency kubernetes-sigs/controller-tools to v0.20.0 (#1799) * chore(deps): update dependency kubernetes-sigs/controller-tools to v0.20.0 * chore(deps): update dependency kubernetes-sigs/controller-tools to v0.20.0 Signed-off-by: Hristo Hristov <me@hhristov.info> --------- Signed-off-by: Hristo Hristov <me@hhristov.info> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update k8s.io/utils digest to 98d557b (#1803) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1793) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module github.com/onsi/ginkgo/v2 to v2.27.3 (#1776) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update github/codeql-action digest to f67ec12 (#1790) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency google/ko to v0.18.1 (#1792) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module github.com/onsi/gomega to v1.38.3 (#1777) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module sigs.k8s.io/cluster-api to v1.12.1 (#1784) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update k8s.io/utils digest to 383b50a (#1804) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update actions/stale digest to a21a081 (#1808) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: adjust makefile and releaser for kubernetes 1.35 (#1809) * chore: adjust makefile and releaser for kubernetes 1.35 Signed-off-by: Hristo Hristov <me@hhristov.info> * chore: adjust makefile and releaser for kubernetes 1.35 Signed-off-by: Hristo Hristov <me@hhristov.info> --------- Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1807) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update k8s.io/utils digest to 718f0e5 (#1806) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to a930d0a (#1805) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update helm release kube-prometheus-stack to v80.8.2 (#1810) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add dynamic capsule user evaluation (#1811) * chore: improve dev targets Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(controller): implement deterministic rolebinding reflection Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(controller): capsule users are determined from configuration status Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(tenantowners): added agreggate option - tenantowners are always considered capsule users Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(tenantowner): add implicit aggregation for tenants Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: remove helm flags Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix(config): remove usergroups default Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update helm release kube-prometheus-stack to v80.9.2 (#1812) Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1814) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update amannn/action-semantic-pull-request digest to 71b07ef (#1815) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update github/codeql-action digest to fd448f7 (#1816) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: use cert-manager certificates by default (#1818) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(helm): use cert-manager certificates by default Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: move dependencies to trackable resources Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: move dependencies to trackable resources Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: move dependencies to trackable resources Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: move dependencies to trackable resources Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: move dependencies to trackable resources Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: move dependencies to trackable resources Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update helm release kube-prometheus-stack to v80.13.2 (#1817) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency prometheus-operator/prometheus-operator to v0.87.1 (#1820) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency golangci/golangci-lint to v2.8.0 (#1823) * chore(deps): update dependency golangci/golangci-lint to v2.8.0 * chore(deps): update dependency golangci/golangci-lint to v2.8.0 Signed-off-by: Hristo Hristov <me@hhristov.info> * chore(deps): update dependency golangci/golangci-lint to v2.8.0 Signed-off-by: Hristo Hristov <me@hhristov.info> * chore(deps): update dependency golangci/golangci-lint to v2.8.0 Signed-off-by: Hristo Hristov <me@hhristov.info> --------- Signed-off-by: Hristo Hristov <me@hhristov.info> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update helm release kube-prometheus-stack to v80.13.3 (#1827) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module github.com/onsi/gomega to v1.39.0 (#1826) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency prometheus-operator/prometheus-operator to v0.88.0 (#1828) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module github.com/onsi/ginkgo/v2 to v2.27.4 (#1825) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to 0b82b0b (#1824) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update k8s.io/utils digest to 914a6e7 (#1822) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1830) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update actions/stale digest to d6f8a33 (#1843) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update amannn/action-semantic-pull-request digest to b439535 (#1835) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update actions/checkout action to v6.0.2 (#1845) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1847) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1848) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add ruleset api(#1844) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix(config): remove usergroups default Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix(config): remove usergroups default Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * sec(ghsa-2ww6-hf35-mfjm): intercept namespace subresource Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency alessandrojcm/commitlint-pre-commit-hook to v9.24.0 (#1833) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to deef08a (#1836) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency adrienverge/yamllint to v1.38.0 (#1832) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update github/codeql-action digest to b2ff80d (#1821) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update github/codeql-action digest to f985be5 (#1850) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to 5620efe (#1852) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1851) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1837) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1856) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update github/codeql-action digest to 8aac4e4 (#1855) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: diverse performance improvements (#1861) Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update actions/stale digest to dcd2b94 (#1857) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(docs): update home in chart.yaml (#1864) * fix(docs): update home in chart.yaml Signed-off-by: sandert-k8s <sandert98@gmail.com> * fix: linter Signed-off-by: sandert-k8s <sandert98@gmail.com> --------- Signed-off-by: sandert-k8s <sandert98@gmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update actions/stale digest to b5d41d4 (#1866) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update zgosalvez/github-actions-ensure-sha-pinned-actions action to v5 (#1865) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update amannn/action-semantic-pull-request digest to ac7e3fc (#1871) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to 6d473d3 (#1860) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to 17ae174 (#1876) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update github/codeql-action digest to 0ec47d0 (#1858) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to 57aae52 (#1882) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update actions/stale digest to db5d06a (#1886) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to a0a6512 (#1887) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to e22c389 (#1888) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update anchore/sbom-action digest to f0d33c1 (#1893) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(workflows): bump trivy action to 0.35.0 (#1896) Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(webhook): adapt to controller-runtime breaking change in newwebhookmanagedby (#1898) Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add e2e openshift support (#1894) * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> * feat: add e2e openshift support Signed-off-by: Hristo Hristov <me@hhristov.info> --------- Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1873) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1859) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency alessandrojcm/commitlint-pre-commit-hook to v9.25.0 (#1907) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): set renovate minimum release age to 14 days (#1908) Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: add lfx status badges (#1909) Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * ci: pin slsa provenance workflow (#1903) Signed-off-by: Akash Kumar <meakash7902@gmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency b1nary-gr0up/nwa to v0.7.8 (#1906) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1900) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: upstream enterprise preview (#1841) feat: upstream enterprise preview --------- Signed-off-by: Oliver Baehler <oliver@sudo-i.net> Co-authored-by: CorentinPtrl <pitrel.corentin@gmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: bump supported version (#1918) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: bump makefile 1.35 --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: release workflows (#1919) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: bump makefile 1.35 * fix: release workflows Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: reuse webhookport from values (#1927) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix: reuse webhookport from values Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: consider webhooks.service.port Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: consider webhooks.service.port Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: correct helm values schema for webservcie ports (#1928) Signed-off-by: bakito <github@bakito.ch> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: correct helm docs for webhook service port schema (#1929) Signed-off-by: bakito <github@bakito.ch> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update capsule-proxy docker tag to v0.12.0 (#1846) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency prometheus-operator/prometheus-operator to v0.91.0 (#1849) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update dependency grafana/grafana-operator to v5.22.2 (#1819) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: use release age for all managers except helm (#1931) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: use release age for all managers except helm Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update capsule-proxy docker tag to v0.13.1 (#1932) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add observedgeneration to status object of all crds (#1930) * feat: add observedgeneration to status object of all crds Signed-off-by: sandert-k8s <sandert98@gmail.com> * chore(api): rename rulestatusspec to rulestatusstatus Signed-off-by: sandert-k8s <sandert98@gmail.com> --------- Signed-off-by: sandert-k8s <sandert98@gmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: promote sander tervoert as maintainer (#1933) * chore: promote sander tervoert as maintainer Signed-off-by: Hristo Hristov <me@hhristov.info> * chore: promote sander tervoert as maintainer Signed-off-by: Hristo Hristov <me@hhristov.info> * chore: promote sander tervoert as maintainer Signed-off-by: Hristo Hristov <me@hhristov.info> * chore: promote sander tervoert as maintainer Signed-off-by: Hristo Hristov <me@hhristov.info> --------- Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: promote sander tervoert as maintainer (#1939) Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * ci: add goreleaser dry run (#1936) Signed-off-by: Alan <alan747271363-art@users.noreply.github.com> Co-authored-by: Alan <alan747271363-art@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module gomodules.xyz/jsonpatch/v2 to v3 (#1917) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update helm release kube-prometheus-stack to v85 (#1914) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module go.uber.org/zap to v1.28.0 (#1904) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: avoid rejection when users are classified as administrators (#1941) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix: avoid rejection when users are classified as administrators Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update capsule-proxy docker tag to v0.13.2 (#1942) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module sigs.k8s.io/gateway-api to v1.5.1 (#1878) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: typo in ruleset description crd (#1944) Signed-off-by: sandert-k8s <sandert98@gmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add tenant list to status of capsuleconfiguration (#1935) Signed-off-by: sandert-k8s <sandert98@gmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: correct tls reconciler and add tenantowners (#1946) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix: tls controller Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add tenantowner tenant status reference Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: tlsreconciler only patches cabundles Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: refactor logger usage Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix: tlsreconciler only patches cabundles Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: tlsreconciler only patches cabundles Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: fix typo (#1945) * chore: typo in ruleset description crd Signed-off-by: sandert-k8s <sandert98@gmail.com> * chore: fix typo Signed-off-by: sandert-k8s <sandert98@gmail.com> --------- Signed-off-by: sandert-k8s <sandert98@gmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: allow managed metadata defined per tenant (#1947) * fix: allow managed metadata defined per tenant Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: allow managed metadata defined per tenant Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: action type Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: preserve ca-bundles injected from external providers (#1948) * fix: preserve ca-bundles injected from external providers (#1948) Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix(deps): update module sigs.k8s.io/cluster-api to v1.13.2 (#1874) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat(deps): bump golang 1.26.4 (#1949) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix: preserve ca-bundles injected from external providers Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat(deps): bump golang 1.26.4 Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * feat(deps): bump golang 1.26.4 Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update capsule-proxy docker tag to v0.13.3 (#1950) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore(deps): update all-ci-updates (#1902) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: best effort patch reconciling status (#1952) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix: preserve ca-bundles injected from external providers Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: best effort patch reconciling status Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: use different match strategy for truthy and match (#1953) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix: preserve ca-bundles injected from external providers Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: best effort patch reconciling status Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: use different match strategy for truthy and match Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * progress Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add registry Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add registry Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * chore: update all gihub actions, use digest versioning and remove obsolete docs-lint workflow (#1955) Signed-off-by: bakito <github@bakito.ch> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: translate serviceaccounts to type serviceaccount not user (#1956) * fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix: preserve ca-bundles injected from external providers Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * fix: translate serviceaccounts to type serviceaccount not user Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> * feat: add improved registry enforcement Signed-off-by: Oliver Baehler <oliver@sudo-i.net> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> Signed-off-by: Oliver Baehler <oliver@sudo-i.net> Signed-off-by: Hristo Hristov <me@hhristov.info> Signed-off-by: sandert-k8s <sandert98@gmail.com> Signed-off-by: Akash Kumar <meakash7902@gmail.com> Signed-off-by: bakito <github@bakito.ch> Signed-off-by: Alan <alan747271363-art@users.noreply.github.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Hristo Hristov <me@hhristov.info> Co-authored-by: Sander Tervoert <32864332+sandert-k8s@users.noreply.github.com> Co-authored-by: Akash Kumar <91385321+AkashKumar7902@users.noreply.github.com> Co-authored-by: CorentinPtrl <pitrel.corentin@gmail.com> Co-authored-by: Marc Brugger <github@bakito.ch> Co-authored-by: alan747271363-art <alan747271363@gmail.com> Co-authored-by: Alan <alan747271363-art@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
931 lines
29 KiB
Go
931 lines
29 KiB
Go
// Copyright 2020-2023 Project Capsule Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package e2e
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sort"
|
|
"time"
|
|
|
|
. "github.com/onsi/ginkgo/v2"
|
|
. "github.com/onsi/gomega"
|
|
otypes "github.com/onsi/gomega/types"
|
|
corev1 "k8s.io/api/core/v1"
|
|
rbacv1 "k8s.io/api/rbac/v1"
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
|
|
capsulev1beta2 "github.com/projectcapsule/capsule/api/v1beta2"
|
|
"github.com/projectcapsule/capsule/pkg/api/meta"
|
|
"github.com/projectcapsule/capsule/pkg/api/rbac"
|
|
"github.com/projectcapsule/capsule/pkg/api/rules"
|
|
)
|
|
|
|
var serviceAccountPromotionClusterRoles = []string{
|
|
"prod-view",
|
|
"prod-edit",
|
|
"dev-view",
|
|
}
|
|
|
|
func expectPromotionTargets(
|
|
tenantName string,
|
|
serviceAccount *corev1.ServiceAccount,
|
|
clusterRoles []string,
|
|
targets []string,
|
|
) {
|
|
expectedClusterRoles := append([]string(nil), clusterRoles...)
|
|
expectedTargets := append([]string(nil), targets...)
|
|
|
|
sort.Strings(expectedClusterRoles)
|
|
sort.Strings(expectedTargets)
|
|
|
|
Eventually(func(g Gomega) rbac.PromotionStatusListSpec {
|
|
t := &capsulev1beta2.Tenant{}
|
|
err := k8sClient.Get(context.TODO(), types.NamespacedName{Name: tenantName}, t)
|
|
g.Expect(err).NotTo(HaveOccurred())
|
|
|
|
return t.Status.Promotions
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(
|
|
ContainElement(rbac.PromotionSpec{
|
|
UserSpec: rbac.UserSpec{
|
|
Kind: rbac.ServiceAccountOwner,
|
|
Name: "system:serviceaccount:" + serviceAccount.GetNamespace() + ":" + serviceAccount.GetName(),
|
|
},
|
|
ClusterRoles: expectedClusterRoles,
|
|
Targets: expectedTargets,
|
|
}),
|
|
"expected promotion for ServiceAccount %s/%s with clusterRoles=%v targets=%v",
|
|
serviceAccount.Namespace,
|
|
serviceAccount.Name,
|
|
expectedClusterRoles,
|
|
expectedTargets,
|
|
)
|
|
}
|
|
|
|
func expectNoPromotionTargets(
|
|
tenantName string,
|
|
serviceAccount *corev1.ServiceAccount,
|
|
clusterRoles []string,
|
|
targets []string,
|
|
) {
|
|
expectedClusterRoles := append([]string(nil), clusterRoles...)
|
|
expectedTargets := append([]string(nil), targets...)
|
|
|
|
sort.Strings(expectedClusterRoles)
|
|
sort.Strings(expectedTargets)
|
|
|
|
Consistently(func(g Gomega) rbac.PromotionStatusListSpec {
|
|
t := &capsulev1beta2.Tenant{}
|
|
err := k8sClient.Get(context.TODO(), types.NamespacedName{Name: tenantName}, t)
|
|
g.Expect(err).NotTo(HaveOccurred())
|
|
|
|
return t.Status.Promotions
|
|
}, 2*time.Second, defaultPollInterval).ShouldNot(
|
|
ContainElement(rbac.PromotionSpec{
|
|
UserSpec: rbac.UserSpec{
|
|
Kind: rbac.ServiceAccountOwner,
|
|
Name: "system:serviceaccount:" + serviceAccount.GetNamespace() + ":" + serviceAccount.GetName(),
|
|
},
|
|
ClusterRoles: expectedClusterRoles,
|
|
Targets: expectedTargets,
|
|
}),
|
|
"did not expect promotion for ServiceAccount %s/%s with clusterRoles=%v targets=%v",
|
|
serviceAccount.Namespace,
|
|
serviceAccount.Name,
|
|
expectedClusterRoles,
|
|
expectedTargets,
|
|
)
|
|
}
|
|
|
|
func containPromotion(
|
|
serviceAccount *corev1.ServiceAccount,
|
|
clusterRoles []string,
|
|
targets []string,
|
|
) otypes.GomegaMatcher {
|
|
return WithTransform(func(promotions rbac.PromotionStatusListSpec) bool {
|
|
expectedName := "system:serviceaccount:" + serviceAccount.GetNamespace() + ":" + serviceAccount.GetName()
|
|
|
|
for _, promotion := range promotions {
|
|
if promotion.Kind != rbac.ServiceAccountOwner {
|
|
continue
|
|
}
|
|
|
|
if promotion.Name != expectedName {
|
|
continue
|
|
}
|
|
|
|
if !sameStringSet(promotion.ClusterRoles, clusterRoles) {
|
|
continue
|
|
}
|
|
|
|
if !sameStringSet(promotion.Targets, targets) {
|
|
continue
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}, BeTrue())
|
|
}
|
|
|
|
func sameStringSet(a, b []string) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
|
|
seen := map[string]int{}
|
|
|
|
for _, item := range a {
|
|
seen[item]++
|
|
}
|
|
|
|
for _, item := range b {
|
|
seen[item]--
|
|
}
|
|
|
|
for _, count := range seen {
|
|
if count != 0 {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func promoteServiceAccount(
|
|
actor client.Client,
|
|
serviceAccount *corev1.ServiceAccount,
|
|
labels map[string]string,
|
|
) error {
|
|
saCopy := &corev1.ServiceAccount{}
|
|
if err := actor.Get(context.TODO(), client.ObjectKeyFromObject(serviceAccount), saCopy); err != nil {
|
|
return err
|
|
}
|
|
|
|
if saCopy.Labels == nil {
|
|
saCopy.Labels = map[string]string{}
|
|
}
|
|
|
|
saCopy.Labels[meta.ServiceAccountPromotionLabel] = meta.ValueTrue
|
|
|
|
for key, value := range labels {
|
|
saCopy.Labels[key] = value
|
|
}
|
|
|
|
return actor.Update(context.TODO(), saCopy)
|
|
}
|
|
|
|
func setServiceAccountPromotionLabel(
|
|
actor client.Client,
|
|
serviceAccount *corev1.ServiceAccount,
|
|
value string,
|
|
) error {
|
|
saCopy := &corev1.ServiceAccount{}
|
|
if err := actor.Get(context.TODO(), client.ObjectKeyFromObject(serviceAccount), saCopy); err != nil {
|
|
return err
|
|
}
|
|
|
|
if saCopy.Labels == nil {
|
|
saCopy.Labels = map[string]string{}
|
|
}
|
|
|
|
saCopy.Labels[meta.ServiceAccountPromotionLabel] = value
|
|
|
|
return actor.Update(context.TODO(), saCopy)
|
|
}
|
|
|
|
func expectRoleBindingForPromotion(
|
|
namespace string,
|
|
clusterRole string,
|
|
serviceAccount *corev1.ServiceAccount,
|
|
) {
|
|
Eventually(func(g Gomega) {
|
|
roleBindings := &rbacv1.RoleBindingList{}
|
|
err := k8sClient.List(context.TODO(), roleBindings, client.InNamespace(namespace))
|
|
g.Expect(err).NotTo(HaveOccurred())
|
|
|
|
g.Expect(roleBindings.Items).To(ContainElement(SatisfyAll(
|
|
WithTransform(func(roleBinding rbacv1.RoleBinding) string {
|
|
return roleBinding.RoleRef.Kind
|
|
}, Equal("ClusterRole")),
|
|
WithTransform(func(roleBinding rbacv1.RoleBinding) string {
|
|
return roleBinding.RoleRef.Name
|
|
}, Equal(clusterRole)),
|
|
WithTransform(func(roleBinding rbacv1.RoleBinding) []rbacv1.Subject {
|
|
return roleBinding.Subjects
|
|
}, ContainElement(rbacv1.Subject{
|
|
Kind: rbacv1.ServiceAccountKind,
|
|
Name: serviceAccount.Name,
|
|
Namespace: serviceAccount.Namespace,
|
|
})),
|
|
)))
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
}
|
|
|
|
func expectNoRoleBindingForPromotion(
|
|
namespace string,
|
|
clusterRole string,
|
|
serviceAccount *corev1.ServiceAccount,
|
|
) {
|
|
Consistently(func(g Gomega) {
|
|
roleBindings := &rbacv1.RoleBindingList{}
|
|
err := k8sClient.List(context.TODO(), roleBindings, client.InNamespace(namespace))
|
|
g.Expect(err).NotTo(HaveOccurred())
|
|
|
|
g.Expect(roleBindings.Items).NotTo(ContainElement(SatisfyAll(
|
|
WithTransform(func(roleBinding rbacv1.RoleBinding) string {
|
|
return roleBinding.RoleRef.Kind
|
|
}, Equal("ClusterRole")),
|
|
WithTransform(func(roleBinding rbacv1.RoleBinding) string {
|
|
return roleBinding.RoleRef.Name
|
|
}, Equal(clusterRole)),
|
|
WithTransform(func(roleBinding rbacv1.RoleBinding) []rbacv1.Subject {
|
|
return roleBinding.Subjects
|
|
}, ContainElement(rbacv1.Subject{
|
|
Kind: rbacv1.ServiceAccountKind,
|
|
Name: serviceAccount.Name,
|
|
Namespace: serviceAccount.Namespace,
|
|
})),
|
|
)))
|
|
}, 2*time.Second, defaultPollInterval).Should(Succeed())
|
|
}
|
|
|
|
var _ = Describe("Promoting ServiceAccounts", Ordered, Label("config", "permissions", "promotion", "rbac"), func() {
|
|
originConfig := &capsulev1beta2.CapsuleConfiguration{}
|
|
|
|
tnt := &capsulev1beta2.Tenant{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "e2e-sa-promotion",
|
|
Labels: map[string]string{
|
|
"env": "e2e",
|
|
},
|
|
},
|
|
Spec: capsulev1beta2.TenantSpec{
|
|
Rules: []*rules.NamespaceRuleBodyTenant{
|
|
{
|
|
Permissions: rules.NamespaceRulePermissionBody{
|
|
Promotions: []*rules.NamespaceRulePromotionRule{
|
|
{
|
|
ClusterRoles: []string{"view"},
|
|
},
|
|
{
|
|
ClusterRoles: []string{"edit"},
|
|
Selector: &metav1.LabelSelector{
|
|
MatchLabels: map[string]string{
|
|
"selective": "edit",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
NamespaceSelector: &metav1.LabelSelector{
|
|
MatchLabels: map[string]string{
|
|
"environment": "prod",
|
|
},
|
|
},
|
|
Permissions: rules.NamespaceRulePermissionBody{
|
|
Promotions: []*rules.NamespaceRulePromotionRule{
|
|
{
|
|
ClusterRoles: []string{"prod-view"},
|
|
},
|
|
{
|
|
ClusterRoles: []string{"prod-edit"},
|
|
Selector: &metav1.LabelSelector{
|
|
MatchLabels: map[string]string{
|
|
"super": "account",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
NamespaceSelector: &metav1.LabelSelector{
|
|
MatchLabels: map[string]string{
|
|
"environment": "dev",
|
|
},
|
|
},
|
|
Permissions: rules.NamespaceRulePermissionBody{
|
|
Promotions: []*rules.NamespaceRulePromotionRule{
|
|
{
|
|
ClusterRoles: []string{"dev-view"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
Owners: rbac.OwnerListSpec{
|
|
{
|
|
CoreOwnerSpec: rbac.CoreOwnerSpec{
|
|
UserSpec: rbac.UserSpec{
|
|
Name: "e2e-sa-promotion",
|
|
Kind: "User",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
AdditionalRoleBindings: []rbac.AdditionalRoleBindingsSpec{
|
|
{
|
|
ClusterRoleName: "admin",
|
|
Subjects: []rbacv1.Subject{
|
|
{
|
|
Kind: "ServiceAccount",
|
|
Name: "default",
|
|
},
|
|
{
|
|
Kind: "User",
|
|
Name: "bob",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
BeforeEach(func() {
|
|
for _, name := range serviceAccountPromotionClusterRoles {
|
|
clusterRole := &rbacv1.ClusterRole{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: name,
|
|
},
|
|
Rules: []rbacv1.PolicyRule{
|
|
{
|
|
APIGroups: []string{""},
|
|
Resources: []string{
|
|
"configmaps",
|
|
"secrets",
|
|
"serviceaccounts",
|
|
},
|
|
Verbs: []string{
|
|
"get",
|
|
"list",
|
|
"watch",
|
|
"create",
|
|
"update",
|
|
"patch",
|
|
"delete",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
err := k8sClient.Create(context.TODO(), clusterRole)
|
|
if apierrors.IsAlreadyExists(err) {
|
|
continue
|
|
}
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
}
|
|
})
|
|
|
|
AfterEach(func() {
|
|
for _, name := range serviceAccountPromotionClusterRoles {
|
|
clusterRole := &rbacv1.ClusterRole{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: name,
|
|
},
|
|
}
|
|
|
|
err := k8sClient.Delete(context.TODO(), clusterRole)
|
|
if apierrors.IsNotFound(err) {
|
|
continue
|
|
}
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
}
|
|
})
|
|
|
|
JustBeforeEach(func() {
|
|
Expect(k8sClient.Get(context.Background(), client.ObjectKey{Name: defaultConfigurationName}, originConfig)).To(Succeed())
|
|
|
|
EventuallyCreation(func() error {
|
|
tnt.ResourceVersion = ""
|
|
return k8sClient.Create(context.TODO(), tnt)
|
|
}).Should(Succeed())
|
|
|
|
TenantReady(tnt, metav1.ConditionTrue, defaultTimeoutInterval)
|
|
})
|
|
|
|
JustAfterEach(func() {
|
|
EventuallyDeletion(tnt)
|
|
|
|
Eventually(func() error {
|
|
c := &capsulev1beta2.CapsuleConfiguration{}
|
|
if err := k8sClient.Get(context.Background(), client.ObjectKey{Name: originConfig.Name}, c); err != nil {
|
|
return err
|
|
}
|
|
|
|
c.Spec = originConfig.Spec
|
|
|
|
return k8sClient.Update(context.Background(), c)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
})
|
|
|
|
It("denies ServiceAccount promotion when the feature is globally disabled", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = false
|
|
})
|
|
|
|
ns := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
})
|
|
NamespaceCreation(ns, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, ns).Should(Succeed())
|
|
|
|
sa := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "test-sa",
|
|
Namespace: ns.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), sa)).Should(Succeed())
|
|
|
|
personas := map[string]struct {
|
|
client client.Client
|
|
matcher otypes.GomegaMatcher
|
|
}{
|
|
"owner": {
|
|
client: impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0))),
|
|
matcher: Not(Succeed()),
|
|
},
|
|
"rb-user": {
|
|
client: impersonationClient("bob", withDefaultGroups(make([]string, 0))),
|
|
matcher: Not(Succeed()),
|
|
},
|
|
"rb-sa": {
|
|
client: impersonationClient("system:serviceaccount:"+sa.GetNamespace()+":default", withDefaultGroups(make([]string, 0))),
|
|
matcher: Not(Succeed()),
|
|
},
|
|
}
|
|
|
|
for name, tc := range personas {
|
|
By(fmt.Sprintf("trying to promote ServiceAccount as %s", name))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(tc.client, sa, nil)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(tc.matcher, "persona=%s", name)
|
|
}
|
|
|
|
Eventually(func(g Gomega) {
|
|
t := &capsulev1beta2.Tenant{}
|
|
err := k8sClient.Get(context.TODO(), types.NamespacedName{Name: tnt.GetName()}, t)
|
|
g.Expect(err).NotTo(HaveOccurred())
|
|
|
|
g.Expect(t.Status.Promotions).To(HaveLen(0), "expected no promotions to be present")
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
for name, tc := range personas {
|
|
By(fmt.Sprintf("trying to set non-trigger promotion label as %s", name))
|
|
|
|
Eventually(func() error {
|
|
return setServiceAccountPromotionLabel(tc.client, sa, "false")
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(tc.matcher, "persona=%s", name)
|
|
}
|
|
|
|
Eventually(func(g Gomega) {
|
|
t := &capsulev1beta2.Tenant{}
|
|
err := k8sClient.Get(context.TODO(), types.NamespacedName{Name: tnt.GetName()}, t)
|
|
g.Expect(err).NotTo(HaveOccurred())
|
|
|
|
g.Expect(t.Status.Promotions).To(HaveLen(0), "expected no promotions to be present")
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
})
|
|
|
|
It("allows ServiceAccount promotion only by tenant owners", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
ns := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
})
|
|
NamespaceCreation(ns, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, ns).Should(Succeed())
|
|
|
|
sa := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "test-sa",
|
|
Namespace: ns.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), sa)).Should(Succeed())
|
|
|
|
personas := map[string]struct {
|
|
client client.Client
|
|
matcher otypes.GomegaMatcher
|
|
}{
|
|
"rb-user": {
|
|
client: impersonationClient("bob", withDefaultGroups(make([]string, 0))),
|
|
matcher: Not(Succeed()),
|
|
},
|
|
"rb-sa": {
|
|
client: impersonationClient("system:serviceaccount:"+sa.GetNamespace()+":default", withDefaultGroups(make([]string, 0))),
|
|
matcher: Not(Succeed()),
|
|
},
|
|
"owner": {
|
|
client: impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0))),
|
|
matcher: Succeed(),
|
|
},
|
|
}
|
|
|
|
for name, tc := range personas {
|
|
By(fmt.Sprintf("trying to promote ServiceAccount as %s", name))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(tc.client, sa, nil)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(tc.matcher, "persona=%s", name)
|
|
}
|
|
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"view"}, []string{ns.Name})
|
|
})
|
|
It("does not apply namespace-scoped promotion rules to ServiceAccounts from non-matching source namespaces", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
dev := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "dev",
|
|
})
|
|
NamespaceCreation(dev, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, dev).Should(Succeed())
|
|
|
|
test := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "test",
|
|
})
|
|
NamespaceCreation(test, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, test).Should(Succeed())
|
|
|
|
sa := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "dev-sa",
|
|
Namespace: dev.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), sa)).Should(Succeed())
|
|
|
|
ownerClient := impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0)))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, sa, nil)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"view"}, []string{dev.Name, test.Name})
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"dev-view"}, []string{dev.Name})
|
|
})
|
|
|
|
It("promotes ServiceAccounts to all tenant namespaces for global promotion rules", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
dev := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "dev",
|
|
})
|
|
NamespaceCreation(dev, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, dev).Should(Succeed())
|
|
|
|
prod := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(prod, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, prod).Should(Succeed())
|
|
|
|
stage := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "stage",
|
|
})
|
|
NamespaceCreation(stage, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, stage).Should(Succeed())
|
|
|
|
sa := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "test-sa",
|
|
Namespace: dev.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), sa)).Should(Succeed())
|
|
|
|
ownerClient := impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0)))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, sa, nil)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"view"}, []string{dev.Name, prod.Name, stage.Name})
|
|
})
|
|
|
|
It("promotes ServiceAccounts to all tenant namespaces for matching global selector rules", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
dev := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "dev",
|
|
})
|
|
NamespaceCreation(dev, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, dev).Should(Succeed())
|
|
|
|
prod := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(prod, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, prod).Should(Succeed())
|
|
|
|
stage := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "stage",
|
|
})
|
|
NamespaceCreation(stage, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, stage).Should(Succeed())
|
|
|
|
sa := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "selective-sa",
|
|
Namespace: dev.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), sa)).Should(Succeed())
|
|
|
|
ownerClient := impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0)))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, sa, map[string]string{
|
|
"selective": "edit",
|
|
})
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"view", "edit"}, []string{dev.Name, prod.Name, stage.Name})
|
|
})
|
|
|
|
It("does not apply selector-based global promotion rules when the ServiceAccount labels do not match", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
dev := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "dev",
|
|
})
|
|
NamespaceCreation(dev, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, dev).Should(Succeed())
|
|
|
|
prod := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(prod, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, prod).Should(Succeed())
|
|
|
|
sa := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "normal-sa",
|
|
Namespace: dev.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), sa)).Should(Succeed())
|
|
|
|
ownerClient := impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0)))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, sa, nil)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"view"}, []string{dev.Name, prod.Name})
|
|
expectNoPromotionTargets(tnt.GetName(), sa, []string{"edit"}, []string{dev.Name, prod.Name})
|
|
})
|
|
|
|
It("promotes ServiceAccounts only to namespaces matching the namespace selector", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
dev := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "dev",
|
|
})
|
|
NamespaceCreation(dev, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, dev).Should(Succeed())
|
|
|
|
prod := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(prod, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, prod).Should(Succeed())
|
|
|
|
stage := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(stage, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, stage).Should(Succeed())
|
|
|
|
saTest := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "test-sa",
|
|
Namespace: dev.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), saTest)).Should(Succeed())
|
|
|
|
saProd := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "test-prod",
|
|
Namespace: prod.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), saProd)).Should(Succeed())
|
|
|
|
ownerClient := impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0)))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, saTest, nil)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, saProd, nil)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
expectPromotionTargets(tnt.GetName(), saTest, []string{"view"}, []string{dev.Name, prod.Name, stage.Name})
|
|
expectPromotionTargets(tnt.GetName(), saTest, []string{"dev-view"}, []string{dev.Name})
|
|
|
|
expectPromotionTargets(tnt.GetName(), saProd, []string{"view"}, []string{dev.Name, prod.Name, stage.Name})
|
|
expectPromotionTargets(tnt.GetName(), saProd, []string{"prod-view"}, []string{prod.Name, stage.Name})
|
|
})
|
|
|
|
It("promotes ServiceAccounts by combined ServiceAccount selector and namespace selector", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
dev := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "dev",
|
|
})
|
|
NamespaceCreation(dev, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, dev).Should(Succeed())
|
|
|
|
prodA := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(prodA, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, prodA).Should(Succeed())
|
|
|
|
prodB := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(prodB, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, prodB).Should(Succeed())
|
|
|
|
stage := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "stage",
|
|
})
|
|
NamespaceCreation(stage, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
|
|
saDev := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "super-sa",
|
|
Namespace: dev.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), saDev)).Should(Succeed())
|
|
|
|
saProd := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "super-sa",
|
|
Namespace: prodA.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), saProd)).Should(Succeed())
|
|
|
|
ownerClient := impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0)))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, saDev, map[string]string{
|
|
"super": "account",
|
|
})
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, saProd, map[string]string{
|
|
"super": "account",
|
|
})
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
expectPromotionTargets(tnt.GetName(), saDev, []string{"view"}, []string{dev.Name, prodA.Name, prodB.Name, stage.Name})
|
|
expectPromotionTargets(tnt.GetName(), saDev, []string{"dev-view"}, []string{dev.Name})
|
|
|
|
expectPromotionTargets(tnt.GetName(), saProd, []string{"view"}, []string{dev.Name, prodA.Name, prodB.Name, stage.Name})
|
|
expectPromotionTargets(tnt.GetName(), saProd, []string{"prod-edit", "prod-view"}, []string{prodA.Name, prodB.Name})
|
|
})
|
|
|
|
It("does not apply combined selector promotion rules when the ServiceAccount selector does not match", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
dev := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "dev",
|
|
})
|
|
NamespaceCreation(dev, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, dev).Should(Succeed())
|
|
|
|
prod := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(prod, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, prod).Should(Succeed())
|
|
|
|
sa := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "not-super-sa",
|
|
Namespace: prod.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), sa)).Should(Succeed())
|
|
|
|
ownerClient := impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0)))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, sa, nil)
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"view"}, []string{dev.Name, prod.Name})
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"prod-view"}, []string{prod.Name})
|
|
})
|
|
|
|
It("creates RoleBindings only in targeted namespaces", func() {
|
|
ModifyCapsuleConfigurationOpts(func(configuration *capsulev1beta2.CapsuleConfiguration) {
|
|
configuration.Spec.AllowServiceAccountPromotion = true
|
|
})
|
|
|
|
dev := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "dev",
|
|
})
|
|
NamespaceCreation(dev, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, dev).Should(Succeed())
|
|
|
|
prod := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(prod, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, prod).Should(Succeed())
|
|
|
|
stage := NewNamespace("", map[string]string{
|
|
meta.TenantLabel: tnt.GetName(),
|
|
"environment": "prod",
|
|
})
|
|
NamespaceCreation(stage, tnt.Spec.Owners[0].UserSpec, defaultTimeoutInterval).Should(Succeed())
|
|
NamespaceIsPartOfTenant(tnt, stage).Should(Succeed())
|
|
|
|
sa := &corev1.ServiceAccount{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "super-sa",
|
|
Namespace: prod.Name,
|
|
},
|
|
}
|
|
Expect(k8sClient.Create(context.TODO(), sa)).Should(Succeed())
|
|
|
|
ownerClient := impersonationClient(tnt.Spec.Owners[0].Name, withDefaultGroups(make([]string, 0)))
|
|
|
|
Eventually(func() error {
|
|
return promoteServiceAccount(ownerClient, sa, map[string]string{
|
|
"super": "account",
|
|
})
|
|
}, defaultTimeoutInterval, defaultPollInterval).Should(Succeed())
|
|
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"view"}, []string{dev.Name, prod.Name, stage.Name})
|
|
expectPromotionTargets(tnt.GetName(), sa, []string{"prod-view", "prod-edit"}, []string{prod.Name, stage.Name})
|
|
|
|
expectRoleBindingForPromotion(dev.Name, "view", sa)
|
|
expectRoleBindingForPromotion(prod.Name, "view", sa)
|
|
expectRoleBindingForPromotion(stage.Name, "view", sa)
|
|
|
|
expectRoleBindingForPromotion(prod.Name, "prod-view", sa)
|
|
expectRoleBindingForPromotion(prod.Name, "prod-edit", sa)
|
|
|
|
expectRoleBindingForPromotion(stage.Name, "prod-view", sa)
|
|
expectRoleBindingForPromotion(stage.Name, "prod-edit", sa)
|
|
})
|
|
})
|