Skip to content

Commit 7ea7104

Browse files
authored
ci(e2e): add a daily isp-hosted install lane on kind (#4712)
## What this PR does This adds a daily CI lane that installs the `isp-hosted` platform variant through the `hosted` installer variant. No lane ran either of them before. The PR, nightly and tag lanes all install `isp-full` on Talos, where Cozystack brings its own CNI and storage, and that is how #3376 shipped unnoticed. What `isp-hosted` changes is what it leaves to the host. The system bundle swaps kube-ovn and Cilium for a `noop` networking Package and drops multus, LINSTOR, MetalLB, cozy-proxy, snapshot-controller and the rest of the shared data-plane set. The iaas bundle refuses to render. Migrations are not a difference, `isp-full` enables them too. So the lane runs on kind. kindnet, kube-proxy and local-path come from the cluster, and there is no Cilium, no LINSTOR and no `replicated` or `local` StorageClass. It installs the latest GHCR nightly instead of building anything, at 05:00 UTC after the nightly mirror publishes, and on `workflow_dispatch`. There is no pull request trigger, because a run would install the nightly images and not the PR's. A run passes when every HelmRelease is Ready, `cozystack-platform` and `tenant-root` included. It also checks that the platform emitted the `noop` networking Package and none of LINSTOR, MetalLB, multus or KubeVirt, and that the cluster has no Cilium CRD and no `replicated` or `local` class. The lane reuses the e2e sandbox container for tooling and `collect-report`, attached to the kind network. `hack/isp-hosted-lane_test.bats` pins the wiring: the Package selects `isp-hosted`, the install uses `variant=hosted`, the kind DNS domain matches `networking.clusterDomain`, and kind is pinned by checksum and digest. Six of its seven tests were red before the implementation existed. `hack/sandbox-runner-headroom.bats` gets a named exemption. That check treats any workflow touching `packages/core/testing` as a lane that boots the QEMU guests, and this one boots none. The exemption is checked after the job match, and removing it turns the test red again. The pins come from the kind v0.32.0 release: the binary sha256 `50030de2…` from its `kind-linux-amd64.sha256sum`, and `kindest/node:v1.33.12@sha256:3f5c8443…` from its release notes. v1.33.12 is the Kubernetes version the Talos lanes use, so the variant is the only thing that differs. All three are plain `env` values in the workflow, where a Renovate custom manager can match them. ### Real runs The first real run on this branch, [36961209755](https://github.com/cozystack/cozystack/actions/runs/36961209755), went red on `tenant-root`: ```text tenant-root False Helm install failed for release tenant-root/tenant-root with chart [email protected]+629b61300902: unable to build kubernetes objects from release manifest: resource mapping not found for name: "allow-external-communication" namespace: "tenant-root" from "": no matches for kind "CiliumNetworkPolicy" in version "cilium.io/v2" ``` This is #3387 reproduced live: `packages/apps/tenant` renders Cilium policies on a cluster without Cilium. The other releases went Ready, except `cozystack-basics`, which was still in an upgrade at the last listing. The fix landed in #4710. The run after it, [37089699259](https://github.com/cozystack/cozystack/actions/runs/37089699259), is green on the first attempt. It installed nightly `0.0.0-nightly.20261003.37089458387.1`, built from 309875a, which contains #4710. All four install tests passed, `tenant-root` included, with no `cilium.io` CRD on the cluster. The install took about 9 minutes. ### Notes The OpenAPI suite is not run. Its "Test kinds" case needs an Ingress application, and kind has no LoadBalancer, so it would fail for a reason unrelated to the variant. The red run's job log is 347 MB. cozytest's live trace prints the whole HelmRelease snapshot JSON from `cozy_wait_all_helmreleases_ready` on every 2-second poll, and `gh run view --log` breaks at that size. The isp-full lanes use the same helper, and it is tracked separately. The red run spent about 31 minutes in install, most of it waiting out the 30-minute gate; the green one took about 9 minutes on `oracle-vm-24cpu-96gb-x86-64`. Moving to a smaller runner needs a measured run, so it is a follow-up and not part of this PR. Follow-ups from review, none blocking: - No `vars.NIGHTLY_ENABLED` gate, so with the nightly switched off the lane keeps testing a stale `nightly` tag. A `workflow_run` trigger on a successful mirror would fix that too. - The Package endpoint `cozy-hosted-control-plane` has to agree with `KIND_CLUSTER: cozy-hosted`, and no test checks that yet. - The operator registration check greps a Go literal in `cmd/cozystack-operator/main.go`, so reformatting that table breaks it. - The oras download has no checksum check, same as in `nightly.yaml`. - cozytest stops at the first failing test, so on a red install the "no Cilium" check never runs. Running it before the install would keep that evidence in red runs. Closes #3390 ### Screenshots Not a UI change. ### Downstream repositories - [x] No downstream repository is affected by this change - [ ] [cozystack/website](https://github.com/cozystack/website) - follow-up: - [ ] [cozystack/terraform-provider-cozystack](https://github.com/cozystack/terraform-provider-cozystack) - follow-up: - [ ] [cozystack/ansible-cozystack](https://github.com/cozystack/ansible-cozystack) - follow-up: - [ ] [cozystack/ccp](https://github.com/cozystack/ccp) - follow-up: - [ ] [cozystack/talm](https://github.com/cozystack/talm) - follow-up: - [ ] [cozystack/cozyhr](https://github.com/cozystack/cozyhr) - follow-up: - [ ] [cozystack/cozy-proxy](https://github.com/cozystack/cozy-proxy) - follow-up: - [ ] [cozystack/cozystack-telemetry-server](https://github.com/cozystack/cozystack-telemetry-server) - follow-up: - [ ] [cozystack/external-apps-example](https://github.com/cozystack/external-apps-example) - follow-up: - [ ] [cozystack/examples](https://github.com/cozystack/examples) - follow-up: - [ ] [cozystack/community](https://github.com/cozystack/community) - follow-up: The diff adds CI files, test files and one new make target. Nothing under `hack/` is moved or renamed and no existing target changes, so the ccp trigger does not apply. ### Release note ```release-note ci(e2e): add a daily lane that installs the isp-hosted platform variant on kind ``` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** * Added scheduled and manually triggered end-to-end checks for hosted installations using the latest nightly packages. * Validation covers platform readiness, package deployment, and expected networking and storage behavior. * Test runs collect diagnostic reports and attempt cleanup after failures to support investigation. * Added checks to verify hosted installation settings and ensure prohibited network and storage components are absent. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
2 parents 14eab3c + b108578 commit 7ea7104

7 files changed

Lines changed: 452 additions & 0 deletions

File tree

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
name: E2E isp-hosted
2+
3+
# Installs the isp-hosted platform variant, through the hosted installer
4+
# variant, on a kind cluster, and checks that every HelmRelease goes Ready. No
5+
# other lane installs either variant: the PR, nightly and tag lanes all run
6+
# isp-full on Talos, where Cozystack itself provides the CNI and the storage.
7+
# kind is the managed-cluster shape isp-hosted is for: its CNI, kube-proxy and
8+
# default StorageClass come from the cluster, and there is no Cilium, no
9+
# LINSTOR and no `replicated` class. That absence is the thing under test.
10+
#
11+
# It installs the latest nightly rather than building anything: the GHCR
12+
# nightly closure is complete and public. A pull request trigger is
13+
# deliberately absent, because a run here would install the nightly images,
14+
# not the pull request's, and report on code the pull request did not change.
15+
16+
on:
17+
schedule:
18+
- cron: '0 5 * * *' # 05:00 UTC, after nightly.yaml's 02:00 mirror has published
19+
workflow_dispatch: {}
20+
21+
env:
22+
PACKAGES_REPO: ghcr.io/cozystack/cozystack/cozystack-packages
23+
# Release notes of kind v0.32.0 are the source of both pins: the binary's
24+
# published kind-linux-amd64.sha256sum, and the node image digest listed for
25+
# it. v1.33.12 matches the Kubernetes version hack/e2e-container-up.sh gives
26+
# the Talos lanes, so the variant is the only thing that differs.
27+
KIND_VERSION: v0.32.0
28+
KIND_SHA256: 50030de23cf40a18505f20426f6a8506bedf13c6e509244bd1fa9463721b0f54
29+
KIND_NODE_IMAGE: kindest/node:v1.33.12@sha256:3f5c8443c620245e4d355cfe09e96a91ead32ceaa569d3f1ca9edf0cb2fe2ff4
30+
KIND_CLUSTER: cozy-hosted
31+
32+
concurrency:
33+
group: e2e-isp-hosted
34+
cancel-in-progress: false
35+
36+
permissions:
37+
contents: read
38+
39+
jobs:
40+
e2e:
41+
name: E2E (isp-hosted on kind)
42+
# The whole platform lands on one kind node with nothing pre-pulled. The
43+
# smaller 4-vCPU class was not tried; sizing down is left to a measured run.
44+
runs-on: oracle-vm-24cpu-96gb-x86-64
45+
# Above the failing path's sum, so the job ceiling never cuts off the
46+
# report: three prepare attempts at kind's 5m wait, the install's 30m
47+
# readiness gate plus its setup, and the 30m collect step.
48+
timeout-minutes: 120
49+
permissions:
50+
contents: read
51+
packages: read
52+
steps:
53+
- name: Set up toolchain (flux, oras)
54+
env:
55+
FLUX_VERSION: "2.8.6"
56+
run: |
57+
if ! flux version --client 2>/dev/null | grep -Fqx "flux: v${FLUX_VERSION}"; then
58+
install_script="$(mktemp)"
59+
curl -fsSL https://fluxcd.io/install.sh -o "$install_script"
60+
sudo env "FLUX_VERSION=$FLUX_VERSION" bash "$install_script"
61+
rm -f "$install_script"
62+
fi
63+
command -v oras >/dev/null || { curl -fsSL https://github.com/oras-project/oras/releases/download/v1.2.0/oras_1.2.0_linux_amd64.tar.gz | sudo tar -xz -C /usr/local/bin oras; }
64+
65+
- name: Login to GHCR
66+
env:
67+
GHCR_USER: ${{ github.actor }}
68+
GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }}
69+
run: |
70+
echo "$GHCR_TOKEN" | docker login ghcr.io -u "$GHCR_USER" --password-stdin
71+
echo "$GHCR_TOKEN" | oras login ghcr.io -u "$GHCR_USER" --password-stdin
72+
73+
# One manifest fetch gives both the digest and the revision, so a nightly
74+
# published between two reads cannot pair one commit's name with another
75+
# tree in the log.
76+
- name: Resolve the latest nightly
77+
id: resolve
78+
run: |
79+
set -eu
80+
manifest="${RUNNER_TEMP}/cozystack-packages-nightly.json"
81+
oras manifest fetch "${PACKAGES_REPO}:nightly" > "$manifest"
82+
digest="sha256:$(sha256sum "$manifest" | cut -d' ' -f1)"
83+
rev="$(yq -r '.annotations["org.opencontainers.image.revision"] // ""' -p json "$manifest")"
84+
echo "digest=$digest" >> "$GITHUB_OUTPUT"
85+
echo "Installing nightly ${rev:-<no revision annotation>}, packages ${digest}"
86+
87+
- name: Checkout code
88+
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
89+
with:
90+
fetch-depth: 1
91+
persist-credentials: false
92+
93+
# The product under test is the nightly's packages tree, overlaid as
94+
# nightly.yaml does. The harness (hack/ and the testing Makefile's
95+
# recipes) stays at the commit that triggered the run, so a change to the
96+
# lane can be tried on a branch before any nightly carries it; on the
97+
# schedule that commit is main a few hours past the nightly's.
98+
- name: Stage the nightly install tree
99+
env:
100+
DIGEST: ${{ steps.resolve.outputs.digest }}
101+
run: |
102+
set -eu
103+
rm -rf _rw && mkdir -p _rw
104+
flux pull artifact "oci://${PACKAGES_REPO}@${DIGEST}" --output _rw
105+
cp -r _rw/. packages/
106+
rm -rf _rw
107+
git checkout HEAD -- packages/core/testing/Makefile
108+
yq -i ".cozystackOperator.platformSourceUrl = \"oci://${PACKAGES_REPO}\"" packages/core/installer/values.yaml
109+
yq -i ".cozystackOperator.platformSourceRef = \"digest=${DIGEST}\"" packages/core/installer/values.yaml
110+
111+
- name: Install kind
112+
run: |
113+
set -eu
114+
curl -fsSLo "${RUNNER_TEMP}/kind" "https://github.com/kubernetes-sigs/kind/releases/download/${KIND_VERSION}/kind-linux-amd64"
115+
echo "${KIND_SHA256} ${RUNNER_TEMP}/kind" | sha256sum --check
116+
sudo install -m 0755 "${RUNNER_TEMP}/kind" /usr/local/bin/kind
117+
118+
- name: Set sandbox ID
119+
run: echo "SANDBOX_NAME=cozy-e2e-sandbox-$(echo "${GITHUB_REPOSITORY}:${GITHUB_WORKFLOW}:${GITHUB_REF}" | sha256sum | cut -c1-10)" >> "$GITHUB_ENV"
120+
121+
# Pure infrastructure, so it may be retried; the cluster and the sandbox are
122+
# both removed between attempts so no attempt adopts a half-built one.
123+
# `kubeconfig` at the checkout root is what `apply` copies to
124+
# /workspace/kubeconfig, the sandbox's KUBECONFIG; --internal addresses
125+
# the control plane by container name, which the sandbox resolves once
126+
# it is on the kind network.
127+
- name: Prepare environment
128+
run: |
129+
# Many controllers on one node exhaust the stock inotify limits, which
130+
# kind documents as a cause of pods failing with "too many open files".
131+
sudo sysctl -w fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=524288
132+
attempt=0
133+
until kind create cluster --name "$KIND_CLUSTER" --image "$KIND_NODE_IMAGE" --config hack/e2e-isp-hosted-kind.yaml --wait 5m \
134+
&& kind get kubeconfig --internal --name "$KIND_CLUSTER" > ./kubeconfig \
135+
&& make -C packages/core/testing SANDBOX_NAME="$SANDBOX_NAME" apply \
136+
&& docker network connect kind "$SANDBOX_NAME"; do
137+
attempt=$((attempt + 1))
138+
make -C packages/core/testing SANDBOX_NAME="$SANDBOX_NAME" delete || true
139+
kind delete cluster --name "$KIND_CLUSTER" || true
140+
if [ $attempt -ge 3 ]; then echo "Attempt $attempt failed, exiting..."; exit 1; fi
141+
echo "Attempt $attempt failed, retrying..."
142+
done
143+
144+
- name: Install Cozystack into sandbox
145+
run: |
146+
if ! make -C packages/core/testing SANDBOX_NAME="$SANDBOX_NAME" install-cozystack-hosted; then
147+
echo "❌ Install failed (no retry — diagnostics below)"
148+
echo "::group::HelmRelease status"
149+
docker exec "$SANDBOX_NAME" sh -c 'kubectl get hr -A -o wide 2>&1 | tail -100' || true
150+
echo "::endgroup::"
151+
echo "::group::not-Ready HelmReleases"
152+
docker exec "$SANDBOX_NAME" sh -c 'kubectl get hr -A --no-headers 2>/dev/null | awk "\$4 != \"True\" {print \$1\" \"\$2}"' \
153+
| while read -r ns name; do
154+
echo "--- $ns/$name ---"
155+
docker exec "$SANDBOX_NAME" sh -c "kubectl describe hr '$name' -n '$ns' 2>&1 | tail -50" || true
156+
done
157+
echo "::endgroup::"
158+
echo "::group::Pods not Running"
159+
docker exec "$SANDBOX_NAME" sh -c 'kubectl get pods -A --field-selector=status.phase!=Running,status.phase!=Succeeded -o wide 2>&1 | tail -60' || true
160+
echo "::endgroup::"
161+
exit 1
162+
fi
163+
164+
# Same bound and the same tolerance as the collect step in nightly.yaml,
165+
# for the reasons written there.
166+
- name: Collect report
167+
id: collect_report
168+
if: always()
169+
timeout-minutes: 30
170+
continue-on-error: true
171+
run: |
172+
make -C packages/core/testing SANDBOX_NAME="$SANDBOX_NAME" collect-report || true
173+
174+
- name: Report collection overran its ceiling
175+
if: always() && steps.collect_report.outcome == 'failure'
176+
run: |
177+
echo "::warning title=cozyreport::Collect report ended non-zero -- its timeout-minutes fired, or the step failed before the collector ran; cozyreport.tgz is missing or partial for this run"
178+
179+
- name: Upload cozyreport.tgz
180+
if: always()
181+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
182+
with:
183+
name: cozyreport-isp-hosted
184+
path: _out/cozyreport.tgz
185+
if-no-files-found: warn
186+
187+
- name: Tear down
188+
if: always()
189+
run: |
190+
make -C packages/core/testing SANDBOX_NAME="$SANDBOX_NAME" delete || true
191+
kind delete cluster --name "$KIND_CLUSTER" || true
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#!/usr/bin/env bats
2+
# Install suite for the isp-hosted lane (.github/workflows/e2e-isp-hosted.yaml).
3+
#
4+
# The cluster is kind: its CNI, kube-proxy and default StorageClass belong to
5+
# the host, which is what the hosted installer variant and the isp-hosted
6+
# platform variant assume. The pass condition is the one the variant has never
7+
# had checked on a live cluster: every HelmRelease the platform creates goes
8+
# Ready, cozystack-platform and tenant-root included, with no Cilium CRDs, no
9+
# LINSTOR and no `replicated` StorageClass anywhere.
10+
#
11+
# What this does not cover, by design: tenant applications, ingress (kind has
12+
# no LoadBalancer implementation, so an ingress Service never gets an address),
13+
# and anything in the iaas bundle, which this variant refuses to render.
14+
15+
@test "Install Cozystack with the hosted installer variant" {
16+
helm upgrade installer packages/core/installer \
17+
--install \
18+
--namespace cozy-system \
19+
--create-namespace \
20+
--set cozystackOperator.variant=hosted \
21+
--set cozystackOperator.helmReleaseInterval=30s \
22+
--timeout 2m
23+
24+
# On hosted the labeler hook runs as an ordinary pod on the host CNI rather
25+
# than on hostNetwork, so it is the path this lane exercises and no other does.
26+
kubectl get ns cozy-system -o jsonpath='{.metadata.labels.pod-security\.kubernetes\.io/enforce}' | grep -qx privileged
27+
kubectl get ns cozy-system -o jsonpath='{.metadata.labels.cozystack\.io/system}' | grep -qx true
28+
29+
# Rollout rather than condition=Available, for the reason given at the same
30+
# step in hack/e2e-install-cozystack.bats.
31+
kubectl rollout status deployment/cozystack-operator -n cozy-system --timeout=5m || {
32+
kubectl describe pod -n cozy-system -l app=cozystack-operator 2>&1 || true
33+
kubectl logs -n cozy-system -l app=cozystack-operator --all-containers --tail=50 2>&1 || true
34+
kubectl logs -n cozy-system -l app=cozystack-operator --all-containers --previous --tail=50 2>&1 || true
35+
false
36+
}
37+
38+
timeout 120 sh -ec 'until kubectl wait crd/packages.cozystack.io --for=condition=Established --timeout=10s 2>/dev/null; do sleep 2; done'
39+
timeout 120 sh -ec 'until kubectl wait crd/packagesources.cozystack.io --for=condition=Established --timeout=10s 2>/dev/null; do sleep 2; done'
40+
timeout 120 sh -ec 'until kubectl get packagesource cozystack.cozystack-platform >/dev/null 2>&1; do sleep 2; done'
41+
42+
kubectl apply -f hack/e2e-isp-hosted-package.yaml
43+
44+
# 1800s against the 900s the isp-full lane allows: nothing is pre-pulled here,
45+
# so one node pulls every platform image cold before its release can go Ready.
46+
. hack/e2e-wait-helmreleases.sh
47+
cozy_wait_all_helmreleases_ready 1800 11 5 2
48+
}
49+
50+
@test "The platform and the root tenant are Ready" {
51+
kubectl wait hr/cozystack-platform -n cozy-system --for=condition=ready --timeout=1m
52+
kubectl wait hr/tenant-root -n tenant-root --for=condition=ready --timeout=1m
53+
}
54+
55+
@test "The isp-hosted variant took effect" {
56+
# The install gate above is equally green for any variant that converges, so
57+
# this reads what the platform actually emitted, not what the lane asked for.
58+
kubectl get package cozystack.networking -o jsonpath='{.spec.variant}' | grep -qx noop
59+
for pkg in cozystack.linstor cozystack.metallb cozystack.multus cozystack.kubevirt; do
60+
if kubectl get package "$pkg" >/dev/null 2>&1; then
61+
echo "Package $pkg exists, but isp-hosted must not emit it" >&2
62+
exit 1
63+
fi
64+
done
65+
}
66+
67+
@test "The cluster carries none of what isp-hosted leaves to the host" {
68+
# The variant's promise is that nothing in it needs Cilium or a
69+
# Cozystack-provided StorageClass. A green install proves that only if those
70+
# were really absent while it converged.
71+
# Any CRD in the group counts, not only the policy kinds. The premise is a
72+
# cluster with no Cilium at all, and a partial set breaks it even where the
73+
# tenant guard, which needs both policy kinds, would still skip its policies.
74+
# Read before counting, so a failed list fails the test instead of counting
75+
# as zero.
76+
crd_groups="$(kubectl get crd -o jsonpath='{range .items[*]}{.spec.group}{"\n"}{end}')"
77+
cilium_crds="$(printf '%s\n' "$crd_groups" | grep -cx 'cilium\.io' || true)"
78+
if [ "$cilium_crds" -ne 0 ]; then
79+
echo "$cilium_crds cilium.io CRDs are installed; the lane no longer tests a cluster without them" >&2
80+
exit 1
81+
fi
82+
for sc in replicated local; do
83+
if kubectl get storageclass "$sc" >/dev/null 2>&1; then
84+
echo "StorageClass $sc exists; the lane no longer tests a host-provided class alone" >&2
85+
exit 1
86+
fi
87+
done
88+
}

‎hack/e2e-isp-hosted-kind.yaml‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# kind cluster for the isp-hosted lane. One node, kind's own CNI (kindnet),
2+
# kube-proxy and local-path StorageClass: the managed-cluster shape the variant
3+
# is for, with no Cilium, no LINSTOR and no `replicated` or `local` class.
4+
#
5+
# The DNS domain follows the platform's networking.clusterDomain, because some
6+
# system packages still carry that domain as a literal and would fail here for
7+
# a reason unrelated to the variant. hack/isp-hosted-lane_test.bats holds the
8+
# two in step.
9+
#
10+
# maxPods is raised from the kubelet default of 110 because every platform pod
11+
# lands on this one node; 110 was not measured to be too small, the headroom
12+
# keeps a pod count nobody tracks from becoming the reason a run goes red.
13+
kind: Cluster
14+
apiVersion: kind.x-k8s.io/v1alpha4
15+
kubeadmConfigPatches:
16+
- |
17+
kind: ClusterConfiguration
18+
networking:
19+
dnsDomain: cozy.local
20+
- |
21+
kind: KubeletConfiguration
22+
clusterDomain: cozy.local
23+
maxPods: 250
24+
nodes:
25+
- role: control-plane

‎hack/e2e-isp-hosted-package.yaml‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Platform Package for the isp-hosted lane (.github/workflows/e2e-isp-hosted.yaml).
2+
# The cluster is kind, which brings its own CNI, kube-proxy and default
3+
# StorageClass, so nothing here configures networking or storage: providing
4+
# them is the host's job on this variant. The endpoint is the kind
5+
# control-plane container's name on the docker network the sandbox joins.
6+
apiVersion: cozystack.io/v1alpha1
7+
kind: Package
8+
metadata:
9+
name: cozystack.cozystack-platform
10+
spec:
11+
variant: isp-hosted
12+
components:
13+
platform:
14+
values:
15+
publishing:
16+
host: "example.org"
17+
apiServerEndpoint: "https://cozy-hosted-control-plane:6443"

0 commit comments

Comments
 (0)