Skip to content

增加sqlserver的cli#108

Open
xiaolaohu-hi wants to merge 1 commit into
ucloud:masterfrom
xiaolaohu-hi:feature/sqlserver
Open

增加sqlserver的cli#108
xiaolaohu-hi wants to merge 1 commit into
ucloud:masterfrom
xiaolaohu-hi:feature/sqlserver

Conversation

@xiaolaohu-hi

Copy link
Copy Markdown

Features:

Fixes:

@Episkey-G Episkey-G left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这版先 request changes。核心问题不是 SQL Server 代码本身不能编译,而是没有按当前 product 注册体系正确接入,导致用户看不到 ucloud sqlserver,并且 check-product 会失败。

P0: ucloud sqlserver 当前不可用

复现:

go run . sqlserver --help

结果:

Error: unknown command "sqlserver" for "ucloud"

原因是新增代码只放在 products/udb/internal/sqlserver/*,但没有成为一个已注册的 product 入口。

修复建议:把 SQL Server 做成独立 product:

mkdir -p products/sqlserver/internal
git mv products/udb/internal/sqlserver products/sqlserver/internal/sqlserver
rm -f products/udb/product.yaml

然后新增 products/sqlserver/product.yaml

name: sqlserver
owners:
  - Episkey-G
commands:
  - sqlserver
enabled: true

并新增 products/sqlserver/product.go,按 products/mysql/product.go 的模式接入 internalsqlserver.NewCommand(ctx)Metadata().Commands 只返回 []string{"sqlserver"}

P0: products/udb/product.yaml 重新声明了已拆出的 mysql

当前 products/udb/product.yaml 同时声明:

commands:
  - mysql
  - sqlserver

这会和现有 products/mysql 冲突。复现:

go run ./hack/check-product

结果包含:

rule7: top-level command "mysql" declared by multiple products [mysql udb]

修复建议:本 PR 不要恢复旧的 UDB 聚合注册形态,也不要在 products/udb/product.yaml 里声明 mysql。这次只新增独立的 sqlserver 顶层命令。

P0: 声明了 enabled product,但缺少对应 product.go

同一个检查还会报:

rule8: products/udb: cannot parse product.go: open products/udb/product.go: no such file or directory

如果保留 products/udb/product.yamlhack/gen-products 会尝试生成 products/udb import 和 udb.New(),但当前没有这个 Go package 入口。

修复建议:删除本 PR 新增的 products/udb/product.yaml,改为 products/sqlserver/product.yaml + products/sqlserver/product.go

P1: 生成注册表和 snapshot golden

创建独立 products/sqlserver 后,运行下面命令生成,不要手写 golden:

go run ./hack/gen-products

WRITE_CMDTREE_GOLDEN=1 go test ./hack/snapshot -run '^TestProductGoldens/sqlserver$' -count=1

WRITE_COMPLETION_GOLDEN=1 go test ./hack/snapshot -run '^TestProductCompletionGoldens/sqlserver$' -count=1

同时手工在 cmd/product_registration_test.go 的产品注册表里补 sqlserver 期望项:

{product: "sqlserver", commands: []string{"sqlserver"}},

验收命令

修完后请跑:

go run ./hack/check-product
go test ./hack/snapshot -run 'TestProductGoldens/sqlserver|TestProductCompletionGoldens/sqlserver' -count=1
go test ./...
go run . sqlserver --help

期望:check-product 通过,snapshot 通过,全量测试通过,并且 ucloud sqlserver --help 能看到 SQL Server 命令树。

@Episkey-G

Copy link
Copy Markdown
Collaborator

补充一下上面 products/sqlserver/product.yaml 的示例:

name: sqlserver
owners:
  - <your-github-login>
commands:
  - sqlserver
enabled: true

owners 建议改成你自己的 GitHub 账号名称,例如当前 PR 作者可以填 xiaolaohu-hi;这样该 product 落库后,后续提交这个 product 的 PR 即可进入 owner-gate 自动合并流程。

@Episkey-G

Copy link
Copy Markdown
Collaborator

更正一下我前面 review 里的修复口径:这里不是禁止使用 products/udb 这个目录名/产品名。

真正的阻断问题是当前 products/udb/product.yaml 同时声明了:

commands:
  - mysql
  - sqlserver

其中 mysql 已经由现有 products/mysql 注册,所以会触发:

rule7: top-level command "mysql" declared by multiple products [mysql udb]

因此有两种都可以的修法。

方案 A:独立 SQL Server product

mkdir -p products/sqlserver/internal
git mv products/udb/internal/sqlserver products/sqlserver/internal/sqlserver
rm -f products/udb/product.yaml

products/sqlserver/product.yaml

name: sqlserver
owners:
  - <your-github-login>
commands:
  - sqlserver
enabled: true

方案 B:保留 UDB product 名,只注册 sqlserver 命令

也可以保留 products/udb,但 product.yaml 只能声明 sqlserver,不要声明 mysql

name: udb
owners:
  - <your-github-login>
commands:
  - sqlserver
enabled: true

这种方案需要补 products/udb/product.go,让 Metadata().Commands 返回 []string{"sqlserver"}NewCommand 返回 sqlserver.NewCommand(ctx)。同时更新 cmd/product_registration_test.go:不要再把 udb 当成 removed/stale product,而是期望 {product: "udb", commands: []string{"sqlserver"}}

不管选 A 还是 B,最后都需要运行生成/验收命令:

go run ./hack/gen-products

WRITE_CMDTREE_GOLDEN=1 go test ./hack/snapshot -run '^TestProductGoldens/(sqlserver|udb)$' -count=1

WRITE_COMPLETION_GOLDEN=1 go test ./hack/snapshot -run '^TestProductCompletionGoldens/(sqlserver|udb)$' -count=1

go run ./hack/check-product
go test ./...
go run . sqlserver --help

核心验收标准是:check-product 不再出现 mysql 重复声明,生成后的 registry 可编译,并且 ucloud sqlserver --help 能看到命令树。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants