feat: endpoint control — surface disabled endpoints across runtime, CC, and example pack#201
Merged
Conversation
…callers Replace the positional New(...) signature with New(e2eFile string, opts Options) so adding future fields does not cascade changes across every call site. Options struct fields: ClusterCtx, UseCurrentCtx, KeepCluster, Workers, KindVersion, DevServer, OrkVersion, ValueFiles, HelmArgs. --workers <n> accepted on ork e2e and ork push to provision worker nodes alongside the control-plane in the kind cluster created for the run. Workers and KindVersion propagate into sub-runner New calls for imports.
…ete cluster ork create cluster --workers <n> provisions n kind worker nodes alongside the control-plane. --version <v> selects the kind binary to download (cached at ~/.orkestra/bin/kind-<version>); previously the version was hardcoded to v0.27.0. resolveKind: explicit --version now bypasses the PATH kind binary and uses the versioned cache entry. An empty version still prefers PATH first, then falls back to DefaultKindVersion. waitForNodesReady: replaced the custom polling loop (which checked condition type, not status, and could return "ready" with NotReady nodes) with kubectl wait --for=condition=Ready node --all. ork delete cluster --name <n> is the complement to ork create cluster; backed by the existing DeleteKindCluster helper.
create.md: add --workers and --version flag entries, multi-node and version-pin examples, node-ready behaviour note, pointer to delete.md. 08-e2e.md: add --workers flag. 09-push.md: add --workers flag for the e2e gate cluster. delete.md: new page for ork delete cluster. index.md: ork delete cluster entry in the Tooling table.
…example refactor - leaderElection: on kubectl.delete resolves Lease holder and deletes the pod by name; replaces shell subcommand anti-pattern in e2e YAML - leaderElection: on kubectl.exec runs a command inside the leader pod - validate.go: leaderElection mutually exclusive with file/kind/name on delete; mutually exclusive with name/labelSelector on exec - Rename E2EKubectlPortForwardLeaderElection → E2EKubectlLeaderElection; type is now shared by all four kubectl subcommands (YAML keys unchanged) - include: composition for expect: — long expect sections can be split into an e2e/ subfolder and composed with include: entries - Refactor all three resilience examples to use e2e/ subfolder includes: leader-failover (infra-ready, failover, cleanup) crd-missing-recovery (health-check, crd-loss, recovery, cleanup) admission-protection (degraded, recovery, cleanup) - Fix: WaitForResource used .Run() for ready checks, letting kubectl rollout status and kubectl wait write to the terminal during spinner; replaced with .Output(). Same fix for helm repo add/update. - Revamp documentation/concepts/e2e/04-best-practices.md - Update 06-leader-led-deployments.md to cover delete and exec subcommands - Update e2e/index.md description for leader-led-deployments entry - CHANGELOG.md: v0.7.10 [UNRELEASED] entry
…aml in artifacts - ork run <name>:<version> pulls the pattern from the registry (if not cached) and starts the runtime — no -f flag or local files required - --apply-cr applies crd.yaml, waits for CRD established, applies cr.yaml before starting the runtime; works with OCI refs and local -f paths - --use-komposer uses komposer.yaml from the pulled pattern instead of katalog.yaml; OCI positional arg path only - --refresh re-pulls the pattern even if already cached - IsOCIRef helper in pkg/registry/resolve.go distinguishes OCI refs from filesystem paths for the positional arg detection - resolveOCIRunPath helper in cmd/cli/files.go handles pull + path resolution - applyPatternExamples in run_dev_apply.go applies crd.yaml + cr.yaml from the pattern directory; distinct from katalog-declared crdFile/crFiles - FileKomposer constant added to pkg/registry/constant.go - komposer.yaml added to OptionalFiles for KatalogKind in pattern.go — it was never included as an OCI layer when pushing; re-push required - documentation/reference/cli/07-run.md rewritten to cover OCI workflow - documentation/getting-started/07-running-patterns.md new page: full inspect → pull → run walkthrough - CHANGELOG.md: v0.7.10 [UNRELEASED] updated
…r in validate output
…ss, and static CRD fields IsHealthEnabled/IsInfoEnabled added to EndpointsConfig. CRDSummaryResponse now carries healthEnabled, infoEnabled, crossAccess, GVK, GVR, Mode, Namespaced, Namespace, and Description — previously these required a per-CRD info endpoint call.
…r show as degraded Reads healthEnabled/infoEnabled flags from /katalog summary and skips disabled endpoint calls. Synthesises health and info from the always-available summary. CRDs with endpoints: enabled: false return state: endpoints-disabled with all static fields populated. FetchCRList treats 404 as empty list. CrossAccess wired through CRDSummary and CRDDetail.
…detail, and docs pages katalog.html: health badge + ⊘ icon when health disabled; metrics rows gated on InfoEnabled; ⊘ info endpoint disabled row when fully dark. crd.html: endpoints-disabled full-page notice; HealthEndpointDisabled notice in Runtime Health; InfoEndpointDisabled notice in operatorBox section. crd_docs.html: Endpoints section always shown; crossAccess row in Overview; operatorBox summary table; Configuration hidden for disabled CRDs; dead else-if branch fixed in Reconcile Mode.
…mentation Three-part advanced example pack covering selective health disable, full endpoint disable, and the fully-dark asymmetric cross-read pattern. Each sub-example has validate, simulate, e2e, and a walkthrough README. Root simulate/e2e use imports: to chain all three. Adds documentation/orkestra-core/03-controlcenter/generated-docs.md covering the live-generated per-CRD docs page. Updates controlcenter index and changelog. Adds --dry-run to scripts/fix-bare-fences.py.
- Move 00-kubernetes-basics to getting-started root; add tip callout and Next Steps link in index - Add 19-endpoint-control to advanced pack table; fix 08-bad-actor description in registry guide - Add crd-missing-recovery and leader-failover to resilience section in examples/README - Fix ecosystem-composition: remove non-existent 05-policy-layer/06-all-in-one, use actual 05-all-in-one - Add registry-guide pack entry and full learning path section (13 examples) to examples/README
- orkestra-chart-e2e.yml now supports workflow_call with image_tag, repository, and ork inputs; applies chart metadata before running e2e so the tested chart matches what will be released - release-helm.yml calls it as chart-e2e gate job; helm package-and-push only runs if e2e passes - Chart.yaml appVersion bumped to 0.7.9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Per-CRD HTTP endpoint control and cross-read access visibility, surfaced consistently across the runtime API, Control Center, generated docs, and a new example pack.
What changed
Fixes
pkg/e2e/verify.go,pkg/types/e2e.go—statusCode:assertion for port-forward curl steps; previously onlyjq+equalswas checked, HTTP status was ignoredcmd/cli/validate.go— singular/plural grammar inork validateoutput ("1 CRDs" → "1 CRD")Runtime (
pkg/)pkg/types/types_crd_entry.go—IsHealthEnabled()/IsInfoEnabled()helpers onEndpointsConfig; single source of truth for disabled-endpoint logicpkg/kordinator/crd_health_handers.go—/katalogsummary extended withhealthEnabled,infoEnabled,crossAccess,GVK,GVR,Mode,Namespaced,Namespace,Description; static fields previously only available from the per-CRD info endpoint now always availableControl Center (
cmd/controlcenter/)cc/types.go—CRDSummarygains static fields andCrossAccess;CRDDetailgainsHealthEndpointDisabled,InfoEndpointDisabled,CrossAccess;EndpointInfostruct addedcc/client.go—FetchCRDDetailskips disabled endpoint calls; synthesises health/info from the always-available/katalogsummary; early-return forstate: endpoints-disabledwith all static fields populated from summary;FetchCRListtreats 404 as empty listcc/helper.go—summaryFor,endpointInfoFor,synthHealthFromSummary,synthInfoFromSummarycc/assets/templates/katalog.html— health badge shows normal state +⊘secondary badge when health disabled; Workers/Queue/Resources/RBAC rows hidden when info disabled;⊘ info endpoint disabledrow addedcc/assets/templates/crd.html— three states:endpoints-disabledfull-page notice,HealthEndpointDisablednotice in Runtime Health section,InfoEndpointDisablednotice in operatorBox sectioncc/assets/templates/crd_docs.html— Endpoints section always shown; Cross-read access row in Overview; operatorBox summary table; Configuration section hidden for disabled CRDs; deadelse ifin Reconcile Mode fixedDocumentation
documentation/orkestra-core/03-controlcenter/generated-docs.md— new page explaining the live-generated per-CRD docs: sections shown, when each appears, resilience to disabled endpointsdocumentation/concepts/live-api/— reordered: endpoints reference first, access control seconddocumentation/getting-started/—00-kubernetes-basics.mdmoved to section root; tip callout and Next Steps link added to getting-started indexNew Advanced Example Pack
Three runnable sub-examples:
01-selective-health/—endpoints: health: falseonpayment; info and CR list remain active02-full-disable/—endpoints: enabled: falseoncredential; all HTTP surfaces removed; operator reconciles normally03-fully-dark/—keyrotation(dark) +auditlog(open) in one Katalog;keyrotationcross-readsauditlogsuccessfully;auditlog's read ofkeyrotationis denied bycrossAccess: false; both outcomes visible inkubectl getprinter columns (AuditRef,KeyRef)Website
website/assets/css/main.css— sidebarmax-heightincreased from 800px to 3000px; long sections (Concepts) were clipping the last visible itemKey design decisions
/katalogalways responds. Even when per-CRD endpoints are disabled, the top-level/katalogresponse is always available and carries runtime health state and static fields for every CRD. The CC uses this as the authoritative source when a CRD's own endpoints are off — no synthetic zeros, no degraded badges for intentionally-disabled CRDs.crossAccess: falseblocks inbound, not outbound. The fully-dark example makes this explicit:keyrotationreadsauditlogsuccessfully;auditlog's attempt to readkeyrotationreturns empty. The flag only controls whether others can read you.state: "endpoints-disabled"as a CC sentinel. Rather than inferring disabled state from 404 responses, the CC receives explicit flags from/katalogand sets a clean state string. Templates branch on it once rather than scattering nil checks.Control Center
endpoints: health: false— health badge shows healthy state +⊘secondary icon; Runtime Health section shows disabled notice; Workers/Queue/Resources still visibleendpoints: enabled: false— CC card shows⊘ info endpoint disabled; clicking through shows full-page disabled notice with GVK, scope, and cross-read access populated correctly (not "Unknown")/docs) — Endpoints section shows correct ✓/⊘ per endpoint for all three states; Configuration section absent for fully-disabled CRDs; Overview Cross-read access row present