feat(config): validate remotely only when validation-relevant fields change#143
Open
Episkey-G wants to merge 1 commit into
Open
Conversation
…change config update 与主命令 config 在改存量 profile 时无条件远程校验 region+project, 导致离线/网络抖动下仅改元数据(--active/--timeout-sec 等)也被拦。该守卫在 0.1.18 (2019-07-04)拆 add/update 时丢失,属7年回归:2018 单一 config 命令曾有 if cfg.Region!=""||cfg.Zone!="" 守卫。fail-closed(#142)放大了其痛。 改为按需校验(仅改「何时校验」,不改「校验失败怎么办」): credsOrEndpointChanged = 改了 public-key/private-key/base-url/channel-key validateRegion = 传了 region/zone || credsOrEndpointChanged (主命令再 || !ok) validateProject = 传了 project-id || credsOrEndpointChanged (主命令再 || !ok) 只改元数据则两者皆跳过,离线可改;凭据/接入点变更须同时重校验 region 与 project (换 key/网关后存量值可能失效或新凭据无权访问,配置时当场抓住才是校验价值)。 if 体内的 fail-closed return 与 errNoDefaultProject 放行原样不动。 config add 不改:新建 profile 无「未改动」基线,region/project 须从零建立(R2)。 主命令新建路径(!ok)恒校验(R3)。 测试:6 个新用例(毒网关证明跳过零远程调用、凭据变更触发双校验、新建仍校验), 2 个 #142 既有用例适配(纯元数据不再触发校验,改用 --region/--public-key 触发)。 已用变异测试验证 AC4 守护「凭据→project 校验」这一关键分支非空转。 CI 不含 ./cmd/...,用例须本地跑。堆叠在 #142 之上,PR 暂以 fix 分支为 base。
|
🔴 平台 PR 默认硬拦,需管理员 Approve 放行(或由管理员提交)。判定:改动触及平台/受保护路径(cmd/configure.go, cmd/configure_test.go) |
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.
问题:7 年前的过度校验回归
config update与主命令config在改存量 profile 时,无条件远程校验 region+project —— 哪怕你只改一个跟它们无关的元数据字段。fail-closed(#142)之后这个代价被放大:git 考古:这是回归,不是原始设计
1cbc80fconfig命令,region 校验有条件:if cfg.Region != "" || cfg.Zone != ""dffaa8b(0.1.18)add/update,守卫丢失 → 无条件校验。回归点守卫在拆分时被平铺掉了。诚实边界:region/zone 当年有条件守卫证据确凿;project 侧 2018 diff 未见对应守卫,「原本也该条件化」属合理推广。
方案:按需校验(只改「何时校验」,不改「校验失败怎么办」)
--active/--timeout-sec/--max-retry-times/--agree-upload-log) → 两者皆跳过,离线可改。c.Flags().Changed()而非空值判断:空值是合法输入(清除语义,如--channel-key "")。|| !ok:新建 profile 恒校验(新 profile 的 region/project 须从零建立)。if体内的 fail-closedreturn与errNoDefaultProject放行原样不动(#142 的成果不回退)。跳过时不碰存量 region/zone/project。config add不改:新建无「未改动」基线,region/project 必须从零建立(未传 region 时还要拉默认),保持无条件校验。测试
复用 #142 的 httptest 假网关基础设施,新增 6 个用例 + 适配 2 个既有用例:
t.Errorf)断言「只改元数据」路径零远程调用(AC1/AC5)。--public-key变更下 project 校验确实跑、失败→不落盘。--region变更仍校验(AC3)、主命令新建仍校验(AC5)。--region/--public-key显式触发(其中主命令用例加强了 region 断言)。验证严格性(本地):
go test ./...全绿;go vet干净。credsOrEndpointChanged,AC4 立刻变红 → 证明「凭据→project 校验」这一关键分支有测试守护。行为变更(用户可见,需入发版说明)
config update--active/--timeout等元数据config updateconfig(主命令)config(主命令)config add属能力增强(离线可改元数据),非破坏性。成功路径其余零变化。
不在本 PR 范围