Repository navigation
feat(server): expose Canary relationships without write guards - #39
Merged
aceforeverd merged 12 commits intoNov 5, 2026
Merged
Conversation
6 tasks done
huskcass
reviewed
Oct 29, 2026
huskcass
left a comment
Collaborator
There was a problem hiding this comment.
No blockers. go test -p 2 ./... passes locally at 30a42c7; go and gate are green, e2e was still pending when I looked.
Medium:
- Uninstall (
backend_llm.go,DeleteObserved): the resourceVersion precondition fails whenever the operator writes status between the Get and the Delete, which happens often on a service that's scaling or rolling. That conflict then goes throughfinishUninstallFailed, so the plan is marked failed and a failed uninstall is recorded even though nothing was deleted. On a conflict, restore the plan (as the NotFound branch does) and either re-Get, re-check ownership and retry once, or keep only the UID precondition and rely on the ownership re-check. - Failing closed now applies to helm too: a discovery error (cached for
crdServedTTL, 30s) or a Forbidden on LLMServices blocks every install, apply, rollback, uninstall and SLO call, even for helm releases on clusters that never run Canary. That reverses the old "invisible CRD behaves like unserved" rule. The bundled chart always grants llmservices, so this mostly affects custom RBAC and API blips, but it should be a deliberate choice, noted in the PR or the README.
Low:
handleSLOrunsrefuseCanaryWritefor GET as well, so SLO reads for helm releases now 502 when LLMService access is forbidden. That contradicts "preserving read fallback". Only refuse arm reads when the object is actually seen, and skip the fail-closed branch for GET.- The ownership check in rollback, uninstall and SLO runs outside the apply lock, so an adoption between the check and the write isn't caught (apply is fine because it checks inside
applyLocked). This is narrow, but worth a comment. - If the label-only fallback finds no
canary-namespacelabel, it returnsNamespace: "", and the 409 message readsLLMCanary /demo. Fall back to the object's namespace.
Verdict: the approach looks right. Fix the uninstall conflict handling before merge, and confirm the fail-closed behaviour for helm is intended.
— Review Golden
added 4 commits
November 2, 2026 12:01
Contributor
Author
让 Swiss 识别并保护 Canary 实验服务,同时允许实验中的已有服务单独调整自适应并发参数为什么干?从 PR 描述和代码看,要解决两个问题:
干了什么?
这套能力需要配合 Console、canaryd 和 Operator 的关联 PR;旧 controller 没有基线时仍会拒绝调参。 |
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.
Swiss reports the live Kubernetes relationship of each LLMService while service operations follow normal backend rules. Console owns Canary-specific action protection.
Behavior
canaryState:standalone,referenced, orowned, alongside the service UID andmanagedBy/assignedToparent identities.verified: falserather than becoming standalone. Releasing an assignment returns the service to standalone without deleting it.reuseSource: truewithfromReleaseandnamespacecomposes from a live LLMService plan without resolving a catalog. It accepts arbitrary form overrides and edit values, retaining source, chart and the other layers. This is general plan composition with no Canary assignment, baseline or adaptive field whitelist.docs/openapi.yaml; no README, architecture or separate design-document changes.Validation
go test -p 2 ./...andgo vet -p 2 ./...passed using the CI-pinned unit-test catalog.7be48b9.Coordinate Console #108 and Canary plugin #5. UI adaptive upgrades now use
reuseSource; backend and frontend should be updated together. An independently enabled Kubernetes admission webhook still applies.Release note