Developer guide
Data pipeline
How CRDs, OpenAPI specs, dependency graphs, release notes and the sitemap are produced and when each step runs.
All the data the site shows is produced ahead of time by scripts and committed under static/.
Adding an EDA release means running this pipeline against a cluster that has that release
installed.
End to end
flowchart TB
subgraph Cluster["EDA cluster with the release installed"]
CRD["kubectl get crds *.eda.nokia.com"]
MAN["EDA manifests in eda-system"]
OAPI["EDA API /openapi/v3"]
end
CRD --> FETCH["fetch-crds-for-release.sh"]
MAN --> FETCH
FETCH --> YAML["static/resources/{release}/{crd}/{version}.yaml"]
YAML --> BACK["Backfill from sibling patch releases"]
BACK --> GEN["generate-manifests.sh"]
GEN --> MJ["manifest.json + releases.yaml"]
MJ --> DG["build-dependency-graph.ts"]
DG --> DGJ["dependency-graph.json"]
MJ --> RN["generate-release-notes.ts"]
RN --> RNJ["static/release-notes/*.json"]
OAPI --> SYNC["sync-openapi.sh"]
SYNC --> SPECS["static/openapi/{release}/..."]
SPECS --> OM["generate-openapi-manifest.ts"]
OM --> OMJ["openapi manifest.json + openapi-releases.yaml"]
SPECS --> IDX["build-openapi-index.ts"]
IDX --> IDXJ["api-index.json"]
MJ --> SM["generate-sitemap.mjs"]
SM --> SMX["sitemap.xml, robots.txt"]
Steps
| Step | Command | Output | When |
|---|---|---|---|
| Sync a CRD release | static/sync-release.sh {release} |
Runs the next four steps in order | Manual, per new release |
| Fetch CRDs | static/lib/fetch-crds-for-release.sh |
One YAML file per CRD version | Via sync-release |
| Backfill | static/lib/backfill-crds-lib.sh |
Copies CRDs missing from a patch release from its siblings, with a .backfilled-from marker |
Via sync-release |
| Manifests | static/generate-manifests.sh |
manifest.json per release; updates src/lib/releases.yaml |
Via sync-release or manual |
| Dependency graph | npm run build:dependency-graph |
dependency-graph.json per release |
Via sync-release or manual |
| Release notes | npm run generate:release-notes |
static/release-notes/{release}.json, index.json, bundle.json |
prebuild and sync-release |
| OpenAPI sync | RELEASE={release} npm run sync:openapi |
Raw discovery plus core/ and apps/{group}/{version}/ specs |
Manual |
| OpenAPI manifest | npm run generate:openapi-manifest -- --all |
static/openapi/{release}/manifest.json; updates src/lib/openapi-releases.yaml |
prebuild |
| API index | npm run build:openapi-index |
static/openapi/{release}/api-index.json: each API's resources, workflows and sections |
prebuild |
| Sitemap | npm run generate:sitemap |
static/sitemap.xml, static/robots.txt |
prebuild |
| CRD scope | npm run build:crd-scopes |
scope (Namespaced / Cluster) in each manifest.json, from the OpenAPI paths |
generate:all |
| Dependency audit | RELEASE={release} npm run audit:dependencies |
dependency-audit.json / .md report |
Manual |
sync-release.sh accepts --dry-run, --backfill-only and --skip-* flags to run parts of the
chain.
Warning
sync:openapineedsRELEASEset. Without it, specs land instatic/openapi/unlabeled/, which the Cloudflare build deletes as a safety measure.
Data formats
manifest.json — the index of a release:
[
{
"name": "interfaces.interfaces.eda.nokia.com",
"group": "interfaces.eda.nokia.com",
"kind": "Interface",
"versions": [{ "name": "v1" }, { "name": "v1alpha1", "deprecated": true }]
}
]
CRD YAML — one file per CRD version, containing that version's entry from spec.versions[],
including schema.openAPIV3Schema.
releases.yaml — ordered release list; one entry has default: true:
releases:
- name: '26.8.2'
label: 'EDA 26.8.2'
folder: 'resources/26.8.2'
default: true
Sitemap contents
generate-sitemap.mjs writes the tool pages, every CRD of the default release (as
/?release=…&crd=…&version=…, matching each page's canonical URL), and every docs page. Kinds
that exist in several API groups use the full CRD name so each URL opens exactly one CRD.