Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,15 @@ jobs:
- name: Sync-wave ordering gate
run: ./scripts/check-sync-waves.py

# An ApplicationSet's spec.template.metadata.labels is a plain string map
# in the CRD schema, so kubeconform admits any value there. It only
# becomes a label when the controller renders an Application, and an
# invalid value fails that Application at admission — which fails the
# app-of-apps sync task, which stops the entire addon catalog from
# installing. Valid manifest, passing schema gate, nothing deployed.
- name: Label-value gate
run: ./scripts/check-label-values.py

# Offline half of the chart-provenance gate: every pinned chart has a
# record and every record a pin. Deliberately does not touch the network —
# whether a chart went deprecated overnight is not a function of this
Expand Down
6 changes: 5 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ catalog/ → Platform-specific workloads (Druid)
## Key Conventions

### Sync Waves
Components deploy in order: bootstrap (0, 2) → networking (1) → karpenter (5) → security (10-12) → argo-workflows CRDs (13) → policies (20-23) → observability (29-34) / gateway-api CRDs (30) → operations (40-44) / ai-platform (40-42) → argo-platform (50-52).
Components deploy in order: bootstrap (0, 2) → networking (1) → karpenter (5) → security (10-12) → argo-workflows CRDs (13) → policies (20-23) → observability (29-34) / gateway-api CRDs (30) → operations (40-44) / ai-platform (40-42) → argo-platform (50-52) → tenants (100).

The tenants band sits alone at the end: `portal-tenants` applies the tenant boundary
manifests the portal commits to the tenants repo, and those declare CRs that need both
the operator's CRDs and a running operator to reconcile them.

CRD-only Applications sit immediately ahead of the first thing that renders one of their kinds, not inside a consumer's band. `scripts/check-sync-waves.py` asserts that precedence directly: an ApplicationSet rendering a manifest whose CRD another ApplicationSet installs must sync strictly after it. A controller that merely *watches* a CRD is not a consumer for this purpose — it retries until the kind exists.

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ repoURL: '{{ index .metadata.annotations "gitops/repo-url" }}'
└─────────────────────────────────────────────────────────────────────┘

Plus opt-in ApplicationSets under `applicationsets/opt-in/` (`apps-tenants`,
`clusters-appset`, `portal-tenants`) — not applied by a default install; see
`clusters-appset`) — not applied by a default install; see
[`applicationsets/opt-in/README.md`](applicationsets/opt-in/README.md).
```

Expand All @@ -90,6 +90,8 @@ eks-gitops/
│ ├── gateway-api-crds.yaml
│ ├── secret-stores.yaml
│ ├── dashboards.yaml
│ ├── portal-tenants.yaml # tenant boundary CRs from the tenants repo
│ │ # (label-gated; repo URL from the cluster Secret)
│ └── opt-in/ # NOT applied by default (apps/clusters/portal)
├── addons/ # Addon configurations
Expand Down
8 changes: 7 additions & 1 deletion Taskfile.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ tasks:
cmds:
- ./scripts/check-sync-waves.py

validate:label-values:
desc: "Label-value gate — every k8s label value satisfies the API server's grammar"
cmds:
- ./scripts/check-label-values.py

validate:appset-render:
desc: "Appset render gate — render the Karpenter EC2NodeClass patch template against fixture cluster Secrets"
dir: applicationsets/rendertest
Expand All @@ -102,13 +107,14 @@ tasks:
- ./scripts/check-athena-panel-columns.py

validate:
desc: Run all validations (lint, build, helm-render, appset schema, sync waves, appset render, policy admission, externalsecret keys, athena panel columns, dashboard/fork-safety)
desc: Run all validations (lint, build, helm-render, appset schema, sync waves, label values, appset render, policy admission, externalsecret keys, athena panel columns, dashboard/fork-safety)
deps:
- lint:yaml
- kustomize:build
- validate:helm-render
- validate:appset-schema
- validate:sync-waves
- validate:label-values
- validate:appset-render
- validate:policy-admission
- validate:externalsecret-keys
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-agent-operator.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: eks-agent-platform-operator
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "21"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-ai-platform-kustomize.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-ai-platform.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-argo-platform.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-argo-workflows.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: argo-workflows
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "52"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-bootstrap-kustomize.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-bootstrap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-external-dns.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: external-dns
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "1"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-karpenter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: karpenter
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "5"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-loki.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: loki
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "30"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-networking.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-observability.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-opencost.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: opencost
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "33"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-operations-helm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-operations-kustomize.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-otel-agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: otel-agent
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "32"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-otel-gateway-floor.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: otel-gateway-floor
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "32"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-otel-gateway.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: otel-gateway
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "32"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-security.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-tempo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: tempo
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "31"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/addons-velero.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: velero
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "40"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/agent-platform.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/argo-workflows-crds.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/dashboards.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/gateway-api-crds.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/kyverno-policies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .appName }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: '{{ .syncWave }}'
Expand Down
25 changes: 19 additions & 6 deletions applicationsets/opt-in/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,39 @@ that could never generate, leaving them permanently `ErrorOccurred` and dragging
| ApplicationSet | Requires |
|---|---|
| `clusters-appset.yaml` | The private clusters repo over SSH, **and the hub cluster** — it applies eks-fleet `Cluster` CRs, which only exist where the Cluster API + Crossplane run. On a workload/spoke cluster it can never be correct. |
| `portal-tenants.yaml` | The private tenants repo over SSH, plus an ArgoCD SSH repo credential (a read-only deploy key) registered for that URL. |
| `apps-tenants.yaml` | One `AppProject` per tenant app (the template sets `project: {{ .app }}`), plus read access to each app's source repo. |

The tenant boundary appset is not one of these — it ships in the default path at
[`../portal-tenants.yaml`](../portal-tenants.yaml). It reads its repo URL from a
cluster annotation and gates on a cluster label, so on a cluster that has not
opted in the clusters generator matches nothing, its child git generator never
runs, and the appset sits healthy with no children. Nothing reaches for a
private repo it cannot see, which is the condition this folder exists to avoid.
An appset a label can make inert does not need to be withheld from the default
path.

## Enabling them

They are ordinary ApplicationSets — nothing about them is special beyond the
prerequisites above. To turn them on for an install that genuinely has the
portal, the private repos, and (for `clusters-appset`) the hub:

1. Register the SSH repo credentials in ArgoCD for the clusters/tenants repos
(a read-only deploy key per repo). `cluster-bootstrap` does this when
`tenants_repo_url` is set.
1. Register the SSH repo credential in ArgoCD for the clusters repo (a read-only
deploy key).
2. Create the per-app `AppProject`s that `apps-tenants` references.
3. Point an Application at this path — either add a second app-of-apps whose
source `path` is `applicationsets/opt-in`, or set `directory.recurse` on the
existing one (which pulls in everything here, so prefer the explicit path).

## Before enabling, re-check the hardcoded repo URLs

`clusters-appset.yaml` and `portal-tenants.yaml` hardcode `git@github.com:` URLs,
and `apps-tenants.yaml` hardcodes its four app source repos. An install in a
`clusters-appset.yaml` hardcodes a `git@github.com:` URL, and
`apps-tenants.yaml` hardcodes its four app source repos. An install in a
different GitHub org must repoint these — they are not templated from the cluster
Secret today.

That is the difference between these two and `portal-tenants`: naming an org in
the manifest is what forces an appset to be withheld from the default install,
because there is no per-cluster value that can make it correct. Templating the
URL off the cluster Secret, the way `gitops/repo-url` already works, is the way
out of this folder.
2 changes: 1 addition & 1 deletion applicationsets/opt-in/apps-tenants.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ spec:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: '{{ .app }}'
platform.nanohype.dev/environment: '{{ index .metadata.labels "environment" }}'
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "100"
Expand Down
2 changes: 1 addition & 1 deletion applicationsets/opt-in/clusters-appset.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ spec:
labels:
app.kubernetes.io/managed-by: argocd
app.kubernetes.io/component: cluster
platform.nanohype.dev/repository: nanohype/eks-gitops
platform.nanohype.dev/repository: nanohype.eks-gitops
platform.nanohype.dev/team: platform-engineering
annotations:
argocd.argoproj.io/sync-wave: "100"
Expand Down
Loading